L4 환경에서의 ACL 설정 — HTTP/HTTPS 프로토콜 사용 시

NAVER CLOUD PLATFORM
NAVER CLOUD PLATFORM
8 min readAug 27, 2019

안녕하세요, 네이버 클라우드 플랫폼입니다.

오늘은 로드밸런서에 바인딩 된 웹서버에서 Client IP를 추출하고, 특정 Client IP의 웹페이지 접속을 차단하는 설정에 대해서 간단하게 소개해드리고자 합니다.

네이버클라우드플랫폼의 로드밸런서는 서버의 성능과 부하량을 고려해 네트워크 트래픽을 다수의 서버로 분산시켜주는 역할을 수행하며, HAProxy 방식으로 제공되고 있습니다.

또한, 네이버클라우드플랫폼의 로드밸런서는 고가용성 유지를 위해 콘솔상에서 1개의 로드밸런서를 생성하더라도 뒷 단에는 2개의 로드밸런서가 운영되고 있으며 이에 따라 접속 정보는 도메인 형태로 제공이 됩니다. (참고로 해당 IP는 변동될 수 있습니다. )

실제로 nslookup으로 네이버클라우드플랫폼의 로드밸런서 도메인 주소를 확인해보면 아래와 같이 2개의 IP가 찍히게 됩니다.

네이버클라우드플랫폼의 로드밸런서는 프록시 방식으로 동작하기 때문에 바인딩 되어 있는 웹 서버에서의 엑세스 로그를 확인해보면, Client의 실제 IP가 아닌 로드밸런서의 IP가 찍히게 됩니다. 네이버클라우드플랫폼에 로드밸런서를 생성하고, 해당 로드밸런서에 웹서버를 바인딩 한 후에, 바인딩 된 서버의 엑세스 로그를 확인해 보도록 하겠습니다.

root@ncp:/var/log/apache2# tail access.log
49.236.XXX.XX — — [31/May/2019:21:47:18 +0900] “HEAD / HTTP/1.1” 200 255 “-” “-”
49.236.XXX.XX — — [31/May/2019:21:47:18 +0900] “HEAD / HTTP/1.1” 200 255 “-” “-”

보시다시피 웹서버의 엑세스 로그에서 로드밸런서의 IP가 찍히는 것을 확인해보실 수 있습니다. 만약 로드밸런서의 IP가 아닌 Client IP가 찍히도록 하기 위해서는 따로 설정이 필요하며, 아래 표와 같이 HTTP, HTTPS의 경우 X-Forwarded-For를 통해 최종 Client IP가 찍히도록 설정이 필요하며 TCP, SSL 프로토콜에 대해서는 로드밸런서 생성 시 Proxy Protocol을 사용하겠다고 선택을 해주셔야 합니다.

오늘은 X-Forwarded-For를 사용하여 Client IP를 확인하는 방법을 사용할 것이며 Proxy Protocol을 통한 Client IP를 확인하는 부분에 대해서는 X-Forwared-For 방식을 먼저 설명드린 후, 진행하도록 하겠습니다.

X-Forwarded-For 설정은 어떻게 진행할까요?

※ 본 실습 환경 : 서버 1대(Ubuntu 16, Apache 2.4 설치) / 로드밸런서 1개 생성 후 생성한 서버 바인딩

Step1

일단 Client IP를 추출하기 위해서 웹서버에 mod_remoteio=Ip가 활성화되어 있는지 확인합니다.

root@ncp:~# a2enmod remoteip

Step2

다음은 /etc/apache2/apache2.conf 파일에 2가지 수정사항을 반영해야 합니다.

1) Apache2.conf 파일에 RemoteIPHeader X-Forwarded-For를 추가

RemoteIPHeader X-Forwarded-For

2) LogFormat 변경

[변경전] LogFormat “%h %l %u %t \”%r\” %>s %O \”%{Referer}i\” \”%{User-Agent}i\”” combined
[변경후] LogFormat “%a %l %u %t \”%r\” %>s %O \”%{Referer}i\” \”%{User-Agent}i\”” combined

변경 후에 바뀐 부분은 %h가 %a로 바뀌었다는 것입니다. %h는 원격지 호스트를 의미하며 %a는 요청한 클라이언트의 IP 주소 의미합니다. 위와 같이 로그 포맷을 변경한 후 apache2.conf 파일을 저장한 후, 마지막으로 아파치를 재시작해보시길 바랍니다. 이제는 웹 서버 엑세스 로그를 확인하여 실제 Client IP가 기록되는지 확인해보도록 하겠습니다.

root@ncp:/var/log/apache2# tail -10 access.log
211.249.XX.XXX — — [11/Jun/2019:11:26:57 +0900] “GET / HTTP/1.1” 200 3488 “-” ..
211.249.XX.XXX — — [11/Jun/2019:11:26:57 +0900] “GET / HTTP/1.1” 200 3488 “-” ….

실제로 access log 파일을 확인해보니 로드밸런서의 IP가 아니라 제 PC의 IP가 찍히는 걸 확인할 수 있었습니다.

※출처 : https://www.digitalocean.com/community/questions/get-client-public-ip-on-apache-server-used-behind-load-balancer

지금까지 네이버클라우드플랫폼의 로드밸런서에 바인딩 된 웹서버에서 Client IP를 확인하는 방법에 대해서 살펴보았습니다.

추출한 Client IP를 바탕으로 특정 IP를 차단하는 방법

가장 쉬운 방법은 아파치 기본 설정 파일인 apache2.conf 파일에서 /var/www/ 하위 모든 디렉토리의 접근 권한을 수정하는 것입니다. 이번 포스팅에서는 apache 2.4버전으로 설명드리도록 하겠습니다. (참고로 apache 2.2는 설정 방법이 약간 다릅니다)

apache2.conf 파일을 여시면, 디렉토리별로 접근 권한을 설정할 수 있는 부분이 있습니다. 저희는 특정 IP가 저희 웹사이트가 접근하지 못하도록 설정해보겠습니다. Apache.conf 파일 내 /var/www/의 기본 디렉토리의 기본 설정은 아래와 같습니다.

[기본 설정]

<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>

현재 /var/www/ 디렉토리에서 Require 지시어 부분이 접근 권한에 대한 설정이며, 기본적으로 ‘Requrie all granted’로 모두 접근이 허용 가능하도록 설정되어 있습니다.

· Require all granted : 모두 허용
· Require all denied : 모두 접근 금지
· Require ip (접근 허용할 IP) : 특정 IP만 접근 허용
· Require not ip (접근을 금지할 IP) : 특정 IP 접근 금지

현재의 설정에서, 특정 IP는 접근을 차단하도록 수정해보도록 하겠습니다.

[특정 IP 차단]

<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
<RequireAll>
Require all granted
Require not ip 211.XXX.XXX.XXX
</RequireAll>
</Directory>

보시다시피, 기본적으로는 모두 접근을 허용하되, 접근을 차단할 IP는 Require not ip로 지정한 것을 보실 수 있습니다. 위와 같이 접근을 막을 IP를 지정하시고 해당 IP로 웹페이지 접근을 시도했을 때 아래와 같이 접근이 안 되는 것을 확인하실 수 있습니다.

※ 참고 : https://httpd.apache.org/docs/2.4/en/mod/mod_authz_core.html#require

글을 마무리하며…

지금까지 간단하게 X-Forwared-For를 활용하여 L4 환경에서 Client IP를 추출하고, 아파치 기본 설정을 통해 특정 IP는 웹페이지에 접근하지 못하도록 설정하는 방법에 대해서 살펴보았습니다. 다음으로는 Proxy Portocol 사용하여 Client IP를 추출하고 특정 IP를 차단하는 방법에 대해서 소개해드리도록 하겠습니다.

서비스 사용 및 구축 중에 이슈가 발생하신 경우, 네이버 클라우드 플랫폼 고객센터로 문의하시면 빠른 지원 받으실 수 있습니다. 앞으로도 네이버 클라우드 플랫폼에 많은 관심 부탁드립니다!

--

--

NAVER CLOUD PLATFORM
NAVER CLOUD PLATFORM

We provide cloud-based information technology services for industry leaders from startups to enterprises.