当前位置:   article > 正文

安全审计-Linux用户命令全审计_linux 安全审计命令

linux 安全审计命令

信息安全相关 - 建设篇


系列文章回顾

第一章 传输安全-LDAP协议安全加固



下章内容

第三章 主机安全-Windows&Linux的SSH安全加固


安全审计-Linux 用户命令全审计

前言

本案例仅实测通过CentOS 7.5-7.9系列,其他Linux系列及版本未实测。

1. CentOS版本:7.5  ≤  version  ≤  7.9


实施步骤

1. 本地修改环境变量PROMPT_COMMAND
2. 审计命令定时上传到SFTP
3. SFTP服务端接收审计命令
4. 测试审计、测试SFTP接收审计命令


本地修改环境变量文件

### 修改环境变量文件
# 案例1 ----- 来自 https://www.jianshu.com/p/b4dc3e6f856e
[root@localhost ~]# vim /etc/bashrc
...
readonly PROMPT_COMMAND='{ date "+%Y-%m-%d %T # $(who am i |awk "{print \$2,\$5}") $(whoami):[$PWD]# $(history 1 | { read x cmd; echo ${cmd}; })"; } | logger -p local6.info'

## 配置后在下一次登录开始即生效,但由于local6.info日志级别默认自带了时间参数,即加上上述添加的参数会导致日志记录看起来比较冗余,审计日志如下。
Dec XX 00:00:00 localhost root: 20XX-XX-XX 00:00:00 # pts/0 (x.x.x.x) root:[/root]# cat /var/log/auditlog

## 优化点: 去掉date和whoami,改用echo输出到info日志。优化后前置执行命令如下。
# 案例2
[root@localhost ~]# vim /etc/bashrc
...
readonly PROMPT_COMMAND='{ echo $(date "+%F %T") $(who am i |awk "{print \$2,\$5}") [$PWD]# $(history 1 | { read x cmd; echo ${cmd}; }); } | logger -p local6.info'
-----------------------------------------------------------------------
# 上述方法是以记录local6.info级别日志的形式将用户命令全审计到auditlog日志,并使用Logrotate将日志切割。
# 考虑到local6.info级别日志可能会参杂其他info日志,并且后续关乎业务系统的info也会源源不断地加载到info日志。
# 将命令全审计利用echo输出到文件。由于~/.bash_logout脚本只会在用户执行exit或者退出时生效,堡垒机的重复连接属于复用SSH连接,并不会触发~/.bash_logout文件。
# 使用crond定时任务将全审计的audit日志定期同步到SFTP服务端,同步传输成功后将本地的audit日志清空,防止被利用。
# 在同步传输前会做一次PING检测,如果PING失败将保留本次日志。
# 此操作流程,基本只要保障SFTP服务端与Linux客户端的通信是正常的即可,即局域网内传输不会有传输失败的情况出现。


### 完整实施
[root@localhost ~]# vim /etc/bashrc		# 编辑全局环境变量文件
...
_LOGIN_PTS=`who am i 2>/dev/null | awk '{print $2}'`
if [ "$(echo ${_LOGIN_PTS} | cut -c 1-3)" = "tty" ]; then
        _LOGIN_IP=tty
else
        _LOGIN_IP=`w -hio 2>/dev/null | grep $_LOGIN_PTS | awk '{print $3}'`
fi
readonly PROMPT_COMMAND='{ echo $(date "+%F %T") $_LOGIN_PTS PID:$$ SIP:$_LOGIN_IP $(whoami):[$PWD]# $(history 1 | { read x cmd; echo ${cmd}; }); } >>/var/log/command_audit'
:x

[root@localhost ~]# touch /var/log/command_audit			# 创建command_audit文件
[root@localhost ~]# chmod 622 /var/log/command_audit		# command_audit所有用户可写
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

审计命令定时上传到SFTP

[root@localhost ~]# crontab -l			# 查看当前用户的定时任务

[root@localhost ~]# vim /etc/crontab	# 编辑全局的crontab任务. 设置每天的1点和13点执行一次upload_audit.sh脚本
...
0 1,13 * * * root source /opt/cron.d/upload_audit.sh >/dev/null
:x

[root@localhost ~]# mkdir /opt/cron.d/						# 创建存放脚本的目录
[root@localhost ~]# chmod 700 /opt/cron.d/					# cron.d目录仅root可读写执行
[root@localhost ~]# touch /opt/cron.d/upload_audit.sh		# 创建定时上传的脚本文件
[root@localhost ~]# chmod 600 /opt/cron.d/upload_audit.sh	# upload_audit.sh仅root可读写

[root@localhost ~]# vim /opt/cron.d/upload_audit.sh			# 编写定时上传脚本
#!/bin/bash
ping -c2 -i0.2 -W1 sftp.domain.com 2>&1>/dev/null
if [ $? -eq 0 ]; then
        # Start upload command_audit. Upload every 12 hours
        _HOST_IP=`ifconfig | grep -A 1 ens192 | grep inet | awk '{print $2}'`
        _HOST_AUTHKEY=/etc/ssh/host.d/audit_keys/upload_audit_sftp_key
        _HOST_AUDITFILE=command_audit
        _HOST_SRCDIR=/var/log
        _SFTP_USERNAME=upaudit
        _SFTP_HOSTNAME=sftp.domain.com
        _SFTP_PORT=22
        _SFTP_DESDIR=/linux_command/${_HOST_IP}
        if [ $(date +%H) -lt 12 ]; then
          _UPLOAD_TIME_YMD=`date "+%F" -d '-1 day'`
          _AUDIT_TIMES=2-$(date +%T | tr -d ':')
        else
          _UPLOAD_TIME_YMD=`date "+%F"`
          _AUDIT_TIMES=1-$(date +%T | tr -d ':')
        fi
sftp -i ${_HOST_AUTHKEY} -P ${_SFTP_PORT} ${_SFTP_USERNAME}@${_SFTP_HOSTNAME} <<EOF
lcd ${_HOST_SRCDIR}
cd ${_SFTP_DESDIR}
put ${_HOST_AUDITFILE} audit_${_UPLOAD_TIME_YMD}_${_AUDIT_TIMES}
bye
EOF
true >${_HOST_SRCDIR}/${_HOST_AUDITFILE}
else
        # Keep back command_audit
        echo $(date "+%F %T"): fail upload audit file. PID: $$. UserInfo:$(who am i | awk '{print $1,$2}') >>${_HOST_SRCDIR}/${_HOST_AUDITFILE}
        echo $(date "+%F %T"): fail upload audit file. PID: $$. UserInfo:$(who am i | awk '{print $1,$2}') >>/opt/cron.d/faillog
fi
:x

[root@localhost ~]# mkdir -p /etc/ssh/host.d/audit_keys/	# 创建存放SFTP服务端密钥对的目录
[root@localhost ~]# chmod -R 700 /etc/ssh/host.d/				# host.d目录之下仅root可读写执行
[root@localhost ~]# touch /etc/ssh/host.d/audit_keys/upload_audit_sftp_key		# 创建ssh密钥对
[root@localhost ~]# chmod 600 /etc/ssh/host.d/audit_keys/upload_audit_sftp_key	# ssh密钥对仅root可读写

[root@localhost ~]# vim /etc/ssh/host.d/audit_keys/upload_audit_sftp_key
-----BEGIN RSA PRIVATE KEY-----
......
-----END RSA PRIVATE KEY-----
:x
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56

SFTP服务端接收审计命令

参考 Linux部署SFTP服务 完成SFTP服务端的搭建,以下案例已假设完成搭建SFTP

### ssh用户: upaudit
### audit目录: /Audit-LinuxCmdBak/linux_command/
[root@sftp ~]# cat /etc/ssh/sshd_config | grep -A 7 upaudit
Match User upaudit
        ChrootDirectory /Audit-LinuxCmdBak
        PermitTunnel no
        AllowAgentForwarding no
        AllowTcpForwarding no
        X11Forwarding no
        PermitTTY no
        ForceCommand internal-sftp
[root@sftp ~]# ll /Audit-LinuxCmdBak/.ssh/
-rw------- 1 upaudit ftp 406 Dec 19  2022 authorized_keys

[root@sftp ~]# touch /Audit-LinuxCmdBak/hostname_map	# 创建ip对应域名的映射表, 方便后续溯源
[root@sftp ~]# chmod 600 /Audit-LinuxCmdBak/hostname_map
[root@sftp ~]# vim /Audit-LinuxCmdBak/hostname_map
1.2.3.4	x.domain.com
:x

[root@sftp ~]# mkdir -p /Audit-LinuxCmdBak/linux_command/1.2.3.4/	# 存放Linux客户端审计命令的目录,目录对应IP
[root@sftp ~]# chown -R upaudit:ftp /Audit-LinuxCmdBak/linux_command/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

测试审计、测试SFTP接收审计命令

# Linux客户端测试上传审计命令. 此步骤一定要先执行一遍, 目的是确认保存SFTP服务端的ssh公钥
[root@localhost ~]# source /opt/cron.d/upload_audit.sh
Connected to sftp.domain.com.
sftp> lcd /var/log
sftp> cd /linux_command/1.2.3.4
sftp> put command_audit audit_20XX-XX-XX_2-000000
Uploading command_audit to /linux_command/1.2.3.4/audit_20XX-XX-XX_2-000000
command_audit                                                                     100%  1000    24.6KB/s   00:00    
sftp> bye

# SFTP服务端查看接收的审计命令
[root@sftp ~]# ll /Audit-LinuxCmdBak/linux_command/1.2.3.4/
-rw------- 1 upaudit ftp 1000 Jul XX 00:00 audit_20XX-XX-XX_1-000000
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13


参考来源

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/842462
推荐阅读
相关标签
  

闽ICP备14008679号