Ubuntu 22.04에서 Cloudflare와 Nginx를 사용하여 웹 사이트 호스팅하는 방법

저자는 전자 국경선 기금을 기부 대상으로 선택하여 기부를 위해 쓰기 프로그램의 일환으로 기부했습니다.

소개

Cloudflare는 방문자와 웹사이트 소유자의 서버 사이에 위치하여 웹사이트의 역방향 프록시로 작동하는 서비스입니다. Cloudflare는 콘텐츠 전송 네트워크(CDN)뿐만 아니라 DDoS 방어 및 분산형 도메인 이름 서버 서비스를 제공합니다.

Nginx는 인터넷에서 가장 크고 고트래픽 사이트 중 일부를 호스팅하는 인기 있는 웹 서버입니다. 기관이 Nginx를 사용하여 웹사이트를 제공하고 CDN 및 DNS 제공자로 Cloudflare를 사용하는 것이 일반적입니다.

이 자습서에서는 Nginx로 제공되는 웹사이트를 Cloudflare의 Origin CA 인증서로 보호한 다음 Nginx를 사용하여 인증된 풀 요청을 구성할 것입니다. 이 설정을 사용하는 장점은 Cloudflare의 CDN 및 빠른 DNS 해결을 활용하면서 모든 연결이 Cloudflare를 통과하도록 보장한다는 것입니다. 이를 통해 악성 요청이 서버에 도달하는 것을 방지합니다.

필수 조건

이 튜토리얼을 완료하려면 다음이 필요합니다:

단계 1 — 오리진 CA TLS 인증서 생성

Cloudflare 오리진 CA를 사용하면 Cloudflare에서 서명한 무료 TLS 인증서를 생성하여 Nginx 서버에 설치할 수 있습니다. Cloudflare에서 생성한 TLS 인증서를 사용하면 Cloudflare 서버와 Nginx 서버 간의 연결을 안전하게 할 수 있습니다.

Origin CA로 인증서를 생성하려면 웹 브라우저에서 Cloudflare 계정에 로그인하세요. 보안할 도메인을 선택하고 Cloudflare 대시보드의 SSL/TLS 섹션으로 이동하세요. 거기서 원본 서버 탭으로 이동하고 인증서 생성 버튼을 클릭하세요:

기본 옵션인 Cloudflare에서 개인 키 및 CSR 생성을 선택한 상태로 두세요.

생성을 클릭하면 대화 상자에 원본 인증서개인 키가 표시됩니다. 보안상의 이유로 개인 키 정보는 다시 표시되지 않으므로 확인을 클릭하기 전에 서버로 키를 복사하세요.

서버의 /etc/ssl 디렉터리를 사용하여 원본 인증서와 개인 키 파일을 보관합니다. 이 폴더는 이미 서버에 있습니다.

먼저 브라우저의 대화 상자에 표시된 원본 인증서 내용을 복사하세요.

그런 다음 서버에서 선호하는 텍스트 편집기로 /etc/ssl/cert.pem을 엽니다:

  1. sudo nano /etc/ssl/cert.pem

인증서 내용을 파일에 붙여넣고 파일을 저장하고 편집기를 종료하세요. nano를 사용하는 경우 Ctrl+X를 누르고 나면 Y를 입력한 다음 Enter를 누르세요.

그런 다음 브라우저로 돌아가 개인 키의 내용을 복사하세요. 편집할 파일인 /etc/ssl/key.pem을 엽니다:

  1. sudo nano /etc/ssl/key.pem

개인 키를 파일에 붙여넣고 파일을 저장하고 편집기를 종료하세요.

참고: 때로는 클라우드플레어 대시보드에서 인증서와 키를 복사하여 서버의 관련 파일에 붙여넣을 때 공백 라인이 삽입됩니다. Nginx는 이러한 인증서와 키를 잘못된 것으로 처리하므로 파일에 공백 라인이 없는지 확인하십시오.

경고: 클라우드플레어의 오리진 CA 인증서는 클라우드플레어에만 신뢰되므로 클라우드플레어와 활발하게 연결된 오리진 서버에서만 사용해야 합니다. 언제든지 클라우드플레어를 일시 중지하거나 비활성화하면 오리진 CA 인증서가 신뢰할 수 없는 인증서 오류를 발생시킵니다.

이제 키와 인증서 파일을 서버에 복사했으므로 Nginx 구성을 업데이트하여 사용해야 합니다.

단계 2 — Nginx에서 오리진 CA 인증서 설치

이전 섹션에서 클라우드플레어 대시보드를 사용하여 오리진 인증서와 개인 키를 생성하고 파일을 서버에 저장했습니다. 이제 사이트의 Nginx 구성을 업데이트하여 클라우드플레어 서버와 서버 간의 연결을 보안하는 데 오리진 인증서와 개인 키를 사용하겠습니다.

먼저 UFW가 HTTPS 트래픽을 허용하는지 확인하십시오. Nginx Full을 활성화하여 포트 80 (HTTP)과 포트 443 (HTTPS)를 모두 엽니다:

  1. sudo ufw allow 'Nginx Full'

이제 UFW를 다시로드합니다:

  1. sudo ufw reload

마지막으로 새로운 규칙이 허용되고 UFW가 활성화되었는지 확인하십시오:

  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)

이제 Nginx 서버 블록을 조정할 준비가되었습니다. Nginx는 설치 중에 기본 서버 블록을 생성합니다. 사용자 정의 서버 블록을 이미 구성했으므로 해당 서버 블록이 아직 존재하는 경우 제거하십시오:

  1. sudo rm /etc/nginx/sites-enabled/default

다음으로 도메인에 대한 Nginx 구성 파일을 엽니다:

  1. sudo nano /etc/nginx/sites-available/your_domain

파일은 다음과 같아야합니다:

/etc/nginx/sites-available/your_domain
server {
        listen 80;
        listen [::]:80;

        root /var/www/your_domain/html;
        index index.html index.htm index.nginx-debian.html;

        server_name your_domain www.your_domain;

        location / {
                try_files $uri $uri/ =404;
        }
}

다음을 수행하도록 Nginx 구성 파일을 수정하겠습니다:

  • 포트 80에서 청취하고 모든 요청을 https를 사용하도록 리디렉션합니다.
  • 포트 443에서 청취하고 이전 섹션에 추가한 원본 인증서와 개인 키를 사용합니다.

파일을 다음과 같이 수정하십시오:

/etc/nginx/sites-available/your_domain
server {
    listen 80;
    listen [::]:80;
    server_name your_domain www.your_domain;
    return 302 https://$server_name$request_uri;
}

server {

    # SSL 구성

    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    ssl_certificate         /etc/ssl/cert.pem;
    ssl_certificate_key     /etc/ssl/key.pem;

    server_name your_domain www.your_domain;

    root /var/www/your_domain/html;
    index index.html index.htm index.nginx-debian.html;


    location / {
            try_files $uri $uri/ =404;
    }
}

파일을 저장하고 편집기를 종료하십시오.

다음으로 Nginx 구성 파일 중 어떤 것에도 구문 오류가 없는지 확인하기 위해 테스트합니다:

  1. sudo nginx -t

문제가 없는 경우 변경 사항을 활성화하도록 Nginx를 다시 시작하십시오:

  1. sudo systemctl restart nginx

이제 Cloudflare 대시 보드의 SSL/TLS 섹션으로 이동하여 개요 탭으로 이동하고 SSL/TLS 암호화 모드전체 (엄격)로 변경하십시오. 이렇게하면 Cloudflare가 Cloudflare와 원본 Nginx 서버 간의 연결을 항상 암호화하도록합니다.

이제 웹 사이트를 https://your_domain에서 방문하여 올바르게 설정되었는지 확인하십시오. 홈 페이지가 표시되고 브라우저가 사이트가 안전하다고보고합니다.

인증서의 세부 정보를 보려면 브라우저의 개발자 도구에 액세스하고 보안 탭을 선택한 다음 인증서 보기를 선택하십시오.

참고: 인증서에 클라우드플레어가 발급 기관으로 나열되어 있지 않을 수 있습니다. 이는 클라우드플레어가 Let’s Encrypt와 같은 다른 인증 기관을 사용할 수 있기 때문입니다. 완전한 목록은 클라우드플레어의 제품 문서를 참조하십시오.

다음 섹션에서는 인증된 오리진 풀을 설정하여 오리진 서버가 클라우드플레어와 통신하고 있는지 확인합니다. 이렇게 함으로써, Nginx는 유효한 클라우드플레어 클라이언트 인증서를 사용하는 요청만 허용하도록 구성됩니다. 클라우드플레어를 통과하지 않은 모든 요청은 삭제됩니다.

단계 3 — 인증된 오리진 풀 설정

오리진 CA 인증서는 클라우드플레어가 올바른 오리진 서버와 통신 중임을 확인하는 데 도움이 됩니다. 이 단계에서는 TLS 클라이언트 인증을 사용하여 오리진 Nginx 서버가 클라우드플레어와 통신 중인지 확인합니다.

클라이언트 인증된 TLS 핸드셰이크에서 양쪽 모두 인증서를 제공합니다. 원본 서버는 클라우드플레어의 유효한 클라이언트 인증서를 사용하는 요청만 수락하도록 구성됩니다. 클라우드플레어를 통과하지 않은 요청은 클라우드플레어의 인증서가 없기 때문에 삭제됩니다. 이는 공격자가 클라우드플레어의 보안 조치를 우회하고 Nginx 서버에 직접 연결할 수 없음을 의미합니다.

클라우드플레어는 다음 인증서로 서명된 인증서를 제공합니다:

-----BEGIN CERTIFICATE-----
MIIGCjCCA/KgAwIBAgIIV5G6lVbCLmEwDQYJKoZIhvcNAQENBQAwgZAxCzAJBgNV
BAYTAlVTMRkwFwYDVQQKExBDbG91ZEZsYXJlLCBJbmMuMRQwEgYDVQQLEwtPcmln
aW4gUHVsbDEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzETMBEGA1UECBMKQ2FsaWZv
cm5pYTEjMCEGA1UEAxMab3JpZ2luLXB1bGwuY2xvdWRmbGFyZS5uZXQwHhcNMTkx
MDEwMTg0NTAwWhcNMjkxMTAxMTcwMDAwWjCBkDELMAkGA1UEBhMCVVMxGTAXBgNV
BAoTEENsb3VkRmxhcmUsIEluYy4xFDASBgNVBAsTC09yaWdpbiBQdWxsMRYwFAYD
VQQHEw1TYW4gRnJhbmNpc2NvMRMwEQYDVQQIEwpDYWxpZm9ybmlhMSMwIQYDVQQD
ExpvcmlnaW4tcHVsbC5jbG91ZGZsYXJlLm5ldDCCAiIwDQYJKoZIhvcNAQEBBQAD
ggIPADCCAgoCggIBAN2y2zojYfl0bKfhp0AJBFeV+jQqbCw3sHmvEPwLmqDLqynI
42tZXR5y914ZB9ZrwbL/K5O46exd/LujJnV2b3dzcx5rtiQzso0xzljqbnbQT20e
ihx/WrF4OkZKydZzsdaJsWAPuplDH5P7J82q3re88jQdgE5hqjqFZ3clCG7lxoBw
hLaazm3NJJlUfzdk97ouRvnFGAuXd5cQVx8jYOOeU60sWqmMe4QHdOvpqB91bJoY
QSKVFjUgHeTpN8tNpKJfb9LIn3pun3bC9NKNHtRKMNX3Kl/sAPq7q/AlndvA2Kw3
Dkum2mHQUGdzVHqcOgea9BGjLK2h7SuX93zTWL02u799dr6Xkrad/WShHchfjjRn
aL35niJUDr02YJtPgxWObsrfOU63B8juLUphW/4BOjjJyAG5l9j1//aUGEi/sEe5
lqVv0P78QrxoxR+MMXiJwQab5FB8TG/ac6mRHgF9CmkX90uaRh+OC07XjTdfSKGR
PpM9hB2ZhLol/nf8qmoLdoD5HvODZuKu2+muKeVHXgw2/A6wM7OwrinxZiyBk5Hh
CvaADH7PZpU6z/zv5NU5HSvXiKtCzFuDu4/Zfi34RfHXeCUfHAb4KfNRXJwMsxUa
+4ZpSAX2G6RnGU5meuXpU5/V+DQJp/e69XyyY6RXDoMywaEFlIlXBqjRRA2pAgMB
AAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgECMB0GA1Ud
DgQWBBRDWUsraYuA4REzalfNVzjann3F6zAfBgNVHSMEGDAWgBRDWUsraYuA4REz
alfNVzjann3F6zANBgkqhkiG9w0BAQ0FAAOCAgEAkQ+T9nqcSlAuW/90DeYmQOW1
QhqOor5psBEGvxbNGV2hdLJY8h6QUq48BCevcMChg/L1CkznBNI40i3/6heDn3IS
zVEwXKf34pPFCACWVMZxbQjkNRTiH8iRur9EsaNQ5oXCPJkhwg2+IFyoPAAYURoX
VcI9SCDUa45clmYHJ/XYwV1icGVI8/9b2JUqklnOTa5tugwIUi5sTfipNcJXHhgz
6BKYDl0/UP0lLKbsUETXeTGDiDpxZYIgbcFrRDDkHC6BSvdWVEiH5b9mH2BON60z
0O0j8EEKTwi9jnafVtZQXP/D8yoVowdFDjXcKkOPF/1gIh9qrFR6GdoPVgB3SkLc
5ulBqZaCHm563jsvWb/kXJnlFxW+1bsO9BDD6DweBcGdNurgmH625wBXksSdD7y/
fakk8DagjbjKShYlPEFOAqEcliwjF45eabL0t27MJV61O/jHzHL3dknXeE4BDa2j
bA+JbyJeUMtU7KMsxvx82RmhqBEJJDBCJ3scVptvhDMRrtqDBW5JShxoAOcpFQGm
iYWicn46nPDjgTU0bX1ZPpTpryXbvciVL5RkVBuyX2ntcOLDPlZWgxZCBp96x07F
AnOzKgZk4RzZPNAxCXERVxajn/FLcOhglVAKo5H0ac+AitlQ0ip55D2/mf8o72tM
fVQ6VpyjEXdiIXWUq/o=
-----END CERTIFICATE-----

인증서를 직접 클라우드플레어 문서에서 다운로드할 수도 있습니다.

이 인증서를 복사하세요.

그런 다음 클라우드플레어의 인증서를 보관할 파일 /etc/ssl/cloudflare.crt를 생성하세요:

  1. sudo nano /etc/ssl/cloudflare.crt

인증서를 파일에 추가하세요. 그런 다음 파일을 저장하고 편집기를 종료하세요.

이제 Nginx 구성을 TLS 인증된 오리진 풀스를 사용하도록 업데이트하세요. 도메인의 구성 파일을 엽니다:

  1. sudo nano /etc/nginx/sites-available/your_domain

다음 예제와 같이 ssl_client_certificatessl_verify_client 지시문을 추가하세요:

/etc/nginx/sites-available/your_domain
. . .

server {

    # SSL 구성

    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    ssl_certificate         /etc/ssl/cert.pem;
    ssl_certificate_key     /etc/ssl/key.pem;
    ssl_client_certificate /etc/ssl/cloudflare.crt;
    ssl_verify_client on;

    . . .

파일을 저장하고 편집기를 종료하세요.

다음으로 Nginx를 테스트하여 Nginx 구성에 구문 오류가 없는지 확인하세요:

  1. sudo nginx -t

문제가 발견되지 않았다면 변경 사항을 활성화하기 위해 Nginx를 다시 시작하세요:

  1. sudo systemctl restart nginx

마지막으로 인증된 풀을 활성화하려면 Cloudflare 대시보드에서 SSL/TLS 섹션을 열고 원본 서버 탭으로 이동하여 인증된 원본 풀 옵션을 토글합니다.

이제 웹 사이트를 https://your_domain으로 방문하여 올바르게 설정되었는지 확인하십시오. 이전과 마찬가지로 홈페이지가 표시됩니다.

서버가 Cloudflare의 CA에 의해 서명된 요청만 수락하는지 확인하려면 인증된 원본 풀 옵션을 해제한 다음 웹 사이트를 다시로드하십시오. 다음 오류 메시지가 표시됩니다:

요청이 Cloudflare의 CA에 의해 서명되지 않으면 원본 서버가 오류를 발생시킵니다.

참고: 대부분의 브라우저는 요청을 캐시하므로 위의 변경 사항을 보려면 브라우저에서 새 시크릿 브라우징 모드를 사용할 수 있습니다. 웹 사이트를 설정하는 동안 Cloudflare가 요청을 캐시하지 않으려면 Cloudflare 대시보드의 개요로 이동하여 개발 모드를 토글하십시오.

이제 올바르게 작동하는 것을 확인했으므로 Cloudflare 대시보드의 SSL/TLS 섹션으로 다시 돌아가서 원본 서버 탭으로 이동하여 인증된 원본 풀 옵션을 다시 활성화하십시오.

결론

이 튜토리얼에서는 클라우드플레어와 Nginx 서버 간의 트래픽을 암호화하여 클라우드플레어의 오리진 CA 인증서를 사용하여 Nginx 서버를 안전하게 보호했습니다. 그런 다음 Nginx 서버에 인증된 오리진 풀을 설정하여 클라우드플레어 서버의 요청만 수락하고 다른 사람이 직접 Nginx 서버에 연결하는 것을 방지했습니다.

Source:
https://www.digitalocean.com/community/tutorials/how-to-host-a-website-using-cloudflare-and-nginx-on-ubuntu-22-04