요즘 openssl 보안 취약점 관련해서 과연 어떤 설정이 가장 보안에 안전할까에 대한 고민이 많습니다.

최근 몇년 새에 심각한 취약점들이 발표되었었죠..

몇 가지 주요한 취약점들을 나열해보면,

RC4 in TLS is Broken, Poodle Attack, FREAK, Logjam, DROWN Attack, Oracle Padding Attack 정도 될 것 같습니다.

이러한 취약점들의 조치 방안으로 지속적으로 openssl 버전 업그레이드가 되어왔는데요~

버전 업그레이드를 해야만 하는 경우도 있었지만, 설정으로 취약점을 보완할 수 있는 경우도 있었답니다.

현재 1.0.1 버전은 t까지 업데이트 되었더라구요..이 버전에서 올해 5월에 나온 Oracle Padding Attack 관련 취약점이 fix되었다고 합니다.

먼저 위에 나열했던 주요 취약점들에 대해 조치 해왔던 사항들에 대해 정리해보았어요.

* Poodle Attack 방지를 위해 SSLProtocol에서 SSLv2와 SSLv3를 제외시켰구요~

(SSLCipherSuite에서 한번더 !(NOT)연산자로 제외해주기도 했답니다.)

* 취약한 Cipher들을 제외시켰습니다.

-> SSLCipherSuite에 !RC4 추가, !EXPORT(또는 !EXP)추가, AES_CBC 방식을 AES_GCM(요게 safe하다고 해요)으로 변경!

제가 조치해왔던 거면 충분한 것일지 의문이 들기 시작했답니다..ㅎㅎ

Secure한 CipherSuites를 설정하려면 어떻게 해야할까 찾아보았어요..

참고한 사이트는 https://github.com/ssllabs/research/wiki/SSL-and-TLS-Deployment-Best-Practices 여긴데..

이곳에서 얘기하는대로 따르면..

첫번째! 우선, 아래와 같은 설정은 피해야 한다고 하네요..

  • Anonymous Diffie-Hellman (ADH) suites do not provide authentication.
  • NULL cipher suites provide no encryption.
  • Export cipher suites are insecure when negotiated in a connection, but they can also be used against a server that prefers stronger suites (the FREAK attack).
  • Suites with weak ciphers (typically of 40 and 56 bits) use encryption that can easily be broken.
  • RC4 is insecure.
  • 3DES is slow and weak.

==> 참고해서 suites를 작성해봅니다. 네번째 항목 빼고는 포함된 것 같네요!

!ADH:!aNULL:!eNULL:!EXPORT:!RC4:!3DES

두번째! 아래와 같이 RSA와 ECDSA keys로 디자인된 알고리즘을 설정하라고 하네요..

ECDHE-ECDSA-AES128-GCM-SHA256
ECDHE-ECDSA-AES256-GCM-SHA384
ECDHE-ECDSA-AES128-SHA
ECDHE-ECDSA-AES256-SHA
ECDHE-ECDSA-AES128-SHA256
ECDHE-ECDSA-AES256-SHA384
ECDHE-RSA-AES128-GCM-SHA256
ECDHE-RSA-AES256-GCM-SHA384
ECDHE-RSA-AES128-SHA
ECDHE-RSA-AES256-SHA
ECDHE-RSA-AES128-SHA256
ECDHE-RSA-AES256-SHA384
DHE-RSA-AES128-GCM-SHA256
DHE-RSA-AES256-GCM-SHA384
DHE-RSA-AES128-SHA
DHE-RSA-AES256-SHA
DHE-RSA-AES128-SHA256
DHE-RSA-AES256-SHA256
EDH-RSA-DES-CBC3-SHA

==> 이런 포맷으로도 변환해봤습니다.

(https://www.openssl.org/docs/manmaster/apps/ciphers.html 이곳의 도움을 받았지요 ㅎ 이렇게 매핑이 된다고 합니다..이런 노가다가;ㅋㅋ)

TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA:TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA:TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256:TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384:TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA:TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA:TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256:TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384:TLS_DHE_RSA_WITH_AES_128_GCM_SHA256:TLS_DHE_RSA_WITH_AES_256_GCM_SHA384:TLS_DHE_RSA_WITH_AES_128_CBC_SHA:TLS_DHE_RSA_WITH_AES_256_CBC_SHA:TLS_DHE_RSA_WITH_AES_128_CBC_SHA256:TLS_DHE_RSA_WITH_AES_256_CBC_SHA256:SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA

Nginx와 Apache HTTP Server에 SSLCipherSuite를 어떻게 설정할지 확인해봤습니다.

* Apache HTTP Server

SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA

* Nginx

ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';

추가로 하나 더 해보았어요~

여기 삵에 게시된 글 중에 ssl 설정 제너레이터 주소를 공유해 주셨었는데요~ (https://mozilla.github.io/server-side-tls/ssl-config-generator/)

여기서 돌려보니, 이렇게! 살짝 보안에 대해서는 약한 suite로 생성해주는 감이 있긴 하네요^^

ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS


오늘은 여기까지!! :)