취약점 스캔 결과
해결 방안
1. Content-Security-Policy 헤더 누락 또는 불안전 설정
1.1 역할
CSP(콘텐츠 보안 정책)는 신뢰할 수 있는 콘텐츠 출처를 지정하여 제약 조건을 설정함으로써 크로스 사이트 스크립팅과 같은 이종 소스 파일 공격을 방지합니다. 이는 JavaScript, CSS, 이미지 등에 적용됩니다.<br></br>
개인적으로는 이 설정을 권장하지 않습니다. 첫째, 보안 위협 수준이 비교적 낮으며, 둘째, 각 사이트의 리소스 참조 상황을 모두 파악해야 하며, 이후 리소스 참조가 변경될 경우 오류가 발생할 수 있기 때문입니다.
1.2 관련 설정 값
| 지시어 | 예시 | 설명 |
|---|---|---|
| default-src | 'self' cdn.example.com | 기본 정책으로, JS 파일/이미지/CSS/Ajax 요청 등 모든 접근에 적용됩니다 |
| script-src | 'self' js.example.com | JavaScript 파일 필터링 정의 |
| style-src | 'self' css.example.com | CSS 파일 필터링 정의 |
| img-src | 'self' img.example.com | 이미지 파일 필터링 정의 |
| connect-src | 'self' | 요청 연결 파일 필터링 정의 |
| font-src | font.example.com | 폰트 파일 필터링 정의 |
| object-src | 'self' | 페이지 플러그인(예: , , ) 필터링 정의 |
| media-src | media.example.com | 미디어(예: HTML5의 , ) 필터링 정의 |
| frame-src | 'self' | 하위 프레임 로딩 정의 |
| sandbox | allow-forms allow-scripts | 샌드박스 모드로, 페이지 팝업/JS 실행 등을 차단하며, allow-forms, allow-same-origin, allow-scripts, allow-popups, allow-modals 등의 정책으로 특정 작업을 허용할 수 있습니다 |
| report-uri | /some-report-uri |
1.3 적용 예시
default-src 'self'; 동일 출처의 리소스만 허용
script-src 'self'; 동일 출처의 JavaScript만 허용
script-src 'self' www.google-analytics.com ajax.googleapis.com; 동일 출처 및 두 주소의 JavaScript 로딩 허용
default-src 'none'; script-src 'self'; connect-src 'self'; img-src 'self'; style-src 'self'; 여러 리소스 시, 뒤에 있는 설정이 앞의 설정을 덮어씀
nginx 설정 파일에 다음과 같이 추가:
add_header Content-Security-Policy "default-src 'self'"; 동일 출처의 리소스만 허용
add_header Content-Security-Policy "upgrade-insecure-requests;content *"; 사이트 내 HTTP 링크를 자동으로 HTTPS로 변경하며 콘텐츠 출처 제한 없음
2. X-Content-Type-Options 헤더 누락 또는 불안전 설정
2.1 역할
IE9, Chrome 및 Safari에서 MIME 혼동 공격을 방지합니다. 현재 Firefox는 이 기능에 대해 논란이 있습니다. 브라우저는 일반적으로 응답의 content-type 값을 보는 대신 콘텐츠 자체를 스니핑하여 유형을 결정합니다.<br></br>
예를 들어, 이미지 파일을 정교하게 제작하여 HTML 및 JavaScript 코드를 포함시키고, 이를 브라우저가 표시하고 실행할 수 있도록 하는 경우입니다. 리소스 유형 추측이 비활성화되지 않으면 브라우저는 이미지를 표시하는 대신 포함된 JavaScript 코드를 직접 실행합니다.
X-Content-Type-Options 설정: content-type과 기대하는 유형이 일치하는 경우 스니핑이 필요 없으며, 유형이 명확하게 결정된 리소스만 외부에서 로드할 수 있습니다
2.2 Nginx 설정
# 이 응답 헤더 값은 nosniff만 가능합니다
add_header X-Content-Type-Options nosniff;
3. X-XSS-Protection 헤더 누락 또는 불안전 설정
3.1 역할
XSS(크로스 사이트 스크립팅) 방지 및 필터링에 사용됩니다. 현재 대부분의 브라우저는 XSS 보호를 기본적으로 활성화하고 있습니다
3.2 설정 옵션
0: XSS 보호 비활성화;
1: XSS 보호 활성화;
1; mode=block: XSS 보호 활성화 및 XSS 공격 감지 시 페이지 렌더링 중지 (예: IE8에서 공격 감지 시 전체 페이지가 #로 대체됨);
3.3 Nginx 설정
add_header X-XSS-Protection "1; mode=block";
4. Strict-Transport-Security 헤더 누락 또는 불안전 설정
4.1 역할
Strict Transport Security(STS)는 브라우저와 서버 간의 안전한 통신을 구성하는 데 사용됩니다. 주로 중간자 공격을 방지하기 위해 모든 통신을 TLS를 통해 강제합니다. 현재 IE는 STS 헤더를 지원하지 않습니다.
일반 HTTP 요청에서 STS를 설정하는 것은 효과가 없습니다. 공격자가 이러한 값을 쉽게 변경할 수 있기 때문입니다. 이러한 현상을 방지하기 위해 많은 브라우저에는 STS가 구성된 사이트 목록이 내장되어 있습니다.
4.2 설정 옵션
max-age는 필수 매개변수로, 초 단위의 값이며 STS 헤더의 만료 시간을 나타냅니다. 보통 1년(31536000초)으로 설정합니다.
includeSubDomains는 선택적 매개변수로, 이를 포함할 경우 현재 도메인과 하위 도메인 모두에 STS 보호가 적용됩니다.
preload는 선택적 매개변수로, 브라우저에 내장된 HTTPS 사용 도메인 목록입니다.
4.3 Nginx 설정
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
5. SHA-1 암호 제품군 감지
5.1 Nginx 설정
ssl_ciphers ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE:!SHA-1;
ssl_prefer_server_ciphers on;
5.2 Ingress 설정
# 주석 추가
nginx.ingress.kubernetes.io/ssl-ciphers
"ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES26-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE:!SHA-1"
참고 자료:
- https://help.aliyun.com/document_detail/198572.html
- https://www.oschina.net/translate/strong_ssl_security_on_nginx?print
- https://github.com/y1ng1996/owasp-testing-guide-v4-gitbook/blob/master/zh/web_application_security_testing/testing_for_weak_ssltls_ciphers,_insufficient_transport_layer_protection_otg-crypst-001.md
- https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#ssl-ciphers
6. 오래된 TLS 버전 지원
6.1 Alibaba Cloud SLB 설정
443 포트 TLS 정책 수정
6.2 Nginx 설정
ssl_protocols TLSv1.2 TLSv1.3;
7. 크로스 프레임 스크립팅 방어 누락 또는 불안전 설정
7.1 역할
X-Frame-Options 응답 헤더는 브라우저가 frame, iframe, object 등 속성을 로드할 수 있는지 여부를 결정하는 데 사용됩니다. 이 기능을 사용하여 클릭재킹(clickjacking)을 방지할 수 있습니다
7.2 설정 옵션
X-Frame-Options: DENY
X-Frame-Options: SAMEORIGIN
X-Frame-Options: ALLOW-FROM https://example.com/
X-Frame-Options: ALLOWALL
DENY로 설정하면 사이트의 어떤 페이지도 다른 페이지에 삽입되지 않습니다.
SAMEORIGIN으로 설정하면 동일 출처의 frame/iframe/object만 로드할 수 있습니다.
ALLOW-FROM으로 설정하면 지정된 출처만 로드할 수 있습니다.
ALLOWALL은 모든 출처 도메인을 허용합니다
7.3 Nginx 설정
add_header X-Frame-Options SAMEORIGIN always;