메뉴 닫기

access_log 를 이용한 보안 설정

” access_log를 이용한 보안 설정” 


WEB에서 보통 access_log들을 설정하여 남기는 설정을 하게 됩니다.

WEB을 이용해서 해킹을 하는 경우가 있어 웹에 대해서 취약점이 있고, 개발자들은 이에 php 보안코딩에 대해서 따로 설정을 하게됩니다.

WEB Hacking에서 유명한 LFI (Local File Inclusion)과 RFI (Remote File Inclusion) 이 있습니다. RFI 의 경우는  php.ini 설정파일에서 allow_url_fopen, allow_url_include, display_errors 설정을 모두 Off 로 설정하면 됩니다.

 

단, LFI 경우는 입력 값을 치환을 하거나, 문자필터링 PHP를 해야하는데 이또한 php 보안코딩입니다.

ip에 대해서 차단하고 서버를 관리하는 방법에 대해서 설정하도록 합니다.

이 포스팅에서는 Rocky Linux 9에서 Apache access_log에서 ip block 관리 적용하는 방법을 설명합니다.

[개  요]

✅ 종    류 : 엔지니어링

✅ 난이도 : ⭐⭐

✅ 내용요약 : Apache access_log에서 ip block 관리 적용방법 설명

✅ 테스트환경 : Rocky Linux 9

✅ 관련직무 : 시스템&클라우드 엔지니어

[기초이론&용어설명]

[관련 기술자료]

 

” 시작하며


1️⃣ 기본 repo 및 패키지 설치 

ip 설정과 geoip 관련 부분을 확인하기 위해서 패키지 라이브러리를 설치합니다.

Redhat

# dnf install -y epel-release rocky-release iptables-services

# dnf install -y https://rpms.remirepo.net/enterprise/remi-release-$(source /etc/os-release && echo $VERSION_ID).rpm

# dnf update -y

# dnf install -y GeoIP GeoIP-devel GeoIP-data zlib-devel

# systemctl enable iptables && systemctl restart iptables

 

Ubuntu

# add-apt-repository ppa:maxmind/ppa

# apt-get update -y 

# apt-get upgrade -y

# apt install -y libgeoip-dev libgeoip*

# apt install -y netfilter-persistent

# systemctl enable netfilter-persistent && systemctl restart netfilter-persistent


2️⃣ apache, nginx access_log 파일 확인

Apache

# /usr/bin/httpd -S

# /usr/local/apache/bin/httpd -S

나온 결과값의 conf 파일에 대해 확인 

grep -ri ‘CustomLog\|TransferLog’  /etc/httpd/
grep -ri ‘CustomLog\|TransferLog’ /usr/local/apache

 

Nginx

Nginx가 패키지일때

# grep -ri “access_log” /etc/nginx/conf 

Nginx가 소스일떄

# grep -ri “access_log” /usr/local/nginx/conf

 

결과값

access_log /usr/local/nginx/logs/access.log main;

 


3️⃣  bash 스크립트 설정

Rocky Linux9 에서 iptables 설치가 되어 있고 사용중인 상태여야 합니다. 만약 firewalld라면 변경해주세요.

설치조건 :  iptables-sevices 사용

 

  • apache 로그 필터링 및 ip차단 스크립트

# touch /root/bin/apache_ip_hacking_block.sh

# chmod 755 /root/bin/apache_ip_hacking_block.sh

# vi /root/bin/apache_ip_hacking_block.sh

 

#!/bin/bash

# 모니터링할 로그 파일 경로 (Apache Access 로그 경로)
LOG_FILES=(“/var/log/httpd/access.log” “/var/log/httpd/another_access.log”)

# 필터링할 키워드 목록
KEYWORDS=(
“htpasswd”
“/etc/passwd”
“/etc/shadow”
“/etc/group”
“/etc/security/group”
“/etc/security/passwd”
“/etc/security/user”
“/etc/security/environ”
“/etc/security/limits”
“/usr/lib/security/mkuser.default”
“/var/log/messages”
“/etc/crontab”
“/etc/syslog.conf”
“/var/log/wtmp”
“/var/log/lastlog”
“/etc/vsftpd/ftpusers”
“/etc/ftpusers”
“/etc/pam.d”
“/etc/hosts.allow”
“/etc/hosts.deny”
“/etc/lilo.conf”
“/etc/securetty”
“/etc/shutdown.allow”
“/etc/security”
“/etc/rc.d/init.d”
“/etc/sysconfig”
“/etc/services”
“/etc/inetd.conf”
“/etc/cron.allow”
“/etc/cron.deny”
“/etc/ssh”
“/etc/sysctl.conf”
“/usr/bin/sh”
“/usr/bin/bash”
“/usr/bin/dash”
“/usr/bin/zsh”
“/bin/sh”
“/bin/bash”
“/bin/dash”
“/bin/zsh”
“cmd”
)

# 차단 시간 (초)
BAN_TIME=3600

# 차단된 IP에 대한 로그 파일
BLOCK_LOG=”/var/log/blocked_ips.log”

# IP 차단 함수
block_ip() {
local CLIENT_IP=$1
local keyword=$2

# 해당 IP를 iptables로 차단 (INPUT 및 OUTPUT)
iptables -I INPUT -s “$CLIENT_IP” -p tcp –dport 80 -j DROP
iptables -I INPUT -s “$CLIENT_IP” -p tcp –dport 443 -j DROP
iptables -I OUTPUT -d “$CLIENT_IP” -p tcp –sport 80 -j DROP
iptables -I OUTPUT -d “$CLIENT_IP” -p tcp –sport 443 -j DROP

# 차단된 시간 기록
echo “$(date ‘+%Y-%m-%d %H:%M:%S’) – Blocked IP $CLIENT_IP due to keyword: $keyword” >> “$BLOCK_LOG”

# BAN_TIME 동안 차단 후 해제
sleep “$BAN_TIME”
iptables -D INPUT -s “$CLIENT_IP” -p tcp –dport 80 -j DROP
iptables -D INPUT -s “$CLIENT_IP” -p tcp –dport 443 -j DROP
iptables -D OUTPUT -d “$CLIENT_IP” -p tcp –sport 80 -j DROP
iptables -D OUTPUT -d “$CLIENT_IP” -p tcp –sport 443 -j DROP
echo “$(date ‘+%Y-%m-%d %H:%M:%S’) – Unblocked IP $CLIENT_IP” >> “$BLOCK_LOG”
}

# 로그 파일 모니터링
monitor_logs() {
for LOG_FILE in “${LOG_FILES[@]}”; do
tail -F “$LOG_FILE” | while read line; do
for keyword in “${KEYWORDS[@]}”; do
if echo “$line” | grep -q “$keyword”; then
# X-Forwarded-For 헤더에서 클라이언트 IP 추출
CLIENT_IP=$(echo “$line” | grep -oP ‘(?<=X-Forwarded-For: )[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+’)

# 클라이언트 IP가 없으면 일반적인 IP 추출
if [ -z “$CLIENT_IP” ]; then
CLIENT_IP=$(echo “$line” | awk ‘{print $1}’)
fi

# IP가 추출되었는지 확인
if [ -n “$CLIENT_IP” ]; then
# IP 차단을 백그라운드에서 독립적으로 처리
block_ip “$CLIENT_IP” “$keyword” &
echo “Blocked IP $CLIENT_IP for accessing suspicious URL containing keyword: $keyword”
fi
break
fi
done
done
done
}

# 로그 모니터링 시작 (백그라운드로 실행)
monitor_logs &

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

백그라운드로 실행

# nohup /root/bin/apache_ip_hacking_block.sh &


  • access_log telegram알람 bash 스크립트 설정

백그라운드로 실행

# touch /root/bin/block_ip_alert_telegram.sh

# chmod 755 /root/bin/block_ip_alert_telegram.sh

# vi /root/bin/block_ip_alert_telegram.sh

 

 

#!/bin/bash

# Telegram API 토큰 및 채팅 ID 설정
TELEGRAM_API_TOKEN=”your_telegram_api_token
CHAT_ID=”your_chat_id

# 차단 로그 파일 경로
BLOCK_LOG=”/var/log/blocked_ips.log”

# 마지막 확인한 로그 라인 번호 저장 파일
LAST_LINE_FILE=”/var/log/last_line.txt”

# 이전에 읽은 마지막 라인 번호
LAST_LINE=0
if [ -f “$LAST_LINE_FILE” ]; then
LAST_LINE=$(cat “$LAST_LINE_FILE”)
fi

# 새 로그 라인 번호 계산
CURRENT_LINE=$(wc -l < “$BLOCK_LOG”)

# 새로운 로그가 있는지 확인
if [ “$CURRENT_LINE” -gt “$LAST_LINE” ]; then
# 새로운 로그 추출
NEW_LOGS=$(sed -n “$(($LAST_LINE + 1)),$CURRENT_LINE p” “$BLOCK_LOG”)

# 새로운 로그를 Telegram으로 전송
for log in “$NEW_LOGS”; do
curl -s -X POST “https://api.telegram.org/bot$TELEGRAM_API_TOKEN/sendMessage” -d chat_id=”$CHAT_ID” -d text=”$log”
done

# 현재 라인 번호를 저장
echo “$CURRENT_LINE” > “$LAST_LINE_FILE”
fi

 

 

 

 

 

 

 

 

 

 

 

  • crontab 등록

vi /etc/crontab

* * * * * root /bin/sh /root/bin/block_ip_alert_telegram.sh

 

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x