Ubuntu 20.04에서 Let’s Encrypt로 Nginx 보안하는 방법

소개

Let’s Encrypt는 웹 서버에서 암호화된 HTTPS를 가능하게 하는 무료 TLS/SSL 인증서를 손쉽게 획득하고 설치할 수 있는 인증 기관(CA)입니다. Certbot이라는 소프트웨어 클라이언트를 제공하여 필요한 단계 대부분(아니면 모두)를 자동화하려고 시도하여 프로세스를 단순화합니다. 현재, 인증서를 획득하고 설치하는 전체 프로세스는 Apache와 Nginx 모두에서 완전히 자동화되어 있습니다.

이 튜토리얼에서는 Certbot을 사용하여 Ubuntu 20.04에서 Nginx에 대한 무료 SSL 인증서를 획득하고 인증서를 자동으로 갱신하는 방법을 살펴볼 것입니다.

이 튜토리얼에서는 기본 파일 대신 별도의 Nginx 서버 구성 파일을 사용합니다. 우리는 각 도메인에 대해 새로운 Nginx 서버 블록 파일을 생성하는 것을 권장합니다. 이렇게 하면 일반적인 오류를 피하고 기본 파일을 대체 구성으로 유지할 수 있습니다.

디지털오션에 Nginx와 Let’s Encrypt를 관리하게 두세요. 디지털오션 앱 플랫폼을 사용하면 GitHub에서 몇 분 안에 직접 배포할 수 있습니다. 앱 플랫폼은 SSL 인증서 및 라우팅도 처리해 줄 것입니다.

전제 조건

이 튜토리얼을 따르려면 다음이 필요합니다:

  • 이 튜토리얼에는 sudo 활성화된 root가 아닌 사용자 및 방화벽이 설정된 Ubuntu 20.04 서버가 하나 필요합니다. 이 설정 방법은 다음 Ubuntu 20.04 초기 서버 설정 튜토리얼에 따라 설정할 수 있습니다.

  • 등록된 도메인 이름이 필요합니다. 이 튜토리얼에서는 example.com을 사용합니다. 도메인 이름은 Namecheap에서 구매하거나 Freenom에서 무료로 얻을 수 있습니다. 또는 원하는 도메인 등록기관을 사용할 수 있습니다.

  • 다음 DNS 레코드가 서버에 설정되어 있어야 합니다. DigitalOcean을 사용하는 경우 자세한 내용은 DNS 설명서를 참조하세요.

    • example.com을 서버의 공용 IP 주소로 지정한 A 레코드입니다.
    • www.example.com을 서버의 공용 IP 주소로 지정한 A 레코드입니다.
  • Ubuntu 20.04에 Nginx를 설치하는 방법

    을 따라 Nginx가 설치되었습니다. 꼭 당신의 도메인을 위한 서버 블록이 있는지 확인하세요. 이 튜토리얼에서는 예시로 /etc/nginx/sites-available/example.com을 사용합니다.

단계 1 — Certbot 설치

Let’s Encrypt를 사용하여 SSL 인증서를 획득하는 첫 번째 단계는 서버에 Certbot 소프트웨어를 설치하는 것입니다.

Certbot 및 그의 Nginx 플러그인을 apt로 설치합니다:

  1. sudo apt install certbot python3-certbot-nginx

Certbot은 이제 사용할 준비가 되었지만, Nginx에 SSL을 자동으로 구성하려면 Nginx 구성의 일부를 확인해야 합니다.

단계 2 — Nginx 구성 확인

Certbot은 SSL을 자동으로 구성하기 위해 Nginx 구성에서 올바른 server 블록을 찾을 수 있어야 합니다. 구체적으로는 인증서를 요청한 도메인과 일치하는 server_name 지시문을 찾아서 이를 수행합니다.

만약 Nginx 설치 튜토리얼에서 server 블록 설정 단계를 따랐다면, 이미 /etc/nginx/sites-available/example.com 경로에 도메인에 대한 서버 블록이 설정되어 있고, server_name 지시문이 이미 적절하게 설정되어 있어야 합니다.

확인하려면, nano 또는 선호하는 텍스트 편집기를 사용하여 도메인의 구성 파일을 엽니다:

  1. sudo nano /etc/nginx/sites-available/example.com

기존의 server_name 라인을 찾습니다. 다음과 같아야 합니다:

/etc/nginx/sites-available/example.com
...
server_name example.com www.example.com;
...

이렇게 되어 있다면, 편집기를 종료하고 다음 단계로 진행합니다.

그렇지 않으면 맞춰서 업데이트하십시오. 그런 다음 파일을 저장하고 편집기를 종료하고 구성 편집의 구문을 확인하십시오:

  1. sudo nginx -t

오류가 발생하면 서버 블록 파일을 다시 열고 오타나 누락된 문자를 확인하십시오. 구성 파일의 구문이 올바르면 새 구성을로드하려면 Nginx를 다시로드하십시오:

  1. sudo systemctl reload nginx

Certbot은 이제 올바른 server 블록을 찾아 자동으로 업데이트할 수 있습니다.

다음으로 방화벽을 업데이트하여 HTTPS 트래픽을 허용하겠습니다.

단계 3 — 방화벽을 통해 HTTPS 허용하기

사전 설치 가이드에서 권장하는 대로 ufw 방화벽을 사용 중이라면 HTTPS 트래픽을 허용하도록 설정을 조정해야 합니다. 다행히 Nginx는 설치 시 몇 가지 프로필을 ufw에 등록합니다.

다음을 입력하여 현재 설정을 확인할 수 있습니다:

  1. sudo ufw status

아마도 다음과 같이 보일 것입니다. 이는 웹 서버로의 HTTP 트래픽만 허용한다는 의미입니다:

Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx HTTP ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx HTTP (v6) ALLOW Anywhere (v6)

추가로 HTTPS 트래픽을 허용하려면 Nginx Full 프로필을 허용하고 중복된 Nginx HTTP 프로필을 삭제하십시오:

  1. sudo ufw allow 'Nginx Full'
  2. sudo ufw delete allow 'Nginx HTTP'

상태는 이제 다음과 같아야 합니다:

  1. sudo ufw status
Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx Full ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx Full (v6) ALLOW Anywhere (v6)

다음으로 Certbot을 실행하고 인증서를 가져오겠습니다.

단계 4 — SSL 인증서 획득

Certbot은 플러그인을 통해 다양한 방법으로 SSL 인증서를 획득할 수 있습니다. Nginx 플러그인은 Nginx를 다시 구성하고 필요할 때마다 구성을 다시로드합니다. 이 플러그인을 사용하려면 다음을 입력하십시오:

  1. sudo certbot --nginx -d example.com -d www.example.com

이 명령은 도메인 이름을 지정하기 위해 -d를 사용하여 --nginx 플러그인과 함께 certbot을 실행합니다.

certbot을 처음 실행하는 경우 이메일 주소를 입력하고 서비스 약관에 동의하라는 메시지가 표시됩니다. 이후에 certbot은 Let’s Encrypt 서버와 통신한 다음 도메인을 소유하고 있는지 확인하기 위한 도전을 실행합니다.

이 과정이 성공하면 certbot은 HTTPS 설정을 어떻게 구성할지 묻습니다.

Output
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1: No redirect - Make no further changes to the webserver configuration. 2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for new sites, or if you're confident your site works on HTTPS. You can undo this change by editing your web server's configuration. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

원하는 옵션을 선택하고 ENTER를 누르십시오. 구성이 업데이트되고 Nginx가 새로운 설정을 사용하기 위해 다시로드됩니다. certbot은 프로세스가 성공적으로 완료되었고 인증서가 저장된 위치를 알려주는 메시지로 마무리됩니다:

Output
IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/example.com/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/example.com/privkey.pem Your cert will expire on 2020-08-18. To obtain a new or tweaked version of this certificate in the future, simply run certbot again with the "certonly" option. To non-interactively renew *all* of your certificates, run "certbot renew" - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le

인증서가 다운로드되고 설치되었으며 로드되었습니다. https://를 사용하여 웹사이트를 다시로드하고 브라우저의 보안 표시기를 확인하세요. 일반적으로 잠금 아이콘으로 사이트가 올바르게 보호되었음을 나타내어야 합니다. 서버를 SSL Labs Server Test로 테스트하면 A 등급을 받게 됩니다.

마지막으로 갱신 프로세스를 테스트해 보겠습니다.

단계 5 — Certbot 자동 갱신 검증

Let’s Encrypt의 인증서는 유효 기간이 90일입니다. 이는 사용자들이 인증서 갱신 프로세스를 자동화하도록 장려하기 위한 것입니다. 우리가 설치한 certbot 패키지는 시스템디 타이머를 추가하여 하루에 두 번 실행되며 만료일로부터 30일 이내인 모든 인증서를 자동으로 갱신합니다.

타이머의 상태를 systemctl로 조회할 수 있습니다:

  1. sudo systemctl status certbot.timer
Output
● certbot.timer - Run certbot twice daily Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled) Active: active (waiting) since Mon 2020-05-04 20:04:36 UTC; 2 weeks 1 days ago Trigger: Thu 2020-05-21 05:22:32 UTC; 9h left Triggers: ● certbot.service

갱신 프로세스를 테스트하려면 certbot을 사용하여 드라이 런을 수행할 수 있습니다:

  1. sudo certbot renew --dry-run

오류가 없는 경우 모든 설정이 완료된 것입니다. 필요할 때 Certbot이 인증서를 갱신하고 변경 사항을 반영하기 위해 Nginx를 다시로드합니다. 자동 갱신 프로세스가 실패하면 Let’s Encrypt이 지정한 이메일로 인증서 만료 예고를 알리게 됩니다.

결론

이 튜토리얼에서는 Let’s Encrypt 클라이언트 certbot을 설치하고, 도메인용 SSL 인증서를 다운로드하고, Nginx를 이러한 인증서를 사용하도록 구성하고, 자동으로 인증서를 갱신하는 방법을 설치했습니다. Certbot을 사용하는 데 관한 추가 질문이 있으시면, 공식 문서를 참조하시기 바랍니다.

Source:
https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-20-04