您好,登錄后才能下訂單哦!
一、為什么?
在中小型企業,公司不同運維人員基本都是以root 賬戶進行服務器的登陸管理,缺少了賬戶權限審計制度。不出問題還好,出了問題,就很難找出源頭。
這里介紹下,如何利用編譯bash 使不同的客戶端在使用root 登陸服務器使,記錄各自的操作,并且可以在結合ELK 日志分析系統,來收集登陸操作日志
二、環境
服務器:centos 6.5、Development tools、使用密鑰認證,SElinux 關閉。
客戶端:生成密鑰對,用于登錄服務器 (2臺)
三、搭建部署 (服務器操作 192.168.30.72)
3.1 下載編譯bash
[root@open1 ~]# wget http://ftp.gnu.org/gnu/bash/bash-4.1.tar.gz[root@open1 ~]# tar xvf bash-4.1.tar.gz [root@open1 ~]# cd bash-4.1
3.2 先修改下 config-top.c文件,大概94行、104行,由于c 語言中 注釋是/**/ ,所以不要刪除錯了。修改如下:
[root@open1 bash-4.1]# vim config-top.c#define SSH_SOURCE_BASHRC#define SYSLOG_HISTORY
3.3 修改下bashhist.c 文件,讓終端上的命令記錄到系統messages 中,并且以指定的格式。并傳入獲得的變量。修改后的內容如下:
[root@open1 bash-4.1]# vim bashhist.c #... 省略部分段落 void bash_syslog_history (line) const char *line; { char trunc[SYSLOG_MAXLEN]; const char *p; p = getenv("NAME_OF_KEY"); if (strlen(line) < SYSLOG_MAXLEN) syslog (SYSLOG_FACILITY|SYSLOG_LEVEL, "HISTORY: PID=%d PPID=%d SID=%d User=%s USER=%s CMD=%s", getpid(), getppid(), getsid(getpid()), current_user.user_name, p, line); else { strncpy (trunc, line, SYSLOG_MAXLEN); trunc[SYSLOG_MAXLEN - 1] = ' '; syslog (SYSLOG_FACILITY|SYSLOG_LEVEL, "HISTORY (TRUNCATED): PID=%d PPID=%d SID=%d User=%s USER=%s CMD=%s", getpid(), getppid(), getsid(getpid()), current_user.user_name, p, trunc); } }
3.4 配置安裝路徑,編譯安裝,編譯到/usr/local/目錄下。
[root@open1 bash-4.1]# ./configure --prefix=/usr/local/bash_new [root@open1 bash-4.1]# make && make install...if test "bash" = "gettext-tools"; then \ /bin/sh /root/bash-4.1/./support/mkinstalldirs /usr/local/bash_new/share/gettext/po; \ for file in Makefile.in.in remove-potcdate.sin quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot Makevars.template; do \ /usr/bin/install -c -m 644 ./$file \ /usr/local/bash_new/share/gettext/po/$file; \ done; \ for file in Makevars; do \ rm -f /usr/local/bash_new/share/gettext/po/$file; \ done; \ else \ : ; \ fimake[1]: Leaving directory `/root/bash-4.1/po'
編譯完成后,將新的bash 追加到 /etc/shells 中,并修改root用戶的登陸shell 環境為新編譯的shell。如下
[root@open1 bash-4.1]# echo "/usr/local/bash_new/bin/bash" >> /etc/shells [root@open1 bash-4.1]# cat /etc/shells /bin/sh/bin/bash /sbin/nologin /bin/dash /usr/local/bash_new/bin/bash
[root@open1 bash-4.1]# vim /etc/passwdroot:x:0:0:root:/root:/usr/local/bash_new/bin/bash
注銷當前root用戶,重新登陸后,查看/var/log/messages,如下就可以看到記錄了操作命令
四、SSH客戶端生成密鑰部分
4.1 在client1上(192.168.30.99)操作,用戶zhangsan
View Code
-t 加密算法
-C 注釋 (加上這個也是為了最后進行對服務器訪問人員進行辨別的一個關鍵點)
將公鑰上傳到服務器上的.ssh/authorized_keys 文件中。ssh-copy-id 命令會自動在服務器上創建.ssh/authorized_keys文件,即使該目錄不存在,并自動賦予600權限。
[root@rsyslog ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.30.72root@192.168.30.72's password:Now try logging into the machine, with "ssh 'root@192.168.30.72'", and check in: .ssh/authorized_keys to make sure we haven't added extra keys that you weren't expecting.
4.3 client 2(192.168.30.71) 上同樣的操作,用戶lisi
View Code
上傳公鑰到服務器上
[root@swift3 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.30.72The authenticity of host '192.168.30.72 (192.168.30.72)' can't be established.RSA key fingerprint is 8f:a7:1b:8d:e4:92:ad:ae:ea:1b:fb:67:0b:0b:7c:ac. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.30.72' (RSA) to the list of known hosts. root@192.168.30.72's password:Now try logging into the machine, with "ssh 'root@192.168.30.72'", and check in: .ssh/authorized_keys to make sure we haven't added extra keys that you weren't expecting.
4.4 現在去服務器上驗證下該文件。
View Code
現在上面兩個客戶端已經可以免密鑰登陸了,現在去服務器上配置,并創建腳本。
五、配置服務器
5.1 在log目錄下創建一個 keys 文件,用于登陸時存進去公鑰,之后對其進行取出判斷的
[root@open1 ~]# touch /var/log/keys
創建檢測腳本,內容如下:
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 用戶登陸操作,無法審計的問題。并且可以結合日志轉發,將系統日志轉發到其它服務器,即使主機被黑了,也能具體的審查登陸時間以及做了哪些操作。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。