堡垒机登录失败:script命令无法打开日志文件提示权限拒绝
堡垒机会话记录脚本权限报错排查与解决
问题描述
堡垒机登录时执行会话记录脚本,近期出现权限拒绝错误,报错信息如下:
script: cannot open /var/log/ssh-bastion/2024-03-29_06-52-11_username_m8hI1GxwGYd5847vhanBcn9Www1Koq8X.data: Permission denied
会话记录脚本代码:
if [[ -z $SSH_ORIGINAL_COMMAND ]]; then LOG_FILE="`date --date="today" "+%Y-%m-%d_%H-%M-%S"`_`whoami`" LOG_DIR="/var/log/ssh-bastion/" echo "" echo "NOTE: This SSH session will be recorded" echo "AUDIT KEY: $LOG_FILE" echo "" # suffix the log file name with a random string. SUFFIX=`mktemp -u _XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX` script -qf --timing=$LOG_DIR$LOG_FILE$SUFFIX.time $LOG_DIR$LOG_FILE$SUFFIX.data --command=/bin/bash else echo "This bastion supports interactive sessions only. Do not supply a command" exit 1 fi
已知服务此前运行正常,近2天出现问题,且目录和文件权限未发生变更。
排查方向与解决步骤
1. 检查目录磁盘空间
- 执行命令查看磁盘使用情况:
df -h /var/log/ssh-bastion/ - 如果磁盘空间耗尽,系统会将"无法创建文件"误报为权限拒绝。
- 解决:清理该目录下的旧日志文件,或对磁盘进行扩容。
2. 检查目录inode使用情况
- 执行命令查看inode占用:
df -i /var/log/ssh-bastion/ - 若inode耗尽,即使磁盘有剩余空间,也无法创建新文件。
- 解决:删除目录内大量小文件释放inode;或调整文件系统inode配置(操作前需备份数据,重启挂载生效)。
3. 验证安全模块限制(SELinux/AppArmor)
- SELinux检查:执行
getenforce查看状态,若为Enforcing模式,查看审计日志:grep ssh-bastion /var/log/audit/audit.log,确认是否有SELinux阻止文件创建的记录。- 临时测试:执行
setenforce 0关闭SELinux,若恢复正常,需添加SELinux规则允许用户在该目录创建文件,或调整目录上下文:chcon -R -t ssh_home_t /var/log/ssh-bastion/(根据实际需求选择合适上下文)。
- 临时测试:执行
- AppArmor检查:查看
script命令的AppArmor配置文件,确认是否限制了其写入权限。
4. 确认用户磁盘配额
- 登录堡垒机后,执行
id查看当前用户UID/GID,再执行touch /var/log/ssh-bastion/test_file手动测试创建文件。 - 若手动创建也失败,执行
quota -u $(whoami)检查用户是否超出磁盘配额。 - 解决:调整用户磁盘配额,或清理用户名下文件释放空间。
5. 修复脚本变量特殊字符问题
- 执行
whoami查看输出是否包含特殊字符,若存在会导致文件名非法,间接引发权限问题。 - 修改脚本,对
LOG_FILE变量过滤特殊字符:
LOG_FILE="`date --date="today" "+%Y-%m-%d_%H-%M-%S"`_`whoami | sed 's/[^a-zA-Z0-9_.-]//g'`"
内容的提问来源于stack exchange,提问作者Vanaan
相关产品推荐
相关产品推荐

