赞
踩
第三章 主机安全-Windows&Linux的SSH安全加固
本案例仅实测通过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所有用户可写
[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
参考 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/
# 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
无
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。