Linux运维人员共用root帐户权限审计

简介:

在中小型企业,公司不同运维人员基本都是以root 账户进行服务器的登陆管理,缺少了账户权限审计制度。不出问题还好,出了问题,就很难找出源头。

这里介绍下,如何利用编译bash 使不同的客户端在使用root 登陆服务器使,记录各自的操作,并且可以在结合ELK 日志分析系统,来收集登陆操作日志

服务端:

1、下载编译bash

wget http://ftp.gnu.org/gnu/bash/bash-4.4.tar.gz

tar -xvf bash-4.4.tar.gz

cd /root/bash-4.4

2、 先修改下config-top.h 大概在103,116行附近 (取消注释) 由于c 语言中 注释是/**/ ,所以不要删除错了。修改如下:

#define SSH_SOURCE_BASHRC

#define SYSLOG_HISTORY

3 修改下bashhist.c 文件,让终端上的命令记录到系统messages 中,并且以指定的格式。并传入获得的变量。修改后的内容如下:

wKioL1gofODTzqK5AABR2v_9i6A501.png代码如下:

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] = ' ';    #必须要有空格,不能为空,否则make 时会报错。

      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);

    }

}

4 配置安装路径,编译安装,编译到/usr/local/目录下

./configure --prefix=/usr/local/bash4-4/

make && make install

5、编译完成后,将新的bash 追加到 /etc/shells 中,并修改root用户的登陆shell 环境为新编译的shell

wKiom1glnL6g68GjAAAJDq4Yiwo990.png

设置root 登录shell

wKioL1glnP3iZTloAAAHsaMXWRE705.png

6、注销当前root用户,重新登陆后,查看/var/log/messages,如下就可以看到记录了操作命令

wKioL1goggnzcqiwAABfo2KDV-s477.jpg

在客户端1:

ssh-keygen -t rsa -C "rhel-testuser1" 生成key -C 注释 (加上这个也是为了最后进行对服务器访问人员进行辨别的一个关键点)

将公钥上传到服务器上的.ssh/authorized_keys 文件中。ssh-copy-id 命令会自动在服务器上创建.ssh/authorized_keys文件,即使该目录不存在,并自动赋予600权限。

ssh-copy-id 192.168.72.135 (-i 可以指定key)

在客户端2:

与客户端1一样

ssh-keygen -t rsa -C "rhel7-testuser2"

ssh-copy-id 192.168.72.135

现在去服务器上验证下该文件

wKioL1gofu-CPGFTAABWk4vlgac782.png

服务端配置:

现在上面两个客户端已经可以免密钥登陆了,现在去服务器上配置,并创建脚本

在log目录下创建一个 keys 文件,用于登陆时存进去公钥,之后对其进行取出判断的

touch /var/log/keys

创建检测脚本,内容如下:

cat /etc/CheckUser.sh

#!/usr/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

配置 profile,在文件末尾添加一行内容,如下:

echo "test -f /etc/CheckUser.sh && . /etc/CheckUser.sh" >> /etc/profile

在/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;}

修改sshd 配置文件,开启debug 模式,并重启sshd服务(必须是这个模式,否则不会显示key所描述的内容,也就是USER=后面的那段不显示)

sed -i 's/#LogLevel INFO/LogLevel DEBUG/g' /etc/ssh/sshd_config

systemctl restart sshd    

验证:

tail -f /var/log/messages

wKioL1gogYTTKQeMAAARZt2FFtw995.png

最后说明一下:

在服务端做完后可能会有按ctrl+L不管用的情况

在/etc/profile 中添加以下一行即可

bind -x '"\C-l": clear'

source /etc/profile

回车没换行的在/etc/bashrc 文件中添加一段,如下:

PS1=``\s-\v\$ ''    或者 PS1='[\u@\h \W]\$ '

source /etc/bashrc      详情见man bash 搜索ps1



本文转自 a120518129 51CTO博客,原文链接:http://blog.51cto.com/silencezone/1871914,如需转载请自行联系原作者

相关文章
|
21天前
|
运维 监控 网络协议
|
7天前
|
缓存 运维 监控
【运维必备知识】Linux系统平均负载与top、uptime命令详解
系统平均负载是衡量Linux服务器性能的关键指标之一。通过使用 `top`和 `uptime`命令,可以实时监控系统的负载情况,帮助运维人员及时发现并解决潜在问题。理解这些工具的输出和意义是确保系统稳定运行的基础。希望本文对Linux系统平均负载及相关命令的详细解析能帮助您更好地进行系统运维和性能优化。
24 3
|
1月前
|
存储 运维 搜索推荐
|
1月前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
35 1
|
1月前
|
运维 网络协议 安全
Linux安全运维--一篇文章全部搞懂iptables
Linux安全运维--一篇文章全部搞懂iptables
41 1
|
1月前
|
Web App开发 运维 安全
1Panel:一个现代化、开源的 Linux 服务器运维管理面板
1Panel:一个现代化、开源的 Linux 服务器运维管理面板
|
2月前
|
运维 监控 Linux
深入理解Linux系统运维:命令行工具的力量
【9月更文挑战第14天】在Linux的世界里,命令行工具是系统管理员的瑞士军刀。本文将带你领略命令行的魅力,从基础操作到高级技巧,让你的运维工作更加高效和精准。准备好了吗?让我们一起开启这段探索之旅!
|
3月前
|
图形学 开发者 存储
超越基础教程:深度拆解Unity地形编辑器的每一个隐藏角落,让你的游戏世界既浩瀚无垠又细节满满——从新手到高手的全面技巧升级秘籍
【8月更文挑战第31天】Unity地形编辑器是游戏开发中的重要工具,可快速创建复杂多变的游戏环境。本文通过比较不同地形编辑技术,详细介绍如何利用其功能构建广阔且精细的游戏世界,并提供具体示例代码,展示从基础地形绘制到植被与纹理添加的全过程。通过学习这些技巧,开发者能显著提升游戏画面质量和玩家体验。
147 3
|
2月前
|
消息中间件 运维 Linux
linux之centos运维kafka
linux之centos运维kafka
|
3月前
|
安全 关系型数据库 MySQL
在Linux中,如何重置 mysql root 密码?
在Linux中,如何重置 mysql root 密码?