Shell脚本监控服务器pts登录情况记录为日志并邮件通知【CentOS 6.5】
2016-07-27 13:37
871 查看
摘要: 日常维护中,一台服务器会开不同的用户给不同的运维或者开发人员,把每一次远程登录服务器记录下来,有些问题就是可追溯的了。当然,如果你的服务器被暴力破解了,或者陌生人远程登录了,你也能在第一时间收到邮件通知。
(一)配置服务器sendmail发邮件功能:
安装sendmail服务:
# yum install sendmail -y
下面启动sendmail服务:
# /etc/init.d/sendmail restart
启动后请单独用mail -s测试邮件是否可以发送出去,此处不介绍了。
(二)Linux下用nali查询IP地址归属地:
下载nali的tar包:
# wget http://chenze.name/wenjian/nali-0.2.tar.gz
解压,并放到合适位置:
# tar xvf nali-0.2.tar.gz
# mv nali-0.2 /mydata/nali
编译安装:
# cd /mydata/nali
# ./configure
# make && make install
更新本地nali地址库(建议制定计划任务,每天自动更新一次IP地址库):
# nali-update
使用nali命令瞧一瞧:
# nali 42.96.189.63
查看一下环境变量nali在哪个目录下:
如果[b]nali命令得到的中文地名输入到log中或发送出去的邮件中[/b]为空或乱码,那可能是服务器、脚本的编码问题,请自行解决。下面说正事儿:
首先编写下面这个脚本,不要放在/root目录下!
# vim /mydata/bash_shell/ssh_login_monitor.sh
------------------------------------------------------------------------
#!/bin/bash
echo
CommonlyIP=("139.168.55.6") # 常用ssh登陆服务器的IP地址,即IP白名单
SendToEmail=("opsadmin@rjl.com" "123456789@qq.com") # 接收报警的邮箱地址
LoginInfo=`last | grep "still logged in" | head -n1`
UserName=`echo $LoginInfo | gawk '{print $1}'`
LoginIP=`echo $LoginInfo | gawk '{print $3}'`
LoginTime=`date +'%Y-%m-%d %H:%M:%S'`
LoginPlace=`/usr/local/bin/nali $LoginIP | gawk -F'[][]' '{print $2}'`
SSHLoginLog="/var/log/login_access.log"
for ip in ${CommonlyIP[*]} # 判断登录的客户端地址是否在白名单中
do
if [ "$LoginIP" == $ip ];then
COOL="YES"
fi
done
if [ "$COOL" == "YES" ];then
echo "用户【 $UserName 】于北京时间【 $LoginTime 】登陆了服务器,其IP地址安全!" >> $SSHLoginLog
elif [ $LoginIP ];then
echo "用户【 $UserName 】于北京时间【 $LoginTime 】登陆了服务器,其IP地址为【 $LoginIP 】,归属地【 $LoginPlace 】" | mail -s "【 通知 】 有终端SSH连上服务器了!" ${SendToEmail[*]}
echo "用户【 $UserName 】于北京时间【 $LoginTime 】登陆了服务器,其IP地址为【 $LoginIP 】,归属地【 $LoginPlace 】" >> $SSHLoginLog
fi
echo
------------------------------------------------------------------------
将脚本添加到hosts.allow里,登录终端自动执行该脚本一次:
# vim /etc/hosts.allow
------------------------------------------------------------------------
# 添加下面这句话即可
sshd:All:spawn (/bin/sh /mydata/bash_shell/ssh_login_monitor.sh) &:allow
------------------------------------------------------------------------
【BUG提示】本人在后期使用过程中发现,如果写在/etc/hosts.allow中,会有一个BUG,那就是第一个SSH终端登录的用户将不会被“监视”到,也就是无法触发脚本,不会记录下日志。于是做如下改进:
将脚本写到到 /etc/ssh/sshrc 中,ssh登录时自动执行该脚本一次:
# vim /etc/ssh/sshrc
------------------------------------------------------------------------
# 添加下面这句话即可
/bin/sh /mydata/bash_shell/ssh_login_monitor.sh
------------------------------------------------------------------------
由于/etc/hosts.allow 无论登录用户是谁,执行该文件中的都将是root用户,因此,被调用的脚本也是root执行的。但是 /etc/ssh/sshrc 中就不一样了,哪个用户登录的,就是哪个用户执行脚本,那么问题来了,记录登录信息的日志此时可能权限为644(echo生成的txt文件默认权限),普通用户写不成该文件!所以一定要记得用root用户赋予login_access.log文件 666 权限(如果结合zabbix自定义报警的话,就需要读文件,在这里读写权限一起给了):
# chmod 666 /var/log/login_access.log
可以打开一个新的终端试试效果了。如果脚本没有执行,请赋予脚本可执行权限(chmod +x),讲道理/bin/sh已经避免了权限导致脚本不可执行的问题。下面是实际效果:
查看邮箱:
查看服务器上登录记录日志:
# vim /var/log/login_access.log
至此,监控终端登陆全部完成!
(一)配置服务器sendmail发邮件功能:
安装sendmail服务:
# yum install sendmail -y
下面启动sendmail服务:
# /etc/init.d/sendmail restart
启动后请单独用mail -s测试邮件是否可以发送出去,此处不介绍了。
(二)Linux下用nali查询IP地址归属地:
下载nali的tar包:
# wget http://chenze.name/wenjian/nali-0.2.tar.gz
解压,并放到合适位置:
# tar xvf nali-0.2.tar.gz
# mv nali-0.2 /mydata/nali
编译安装:
# cd /mydata/nali
# ./configure
# make && make install
更新本地nali地址库(建议制定计划任务,每天自动更新一次IP地址库):
# nali-update
使用nali命令瞧一瞧:
# nali 42.96.189.63
查看一下环境变量nali在哪个目录下:
如果[b]nali命令得到的中文地名输入到log中或发送出去的邮件中[/b]为空或乱码,那可能是服务器、脚本的编码问题,请自行解决。下面说正事儿:
首先编写下面这个脚本,不要放在/root目录下!
# vim /mydata/bash_shell/ssh_login_monitor.sh
------------------------------------------------------------------------
#!/bin/bash
echo
CommonlyIP=("139.168.55.6") # 常用ssh登陆服务器的IP地址,即IP白名单
SendToEmail=("opsadmin@rjl.com" "123456789@qq.com") # 接收报警的邮箱地址
LoginInfo=`last | grep "still logged in" | head -n1`
UserName=`echo $LoginInfo | gawk '{print $1}'`
LoginIP=`echo $LoginInfo | gawk '{print $3}'`
LoginTime=`date +'%Y-%m-%d %H:%M:%S'`
LoginPlace=`/usr/local/bin/nali $LoginIP | gawk -F'[][]' '{print $2}'`
SSHLoginLog="/var/log/login_access.log"
for ip in ${CommonlyIP[*]} # 判断登录的客户端地址是否在白名单中
do
if [ "$LoginIP" == $ip ];then
COOL="YES"
fi
done
if [ "$COOL" == "YES" ];then
echo "用户【 $UserName 】于北京时间【 $LoginTime 】登陆了服务器,其IP地址安全!" >> $SSHLoginLog
elif [ $LoginIP ];then
echo "用户【 $UserName 】于北京时间【 $LoginTime 】登陆了服务器,其IP地址为【 $LoginIP 】,归属地【 $LoginPlace 】" | mail -s "【 通知 】 有终端SSH连上服务器了!" ${SendToEmail[*]}
echo "用户【 $UserName 】于北京时间【 $LoginTime 】登陆了服务器,其IP地址为【 $LoginIP 】,归属地【 $LoginPlace 】" >> $SSHLoginLog
fi
echo
------------------------------------------------------------------------
将脚本添加到hosts.allow里,登录终端自动执行该脚本一次:
# vim /etc/hosts.allow
------------------------------------------------------------------------
# 添加下面这句话即可
sshd:All:spawn (/bin/sh /mydata/bash_shell/ssh_login_monitor.sh) &:allow
------------------------------------------------------------------------
【BUG提示】本人在后期使用过程中发现,如果写在/etc/hosts.allow中,会有一个BUG,那就是第一个SSH终端登录的用户将不会被“监视”到,也就是无法触发脚本,不会记录下日志。于是做如下改进:
将脚本写到到 /etc/ssh/sshrc 中,ssh登录时自动执行该脚本一次:
# vim /etc/ssh/sshrc
------------------------------------------------------------------------
# 添加下面这句话即可
/bin/sh /mydata/bash_shell/ssh_login_monitor.sh
------------------------------------------------------------------------
由于/etc/hosts.allow 无论登录用户是谁,执行该文件中的都将是root用户,因此,被调用的脚本也是root执行的。但是 /etc/ssh/sshrc 中就不一样了,哪个用户登录的,就是哪个用户执行脚本,那么问题来了,记录登录信息的日志此时可能权限为644(echo生成的txt文件默认权限),普通用户写不成该文件!所以一定要记得用root用户赋予login_access.log文件 666 权限(如果结合zabbix自定义报警的话,就需要读文件,在这里读写权限一起给了):
# chmod 666 /var/log/login_access.log
可以打开一个新的终端试试效果了。如果脚本没有执行,请赋予脚本可执行权限(chmod +x),讲道理/bin/sh已经避免了权限导致脚本不可执行的问题。下面是实际效果:
查看邮箱:
查看服务器上登录记录日志:
# vim /var/log/login_access.log
至此,监控终端登陆全部完成!
相关文章推荐
- Linux Generating SSH Keys
- 如何设置才能远程登录Mysql数据库
- PuTTY登录设置的批量备份导出/导入
- perl脚本实现限制ssh最大登录次数(支持白名单)
- rsync ssh 数据同步分析
- 搭建SSH时的思考和遇到的几个问题的解决方法
- SSH框架网上商城项目第9战之添加和更新商品类别功能实现
- SSH框架网上商城项目第7战之整合Struts2和Json
- SSH 使用原理 与解释
- SSH整合中 hibernate托管给Spring得到SessionFactory
- win2003禁止远程登录的设置方法(图文)
- win2003禁止用户远程登录的设置方法
- 关于MYSQL 远程登录的授权方法 命令
- Linux VPS利用SSH重置ROOT密码的方法
- SSH框架网上商城项目第15战之线程、定时器同步首页数据
- SSH框架网上商城项目第18战之过滤器实现购物登录功能的判断
- MySQL实现远程登录的方法
- ssh,scp自动登陆的实现方法
- mysql 修改密码和设置允许远程登录