千家信息网

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

发表于:2025-01-24 作者:千家信息网编辑
千家信息网最后更新 2025年01月24日,一、为什么?在中小型企业,公司不同运维人员基本都是以root 账户进行服务器的登陆管理,缺少了账户权限审计制度。不出问题还好,出了问题,就很难找出源头。这里介绍下,如何利用编译bash 使不同的客户端
千家信息网最后更新 2025年01月24日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安全错误 数据库的锁怎样保障安全 和利时实时数据库名称 上市公司服务器淘汰 数据库关键字with是什么 方舟手机服务器管理 数据库 sql 备注 英雄联盟服务器崩了什么时候能好 国外对网络安全的发展状况 大连戴尔服务器 xampp 数据库配置 上海工程技术大学数据库原理 从数据库获得图片的路径 最新癌症中心发布数据库 测绘软件开发与应用课程 德温特数据库包含哪些国家 两个系统可以共用一个数据库吗 生活中需要注意的网络安全问题 关于网络安全应该怎么做 养女小说软件开发 快宝网络技术有限公司招聘 数据库只搜索最近信息 数据库 是一个软件开发公司英文翻译 高效办理的重庆服务器托管 经济金融数据库管理制度 玩家儿网络技术有限公司 数据库最大的特点是什么意思 数据库界面管理工具 网络安全法数据安全操作规程 南昌软件开发外包公司 计算机网络技术安全运维方向
0