보안등급 A+를 받을수 있는 NGINX SSL 설정

NGINX

이전글인 ‘NGINX로 SSL을 지원하는 리버스 프록시 설정하기‘ 를 통해 SSL을 지원하는 리버스 프록시를 설정해 보았는데요. 이 세팅만으로는 Qualys SSL LABS 에서 제공하는 SSL Server Test에서 A+등급을 받을 수가 없습니다.

참고로 SSL 인증서와 private key만 연결했을경우 F등급, 위 포스팅대로 설정했을 경우 B등급을 받을수 있는데요. 이번엔 NGINX에서 A+등급을 받을수 있는SSL 설정을 해보겠습니다. 리버스 프록시 뿐만 아니라 NGINX에서 가상호스트를 설정할때도 같으니 참고하시면 좋겠습니다.

NGINX 헤더 추가

우선 nginx.conf 파일의 http { } 구문 안에 다음의 헤더 코드를 추가합니다.

add_header X-Frame-OptionsSAMEORIGIN;
add_header X-Content-Type-Optionsnosniff;
add_header X-XSS-Protection"1; mode=block";

X-Frame-Options 는 페이지 안에 다른 페이지 (예를 들어 iframe)를 불러오는것에 대한 설정입니다. 옵션을 설명하면

  • SAMEORIGIN : 도메인을 기준으로 같은사이트 내에서는 프레임/iframe으로 불러올수 있지만 다른 사이트의 페이지는 불러올수 없다.
  • DENY : 모든 프레임/iframe을 무효화.
  • ALLOW-From Url : 주소를 설정하고 해당 주소는 프레임/iframe 불러오기가 가능.

입니다.

두번째줄의 X-Content-Type-Options 는 잘못된 MIME 타입이 포함된 응답을 거부하는 옵션이고 세번째줄의 X-XSS-Protection 헤더는 XSS를 통한 세션 하이잭킹을 방지해주는 역할을 합니다.

NGINX SSL 설정

아래의 코드를 ssl.conf 파일로 저장한다음 가상호스트 설정 구문인 server { } 안에 include 로 불러와 활용할수 있습니다.

ssl_protocolsTLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers"EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";

ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout1d;

add_header Strict-Transport-Security "max-age=15768000; includeSubDomains";

ssl 프로토콜인 SSLv3과 SSLv2는 보안에 취약하기 때문에 사용하지 않고 ssl_ciphers는 브라우저 마다 암호화의 호환성을 위한 설정입니다. 그밖에 SSL 세션 캐시등은 NGINX의 권장설정입니다.

NGINX dhparam 설정

위의 코드들은 보안과 직간접적으로 영향이 있는 설정이였다면 이제부터 득점을 할수 있는 설정인 디피-헬만 파라미터 설정입니다. 물론 점수 뿐만아니라 보안도 강화가 되죠. 이 설명을 위해 윈도에서 OpenSSL 설치하기 를 포스팅 했습니다.

OpenSSL을 실행하고 dhparam 키를 생성합니다. OpenSSL로 디피-헬만 파라미터(dhparam) 키 만들기 참고.

생성된 dhparam.pem 파일을 NGINX의 SSL 설정에 넣어줍니다.

ssl_dhparam파일경로/dhparam.pem;

SSL 인증서 체인 설정

마지막으로 SSL 인증서 체인 설정입니다.

발급받은 인증서 (확장자 crt)와 인증기관의 중간 인증서 내용을 합쳐 체인을 만드는 것으로 텍스트 에디터에서 다음과 같이 만들어줍니다.

-----BEGIN CERTIFICATE-----
~~~~~~~~~~~~~~~~~~~~~~~~~~ 코드 중략 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
MIIBOwYLKwYBBAGBtTcBAgMwggEqMC4GCCsGAQUFBwIBFiJodHRwOi8vd3d3LnN0
YXJ0c3NsLmNvbS9wb2xpY3kucGRmMIH3BggrBgEFBQcCAjCB6jAnFiBTdGFydENv
bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTADAgEBGoG+VGhpcyBjZXJ0aWZpY2F0
~~~~~~~~~~~~~~~~~~~~~~~~~~ 코드 중략 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
~~~~~~~~~~~~~~~~~~~~~~~~~~ 코드 중략 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
BwEBBIGBMH8wOQYIKwYBBQUHMAGGLWh0dHA6Ly9vY3NwLnN0YXJ0c3NsLmNvbS9z
dWIvY2xhc3MxL3NlcnZlci9jYTBCBggrBgEFBQcwAoY2aHR0cDovL2FpYS5zdGFy
dHNzbC5jb20vY2VydHMvc3ViLmNsYXNzMS5zZXJ2ZXIuY2EuY3J0MCMGA1UdEgQc
~~~~~~~~~~~~~~~~~~~~~~~~~~ 코드 중략 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
-----END CERTIFICATE-----

다시 한번 설명하자면 첫번째 —–BEGIN CERTIFICATE—– 부터 —–END CERTIFICATE—– 까지는 사이트의 인증서 부분이, 두번째 —–BEGIN CERTIFICATE—– 부터 —–END CERTIFICATE—– 까지 발급 기관의 중간인증서 내용을 복사합니다. 위 내용을 적당한 이름의 확장자 .pem (예시 : 사이트주소.pem) 으로 저장합니다.

그리고 nginx의 인증서 설정에 위에 생성한 파일을 불러옵니다.

ssl_certificate파일경로/mystor_chain.pem;

NGINX SSL 설정 예시 코드

server {
listen 443;
server_name pluto.mystor.net;

ssl on;
ssl_certificatessl/pluto/pluto_chain.pem;
ssl_certificate_keyssl/pluto/pluto.key;
ssl_dhparamssl/dhparam.pem;

includessl.conf;

location / {
proxy_pass https://192.168.0.53:443/;
}
}

필자의 NGINX 설정입니다. 위의 헤더/보안 관련 코드를 ssl.conf로 저장하고 dhparam 과 인증서 체인을 불러오는 설정입니다.

qualys_ssl_lab_ssl_server_test_01위와 같이 설정해서 무료 인증서로도 A+ 등급을 받을수 있습니다.

3 댓글. Leave new

  • 감사합니다. 도움이 정말 많이 되었습니다 ㅎㅎ

    응답
  • 그런데 이와 똑같이 해보니, 다른 건 다 높게 나오는데 protocol support만 최하점이 나와서 F가 떴습니다.
    혹시 어떤게 문제인지 봐주실 수 있나요..?ㅠㅠ 감사합니다!
    https://www.ssllabs.com/ssltest/analyze.html?d=sshtest.cbilization.com

    응답
    • 링크를 클릭하니 서버 응답이 없다고 테스트가 안되네요.

      우선 프로토콜 서포트에서 F등급을 받는 이유는 취약점 때문에 현재 사용하지 않는 SSLv3, SSLv2를 사용하도록 설정했기 때문입니다.

      ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

      위처럼 SSL 설정 항목에 TLS만 사용하도록 설정하면 됩니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

Fill out this field
Fill out this field
유효한 이메일 주소를 입력해주세요.

nginx title 03
NGINX WebDAV 설정 방법
WebDAV(Web Distributed Authoring and Versioning)는 http를 이용해 웹서버에 저장되어 있는 파일을 여러 사용자가 편집하기 위해 고안된 프로토콜입니다. 실제로는 FTP 대용으로…
windows nginx php setting title
윈도우 NGINX PHP 연동 및 서비스 등록 방법
이전 포스트에서 윈도우에 NGINX를 설치하고 서비스에 등록하는 방법까지 알아봤는데요. NGINX를 개발 환경 또는 웹서버 환경으로 만들기 위해서 PHP를 설치해야 하는…