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

摘要:
1、 为什么?在中小企业中,公司不同的运维人员基本都是用root账号登录服务器,缺乏账号权限审核系统。如果没有问题就可以了。如果有问题,很难找到源头。本文描述了如何使用编译后的bash使不同的客户端能够使用root登录到服务器并记录自己的操作,并结合ELK日志分析系统收集登录操作日志。2.环境服务器:centos6.5,开发工具,使用密钥认证,Selinu

一、为什么?

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

  在中小型企业,公司不同运维人员基本都是以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 
          : ; 
        fi
make[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/passwd
root:x:0:0:root:/root:/usr/local/bash_new/bin/bash

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

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

四、SSH客户端生成密钥部分

4.1 在client1上(192.168.30.99)操作,用户zhangsan

Linux 之不同运维人员共用root 账户权限审计第9张 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.72
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.3 client 2(192.168.30.71) 上同样的操作,用户lisi

Linux 之不同运维人员共用root 账户权限审计第9张 View Code

上传公钥到服务器上

复制代码
[root@swift3 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.30.72
The 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 现在去服务器上验证下该文件。

Linux 之不同运维人员共用root 账户权限审计第9张 View Code

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

五、配置服务器

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

[root@open1 ~]# touch /var/log/keys

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

Linux 之不同运维人员共用root 账户权限审计第9张 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)

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

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

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

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

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

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

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

七、结束

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

免责声明:文章转载自《Linux 之不同运维人员共用root 账户权限审计》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇P3391 文艺平衡树(Splay做法)字符串转换成JSON的三种方式下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux NFS服务器的安装与配置(转载)

一、NFS服务简介   NFS 是Network File System的缩写,即网络文件系统。一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布。功能是通过网络让不同的机器、不同的操作系统能够彼此分享个别的数据,让应用程序在客户端通过网络访问位于服务器磁盘中的数据,是在类Unix系统间实现磁盘文件共享的一种方法。   NFS 的基本原...

关于Linux上的SSH服务无法启动,提示“/var/empty/sshd must be owned by root and not group or world-writable”错误

首先通过物理终端进入到linux上,手工检查ssh发现没运行# /etc/init.d/sshd statussshd is stopped 手动启动服务,发现报告权限错误。# /etc/init.d/sshd start Starting sshd:/var/empty/sshd must be owned by root and not group o...

【记录】 iSCSI服务器的搭建与使用[Debian]

序言 更换系统后需要一个网络文件存储用于备份文件,本想用NFS多方便,但是timeshift不支持网络存储,备份路径必须是一个块存储设备, 但是你还必须分好文件系统,这不是多此一举???反正我只用rsync进行同步 于是使用iscsi满足它的需求,因为iscsi连接后获取到的就是一个块存储设备 在配置过程中参考了很多网友写的博客 很有参考价值 非常感谢 《...

linux 下常用查看Apache状态语句

收集linux下查看常用apache状态语句:1、查看Apache的并发请求数及其TCP连接状态:netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'返回结果一般如下:SYN_RECV 28CLOSE_WAIT 1TIME_WAIT 9ESTABLISHED 4LAST_A...

Linux系统扩容根目录磁盘空间的操作方法

一、使用背景 Linux根目录磁盘空间不够用了,当修改了虚拟机模版增加磁盘大小或者插入了一块新硬盘,但是发现系统里的大小还是没改变。 产生的原因是没有给磁盘格式化,没有增加分区。 二、操作方法 1. 查看磁盘空间大小,使用df -h 命令,发现挂载根目录节点的/dev/mapper/ubuntu14--vg-root 只有28G容量。 1 2 3 4...

hello 内核模块

#ifndef __KERNEL__ # define __KERNEL__ #endif #ifndef MODULE # define MODULE #endif #include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h>...