MaxMind의 GeoIP 기술은 IP 주소를 기반으로 지리적 위치(국가, 도시, ISP 등)를 파악할 수 있도록 지원합니다. 이를 사용하는 주요 방법은 다음과 같이 세 가지로 나뉩니다. 데이터베이스 기반, 웹 서비스 API, 클라이언트 측 JavaScript입니다. 또한, 데이터베이스를 최신 상태로 유지하기 위한 업데이트 절차도 중요합니다.
1. 데이터베이스 기반 GeoIP 사용 방법 (GeoIP2 / GeoLite2)
MaxMind에서는 다운로드 가능한 GeoIP2 (유료)와 GeoLite2 (무료) 데이터베이스를 제공합니다. 이 데이터베이스를 로컬에 저장하고 직접 조회하는 방식입니다.
주요 데이터베이스 종류
GeoLite2-Country.mmdb
GeoLite2-City.mmdb
GeoLite2-ASN.mmdb
설치 및 사용 (Python 예시)
pip install geoip2
import geoip2.database
reader = geoip2.database.Reader('/path/to/GeoLite2-City.mmdb')
response = reader.city('8.8.8.8')
print("Country:", response.country.name)
print("City:", response.city.name)
print("Latitude:", response.location.latitude)
print("Longitude:", response.location.longitude)
reader.close()
- DB 파일은 주기적으로 업데이트해야 정확도를 유지함.
- 외부 접근 없이 내부 로컬에서 IP 조회 가능 (API 제한 우회, 보안성 높음).
- 서버에서 실시간 조회 시 속도 빠름, 개인정보 보호 측면에서 유리.
웹 서비스 기반 GeoIP 사용 (MaxMind API)
MaxMind는 RESTful API 형식으로 IP 위치 정보를 제공합니다. 유료 플랜 또는 제한된 무료 트라이얼로 사용 가능합니다.
기본 요청 예시 (GeoIP2 Precision Web Services)
curl -u YOUR_ACCOUNT_ID:YOUR_LICENSE_KEY \
"https://geoip.maxmind.com/geoip/v2.1/city/8.8.8.8"
응답 예시
{
"city": { "names": { "en": "Mountain View" } },
"country": { "iso_code": "US", "names": { "en": "United States" } },
"location": {
"latitude": 37.386,
"longitude": -122.0838
}
}
- HTTPS 기반 API 호출로 데이터 암호화.
- API Key/License Key 유출 방지 필수.
- 요청 횟수 제한 및 요금제 확인 필요.
- 서버 외부 통신 필요 → 내부망 서버에서는 제한될 수 있음.
3. 클라이언트 측 JavaScript 기반 사용
MaxMind에서는 JS 라이브러리를 통해 클라이언트 측에서 IP 정보를 가져올 수 있는 기능도 제공합니다.
사용 방법
<script src="https://js.maxmind.com/js/apis/geoip2/v2.1/geoip2.js"></script>
<script>
geoip2.city(
function(response) {
console.log("City:", response.city.names.en);
console.log("Country:", response.country.names.en);
},
function(error) {
console.log("Error:", error);
}
);
</script>
- 브라우저 측에서 실행되므로 개인정보 노출에 유의.
- 기업 서비스에서는 서버 측 확인 방식 권장.
- JS 라이브러리도 MaxMind의 라이선스 정책 적용됨.
4. 데이터베이스 업데이트 및 유지관리 방법
자동 업데이트 (CLI 도구 사용)
MaxMind는 geoipupdate
라는 CLI 도구를 제공하여 자동으로 데이터베이스를 갱신할 수 있습니다.
📦 설치
sudo apt install geoipupdate # Debian/Ubuntu
sudo yum install geoipupdate # CentOS/RHEL
⚙️ 설정파일: /etc/GeoIP.conf
AccountID YOUR_ACCOUNT_ID
LicenseKey YOUR_LICENSE_KEY
EditionIDs GeoLite2-City GeoLite2-Country GeoLite2-ASN
🔁 수동 또는 주기적 실행
sudo geoipupdate
⏰ 자동 업데이트 (cron 등록 예시)
0 3 * * 0 /usr/bin/geoipupdate > /var/log/geoipupdate.log 2>&1
- 설정 파일 권한을
600
으로 제한하여 LicenseKey 보호:chmod 600 /etc/GeoIP.conf
- 업데이트 주기는 주 1회 또는 월 2회 추천.
- 실패 로그 자동 확인 및 Slack/메일 연동하면 좋음.
활용 사례
환경 | 적용 방식 | 설명 |
---|---|---|
웹서버 로그 분석 | DB 기반 | IP별 방문 위치 분석 및 대시보드 시각화 |
API Gateway | Web Service API | 요청자 위치에 따라 리전 분기 처리 |
사용자 맞춤형 서비스 | JavaScript | 위치 기반 콘텐츠 추천 |
보안 로그 분석 | DB 기반 | 해외 IP 또는 의심 국가 탐지 자동화 |
점검 포인트
- DB 업데이트 자동화 여부 확인 (
geoipupdate
) - LicenseKey 노출 여부 확인 (
GeoIP.conf
권한 설정) - 외부 API 사용 시 암호화된 HTTPS 요청 사용 여부
- IP 기반 차단 정책에 실제 위경도 기반 필터링 적용 여부
- JS 라이브러리 사용 시 CORS 정책 및 사용자 개인정보 보호 방침 마련
Wazuh와 n8n을 연계하여 GeoIP 기반의 자동 분석 및 경고 시스템을 구성하면, 보안 이벤트 발생 시 해당 IP의 지리적 위치를 기반으로 자동 분류, 알림 전송, 차단 등의 액션을 수행할 수 있습니다. 이 방식은 특히 해외 IP 접속 시 경고, 의심 국가 탐지, 정책 기반 대응 자동화에 유용합니다. 아래는 전체 구성 흐름과 각각의 요소별 설정 방법입니다.
graph TD
Wazuh[Wazuh Manager (로그 수집)] --> Rule[Custom Rule (IP 포함 이벤트)]
Rule --> N8N_Webhook[n8n Webhook 호출]
N8N_Webhook --> GeoIP_Lookup[IP GeoIP API 또는 DB 분석]
GeoIP_Lookup --> FilterCheck[국가 코드 필터링]
FilterCheck -->|허용 국가| SlackOK[Slack 정상 보고]
FilterCheck -->|차단 국가| SlackWarn[Slack 경고 전송]
FilterCheck -->|차단 국가| BlockIP[Firewall 차단(Optional)]
Wazuh 측 설정 (규칙 생성 + Active Response)
사용자 정의 룰 설정 (예: /var/ossec/etc/rules/local_rules.xml)
<group name="geoip-test,">
<rule id="100150" level="7">
<decoded_as>json</decoded_as>
<field name="srcip">\d+\.\d+\.\d+\.\d+</field>
<description>이벤트에 외부 IP 포함됨 - GeoIP 분석 필요</description>
<options>no_full_log</options>
</rule>
</group>
Active Response 스크립트 설정 (Webhook 호출)
📁 /var/ossec/active-response/bin/geoip_to_n8n.sh
#!/bin/bash
SRCIP=$1
curl -X POST "https://your-n8n-server/webhook/geoip_alert" \
-H "Content-Type: application/json" \
-d "{\"ip\":\"$SRCIP\"}"
🛡️ /var/ossec/etc/ossec.conf
에 등록
<active-response>
<command>geoip_to_n8n.sh</command>
<location>all</location>
<rules_id>100150</rules_id>
</active-response>
n8n 워크플로 구성
Webhook 노드 (POST /webhook/geoip_alert)
- Method: POST
- Authentication: optional
- Response:
200 OK
로 설정
Function 노드 (IP 추출)
return [
{
json: {
ip: $json.ip || $json.body.ip
}
}
];
HTTP Request 노드 (GeoIP 조회)
- URL 예시 (무료):
http://ip-api.com/json/{{ $json.ip }}
- 또는 자체 구축한 MaxMind DB 조회 API 사용 가능
- Method: GET
- Response Format: JSON
필터 노드 (예: 한국, 미국만 허용)
const allowedCountries = ['KR', 'US'];
return allowedCountries.includes($json.countryCode)
? [{ json: { ...$json, status: 'ok' } }]
: [{ json: { ...$json, status: 'blocked' } }];
Slack 노드 (경고 또는 보고)
status == "blocked"
인 경우 경고 메세지 전송- 예시 메세지
🚨 외부 접속 경고 IP: {{ip}} 국가: {{country}} ({{countryCode}})
방화벽 자동 차단 연동
예: ufw 차단
sudo ufw deny from 203.0.113.25
n8n에서 HTTP Request 노드로 내부 API 서버 또는 SSH 연동 통해 실행 가능
(보안상 제약 있는 환경에서는 승인 후 연동 권장)
항목 | 체크리스트 |
---|---|
GeoIP API | 상용 API 사용 시 쿼터/속도 확인 필요 |
n8n Webhook | 인증 설정 권장 (Basic Auth, JWT 등) |
내부망 Wazuh | 외부로 나가지 않게 프록시 구성 또는 자체 GeoIP API 추천 |
IP 차단 | 자동 차단 대신 경고 기반 운영도 가능 |
로그 추적 | GeoIP 결과 및 알림 이력 저장 권장 (Google Sheets, DB 등) |
확장 아이디어
- GeoIP 결과 Google Sheets 저장 → IP별 국가 추이, 이상 접속 분석
- Wazuh + n8n + VirusTotal → 의심 IP의 악성 여부 동시 확인
- 특정 국가 접속 시 자동 티켓 생성 → TheHive 연계 가능
댓글