server setting

agnusdei·2025년 9월 19일

CTF

목록 보기
130/185

1. Content-Security-Policy (CSP)

설정 방법

server {
    listen 443 ssl;
    
    # 기본 CSP 설정 (아주 엄격함)
    add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self' data:; connect-src 'self'; frame-ancestors 'self';" always;
    
    # 또는 더 유연한 설정
    add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://trusted.cdn.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self';" always;
}

설명

  • 목적: XSS(크로스사이트스크립팅) 공격 방지
  • 기능: 로드할 수 있는 리소스의 출처를 제한
  • 주요 지시문:
    • default-src 'self': 기본적으로 같은 도메인만 허용
    • script-src 'self': JavaScript 출처 제한
    • style-src 'self': CSS 출처 제한
    • img-src 'self' data:: 이미지 출처 제한 (data URI 허용)
    • frame-ancestors 'self': clickjacking 방지

2. Strict-Transport-Security (HSTS)

설정 방법

server {
    listen 443 ssl;
    
    # HSTS 설정 (프리로드 준비)
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
    
    # 또는 보수적인 설정
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
}

설명

  • 목적: HTTPS 강제 적용 및 SSL stripping 공격 방지
  • 기능: 브라우저가 항상 HTTPS로 연결하도록 강제
  • 주요 지시문:
    • max-age=63072000: 2년 동안 적용 (31536000 = 1년)
    • includeSubDomains: 모든 하위 도메인 포함
    • preload: 브라우저 프리로드 목록 등록

3. X-Content-Type-Options

설정 방법

server {
    listen 443 ssl;
    
    # X-Content-Type-Options 설정
    add_header X-Content-Type-Options "nosniff" always;
}

설명

  • 목적: MIME 타입 스니핑 방지
  • 기능: 브라우저가 Content-Type을 추측하지 못하도록 강제
  • 작동 방식:
    • text/css로 선언된 파일만 CSS로 처리
    • application/javascript로 선언된 파일만 JS로 처리
    • 공격자가 HTML 파일을 JS처럼 실행하는 것 방지

4. Referrer-Policy

설정 방법

server {
    listen 443 ssl;
    
    # 다양한 정책 중 선택
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;
    
    # 또는 더 엄격한 설정
    add_header Referrer-Policy "same-origin" always;
    
    # 또는 더 관대한 설정
    add_header Referrer-Policy "no-referrer-when-downgrade" always;
}

설명

  • 목적: Referrer 정보 유출 방지
  • 기능: 다른 사이트로 이동할 때 Referrer 헤더를 어떻게 보낼지 제어
  • 주요 정책:
    • no-referrer: Referrer 정보 전송 안 함
    • same-origin: 같은 도메인에만 Referrer 전송
    • strict-origin-when-cross-origin: 동일 도메인은 전체 URL, 다른 도메인은 도메인만 전송
    • no-referrer-when-downgrade: HTTPS→HTTP가 아니면 Referrer 전송

5. 완전한 nginx 설정 예시

server {
    listen 443 ssl;
    server_name example.com www.example.com;
    
    # SSL 설정
    ssl_certificate /etc/ssl/certs/example.com.crt;
    ssl_certificate_key /etc/ssl/private/example.com.key;
    
    # 보안 헤더 설정
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
    add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:;" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-XSS-Protection "1; mode=block" always;
    
    # 웹사이트 루트 설정
    root /var/www/example.com;
    index index.html index.htm;
    
    location / {
        try_files $uri $uri/ =404;
    }
}

# HTTP → HTTPS 리다이렉트
server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$server_name$request_uri;
}

6. 추가 보안 헤더

X-Frame-Options

add_header X-Frame-Options "SAMEORIGIN" always;
  • 기능: clickjacking 방지
  • 옵션: DENY(모든 프레임 금지), SAMEORIGIN(같은 도메인만 허용)

X-XSS-Protection

add_header X-XSS-Protection "1; mode=block" always;
  • 기능: 브라우저의 XSS 필터 활성화
  • 참고: 최신 브라우저는 CSP로 대체 중

7. 설정 검증 방법

# nginx 설정 검증
sudo nginx -t

# nginx 재시작
sudo systemctl restart nginx

# 헤더 확인
curl -I https://example.com/
# 상세 헤더 확인
curl -i https://example.com/

# 또는 브라우저 개발자 도구 → Network 탭에서 확인

8. 주의사항

  1. CSP는 점진적으로 도입

    • Content-Security-Policy-Report-Only로 먼저 테스트
    • 실제 적용 전에 리포트만 먼저 수집
  2. HSTS는 신중하게

    • 처음에는 max-age를 짧게 설정하고 점진적으로 증가
  3. 모든 하위 도메인 확인

    • includeSubDomains 사용 시 모든 서브도메인이 HTTPS 지원해야 함
  4. 테스트 필수

    • 모든 기능이 보안 헤더와 충돌하지 않는지 반드시 테스트
profile
DevSecOps, Pentest, Cloud(OpenStack), Develop, Data Engineering, AI-Agent

0개의 댓글