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

이전글인 ‘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-Options		SAMEORIGIN;
add_header X-Content-Type-Options	nosniff;
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_protocols				TLSv1 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_timeout			1d;

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_certificate			ssl/pluto/pluto_chain.pem;
	ssl_certificate_key		ssl/pluto/pluto.key;
	ssl_dhparam			ssl/dhparam.pem;

	include				ssl.conf;
	
	location / {
		proxy_pass https://192.168.0.53:443/;
	}
}

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

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

연관 글

댓글