개요
웹 취약점 스캐너(Nikto, Nessus 등)나 공격자가 서버를 탐지할 때 가장 먼저 확인하는 것이 HTTP 응답 헤더의 서버 정보입니다. 노출된 버전 정보는 해당 버전에 존재하는 CVE 취약점을 직접 타겟팅하는 데 활용됩니다.
기본 설정된 Apache로 웹서비스를 운영하면 HTTP 응답 헤더와 에러 페이지에 웹서버 정보(버전, OS, PHP 버전)가 노출됩니다. 이 정보는 공격자에게 취약점 탐색 시 활용될 수 있으므로 ServerTokens와 ServerSignature 지시자로 불필요한 정보를 숨기는 것이 보안 운영의 기본입니다.
증상 — 기본 상태에서의 서버 정보 노출
curl로 HTTP 응답 헤더를 확인하면 Apache 버전, OS 정보, PHP 버전까지 노출되는 것을 확인할 수 있습니다.
<admin-user>@localhost:~$ curl --head <domain> HTTP/1.1 302 Found Date: Fri, 05 Mar 2021 02:21:54 GMT Server: Apache/2.4.x (CentOS) OpenSSL/1.0.x PHP/7.2.x // 웹서버/OS 버전 외에도 PHP 버전까지 노출되고 있습니다.
httpd.conf 설정
httpd.conf 또는 httpd-default.conf에 아래 두 지시자를 추가하고 Apache를 재시작합니다.
# httpd.conf 또는 httpd-default.conf에 추가 ServerTokens Prod ServerSignature Off # 아파치 재기동 # systemctl restart httpd
ServerTokens 옵션 상세
ServerTokens 지시자의 각 옵션별로 HTTP 응답 헤더에 포함되는 정보 범위가 다릅니다. 보안을 위해 가장 최소한의 정보만 노출하는 Prod 옵션 사용을 권장합니다.
| 키워드 | 제공 정보 | 예문 |
| Prod | 웹 서버 종류 | Apache |
| Min | 웹 서버 버전 | Apache/2.2.3 |
| OS | 웹 서버 버전 + 운영체제 | Apache/2.2.3 (CentOS) |
| Full | 웹 서버의 모든 정보 | Apache/2.2.3 (CentOS) DAV/2 PHP/5.16 |
추가 보안 설정 — 에러 페이지 커스터마이징
ServerSignature Off로도 Apache 기본 에러 페이지에서 버전 정보가 노출될 수 있습니다. 404, 403, 500 등 에러 발생 시 기본 Apache 에러 페이지에는 서버 서명이 포함되므로, 커스텀 에러 페이지를 사용하는 것이 보안에 유리합니다.
# httpd.conf에 커스텀 에러 페이지 지정 ErrorDocument 403 /error/403.html ErrorDocument 404 /error/404.html ErrorDocument 500 /error/500.html
또한 Apache의 Header 지시자(mod_headers)로 보안 관련 HTTP 응답 헤더를 추가하면 XSS, 클릭재킹 등의 공격에 대한 방어가 강화됩니다. X-Content-Type-Options: nosniff는 MIME 타입 스니핑을 차단하고, X-Frame-Options: SAMEORIGIN은 iframe을 이용한 클릭재킹을 방지합니다. Strict-Transport-Security(HSTS)는 HTTPS 강제 적용을 브라우저에 알립니다.
# mod_headers 활성화 후 적용 (httpd.conf 또는 .htaccess) Header always set X-Content-Type-Options "nosniff" Header always set X-Frame-Options "SAMEORIGIN" Header always set X-XSS-Protection "1; mode=block" # HTTPS 환경에서만 HSTS 적용 Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
이러한 보안 헤더 설정은 securityheaders.com 등의 도구로 점수를 측정하고 누락된 헤더를 파악하는 방법으로 체계적으로 관리할 수 있습니다.
결과 확인
Apache 재시작 후 동일하게 curl로 헤더를 확인하면 Server: Apache만 표시되어 버전 및 OS 정보가 제거된 것을 확인할 수 있습니다.
<admin-user>@localhost:~$ curl --head <domain> HTTP/1.1 302 Found Date: Fri, 05 Mar 2021 02:26:10 GMT Server: Apache // 웹서버 종류만 표시
참고
참고 문서: Apache ServerTokens 지시자 공식 문서 · Apache ServerSignature 지시자 공식 문서