一、為什麼?
[root@open1 ~]# cat /etc/CheckUser.sh #!/bin/bash #conding:utf-8 pid=$PPID #在自己home目錄得到所有的key,如果/var/log/keys 沒有的時候,添加進去 while read line do grep "$line" /var/log/keys >/dev/null || echo "$line" >> /var/log/keys done < $HOME/.ssh/authorized_keys #得到每個key的指紋 cat /var/log/keys | while read LINE do NAME=$(echo $LINE | awk '{print $3}') echo $LINE >/tmp/keys.log.$pid KEY=$(ssh-keygen -l -f /tmp/keys.log.$pid | awk '{print $2}') grep "$KEY $NAME" /var/log/ssh_key_fing >/dev/null || echo "$KEY $NAME" >> /var/log/ssh_key_fing done #如果是root用戶,secure文件裡面是通過PPID號驗證指紋 if [ $UID == 0 ] then ppid=$PPID else #如果不是root用戶,驗證指紋的是另外一個進程號 ppid=`/bin/ps -ef | grep $PPID |grep 'sshd:' |awk '{print $3}'` fi #得到RSA_KEY和NAME_OF_KEY,用來bash4.1得到歷史記錄 RSA_KEY=`/bin/egrep 'Found matching RSA key' /var/log/secure | /bin/egrep "$ppid" | /bin/awk '{print $NF}' | tail -1` if [ -n "$RSA_KEY" ];then NAME_OF_KEY=`/bin/egrep "$RSA_KEY" /var/log/ssh_key_fing | /bin/awk '{print $NF}'` fi #把NAME_OF_KEY設置為只讀 readonly NAME_OF_KEY export NAME_OF_KEY /bin/rm /tmp/keys.log.$pid
View Code
5.2 配置 profile,在文件末尾添加一行內容,如下:
[root@open1 ~]# echo "test -f /etc/CheckUser.sh && . /etc/CheckUser.sh" >> /etc/profile在/etc/bashrc 末尾添加下面內容:
[root@open1 ~]# tail -1f /etc/bashrc test -z "$BASH_EXECUTION_STRING" || { test -f /etc/CheckUser.sh && . /etc/CheckUser.sh; logger -t -bash -s "HISTORY $SSH_CLIENT USER=$NAME_OF_KEY CMD=$BASH_EXECUTION_STRING " >/dev/null 2>&1;}5.3 修改sshd 配置文件,開啟debug 模式,並重啟sshd 服務
[root@open1 ~]# sed -i 's/#LogLevel INFO/LogLevel DEBUG/g' /etc/ssh/sshd_config [root@open1 ~]# service sshd restart Stopping sshd: [ OK ] Starting sshd: [ OK ]六、驗證
6.1 在client1 上進行登陸,並刪除個文件試下(zhangsan)
6.2 在client2 上進行登陸,也刪除個文件,並執行個重啟服務的命令(lisi)
6.3 去服務器上查看下 messages 日志,內容如下
通過上圖,可以看出,不通用戶的客戶端通過公鑰登陸的方式,分辨出了誰操作了什麼,什麼時候操作的。
(注:上圖第4段 swift1 是這台服務器的主機名,由於我只是運行了hostname 命令修改主機名,並沒有修改networks,所以內核裡還是之前的名字:swift1。)
七、結束通過這種方式,極大的解決了多root 用戶登陸操作,無法審計的問題。並且可以結合日志轉發,將系統日志轉發到其它服務器,即使主機被黑了,也能具體的審查登陸時間以及做了哪些操作。
如果本文對您有用,不介意的話,可以小小的打賞贊助一下。
謝謝,如有轉載請注明出處。