Apache 2.4 - GeoIP를 이용한 국가별 차단 정책 적용

Share

Last Updated on 8월 17, 2021 by Jade(정현호)


안녕하세요 
이번 포스팅에서는 GeoIP 설치 및 mod_maxminddb 설치 및 Apache 설정에 대해서 확인 해보도록 하겠습니다.


GeoIP 란

GeoIP 란 MaxMind 에서 제공하는 모듈과 IP정보 DB 를 통해서 웹에 접근하는 IP의 국가별로 확인할 수 있는 오픈 소스 솔루션 입니다.

GeoIP 라이브러리로 이를 이용하여 서버에 접근 하는 IP를 국가별로 제한,허용 할 수 있습니다.


2019년 12월 30일 부로 Database 에 대한 정책이 새롭게 변경됨에 따라 MaxMind DB Format 인 mmdb를 사용하는 GeoIP2 를 설치하는 방식으로 변경 되었으며 그에 대한 내용으로 내용을 다루도록 하겠습니다.



회원가입

아래 링크에 접속 하여 회원가입을 진행합니다.
https://www.maxmind.com/en/geolite2/signup [Link]



정보를 입력 하고 회원가입을 합니다.






가입후 도착한 Email 에서 이미지와 같이 here 를 클릭하여 패스워드를 생성 합니다.





생성 완료 한 뒤 위와 같이 로그인 창으로 이동 되며 로그인을 합니다.





로그인 후 좌측에 있는 “My License Key” 를 클릭 합니다.





Generate new license key 를 클릭 합니다.





License key description 에 간략히 내용을 기재 하고 , 3.1.1 or newer 를 선택 후 confirm 을 클릭 합니다.





new license key 가 발급되었다면 Account/User ID 와 License key를 별도로 기재(저장) 해놔야 합니다 그리고 Download Config 를 클릭하여 파일을 다운 받아 놓습니다.





다시 왼쪽 아래 메뉴에서 Download Files 를 클릭 합니다.





아래 이미지와 같이 3개의 gzip를 다운로드 받습니다.





다운로드 받았다면 서버로 업로드 후 /usr/share/GeoIP/ 위치에 압축을 해제 합니다

# ls -alrt /usr/share/GeoIP | grep mmdb


-rw-r--r--.   1 root root  3896583 Jul 22 02:22 GeoLite2-Country.mmdb
-rw-r--r--.   1 root root 63513173 Jul 22 02:26 GeoLite2-City.mmdb
-rw-r--r--.   1 root root  6813673 Aug  6 03:28 GeoLite2-ASN.mmdb


GeoIP 설치

python-ipaddr 와 maxmind 설치 합니다

# python-ipaddr
yum install -y python-ipaddr 


# libmaxminddb 설치 
https://github.com/maxmind/libmaxminddb 
https://github.com/maxmind/libmaxminddb/releases 

wget https://github.com/maxmind/libmaxminddb/releases/download/1.4.2/libmaxminddb-1.4.2.tar.gz 

tar zxvf libmaxminddb-1.4.2.tar.gz 

cd libmaxminddb-1.4.2 

./configure 
make ; make install 
echo /usr/local/lib  >> /etc/ld.so.conf 
ldconfig



mod_maxminddb 설치

mod_maxminddb 를 설치 합니다.

https://github.com/maxmind/mod_maxminddb/releases 

wget https://github.com/maxmind/mod_maxminddb/releases/download/1.2.0/mod_maxminddb-1.2.0.tar.gz 

tar zxvf mod_maxminddb-1.2.0.tar.gz 

cd mod_maxminddb-1.2.0 

./configure --prefix=/usr/local/mod_maxminddb-1.2.0 --with-apxs=/usr/local/apache2.4/bin/apxs 

make ; make install



모듈 파일이 설치가 정상적으로 되었으며 apache의 module 디렉토리에 존재 하는지를 확인 합니다

ls -al /usr/local/apache2.4/modules/mod_maxminddb.so 
-rwxr-xr-x. 1 root root 56440 Jul 26 15:23 /usr/local/apache2.4/modules/mod_maxminddb.so 


grep mod_max  /usr/local/apache2.4/conf/httpd.conf 
LoadModule maxminddb_module   modules/mod_maxminddb.so



Apache 에 GeoIP 설정

다음과 같이 Apache의 httpd.conf 파일에 아래 내용을 추가 합니다.

~]# vi /usr/local/apache2.4/conf/httpd.conf

<IfModule maxminddb_module> 
MaxMindDBEnable On 
MaxMindDBSetNotes On 
MaxMindDBFile COUNTRY_DB /usr/share/GeoIP/GeoLite2-Country.mmdb 
MaxMindDBFile CITY_DB /usr/share/GeoIP/GeoLite2-City.mmdb 
MaxMindDBFile ASN_DB /usr/share/GeoIP/GeoLite2-ASN.mmdb 
MaxMindDBEnv COUNTRY_CODE COUNTRY_DB/country/iso_code 
MaxMindDBEnv REGION_CODE  CITY_DB/subdivisions/0/iso_code 
MaxMindDBEnv MM_COUNTRY_CODE CITY_DB/country/iso_code 
MaxMindDBEnv MM_COUNTRY_NAME CITY_DB/country/names/en 
MaxMindDBEnv MM_CITY_NAME CITY_DB/city/names/en 
MaxMindDBEnv MM_LONGITUDE CITY_DB/location/longitude 
MaxMindDBEnv MM_LATITUDE CITY_DB/location/latitude 
MaxMindDBEnv MM_ASN ASN_DB/autonomous_system_number 
MaxMindDBEnv MM_ASORG ASN_DB/autonomous_system_organization 
MaxMindDBNetworkEnv COUNTRY_DB COUNTRY_NETWORK 
MaxMindDBNetworkEnv CITY_DB CITY_NETWORK 
MaxMindDBNetworkEnv ASN_DB ASN_DB_NETWORK 
</IfModule> 


# 한줄로 입력 
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{MM_COUNTRY_CODE}e" geoip 


# access_log 도 수정
CustomLog logs/access_log geoip 



# 여기 까지 진행 후 Apache 를 재 기동 하게 되면 로그 상에 아래와 같이 로그의 맨 끝에 국가 코드가 같이 기록 되는걸 확인 할 수 있습니다

123.123.123.123 - - [11/Aug/2020:00:21:57 +0900] "HEAD / HTTP/1.1" 200 - "http://www.abc.co.kr" "Mozilla/5.0+(compatible; AABOT/2.0; http://www.AAA.com/)" US


자동 업데이트 설정

GeoIP DB의 자동 업데이트를 설정 하도록 하겠습니다.


geoipupdate 설치

geoupupdate 다운로드 및 설치를 진행 하도록 하겠습니다.

~]# wget https://github.com/maxmind/geoipupdate/releases/download/v4.3.0/geoipupdate_4.3.0_linux_amd64.tar.gz 
~]# tar zxvf geoipupdate_4.3.0_linux_amd64.tar.gz 
~]# mv geoipupdate_4.3.0_linux_amd64/ /usr/local 

~]# cd /usr/local/geoipupdate_4.3.0_linux_amd64 
~]# ln -s /usr/local/geoipupdate_4.3.0_linux_amd64/GeoIP.conf /usr/local/etc/GeoIP.conf



GeoIP.conf 파일 수정

~]# vi /usr/local/etc/GeoIP.conf


# are available from https://www.maxmind.com/en/my_license_key.
AccountID 입력
LicenseKey 입력
# Enter the edition IDs of the databases you would like to update.
# Multiple edition IDs are separated by spaces.
EditionIDs GeoLite2-Country GeoLite2-City
# The remaining settings are OPTIONAL.
# The directory to store the database files. Defaults to /usr/local/share/GeoIP

DatabaseDirectory 경로수정 -> /usr/share/GeoIP


업데이트 실행 및 crontab 등록

업데이트 유틸리티 수행 방법

~]# cd /usr/local/geoipupdate_4.3.0_linux_amd64
~]# ./geoipupdate -v


crontab 등록

~]# crontab –e 

### 매달 15일 오전 6시 00분에 수행되도록 등록 
### GeoIP Update
00 06 15 * * /usr/local/geoipupdate_4.3.0_linux_amd64/geoipupdate -v


Apache 국가별 차단

Apache의 httpd.conf 파일을 수정 하며 virtualhost 를 사용하는 기준으로 작성되어 있습니다.


[root]# vi httpd.conf

<VirtualHost 123.123.123.123:80>
    ServerAdmin admin@abc.co.kr
    DocumentRoot "/source/abc"
    ServerName abc.co.kr
    ServerAlias abc.co.kr www.abc.co.kr
    ErrorLog "logs/abc.co.kr-error_log"
    CustomLog "logs/abc.co.kr-access_log" geoip
# 위에서 설정한 geoip 명칭


<Directory "/source/abc">
        AllowOverride ALL
        Options FollowSymLinks MultiViews
        DirectoryIndex index.jsp index.php index.html index.htm
## Blocking by Country CN
SetEnvIf MM_COUNTRY_CODE ^(CN) BlockCountry
## <== 위의 부분이 중국 국가 차단 설정 부분
## 예를 들어 CN, EU 국가만 차단 하고자 할때는 아래처럼 기술하면 됩니다.

##  SetEnvIf MM_COUNTRY_CODE ^(CN|EU) BlockCountry
##  SetEnvIf 는 <Directory> 나 <Location> 절 안에서 사용할 수 있습니다.

<RequireAll>
     Require all granted
Require not env BlockCountry
     Require not env bad_bot
     Require not env ipdeny
</RequireAll>
## 
Require not env 는 <RequireAll> 절 안에서 선언 해야 합니다.
</Directory>

</VirtualHost>



위와 같이 설정후 apache 재기동이나 graceful 재기동 을 하게 되면 적용이 되게 됩니다.

테스트시 SetEnvIf MM_COUNTRY_CODE ^(KR) BlockCountry  로 KR 넣고 접속 차단이 잘되는지 테스트 해보시면 됩니다.



4
0
글에 대한 당신의 생각을 기다립니다. 댓글 의견 주세요!x