博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux运维人员共用root帐户权限审计
阅读量:5889 次
发布时间:2019-06-19

本文共 3535 字,大约阅读时间需要 11 分钟。

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

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

服务端:

1、下载编译bash

wget

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 中,并且以指定的格式。并传入获得的变量。修改后的内容如下:

代码如下:

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

设置root 登录shell

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

在客户端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

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

服务端配置:

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

在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

最后说明一下:

在服务端做完后可能会有按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

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

a120518129

你可能感兴趣的文章
iOS8中定位服务的变化(CLLocationManager协议方法不响应,无法回掉GPS方法,不出现获取权限提示)...
查看>>
BeanUtils\DBUtils
查看>>
Recover the String
查看>>
VC 创建托盘,托盘tooltip。右键托盘菜单,点击别的地方会隐藏掉的问题。
查看>>
11 种在大多数教程中找不到的JavaScript技巧
查看>>
第一天,新的定义
查看>>
WPF EventSetter Handler Command
查看>>
polya定理,环形涂色
查看>>
day4-装饰器前奏
查看>>
【Jest】笔记三:全局变量
查看>>
forward和redirect的区别
查看>>
基本数据类型
查看>>
使用JavaMail完成邮件的编写
查看>>
洛谷P1576 最小花费
查看>>
封装了一个类,可生成验证码,缩略图,及水印图
查看>>
NewSQL为何使传统关系数据库黯然失色?
查看>>
文件服务器 之 Debian下pureftpd的安装心得
查看>>
第一阶段项目总结
查看>>
Java集合详解
查看>>
myeclilpse打开文件所在位置的图标消失后的找回方法
查看>>