Skriptimiskeeled aine aruanded 2010 sügis/SigmarMuuga/Bash

From ICO wiki

Sigmar Muuga Bashi asjad

Kodutöö

Skript, mis vaatab /var/log/auth.log faili ja võtab sealt enim ebaõnnestunud IP aadressid, mis üritasid teha sisse logimist SSH kaudu(lävend võiks näiteks olla 10 ebaõnnestunud katset) ning saadab need kas e-mailile või lisab tulemüüri reeglitesse(IPTABLES näiteks). Jah, ma tean, et on ka paremaid viise hoste blokeerida, näiteks kasutada hosts-allow parameetrit ssh konfiguratsioonis.

#!/bin/bash

# Skript, mis loeb läbi UNIX-i auth.log faili ja koostab IPTables block reeglid IP aadressidele,
# mille pealt on autentimine ebaõnnestunud vähemalt etteantud arv kordi

# käivitamise näide:
# sh check_ip.sh /var/log/auth.log /etc/iptables_blocked.txt

# Autor: Sigmar Muuga, DK31

# mitme ebaõnnestumise korral me IP blokeerime
BLOCK_LEVEL=5
# auth.log faili asukoht
AUTH_LOG_FILE=$1
# tüüpilised veasituatsioonid
ERROR_PATTERNS="error | illegal | not\ allowed"
# väljundfaili nimi (või asukoht)
IP_TABLES_FILE=$2

# kontrollime etteantud argumenti
if [ -z "$1" ]; then
	echo "No command-line arguments."
	exit 0
fi

if [ -z "$2" ]; then
	echo "No IPTABLES file specified."
	exit 0
fi

# kontrollime, et faili saaks kirjutada
touch "$IP_TABLES_FILE"
if [ -e $IP_TABLES_FILE ]; then
	echo "IPTABLES file: "$IP_TABLES_FILE
else
	echo "Cannot write IPTABLES file!"
	exit 0
fi

# itereerime yle logiridade
more $AUTH_LOG_FILE | egrep "$ERROR_PATTERNS" | while read line; do
	address=$(echo $line | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}')
	# kas on valiidne IP
	if [ ${#address} -gt 0 ]; then
		# loeme esinevuskorrad
		occurences=$(grep -c $address $AUTH_LOG_FILE)
		if [ $occurences -ge $BLOCK_LEVEL ]; then # kui on juba piisavalt feilinud IP
			added_occurences=$(grep -c $address $IP_TABLES_FILE)
			#kontrollime, et poleks juba lisatud
			if [ $added_occurences -lt 1 ]; then
				echo "Blacklisting "$address" with "$occurences" occurences"
				#kirjutame IPTABLES reegli
				echo "iptables -A INPUT -s "$address" -j DROP" >> $IP_TABLES_FILE
			fi
		fi
	fi
done