반응형
-
zabbix-agent, modsecurity, rsyslog 자동 설치/설정 쉘 스크립트
로컬 호스트 명과 자빅스 서버의 IP를 입력받은 후 zabbix-agent, modsecurity,rsyslog를 설치 및 설정해주는 쉘 스크립트 입니다. modsecurity의 경우 OWASP의 CRS를 받아온 후 DetectionOnly 모드로 동작하게 되어 직접적인 차단은 하지 않고 modsec_audit.log로 탐지만 하게 됩니다.
스크립트 사용 방법은 첫번째 인자값으로 firewalld를 설정할지를 결정 해주어야 합니다. 만약 install.sh 라는 파일명으로 코드를 저장했다면 firewalld 설정을 할 경우 ./install.sh set-firewalld를 입력해주어야 하고 firewalld를 설정하지 않을 경우 ./install.sh로만 하셔도 무관 합니다.
설정상 문제가 될만한 부분은 없으나 httpd.conf 파일에서 ErrorLog와 CustomLog 부분은 httpd를 설치한 그 상태 그대로를 기준으로 작성 하였기 때문에 버츄얼호스트를 사용하시거나 conf.d 파일에 따로 관리하시는 분들은 httpd.conf 부분만 수정해주시면 됩니다. 만약 서버 다수를 설정해야할 경우 호스트명과 자빅스 서버 IP를 정적으로 박아서 사용하시면 됩니다.
#!/bin/bash
error_log="ErrorLog \"|/bin/sh -c '/usr/bin/tee -a /var/log/httpd/error_log | /usr/bin/logger -p local2.notice -t error_log'\""
# config backup
mkdir /root/backup
cp -p /etc/httpd/conf/httpd.conf /root/backup/httpd.conf
cp -p /etc/httpd/conf.d/vhost.conf /root/backup/vhost.conf
cp -p /etc/rsyslog.conf /root/backup/rsyslog.conf
# git install
yum -y install git
## Hostname Change and zabbix-agent install
read -p "호스트명: " get_hostname
read -p "자빅스 서버 IP (ex. 192.168.0.1) : " get_zabbix_ip
echo "$get_hostname" > /proc/sys/kernel/hostname
hostnamectl set-hostname $get_hostname
get_hostname=`hostname`
rpm -Uvh https://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-2.el7.noarch.rpm
yum -y install zabbix-agent
sed -i "s/Server=127.0.0.1/Server=$get_zabbix_ip/gi" /etc/zabbix/zabbix_agentd.conf
sed -i "s/ServerActive=127.0.0.1/ServerActive=$get_zabbix_ip/gi" /etc/zabbix/zabbix_agentd.conf
sed -i "s/Hostname=Zabbix server/Hostname=$get_hostname/gi" /etc/zabbix/zabbix_agentd.conf
if [ "$1" == "set-firewalld" ];then
firewall-cmd --permanent --zone=public --add-rich-rule="rule family=ipv4 source address=$get_zabbix_ip/32 port protocol=tcp port=10050 accept"
firewall-cmd --reload
fi
systemctl restart zabbix-agent
systemctl enable zabbix-agent
## ModSecurity
yum -y install gcc-c++ httpd-devel pcre-devel libxml2-devel
wget https://www.modsecurity.org/tarball/2.9.1/modsecurity-2.9.1.tar.gz
tar -zxvf modsecurity-2.9.1.tar.gz
cd modsecurity-2.9.1
./configure && make && make install
perl -p -i -e '$.==57 and print "LoadModule security2_module modules/mod_security2.so\n"' /etc/httpd/conf/httpd.conf
mkdir /tmp/mod_data
cat <<EOF > /etc/httpd/conf.d/mod_security.conf
<IfModule mod_security2.c>
Include /etc/httpd/modsecurity.d/crs-setup.conf
Include /etc/httpd/modsecurity.d/activated_rules/*.conf
SecRuleEngine DetectionOnly
SecAuditEngine On
SecAuditLog /var/log/httpd/modsec_audit.log
SecAuditLog "|/usr/bin/logger -p local0.notice -t apache"
SecAuditLogType Serial
SecRequestBodyAccess on
SecAuditLogParts ABIJDFHZ
SecDataDir /tmp/mod_data
</IfModule>
EOF
## ModSecurity CRS
mkdir /tmp/modsec
cd /tmp/modsec
git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git
mkdir /etc/httpd/modsecurity.d
mkdir /etc/httpd/modsecurity.d/activated_rules
mv /tmp/modsec/owasp-modsecurity-crs/crs-setup.conf.example /etc/httpd/modsecurity.d/crs-setup.conf
mv /tmp/modsec/owasp-modsecurity-crs/rules/* /etc/httpd/modsecurity.d/activated_rules/
mv /etc/httpd/modsecurity.d/activated_rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example /etc/httpd/modsecurity.d/activated_rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf
mv /etc/httpd/modsecurity.d/activated_rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf.example /etc/httpd/modsecurity.d/activated_rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf
## rsyslog setting
sed -i 's/#$ModLoad imklog/$ModLoad imklog/gi' /etc/rsyslog.conf
sed -i 's/*.info;mail.none;authpriv.none;cron.none/*.info;local0.!*;local1.!*;local2.!*;mail.none;authpriv.none;cron.none/gi' /etc/rsyslog.conf
perl -p -i -e '$.==56 and print "local0.* /var/log/httpd/modsec_audit.log\n"' /etc/rsyslog.conf
perl -p -i -e '$.==56 and print "local1.* /var/log/httpd/access.log\n"' /etc/rsyslog.conf
perl -p -i -e '$.==56 and print "local2.* /var/log/httpd/error.log\n"' /etc/rsyslog.conf
sed -i 's/#$ActionQueueFileName fwdRule1/$ActionQueueFileName fwdRule1/gi' /etc/rsyslog.conf
sed -i 's/#$ActionQueueMaxDiskSpace 1g/$ActionQueueMaxDiskSpace 1g/gi' /etc/rsyslog.conf
sed -i 's/#$ActionQueueSaveOnShutdown on/$ActionQueueSaveOnShutdown on/gi' /etc/rsyslog.conf
sed -i 's/#$ActionQueueType LinkedList/$ActionQueueType LinkedList/gi' /etc/rsyslog.conf
sed -i 's/#$ActionResumeRetryCount -1/$ActionResumeRetryCount -1/gi' /etc/rsyslog.conf
echo "local0.* @$get_zabbix_ip:514" >> /etc/rsyslog.conf
echo "local1.* @$get_zabbix_ip:514" >> /etc/rsyslog.conf
echo "local2.* @$get_zabbix_ip:514" >> /etc/rsyslog.conf
echo "authpriv.* @$get_zabbix_ip:514" >> /etc/rsyslog.conf
sed -i 's/ CustomLog "logs\/access_log" combined/ CustomLog \"logs\/access_log\" combined\n CustomLog \"|\/usr\/bin\/logger -p local1.notice -t access_log\" combined/gi' /etc/httpd/conf/httpd.conf
sed -i 's/^ErrorLog/ErrorLog \"|\/bin\/sh -c \/usr\/bin\/tee -a \/var\/log\/httpd\/error.log | \/usr\/bin\/logger -p local2.notice -t error_log\"/gi' /etc/httpd/conf/httpd.conf
systemctl restart rsyslog
httpd -t &> /root/syntax_check
syntax_check=$(</root/syntax_check)
if [[ "$syntax_check" =~ "Syntax OK" ]]; then
echo "Syntax OK!"
echo "http 서비스를 재시작 합니다."
systemctl restart httpd
else
echo "Syntax Flase!!!"
echo "Syntax Flase!!!"
echo "Syntax Flase!!!"
fi
반응형
'Programming > Bash Shell Script' 카테고리의 다른 글
[Bash Shell Script] 쉘 스크립트 df -h 명령어 특정 사용률 이상 디렉토리 가져오기 (0) | 2020.06.25 |
---|---|
[Bash Shell Script] Apache ModSecurity audit Log 확인 스크립트 (IP 순위, 국가 순위, GET 순위, POST 순위, Requesy Body 순위) (0) | 2020.06.24 |
[Bash Shell Script] 쉘 스크립트 일부 문자열 비교하기 (0) | 2020.06.01 |
[Bash Shell Script] zabbix-agent 자동 설치 쉘 스크립트 (0) | 2020.05.28 |
[Bash Shell Script] CentOS 7 Mod_Security2 설치 및 Mod_audit 로깅 설정 쉘 스크립트 (0) | 2020.05.25 |