Centos基线自动化检查脚本
此脚本是一个用于检查Linux系统安全配置的Bash脚本。它通过多项安全标准对系统进行评估,主要检查以下内容:
-
IP地址获取:脚本首先获取主机的IP地址,确保其以10.115开头。
-
密码策略检查:
检查最小密码长度(PASS_MIN_LEN),确保至少为12。
检查密码最大生存周期(PASS_MAX_DAYS),确保为90天。
检查密码复杂度策略,确保满足特定要求。 -
用户权限与账户管理:
检查是否限制普通用户使用su命令切换到root用户。
确认是否存在普通用户账户。
检查是否删除了不必要的工作账户(如listen, gdm等)。 -
系统安全配置:
检查文件和目录的默认权限(umask),确保为027。
检查命令行界面的超时退出设置(TMOUT),确保为300秒。
确保启用了syslog日志审计。
确认日志文件的权限设置。 -
FTP与SSH配置:
检查FTP匿名用户是否禁用,VSFTP是否禁用匿名登录。
确保root用户的FTP登录被禁用。
检查SSH服务的状态,确保其启用。
危险文件检查:查找潜在危险文件(如/etc/hosts.equiv等)并确认其不存在。 -
Telnet检查:确认Telnet服务未启用,检查相关配置文件。
-
服务与端口管理:检查不必要的服务和端口是否关闭。
-
DNS配置检查:确保DNS配置符合指定的标准。
最后,脚本会输出不合格项和检查失败项的详细信息,并提供检查的汇总,包括总检查项数、合格数、不合格数和检查失败数。
该脚本适用于系统管理员定期审计和加强Linux系统的安全性。
脚本代码:
#!/bin/bash# 初始化计数器
total_checks=0
pass_checks=0
fail_checks=0
not_found_checks=0
declare -a results# 获取主机的IP地址(以10.123开头)
ip_address=$(ip addr | awk '/inet / && /10\.123\./ {gsub(/\/[0-9]+/, "", $2); print $2}')
echo "主机IP:$ip_address"# 检查口令最小长度
total_checks=$((total_checks + 1))
PASS_MIN_LEN=$(grep '^PASS_MIN_LEN' /etc/login.defs | awk '{print $2}')
if [[ -n $PASS_MIN_LEN ]]; thenif [[ $PASS_MIN_LEN -ge 12 ]]; thenpass_checks=$((pass_checks + 1))elseresults+=("PASS_MIN_LEN ($PASS_MIN_LEN) 不符合标准")fail_checks=$((fail_checks + 1))fi
elseresults+=("PASS_MIN_LEN 未找到")not_found_checks=$((not_found_checks + 1))
fi# 检查口令生存周期
total_checks=$((total_checks + 1))
PASS_MAX_DAYS=$(grep '^PASS_MAX_DAYS' /etc/login.defs | awk '{print $2}')
if [[ -n $PASS_MAX_DAYS ]]; thenif [[ $PASS_MAX_DAYS -eq 90 ]]; thenpass_checks=$((pass_checks + 1))elseresults+=("PASS_MAX_DAYS ($PASS_MAX_DAYS) 不符合标准")fail_checks=$((fail_checks + 1))fi
elseresults+=("PASS_MAX_DAYS 未找到")not_found_checks=$((not_found_checks + 1))
fi# 检查密码复杂度策略
total_checks=$((total_checks + 1))
PAM_CONFIG="/etc/pam.d/system-auth"# 检查未注释的密码复杂度策略
if grep -q "^[^#]*password\s\+requisite\s\+pam_pwquality.so" "$PAM_CONFIG"; then# 直接提取行并检查参数line=$(grep "^[^#]*password\s\+requisite\s\+pam_pwquality.so" "$PAM_CONFIG")# 提取每个参数ucredit=$(echo "$line" | grep -o 'ucredit=[-0-9]*' | cut -d'=' -f2)lcredit=$(echo "$line" | grep -o 'lcredit=[-0-9]*' | cut -d'=' -f2)dcredit=$(echo "$line" | grep -o 'dcredit=[-0-9]*' | cut -d'=' -f2)ocredit=$(echo "$line" | grep -o 'ocredit=[-0-9]*' | cut -d'=' -f2)# 检查参数值是否均为 -1if [[ "$ucredit" == "-1" && "$lcredit" == "-1" && "$dcredit" == "-1" && "$ocredit" == "-1" ]]; thenpass_checks=$((pass_checks + 1))elseresults+=("密码复杂度配置不符合标准: ucredit=$ucredit, lcredit=$lcredit, dcredit=$dcredit, ocredit=$ocredit")fail_checks=$((fail_checks + 1))fi
elseresults+=("未配置有效的密码复杂度策略")not_found_checks=$((not_found_checks + 1))
fi
# 检查是否限制用户su到root
total_checks=$((total_checks + 1))
# 检查 pam_rootok.so
if grep -q '^[^#]*auth\s\+sufficient\s\+pam_rootok.so' /etc/pam.d/su; thenpass_checks=$((pass_checks + 1))
elseecho "未找到: auth sufficient pam_rootok.so"
fi# 检查 pam_wheel.so
if grep -q '^[^#]*auth\s\+required\s\+pam_wheel.so\s\+group=wheel' /etc/pam.d/su; thenpass_checks=$((pass_checks + 1))
elseecho "未找到: auth required pam_wheel.so group=wheel"
fi# 根据找到的情况更新失败检查数
if [ "$pass_checks" -lt 2 ]; thenresults+=("用户su限制不符合标准")fail_checks=$((fail_checks + 1))
fi# 检查是否按用户分配账号
total_checks=$((total_checks + 1))
if grep -qE '^[^:]+:.*' /etc/passwd; thenpass_checks=$((pass_checks + 1))
elseresults+=("不存在普通用户账号")fail_checks=$((fail_checks + 1))
fi# 检查是否删除工作账号
for user in listen gdm webservd nobody nobody4 noaccess; dototal_checks=$((total_checks + 1))if grep -q "^$user:" /etc/passwd; thenresults+=("账号 $user 存在")fail_checks=$((fail_checks + 1))elsepass_checks=$((pass_checks + 1))fi
done# 检查是否设置文件与目录缺省权限
total_checks=$((total_checks + 1))
UMASK=$(grep '^umask' /etc/profile)
if [[ -n $UMASK ]]; thenif [[ $UMASK == *"027"* ]]; thenpass_checks=$((pass_checks + 1))elseresults+=("umask 设置不符合标准")fail_checks=$((fail_checks + 1))fi
elseresults+=("umask 未找到")not_found_checks=$((not_found_checks + 1))
fi# 检查命令行界面超时退出
total_checks=$((total_checks + 1))
TMOUT=$(grep '^export TMOUT=' /etc/profile)
if [[ -n $TMOUT ]]; then# 提取 TMOUT 的值TMOUT_VALUE=$(echo "$TMOUT" | cut -d'=' -f2 | tr -d ' ')# 检查是否设置为 300if [[ "$TMOUT_VALUE" == "300" ]]; thenpass_checks=$((pass_checks + 1))elseresults+=("TMOUT 设置不符合标准,当前值为: $TMOUT_VALUE")fail_checks=$((fail_checks + 1))fi
elseresults+=("TMOUT 未找到")not_found_checks=$((not_found_checks + 1))
fi# 检查是否启用syslog日志审计
total_checks=$((total_checks + 1))
if systemctl is-active --quiet rsyslog; thenpass_checks=$((pass_checks + 1))
elseresults+=("syslog 日志审计未启用")fail_checks=$((fail_checks + 1))
fi# 检查日志文件权限
declare -A expected_permissions=(["/var/log/cron"]="775"["/var/log/secure"]="775"["/var/log/messages"]="755"["/var/log/maillog"]="775"["/var/log/boot.log"]="775"["/var/log/mail"]="775"["/var/log/spooler"]="775"
)# 检查每个日志文件的权限
for file in "${!expected_permissions[@]}"; dototal_checks=$((total_checks + 1))if [[ -f $file ]]; thenperms=$(ls -ld "$file" | awk '{print $1}')# 检查其他用户权限if [[ ${perms:8:1} == "w" ]]; thenresults+=("$file 权限不符合标准")fail_checks=$((fail_checks + 1))elsepass_checks=$((pass_checks + 1))fielse# 文件不存在时将其视为符合标准pass_checks=$((pass_checks + 1)) # 符合标准fi
done# 检查FTP及SSH相关配置
total_checks=$((total_checks + 1))
if ! grep -q 'ftp' /etc/passwd; thenpass_checks=$((pass_checks + 1))
elseresults+=("FTP匿名用户未禁用")fail_checks=$((fail_checks + 1))
fi# 检查VSFTP配置
total_checks=$((total_checks + 1))
if [ ! -f /etc/vsftpd.conf ] || grep -q "anonymous_enable=NO" /etc/vsftpd.conf; thenpass_checks=$((pass_checks + 1))
elseresults+=("VSFTP未禁用匿名登录")fail_checks=$((fail_checks + 1))
fi# 检查root用户FTP登录
total_checks=$((total_checks + 1))
if [ ! -f /etc/ftpusers ] || grep -q 'root' /etc/ftpusers; thenpass_checks=$((pass_checks + 1))
elseresults+=("root 用户FTP登录未禁用")fail_checks=$((fail_checks + 1))
fi# 检查SSH服务状态
total_checks=$((total_checks + 1))
if systemctl is-active --quiet sshd; thenpass_checks=$((pass_checks + 1))
elseresults+=("SSH服务未启用")fail_checks=$((fail_checks + 1))
fi# 检查是否删除潜在危险文件
for file in /etc/hosts.equiv /etc/.rhosts /etc/.netrc; dototal_checks=$((total_checks + 1))if [[ -e $file ]]; thenresults+=("$file 存在")fail_checks=$((fail_checks + 1))elsepass_checks=$((pass_checks + 1))fi
done# 检查是否安装了 telnet 和 telnet-server
total_checks=$((total_checks + 1))
if rpm -qa | grep -qE "telnet|telnet-server"; then# 如果安装了,检查 /etc/xinetd.d/telnet 配置total_checks=$((total_checks + 1))if [[ -f /etc/xinetd.d/telnet ]]; thendisable_line=$(grep -E "^disable" /etc/xinetd.d/telnet)if [[ $disable_line == "disable = no" ]]; thenresults+=("Telnet服务仍在启用")fail_checks=$((fail_checks + 1))elsepass_checks=$((pass_checks + 1))fielsepass_checks=$((pass_checks + 1))fi
elsepass_checks=$((pass_checks + 1))
fi# 检查是否关闭不必要的服务和端口
total_checks=$((total_checks + 1))
if ps -ef | grep -q '[f]tp'; thenresults+=("FTP服务仍在运行")fail_checks=$((fail_checks + 1))
elsepass_checks=$((pass_checks + 1))
fi# 检查DNS配置
total_checks=$((total_checks + 1))
DNS_IPS=("114.114.114.114" "233.5.5.5") # 指定的DNS IP地址
DNS_CONFIG=$(grep -E '^nameserver' /etc/resolv.conf | awk '{print $2}')if [[ -n $DNS_CONFIG ]]; thenfound_ip=falsefor ip in "${DNS_IPS[@]}"; doif [[ "$DNS_CONFIG" == *"$ip"* ]]; thenfound_ip=truebreakfidoneif [[ $found_ip == false ]]; thenresults+=("DNS配置不符合标准: 未找到指定的DNS IP")fail_checks=$((fail_checks + 1))elsepass_checks=$((pass_checks + 1)) # 如果找到了至少一个IP,增加合格计数fi
elseresults+=("DNS配置未找到")not_found_checks=$((not_found_checks + 1))
fi# 输出不合格项和检查失败项
if [ ${#results[@]} -ne 0 ]; thenecho "不合格项和检查失败项:"for result in "${results[@]}"; doecho "$result"done
elseecho "所有检查项均符合标准。"
fi# 输出汇总
echo ""
echo "检查汇总:"
echo "总检查项数: $total_checks"
echo "合格数: $pass_checks"
echo "不合格数: $fail_checks"
echo "检查失败数: $not_found_checks"
检查结果示例:

相关文章:
Centos基线自动化检查脚本
此脚本是一个用于检查Linux系统安全配置的Bash脚本。它通过多项安全标准对系统进行评估,主要检查以下内容: IP地址获取:脚本首先获取主机的IP地址,确保其以10.115开头。 密码策略检查: 检查最小密码长度(P…...
OpenCV答题卡识别
文章目录 一、基本流程二、代码实现1.定义函数2.图像预处理(1)高斯模糊、边缘检测(2)轮廓检测(3)透视变换(4)阈值处理和轮廓检测 3.筛选和排序选项轮廓4.判断答案5.显示结果 三、总结…...
通用数据库对象设计
1. 公共属性 这里的数据模型以陈品山的实体-关系模型为基础,增加了两点修改。一是用“组”的概念表达实体间关系,并将组作为一种特殊实体。二是采用继承的思想,将实体的公共属性提取出来,放到统一表中。实体的特有属性保存在单独…...
Java基础12-特殊文件和日志技术
十二、特殊文件和日志技术 1、特殊文件 properties:用来存储键值对数据。 xml:用来存储有关系的数据。 1.1 properties文件 特点:存储键值对,键不能重复,文件后缀一般是.properties结尾的。 properties:是…...
2.4 STM32启动过程
目录 一,启动Flow 1.1 初始化MSP 1.2 初始化PC 1.3 设置堆栈大小 1.4初始化中断向量表 1.5 调用初始化函数(可选) 1.6 调用__main 二,Reset_Handler函数 一,启动Flow 下面是stm32在内部FLASH启动的启动建议流程图,在stm32复位到执行我们程序的main函数的过程中,…...
rm: cannot remove: Device or resource busy 解决方案
大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...
2024年的5款AI写作工具,你用过几个?
AI技术正逐渐渗透到我们生活的方方面面,其中就包括写作领域。今天,我要为大家介绍5款实用的AI写作助手,它们将帮助你提高写作效率,激发创作灵感,让你的写作之路更加顺畅。 1. 宙语Cosmos-全能写作助手 网址ÿ…...
泛癌热门靶点TROP2及研究工具试剂
前 言 TROP2属于肿瘤相关抗原之一,在多种肿瘤中表达升高,促进肿瘤细胞生长、增殖和转移。TROP2已经成为近年来NEJM、肿瘤学期刊、药物研发的多重热点。通过PubMed检索到477篇相关文献,自2020年文献数量逐步增加,2022年达81篇&am…...
2848. 与车相交的点
2848. 与车相交的点 题目链接:2848. 与车相交的点 代码如下: class Solution { public:int numberOfPoints(vector<vector<int>>& nums){set<int> s;for (int i 0; i < nums.size(); i){for (int j nums[i][0]; j < nu…...
第1节 入门
文章目录 1. URL 组成部分详解2. 第一个 Django 项目2.1 项目结构2.2 project 和 app 的关系 3. URL 与视图函数的映射4. URL 的两种传参方式4.1 通过字符串查询4.2 在 path 中携带 5. path 函数详解6. 路由模块化7. 路由反转 1. URL 组成部分详解 URL 的基本组成格式 scheme…...
四数之和(medium)08
其实这道题就是求2数之和,和3数之和的衍生吧,核心算法还是双指针; 暴力解法就不再说了:排序暴力set去重; 直接上:排序双指针去重 大致思路如上图,如果要详细算法过程,可以就看看两数…...
TypeScript中 interface接口 type关键字 enum枚举类型
type interface总是傻傻分不清~~~ Type Aliases (type) type 关键字用于为类型定义一个别名。这可以是基本类型、联合类型、元组、数组、函数等。type 定义的类型在编译后的 JavaScript 代码中会被移除,不会留下任何运行时的代码。 //联合类型 type StringOrNumbe…...
vue3.2实现AES加密解密,秘钥通过API获取,并混淆秘钥,后端thinkphp
aes.ts文件 import CryptoJS from "crypto-js"; import axios from "axios";export const encrypt async(data: any) > {let storeKey sessionStorage.getItem(a)let storeIv:any sessionStorage.getItem(i)// 如果秘钥或 IV 不存在,尝试…...
简述微服务高可用之Sentinel、Seate
简述微服务高可用之Sentinel、Seate使用 下文主要讲述使用sentinel,如何降级限流熔断及如何使用seata管理分布式事务 sentinel服务端安装与使用 1、下载 进入https://github.com/alibaba/Sentinel/releases 根据你的需求进行下载对应版本 我这里是JDK17 下载的1.8.8版本&am…...
将爱传递 将“服务好”延伸
从泰康客户,转身成为泰康人,她直言是因为亲身感受了泰康“服务好”的魅力。 入司已8年的泰康养老浙江分公司HWP何英英,是泰康“服务好”的受益者。她从朋友的理赔中见证了泰康服务好的温度与力量,又被泰康养老的职域模式所吸引选择加入泰康。如今,她全身心投入在服务的第一线,…...
基于MinIO配置bucket,用于文件下载和浏览
文章目录 引言I 配置文件浏览安装MinIO配置自启动服务访问权限配置文件浏览访问地址文件下载地址II 知识扩展MinIO内置访问策略只读策略只写策略读写策略diagnosticsconsoleAdmin引言 需求:文件下载用于OTA升级,文件浏览用于产品展示。 实现方案:基于MinIO配置bucket访问权…...
Ubuntu 配置 ssh 免密连接、安装Docker、docker-compose
Ubuntu 配置 ssh 免密连接 本机 #生成密钥 ssh-keygen -t rsa -b 4096 #发送公钥到服务器 ssh-copy-id usernameremote_host #测试 ssh usernameremote_host全部回车,密钥存储路径默认是 ~/.ssh/id_rsa 服务器 确认服务器公钥配置允许远程公钥认证 sudo vim /et…...
C++ -string -常见用法2
博客主页:【夜泉_ly】 本文专栏:【C】 欢迎点赞👍收藏⭐关注❤️ 文章目录 💡前言💡访问及遍历1.速览2.operator[] -重点⭐2.1函数原型2.2用法2.3与at 3.迭代器3.1函数原型3.2用法速览3.3简介 4.范围for4.1用法速览4.2…...
为您的 WordPress 网站打造完美广告布局 A5广告单元格插件
一个为 WordPress 网站量身定制的强大工具,它将彻底改变您展示广告的方式 灵活多变的布局设计 A5 广告单元格插件的核心优势在于其无与伦比的灵活性。无论您是想要创建整齐的网格布局,还是希望打造独特的不规则设计,这款插件都能满足您的需求。 自定义网格数量:从 2…...
前端的AI工具:ChatGPT Canvas与Claude Artifacts对比 -仅仅是OpenAI一个迟来的追赶吗?- 贺星舰五飞试验成功
如果你对OpenAI的ChatGPT Canvas和Anthropic的Claude Artifacts有所耳闻,可能会想知道这两个工具有何不同,以及哪个能让你的工作流程更加顺畅。这两个工具旨在提升生产力,但侧重点各异——编码、写作、创意和实时反馈。 本文将深入探讨ChatG…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
