로드밸런서(L4/L7) 환경에서 실제 클라이언트 IP를 식별하기 위해 IBM HTTP Server(IHS) 9.0의
mod_remoteip를 설정하는 방법을 다룹니다. 특히 보안 감사 로그의 무결성을 위해 IHS 9.0.5.13 (APAR PH47286) 패치가 왜 중요한지, 그리고 버전별 로그 포맷 설정 차이점을 중점적으로 정리합니다.
0. 배경: 왜 IP가 바뀔까?
클라이언트가 로드밸런서(Proxy)를 거쳐 웹 서버에 접속하면, 웹 서버 입장에서는 연결을 요청한 주체가 로드밸런서이므로 Source IP가 로드밸런서 IP(예: 10.0.0.1)로 기록됩니다.
이는 다음과 같은 보안 문제를 야기합니다.
- 접근 제어 실패: IP 기반의 ACL(Access Control List) 적용 불가
- 감사 추적 불가: 사고 발생 시 실제 공격자의 IP를 로그에서 찾을 수 없음
1. 버전별 패치 및 로그 포맷 주의사항 (Version History)
IHS 설정에 앞서, 사용 중인 IHS 버전에 따라 로그 포맷 변수를 다르게 써야 하므로 버전 확인이 필수적입니다.
📢 핵심 패치 정보: APAR PH47286
적용 버전: IBM HTTP Server 9.0.5.13 이상
내용: 이전 버전에서는 mod_remoteip가 정상 작동해도, 기본 로그 변수인 %h가 여전히 프록시 IP를 출력하는 문제가 있었습니다. 9.0.5.13부터는 %h가 mod_remoteip에 의해 변경된 실제 IP를 반영하도록 수정되었습니다.
버전별 권장 로그 포맷
| IHS 버전 | Access Log 권장 변수 | 설명 |
|---|---|---|
| 9.0.5.12 이하 | %a (Client IP) |
%h는 프록시 IP를 찍으므로 사용 금지. 반드시 %a 사용. |
| 9.0.5.13 이상 | %h 또는 %a |
패치 적용됨. %h를 써도 실제 IP가 기록됨 (기존 설정 유지 가능). |
2. IHS 설정 가이드 (httpd.conf)
Step 1: 모듈 활성화
# mod_remoteip 모듈 주석 해제
LoadModule remoteip_module modules/mod_remoteip.so
Step 2: 신뢰할 프록시 등록
보안을 위해 "누가 보내준 헤더를 믿을 것인가"를 명시해야 합니다. 아무 헤더나 믿으면 IP 스푸핑 공격에 당할 수 있습니다.
<IfModule mod_remoteip.c>
# 1. 실제 IP가 담긴 헤더명 지정 (표준: X-Forwarded-For)
RemoteIPHeader X-Forwarded-For
# 2. 신뢰할 로드밸런서(L4/L7) IP 등록
# 사설 IP 대역의 프록시인 경우 (10.x, 192.168.x 등)
RemoteIPInternalProxy 10.0.0.1 10.0.0.2
# 공인 IP 대역의 프록시인 경우
# RemoteIPTrustedProxy 203.0.113.5
</IfModule>
Step 3: 로그 포맷 변경 (Access Log)
버전에 관계없이 가장 안전한 방법은 %a 변수를 사용하는 것입니다.
# [기존] common 포맷 (9.0.5.12 이하에서 문제 발생 가능)
# LogFormat "%h %l %u %t \"%r\" %>s %b" common
# [변경] %h -> %a 로 변경 (권장)
LogFormat "%a %l %u %t \"%r\" %>s %b" common
3. 검증 및 디버깅 (Validation)
설정 적용 후 실제로 헤더가 잘 변환되는지 확인하기 위해 임시로 로그를 상세하게 찍어봅니다.
# 디버깅용 로그 포맷 정의 (작업 후 주석 처리 권장)
# %{c}a : Connection IP (L4 IP)
# %a : Client IP (변환된 실제 IP)
GlobalLog logs/remoteip_debug.log "L4-IP=%{c}a Real-IP=%a XFF-Header=%{X-Forwarded-For}i"
정상 결과 예시:
L4-IP=10.0.0.1 Real-IP=203.0.113.2 XFF-Header=203.0.113.2
L4-IP에는 로드밸런서 IP가 나와야 함Real-IP에는 실제 사용자 PC의 IP가 나와야 함 (성공)
4. WAS(WebSphere) 추가 설정 필요 여부
IHS에서 mod_remoteip가 정상 작동하면, WAS 플러그인(Plugin)으로 넘어갈 때 이미 Source IP가 복원된 상태로 넘어갑니다. 따라서 WAS 쪽에서는 별도의 추가 설정 없이 request.getRemoteAddr() 호출 시 실제 IP를 획득할 수 있습니다.
(단, Plugin 설정의 TrustedProxyEnable 속성은 상황에 따라 검토가 필요할 수 있습니다.)