Apache: (mod_security2) HTML Header 에서 Server: 부분 감춤
Apache: (mod_security2) HTML Header 에서 Server: 부분 감춤
======================
"Security by Obscurity(은닉을 통한 보안)"의 일환이라고 합니다.
* 왜 지우는 것이 좋은가요?
웹 서버가 자신의 정체(Server: Apache)와 버전(Apache/2.4.52)을 공개하는 것은 해커에게 "공격의 지도"를 제공하는 것과 같습니다.
취약점 표적 공격 방지: 특정 아파치 버전에서 발견된 보안 취약점(CVE)이 있을 경우, 해커는 Server 헤더를 통해 해당 버전을 사용하는 서버만 골라 공격할 수 있습니다.
정보 노출 최소화: 서버가 어떤 OS(Ubuntu, CentOS 등)를 쓰는지, PHP 버전은 무엇인지 노출되는 범위를 줄여 공격의 난이도를 높입니다.
----------
# 서버 정보를 최소화 (Server: Apache 로만 표시)
ServerTokens Prod
# 서버 하단에 표시되는 버전 정보 및 OS 정보 제거
ServerSignature Off
Header 에서
Server: Apache 로 표기됨.
PHP 헤더 체크 :
X-Powered-By: PHP/8.x 헤더도 함께 노출되고 있다면, php.ini 파일에서 아래 설정을 변경하는 것이 좋습니다.
php.ini or conf.d/별도 설정파일.ini
[PHP]
expose_php = Off
----------
완전히 보이지 않게 하기 위해서 :
아파치 기본 기능만으로는 Server 헤더 자체를 완전히 삭제하기 어렵습니다. 보통 mod_security 같은 추가 모듈을 사용하거나, 앞단에 Nginx 또는 Cloudflare 같은 프록시를 두어 헤더를 덮어씌웁니다.
* mod_security2
아파치 로드된 모듈 목록 확인
sudo apache2ctl -M | grep security2
mod_security2 핵심 장점
① 실시간 가상 패치 (Virtual Patching)
사용 중인 솔루션(예: WordPress, 구형 PHP 보드 등)에 보안 취약점이 발견되었을 때, 소스 코드를 직접 수정하기 전에 mod_security2 규칙만 추가함으로써 공격을 즉시 방어할 수 있습니다.
② 강력한 규칙 세트 (OWASP CRS)
**OWASP Core Rule Set (CRS)**이라는 전 세계적인 표준 규칙 세트를 그대로 적용할 수 있습니다. 이를 통해 직접 규칙을 짜지 않아도 대부분의 알려진 웹 공격을 90% 이상 방어할 수 있습니다.
③ 서버 리소스 효율성
비정상적인 요청을 PHP 엔진이 실행되기 전인 아파치 단계에서 미리 쳐내기 때문에, 불필요한 PHP 프로세스 생성을 막아 서버 부하를 줄여줍니다.
④ 상세한 로깅 (Full Audit Logging)
어떤 IP에서 어떤 의도로 공격을 시도했는지 매우 상세한 로그를 남깁니다. 이는 나중에 보안 사고 발생 시 침입 경로를 추적하는 결정적인 증거가 됩니다.
----------
* mod_security2 설치
# 1. 패키지 설치
sudo apt update
sudo apt install libapache2-mod-security2
# 2. 모듈 활성화
sudo a2enmod security2
sudo apache2ctl -M | grep security2
만일 존재한다면 아파치 설정 파일에서 다음과 같이 작성해 둡니다.
기존에 설정에 삽입된 부분 있는지 확인
cd /etc/apache2
grep -in "ServerTokens" *.conf
// 하위 폴더 전체 찾기
grep -rin "ServerTokens" /etc/apache2/
편집
sudo vi /etc/apache2/apache2.conf
apache2.conf
# Print only Server Program (Apache) in Head, Server: Apache
# mod_security 가 없을 경우 대비해서 기본 값
ServerTokens Prod
ServerSignature Off
TraceEnable Off
<IfModule security2_module>
# mod_security가 헤더를 조작할 수 있도록 토큰을 Full로 상향 조정
# (주의: ServerTokens는 전역 설정이 우선하므로,
# 일부 환경에서는 전역의 Prod를 Full로 바꿔야 이 모듈 설정이 먹힐 수 있습니다.)
ServerTokens Full
SecRuleEngine On
SecServerSignature "nginx"
</IfModule>
sudo service apache2 restart
=============
* mod_security2 기능
mod_security2는 단순히 헤더를 숨기는 것을 넘어, 매우 강력한 WAF(웹 방화벽) 기능을 제공합니다. 이미지 API를 운영하시는 사용자님의 환경에서 추가로 설정하면 좋은 핵심 기능 4가지를 추천해 드립니다.
주요 보안 기능
- 공격 패턴 자동 차단 (OWASP CRS 설치)
- 특정 국가 차단 (GeoIP 설정)
- 이미지 무단 도용 방지 (Referer 체크)
1. SQL Injection 및 XSS 방어 (가장 중요)
사용자님이 구현하신 ?aaa=code 파라미터에 악성 SQL 쿼리를 주입하거나 스크립트를 넣는 공격을 차단합니다. 직접 규칙을 짜기보다 **OWASP CRS(Core Rule Set)**라는 표준 규칙을 활성화하는 것이 정석입니다.
설정 방법: 보통 /etc/modsecurity/modsecurity.conf 파일이나 security2.conf에서 CRS 파일을 Include 하도록 설정합니다.
2. 특정 국가 IP 차단 (GeoIP)
만약 이미지를 국내에서만 서비스할 계획이라면, 공격의 온상이 되는 특정 국가(예: 해외 특정 IP 대역)의 접근을 서버 단에서 미리 쳐낼 수 있습니다.
# 특정 국가(예: CN, RU 등)의 접근을 차단하는 예시
SecGeoLookupDb /usr/share/GeoIP/GeoIP.dat
SecRule REMOTE_ADDR "@geoLookup" "id:20,chain,drop,msg:'Block Outside Access'"
SecRule GEO:COUNTRY_CODE "!@pm KR"
3. 무단 이미지 도용 방지 (Anti-Hotlinking)
내 서버의 이미지를 다른 사이트에서 태그로 무단 연결하여 내 트래픽을 소모하는 것을 막습니다. Referer 헤더를 체크하여 허용된 도메인만 이미지를 볼 수 있게 합니다.
# 내 도메인이 아닌 곳에서 이미지를 요청하면 차단
SecRule REQUEST_HEADERS:Referer "!@contains cameraclub.kr" "id:30,phase:2,drop,log,msg:'Unauthorized Hotlinking Attempt'"
4. 무차별 대입 공격 및 스캔 방어 (Rate Limiting)
단시간에 너무 많은 요청을 보내는 IP를 자동으로 일정 시간 동안 차단(DDoS 및 브루트 포스 방어)합니다.
# 동일 IP에서 1초에 20번 이상 요청 시 5분간 차단
SecAction "id:40,phase:1,nolog,pass,initcol:IP=%{REMOTE_ADDR},setvar:IP.request_count=0"
SecRule IP:request_count "@gt 20" "id:41,phase:1,drop,setvar:IP.blocked=1,expirevar:IP.blocked=300"
SecAction "id:42,phase:1,nolog,pass,setvar:IP.request_count=+1,expirevar:IP.request_count=1"
5. 실전 적용 시 주의사항: DetectionOnly 모드
새로운 규칙을 추가할 때는 반드시 처음부터 SecRuleEngine On으로 하지 마시고, 아래와 같이 설정하여 로그를 먼저 확인하세요.
1. SecRuleEngine DetectionOnly로 설정 (로그만 남고 차단은 안 됨)
2. /var/log/apache2/modsec_audit.log 파일을 며칠간 모니터링
3. 정상적인 사용자 요청이 차단되는 현상(오탐)이 없는지 확인
4. 문제가 없다면 SecRuleEngine On으로 변경
======================
"Security by Obscurity(은닉을 통한 보안)"의 일환이라고 합니다.
* 왜 지우는 것이 좋은가요?
웹 서버가 자신의 정체(Server: Apache)와 버전(Apache/2.4.52)을 공개하는 것은 해커에게 "공격의 지도"를 제공하는 것과 같습니다.
취약점 표적 공격 방지: 특정 아파치 버전에서 발견된 보안 취약점(CVE)이 있을 경우, 해커는 Server 헤더를 통해 해당 버전을 사용하는 서버만 골라 공격할 수 있습니다.
정보 노출 최소화: 서버가 어떤 OS(Ubuntu, CentOS 등)를 쓰는지, PHP 버전은 무엇인지 노출되는 범위를 줄여 공격의 난이도를 높입니다.
----------
# 서버 정보를 최소화 (Server: Apache 로만 표시)
ServerTokens Prod
# 서버 하단에 표시되는 버전 정보 및 OS 정보 제거
ServerSignature Off
Header 에서
Server: Apache 로 표기됨.
PHP 헤더 체크 :
X-Powered-By: PHP/8.x 헤더도 함께 노출되고 있다면, php.ini 파일에서 아래 설정을 변경하는 것이 좋습니다.
php.ini or conf.d/별도 설정파일.ini
[PHP]
expose_php = Off
----------
완전히 보이지 않게 하기 위해서 :
아파치 기본 기능만으로는 Server 헤더 자체를 완전히 삭제하기 어렵습니다. 보통 mod_security 같은 추가 모듈을 사용하거나, 앞단에 Nginx 또는 Cloudflare 같은 프록시를 두어 헤더를 덮어씌웁니다.
* mod_security2
아파치 로드된 모듈 목록 확인
sudo apache2ctl -M | grep security2
mod_security2 핵심 장점
① 실시간 가상 패치 (Virtual Patching)
사용 중인 솔루션(예: WordPress, 구형 PHP 보드 등)에 보안 취약점이 발견되었을 때, 소스 코드를 직접 수정하기 전에 mod_security2 규칙만 추가함으로써 공격을 즉시 방어할 수 있습니다.
② 강력한 규칙 세트 (OWASP CRS)
**OWASP Core Rule Set (CRS)**이라는 전 세계적인 표준 규칙 세트를 그대로 적용할 수 있습니다. 이를 통해 직접 규칙을 짜지 않아도 대부분의 알려진 웹 공격을 90% 이상 방어할 수 있습니다.
③ 서버 리소스 효율성
비정상적인 요청을 PHP 엔진이 실행되기 전인 아파치 단계에서 미리 쳐내기 때문에, 불필요한 PHP 프로세스 생성을 막아 서버 부하를 줄여줍니다.
④ 상세한 로깅 (Full Audit Logging)
어떤 IP에서 어떤 의도로 공격을 시도했는지 매우 상세한 로그를 남깁니다. 이는 나중에 보안 사고 발생 시 침입 경로를 추적하는 결정적인 증거가 됩니다.
----------
* mod_security2 설치
# 1. 패키지 설치
sudo apt update
sudo apt install libapache2-mod-security2
# 2. 모듈 활성화
sudo a2enmod security2
sudo apache2ctl -M | grep security2
만일 존재한다면 아파치 설정 파일에서 다음과 같이 작성해 둡니다.
기존에 설정에 삽입된 부분 있는지 확인
cd /etc/apache2
grep -in "ServerTokens" *.conf
// 하위 폴더 전체 찾기
grep -rin "ServerTokens" /etc/apache2/
편집
sudo vi /etc/apache2/apache2.conf
apache2.conf
# Print only Server Program (Apache) in Head, Server: Apache
# mod_security 가 없을 경우 대비해서 기본 값
ServerTokens Prod
ServerSignature Off
TraceEnable Off
<IfModule security2_module>
# mod_security가 헤더를 조작할 수 있도록 토큰을 Full로 상향 조정
# (주의: ServerTokens는 전역 설정이 우선하므로,
# 일부 환경에서는 전역의 Prod를 Full로 바꿔야 이 모듈 설정이 먹힐 수 있습니다.)
ServerTokens Full
SecRuleEngine On
SecServerSignature "nginx"
</IfModule>
sudo service apache2 restart
=============
* mod_security2 기능
mod_security2는 단순히 헤더를 숨기는 것을 넘어, 매우 강력한 WAF(웹 방화벽) 기능을 제공합니다. 이미지 API를 운영하시는 사용자님의 환경에서 추가로 설정하면 좋은 핵심 기능 4가지를 추천해 드립니다.
주요 보안 기능
- 공격 패턴 자동 차단 (OWASP CRS 설치)
- 특정 국가 차단 (GeoIP 설정)
- 이미지 무단 도용 방지 (Referer 체크)
1. SQL Injection 및 XSS 방어 (가장 중요)
사용자님이 구현하신 ?aaa=code 파라미터에 악성 SQL 쿼리를 주입하거나 스크립트를 넣는 공격을 차단합니다. 직접 규칙을 짜기보다 **OWASP CRS(Core Rule Set)**라는 표준 규칙을 활성화하는 것이 정석입니다.
설정 방법: 보통 /etc/modsecurity/modsecurity.conf 파일이나 security2.conf에서 CRS 파일을 Include 하도록 설정합니다.
2. 특정 국가 IP 차단 (GeoIP)
만약 이미지를 국내에서만 서비스할 계획이라면, 공격의 온상이 되는 특정 국가(예: 해외 특정 IP 대역)의 접근을 서버 단에서 미리 쳐낼 수 있습니다.
# 특정 국가(예: CN, RU 등)의 접근을 차단하는 예시
SecGeoLookupDb /usr/share/GeoIP/GeoIP.dat
SecRule REMOTE_ADDR "@geoLookup" "id:20,chain,drop,msg:'Block Outside Access'"
SecRule GEO:COUNTRY_CODE "!@pm KR"
3. 무단 이미지 도용 방지 (Anti-Hotlinking)
내 서버의 이미지를 다른 사이트에서 태그로 무단 연결하여 내 트래픽을 소모하는 것을 막습니다. Referer 헤더를 체크하여 허용된 도메인만 이미지를 볼 수 있게 합니다.
# 내 도메인이 아닌 곳에서 이미지를 요청하면 차단
SecRule REQUEST_HEADERS:Referer "!@contains cameraclub.kr" "id:30,phase:2,drop,log,msg:'Unauthorized Hotlinking Attempt'"
4. 무차별 대입 공격 및 스캔 방어 (Rate Limiting)
단시간에 너무 많은 요청을 보내는 IP를 자동으로 일정 시간 동안 차단(DDoS 및 브루트 포스 방어)합니다.
# 동일 IP에서 1초에 20번 이상 요청 시 5분간 차단
SecAction "id:40,phase:1,nolog,pass,initcol:IP=%{REMOTE_ADDR},setvar:IP.request_count=0"
SecRule IP:request_count "@gt 20" "id:41,phase:1,drop,setvar:IP.blocked=1,expirevar:IP.blocked=300"
SecAction "id:42,phase:1,nolog,pass,setvar:IP.request_count=+1,expirevar:IP.request_count=1"
5. 실전 적용 시 주의사항: DetectionOnly 모드
새로운 규칙을 추가할 때는 반드시 처음부터 SecRuleEngine On으로 하지 마시고, 아래와 같이 설정하여 로그를 먼저 확인하세요.
1. SecRuleEngine DetectionOnly로 설정 (로그만 남고 차단은 안 됨)
2. /var/log/apache2/modsec_audit.log 파일을 며칠간 모니터링
3. 정상적인 사용자 요청이 차단되는 현상(오탐)이 없는지 확인
4. 문제가 없다면 SecRuleEngine On으로 변경

하늘