Programming/Bash Shell Script

[Bash Shell Script] zabbix-agent, modsecurity, rsyslog 자동 설치/설정 쉘 스크립트

Nirsa 2020. 6. 8. 18:24
반응형

 

  • 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

 

반응형