HSTS란
- 사이트가 오직 HTTPS 통신만 할 수 있음을 접속하고자 하는 Browser에게 알려 주는 기능
- 보안을 강화시킬 목적으로 Browser에게 HTTPS만 사용하도록 강제하는 기능
- Browser에서도 HSTS 기능을 지원해야 HSTS 기능이 제대로 동작
- 2010년 이후에 출시된 대부분의 Browser 버전에서는 HSTS 기능을 지원
- HSTS (HTTP Strict Transport Security)는 HTTPS를 클라이언트의 브라우저에서 강제화하여 최초 접속 시부터 HTTPS로 접속할 수 있도록 유도하기 위해 만들어짐 → HTTPS를 이용한 웹사이트를 운영 중이라면 HSTS를 필수로 설정하여 운영해야 함
- SSL Stripping 공격(SSL/TLS Hijacking)을 방지하기 위하여 HSTS 기능을 사용
- 사용자가 실수로 HTTPS를 지원하는 Site를 HTTP접속 했을 때 중간자 공격에 의해 통신 정보가 공격자에게 노출이 되는 것을 방지하기 위해 강제로 HTTPS로 접속하기 위한 목적으로 사용
- HSTS는 cookie hijacking을 방지하는 용도로도 사용됨
- Browser에서 HSTS기능을 지원한다고 해도, SSL stripping 공격에 완전히 안전한 것은 아님
- 공격자가 특정인을 대상으로 표적공격을 한다면 아래와 같은 방법을 취하여 HSTS를 무력화
- 특정인의 PC에 침투해서, Browser에 설정된 HSTS기능을 disable시킴
- HSTS List에서 특정 사이트에 대한 정보를 초기화
HSTS 기능의 동작
- Browser로 접속 시, 주소창에 “https://” 또는 “http://” 와 같은 프로토콜 이름을 입력하지 않고, 단지 도메인 이름(예를 들면, www.naver.com)만 입력
- Browser는 먼저 HTTP(“http://” 사용)로 해당 도메인에 접속을 시도
- 도메인 이름만 추출하여, HSTS List와 비교하여 존재하면(도메인 이름에 HSTS가 설정 O), HTTPS을 사용하여 접속
- 해당 도메인이 HTTPS만을 지원하는 사이트(HSTS)라면, ”301 Redirect” 또는 ”302 Redirect” response를 보내어 사이트가 HTTPS로 다시 접속하라고 지시
- Browser가 이전에 접속한 적인 없는 HTTPS 지원 사이트에 HTTP로 접속하면, “301 Redirect” Reply Message로 다시 HTTPS로 접속
- Server는 HTTPS Reply Message에 "HSTS Policy"를 넣어서 전송 → 암호화 되기 전 packet인, HTTP response header field에 "Strict-Transport-Security" 필드 정보 삽입
- Browser는 위 정보를 받아서 내부 HSTS List를 구성
- Server는 "Max Age 값", "Subdomain 적용여부 값", "Preloaded List에 추가여부 값"을 HTTP response header field에 담아 "Strict-Transport-Security" 함께 client에 전달
- 만약, Web Browser가 HTTP Protocol로 Web Server에 접속하고, HTTP Reply Message에 HSTS Policy 정보가 들어 있는 경우는 무시
- 사이트는 status code로 HTTPS로 redirect를 인식한다면, 사용자는 주소창 옆에 있는 자물쇠 아이콘 또는 접속된 URL주소 앞에 “https://”를 보고, 해당 사이트가 HTTPS 지원함을 인식
HSTS response header의 Syntax
- HSTS header example
Strict-Transport-Security: max-age=<expire-time> Strict-Transport-Security: max-age=<expire-time>; includeSubDomains Strict-Transport-Security: max-age=<expire-time>; preload
1. Max Age 값
- HSTS List 에 존속하는 시간
- Age 값이 0(zero)인 경우는 HSTS Policy를 삭제하라는 명령
2. Subdomain 적용 여부 값
- subdomain에 HSTS를 적용할지 여부를 알려줌
3. Preloaded HSTS Lists
- 이미 만들어져 있는 HSTS Lists를 Browser에 제공하는 기능도 지원 → "Preloaded HSTS Lists"
- Preloaded HSTS Lists는 Browser 설치 또는 Update 할 때 Browser Vendor에 의해 제공
- Preloaded HSTS Lists를 사용하는 목적은 SSL Stripping 공격을 방지하기 위한 목적
- 사이트를 "Preloaded HSTS Lists"에 포함시키려면 "hstspreload.org" 사이트에 신청 → 요구하는 기능을 충족한 다음에 양식에 맞추어 신청
- 사이트가 "Preloaded HSTS Lists"에 포함되어 있는 지 확인도 "hstspreload.org" 사이트에서 가능
- HTTP만 지원하는 사이트를 HSTS List에 추가하거나, 공격자에 의해 HTTP을 지원하는 사이트로 Redirect 된 경우는, "Your connection is not private" 경고 메시지가 출력 → 접속 X
- DNS Spoofing에 의한 Redirection은 IP 주소 자체가 변경되는 경우는 여기에 해당 X
- "HSTS Lists" 와 "Preloaded HSTS List"가 각각 존재하는 것이 아니고, 개념상 미리 만들어져 있는 "HSTS Lists"를 "Preloaded HSTS Lists"라고 칭함
HSTS 응답을 받는 웹 사이트에 대해서 https 접속을 강제화
- max-age가 63072000초로써 rsec.kr은 최초 접속 후 2년 동안 브라우저에서 HTTPS 접속 강제화
- 설정된 HSTS 내역은 클라이언트의 브라우저에서 확인할 수 있는데, 크롬 브라우저의 경우는 아래와 같은 명령어로 확인 가능 (크롬 브라우저 주소창에 입력)
- 브라우저 사용자가 직접 특정 사이트를 HSTS List에 추가하는기능 제공
- Chrome Browser 인 경우는, 주소창에 “chrome://net-internals/#hsts” 입력하여 설정
- 설정된 값을 확인 및 삭제도 가능
- HSTS 접속 URL : chrome://net-internals/#hsts
- 위 명령을 통하여 HSTS 를 적용할 도메인을 직접 추가/삭제하거나 쿼리하여 내용을 조회 가능
- HSTS는 서버 측 응답을 신뢰하여 브라우저에 일정시간 (max-age)동안 등록이 되기도 하지만 google, twitter 등의 웹사이트는 구글 크롬 브라우저에 하드코딩 되어 HSTS가 Preload되어 강제화 되도록 되어 있음
- 관련 내용은 아래 링크를 통해 조회 가능 (https://www.chromium.org/hsts)
HSTS (HTTP Strict Transport Security)의 설정 방법
- HSTS는 웹서버에서 응답해주는 헤더에 최초 포함되어 있는 만큼 웹서버에서 설정 필요
- Nginx의 경우는 아래와 같이 add_header를 추가한 후 재시작하면 HSTS를 적용 가능
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
- HSTS 설정에 대한 옵션
- max-age=63072000
- HSTS가 브라우저에 설정될 시간이며 초단위로 설정
- 63072000은 2년을 의미
- 63072000 = 2 * 365 * 24 * 60 * 60
- includeSubdomains
- HSTS가 적용될 도메인의 subdomain (www.rsec.kr 또는 mail.rsec.kr 따위)까지 HSTS를 확장 적용함을 의미
- HSTS가 적용될 도메인의 subdomain (www.rsec.kr 또는 mail.rsec.kr 따위)까지 HSTS를 확장 적용함을 의미
- preload
- HSTS 적용이 클라이언트 측에서 preload로 이루어짐을 의미
- max-age=63072000
HSTS (HTTP Strict Transport Security)의 설정 안정성 테스트 방법
- https://hstspreload.org 웹사이트에서 HSTS 적용이 잘 되어있는지 확인 가능
- rsec.kr 을 검색한 결과 아래와 같은 결괏값을 추출
- rsec.kr의 인증서가 subdomain까지 지원할 수 없음을 경고하였는데, 이것은 rsec.kr에서 사용하고 있는 Let’s encrypt 인증서가 아직 wildcard 인증서를 지원하고 있지 않아 생긴 문제
- 향후 wildcard 인증서로 적용하면 해결될 문제 가능
- https://hstspreload.org 웹사이트 HSTS 확인
HSTS (HTTP Strict Transport Security)를 이용하여 SSL Strip 방어
- MITM (Man in the Middle) 공격 방어
- TLS/SSL로 암호화된 세션은 중간에서 공격자가 그 내용을 감청하더라도 암호화 되어 있기 때문에 데이터가 보호 가능
- 그렇다면 SSL/TLS 로 암호화 된 세션을 강제로 암호화하지 않은 HTTP 세션으로 유도한다면 어떨까요?
- 공격자는 중간에서 암호화 되지 않은 데이터를 감청함으로써 그 내용을 알 수 있을 겁니다.
- 아래의 SSL Strip 공격을 HSTS로 적용하게 되면 클라이언트(브라우저)에서 HTTPS 접속만 강제화 됨으로써 SSL Strip 공격을 방어 가능
- HSTS는 Sub Domain 을 통한 우회 방법 등 일부 설정이 누락되었을 경우 SSL Strip 공격이 가능
※ SSL Strip- SSL/TLS로 암호화 된 세션을 강제로 암호화하지 않은 HTTP 세션으로 유도한다면 공격자는 중간에서 암호화되지 않은 데이터를 감청함으로써 내용을 알 수 있음
- sslstrip이라 불리는 tool을 사용하면, SSL Stripping을 구현 가능
- sslstrip은 중간자(Man-In-The-Middle) 위치에 있으면서 양쪽(Browser와 Server)을 모두 속이면서 동작
- HSTS 기능이 없다면, sslstrip은 공격자가 운영하는 Proxy Server 역할
- SSL Strip 공격하는 과정
- sslstrip이 중간에서 traffic을 가로챌 수 있도록 하려면, 먼저 ARP poisoning(또는 ARP spoofing) 공격을 수행 → server로 향하는 트래픽을 sslstrip으로 가게 함
- 사용자는 http://bank 로 연결 시도. 공격자는 그 연결을 그대로 웹서버에 전달
- 웹서버는 https를 이용하여 연결하도록 응답
- 공격자는 웹서버의 응답을 조작하여 http로 연결하는 것처럼 사용자에게 응답
- 사용자는 응답받은 내용을 근거로 http로 연결. 공격자는 내용을 조회한 후 https로 전환하여 웹서버에 연결을 전달
- 최종적으로 공격자는 ssl 을 strip 하여 중간에서 내용을 감청할 수 있음
- ARP poisoning (ARP spoofing)
- 동일한 subnet상에서 이루어지는 것
- ARP poisoning은 ARP cache 값, 즉 IP 주소에 대응되는 MAC 주소 값을 조작하는 공격
- SSL Strip은 HTTP로 통신하는 모든 내용을 sslstrip.log 파일에 기록해 두는 기능을 제공
- SSL Strip.log 파일을 통해 Server 접속자의 개인 정보를 추출 가능
- 실제 환경에서는 공격자가 SSL Strip과 유사한 기능을 가진 악성코드를 설치하여 민감한 정보를 탈취
'HTTP > HTTP 특징' 카테고리의 다른 글
HTTP의 Content-Length → 엔터티의 길이 (0) | 2022.07.23 |
---|---|
ALPN 프로토콜 (Application Layer Protocol Negotiation) (0) | 2022.07.03 |
HTTP의 URL 공백문자를 표시하는 특수문자 : %20 (0) | 2022.06.27 |