Files
2025-12-30 15:31:20 +08:00

393 lines
16 KiB
YAML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
metadata:
version: "2.0"
description: "会话安全配置检查项"
checks:
# 2.7 登录超时时间
- id: "login_timeout"
category: "会话安全"
title: "登录超时设置"
description: "设置命令行界面登录超时时间不超过1800秒(30分钟)"
tags: ["low", "medium", "high", "session"]
check_script: |
# 使用 || true 避免grep未找到匹配时导致脚本退出(set -e模式下)
timeout=$(grep "^TMOUT" /etc/profile 2>/dev/null | awk -F= '{print $2}' | tr -d ' ' || true)
if [ -z "$timeout" ]; then
echo "FAIL: 未设置登录超时"
echo "建议: 在/etc/profile中添加'TMOUT=1800'"
exit 1
elif [ "$timeout" -le 1800 ]; then
echo "PASS: 登录超时设置为${timeout}秒,符合要求"
exit 0
else
echo "FAIL: 登录超时设置为${timeout}秒,超过1800秒限制"
echo "建议: 修改/etc/profile中TMOUT值为1800或更小"
exit 1
fi
fix_script: |
if ! grep -q "^TMOUT" /etc/profile; then
echo "# 设置登录超时时间为1800秒(30分钟)" >> /etc/profile
echo "TMOUT=1800" >> /etc/profile
echo "readonly TMOUT" >> /etc/profile
echo "export TMOUT" >> /etc/profile
else
sed -i '/^TMOUT/d' /etc/profile
sed -i '/^readonly TMOUT/d' /etc/profile
sed -i '/^export TMOUT/d' /etc/profile
echo "TMOUT=1800" >> /etc/profile
echo "readonly TMOUT" >> /etc/profile
echo "export TMOUT" >> /etc/profile
fi
source /etc/profile
echo "已设置登录超时时间为1800秒"
# 4.1 配置history时间戳,便于审计
# 要求:为history命令配置时间戳功能,使日志中清晰记录每条命令的执行时间,便于追溯用户操作行为、排查安全事件
- id: "history_timestamp"
category: "日志审计"
title: "配置history时间戳"
description: "为history命令配置时间戳功能,使日志中清晰记录每条命令的执行时间,便于追溯用户操作行为、排查安全事件"
tags: ["low", "medium", "high", "audit", "log"]
check_script: |
# 检查history时间戳配置
# 要求:HISTTIMEFORMAT环境变量必须配置,格式应为"%F %T "(年-月-日 时:分:秒)
# 使用 || true 避免命令失败时导致脚本退出(set -e模式下)
# 检查当前shell的HISTTIMEFORMAT配置
current_format=$(echo "$HISTTIMEFORMAT" 2>/dev/null || echo "")
# 检查系统全局配置文件
bashrc_format=$(grep -E "^export HISTTIMEFORMAT=" /etc/bashrc 2>/dev/null | head -1 | sed 's/.*HISTTIMEFORMAT="\([^"]*\)".*/\1/' || echo "")
profile_format=$(grep -E "^export HISTTIMEFORMAT=" /etc/profile 2>/dev/null | head -1 | sed 's/.*HISTTIMEFORMAT="\([^"]*\)".*/\1/' || echo "")
# 检查配置文件是否存在配置
bashrc_configured=false
profile_configured=false
if grep -qE "^export HISTTIMEFORMAT=" /etc/bashrc 2>/dev/null || true; then
bashrc_configured=true
fi
if grep -qE "^export HISTTIMEFORMAT=" /etc/profile 2>/dev/null || true; then
profile_configured=true
fi
# 判断是否符合要求
# 标准格式应为 "%F %T " 或包含日期和时间的格式
expected_format="%F %T "
format_ok=false
config_ok=false
# 检查格式是否正确(允许包含%F和%T的格式)
if [ -n "$current_format" ]; then
if echo "$current_format" | grep -qE "%F.*%T|%T.*%F"; then
format_ok=true
fi
elif [ -n "$bashrc_format" ]; then
if echo "$bashrc_format" | grep -qE "%F.*%T|%T.*%F"; then
format_ok=true
fi
elif [ -n "$profile_format" ]; then
if echo "$profile_format" | grep -qE "%F.*%T|%T.*%F"; then
format_ok=true
fi
fi
# 检查是否在配置文件中配置(至少在一个文件中配置)
if [ "$bashrc_configured" = true ] || [ "$profile_configured" = true ]; then
config_ok=true
fi
# 输出检查结果
echo "检查history时间戳配置:"
echo ""
if [ -n "$current_format" ]; then
echo "当前HISTTIMEFORMAT环境变量: $current_format"
else
echo "当前HISTTIMEFORMAT环境变量: 未设置"
fi
echo ""
echo "系统配置文件检查:"
if [ "$bashrc_configured" = true ]; then
echo " /etc/bashrc: 已配置 (格式: $bashrc_format)"
else
echo " /etc/bashrc: 未配置"
fi
if [ "$profile_configured" = true ]; then
echo " /etc/profile: 已配置 (格式: $profile_format)"
else
echo " /etc/profile: 未配置"
fi
echo ""
# 综合判断
if [ "$format_ok" = true ] && [ "$config_ok" = true ]; then
echo "PASS: history时间戳配置符合要求"
echo ""
echo "建议: 为确保所有用户生效,建议同时在/etc/bashrc和/etc/profile中配置"
echo " 可同时配置HISTSIZE和HISTFILESIZE以增强审计效果"
exit 0
elif [ "$format_ok" = true ] && [ "$config_ok" = false ]; then
echo "FAIL: history时间戳格式正确,但未在系统全局配置文件中配置"
echo ""
echo "建议: 在/etc/bashrc和/etc/profile中添加以下配置:"
echo " export HISTTIMEFORMAT=\"%F %T \""
echo " export HISTSIZE=10000"
echo " export HISTFILESIZE=10000"
exit 1
elif [ "$format_ok" = false ] && [ "$config_ok" = true ]; then
echo "FAIL: history时间戳已在配置文件中配置,但格式不正确"
echo ""
echo "当前配置格式: $bashrc_format$profile_format"
echo "建议格式: %F %T %F表示日期,%T表示时间)"
echo ""
echo "修复建议: 编辑/etc/bashrc和/etc/profile,修改HISTTIMEFORMAT配置为:"
echo " export HISTTIMEFORMAT=\"%F %T \""
exit 1
else
echo "FAIL: 未配置history时间戳"
echo ""
echo "建议: 在/etc/bashrc和/etc/profile中添加以下配置:"
echo " export HISTTIMEFORMAT=\"%F %T \""
echo " export HISTSIZE=10000"
echo " export HISTFILESIZE=10000"
echo ""
echo "配置后执行以下命令使配置立即生效:"
echo " source /etc/bashrc"
echo " source /etc/profile"
exit 1
fi
fix_script: |
echo "此问题需要人工干预,请根据检查结果执行以下操作:"
echo ""
echo "1. 编辑系统全局bash配置文件: vi /etc/bashrc"
echo " 在文件末尾添加以下内容:"
echo " export HISTTIMEFORMAT=\"%F %T \""
echo " export HISTSIZE=10000"
echo " export HISTFILESIZE=10000"
echo ""
echo "2. 编辑系统全局配置文件: vi /etc/profile"
echo " 在文件末尾添加以下内容:"
echo " export HISTTIMEFORMAT=\"%F %T \""
echo " export HISTSIZE=10000"
echo " export HISTFILESIZE=10000"
echo ""
echo "3. 保存文件后,执行以下命令使配置立即生效:"
echo " source /etc/bashrc"
echo " source /etc/profile"
echo ""
echo "4. 验证配置:"
echo " echo \$HISTTIMEFORMAT"
echo " history 10 # 查看是否包含时间戳"
echo ""
echo "说明:"
echo " - HISTTIMEFORMAT=\"%F %T \" 配置时间戳格式为'年-月-日 时:分:秒 '"
echo " - HISTSIZE=10000 记录最近10000条命令"
echo " - HISTFILESIZE=10000 历史文件保存10000条命令"
exit 1
# 4.2 开启安全日志记录功能
# 要求:必须开启系统安全日志记录功能,通过syslog服务(如rsyslog)捕获发送给AUTHPRIV Facility的消息,包括用户登录、权限变更、密码修改等关键安全事件,并将其记录至/var/log/secure日志文件中
- id: "security_log_recording"
category: "日志审计"
title: "开启安全日志记录功能"
description: "必须开启系统安全日志记录功能,通过syslog服务(如rsyslog)捕获发送给AUTHPRIV Facility的消息,包括用户登录、权限变更、密码修改等关键安全事件,并将其记录至/var/log/secure日志文件中,为安全审计和事件追溯提供依据"
tags: ["low", "medium", "high", "audit", "log"]
check_script: |
# 检查rsyslog安全日志记录功能
# 要求:rsyslog配置文件中必须包含 authpriv.* /var/log/secure 配置
# 使用 || true 避免命令失败时导致脚本退出(set -e模式下)
config_ok=false
log_file_ok=false
service_ok=false
# 检查rsyslog配置文件
rsyslog_conf="/etc/rsyslog.conf"
config_found=false
config_correct=false
config_line=""
# 检查主配置文件
if [ -f "$rsyslog_conf" ]; then
# 查找authpriv配置行(排除注释和none配置)
authpriv_lines=$(grep -E "^[^#]*authpriv" "$rsyslog_conf" 2>/dev/null | grep -v "authpriv.none" || true)
if [ -n "$authpriv_lines" ]; then
config_found=true
# 检查是否包含 /var/log/secure
if echo "$authpriv_lines" | grep -qE "authpriv\.\*\s+/var/log/secure"; then
config_correct=true
config_line=$(echo "$authpriv_lines" | grep -E "authpriv\.\*\s+/var/log/secure" | head -1 | tr -s ' ' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
fi
fi
# 也检查include的配置文件
if [ "$config_correct" = false ]; then
include_files=$(grep -E "^\\$IncludeConfig|^include" "$rsyslog_conf" 2>/dev/null | awk '{print $2}' || true)
for include_file in $include_files; do
if [ -f "$include_file" ]; then
authpriv_lines=$(grep -E "^[^#]*authpriv" "$include_file" 2>/dev/null | grep -v "authpriv.none" || true)
if [ -n "$authpriv_lines" ]; then
config_found=true
if echo "$authpriv_lines" | grep -qE "authpriv\.\*\s+/var/log/secure"; then
config_correct=true
config_line=$(echo "$authpriv_lines" | grep -E "authpriv\.\*\s+/var/log/secure" | head -1 | tr -s ' ' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
break
fi
fi
fi
done
fi
else
echo "WARN: rsyslog配置文件 $rsyslog_conf 不存在"
fi
# 检查安全日志文件
secure_log="/var/log/secure"
if [ -f "$secure_log" ]; then
log_file_ok=true
# 检查文件是否有内容(至少大于0字节)
if [ -s "$secure_log" ]; then
log_file_ok=true
else
log_file_ok=false
fi
else
log_file_ok=false
fi
# 检查rsyslog服务状态
if command -v systemctl >/dev/null 2>&1; then
if systemctl is-active rsyslog >/dev/null 2>&1; then
service_ok=true
else
service_ok=false
fi
elif command -v service >/dev/null 2>&1; then
if service rsyslog status >/dev/null 2>&1; then
service_ok=true
else
service_ok=false
fi
else
# 无法检查服务状态,假设服务正常
service_ok=true
fi
# 输出检查结果
echo "检查安全日志记录功能:"
echo ""
echo "1. rsyslog配置检查:"
if [ "$config_correct" = true ]; then
echo " 配置状态: 已正确配置"
if [ -n "$config_line" ]; then
echo " 配置内容: $config_line"
fi
config_ok=true
elif [ "$config_found" = true ]; then
echo " 配置状态: 已配置但路径不正确"
echo " 当前配置: $authpriv_lines"
echo " 要求配置: authpriv.* /var/log/secure"
config_ok=false
else
echo " 配置状态: 未配置"
echo " 要求配置: authpriv.* /var/log/secure"
config_ok=false
fi
echo ""
echo "2. 安全日志文件检查:"
if [ "$log_file_ok" = true ]; then
log_size=$(stat -c "%s" "$secure_log" 2>/dev/null || echo "0")
log_mtime=$(stat -c "%y" "$secure_log" 2>/dev/null || echo "未知")
echo " 文件状态: 存在且有内容"
echo " 文件大小: ${log_size} 字节"
echo " 最后修改: $log_mtime"
else
echo " 文件状态: 不存在或为空"
echo " 文件路径: $secure_log"
fi
echo ""
echo "3. rsyslog服务状态:"
if [ "$service_ok" = true ]; then
echo " 服务状态: 运行中"
else
echo " 服务状态: 未运行"
fi
echo ""
# 综合判断
if [ "$config_ok" = true ] && [ "$log_file_ok" = true ] && [ "$service_ok" = true ]; then
echo "PASS: 安全日志记录功能已正确开启"
echo ""
echo "建议: 确保rsyslog服务开机自启: systemctl enable rsyslog"
exit 0
elif [ "$config_ok" = true ] && [ "$service_ok" = true ] && [ "$log_file_ok" = false ]; then
echo "FAIL: rsyslog配置正确但安全日志文件不存在或为空"
echo ""
echo "可能原因:"
echo " 1. 服务刚启动,尚未有日志记录"
echo " 2. 日志文件路径配置错误"
echo " 3. 文件权限问题导致无法写入"
echo ""
echo "建议: 执行测试操作(如切换用户)后再次检查"
exit 1
elif [ "$config_ok" = false ] && [ "$service_ok" = true ]; then
echo "FAIL: rsyslog服务运行中但未正确配置安全日志记录"
echo ""
echo "建议: 编辑 /etc/rsyslog.conf,添加以下配置:"
echo " authpriv.* /var/log/secure"
echo " 然后重启服务: systemctl restart rsyslog"
exit 1
elif [ "$service_ok" = false ]; then
echo "FAIL: rsyslog服务未运行"
echo ""
echo "建议: 启动rsyslog服务: systemctl start rsyslog"
echo " 设置开机自启: systemctl enable rsyslog"
exit 1
else
echo "FAIL: 安全日志记录功能未正确配置"
echo ""
echo "建议:"
echo " 1. 编辑 /etc/rsyslog.conf,添加: authpriv.* /var/log/secure"
echo " 2. 启动rsyslog服务: systemctl start rsyslog"
echo " 3. 设置开机自启: systemctl enable rsyslog"
exit 1
fi
fix_script: |
echo "此问题需要人工干预,请根据检查结果执行以下操作:"
echo ""
echo "1. 编辑rsyslog配置文件: vi /etc/rsyslog.conf"
echo " 在文件中添加或修改以下配置项:"
echo " authpriv.* /var/log/secure"
echo ""
echo "2. 保存文件后,重启rsyslog服务使配置生效:"
echo " systemctl restart rsyslog"
echo ""
echo "3. 设置rsyslog服务开机自启:"
echo " systemctl enable rsyslog"
echo ""
echo "4. 验证配置效果:"
echo " grep -E 'authpriv.*' /etc/rsyslog.conf"
echo " systemctl status rsyslog"
echo " ls -l /var/log/secure"
echo ""
echo "5. 测试日志记录(可选):"
echo " su - testuser # 切换用户"
echo " tail -f /var/log/secure # 查看日志记录"
echo ""
echo "说明:"
echo " - authpriv.* 表示捕获所有AUTHPRIV Facility的消息"
echo " - /var/log/secure 是安全日志文件的存储路径"
echo " - AUTHPRIV Facility用于记录用户登录、权限变更、密码修改等关键安全事件"
exit 1