Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
为 GitLab 提交贡献
登录
切换导航
U
ubains-module-test
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
1
议题
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
郑晓兵
ubains-module-test
Commits
e900a288
提交
e900a288
authored
1月 13, 2026
作者:
PGY
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
refactor(ScriptTool):增加统信系统的主机漏洞配置扫描和解决方法
上级
1c1e9480
显示空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
1660 行增加
和
0 行删除
+1660
-0
security_check.sh
AuxiliaryTool/ScriptTool/主机漏洞修复(统信系统)/security_check.sh
+550
-0
security_fix.sh
AuxiliaryTool/ScriptTool/主机漏洞修复(统信系统)/security_fix.sh
+698
-0
统信系统漏洞修复_PRD.md
AuxiliaryTool/ScriptTool/主机漏洞修复(统信系统)/统信系统漏洞修复_PRD.md
+412
-0
没有找到文件。
AuxiliaryTool/ScriptTool/主机漏洞修复(统信系统)/security_check.sh
0 → 100644
浏览文件 @
e900a288
#!/bin/bash
# 统信系统安全配置检测脚本
# 功能:检测系统安全配置状态并输出详细日志
# 作者:Security Team
# 日期:$(date +%Y-%m-%d)
# 日志配置
LOG_FILE
=
"/tmp/security_check_
$(
date
+%Y%m%d_%H%M%S
)
.log"
SCRIPT_DIR
=
$(
cd
"
$(
dirname
"
${
BASH_SOURCE
[0]
}
"
)
"
&&
pwd
)
# 日志函数
log
()
{
local
level
=
$1
shift
local
message
=
"
$*
"
local
timestamp
=
$(
date
'+%Y-%m-%d %H:%M:%S'
)
echo
"[
$timestamp
] [
$level
]
$message
"
|
tee
-a
"
$LOG_FILE
"
}
# 初始化检查结果
declare
-A
check_results
# 检查OpenSSH安全配置
check_ssh_security
()
{
log INFO
"开始检查OpenSSH安全配置..."
local
checks
=(
"X11Forwarding=no"
"MaxAuthTries=4"
"IgnoreRhosts=yes"
"HostbasedAuthentication=no"
"PermitEmptyPasswords=no"
"PermitRootLogin=no"
"Protocol=2"
)
local
total_checks
=
${#
checks
[@]
}
local
passed_checks
=
0
for
check
in
"
${
checks
[@]
}
"
;
do
param
=
"
${
check
%=*
}
"
expected
=
"
${
check
#*=
}
"
actual
=
$(
grep
"^
$param
"
/etc/ssh/sshd_config 2>/dev/null |
head
-n1
|
cut
-d
' '
-f2
)
if
[[
"
$actual
"
==
"
$expected
"
]]
;
then
log INFO
" ✓
$param
=
$expected
(当前值:
$actual
)"
((
passed_checks++
))
else
log WARN
" ✗
$param
=
$expected
(当前值:
$actual
)"
fi
done
# 打印当前SSH配置详情,用于说明配置状态
log INFO
" 当前SSH配置详情:"
for
check
in
"
${
checks
[@]
}
"
;
do
param
=
"
${
check
%=*
}
"
grep_result
=
$(
grep
"^
$param
"
/etc/ssh/sshd_config 2>/dev/null |
head
-n1
)
if
[[
-n
"
$grep_result
"
]]
;
then
log INFO
"
$grep_result
"
else
log INFO
"
$param
参数未找到"
fi
done
log INFO
"OpenSSH安全配置检查完成:
$passed_checks
/
$total_checks
项通过"
check_results[
"ssh_security"
]=
"
$passed_checks
/
$total_checks
"
}
# 检查命令行界面超时设置
check_timeout_setting
()
{
log INFO
"开始检查命令行界面超时设置..."
local
tmout_value
=
$(
grep
-E
'^TMOUT='
/etc/profile 2>/dev/null |
cut
-d
'='
-f2
)
local
export_tmout
=
$(
grep
-E
'export TMOUT'
/etc/profile 2>/dev/null
)
if
[[
-n
"
$tmout_value
"
]]
&&
[[
-n
"
$export_tmout
"
]]
&&
[[
"
$tmout_value
"
-le
300
]]
;
then
log INFO
" ✓ TMOUT 设置为
$tmout_value
秒"
check_results[
"timeout_setting"
]=
"1/1"
else
log WARN
" ✗ TMOUT 未正确设置 (当前值:
$tmout_value
)"
check_results[
"timeout_setting"
]=
"0/1"
fi
# 打印当前TMOUT配置详情
log INFO
" 当前TMOUT配置详情:"
tmout_line
=
$(
grep
-E
'^TMOUT=|^export TMOUT'
/etc/profile 2>/dev/null
)
if
[[
-n
"
$tmout_line
"
]]
;
then
while
IFS
=
read
-r
line
;
do
log INFO
"
$line
"
done
<<<
"
$tmout_line
"
else
log INFO
" 未找到TMOUT相关配置"
fi
}
# 检查PAM认证模块配置
check_pam_auth
()
{
log INFO
"开始检查PAM认证模块配置..."
local
auth_lines
=
$(
grep
-E
"auth
\s
+sufficient
\s
+pam_rootok
\.
so|auth
\s
+required
\s
+pam_wheel
\.
so"
/etc/pam.d/su 2>/dev/null |
wc
-l
)
if
[[
$auth_lines
-ge
2
]]
;
then
log INFO
" ✓ PAM认证模块配置正确"
check_results[
"pam_auth"
]=
"1/1"
else
log WARN
" ✗ PAM认证模块配置不正确"
check_results[
"pam_auth"
]=
"0/1"
fi
# 打印当前PAM配置详情
log INFO
" 当前PAM su配置详情:"
pam_lines
=
$(
grep
-E
"auth.*(pam_rootok|pam_wheel)"
/etc/pam.d/su 2>/dev/null
)
if
[[
-n
"
$pam_lines
"
]]
;
then
while
IFS
=
read
-r
line
;
do
log INFO
"
$line
"
done
<<<
"
$pam_lines
"
else
log INFO
" 未找到PAM认证相关配置"
fi
}
# 检查Telnet服务状态
check_telnet_status
()
{
log INFO
"开始检查Telnet服务状态..."
# 检查telnet是否已禁用
local
telnet_disabled
=
$(
grep
-E
"^disable"
/etc/xinetd.d/telnet 2>/dev/null |
grep
-o
"yes"
||
echo
""
)
if
[[
-n
"
$telnet_disabled
"
]]
;
then
log INFO
" ✓ Telnet服务已禁用"
check_results[
"telnet_status"
]=
"1/1"
else
log WARN
" ✗ Telnet服务未禁用"
check_results[
"telnet_status"
]=
"0/1"
fi
# 打印当前Telnet配置详情
log INFO
" 当前Telnet配置详情:"
telnet_conf
=
$(
grep
-E
"^disable"
/etc/xinetd.d/telnet 2>/dev/null
)
if
[[
-n
"
$telnet_conf
"
]]
;
then
log INFO
"
$telnet_conf
"
else
log INFO
" Telnet配置未找到或服务未安装"
fi
}
# 检查SSH服务状态
check_ssh_service
()
{
log INFO
"开始检查SSH服务状态..."
if
systemctl is-active
--quiet
sshd
;
then
log INFO
" ✓ SSH服务正在运行"
check_results[
"ssh_service"
]=
"1/1"
else
log WARN
" ✗ SSH服务未运行"
check_results[
"ssh_service"
]=
"0/1"
fi
# 打印SSH服务状态详情
log INFO
" 当前SSH服务状态:"
ssh_status
=
$(
systemctl is-active sshd 2>/dev/null
)
ssh_enabled
=
$(
systemctl is-enabled sshd 2>/dev/null
)
log INFO
" Active:
$ssh_status
"
log INFO
" Enabled:
$ssh_enabled
"
}
# 检查登录日志记录配置
check_login_logging
()
{
log INFO
"开始检查登录日志记录配置..."
local
secure_log_exists
=
$(
stat
-c
%a /var/log/secure 2>/dev/null |
grep
"^600$"
)
local
rsyslog_conf
=
$(
grep
-E
"authpriv
\.\*
"
/etc/rsyslog.conf 2>/dev/null |
grep
"/var/log/secure"
)
if
[[
-n
"
$secure_log_exists
"
]]
&&
[[
-n
"
$rsyslog_conf
"
]]
;
then
log INFO
" ✓ 登录日志记录配置正确"
check_results[
"login_logging"
]=
"1/1"
else
log WARN
" ✗ 登录日志记录配置不正确"
check_results[
"login_logging"
]=
"0/1"
fi
# 打印当前rsyslog配置详情
log INFO
" 当前rsyslog配置详情:"
rsyslog_lines
=
$(
grep
-E
"authpriv
\.\*
"
/etc/rsyslog.conf 2>/dev/null
)
if
[[
-n
"
$rsyslog_lines
"
]]
;
then
while
IFS
=
read
-r
line
;
do
log INFO
"
$line
"
done
<<<
"
$rsyslog_lines
"
else
log INFO
" 未找到authpriv日志配置"
fi
# 打印secure日志文件权限
secure_perms
=
$(
stat
-c
%a /var/log/secure 2>/dev/null
)
log INFO
" /var/log/secure 权限:
$secure_perms
"
}
# 检查用户目录默认访问权限
check_umask_setting
()
{
log INFO
"开始检查用户目录默认访问权限设置..."
local
umask_value
=
$(
grep
-E
"^umask"
/etc/profile 2>/dev/null |
grep
-o
"[0-9]
\{
3,
\}
"
|
head
-n1
)
if
[[
-n
"
$umask_value
"
]]
&&
[[
"
$umask_value
"
==
"027"
]]
;
then
log INFO
" ✓ umask 设置为
$umask_value
"
check_results[
"umask_setting"
]=
"1/1"
else
log WARN
" ✗ umask 未正确设置 (当前值:
$umask_value
)"
check_results[
"umask_setting"
]=
"0/1"
fi
# 打印当前umask配置详情
log INFO
" 当前umask配置详情:"
umask_line
=
$(
grep
-E
"^umask"
/etc/profile 2>/dev/null
)
if
[[
-n
"
$umask_line
"
]]
;
then
log INFO
"
$umask_line
"
else
log INFO
" 未找到umask配置"
fi
}
# 检查口令过期前警告天数
check_password_warn_age
()
{
log INFO
"开始检查口令过期前警告天数..."
local
warn_age
=
$(
grep
-E
"^PASS_WARN_AGE"
/etc/login.defs 2>/dev/null |
awk
'{print $2}'
)
if
[[
-n
"
$warn_age
"
]]
&&
[[
"
$warn_age
"
-le
7
]]
;
then
log INFO
" ✓ 口令过期前警告天数设置为
$warn_age
天"
check_results[
"password_warn_age"
]=
"1/1"
else
log WARN
" ✗ 口令过期前警告天数未正确设置 (当前值:
$warn_age
)"
check_results[
"password_warn_age"
]=
"0/1"
fi
# 打印当前PASS_WARN_AGE配置详情
log INFO
" 当前PASS_WARN_AGE配置详情:"
warn_age_line
=
$(
grep
-E
"^PASS_WARN_AGE"
/etc/login.defs 2>/dev/null
)
if
[[
-n
"
$warn_age_line
"
]]
;
then
log INFO
"
$warn_age_line
"
else
log INFO
" 未找到PASS_WARN_AGE配置"
fi
}
# 检查密码复杂度策略
check_password_complexity
()
{
log INFO
"开始检查密码复杂度策略..."
local
complexity_rule
=
$(
grep
-E
"pam_cracklib
\.
so"
/etc/pam.d/system-auth 2>/dev/null |
\
grep
-E
"minlen=8.*dcredit=-1.*ucredit=-1.*ocredit=-1.*lcredit=-1"
)
if
[[
-n
"
$complexity_rule
"
]]
;
then
log INFO
" ✓ 密码复杂度策略配置正确"
check_results[
"password_complexity"
]=
"1/1"
else
log WARN
" ✗ 密码复杂度策略配置不正确"
check_results[
"password_complexity"
]=
"0/1"
fi
# 打印当前密码复杂度配置详情
log INFO
" 当前密码复杂度配置详情:"
complexity_lines
=
$(
grep
-E
"pam_cracklib
\.
so"
/etc/pam.d/system-auth 2>/dev/null
)
if
[[
-n
"
$complexity_lines
"
]]
;
then
while
IFS
=
read
-r
line
;
do
log INFO
"
$line
"
done
<<<
"
$complexity_lines
"
else
log INFO
" 未找到pam_cracklib配置"
fi
}
# 检查口令更改最小间隔天数
check_password_min_days
()
{
log INFO
"开始检查口令更改最小间隔天数..."
local
min_days
=
$(
grep
-E
"^PASS_MIN_DAYS"
/etc/login.defs 2>/dev/null |
awk
'{print $2}'
)
if
[[
-n
"
$min_days
"
]]
&&
[[
"
$min_days
"
-ge
7
]]
;
then
log INFO
" ✓ 口令更改最小间隔天数设置为
$min_days
天"
check_results[
"password_min_days"
]=
"1/1"
else
log WARN
" ✗ 口令更改最小间隔天数未正确设置 (当前值:
$min_days
)"
check_results[
"password_min_days"
]=
"0/1"
fi
# 打印当前PASS_MIN_DAYS配置详情
log INFO
" 当前PASS_MIN_DAYS配置详情:"
min_days_line
=
$(
grep
-E
"^PASS_MIN_DAYS"
/etc/login.defs 2>/dev/null
)
if
[[
-n
"
$min_days_line
"
]]
;
then
log INFO
"
$min_days_line
"
else
log INFO
" 未找到PASS_MIN_DAYS配置"
fi
}
# 检查口令生存周期
check_password_max_days
()
{
log INFO
"开始检查口令生存周期..."
local
max_days
=
$(
grep
-E
"^PASS_MAX_DAYS"
/etc/login.defs 2>/dev/null |
awk
'{print $2}'
)
if
[[
-n
"
$max_days
"
]]
&&
[[
"
$max_days
"
-le
90
]]
;
then
log INFO
" ✓ 口令生存周期设置为
$max_days
天"
check_results[
"password_max_days"
]=
"1/1"
else
log WARN
" ✗ 口令生存周期未正确设置 (当前值:
$max_days
)"
check_results[
"password_max_days"
]=
"0/1"
fi
# 打印当前PASS_MAX_DAYS配置详情
log INFO
" 当前PASS_MAX_DAYS配置详情:"
max_days_line
=
$(
grep
-E
"^PASS_MAX_DAYS"
/etc/login.defs 2>/dev/null
)
if
[[
-n
"
$max_days_line
"
]]
;
then
log INFO
"
$max_days_line
"
else
log INFO
" 未找到PASS_MAX_DAYS配置"
fi
}
# 检查重要目录及文件权限
check_critical_permissions
()
{
log INFO
"开始检查重要目录及文件权限..."
local
passwd_perm
=
$(
stat
-c
%a /etc/passwd 2>/dev/null
)
local
shadow_perm
=
$(
stat
-c
%a /etc/shadow 2>/dev/null
)
local
group_perm
=
$(
stat
-c
%a /etc/group 2>/dev/null
)
local
checks_passed
=
0
local
total_checks
=
3
if
[[
"
$passwd_perm
"
==
"644"
]]
;
then
log INFO
" ✓ /etc/passwd 权限正确 (
$passwd_perm
)"
((
checks_passed++
))
else
log WARN
" ✗ /etc/passwd 权限不正确 (当前:
$passwd_perm
)"
fi
if
[[
"
$shadow_perm
"
==
"400"
]]
;
then
log INFO
" ✓ /etc/shadow 权限正确 (
$shadow_perm
)"
((
checks_passed++
))
else
log WARN
" ✗ /etc/shadow 权限不正确 (当前:
$shadow_perm
)"
fi
if
[[
"
$group_perm
"
==
"644"
]]
;
then
log INFO
" ✓ /etc/group 权限正确 (
$group_perm
)"
((
checks_passed++
))
else
log WARN
" ✗ /etc/group 权限不正确 (当前:
$group_perm
)"
fi
log INFO
"重要目录及文件权限检查完成:
$checks_passed
/
$total_checks
项通过"
check_results[
"critical_permissions"
]=
"
$checks_passed
/
$total_checks
"
# 打印当前权限详情
log INFO
" 当前关键文件权限详情:"
log INFO
" /etc/passwd 权限:
$passwd_perm
(期望: 644)"
log INFO
" /etc/shadow 权限:
$shadow_perm
(期望: 400)"
log INFO
" /etc/group 权限:
$group_perm
(期望: 644)"
}
# 检查账户认证失败次数限制
check_auth_failure_limit
()
{
log INFO
"开始检查账户认证失败次数限制..."
local
tally2_auth
=
$(
grep
-E
"pam_tally2
\.
so.*deny=5"
/etc/pam.d/system-auth 2>/dev/null
)
local
tally2_account
=
$(
grep
-E
"pam_tally2
\.
so"
/etc/pam.d/system-auth 2>/dev/null |
grep
"account"
)
if
[[
-n
"
$tally2_auth
"
]]
&&
[[
-n
"
$tally2_account
"
]]
;
then
log INFO
" ✓ 账户认证失败次数限制配置正确"
check_results[
"auth_failure_limit"
]=
"1/1"
else
log WARN
" ✗ 账户认证失败次数限制配置不正确"
check_results[
"auth_failure_limit"
]=
"0/1"
fi
# 打印当前pam_tally2配置详情
log INFO
" 当前pam_tally2配置详情:"
tally2_lines
=
$(
grep
-E
"pam_tally2
\.
so"
/etc/pam.d/system-auth 2>/dev/null
)
if
[[
-n
"
$tally2_lines
"
]]
;
then
while
IFS
=
read
-r
line
;
do
log INFO
"
$line
"
done
<<<
"
$tally2_lines
"
else
log INFO
" 未找到pam_tally2配置"
fi
}
# 检查历史命令数量限制
check_history_limit
()
{
log INFO
"开始检查历史命令数量限制..."
local
hist_file_size
=
$(
grep
-E
"^HISTFILESIZE="
/etc/profile 2>/dev/null |
cut
-d
'='
-f2
)
local
hist_size
=
$(
grep
-E
"^HISTSIZE="
/etc/profile 2>/dev/null |
cut
-d
'='
-f2
)
local
checks_passed
=
0
local
total_checks
=
2
if
[[
-n
"
$hist_file_size
"
]]
&&
[[
"
$hist_file_size
"
-le
5
]]
;
then
log INFO
" ✓ HISTFILESIZE 设置为
$hist_file_size
"
((
checks_passed++
))
else
log WARN
" ✗ HISTFILESIZE 未正确设置 (当前值:
$hist_file_size
)"
fi
if
[[
-n
"
$hist_size
"
]]
&&
[[
"
$hist_size
"
-le
5
]]
;
then
log INFO
" ✓ HISTSIZE 设置为
$hist_size
"
((
checks_passed++
))
else
log WARN
" ✗ HISTSIZE 未正确设置 (当前值:
$hist_size
)"
fi
log INFO
"历史命令数量限制检查完成:
$checks_passed
/
$total_checks
项通过"
check_results[
"history_limit"
]=
"
$checks_passed
/
$total_checks
"
# 打印当前历史命令配置详情
log INFO
" 当前历史命令配置详情:"
hist_file_size_line
=
$(
grep
-E
"^HISTFILESIZE="
/etc/profile 2>/dev/null
)
hist_size_line
=
$(
grep
-E
"^HISTSIZE="
/etc/profile 2>/dev/null
)
if
[[
-n
"
$hist_file_size_line
"
]]
;
then
log INFO
"
$hist_file_size_line
"
else
log INFO
" 未找到HISTFILESIZE配置"
fi
if
[[
-n
"
$hist_size_line
"
]]
;
then
log INFO
"
$hist_size_line
"
else
log INFO
" 未找到HISTSIZE配置"
fi
}
# 检查密码重复使用次数限制
check_password_reuse_limit
()
{
log INFO
"开始检查密码重复使用次数限制..."
local
reuse_check
=
$(
grep
-E
"pam_unix
\.
so.*remember=5"
/etc/pam.d/system-auth 2>/dev/null
)
if
[[
-n
"
$reuse_check
"
]]
;
then
log INFO
" ✓ 密码重复使用次数限制配置正确"
check_results[
"password_reuse_limit"
]=
"1/1"
else
log WARN
" ✗ 密码重复使用次数限制配置不正确"
check_results[
"password_reuse_limit"
]=
"0/1"
fi
# 打印当前密码重复使用配置详情
log INFO
" 当前密码重复使用配置详情:"
reuse_lines
=
$(
grep
-E
"pam_unix
\.
so.*remember"
/etc/pam.d/system-auth 2>/dev/null
)
if
[[
-n
"
$reuse_lines
"
]]
;
then
while
IFS
=
read
-r
line
;
do
log INFO
"
$line
"
done
<<<
"
$reuse_lines
"
else
log INFO
" 未找到密码重复使用限制配置"
fi
}
# 检查Ctrl+Alt+Delete组合键状态
check_ctrl_alt_del
()
{
log INFO
"开始检查Ctrl+Alt+Delete组合键状态..."
local
masked
=
$(
systemctl is-enabled ctrl-alt-del.target 2>/dev/null |
grep
-o
"masked"
)
if
[[
-n
"
$masked
"
]]
;
then
log INFO
" ✓ Ctrl+Alt+Delete组合键已被禁用"
check_results[
"ctrl_alt_del"
]=
"1/1"
else
log WARN
" ✗ Ctrl+Alt+Delete组合键未被禁用"
check_results[
"ctrl_alt_del"
]=
"0/1"
fi
# 打印当前Ctrl+Alt+Delete服务状态
log INFO
" 当前Ctrl+Alt+Delete服务状态:"
cad_status
=
$(
systemctl is-active ctrl-alt-del.target 2>/dev/null
)
cad_enabled
=
$(
systemctl is-enabled ctrl-alt-del.target 2>/dev/null
)
log INFO
" Active:
$cad_status
"
log INFO
" Enabled:
$cad_enabled
"
}
# 输出汇总报告
output_summary
()
{
log INFO
""
log INFO
"=================================="
log INFO
"安全配置检测汇总报告"
log INFO
"=================================="
local
total_items
=
0
local
passed_items
=
0
for
key
in
"
${
!check_results[@]
}
"
;
do
IFS
=
'/'
read
-r
passed total
<<<
"
${
check_results
[
$key
]
}
"
((
total_items +
=
total
))
((
passed_items +
=
passed
))
log INFO
"
$(
printf
'%-20s'
"
$key
:"
)
${
check_results
[
$key
]
}
"
done
log INFO
"=================================="
log INFO
"总计:
$passed_items
/
$total_items
项通过"
local
percentage
=
$((
passed_items
*
100
/
total_items
))
if
[[
$percentage
-ge
90
]]
;
then
log INFO
"安全配置达标率:
$percentage
% (优秀)"
elif
[[
$percentage
-ge
70
]]
;
then
log INFO
"安全配置达标率:
$percentage
% (良好)"
else
log INFO
"安全配置达标率:
$percentage
% (需要改进)"
fi
log INFO
"=================================="
log INFO
"检测完成,详细日志请查看:
$LOG_FILE
"
}
# 主函数
main
()
{
log INFO
"开始执行统信系统安全配置检测脚本"
log INFO
"脚本位置:
$SCRIPT_DIR
"
log INFO
"检测开始时间:
$(
date
'+%Y-%m-%d %H:%M:%S'
)
"
log INFO
""
# 执行各项检查
check_ssh_security
check_timeout_setting
check_pam_auth
check_telnet_status
check_ssh_service
check_login_logging
check_umask_setting
check_password_warn_age
check_password_complexity
check_password_min_days
check_password_max_days
check_critical_permissions
check_auth_failure_limit
check_history_limit
check_password_reuse_limit
check_ctrl_alt_del
# 输出汇总报告
output_summary
}
# 运行主函数
main
"
$@
"
\ No newline at end of file
AuxiliaryTool/ScriptTool/主机漏洞修复(统信系统)/security_fix.sh
0 → 100644
浏览文件 @
e900a288
#!/bin/bash
# 统信系统安全漏洞修复脚本
# 功能:修复系统安全配置问题
# 作者:Security Team
# 日期:$(date +%Y-%m-%d)
# 颜色定义
RED
=
'\033[0;31m'
GREEN
=
'\033[0;32m'
YELLOW
=
'\033[1;33m'
BLUE
=
'\033[0;34m'
NC
=
'\033[0m'
# No Color
# 日志配置
LOG_FILE
=
"/tmp/security_fix_
$(
date
+%Y%m%d_%H%M%S
)
.log"
SCRIPT_DIR
=
$(
cd
"
$(
dirname
"
${
BASH_SOURCE
[0]
}
"
)
"
&&
pwd
)
# 日志函数
log
()
{
local
level
=
$1
shift
local
message
=
"
$*
"
local
timestamp
=
$(
date
'+%Y-%m-%d %H:%M:%S'
)
echo
"[
$timestamp
] [
$level
]
$message
"
|
tee
-a
"
$LOG_FILE
"
}
# 彩色输出函数
print_title
()
{
echo
-e
"
${
BLUE
}
$1
${
NC
}
"
}
print_success
()
{
echo
-e
"
${
GREEN
}
$1
${
NC
}
"
}
print_warning
()
{
echo
-e
"
${
YELLOW
}
$1
${
NC
}
"
}
print_error
()
{
echo
-e
"
${
RED
}
$1
${
NC
}
"
}
# 确认函数
confirm_action
()
{
local
message
=
$1
read
-p
"
$message
(y/N): "
-n
1
-r
echo
if
[[
!
$REPLY
=
~ ^[Yy]
$
]]
;
then
log INFO
"用户取消操作"
return
1
fi
return
0
}
# 备份文件函数
backup_file
()
{
local
file_path
=
$1
local
timestamp
=
$(
date
+%Y%m%d_%H%M%S
)
local
backup_path
=
"
${
file_path
}
_backup_
${
timestamp
}
"
if
[[
-f
"
$file_path
"
]]
;
then
cp
"
$file_path
"
"
$backup_path
"
log INFO
"已创建备份:
$backup_path
"
echo
"
$backup_path
"
else
log WARN
"文件不存在,无法备份:
$file_path
"
echo
""
fi
}
# 修复OpenSSH安全配置
fix_ssh_security
()
{
print_title
"开始修复OpenSSH安全配置..."
log INFO
"开始修复OpenSSH安全配置"
local
ssh_config
=
"/etc/ssh/sshd_config"
local
backup_path
=
$(
backup_file
"
$ssh_config
"
)
if
[[
-z
"
$backup_path
"
]]
;
then
log ERROR
"无法备份SSH配置文件,跳过此步骤"
return
1
fi
# 创建临时文件
local
temp_file
=
$(
mktemp
)
# 读取现有配置并替换或添加所需参数
while
IFS
=
read
-r
line
;
do
if
[[
$line
=
~ ^[[:space:]]
*
X11Forwarding[[:space:]]
]]
;
then
echo
"X11Forwarding no"
>>
"
$temp_file
"
elif
[[
$line
=
~ ^[[:space:]]
*
MaxAuthTries[[:space:]]
]]
;
then
echo
"MaxAuthTries 4"
>>
"
$temp_file
"
elif
[[
$line
=
~ ^[[:space:]]
*
IgnoreRhosts[[:space:]]
]]
;
then
echo
"IgnoreRhosts yes"
>>
"
$temp_file
"
elif
[[
$line
=
~ ^[[:space:]]
*
HostbasedAuthentication[[:space:]]
]]
;
then
echo
"HostbasedAuthentication no"
>>
"
$temp_file
"
elif
[[
$line
=
~ ^[[:space:]]
*
PermitEmptyPasswords[[:space:]]
]]
;
then
echo
"PermitEmptyPasswords no"
>>
"
$temp_file
"
elif
[[
$line
=
~ ^[[:space:]]
*
PermitRootLogin[[:space:]]
]]
;
then
echo
"PermitRootLogin no"
>>
"
$temp_file
"
elif
[[
$line
=
~ ^[[:space:]]
*
Protocol[[:space:]]
]]
;
then
echo
"Protocol 2"
>>
"
$temp_file
"
else
echo
"
$line
"
>>
"
$temp_file
"
fi
done
<
"
$ssh_config
"
# 检查是否有缺少的参数并添加
if
!
grep
-q
"^X11Forwarding"
"
$temp_file
"
;
then
echo
"X11Forwarding no"
>>
"
$temp_file
"
fi
if
!
grep
-q
"^MaxAuthTries"
"
$temp_file
"
;
then
echo
"MaxAuthTries 4"
>>
"
$temp_file
"
fi
if
!
grep
-q
"^IgnoreRhosts"
"
$temp_file
"
;
then
echo
"IgnoreRhosts yes"
>>
"
$temp_file
"
fi
if
!
grep
-q
"^HostbasedAuthentication"
"
$temp_file
"
;
then
echo
"HostbasedAuthentication no"
>>
"
$temp_file
"
fi
if
!
grep
-q
"^PermitEmptyPasswords"
"
$temp_file
"
;
then
echo
"PermitEmptyPasswords no"
>>
"
$temp_file
"
fi
if
!
grep
-q
"^PermitRootLogin"
"
$temp_file
"
;
then
echo
"PermitRootLogin no"
>>
"
$temp_file
"
fi
if
!
grep
-q
"^Protocol"
"
$temp_file
"
;
then
echo
"Protocol 2"
>>
"
$temp_file
"
fi
# 替换原文件
mv
"
$temp_file
"
"
$ssh_config
"
log INFO
"OpenSSH安全配置修复完成"
print_success
"OpenSSH安全配置修复完成"
}
# 修复命令行界面超时设置
fix_timeout_setting
()
{
print_title
"开始修复命令行界面超时设置..."
log INFO
"开始修复命令行界面超时设置"
local
profile_file
=
"/etc/profile"
local
backup_path
=
$(
backup_file
"
$profile_file
"
)
if
[[
-z
"
$backup_path
"
]]
;
then
log ERROR
"无法备份profile文件,跳过此步骤"
return
1
fi
# 检查是否已有设置,如果有则替换,否则添加
if
grep
-q
"^TMOUT="
"
$profile_file
"
;
then
sed
-i
's/^TMOUT=.*/TMOUT=300/'
"
$profile_file
"
sed
-i
'/^export TMOUT/d'
"
$profile_file
"
else
echo
""
>>
"
$profile_file
"
echo
"# 设置命令行界面超时时间为300秒"
>>
"
$profile_file
"
echo
"TMOUT=300"
>>
"
$profile_file
"
fi
if
!
grep
-q
"^export TMOUT"
"
$profile_file
"
;
then
echo
"export TMOUT"
>>
"
$profile_file
"
fi
# 应用配置
source
"
$profile_file
"
log INFO
"命令行界面超时设置修复完成"
print_success
"命令行界面超时设置修复完成"
}
# 修复PAM认证模块配置
fix_pam_auth
()
{
print_title
"开始修复PAM认证模块配置..."
log INFO
"开始修复PAM认证模块配置"
local
pam_su
=
"/etc/pam.d/su"
local
backup_path
=
$(
backup_file
"
$pam_su
"
)
if
[[
-z
"
$backup_path
"
]]
;
then
log ERROR
"无法备份PAM su文件,跳过此步骤"
return
1
fi
# 检查是否已有配置,避免重复添加
if
!
grep
-q
"pam_rootok.so"
"
$pam_su
"
;
then
sed
-i
'1i auth sufficient pam_rootok.so'
"
$pam_su
"
else
sed
-i
's/^auth.*pam_rootok\.so/auth sufficient pam_rootok.so/'
"
$pam_su
"
fi
if
!
grep
-q
"pam_wheel.so"
"
$pam_su
"
;
then
sed
-i
'2i auth required pam_wheel.so group=wheel'
"
$pam_su
"
else
sed
-i
's/^auth.*pam_wheel\.so.*/auth required pam_wheel.so group=wheel/'
"
$pam_su
"
fi
log INFO
"PAM认证模块配置修复完成"
print_success
"PAM认证模块配置修复完成"
}
# 修复Telnet服务状态
fix_telnet_status
()
{
print_title
"开始修复Telnet服务状态..."
log INFO
"开始修复Telnet服务状态"
local
telnet_file
=
"/etc/xinetd.d/telnet"
if
[[
-f
"
$telnet_file
"
]]
;
then
local
backup_path
=
$(
backup_file
"
$telnet_file
"
)
if
[[
-z
"
$backup_path
"
]]
;
then
log ERROR
"无法备份telnet配置文件,跳过此步骤"
return
1
fi
# 禁用Telnet服务
sed
-i
's/disable.*/disable = yes/'
"
$telnet_file
"
# 重启xinetd服务
systemctl restart xinetd
log INFO
"Telnet服务已禁用并重启xinetd服务"
print_success
"Telnet服务已禁用"
else
log INFO
"Telnet服务未安装或配置文件不存在,跳过此步骤"
print_warning
"Telnet服务未安装或配置文件不存在,跳过此步骤"
fi
}
# 修复SSH服务状态
fix_ssh_service
()
{
print_title
"开始修复SSH服务状态..."
log INFO
"开始修复SSH服务状态"
# 启动并启用SSH服务
systemctl
enable
sshd
systemctl start sshd
if
systemctl is-active
--quiet
sshd
;
then
log INFO
"SSH服务已启动并设置为开机自启"
print_success
"SSH服务已启动并设置为开机自启"
else
log ERROR
"SSH服务启动失败"
print_error
"SSH服务启动失败"
fi
}
# 修复登录日志记录配置
fix_login_logging
()
{
print_title
"开始修复登录日志记录配置..."
log INFO
"开始修复登录日志记录配置"
local
rsyslog_conf
=
"/etc/rsyslog.conf"
local
backup_path
=
$(
backup_file
"
$rsyslog_conf
"
)
if
[[
-z
"
$backup_path
"
]]
;
then
log ERROR
"无法备份rsyslog配置文件,跳过此步骤"
return
1
fi
# 检查是否已有配置,避免重复添加
if
!
grep
-q
"authpriv.* /var/log/secure"
"
$rsyslog_conf
"
;
then
echo
"authpriv.* /var/log/secure"
>>
"
$rsyslog_conf
"
fi
# 创建并设置日志文件权限
touch
/var/log/secure
chmod
600 /var/log/secure
# 重启rsyslog服务
systemctl restart rsyslog
log INFO
"登录日志记录配置修复完成"
print_success
"登录日志记录配置修复完成"
}
# 修复用户目录默认访问权限
fix_umask_setting
()
{
print_title
"开始修复用户目录默认访问权限设置..."
log INFO
"开始修复用户目录默认访问权限设置"
local
profile_file
=
"/etc/profile"
local
backup_path
=
$(
backup_file
"
$profile_file
"
)
if
[[
-z
"
$backup_path
"
]]
;
then
log ERROR
"无法备份profile文件,跳过此步骤"
return
1
fi
# 检查是否已有umask设置
if
grep
-q
"^umask"
"
$profile_file
"
;
then
sed
-i
's/^umask.*/umask 027/'
"
$profile_file
"
else
echo
""
>>
"
$profile_file
"
echo
"# 设置默认权限掩码"
>>
"
$profile_file
"
echo
"umask 027"
>>
"
$profile_file
"
fi
# 应用配置
source
"
$profile_file
"
log INFO
"用户目录默认访问权限设置修复完成"
print_success
"用户目录默认访问权限设置修复完成"
}
# 修复口令过期前警告天数
fix_password_warn_age
()
{
print_title
"开始修复口令过期前警告天数..."
log INFO
"开始修复口令过期前警告天数"
local
login_defs
=
"/etc/login.defs"
local
backup_path
=
$(
backup_file
"
$login_defs
"
)
if
[[
-z
"
$backup_path
"
]]
;
then
log ERROR
"无法备份login.defs文件,跳过此步骤"
return
1
fi
# 检查是否已有设置
if
grep
-q
"^PASS_WARN_AGE"
"
$login_defs
"
;
then
sed
-i
's/^PASS_WARN_AGE.*/PASS_WARN_AGE 7/'
"
$login_defs
"
else
echo
""
>>
"
$login_defs
"
echo
"# 密码过期前警告天数"
>>
"
$login_defs
"
echo
"PASS_WARN_AGE 7"
>>
"
$login_defs
"
fi
log INFO
"口令过期前警告天数修复完成"
print_success
"口令过期前警告天数修复完成"
}
# 修复密码复杂度策略
fix_password_complexity
()
{
print_title
"开始修复密码复杂度策略..."
log INFO
"开始修复密码复杂度策略"
local
system_auth
=
"/etc/pam.d/system-auth"
local
backup_path
=
$(
backup_file
"
$system_auth
"
)
if
[[
-z
"
$backup_path
"
]]
;
then
log ERROR
"无法备份system-auth文件,跳过此步骤"
return
1
fi
# 检查是否已有pam_cracklib配置
if
grep
-q
"pam_cracklib.so"
"
$system_auth
"
;
then
sed
-i
's/password.*requisite.*pam_cracklib.so.*/password requisite pam_cracklib.so try_first_pass retry=3 minlen=8 dcredit=-1 ucredit=-1 ocredit=-1 lcredit=-1/'
"
$system_auth
"
else
# 添加密码复杂度配置
echo
""
>>
"
$system_auth
"
echo
"# 密码复杂度策略"
>>
"
$system_auth
"
echo
"password requisite pam_cracklib.so try_first_pass retry=3 minlen=8 dcredit=-1 ucredit=-1 ocredit=-1 lcredit=-1"
>>
"
$system_auth
"
fi
log INFO
"密码复杂度策略修复完成"
print_success
"密码复杂度策略修复完成"
}
# 修复口令更改最小间隔天数
fix_password_min_days
()
{
print_title
"开始修复口令更改最小间隔天数..."
log INFO
"开始修复口令更改最小间隔天数"
local
login_defs
=
"/etc/login.defs"
local
backup_path
=
$(
backup_file
"
$login_defs
"
)
if
[[
-z
"
$backup_path
"
]]
;
then
log ERROR
"无法备份login.defs文件,跳过此步骤"
return
1
fi
# 检查是否已有设置
if
grep
-q
"^PASS_MIN_DAYS"
"
$login_defs
"
;
then
sed
-i
's/^PASS_MIN_DAYS.*/PASS_MIN_DAYS 7/'
"
$login_defs
"
else
echo
""
>>
"
$login_defs
"
echo
"# 密码更改最小间隔天数"
>>
"
$login_defs
"
echo
"PASS_MIN_DAYS 7"
>>
"
$login_defs
"
fi
log INFO
"口令更改最小间隔天数修复完成"
print_success
"口令更改最小间隔天数修复完成"
}
# 修复口令生存周期
fix_password_max_days
()
{
print_title
"开始修复口令生存周期..."
log INFO
"开始修复口令生存周期"
local
login_defs
=
"/etc/login.defs"
local
backup_path
=
$(
backup_file
"
$login_defs
"
)
if
[[
-z
"
$backup_path
"
]]
;
then
log ERROR
"无法备份login.defs文件,跳过此步骤"
return
1
fi
# 检查是否已有设置
if
grep
-q
"^PASS_MAX_DAYS"
"
$login_defs
"
;
then
sed
-i
's/^PASS_MAX_DAYS.*/PASS_MAX_DAYS 90/'
"
$login_defs
"
else
echo
""
>>
"
$login_defs
"
echo
"# 密码最大生存周期"
>>
"
$login_defs
"
echo
"PASS_MAX_DAYS 90"
>>
"
$login_defs
"
fi
log INFO
"口令生存周期修复完成"
print_success
"口令生存周期修复完成"
}
# 修复重要目录及文件权限
fix_critical_permissions
()
{
print_title
"开始修复重要目录及文件权限..."
log INFO
"开始修复重要目录及文件权限"
chmod
644 /etc/passwd
chmod
400 /etc/shadow
chmod
644 /etc/group
log INFO
"重要目录及文件权限修复完成"
print_success
"重要目录及文件权限修复完成"
}
# 修复账户认证失败次数限制
fix_auth_failure_limit
()
{
print_title
"开始修复账户认证失败次数限制..."
log INFO
"开始修复账户认证失败次数限制"
local
system_auth
=
"/etc/pam.d/system-auth"
local
backup_path
=
$(
backup_file
"
$system_auth
"
)
if
[[
-z
"
$backup_path
"
]]
;
then
log ERROR
"无法备份system-auth文件,跳过此步骤"
return
1
fi
# 添加认证失败限制配置
if
!
grep
-q
"pam_tally2.so.*deny=5"
"
$system_auth
"
;
then
sed
-i
'/^auth[[:space:]]\+required/a auth required pam_tally2.so deny=5 unlock_time=180 onerr=fail no_magic_root'
"
$system_auth
"
else
sed
-i
's/^auth[[:space:]]\+required[[:space:]]\+pam_tally2.so.*/auth required pam_tally2.so deny=5 unlock_time=180 onerr=fail no_magic_root/'
"
$system_auth
"
fi
if
!
grep
-q
"pam_tally2.so"
"
$system_auth
"
|
grep
-q
account
;
then
echo
""
>>
"
$system_auth
"
echo
"# 账户认证失败次数限制"
>>
"
$system_auth
"
echo
"account required pam_tally2.so"
>>
"
$system_auth
"
fi
log INFO
"账户认证失败次数限制修复完成"
print_success
"账户认证失败次数限制修复完成"
}
# 修复历史命令数量限制
fix_history_limit
()
{
print_title
"开始修复历史命令数量限制..."
log INFO
"开始修复历史命令数量限制"
local
profile_file
=
"/etc/profile"
local
backup_path
=
$(
backup_file
"
$profile_file
"
)
if
[[
-z
"
$backup_path
"
]]
;
then
log ERROR
"无法备份profile文件,跳过此步骤"
return
1
fi
# 设置历史命令数量限制
if
grep
-q
"^HISTFILESIZE="
"
$profile_file
"
;
then
sed
-i
's/^HISTFILESIZE=.*/HISTFILESIZE=5/'
"
$profile_file
"
else
echo
""
>>
"
$profile_file
"
echo
"# 历史命令数量限制"
>>
"
$profile_file
"
echo
"HISTFILESIZE=5"
>>
"
$profile_file
"
fi
if
grep
-q
"^HISTSIZE="
"
$profile_file
"
;
then
sed
-i
's/^HISTSIZE=.*/HISTSIZE=5/'
"
$profile_file
"
else
echo
"HISTSIZE=5"
>>
"
$profile_file
"
fi
# 应用配置
source
"
$profile_file
"
log INFO
"历史命令数量限制修复完成"
print_success
"历史命令数量限制修复完成"
}
# 修复密码重复使用次数限制
fix_password_reuse_limit
()
{
print_title
"开始修复密码重复使用次数限制..."
log INFO
"开始修复密码重复使用次数限制"
local
system_auth
=
"/etc/pam.d/system-auth"
local
opasswd_file
=
"/etc/security/opasswd"
local
backup_path
=
$(
backup_file
"
$system_auth
"
)
if
[[
-z
"
$backup_path
"
]]
;
then
log ERROR
"无法备份system-auth文件,跳过此步骤"
return
1
fi
# 创建旧密码存储文件
touch
"
$opasswd_file
"
chown
root:root
"
$opasswd_file
"
chmod
600
"
$opasswd_file
"
# 修复或添加密码重复使用限制
if
grep
-q
"pam_unix.so"
"
$system_auth
"
;
then
sed
-i
's/\(^password.*sufficient.*pam_unix\.so\).*/\1 remember=5/'
"
$system_auth
"
else
echo
""
>>
"
$system_auth
"
echo
"# 密码重复使用限制"
>>
"
$system_auth
"
echo
"password sufficient pam_unix.so remember=5"
>>
"
$system_auth
"
fi
log INFO
"密码重复使用次数限制修复完成"
print_success
"密码重复使用次数限制修复完成"
}
# 修复Ctrl+Alt+Delete组合键状态
fix_ctrl_alt_del
()
{
print_title
"开始修复Ctrl+Alt+Delete组合键状态..."
log INFO
"开始修复Ctrl+Alt+Delete组合键状态"
# 禁用Ctrl+Alt+Delete系统调用
systemctl mask ctrl-alt-del.target
if
[[
$?
-eq
0
]]
;
then
log INFO
"Ctrl+Alt+Delete组合键已禁用"
print_success
"Ctrl+Alt+Delete组合键已禁用"
else
log ERROR
"禁用Ctrl+Alt+Delete组合键失败"
print_error
"禁用Ctrl+Alt+Delete组合键失败"
fi
}
# 重启相关服务
restart_services
()
{
print_title
"重启相关服务以应用更改..."
log INFO
"重启相关服务以应用更改"
systemctl restart sshd
systemctl restart rsyslog
log INFO
"服务重启完成"
print_success
"服务重启完成"
}
# 输出修复摘要
output_summary
()
{
print_title
"=================================="
print_success
"安全漏洞修复汇总"
print_title
"=================================="
log INFO
"安全漏洞修复完成,请检查日志:
$LOG_FILE
"
print_success
"安全漏洞修复完成!"
print_warning
"建议重启系统以确保所有更改完全生效。"
}
# 主菜单
show_menu
()
{
echo
"统信系统安全漏洞修复工具"
echo
"请选择要执行的操作:"
echo
"1) 完整修复所有安全问题"
echo
"2) 选择性修复特定问题"
echo
"3) 退出"
echo
}
# 选择性修复菜单
selective_fix_menu
()
{
while
true
;
do
echo
"选择要修复的安全问题:"
echo
" 1) OpenSSH安全配置"
echo
" 2) 命令行界面超时设置"
echo
" 3) PAM认证模块配置"
echo
" 4) Telnet服务状态"
echo
" 5) SSH服务状态"
echo
" 6) 登录日志记录配置"
echo
" 7) 用户目录默认访问权限"
echo
" 8) 口令过期前警告天数"
echo
" 9) 密码复杂度策略"
echo
"10) 口令更改最小间隔天数"
echo
"11) 口令生存周期"
echo
"12) 重要目录及文件权限"
echo
"13) 账户认证失败次数限制"
echo
"14) 历史命令数量限制"
echo
"15) 密码重复使用次数限制"
echo
"16) Ctrl+Alt+Delete组合键状态"
echo
" b) 返回主菜单"
echo
" a) 全选"
echo
" q) 退出"
echo
read
-p
"请输入选项 (1-16, b, a, q): "
option
case
$option
in
1
)
fix_ssh_security
;;
2
)
fix_timeout_setting
;;
3
)
fix_pam_auth
;;
4
)
fix_telnet_status
;;
5
)
fix_ssh_service
;;
6
)
fix_login_logging
;;
7
)
fix_umask_setting
;;
8
)
fix_password_warn_age
;;
9
)
fix_password_complexity
;;
10
)
fix_password_min_days
;;
11
)
fix_password_max_days
;;
12
)
fix_critical_permissions
;;
13
)
fix_auth_failure_limit
;;
14
)
fix_history_limit
;;
15
)
fix_password_reuse_limit
;;
16
)
fix_ctrl_alt_del
;;
b
)
break
;;
a
)
fix_ssh_security
fix_timeout_setting
fix_pam_auth
fix_telnet_status
fix_ssh_service
fix_login_logging
fix_umask_setting
fix_password_warn_age
fix_password_complexity
fix_password_min_days
fix_password_max_days
fix_critical_permissions
fix_auth_failure_limit
fix_history_limit
fix_password_reuse_limit
fix_ctrl_alt_del
;;
q
)
exit
0
;;
*
)
echo
"无效选项,请重新选择"
;;
esac
done
}
# 主函数
main
()
{
log INFO
"开始执行统信系统安全漏洞修复脚本"
log INFO
"脚本位置:
$SCRIPT_DIR
"
log INFO
"修复开始时间:
$(
date
'+%Y-%m-%d %H:%M:%S'
)
"
log INFO
""
# 检查是否以root权限运行
if
[[
$EUID
-ne
0
]]
;
then
print_error
"此脚本需要root权限才能运行,请使用sudo或以root身份运行"
exit
1
fi
while
true
;
do
show_menu
read
-p
"请选择操作 (1-3): "
choice
case
$choice
in
1
)
if
confirm_action
"确定要修复所有安全问题吗?此操作将修改系统配置文件并创建备份。"
;
then
fix_ssh_security
fix_timeout_setting
fix_pam_auth
fix_telnet_status
fix_ssh_service
fix_login_logging
fix_umask_setting
fix_password_warn_age
fix_password_complexity
fix_password_min_days
fix_password_max_days
fix_critical_permissions
fix_auth_failure_limit
fix_history_limit
fix_password_reuse_limit
fix_ctrl_alt_del
restart_services
output_summary
break
fi
;;
2
)
selective_fix_menu
;;
3
)
exit
0
;;
*
)
echo
"无效选项,请重新选择"
;;
esac
done
}
# 运行主函数
main
"
$@
"
\ No newline at end of file
AuxiliaryTool/ScriptTool/主机漏洞修复(统信系统)/统信系统漏洞修复_PRD.md
0 → 100644
浏览文件 @
e900a288
统信系统漏洞修复 PRD
=======================
**操作系统版本:**
UOS Server 20 1070e
**文档目的:**
提供自动化脚本修复系统安全漏洞并支持复测验证
---
## 漏洞修复清单
### 问题一:OpenSSH 安全配置加固
#### 修复步骤:
1.
**编辑 SSH 配置文件**
```bash
cp -p /etc/ssh/sshd_config /etc/ssh/sshd_config_bak
```
编辑配置文件
`/etc/ssh/sshd_config`
,修改以下参数:
```
X11Forwarding no
MaxAuthTries 4
IgnoreRhosts yes
HostbasedAuthentication no
PermitEmptyPasswords no
PermitRootLogin no
Protocol 2
```
2.
**重启 SSH 服务**
```bash
systemctl restart sshd
# 或者使用
# /etc/init.d/sshd restart
```
#### 检测方法:
-
检查
`/etc/ssh/sshd_config`
文件中对应参数的值
-
验证 SSH 服务是否正常运行:
`systemctl status sshd`
---
### 问题二:命令行界面超时设置
#### 修复步骤:
1.
**备份配置文件**
```bash
cp -p /etc/profile /etc/profile_bak
```
2.
**配置超时参数**
在
`/etc/profile`
文件中添加或修改以下内容:
```bash
TMOUT=300
export TMOUT
```
3.
**使配置立即生效**
```bash
source /etc/profile
```
#### 检测方法:
-
检查
`/etc/profile`
文件中是否存在
`TMOUT=300`
和
`export TMOUT`
-
验证环境变量:
`echo $TMOUT`
---
### 问题三:PAM 认证模块配置(限制 su 切换 root)
#### 修复步骤:
1.
**编辑 PAM 配置文件**
编辑
`/etc/pam.d/su`
文件,在文件开头添加以下内容:
```
auth sufficient pam_rootok.so
auth required pam_wheel.so group=wheel
```
2.
**将用户添加到 wheel 组**
```bash
usermod -G wheel username # 将 username 替换为实际用户名
```
#### 检测方法:
-
检查
`/etc/pam.d/su`
文件中是否包含上述两行配置
-
验证 wheel 组成员:
`groups username`
---
### 问题四:禁用 Telnet,启用 SSH 协议
#### 修复步骤:
1.
**禁用 Telnet 服务**
```bash
cp -p /etc/xinetd.d/telnet /etc/xinetd.d/telnet_bak
# 编辑 /etc/xinetd.d/telnet 文件,将 disable 设置为 yes
sed -i 's/disable.*/disable = yes/' /etc/xinetd.d/telnet
service xinetd restart
```
2.
**确保 SSH 服务已启动**
```bash
systemctl start sshd
systemctl enable sshd
```
#### 检测方法:
-
检查
`/etc/xinetd.d/telnet`
文件中的
`disable`
参数是否为
`yes`
-
验证 xinetd 服务状态:
`systemctl status xinetd`
-
验证 SSH 服务状态:
`systemctl status sshd`
---
### 问题五:禁用 Root 用户远程登录
此问题已在问题一中通过设置
`PermitRootLogin no`
解决。
#### 检测方法:
-
检查
`/etc/ssh/sshd_config`
文件中
`PermitRootLogin`
是否设置为
`no`
---
### 问题六:登录日志记录配置
#### 修复步骤:
1.
**编辑 rsyslog 配置文件**
编辑
`/etc/rsyslog.conf`
文件,添加以下配置:
```
authpriv.* /var/log/secure
# 或者
# authpriv.info /var/log/secure
```
2.
**创建并设置日志文件权限**
```bash
touch /var/log/secure
chmod 600 /var/log/secure
```
3.
**重启 syslog 服务**
```bash
systemctl restart rsyslog
# 或者
# /etc/init.d/rsyslog restart
```
#### 检测方法:
-
检查
`/etc/rsyslog.conf`
文件中是否包含 authpriv 配置
-
验证
`/var/log/secure`
文件是否存在且权限为 600:
`ls -la /var/log/secure`
---
### 问题七:用户目录默认访问权限设置
#### 修复步骤:
1.
**备份配置文件**
```bash
cp /etc/profile /etc/profile.bak
```
2.
**设置默认 umask 值**
编辑
`/etc/profile`
文件,在文件末尾添加:
```
umask 027
```
3.
**使配置生效**
```bash
source /etc/profile
```
#### 检测方法:
-
检查
`/etc/profile`
文件中是否包含
`umask 027`
-
验证当前 umask 值:
`umask`
---
### 问题八:设置口令过期前警告天数
#### 修复步骤:
1.
**备份配置文件**
```bash
cp -p /etc/login.defs /etc/login.defs_bak
```
2.
**修改密码过期警告天数**
编辑
`/etc/login.defs`
文件,设置:
```
PASS_WARN_AGE 7
```
#### 检测方法:
-
检查
`/etc/login.defs`
文件中
`PASS_WARN_AGE`
的值
---
### 问题九:密码复杂度策略配置
#### 修复步骤:
1.
**备份配置文件**
```bash
cp /etc/pam.d/system-auth /etc/pam.d/system-auth.bak
```
2.
**编辑 PAM 配置文件**
编辑
`/etc/pam.d/system-auth`
文件,找到如下行:
```
password requisite pam_cracklib.so
```
修改为:
```
password requisite pam_cracklib.so try_first_pass retry=3 minlen=8 dcredit=-1 ucredit=-1 ocredit=-1 lcredit=-1
```
此配置要求密码长度不小于8位,至少包含1位数字、大写字母、小写字母和特殊字符。
#### 检测方法:
-
检查
`/etc/pam.d/system-auth`
文件中是否包含上述复杂度规则
-
验证参数是否完整:
`minlen=8 dcredit=-1 ucredit=-1 ocredit=-1 lcredit=-1`
---
### 问题十:设置口令更改最小间隔天数
#### 修复步骤:
1.
**备份配置文件**
```bash
cp -p /etc/login.defs /etc/login.defs_bak
```
2.
**修改密码最短使用期限**
编辑
`/etc/login.defs`
文件,设置:
```
PASS_MIN_DAYS 7
```
#### 检测方法:
-
检查
`/etc/login.defs`
文件中
`PASS_MIN_DAYS`
的值
---
### 问题十一:设置口令生存周期
#### 修复步骤:
1.
**备份配置文件**
```bash
cp -p /etc/login.defs /etc/login.defs_bak
```
2.
**修改密码最长使用期限**
编辑
`/etc/login.defs`
文件,设置:
```
PASS_MAX_DAYS 90
```
#### 检测方法:
-
检查
`/etc/login.defs`
文件中
`PASS_MAX_DAYS`
的值
---
### 问题十二:重要目录及文件权限设置
#### 修复步骤:
1.
**设置关键系统文件权限**
```bash
chmod 644 /etc/passwd
chmod 400 /etc/shadow
chmod 644 /etc/group
```
#### 检测方法:
-
检查各文件权限:
`ls -la /etc/passwd /etc/shadow /etc/group`
-
验证权限是否为:
`/etc/passwd`
(644),
`/etc/shadow`
(400),
`/etc/group`
(644)
---
### 问题十三:账户认证失败次数限制
#### 修复步骤:
1.
**备份配置文件**
```bash
cp -p /etc/pam.d/system-auth /etc/pam.d/system-auth_bak
```
2.
**编辑 PAM 配置文件**
编辑
`/etc/pam.d/system-auth`
文件,添加以下内容:
```
auth required pam_tally2.so deny=5 unlock_time=180 onerr=fail no_magic_root
account required pam_tally2.so
```
此配置表示认证失败5次后锁定账户180秒。
#### 检测方法:
-
检查
`/etc/pam.d/system-auth`
文件中是否包含上述配置
-
验证参数是否完整:
`deny=5 unlock_time=180`
---
### 问题十四:历史命令数量限制
#### 修复步骤:
1.
**编辑配置文件**
编辑
`/etc/profile`
文件,添加以下内容:
```
HISTFILESIZE=5 # 历史文件中保存的最大命令数
HISTSIZE=5 # 命令行中显示的历史命令数
```
2.
**使配置生效**
```bash
source /etc/profile
```
#### 检测方法:
-
检查
`/etc/profile`
文件中是否包含
`HISTFILESIZE=5`
和
`HISTSIZE=5`
-
验证变量值:
`echo $HISTFILESIZE`
和
`echo $HISTSIZE`
---
### 问题十五:密码重复使用次数限制
#### 修复步骤:
1.
**备份配置文件**
```bash
cp -p /etc/pam.d/system-auth /etc/pam.d/system-auth_bak
```
2.
**创建旧密码存储文件**
```bash
touch /etc/security/opasswd
chown root:root /etc/security/opasswd
chmod 600 /etc/security/opasswd
```
3.
**编辑 PAM 配置文件**
编辑
`/etc/pam.d/system-auth`
文件,找到如下行:
```
password sufficient pam_unix.so
```
修改为:
```
password sufficient pam_unix.so remember=5
```
此配置表示不能使用最近5次使用的密码。
#### 检测方法:
-
检查
`/etc/pam.d/system-auth`
文件中是否包含
`remember=5`
参数
-
验证
`/etc/security/opasswd`
文件是否存在且权限正确
---
### 问题十六:禁用 Ctrl+Alt+Delete 组合键
#### 修复步骤:
1.
**禁用系统级的 Ctrl+Alt+Delete 服务**
```bash
systemctl mask ctrl-alt-del.target
```
或者直接删除链接文件:
```bash
rm -f /usr/lib/systemd/system/ctrl-alt-del.target
```
#### 检测方法:
-
检查服务状态:
`systemctl is-enabled ctrl-alt-del.target`
(应返回 "masked")
---
## 自动化脚本工具
### 检测脚本 (security_check.sh)
提供一个自动化检测脚本,可检查系统当前安全配置状态:
-
检查所有16个安全配置项的状态
-
输出详细日志到临时文件
-
提供彩色输出便于阅读
-
生成汇总报告,显示通过率和达标情况
-
打印每个检测项的实际配置内容,便于第三方验证
### 修复脚本 (security_fix.sh)
提供一个自动化修复脚本,可修复安全漏洞:
-
修复所有16个安全配置项
-
每次修改前自动创建备份文件
-
提供交互式菜单,可以选择完整修复或选择性修复
-
使用彩色输出区分不同类型的信息
-
包含确认机制防止误操作
-
修复完成后自动重启相关服务
---
## 总结
该文档涵盖了系统安全的各个方面,包括:
-
SSH 安全配置
-
用户权限控制
-
密码策略设置
-
日志记录
-
命令历史限制
-
认证失败处理
建议在执行以上所有配置后重启系统以确保所有设置生效。
通过自动化脚本可以简化检测和修复过程,提高工作效率和准确性。
\ No newline at end of file
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论