千家信息网

Linux 之不同运维人员共用root 账户权限审计

发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,一、为什么?在中小型企业,公司不同运维人员基本都是以root 账户进行服务器的登陆管理,缺少了账户权限审计制度。不出问题还好,出了问题,就很难找出源头。这里介绍下,如何利用编译bash 使不同的客户端
千家信息网最后更新 2025年12月02日Linux 之不同运维人员共用root 账户权限审计

一、为什么?

  在中小型企业,公司不同运维人员基本都是以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#... 省略部分段落voidbash_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_keysto 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)? yesWarning: 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_keysto 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/bashrctest -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 restartStopping sshd:                                             [  OK  ]Starting sshd:                                             [  OK  ]

六、验证

6.1 在client1 上进行登陆,并删除个文件试下(zhangsan)

6.2 在client2 上进行登陆,也删除个文件,并执行个重启服务的命令(lisi)

6.3 去服务器上查看下 messages 日志,内容如下

通过上图,可以看出,不通用户的客户端通过公钥登陆的方式,分辨出了谁操作了什么,什么时候操作的。

(注:上图第4段 swift1 是这台服务器的主机名,由于我只是运行了hostname 命令修改主机名,并没有修改networks,所以内核里还是之前的名字:swift1。)

七、结束

  通过这种方式,极大的解决了多root 用户登陆操作,无法审计的问题。并且可以结合日志转发,将系统日志转发到其它服务器,即使主机被黑了,也能具体的审查登陆时间以及做了哪些操作。


服务 服务器 登陆 文件 用户 编译 内容 命令 客户 客户端 日志 配置 公钥 密钥 主机 目录 系统 问题 不同 人员 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 重庆夏源霖网络技术有限公司 ebsco 全文期刊数据库 暗黑2重制 服务器之间通用 参与网络安全国际合作 校园信息网络安全教案 数据库信息传给博客 烽火通信软件开发在线笔试 构建数据库系统的信息技术 小服务器商可以备案接入吗 网游单机版数据库启动失败 数据库应用技术读书报告 网络安全第5空间下载 郑州市软件开发学校有哪几个 高清办公自动化oa软件开发 赵宏志网络安全 网络安全法 新媒体宣传 u3d是服务器 博兴mes管理软件开发 韩国服务器代理ip 刷步道乐跑服务器 无线网络安全监管哪家值得信赖 科享网络技术有限公司 北京东城区网络安全工程师培训 西交大智能网络与网络安全 网络安全密钥忘了解决图解 车载网络技术主要内容是什么 广东数据库原理与应用专升本试题 数据库双十一 蘑菇服务器被攻击 内蒙古放心软件开发服务检测中心
0