当前位置: 首页 > news >正文

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-全能写作助手 网址&#xff…...

泛癌热门靶点TROP2及研究工具试剂

前 言 TROP2属于肿瘤相关抗原之一,在多种肿瘤中表达升高,促进肿瘤细胞生长、增殖和转移。TROP2已经成为近年来NEJM、肿瘤学期刊、药物研发的多重热点。通过PubMed检索到477篇相关文献,自2020年文献数量逐步增加,2022年达81篇&am…...

2848. 与车相交的点

2848. 与车相交的点 题目链接&#xff1a;2848. 与车相交的点 代码如下&#xff1a; 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数之和&#xff0c;和3数之和的衍生吧&#xff0c;核心算法还是双指针&#xff1b; 暴力解法就不再说了&#xff1a;排序暴力set去重&#xff1b; 直接上&#xff1a;排序双指针去重 大致思路如上图&#xff0c;如果要详细算法过程&#xff0c;可以就看看两数…...

TypeScript中 interface接口 type关键字 enum枚举类型

type interface总是傻傻分不清~~~ Type Aliases (type) type 关键字用于为类型定义一个别名。这可以是基本类型、联合类型、元组、数组、函数等。type 定义的类型在编译后的 JavaScript 代码中会被移除&#xff0c;不会留下任何运行时的代码。 //联合类型 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 不存在&#xff0c;尝试…...

简述微服务高可用之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全部回车&#xff0c;密钥存储路径默认是 ~/.ssh/id_rsa 服务器 确认服务器公钥配置允许远程公钥认证 sudo vim /et…...

C++ -string -常见用法2

博客主页&#xff1a;【夜泉_ly】 本文专栏&#xff1a;【C】 欢迎点赞&#x1f44d;收藏⭐关注❤️ 文章目录 &#x1f4a1;前言&#x1f4a1;访问及遍历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 广告单元格插件的核心优势在于其无与伦比的灵活性。无论您是想要创建整齐的网格布局,还是希望打造独特的不规则设计,这款插件都能满足您的需求。 自定义网格数量&#xff1a;从 2…...

前端的AI工具:ChatGPT Canvas与Claude Artifacts对比 -仅仅是OpenAI一个迟来的追赶吗?- 贺星舰五飞试验成功

如果你对OpenAI的ChatGPT Canvas和Anthropic的Claude Artifacts有所耳闻&#xff0c;可能会想知道这两个工具有何不同&#xff0c;以及哪个能让你的工作流程更加顺畅。这两个工具旨在提升生产力&#xff0c;但侧重点各异——编码、写作、创意和实时反馈。 本文将深入探讨ChatG…...

保姆级教程:用华为eNSP复现一个能跑通的企业网毕业设计(含VRRP、OSPF、防火墙策略)

华为eNSP企业网实战&#xff1a;从零构建高可用网络架构 刚接触网络工程的学生或初级工程师&#xff0c;面对企业级网络设计时常常陷入配置迷雾——为什么这里要用VRRP&#xff1f;OSPF区域划分的依据是什么&#xff1f;防火墙策略如何与NAT协同工作&#xff1f;本文将以华为eN…...

驱动残留清理技术解析:Display Driver Uninstaller实战指南

驱动残留清理技术解析&#xff1a;Display Driver Uninstaller实战指南 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers-uninsta…...

从安装到第一个程序:VS2022社区版+C语言开发极简入门(含代码模板)

从安装到第一个程序&#xff1a;VS2022社区版C语言开发极简入门 在数字化浪潮席卷各行各业的今天&#xff0c;编程能力已成为继外语之后的又一基础技能。对于非计算机专业背景的学习者而言&#xff0c;选择合适的学习路径尤为重要。Visual Studio 2022社区版作为微软官方提供的…...

IPXWrapper终极指南:三步让Windows 11完美运行经典游戏联机对战

IPXWrapper终极指南&#xff1a;三步让Windows 11完美运行经典游戏联机对战 【免费下载链接】ipxwrapper 项目地址: https://gitcode.com/gh_mirrors/ip/ipxwrapper 还在为Windows 11无法运行《红色警戒2》、《星际争霸》等经典游戏而烦恼吗&#xff1f;IPXWrapper正是…...

Easypoi导出Excel时,如何优雅地处理‘未知’或‘空值’?一个replace动态替换的实战技巧

Easypoi动态替换Excel导出中的未知值与空值&#xff1a;实战技巧与最佳实践 在数据导出场景中&#xff0c;我们经常遇到数据库枚举值与Excel展示不匹配的问题。比如性别字段&#xff0c;除了标准的"男"、"女"外&#xff0c;还可能存在空值或超出预设范围的…...

Thorium浏览器:重新定义Chromium性能的颠覆性优化方案

Thorium浏览器&#xff1a;重新定义Chromium性能的颠覆性优化方案 【免费下载链接】thorium Chromium fork named after radioactive element No. 90. Windows and MacOS/Raspi/Android/Special builds are in different repositories, links are towards the top of the READM…...

Qwen3-14B镜像轻量化设计:50GB系统盘+40GB数据盘高效空间管理

Qwen3-14B镜像轻量化设计&#xff1a;50GB系统盘40GB数据盘高效空间管理 1. 镜像概述与核心优势 Qwen3-14B私有部署镜像是一款专为RTX 4090D 24GB显存显卡优化的轻量化解决方案。通过精心设计的50GB系统盘40GB数据盘架构&#xff0c;实现了大模型部署的空间效率最大化。这个镜…...

如何快速实现ngx-bootstrap国际化:多语言应用开发完整指南

如何快速实现ngx-bootstrap国际化&#xff1a;多语言应用开发完整指南 【免费下载链接】ngx-bootstrap Fast and reliable Bootstrap widgets in Angular (supports Ivy engine) 项目地址: https://gitcode.com/gh_mirrors/ng/ngx-bootstrap ngx-bootstrap作为Angular生…...

Java程序员如何入门音视频开发

对于Java程序员来说&#xff0c;他们缺乏参与音频和视频项目的经验。如何快速开始&#xff1f;你需要立即学习C吗&#xff1f;答案是否定的。 成功的关键在于循序渐进&#xff0c;从扎实的理论基础入手。第一步是学习多媒体基础理论。一本名为“多媒体基础概论”的教科书&#…...

5B00,5B01,5B02,1700,1701,1702,1704,P07清零软件G3800,TS3480 ,TS3380 ,G3000,G1810,TS9020, TS8020,TS3480

下载地址&#xff1a;链接:https://pan.baidu.com/s/1j7Nwv715wX1JL3qidnGyXA?pwd0000 提取码:0000 常见 佳能打印机 型号&#xff1a; G5080 G6080 G7080 G1810 G2810 G3810 G4810 G1800 G2800 G3800 G4800 G5010 G6010 G7010 G1010 G2010 G3010 G4010 G1000 G2000 G3000 G40…...