HSTS(HTTP Strict Transport Security) 개념과 설정
1. HSTS란?
- HTTPS를 강제하는 사이트의 경우 HTTP로 접근할 때, 302 Redirect 하는 경우가 많다. 이렇게 될 경우 취약점이 발생한다. (SSL Strip Attack : 하단참고)
- 유저(브라우저)에게 HTTPS 요청만 허용함을 알려주는 것을 HSTS라고 함.(응답 Header에 추가함.)
- HSTS는 서버 응답 Header를 통해 등록이 이루어질수도 있지만, Google, Paypal, Twitter의 경우는 크롬 브라우저에 HSTS가 Preload 되도록 강제화 되어있음.
https://www.chromium.org/hsts
HTTPS로 강제 Redirect 하는 법(Nginx)
return 301 https://$host$request_uri;
SSL Strip Attack이란?
- SSL이 적용되어 있는 페이지에 공격자가 공격 대상의 HTTP Request를 스니핑 하여 SSL을 공격하는 방법
- [공격대상] <- HTTP -> [공격자] <- HTTPS -> [HTTPS Server]
- 자세한 내용은 구글 검색 ^_^
2. HSTS 설정방법
1) HTTP Header
Strict-Transport-Security “max-age=86400; includeSubdomains; preload”;
- 옵션 설명
옵션명 | 설명 | 비고 |
---|---|---|
max-age | HSTS가 브라우저에 설정될 시간 값 | 초단위로 설정, Ex) 606024 = 86,400 = 1day |
includeSubdomains | HSTS가 적용될 도메인의 서브 도메인 적용 여부 | 해당값을 추가하게되면 example.com-> www.example.com, test.example.com까지 확장되어 적용됩니다. |
preload | HSTS가 브라우저 측에서 Preload 적용여부 | 추가시 브라우저 preload list에 추가됩니다. |
(1) apache httpd
Header always set Strict-Transport-Security “max-age=86400; includeSubdomains; preload”
(2) nginx
add_header Strict-Transport-Security “max-age=86400; includeSubdomains; preload”;
2) 설정 확인
3. HSTS 해제방법
- 강제로 HSTS를 삭제하는 방법, 사용자의 브라우저에서 삭제해야함.
1) 서버에서
(1) apache httpd
Header always set Strict-Transport-Security “max-age=0;”
(2) nginx
add_header Strict-Transport-Security “max-age=0”;
2) Chrome
chrome://net-internals/#hsts
- Delete domain security policies 에 삭제할 도메인 입력 후 DELETE 버튼 클릭
- Query HSTS/PKP domain 에 삭제한 도메인 입력 후 Query 버튼 클릭
- 결과는 ‘Not Found’가 나온다.
4. TIP
- HSTS를 추가하면 max-age 값 동안 적용되므로, 테스트 환경에서 max-age를 짧게 잡고, 충분히 테스트 한 후 max-age를 늘리세요.
참고링크
- https://lesstif.gitbooks.io/web-service-hardening/content/ssl-tls-https.html
- https://rsec.kr/?p=315
- https://www.ibm.com/support/knowledgecenter/ko/SSEQTJ_9.0.0/com.ibm.websphere.ihs.doc/ihs/tihs_hsts.html