웹사이트 검색

Debian 8에서 Let's Encrypt로 Apache를 보호하는 방법


소개

이 자습서에서는 Apache를 웹 서버로 실행하는 Debian 8 서버에서 Let’s Encrypt의 TLS/SSL 인증서를 설정하는 방법을 보여줍니다. 또한 cron 작업을 사용하여 인증서 갱신 프로세스를 자동화하는 방법도 설명합니다.

SSL 인증서는 웹 서버 내에서 사용되어 서버와 클라이언트 간의 트래픽을 암호화하여 애플리케이션에 액세스하는 사용자에게 추가 보안을 제공합니다. Let’s Encrypt는 무료로 신뢰할 수 있는 인증서를 얻고 설치하는 쉬운 방법을 제공합니다.

전제 조건

이 가이드를 완료하려면 관리 작업을 위해 루트가 아닌 sudo 사용자가 있는 Debian 8 서버가 필요합니다. Debian 8 초기 서버 설정 가이드에 따라 적절한 권한을 가진 사용자를 설정할 수 있습니다.

인증서를 사용하려는 등록된 도메인 이름을 소유하거나 제어해야 합니다. 아직 등록된 도메인 이름이 없는 경우 많은 도메인 이름 등록 기관(예: Namecheap, GoDaddy 등) 중 하나에 등록할 수 있습니다.

아직 만들지 않았다면 도메인을 서버의 공용 IP 주소로 가리키는 A 레코드를 만드십시오(DigitalOcean의 DNS를 사용하는 경우 이 가이드를 따를 수 있음). 이는 Let’s Encrypt가 인증서를 발급하는 도메인을 소유하고 있음을 확인하는 방법 때문에 필요합니다. 예를 들어 example.com에 대한 인증서를 얻으려면 유효성 검사 프로세스가 작동하려면 해당 도메인이 서버로 확인되어야 합니다. 설정에서는 example.comwww.example.com을 도메인 이름으로 사용하므로 두 DNS 레코드가 모두 필요합니다.

계속 진행할 준비가 되면 sudo 계정을 사용하여 서버에 로그인합니다.

1단계: Let’s Encrypt 클라이언트인 Certbot 설치

SSL 인증서를 얻기 위해 Let’s Encrypt를 사용하는 첫 번째 단계는 certbot Let’s Encrypt 클라이언트를 서버에 설치하는 것입니다.

certbot 패키지는 데비안 8이 출시되었을 때 사용할 수 없었습니다. certbot 패키지에 액세스하려면 서버에서 Jessie 백포트 저장소를 활성화해야 합니다. 이 리포지토리는 안정적인 리포지토리에 포함된 것보다 최신 버전의 소프트웨어를 설치하는 데 사용할 수 있습니다.

다음을 입력하여 백포트 리포지토리를 서버에 추가합니다.

  1. echo 'deb http://ftp.debian.org/debian jessie-backports main' | sudo tee /etc/apt/sources.list.d/backports.list

새 리포지토리를 추가한 후 apt 패키지 인덱스를 업데이트하여 새 패키지에 대한 정보를 다운로드합니다.

  1. sudo apt-get update

리포지토리가 업데이트되면 백포트 리포지토리를 대상으로 certbot을 가져오는 python-certbot-apache 패키지를 설치할 수 있습니다.

참고: 백포트를 사용하는 경우 일반 업데이트에 리포지토리를 사용하는 대신 필요한 특정 패키지만 설치하는 것이 좋습니다. 백포트 패키지는 기본 리포지토리보다 호환성 보장이 적습니다.

이 리포지토리를 사용하여 실수로 패키지를 설치하거나 업데이트하는 것을 방지하려면 리포지토리 이름과 함께 -t 플래그를 명시적으로 전달하여 백포트에서 패키지를 설치해야 합니다.

  1. sudo apt-get install python-certbot-apache -t jessie-backports

이제 certbot 클라이언트를 사용할 준비가 되었습니다.

2단계: Apache ServerName 및 ServerAlias 설정

certbot 유틸리티를 호출할 때 인수로 보호하려는 도메인을 전달할 수 있습니다. 그러나 certbot은 Apache 구성 자체에서 이를 읽을 수도 있습니다. 서버가 응답해야 하는 도메인에 대해 항상 명시하는 것이 좋기 때문에 Apache 구성에서 직접 ServerNameServerAlias를 설정합니다.

python-certbot-apache 서비스를 설치했을 때 시스템에 아직 Apache가 없으면 Apache가 설치되었습니다. 도메인 이름을 명시적으로 설정할 수 있도록 기본 Apache 가상 호스트 파일을 엽니다.

  1. sudo nano /etc/apache2/sites-available/000-default.conf

내부의 가상 호스트 블록 내에서 ServerName 지시문을 추가하거나 주석 처리를 제거하고 기본 도메인 이름으로 설정합니다. 이 서버도 응답해야 하는 대체 도메인 이름은 ServerAlias 지시문을 사용하여 추가할 수 있습니다.

이 예에서는 example.com을 표준 이름으로 사용하고 www.example.com을 별칭으로 사용합니다. 이러한 지시문을 설정하면 다음과 같이 표시됩니다.

<VirtualHost *:80>
    . . .
    ServerName example.com
    ServerAlias www.example.com
    . . .
</VirtualHost>

완료되면 CTRL을 누른 상태에서 X를 눌러 파일을 저장하고 닫습니다. Y를 입력하고 Enter 키를 눌러 파일을 저장합니다.

변경 사항으로 인해 발생할 수 있는 구문 오류를 파악하려면 구성 파일을 확인하십시오.

  1. sudo apache2ctl configtest

출력에서 다음 줄을 찾습니다.

Output
Syntax OK

파일이 구문 테스트를 통과하면 Apache 서비스를 다시 시작하여 변경 사항을 구현합니다.

  1. sudo systemctl restart apache2

이제 Apache가 도메인 이름으로 구성되었으므로 certbot을 사용하여 SSL 인증서를 얻을 수 있습니다.

3단계: 방화벽 조정

방화벽을 활성화한 경우 SSL 트래픽을 허용하도록 설정을 조정해야 합니다. 필요한 절차는 사용 중인 방화벽 소프트웨어에 따라 다릅니다. 현재 방화벽이 구성되어 있지 않으면 건너뛰어도 됩니다.

UFW

ufw를 사용하는 경우 다음을 입력하여 현재 설정을 볼 수 있습니다.

  1. sudo ufw status

다음과 같을 수 있습니다. 이는 웹 서버에 대한 SSH 트래픽만 허용됨을 의미합니다.

Output
Status: active To Action From -- ------ ---- SSH ALLOW Anywhere SSH (v6) ALLOW Anywhere (v6)

HTTP 및 HTTPS 트래픽을 추가로 허용하기 위해 "WWW Full\ 애플리케이션 프로필을 허용할 수 있습니다.

  1. sudo ufw allow 'WWW Full'

현재 상태는 다음과 같아야 합니다.

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

이제 서버에서 HTTP 및 HTTPS 요청을 수락해야 합니다.

IPTables

iptables를 사용하는 경우 다음을 입력하여 현재 규칙을 볼 수 있습니다.

  1. sudo iptables -S

활성화된 규칙이 있으면 표시됩니다. 예제 구성은 다음과 같습니다.

Output
-P INPUT DROP -P FORWARD ACCEPT -P OUTPUT ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

SSL 트래픽을 여는 데 필요한 명령은 현재 규칙에 따라 다릅니다. 위와 같은 기본 규칙 집합의 경우 다음을 입력하여 SSL 액세스를 추가할 수 있습니다.

  1. sudo iptables -I INPUT -p tcp --dport 443 -j ACCEPT

방화벽 규칙을 다시 보면 새 규칙이 표시됩니다.

  1. sudo iptables -S
Output
-P INPUT DROP -P FORWARD ACCEPT -P OUTPUT ACCEPT -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

프로그램을 사용하여 부팅 시 iptables 규칙을 자동으로 적용하는 경우 새 규칙으로 구성을 업데이트해야 합니다.

4단계: SSL 인증서 설정

Let’s Encrypt 클라이언트를 사용하여 Apache용 SSL 인증서를 생성하는 것은 매우 간단합니다. 클라이언트는 Apache 구성의 도메인에 유효한 새 SSL 인증서를 자동으로 가져와 설치합니다.

대화식 설치를 실행하고 Apache 구성에 정의된 모든 도메인에 대한 인증서를 얻으려면 다음을 입력하십시오.

  1. sudo certbot --apache

certbot 유틸리티는 Apache 구성을 평가하여 요청된 인증서가 포함되어야 하는 도메인을 찾습니다. 인증서에 포함되지 않으려는 정의된 도메인을 선택 취소할 수 있습니다.

인증서 옵션을 사용자 지정하기 위한 단계별 가이드가 제공됩니다. 분실된 키 복구 및 알림을 위한 이메일 주소를 제공하라는 메시지가 표시되며 httphttps 액세스를 모두 활성화하거나 모든 요청을 강제로 리디렉션하도록 선택할 수 있습니다. https로. 암호화되지 않은 http 트래픽이 특별히 필요한 경우가 아니면 일반적으로 https를 요구하는 것이 가장 안전합니다.

설치가 완료되면 /etc/letsencrypt/live에서 생성된 인증서 파일을 찾을 수 있어야 합니다. 다음 링크를 사용하여 SSL 인증서의 상태를 확인할 수 있습니다(example.com을 도메인으로 바꾸는 것을 잊지 마십시오).

https://www.ssllabs.com/ssltest/analyze.html?d=example.com&latest

테스트를 완료하는 데 몇 분 정도 걸릴 수 있습니다. 이제 https 접두사를 사용하여 웹사이트에 액세스할 수 있습니다.

5단계: 자동 갱신 설정

Let’s Encrypt 인증서는 90일 동안 유효하지만 오차 범위를 허용하기 위해 60일마다 인증서를 갱신하는 것이 좋습니다. certbot 클라이언트에는 현재 설치된 인증서를 자동으로 확인하고 만료 날짜가 30일 미만인 경우 갱신을 시도하는 renew 명령이 있습니다.

설치된 모든 도메인에 대한 갱신 프로세스를 트리거하려면 다음을 실행해야 합니다.

  1. sudo certbot renew

최근에 인증서를 설치했기 때문에 이 명령은 만료 날짜만 확인하고 인증서가 아직 갱신되지 않았음을 알리는 메시지를 인쇄합니다. 출력은 다음과 유사해야 합니다.

Output
Saving debug log to /var/log/letsencrypt/letsencrypt.log ------------------------------------------------------------------------------- Processing /etc/letsencrypt/renewal/example.com.conf ------------------------------------------------------------------------------- Cert not yet due for renewal The following certs are not due for renewal yet: /etc/letsencrypt/live/example.com/fullchain.pem (skipped) No renewals were attempted.

여러 도메인이 포함된 번들 인증서를 만든 경우 기본 도메인 이름만 출력에 표시되지만 갱신은 이 인증서에 포함된 모든 도메인에 대해 유효해야 합니다.

인증서가 오래되지 않도록 하는 실용적인 방법은 주기적으로 자동 갱신 명령을 실행하는 cron 작업을 만드는 것입니다. 갱신은 먼저 만료 날짜를 확인하고 인증서 만료가 30일 미만인 경우에만 갱신을 실행하므로 예를 들어 매주 또는 매일 실행되는 cron 작업을 만드는 것이 안전합니다.

crontab을 편집하여 매주 갱신 명령을 실행할 새 작업을 생성해 보겠습니다. 루트 사용자의 crontab을 편집하려면 다음을 실행하십시오.

  1. sudo crontab -e

편집기를 선택하라는 메시지가 표시될 수 있습니다.

Output
no crontab for root - using an empty one Select an editor. To change later, run 'select-editor'. 1. /bin/nano <---- easiest 2. /usr/bin/vim.basic 3. /usr/bin/vim.tiny Choose 1-3 [1]:

vim에 익숙하지 않은 경우 Enter 키를 눌러 기본값인 nano를 사용합니다.

crontab 끝에 다음 내용을 모두 한 줄에 포함합니다.

crontab
. . . 30 2 * * 1 /usr/bin/certbot renew >> /var/log/le-renew.log

저장 및 종료. 이렇게 하면 매주 월요일 오전 2시 30분에 letsencrypt-auto renew 명령을 실행할 새로운 크론 작업이 생성됩니다. 명령으로 생성된 출력은 /var/log/le-renewal.log에 있는 로그 파일로 파이프됩니다.

cron 작업을 생성하고 예약하는 방법에 대한 자세한 내용은 VPS 가이드에서 Cron을 사용하여 작업을 자동화하는 방법을 확인할 수 있습니다.

결론

이 가이드에서는 Apache에서 호스팅되는 웹 사이트를 보호하기 위해 Let’s Encrypt에서 무료 SSL 인증서를 설치하는 방법을 살펴보았습니다. 공식 Let’s Encrypt 블로그에서 수시로 중요한 업데이트를 확인하는 것이 좋습니다.