이전글인 ‘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 과 인증서 체인을 불러오는 설정입니다.
위와 같이 설정해서 무료 인증서로도 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만 사용하도록 설정하면 됩니다.