AI智能摘要
当安全审计报告揪出数十项系统漏洞,手动整改是否让你焦头烂额?本文揭秘一款开源自动化神器——专为CentOS 7.2打造的操作系统基线检查脚本,47项核心安全配置(涵盖账号权限、口令策略、日志审计等)一键扫描。彩色可视化输出精准定位风险点,自动生成通过率统计,助你10分钟内完成厂商级安全合规整改。脚本已开源,运维工程师必备的效率革命,告别低效人工排查时代。
— AI 生成的文章内容摘要
写这个脚本的起因是,某厂商对我司出售客户那边的产品做基线检查,发现操作系统存在很多不符合项,需进行整改。拿到了对方的检测报告,于是就有了这个脚本,原报告暂不方便直接给出,后续我处理一下再给出来吧。
脚本Github链接:基线检查&加固
检测项
在CentOS 7.2上进行测试,检测项如下。(个人感觉涵盖了很多,还是可以增补的)
2 操作系统 2.1 帐号管理 2.1.1 检查是否设置除root之外UID为0的用户 2.1.2 检查是否按用户分配账号 2.1.3 检查是否删除与设备运行、维护等工作无关的账号 2.2 口令策略 2.2.1 检查是否设置口令生存周期 2.2.2 检查是否设置口令更改最小间隔天数 2.2.3 检查设备密码复杂度策略 2.2.4 检查是否设置口令过期前警告天数 2.2.5 检查是否存在空口令账号 2.2.6 检查密码重复使用次数限制 2.2.7 检查账户认证失败次数限制 2.3 认证授权 2.3.1 检查用户目录缺省访问权限设置 2.3.2 检查是否设置SSH登录前警告Banner 2.4 日志审计 2.4.1 检查是否对登录进行日志记录 2.4.2 检查是否启用cron行为日志功能 2.4.3 检查是否配置远程日志功能 2.4.4 检查是否配置su命令使用情况记录 2.4.5 检查日志文件权限设置 2.4.6 检查安全事件日志配置 2.5 文件权限 2.5.1 检查FTP用户上传的文件所具有的权限 2.5.2 检查重要目录或文件权限设置 2.6 网络通信 2.6.1 检查是否禁止root用户远程登录 2.6.2 检查使用IP协议远程维护的设备是否配置SSH协议,禁用Telnet协议 2.6.3 检查是否修改SNMP默认团体字 2.6.4 检查是否禁止root用户登录FTP 2.6.5 检查是否使用PAM认证模块禁止wheel组之外的用户su为root 2.7 其他配置 2.7.1 检查是否禁止匿名用户登录FTP 2.7.2 检查是否删除了潜在危险文件 2.7.3 检查是否设置命令行界面超时退出 2.7.4 检查系统是否禁用Ctrl+Alt+Delete组合键 2.7.5 检查root用户的path环境变量 2.7.6 检查历史命令设置 2.7.7 检查是否设置SSH成功登录后Banner 2.7.8 检查是否限制FTP用户登录后能访问的目录 2.7.9 检查是否关闭数据包转发功能 2.7.10 检查别名文件/etc/aliase 2.7.11 检查是否使用NTP(网络时间协议)保持时间同步 2.7.12 检查是否限制远程登录IP范围 2.7.13 检查NFS(网络文件系统)服务配置 2.7.14 检查是否配置定时自动屏幕锁定 2.7.15 检查是否安装chkrootkit进行系统监测 2.7.16 检查是否安装OS补丁 2.7.17 检查FTP banner设置 2.7.18 检查Telnet banner设置 2.7.19 检查系统内核参数配置 2.7.20 检查系统openssh安全配置 2.7.21 检查系统coredump设置 2.7.22 检查是否关闭不必要的服务和端口
输出显示
脚本中,有做文字颜色输出设定。
# ================ Global function for print result =================== # 绿色字体输出 pass=$(($pass+1)) print_pass(){ echo -e "/033[32m检测结果 ==> PASS /033[0m" } # 红色字体输出 fail=$(($fail+1)) print_fail(){ echo -e "/033[31m检测结果 ==> FAIL /033[0m" } # 黄色字体输出 print_manual_check(){ echo -e "/033[33m请手工检测 ==> Manual /033[0m" } # 蓝色字体输出 print_info(){ echo -e "/033[34m$1 /033[0m" } # 紫色字体输出 print_check_point(){ echo "" echo -e "/033[35m[No.$1] $2 /033[0m" echo "------------------------------------------------------------------------" } print_summary(){ print_info "---------------------------- Summary -----------------------------" echo -e "/033[35m全部检测项: $1 /033[0m" echo -e "/033[32m通过检测项: $2 /033[0m" echo -e "/033[31m失败检测项: $3 /033[0m" echo -e "/033[33m手工检测项: $4 /033[0m" print_info "------------------------------------------------------------------" }
输出示例
在脚本检测过程中,也尽可能的输出更多的信息。
... 以上省略几百行 [No.45] 其他配置-20:检查系统openssh安全配置 ------------------------------------------------------------------------ X11Forwarding => no MaxAuthTries => 4 IgnoreRhosts => yes HostbasedAuthentication => no PermitEmptyPasswords => no 检测结果 ==> PASS [No.46] 其他配置-21:检查系统coredump设置 ------------------------------------------------------------------------ 设置* soft core、* hard core为0,且注释掉ulimit -S -c 0 > /dev/null 2>&1 检测结果 ==> FAIL [No.47] 其他配置-22:检查是否关闭不必要的服务和端口 ------------------------------------------------------------------------ ==>please check the output of the following command: # chkconfig --list 请手工检测 ==> Manual ---------------------------- Summary ----------------------------- 全部检测项: 47 通过检测项: 24 失败检测项: 15 手工检测项: 8 ------------------------------------------------------------------
做简单的数据统计,便于了解大致的检测项的符合情况。
脚本链接
因为脚本比较长,有近1000行,不方便展示在这里,请移步:starnightcyber/Miscellaneous/基线检查&加固/
print_info "---------------------- 正在执行操作系统基线检查 ----------------------" index=0 # 检测项编号 pass=0 # 通过的检测项数 fail=0 # 未通过的检测项数 manual=0 # 需手工复核的检测项数 check_point="帐号管理-1:检查是否设置除root之外UID为0的用户" index=$(($index+1)) print_check_point $index $check_point result=`/bin/cat /etc/passwd | /bin/awk -F: '($3 == 0) { print $1 }'` print_info "UID为0的用户如下:" print_info "[ $result ]" if [ "root" = $result ]; then pass=$(($pass+1)) print_pass else fail=$(($fail+1)) print_fail fi check_point="帐号管理-2:检查是否按用户分配账号 " index=$(($index+1)) print_check_point $index $check_point up_uidmin=`(grep -v ^# /etc/login.defs |grep "^UID_MIN"|awk '($1="UID_MIN"){print $2}')` up_uidmax=`(grep -v ^# /etc/login.defs |grep "^UID_MAX"|awk '($1="UID_MAX"){print $2}')` users=`/bin/cat /etc/passwd | /bin/awk -F: '{if( $3>='$up_uidmin' && $3<='$up_uidmax' ) {print $1":"$3}}'` print_info "系统中存在的用户如下:" print_info "[ $users ]" if [ "$users" ]; then pass=$(($pass+1)) print_pass else fail=$(($fail+1)) print_fail fi ... # 以下省略几百行
说明
以上脚本仅在CentOS 7.2上进行测试,在其它linux发行版本会存在一定的差异。
如果发现脚本中有问题请与我联系,或者有新的想法 or 增加检测项,也可以私信我。

上海市松江区 1F
有在ubuntu上测试过吗?
广东省东莞市 B1
@ 星轨代码 可以试试改造成ansible playbook,Ubuntu也能兼容
日本 2F
权限检查那块写得挺细的👍
韩国 3F
手动检测项有点多啊,能自动化吗
河南省三门峡市 4F
之前被基线检查坑过,这个帮大忙了
湖北省宜昌市 B1
@ 冰尘 也遇到过同样的坑,这脚本省了不少时间
陕西省渭南市 5F
SSH配置那块能不能再详细点
北京市 B1
@ 影子边缘 建议把SSH配置的推荐值也列出来,比如Ciphers和MACs
浙江省宁波市 6F
颜色输出挺直观的,看着舒服
韩国 7F
这么多检测项,跑一次要多久?
安徽省宿州市 8F
收藏了,下周正好要用
湖南省长沙市 B1
@ 星空下的旅人 下周跑一下看看会不会卡死,等结果
日本 9F
感觉密码策略部分还可以再加强
江苏省常州市 10F
这么多检测项,看得眼花🤯
上海市金山区 11F
权限管理这块挺全的,日常运维够用
广东省东莞市 12F
SSH配置那个MaxAuthTries=4是不是有点少?
黑龙江省哈尔滨市 13F
颜色区分结果很人性化,一眼就能看出问题
浙江省绍兴市 14F
历史命令设置具体检查什么内容?
湖南省长沙市 15F
之前搞基线检查,光手动查就花了两天
日本 16F
cron日志检测这个很实用
广东省 17F
root环境变量检查有必要吗?
印度尼西亚 18F
这个脚本太实用了!正好需要做安全检测
日本 B1
@ 赤铜时代 手动检查能全自动化吗?👍
天津市 19F
要是能导出 html 报告就更方便给领导看了
北京市 20F
检测项覆盖挺广的,就是不知道其他系统兼容性怎么样
上海市 21F
空口令账号检测是必查项吧
上海市 22F
这脚本要是早出来半年,我也不用 manually 查到吐血😭
日本 23F
SSH配置这块其实还可以加密算法限制,现在默认太松了
山东省滨州市 24F
Ubuntu上跑不了,systemd和chkconfig命令都不一样,得重写逻辑
辽宁省大连市 25F
检测项太多反而容易漏,建议分模块跑
湖北省武汉市 26F
那个coredump检查失败是啥情况,有人遇到过吗?
天津市 27F
root环境变量不干净的话,提权风险很大,这检查很有必要
日本 28F
求问这个脚本在CentOS 8上能用吗,systemd服务管理变了
台湾省新北市 29F
颜色输出是挺好看,但终端配色不对的话会乱码
湖北省襄阳市 30F
之前做等保测评,这种脚本直接省下三天工时
泰国 31F
FTP的banner检查挺细啊,之前都没注意过这个
宁夏银川市 B1
@ 黄昏切片 很多基线要求里会专门提到这个,所以也加上了。
广东省江门市开平市 32F
手工检测项要是能出个 checklist 文档就更香了
日本 33F
cron日志检测确实实用,上次就是因为没开被通报了
辽宁省沈阳市 34F
密码策略建议加上正则校验,防止弱口令绕过
韩国 35F
这个脚本跑完大概多久?服务器多的话得排期了
日本 36F
权限检查覆盖全,但某些项可能误报,比如特殊业务账号
黑龙江省大庆市 37F
@豆包 这脚本能直接用在Ubuntu上不?
荷兰 B1
@ 星云织梦 可能不太行,这脚本主要针对CentOS 7.2写的,Ubuntu的配置路径和命令有些差别。