适用于系统版本:CentOS 6/7/8的基线安全检测脚本

#!/bin/bash
#适用于系统版本:CentOS 6/7/8
echo "----------------检测是否符合密码复杂度要求----------------"
#把minlen(密码最小长度)设置为8-32位,把minclass(至少包含小写字母、大写字母、数字、特殊字符等4类字符中等3类或4类)设置为3或4;
st1=`cat /etc/security/pwquality.conf | grep minlen| grep -v '#'`
st2=`cat /etc/security/pwquality.conf | grep minclass| grep -v '#'`
if [ -z "$st1" ] && [ -z "$st2" ]; then
echo "检测结果为:未设置密码复杂度"
elif [ `cat /etc/security/pwquality.conf | grep minlen| grep -v '#' |awk -F ' ' '{print $3}'` -gt 8 ] && [ `cat /etc/security/pwquality.conf | grep minclass| grep -v '#' |awk -F ' ' '{print $3}'` -gt 2 ]; then
echo "检测结果为:密码复杂度符合要求"
else
echo "检测结果为:密码复杂度不符合要求"
fiecho "----------------检测rsyslog服务是否启用----------------"
#确保rsyslog服务已启用,记录日志用于审计
rsyslog="active(running)"
rsyslogstatus=`systemctl status rsyslog| grep Active | awk  '{print$2$3}' `
if [ "$rsyslogstatus" == "$rsyslog" ]; then
echo "检测结果为:rsyslog服务已启用"
else
echo "检测结果为:rsyslog服务未启用"
fiecho "----------------检测是否禁止ROOT远程登录----------------"
#/etc/ssh/sshd_config文件中PermitRootLogin应设置为:no
set -e
cfgfile='/etc/ssh/sshd_config'
if [ "`cat ${cfgfile} | grep -E '^PermitRootLogin' | awk '{print $1}'`" == "#PermitRootLogin" -o "`cat ${cfgfile} | grep '^PermitRootLogin'`" == "" -o "`cat ${cfgfile} | grep '^PermitRootLogin' | awk '{print $2}'`" == "yes" ]
then
echo "检测结果为:未禁止root远程登录"else
echo "检测结果为:已禁止root远程登录"fiecho "----------------检测是否禁止空密码登录----------------"
#/etc/ssh/sshd_config文件中PermitEmptyPasswords应设置为:no
set -e
cfgfile='/etc/ssh/sshd_config'
if [ "`cat ${cfgfile} | grep 'PermitEmptyPasswords' | awk '{print $1}'`" == "#PermitEmptyPasswords" -o "`cat ${cfgfile} | grep 'PermitEmptyPasswords'`" == "" -o "`cat ${cfgfile} | grep 'PermitEmptyPasswords' | awk '{print $2}'`" == "yes" ]
then
echo "检测结果为:未禁止空密码登录"else
echo "检测结果为:已禁止空密码登录"fiecho "----------------检测密码重用是否限制为5次----------------"
#password sufficient pam_unix.so: 这部分指定了当用户尝试更改密码时,应使用pam_unix.so模块来验证新密码。sufficient意味着如果这个模块成功验证了密码,那么密码更改操作就成功,不需要继续检查其他PAM模块。
#remember=5: 这个参数指定了密码策略应检查新密码与过去5次使用的密码是否重复。如果新密码与这5次中的任何一次重复,该策略将拒绝更改密码。
set -e
Authcfg='/etc/pam.d/password-auth /etc/pam.d/system-auth'
for filename in ${Authcfg}
do
if [ -z "`grep -E 'password' ${filename} | grep 'sufficient' | grep remember=5 | grep pam_unix.so`" ]
then
echo "检测结果为:检测密码重用未限制为5次"
else
echo "检测结果为:检测密码重用已限制为5次"fi
doneecho "----------------检测是否设置密码失效时间----------------"
#/etc/login.defs 中将 PASS_MAX_DAYS 参数设置为 60-180之间;
pass_max_days=`cat /etc/login.defs | grep PASS_MAX_DAYS | grep -v '#'`
if [ -z "$pass_max_days" ]; then
echo "检测结果为:未设置密码失效时间"
elif [ `cat /etc/login.defs | grep PASS_MAX_DAYS | grep -v '#'| awk '{print $2}'` -gt 180 ] || [ `cat /etc/login.defs | grep PASS_MAX_DAYS | grep -v '#'| awk '{print $2}'` -lt 60 ]; then
echo "检测结果为:设置密码失效时间不在60-180天范围内"
else
echo "检测结果为:设置密码失效时间在60-180天范围内"
fiecho "----------------检测是否设置修改密码最小间隔时间----------------"
#在 /etc/login.defs 中将 PASS_MIN_DAYS 参数设置为7-14之间,建议为7:
pass_min_days=`cat /etc/login.defs | grep PASS_MIN_DAYS | grep -v '#'`
if [ -z "$pass_min_days" ]; then
echo "检测结果为:未设置修改密码最小间隔时间"
elif [ `cat /etc/login.defs | grep PASS_MIN_DAYS | grep -v '#'| awk '{print $2}'` -gt 14 ] || [ `cat /etc/login.defs | grep PASS_MAX_DAYS | grep -v '#'| awk '{print $2}'` -lt 7 ]; then
echo "检测结果为:设置修改密码最小间隔时间不在7-14天范围内"
else
echo "检测结果为:设置修改密码最小间隔时间在7-14天范围内"
fiecho "----------------检测密码过期告警时间是否大于等于7天----------------"
#密码过期警告时间应:大于等于7天;
set -e
cfgfile='/etc/login.defs'if [ `grep -E '^PASS_WARN_AGE' ${cfgfile} | awk '{print $2}'` -ge 7 ]
then
echo "检测结果为:密码过期告警时间已设置大于等于7天"else
echo "检测结果为:密码过期告警时间未设置大于等于7天"fiecho "----------------检测SSH访问是否受限制----------------"
#/etc/ssh/sshd_config文件中应存以下其中之一:
#AllowUsers <userlist>
#AllowGroups <grouplist>
#DenyUsers <userlist>
#DenyGroups <grouplist>
set -e  ##返回任何非0状态即退出脚本执行
sshd_config='/etc/ssh/sshd_config'
sshstatus=`ps -ef | grep sshd | grep -v grep | awk -F ' ' '{print $8$9}'`
if [ -z "$sshstatus" ]
then
echo "检测结果为:未开启ssh服务"
exit 2
fi
if [ -z "`grep -E '^AllowUsers|^AllowGroups|^DenyUsers|^DenyGroups' ${sshd_config}`" ]
then
echo "检测结果为:SSH访问未受限制"
else
echo "检测结果为:SSH访问已受限制"
fiecho "----------------检测SSH LogLevel设置是否为INFO----------------"
#开启日志info日志格式可以记录很多的日志信息以便回溯,比如登录操作告警失败等信息
sshd_confi='/etc/ssh/sshd_config'
log_level=`cat $sshd_confi | grep "LogLevel"| grep -v '^#'| awk -F ' ' '{print$1}'`
if [ -z "$log_level" ]; then
echo "检测结果为:SSH LogLevel设置为INFO"
elif [ "`cat $sshd_confi | grep "LogLevel"| grep -v '^#LogLevel' | awk '{print $2}'`" == "INFO" ]; then
echo "检测结果为:SSH LogLevel设置为INFO"
else
echo "检测结果为:SSH LogLevel设置为$log_level"
fiecho "----------------检测SSH的MaxAuthTries是否设置为小于等于4----------------"
#用于指定SSH服务器允许客户端进行身份验证尝试的最大次数
set -e
cfg='/etc/ssh/sshd_config'
cfgstatus1=`cat $cfg | grep MaxAuthTries | grep -v '#'| awk -F ' ' '{print$1}'`
if [ -z "$cfgstatus1" ]
then
echo "检测结果为:未设置此参数"
elif [ `cat $cfg | grep MaxAuthTries | grep -v '#'| awk -F ' ' '{print$2}'` -le 6 ]
then
echo "检测结果为:已设置为小于等于6"
else
echo "检测结果为:未设置为小于等于6"
fiecho "----------------检测是否禁用ssh端口转发功能----------------"
#GatewayPorts 设置no或者注释掉
result=`cat /etc/ssh/sshd_config | grep GatewayPorts | grep -v '#' | awk -F ' ' '{print$NF}'`if [ "$result" == "no" ] | [ -z  "$result" ];thenecho "检测结果为:已禁用ssh端口转发"
elseecho "检测结果为:已启用ssh端口转发"
fiecho "----------------检测ROOT是否UID为0的唯一用户----------------"
#root应为唯一的UID为0用户
set -e
cfgfile='/etc/passwd'
if [ `cat passwd | awk -F ':' '$3 == 0{print $1}'|wc -l` -eq 1 -a "`cat passwd | awk -F ':' '$3 == 0{print $1}'`" == "root" ]
then
echo "检测结果为:root是uid为0的唯一用户"else
echo "检测结果为:root不是uid为0的唯一用户"fiecho "----------------检测ROOT是否GID为0的唯一用户----------------"
#root应为唯一的GID为0用户
set -e
cfgfile='/etc/passwd'
root_gid=`cat ${cfgfile}|grep -E ^root | awk -F ':' '{print $4}'`
if [ ${root_gid} -eq 0 ]
then
echo "检测结果为:root是gid为0的唯一用户"else
echo "检测结果为:root不是gid为0的唯一用户"fiecho "----------------SSH空闲超时间隔是否设置----------------"
#/etc/ssh/sshd_config文件中 ClientAliveInterval应设置为:等于18000 ClientAliveCountMax应设置为:等于2
set -e
cfgfile='/etc/ssh/sshd_config'
ClientAliveInterval_key=`cat ${cfgfile} | grep ClientAliveInterval | awk '{print $1}'`
ClientAliveInterval_value=`cat ${cfgfile} | grep ClientAliveInterval | awk '{print $2}'`
ClientAliveCountMax_key=`cat ${cfgfile} | grep ClientAliveCountMax | awk '{print $1}'`
ClientAliveCountMax_value=`cat ${cfgfile} | grep ClientAliveCountMax | awk '{print $2}'`
if [ "${ClientAliveInterval_key}" == "" -o "${ClientAliveInterval_key}" == "#ClientAliveInterval" -o "${ClientAliveCountMax_key}" == "" -o "${ClientAliveCountMax_key}" == "#ClientAliveCountMax" ]
then
echo "检测结果为:未设置最大空闲时间"else
if [ ${ClientAliveInterval_value} -eq 18000 -a ${ClientAliveCountMax_value} -eq 2 ]
then
echo "检测结果为:最大空闲时间已设置为18000秒(5小时)X2=36000秒(10小时)"else
echo "检测结果为:最大空闲时间未设置为18000秒(5小时)X2=36000秒(10小时)"fi
fiecho "----------------检测是否禁止普通用户执行高危命令----------------"  
#/usr/bin/yum 权限为700 /usr/bin/rpm权限为700 /usr/bin/rz权限为700 /usr/bin/sz权限为700 /usr/bin/scp权限为700
#file1="/usr/bin/rz" 禁止普通用户上传
file2="/usr/bin/sz"  ##禁止普通用户下载(办公网与运维网场景不一样可能需要开放)
file4="/usr/bin/yum" ##禁止普通用户执行
file5="/usr/bin/rpm" ##禁止普通用户执行
permission="700"  # 替换为你期望的权限值,此值为仅支持root用户执行  
if [[ -f "$file1" && "$(stat -c '%a' "$file1")" == "$permission" ]]; then  echo "检测结果为:已禁止普通用户执行rz命令"
elseecho "检测结果为:未禁止普通用户执行rz命令"    
fi  if [[ -f "$file2" && "$(stat -c '%a' "$file2")" == "$permission" ]]; then  echo "检测结果为:已禁止普通用户执行sz命令"
elseecho "检测结果为:未禁止普通用户执行sz命令"    fi  if [[ -f "$file3" && "$(stat -c '%a' "$file3")" == "$permission" ]]; then  echo "检测结果为:已禁止普通用户执行scp命令"
elseecho "检测结果为:未禁止普通用户执行scp命令"     
fi  if [[ -f "$file4" && "$(stat -c '%a' "$file4")" == "$permission" ]]; then  echo "检测结果为:已禁止普通用户执行yum命令"
elseecho "检测结果为:未禁止普通用户执行yum命令"    
fiif [[ -f "$file5" && "$(stat -c '%a' "$file5")" == "$permission" ]]; then  echo "检测结果为:已禁止普通用户执行rpm命令"
elseecho "检测结果为:未禁止普通用户执行rpm命令"      fiecho "----------------检测是否禁用普通用户修改高危文件----------------"
#/etc/passwd权限为644/etc/group权限为644/etc/shadow权限为400/etc/gshadow权限为400/etc/hosts.deny权限为644/etc/hosts.allow权限为644
file1="/etc/passwd" ##禁止普通用户更改
file2="/etc/shadow" ##禁止普通用户查看
file3="/etc/group" ##禁止普通用户更改
file4="/etc/gshadow" ##禁止普通用户查看
file5="/etc/hosts.deny" ##禁止普通用户更改
file6="/etc/hosts.allow" ##禁止普通用户更改
permission1="644"  # 替换为你期望的权限值,此值为仅支持root用户更改  
permission2="400"  # 替换为你期望的权限值,即只有root用户可查看
if [[ -f "$file1" && "$(stat -c '%a' "$file1")" == "$permission1" ]]; then  echo "检测结果为:已禁止普通用户更改passwd文件"
elseecho "检测结果为:未禁止普通用户更改passwd文件"    
fi  
if [[ -f "$file3" && "$(stat -c '%a' "$file3")" == "$permission1" ]]; then  echo "检测结果为:已禁止普通用户更改group文件"
elseecho "检测结果为:未禁止普通用户更改group文件"    
fi  if [[ -f "$file2" && "$(stat -c '%a' "$file2")" == "$permission2" ]]; then  echo "检测结果为:已禁止普通用户读取shadow文件"
elseecho "检测结果为:未禁止普通用户读取shadow文件"    fi
if [[ -f "$file4" && "$(stat -c '%a' "$file4")" == "$permission2" ]]; then  echo "检测结果为:已禁止普通用户读取gshadow文件"
elseecho "检测结果为:未禁止普通用户读取gshadow文件"    
fi  
if [[ -f "$file5" && "$(stat -c '%a' "$file5")" == "$permission2" ]]; then  echo "检测结果为:已禁止普通用户更改hosts.deny文件"
elseecho "检测结果为:未禁止普通用户更改hosts.deny文件"    
fi  
if [[ -f "$file6" && "$(stat -c '%a' "$file6")" == "$permission2" ]]; then  echo "检测结果为:已禁止普通用户更改hosts.allow文件"
elseecho "检测结果为:未禁止普通用户更改hosts.allow文件"    
fi  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/539178.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vscode 向下复制当前行(即visual studio 中的Ctrl + D)功能快捷键

参考:https://blog.csdn.net/haihui1996/article/details/87937912 打开vscode左下角键盘快捷键设置,找到copy line down,即可查看当前默认快捷键为“shift Alt ↓” 双击快捷键,输入自己想要的快捷组合,如CtrlD,然…

Spring基础——使用注解开发SpringMVC

目录 配置SpringMVC的初始化信息配置ServletWebApplicationContext配置RootWebApplicationContext配置ServletContext 创建Controller控制器配置Controller响应路径接收用户传递参数接收JSON数据接收简单类型对象封装参数 接收数组类型 Restful 文章源码仓库:Spring…

JavaEE之多线程(创建线程的五种写法)详解

😽博主CSDN主页: 小源_😽 🖋️个人专栏: JavaEE 😀努力追逐大佬们的步伐~ 目录 1. 前言 2. 操作系统"内核" 3. 创建线程的五种写法 (我们重点要掌握最后一种写法!!) 3.1 继承 Thread, 重写 run 3. 2 实现 Runnabl…

【Flink SQL】Flink SQL 基础概念:SQL 的时间属性

Flink SQL 基础概念:SQL 的时间属性 1.Flink 三种时间属性简介2.Flink 三种时间属性的应用场景2.1 事件时间案例2.2 处理时间案例2.3 摄入时间案例 3.SQL 指定时间属性的两种方式4.SQL 事件时间案例5.SQL 处理时间案例 与离线处理中常见的时间分区字段一样&#xff…

云端巨擘:大数据与云计算的时代航向

文章目录 大数据时代大数据特点(4v1C大数据与云计算的关系 云计算云计算定义云计算特点云计算分类(服务类型)云计算实现机制云计算体系结构云计算的管理中间件层 大数据时代 大数据定义:海量数据或巨量数据,其规模巨大到无法通过…

opencv中的图像高斯双边模糊—bilateralFilter函数

高斯双边滤波(Bilateral Filtering)是一种非线性的滤波方法,用于平滑图像,同时保留边缘。与传统的高斯模糊不同,双边滤波在平滑图像的同时,能够避免模糊边缘。这是通过考虑像素值的差异来实现的&#xff1a…

Restormer: Efficient Transformer for High-Resolution Image Restoration

Abstract 由于卷积神经网络(CNN)在从大规模数据中学习可概括的图像先验方面表现良好,因此这些模型已广泛应用于图像恢复和相关任务。最近,另一类神经架构 Transformer 在自然语言和高级视觉任务上表现出了显着的性能提升。虽然 T…

操作系统(AndroidIOS)图像绘图的基本原理

屏幕显示图像的过程 我们知道,屏幕是由一个个物理显示单元组成,每一个单元我们可以称之为一个物理像素点,而每一个像素点可以发出多种颜色。 而图像,就是在不同的物理像素点上显示不同的颜色构成的。 像素点的颜色 像素的颜色是…

影城管理系统|基于springboot框架+ Mysql+Java+B/S架构的影城管理系统设计与实现(可运行源码+数据库+设计文档+部署说明)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 管理员功能登录前台功能效果图 系统功能设计 数据库E-R图设计 lunwen参考 摘要 研究…

JVM基础篇

什么是JVM java虚拟机 JVM的功能 1.解释和运行 对字节码文件中的指令,实时的解释成机器码,让计算机执行 2.内存管理 自动为对象、方法等分配内存 自动的垃圾回收机制,回收不再使用的对象(c不会自动回收,相当于降…

【源码独家】GPU池化平台 AI训练平台 AI推理平台

GPU池化软件 | (AI人工智能训练平台、AI人工智能推理平台) 讨论群v:🚀18601938676 一、AI人工智能开发-------------面临的问题和挑战 1. GPU管理难题 1.1 资源管理难:算力资源昂贵,但是缺乏有效管理,闲置情况严重。 1.2 用户…

Flutter 多语言自动化本地化生成器

Flutter 多语言自动化本地化生成器 这是一个为Flutter设计的插件,通过从Excel表格提取的CSV文件自动生成Dart本地化文件,以简化应用程序本地化的流程。这个工具通过自动化创建多语言资源文件,简化了开发人员和翻译人员的工作流程。 特点 默…