/var/log/messages and Security
Apr 13 04:06:41 myserver syslogd 1.4.1: restart. Apr 13 04:30:23 myserver smartd[2483]: Device: /dev/sda, Temperature changed 2 Celsius to 31 Celsius since last report Apr 13 13:30:23 myserver smartd[2483]: Device: /dev/sda, Temperature changed -2 Celsius to 29 Celsius since last report Apr 15 04:02:42 myserver webalizer: gethostby*.getanswer: asked for "194.216.80.218.in-addr.arpa IN PTR", got type "A" Apr 15 04:37:23 myserver auditd[1899]: Audit daemon rotating log files Apr 15 12:00:23 myserver smartd[2483]: Device: /dev/sda, Temperature changed 2 Celsius to 31 Celsius since last report Apr 15 14:00:23 myserver smartd[2483]: Device: /dev/sda, Temperature changed -2 Celsius to 29 Celsius since last report Apr 15 14:30:23 myserver smartd[2483]: Device: /dev/sda, Temperature changed -2 Celsius to 27 Celsius since last report Apr 15 14:30:23 myserver smartd[2483]: Device: /dev/sdb, Temperature changed -5 Celsius to 24 Celsius since last report Apr 15 16:30:23 myserver smartd[2483]: Device: /dev/sdb, Temperature changed 3 Celsius to 27 Celsius since last report
Basically the fields are month, day, time, hostname, process-name, message. We can summarise the process count base on date and time. Also, we can launch the script just before mid-night to summarise that day's messages and have it email to your account. Include the below script in your crontab to run at 23:59 everyday
#! /bin/sh
month=`date '+%b'`
day=`date '+%d'`
# cron at 23:59 and sleep for 1 min in order to collect a complete messages for the day
sleep 60
awk -v m=$month -v d=$day '
$1==m && $2==d {
split($3,t,":")
split($5,p,"[:\(\[]")
ind=sprintf("%s %s:00:00",p[1],t[1])
++s[ind]
}
END {
for(i in s) {
print i, s[i]
}
}' /var/log/messages 2>/dev/null | sort | \
mailx -s "Summary of /var/log/messages" yourname@yourcompany.com
You should get an email everyday in this format:
auditd 04:00:00 1 smartd 12:00:00 1 smartd 14:00:00 3 smartd 16:00:00 1 smartd 17:00:00 2 smartd 19:00:00 1 smartd 23:00:00 1 webalizer 04:00:00 1
After running this script, my colleague realised that there were lots of sshd processes with deny access. In Linux, you can track down the bad login using
lastb command. However, this is not setup by default and you need to touch /var/log/btmp to activate that. Once that is done, you will get output from lastb like below: (Note, ip and usernames are masked for secuity reason)
# lastb | head xxuser ssh:notty xxx.166.139.yyy Wed Apr 16 07:50 - 07:50 (00:00) rxxot ssh:notty xxx.124.185.yyy Wed Apr 16 04:14 - 04:14 (00:00) xxisha ssh:notty xxx.212.57.yyy Wed Apr 16 01:17 - 01:17 (00:00) axxisha ssh:notty xxx.212.57.yyy Wed Apr 16 01:17 - 01:17 (00:00) xxisha ssh:notty xxx.212.57.yyy Wed Apr 16 01:17 - 01:17 (00:00) xxisha ssh:notty xxx.212.57.yyy Wed Apr 16 01:17 - 01:17 (00:00) xxisha ssh:notty xxx.212.57.yyy Wed Apr 16 01:16 - 01:16 (00:00) xxisha ssh:notty xxx.212.57.yyy Wed Apr 16 01:16 - 01:16 (00:00) axxisha ssh:notty xxx.212.57.yyy Wed Apr 16 01:16 - 01:16 (00:00) axxisha ssh:notty xxx.212.57.yyy Wed Apr 16 01:16 - 01:16 (00:00)
What we can do is to find out the top 10 'hacker' ip addresses so that we can include that in the /etc/hosts.deny file to block off the bad guys. We can also find out what username hackers like to try and ensure these accounts do not exist or protected with strong password.
# lastb | awk '/Apr/{++s[$3]}END{for(i in s){print i,s[i]}}' | sort -n -k 2 -r | head -10
xxx.191.254.yyy 1178
xxx.208.50.yyy 1106
xxx.108.131.yyy 1043
xxx.29.152.yyy 957
xxx.220.217.yyy 295
xxx.68.36.yyy 295
xxx.196.13.yyy 295
xxx.194.55.yyy 295
xxx.118.166.yyy 295
xxx.130.201.yyy 265
# lastb | awk '{++s[$1]}END{for(i in s){print i,s[i]}}' | sort -n -k 2 -r | head -10
root 19230
admin 3704
test 3290
guest 1442
webmaste 1146
user 1014
oracle 894
info 716
postgres 618
ftpuser 604
Labels: Linux, security, shell script


0 Comments:
Post a Comment
<< Home