银河麒麟操作系统安全加固专业操作手册

开源AI·十一月创作之星挑战赛 10w+人浏览 556人参与

文档信息

项目内容
文档名称银河麒麟操作系统(桌面版/服务器版)安全加固操作手册
编写目的指导运维/安全人员完成银河麒麟系统安全加固,满足等保2.0二级/三级合规要求
适用版本银河麒麟Kylin Desktop V4/V10、Kylin Server V4/V10(x86_64/ARM架构)
受众系统运维工程师、网络安全工程师、合规审计人员
文档版本V2.0
修订日期2025-11-13

前言

银河麒麟作为国产自主可控操作系统核心产品,广泛应用于政务、金融、能源等关键领域。本手册基于“最小权限、纵深防御、合规落地”三大原则,从环境准备→模块加固→结果验证→应急回滚全流程,提供可落地的操作指南,同时区分桌面版与服务器版差异化需求,平衡安全性与业务可用性。

手册核心覆盖6大加固模块:密码策略、防火墙配置、账户权限、审计日志、系统加固、补丁管理,所有操作均经过实测验证,可直接应用于生产环境。

第一章 环境准备

1.1 前置条件确认

在执行加固前,需完成以下检查,避免操作失败或业务中断:

检查项检查标准操作命令/方法
系统版本验证确认当前系统为银河麒麟V4/V10,且区分桌面/服务器版cat /etc/kylin-releaselsb_release -a
权限验证必须以root权限执行所有操作(普通用户无系统配置修改权限)id -u(返回0即为root);非root用户执行 sudo -i 切换
业务状态确认服务器版需提前确认业务停机窗口(部分操作需重启服务,建议非高峰执行)通知业务方,记录当前运行服务:systemctl list-unit-files --type=service --state=running
存储空间检查需预留至少10GB空闲空间(用于配置备份、日志存储、补丁下载)df -h(重点查看/var分区,审计日志与备份文件默认存储于此)
网络状态确认服务器版需确保与yum源连通(离线环境需提前准备离线补丁包)在线环境:ping mirrors.kylinos.cn -c 3;离线环境:确认离线包已拷贝至服务器
数据备份提前备份核心业务数据(如数据库、配置文件),避免加固误操作导致数据丢失业务数据备份:按现有备份流程执行;系统配置备份:后续章节将自动完成

1.2 工具准备

工具类型用途安装命令(若未预装)
firewalld系统防火墙管理(银河麒麟默认预装,无需额外安装)验证是否安装:rpm -q firewalld;缺失时安装:yum install firewalld -y
auditd系统审计服务(默认预装,负责日志采集)验证:rpm -q audit;缺失时安装:yum install audit audit-libs -y
sed/awk配置文件修改工具(系统自带)验证:sed --versionawk --version
离线补丁包(可选)离线环境系统更新使用,需从银河麒麟官方渠道下载对应版本补丁官方下载地址:银河麒麟技术支持平台

第二章 核心加固模块操作指南

模块1:密码策略加固(桌面版/服务器版通用)

1.1 操作目的

通过强密码规则、账户锁定机制,防范暴力破解与弱密码风险,符合等保2.0“身份鉴别”控制点要求。

1.2 分步操作
步骤1:配置基础密码规则(/etc/login.defs

该文件控制系统默认密码有效期、长度等基础规则,操作如下:

# 1. 备份原始配置文件(关键操作前必须备份)
cp /etc/login.defs /etc/login.defs.bak_$(date +%Y%m%d)

# 2. 修改密码有效期、长度等参数(使用sed命令精准替换,避免手动编辑出错)
sed -i 's/^PASS_MAX_DAYS.*/PASS_MAX_DAYS 90/' /etc/login.defs  # 密码最长有效期90天
sed -i 's/^PASS_MIN_DAYS.*/PASS_MIN_DAYS 7/' /etc/login.defs  # 密码修改间隔≥7天
sed -i 's/^PASS_MIN_LEN.*/PASS_MIN_LEN 12/' /etc/login.defs   # 密码最小长度12位
sed -i 's/^PASS_WARN_AGE.*/PASS_WARN_AGE 7/' /etc/login.defs  # 过期前7天提醒
步骤2:配置强密码复杂度(PAM模块)

通过pam_cracklib.so模块强制密码包含大小写字母、数字、特殊字符,操作如下:

# 1. 备份PAM配置文件
cp /etc/pam.d/system-auth /etc/pam.d/system-auth.bak_$(date +%Y%m%d)
cp /etc/pam.d/password-auth /etc/pam.d/password-auth.bak_$(date +%Y%m%d)

# 2. 配置system-auth(系统认证)
# 先删除原有pam_cracklib.so规则(避免重复),再添加新规则
sed -i '/^password.*pam_cracklib.so/ d' /etc/pam.d/system-auth
sed -i '/^password.*pam_unix.so/ i password    required    pam_cracklib.so minlen=12 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 retry=3' /etc/pam.d/system-auth

# 3. 配置password-auth(密码认证),与system-auth保持一致
sed -i '/^password.*pam_cracklib.so/ d' /etc/pam.d/password-auth
sed -i '/^password.*pam_unix.so/ i password    required    pam_cracklib.so minlen=12 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 retry=3' /etc/pam.d/password-auth

参数说明

  • minlen=12:最小长度12位;
  • ucredit=-1:至少1个大写字母;
  • lcredit=-1:至少1个小写字母;
  • dcredit=-1:至少1个数字;
  • ocredit=-1:至少1个特殊字符;
  • retry=3:密码输入错误时最多重试3次。
步骤3:配置账户锁定策略(防范暴力破解)

通过pam_tally2.so模块实现“连续失败锁定”,操作如下:

# 1. 向system-auth添加锁定规则(在auth段首添加)
sed -i '/^auth.*pam_env.so/ a auth        required    pam_tally2.so deny=5 unlock_time=1800 even_deny_root root_unlock_time=3600' /etc/pam.d/system-auth

# 2. 向password-auth添加相同规则
sed -i '/^auth.*pam_env.so/ a auth        required    pam_tally2.so deny=5 unlock_time=1800 even_deny_root root_unlock_time=3600' /etc/pam.d/password-auth

参数说明

  • deny=5:普通用户连续5次登录失败锁定;
  • unlock_time=1800:普通用户锁定30分钟(1800秒);
  • even_deny_root:root用户也受锁定限制;
  • root_unlock_time=3600:root用户锁定60分钟(3600秒)。
步骤4:对已有用户应用密码策略

上述配置仅对新用户生效,需手动对已有用户执行策略:

# 遍历所有可登录用户(排除nologin/false用户),应用密码策略
for user in $(cat /etc/passwd | grep -v nologin | grep -v false | awk -F: '{print $1}'); do
    chage -M 90 -m 7 -W 7 $user  # -M:有效期,-m:修改间隔,-W:提醒天数
done
1.3 结果验证

执行以下命令确认配置生效,所有验证项需符合预期:

验证项验证命令预期结果
基础密码规则`grep -E "PASS_MAX_DAYSPASS_MIN_LEN" /etc/login.defs`
强密码复杂度grep "pam_cracklib.so" /etc/pam.d/system-auth输出包含 minlen=12 ucredit=-1 等参数的规则
账户锁定策略grep "pam_tally2.so" /etc/pam.d/password-auth输出包含 deny=5 unlock_time=1800 的规则
已有用户策略应用chage -l 用户名(如 chage -l root输出 密码过期时间密码可更改时间 等符合90天/7天的配置
账户锁定测试连续5次输错任意用户密码,第6次登录时提示 Account locked(账户已锁定)
1.4 注意事项
  • 若业务存在特殊账户(如无人值守账户),需单独调整策略:chage -M -1 用户名(设置密码永不过期),但需记录并报备合规审计;
  • 账户锁定后,管理员可手动解锁:pam_tally2 --user 用户名 --reset
  • 避免将pam_tally2.so规则重复添加,否则可能导致登录异常。

模块2:防火墙配置加固(桌面版/服务器版差异化)

2.1 操作目的

通过“最小端口开放+高危端口阻断+高级防护”,构建网络边界防护,符合等保2.0“边界防护”控制点要求。

2.2 通用操作(桌面版/服务器版均需执行)
步骤1:启动并配置firewalld开机自启
# 1. 启动firewalld服务
systemctl start firewalld

# 2. 设置开机自启
systemctl enable firewalld

# 3. 禁止误关闭防火墙(通过mask锁定服务,需解锁时执行 systemctl unmask firewalld)
systemctl mask firewalld
步骤2:重置默认规则并设置默认区域
# 1. 设置默认区域为public(最高安全级别,仅允许必要服务)
firewall-cmd --set-default-zone=public

# 2. 清空现有端口/服务规则(避免历史配置冲突)
firewall-cmd --permanent --zone=public --remove-all-ports
firewall-cmd --permanent --zone=public --remove-all-services

# 3. 重载规则使配置生效(firewalld需重载才会应用永久配置)
firewall-cmd --reload
步骤3:配置高级防护(SYN Flood防护+IP转发禁用)
# 1. 启用SYN Flood防护(防止TCP半连接攻击)
sysctl -w net.ipv4.tcp_syncookies=1

# 2. 禁用IP转发(防止服务器被用作跳板机)
sysctl -w net.ipv4.ip_forward=0

# 3. 配置永久生效(写入sysctl.conf)
echo "net.ipv4.tcp_syncookies=1" >> /etc/sysctl.conf
echo "net.ipv4.ip_forward=0" >> /etc/sysctl.conf

# 4. 加载新配置
sysctl -p
2.3 差异化操作(桌面版 vs 服务器版)
(1)桌面版:开放办公必需端口

桌面版需满足日常办公需求(浏览器、打印机等),仅开放以下端口:

# 1. 开放DNS(53端口,TCP/UDP,浏览器域名解析需用到)
firewall-cmd --permanent --zone=public --add-port=53/tcp
firewall-cmd --permanent --zone=public --add-port=53/udp

# 2. 开放HTTP/HTTPS(80/443端口,浏览器访问网页)
firewall-cmd --permanent --zone=public --add-port=80/tcp
firewall-cmd --permanent --zone=public --add-port=443/tcp

# 3. 开放打印机端口(631端口,无打印机需求可跳过)
firewall-cmd --permanent --zone=public --add-port=631/tcp

# 4. 重载规则生效
firewall-cmd --reload
(2)服务器版:开放业务必需端口(最小权限原则)

服务器版需严格按业务需求开放端口,默认仅开放远程管理与核心业务端口,示例如下:

# 1. 开放SSH(22端口,远程管理必需,建议仅允许内网访问)
# 方式1:允许所有IP访问(不推荐,仅临时测试用)
# firewall-cmd --permanent --zone=public --add-port=22/tcp
# 方式2:仅允许内网IP段访问(推荐,如192.168.0.0/16、10.0.0.0/8、172.16.0.0/12)
firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4' source address='192.168.0.0/16' port protocol='tcp' port='22' accept"
firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4' source address='10.0.0.0/8' port protocol='tcp' port='22' accept"
firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4' source address='172.16.0.0/12' port protocol='tcp' port='22' accept"

# 2. 开放Web服务端口(80/443,若部署Web应用)
firewall-cmd --permanent --zone=public --add-port=80/tcp
firewall-cmd --permanent --zone=public --add-port=443/tcp

# 3. 开放数据库端口(如MySQL 3306,仅允许应用服务器IP访问)
# 替换192.168.1.100为实际应用服务器IP
firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4' source address='192.168.1.100' port protocol='tcp' port='3306' accept"

# 4. 重载规则生效
firewall-cmd --reload
(3)通用高危端口阻断

无论桌面版还是服务器版,均需阻断以下高危端口(易被攻击利用):

# 1. 阻断FTP(21端口,明文传输,易泄露密码)
firewall-cmd --permanent --zone=public --remove-port=21/tcp
firewall-cmd --permanent --zone=public --remove-port=21/udp

# 2. 阻断Telnet(23端口,明文传输,已被SSH替代)
firewall-cmd --permanent --zone=public --remove-port=23/tcp

# 3. 阻断RDP(3389端口,远程桌面,非Windows系统无需开放)
firewall-cmd --permanent --zone=public --remove-port=3389/tcp

# 4. 阻断SMB(135/139/445端口,勒索病毒常用攻击端口)
firewall-cmd --permanent --zone=public --remove-port=135/tcp
firewall-cmd --permanent --zone=public --remove-port=139/tcp
firewall-cmd --permanent --zone=public --remove-port=445/tcp

# 5. 重载规则生效
firewall-cmd --reload
2.4 结果验证
验证项验证命令预期结果
防火墙状态systemctl status firewalld显示 active (running),且Loaded行显示 enabled(开机自启)
开放端口列表firewall-cmd --list-ports桌面版:仅显示53/tcp、80/tcp等;服务器版:仅显示22/tcp、3306/tcp等业务端口
富规则(服务器版)firewall-cmd --list-rich-rules显示SSH、数据库端口的内网IP限制规则
SYN防护配置`sysctl -agrep net.ipv4.tcp_syncookies`
IP转发配置`sysctl -agrep net.ipv4.ip_forward`
2.5 注意事项
  • 服务器版添加端口时,优先使用“富规则+IP限制”,避免开放全网访问;
  • 若业务需新增端口,需先确认端口用途,再执行 firewall-cmd --permanent --add-port=端口/tcp 并重载;
  • 排查端口问题时,可结合 netstat -tulnp | grep 端口号 查看端口占用进程,避免端口冲突。

模块3:账户与权限加固(桌面版/服务器版差异化)

3.1 操作目的

通过清理无用账户、限制特权用户、加固文件权限,防范权限滥用与越权访问,符合等保2.0“访问控制”控制点要求。

3.2 通用操作(桌面版/服务器版均需执行)
步骤1:清理无用系统账户

银河麒麟默认存在部分非必需账户(如games、ftp),需锁定或删除:

# 1. 定义无用账户列表(根据实际环境调整,避免删除业务账户)
USELESS_ACCOUNTS=(games ftp news uucp proxy list irc gnats nobody nouser nogroup)

# 2. 遍历账户,锁定(不建议直接删除,避免依赖问题)
for user in "${USELESS_ACCOUNTS[@]}"; do
    if id -u $user >/dev/null 2>&1; then  # 先判断账户是否存在
        usermod -L $user  # 锁定账户(锁定后无法登录)
        echo "已锁定无用账户:$user"
    else
        echo "无用账户不存在:$user"
    fi
done
步骤2:精细化sudo权限控制

禁止普通用户通过sudo切换root,仅授予必要命令执行权限:

# 1. 备份sudo配置文件(必须通过visudo编辑,避免语法错误)
cp /etc/sudoers /etc/sudoers.bak_$(date +%Y%m%d)

# 2. 编辑sudoers配置(使用visudo,会自动语法检查)
visudo
# 在文件末尾添加以下内容:
# 1. 禁止wheel组用户通过sudo切换root
%wheel    ALL=(ALL)    !/bin/su
# 2. 示例:允许用户test仅执行httpd服务启停命令(根据业务需求调整)
# test    ALL=(ALL)    /usr/bin/systemctl restart httpd,/usr/bin/systemctl stop httpd

# 3. 验证sudo配置语法(避免配置错误导致sudo失效)
visudo -c  # 输出 "sudoers file: parsed OK" 即为正常
步骤3:加固核心文件权限

核心配置文件(如/etc/shadow/etc/sudoers)需限制访问权限,避免篡改:

# 1. 设置/etc/passwd(用户列表)权限为644(仅root可修改,其他用户只读)
chmod 644 /etc/passwd

# 2. 设置/etc/shadow(密码哈希)权限为000(仅root可访问,且无法修改)
chmod 000 /etc/shadow

# 3. 设置/etc/sudoers(sudo配置)权限为440(仅root和wheel组可读,root可修改)
chmod 440 /etc/sudoers

# 4. 设置root家目录权限为700(仅root可访问)
chmod 700 /root

# 5. 锁定核心文件(添加i属性,禁止修改/删除,需解锁时执行 chattr -i 文件名)
chattr +i /etc/passwd /etc/shadow /etc/sudoers
3.3 差异化操作(桌面版 vs 服务器版)
(1)桌面版:禁用Guest账户与自动登录

Guest账户允许匿名登录,自动登录存在账号盗用风险,需禁用:

# 1. 禁用Guest账户(通过lightdm配置)
if [ -f "/etc/lightdm/lightdm.conf" ]; then
    # 先删除原有allow-guest配置,再添加新配置
    sed -i '/allow-guest=/ d' /etc/lightdm/lightdm.conf
    echo "allow-guest=false" >> /etc/lightdm/lightdm.conf
    # 重启lightdm服务生效(会断开当前图形会话,建议提前保存工作)
    systemctl restart lightdm
else
    echo "警告:未找到lightdm.conf,Guest账户禁用失败"
fi

# 2. 禁用自动登录(通过gdm配置,适用于GNOME桌面)
if [ -f "/etc/gdm/custom.conf" ]; then
    # 删除原有自动登录配置
    sed -i '/AutomaticLoginEnable=/ d' /etc/gdm/custom.conf
    sed -i '/AutomaticLogin=/ d' /etc/gdm/custom.conf
    echo "已禁用自动登录"
else
    # 图形界面操作替代:系统设置 → 用户账户 → 关闭“自动登录”
    echo "建议手动在图形界面禁用自动登录:系统设置 → 用户账户"
fi
(2)服务器版:禁用root远程登录与USB存储
  • 禁用root远程登录:root账户权限过高,远程登录风险大,需强制通过普通用户sudo切换:

    # 1. 备份sshd配置文件
    cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak_$(date +%Y%m%d)
    
    # 2. 修改PermitRootLogin参数为no
    sed -i 's/^#PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
    sed -i 's/^PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config  # 覆盖已启用的配置
    
    # 3. 重启sshd服务生效
    systemctl restart sshd
    
  • 禁用USB存储设备:防止通过USB拷贝敏感数据或植入恶意程序:

    # 1. 备份blacklist配置文件
    cp /etc/modprobe.d/blacklist.conf /etc/modprobe.d/blacklist.conf.bak_$(date +%Y%m%d)
    
    # 2. 添加USB存储模块黑名单
    if ! grep -q "blacklist usb-storage" /etc/modprobe.d/blacklist.conf; then
        echo "blacklist usb-storage" >> /etc/modprobe.d/blacklist.conf
        # 立即卸载usb-storage模块(无需重启,当前会话生效)
        rmmod usb-storage >/dev/null 2>&1
        echo "已禁用USB存储设备"
    else
        echo "USB存储设备已禁用,无需重复配置"
    fi
    
3.4 结果验证
验证项验证命令预期结果
无用账户锁定passwd -S 账户名(如 passwd -S games输出 LK(Locked),表示账户已锁定
sudo权限限制sudo su -(使用wheel组普通用户执行)提示 sorry, user xxx is not allowed to execute '/bin/su -' as root
核心文件权限ls -l /etc/shadow /etc/sudoers输出 -r-------- 1 root root(shadow)、-r--r----- 1 root wheel(sudoers)
桌面版Guest账户注销当前会话,查看登录界面无“Guest会话”选项
服务器版root远程登录ssh root@服务器IP提示 Permission denied, please try again(即使密码正确)
服务器版USB存储插入USB设备,执行 lsblk无USB设备(如sdb)显示
3.5 注意事项
  • 清理无用账户前,需确认账户无业务依赖(如nobody可能被部分服务使用,建议仅锁定不删除);
  • 服务器版禁用root远程登录后,需确保至少有一个普通用户在wheel组(可通过 gpasswd -a 用户名 wheel 添加),避免无法远程管理;
  • 若服务器需临时启用USB存储,可执行 modprobe usb-storage 加载模块,使用后再执行 rmmod usb-storage 卸载。

模块4:审计日志加固(桌面版/服务器版差异化)

4.1 操作目的

通过auditd记录关键操作(账户变更、权限修改、日志篡改等),确保可追溯、可审计,符合等保2.0“安全审计”控制点要求。

4.2 通用操作(桌面版/服务器版均需执行)
步骤1:启动并配置auditd服务
# 1. 启动auditd服务(auditd为即时生效服务,无需重启系统)
systemctl start auditd

# 2. 设置开机自启
systemctl enable auditd

# 3. 备份auditd配置文件
cp /etc/audit/auditd.conf /etc/audit/auditd.conf.bak_$(date +%Y%m%d)

# 4. 优化日志存储与轮转(避免日志占满磁盘)
sed -i 's/^log_file.*/log_file = \/var\/log\/audit\/audit.log/' /etc/audit/auditd.conf  # 日志路径
sed -i 's/^log_format.*/log_format = RAW/' /etc/audit/auditd.conf  # 原始格式,防篡改
sed -i 's/^max_log_file.*/max_log_file = 100/' /etc/audit/auditd.conf  # 单文件100MB
sed -i 's/^max_log_file_action.*/max_log_file_action = rotate/' /etc/audit/auditd.conf  # 满轮转
sed -i 's/^num_logs.*/num_logs = 10/' /etc/audit/auditd.conf  # 保留10个轮转日志(共1GB)

# 5. 锁定审计日志(仅允许追加,禁止删除/修改)
chattr +a /var/log/audit/audit.log
步骤2:配置日志备份(可选,满足长期留存需求)

若需留存审计日志超过10个轮转周期,可通过rsyslog配置定时备份:

# 1. 编辑rsyslog配置
vi /etc/rsyslog.conf

# 2. 添加以下内容(每天备份审计日志到/var/backup/audit目录)
$ModLoad imfile
$InputFileName /var/log/audit/audit.log
$InputFileTag audit-backup:
$InputFileStateFile audit-backup-state
$InputFileSeverity info
$InputFileFacility local6
$InputRunFileMonitor

local6.*                                /var/backup/audit/audit_%Y%m%d.log

# 3. 创建备份目录
mkdir -p /var/backup/audit

# 4. 重启rsyslog服务生效
systemctl restart rsyslog
4.3 差异化操作(桌面版 vs 服务器版)

审计规则需根据系统用途差异化配置,避免日志冗余或遗漏关键操作。

(1)桌面版:基础审计规则(聚焦用户操作)
# 1. 备份原有审计规则
cp /etc/audit/rules.d/audit.rules /etc/audit/rules.d/audit.rules.bak_$(date +%Y%m%d)

# 2. 清空原有规则(避免冲突)
> /etc/audit/rules.d/audit.rules

# 3. 添加桌面版审计规则(记录账户、登录、sudo操作)
cat >> /etc/audit/rules.d/audit.rules << EOF
# 记录账户变更(/etc/passwd修改)
-w /etc/passwd -p wa -k account_change
# 记录密码变更(/etc/shadow修改)
-w /etc/shadow -p wa -k password_change
# 记录sudo配置修改
-w /etc/sudoers -p wa -k sudo_config
# 记录sudo命令执行
-w /usr/bin/sudo -p x -k sudo_exec
# 记录登录事件(/var/log/secure修改)
-w /var/log/secure -p wa -k login_event
# 删除默认规则
-D
# 启用审计规则(2=锁定规则,防止修改)
-e 2
EOF

# 4. 加载新规则生效
auditctl -R /etc/audit/rules.d/audit.rules
(2)服务器版:全面审计规则(聚焦业务与系统操作)
# 1. 备份原有审计规则
cp /etc/audit/rules.d/audit.rules /etc/audit/rules.d/audit.rules.bak_$(date +%Y%m%d)

# 2. 清空原有规则
> /etc/audit/rules.d/audit.rules

# 3. 添加服务器版审计规则(覆盖账户、权限、服务、日志、业务配置)
cat >> /etc/audit/rules.d/audit.rules << EOF
# 1. 账户与密码相关
-w /etc/passwd -p wa -k account_change
-w /etc/shadow -p wa -k password_change
-w /etc/group -p wa -k group_change

# 2. sudo相关
-w /etc/sudoers -p wa -k sudo_config
-w /usr/bin/sudo -p x -k sudo_exec

# 3. 防火墙配置
-w /etc/firewalld/ -p wa -k firewall_change
-w /usr/bin/firewall-cmd -p x -k firewall_cmd

# 4. 服务启停与管理
-w /usr/bin/systemctl -p x -k service_control
-w /etc/systemd/system/ -p wa -k service_config

# 5. 系统配置
-w /etc/sysctl.conf -p wa -k sysctl_change
-w /etc/selinux/config -p wa -k selinux_change
-w /etc/modprobe.d/ -p wa -k modprobe_config

# 6. 日志文件(防止篡改)
-w /var/log/ -p wa -k log_modify
-w /var/log/audit/ -p wa -k audit_log_modify

# 7. root目录访问(高权限操作)
-w /root/ -p rwx -k root_access

# 8. 业务相关(示例:MySQL配置)
-w /etc/my.cnf -p wa -k mysql_config
-w /usr/bin/mysql -p x -k mysql_exec

# 9. 规则控制
-D
-e 2
EOF

# 4. 加载新规则生效
auditctl -R /etc/audit/rules.d/audit.rules
4.4 结果验证
验证项验证命令预期结果
auditd服务状态systemctl status auditd显示 active (running),且Loaded行显示 enabled
审计规则加载auditctl -l显示配置的所有审计规则(如 -w /etc/passwd -p wa -k account_change
审计日志生成ls -l /var/log/audit/audit.log日志文件存在,且权限为 -rw------- 1 root root
日志追加测试echo "test" >> /var/log/audit/audit.log提示 Operation not permitted(因添加了+a属性,无法直接追加)
关键操作审计执行 sudo ls,然后 ausearch -k sudo_exec显示包含sudo ls命令的审计记录,包含用户、时间、命令路径
4.5 注意事项
  • 审计日志需定期备份,避免因日志轮转丢失关键记录;
  • 服务器版审计规则需根据实际业务补充(如添加中间件配置文件审计);
  • 若审计日志过大,可通过 auditctl -s 查看审计状态,调整 max_log_file 等参数;
  • 禁止删除审计日志(chattr +a 已锁定),如需清理需先执行 chattr -a 解锁(需报备合规)。

模块5:系统加固(桌面版/服务器版差异化)

5.1 操作目的

通过禁用无用服务、启用安全组件、卸载危险软件,减少系统攻击面,符合等保2.0“入侵防范”控制点要求。

5.2 通用操作(桌面版/服务器版均需执行)
步骤1:禁用无用系统服务
# 1. 定义无用服务列表(根据实际环境调整,避免禁用业务服务)
USELESS_SERVICES=(
    bluetooth        # 蓝牙服务(非移动设备无需)
    avahi-daemon     # 零配置网络服务(易被发现)
    cups             # 打印服务(无打印机需求)
    telnet           # Telnet服务(明文传输)
    vsftpd           # FTP服务(明文传输)
    rpcbind          # RPC绑定服务(NFS依赖,无NFS则禁用)
    nfs-server       # NFS服务(文件共享,非必需禁用)
    samba            # SMB服务(文件共享,易被勒索攻击)
)

# 2. 遍历服务,停止并禁用
for service in "${USELESS_SERVICES[@]}"; do
    if systemctl is-enabled --quiet $service 2>/dev/null; then
        systemctl stop $service
        systemctl disable $service
        echo "已禁用服务:$service"
    else
        echo "服务未启用:$service"
    fi
done
步骤2:卸载危险协议软件
# 1. 定义危险软件列表(明文传输或高风险)
DANGER_PACKAGES=(
    telnet-server    # Telnet服务器
    vsftpd           # FTP服务器
    ftp              # FTP客户端
    rpcbind          # RPC绑定工具
    nfs-utils        # NFS工具集
    samba            # SMB服务
)

# 2. 遍历软件,卸载(需确认无业务依赖)
for pkg in "${DANGER_PACKAGES[@]}"; do
    if rpm -q $pkg >/dev/null 2>&1; then
        yum remove -y $pkg
        echo "已卸载软件:$pkg"
    else
        echo "软件未安装:$pkg"
    fi
done
5.3 差异化操作(桌面版 vs 服务器版)
(1)桌面版:SELinux配置(宽容模式)

SELinux强制模式可能影响桌面应用兼容性,建议桌面版使用宽容模式(仅记录不阻断):

# 1. 备份SELinux配置文件
cp /etc/selinux/config /etc/selinux/config.bak_$(date +%Y%m%d)

# 2. 修改SELinux模式为permissive
sed -i 's/^SELINUX=.*/SELINUX=permissive/' /etc/selinux/config
sed -i 's/^SELINUXTYPE=.*/SELINUXTYPE=targeted/' /etc/selinux/config

# 3. 临时生效(无需重启,当前会话生效)
setenforce 0
(2)服务器版:SELinux配置(强制模式)

服务器版需启用SELinux强制模式,增强系统安全:

# 1. 备份SELinux配置文件
cp /etc/selinux/config /etc/selinux/config.bak_$(date +%Y%m%d)

# 2. 修改SELinux模式为enforcing
sed -i 's/^SELINUX=.*/SELINUX=enforcing/' /etc/selinux/config
sed -i 's/^SELINUXTYPE=.*/SELINUXTYPE=targeted/' /etc/selinux/config

# 3. 临时生效(无需重启,当前会话生效)
setenforce 1
5.4 结果验证
验证项验证命令预期结果
无用服务状态systemctl is-enabled bluetooth(以bluetooth为例)输出 disabled
危险软件卸载rpm -q vsftpd输出 package vsftpd is not installed
SELINUX状态(桌面版)getenforce输出 Permissive
SELINUX状态(服务器版)getenforce输出 Enforcing
5.5 注意事项
  • 禁用服务前,需确认服务无业务依赖(如cups若有打印机则不能禁用);
  • 服务器版启用SELinux强制模式后,若业务报错,需通过 ausearch -m AVC -ts recent 查看日志,针对性添加SELinux规则(如 setsebool -P httpd_can_network_connect 1);
  • 桌面版若因SELinux宽容模式仍出现应用兼容问题,可临时关闭SELinux(setenforce 0),但需记录并后续优化。

模块6:补丁管理(桌面版/服务器版通用)

6.1 操作目的

及时修复系统漏洞,防范已知攻击利用,符合等保2.0“漏洞管理”控制点要求。

6.2 在线环境操作(可联网)
# 1. 清理yum缓存(避免更新失败)
yum clean all
yum makecache

# 2. 查看可更新补丁
yum check-update

# 3. 安装安全补丁(仅更新安全相关补丁,避免业务兼容性问题)
# 方式1:更新所有安全补丁(推荐)
yum update --security -y

# 方式2:仅更新指定漏洞补丁(如CVE-2024-xxxx,需替换为实际CVE编号)
# yum update -y --cve CVE-2024-xxxx

# 4. 重启系统(部分内核补丁需重启生效,服务器版建议非高峰执行)
# reboot
6.3 离线环境操作(不可联网)
# 1. 提前从银河麒麟官方下载离线补丁包(需匹配系统版本与架构)
# 官方下载地址:https://www.kylinos.cn/support/

# 2. 将离线补丁包拷贝至服务器(如/root/offline_patches目录)
mkdir -p /root/offline_patches
# (手动拷贝.patch或.rpm文件至该目录)

# 3. 安装离线补丁
yum localinstall -y /root/offline_patches/*.rpm

# 4. 重启系统(按需)
# reboot
6.4 结果验证
验证项验证命令预期结果
补丁安装状态yum history list显示最近的更新记录,状态为 Complete
内核版本(若更新)uname -r显示新内核版本(如更新前为4.19.90-24.4.v2101.ky10.x86_64,更新后版本更高)
安全补丁验证`rpm -q --changelog kernelgrep -i CVE`(以kernel为例)
6.5 注意事项
  • 服务器版更新补丁前,需确认业务兼容性(可先在测试环境验证);
  • 内核补丁安装后必须重启生效,需提前规划停机窗口;
  • 定期执行补丁更新(建议每月1次),并记录补丁安装日志(yum history save)。

第三章 加固脚本自动化执行指南

为提升效率,可使用自动化脚本执行上述加固操作,脚本已整合所有核心模块,并支持桌面版/服务器版自动区分。

3.1 脚本获取与部署

# 1. 创建脚本文件
vi /root/kylin_security_harden.sh

# 2. 拷贝附录中的脚本代码至文件(完整代码见附录A)

# 3. 添加执行权限
chmod +x /root/kylin_security_harden.sh

3.2 脚本执行流程

# 1. 切换root权限(必须)
sudo -i

# 2. 执行脚本
/root/kylin_security_harden.sh

# 3. 按提示选择系统类型(1=桌面版,2=服务器版)
# 脚本将自动执行:环境检查→配置备份→模块加固→报告生成

3.3 脚本输出与报告

  • 加固报告:生成路径为 /var/log/kylin_security_harden_report_xxxx.txt,包含加固模块结果、合规自查、后续建议;
  • 配置备份:备份路径为 /var/backup/kylin_harden_xxxx/config,包含所有核心配置文件的原始备份;
  • 执行日志:实时输出到终端,失败步骤会标注 [-] 错误,便于实时排查。

第四章 应急回滚方案

若加固后出现业务异常(如服务无法启动、登录失败),需按以下步骤回滚配置:

4.1 通用回滚原则

  1. 优先回滚最近修改的模块(如刚执行完防火墙加固就报错,先回滚防火墙配置);
  2. 回滚前备份当前配置(避免回滚后无法恢复);
  3. 回滚后验证业务状态(确保恢复正常)。

4.2 分模块回滚步骤

(1)密码策略回滚
# 1. 恢复login.defs配置
cp /etc/login.defs.bak_$(date +%Y%m%d) /etc/login.defs

# 2. 恢复PAM配置
cp /etc/pam.d/system-auth.bak_$(date +%Y%m%d) /etc/pam.d/system-auth
cp /etc/pam.d/password-auth.bak_$(date +%Y%m%d) /etc/pam.d/password-auth

# 3. 解锁被锁定的账户(如需)
pam_tally2 --user 用户名 --reset
(2)防火墙配置回滚
# 1. 恢复firewalld规则(若备份了public.xml)
cp /etc/firewalld/zones/public.xml.bak_$(date +%Y%m%d) /etc/firewalld/zones/public.xml

# 2. 重载规则
firewall-cmd --reload

# 3. 恢复sysctl配置(SYN防护/IP转发)
sed -i '/net.ipv4.tcp_syncookies=1/d' /etc/sysctl.conf
sed -i '/net.ipv4.ip_forward=0/d' /etc/sysctl.conf
sysctl -p
(3)账户与权限回滚
# 1. 恢复sudoers配置
cp /etc/sudoers.bak_$(date +%Y%m%d) /etc/sudoers

# 2. 解锁核心文件(如需修改)
chattr -i /etc/passwd /etc/shadow /etc/sudoers

# 3. 恢复核心文件权限
chmod 644 /etc/passwd
chmod 000 /etc/shadow
chmod 440 /etc/sudoers

# 4. 服务器版恢复root远程登录
cp /etc/ssh/sshd_config.bak_$(date +%Y%m%d) /etc/ssh/sshd_config
systemctl restart sshd
(4)审计日志回滚
# 1. 恢复auditd配置
cp /etc/audit/auditd.conf.bak_$(date +%Y%m%d) /etc/audit/auditd.conf

# 2. 恢复审计规则
cp /etc/audit/rules.d/audit.rules.bak_$(date +%Y%m%d) /etc/audit/rules.d/audit.rules
auditctl -R /etc/audit/rules.d/audit.rules

# 3. 解锁审计日志(如需)
chattr -a /var/log/audit/audit.log
(5)全量回滚(脚本执行后)

若使用自动化脚本加固,可直接使用备份目录进行全量回滚:

# 1. 进入备份目录(替换为实际备份目录,如/var/backup/kylin_harden_20251112_153000/config)
cd /var/backup/kylin_harden_xxxx/config

# 2. 覆盖原配置文件(需谨慎,会恢复所有加固前配置)
cp -a etc/* /etc/

# 3. 重启相关服务
systemctl restart firewalld sshd auditd rsyslog

第五章 合规自查与验收

5.1 等保2.0合规自查表

等保控制点自查项检查命令/方法结果(√/×)
身份鉴别1. 密码最小长度≥12位grep "^PASS_MIN_LEN" /etc/login.defs
2. 密码有效期≤90天grep "^PASS_MAX_DAYS" /etc/login.defs
3. 连续5次失败锁定账户grep "pam_tally2.so" /etc/pam.d/system-auth
4. 服务器版禁用root远程登录grep "^PermitRootLogin" /etc/ssh/sshd_config
访问控制1. /etc/shadow权限为000ls -l /etc/shadow
2. sudo禁止普通用户切换rootgrep "!\/bin\/su" /etc/sudoers
3. 无用账户已锁定passwd -S games
安全审计1. auditd服务已启用systemctl status auditd
2. 审计日志包含账户变更、sudo操作ausearch -k account_changeausearch -k sudo_exec
3. 审计日志仅允许追加lsattr /var/log/audit/audit.log(显示 a 属性)
边界防护1. firewalld已启用systemctl status firewalld
2. 仅开放必要端口firewall-cmd --list-ports
3. 启用SYN Flood防护`sysctl -agrep net.ipv4.tcp_syncookies`
入侵防范1. SELinux已启用(服务器版强制,桌面版宽容)getenforce
2. 无用服务已禁用systemctl is-enabled bluetooth
3. 危险软件已卸载rpm -q vsftpd
漏洞管理1. 系统已更新至最新安全补丁yum history list

5.2 验收标准

  1. 所有自查项均需标记“√”,若存在“×”需整改;
  2. 加固后业务正常运行(无服务中断、功能异常);
  3. 加固报告与配置备份完整留存(至少1年);
  4. 可通过第三方漏洞扫描工具(如绿盟、启明星辰)验证,无高危漏洞。

第六章 常见问题与解决方案

问题现象可能原因解决方案
执行sudo时报错“sudo: /etc/sudoers is world-writable”/etc/sudoers权限配置错误(如设为777)1. 执行 pkexec chmod 440 /etc/sudoers;2. 验证权限:ls -l /etc/sudoers
firewalld启动失败,提示“Job for firewalld.service failed”端口被iptables占用,或配置文件损坏1. 停止iptables:systemctl stop iptables;2. 恢复firewalld配置:cp /etc/firewalld/firewalld.conf.bak /etc/firewalld/firewalld.conf;3. 重启firewalld
账户锁定后无法解锁pam_tally2命令失效,或规则配置错误1. 执行 faillock --user 用户名 --reset(替代pam_tally2);2. 检查PAM规则:grep "pam_tally2.so" /etc/pam.d/system-auth
SELinux强制模式下业务报错业务进程无SELinux权限1. 查看SELinux日志:ausearch -m AVC -ts recent;2. 添加SELinux规则:setsebool -P 布尔值 1(如 setsebool -P httpd_can_network_connect 1
补丁安装失败,提示“依赖关系错误”离线补丁包版本不匹配,或在线源同步异常1. 在线环境:yum clean all && yum makecache;2. 离线环境:确认补丁包与系统版本一致(如V10对应V10补丁)

附录A 自动化加固脚本(完整代码)

#!/bin/bash
##############################################################################
# 银河麒麟操作系统安全加固一键脚本(桌面版/服务器版)
# 版本:V2.0
# 功能:覆盖密码策略、防火墙、账户权限、审计日志、系统加固、补丁管理
##############################################################################

# 全局变量
BACKUP_DIR="/var/backup/kylin_harden_$(date +%Y%m%d_%H%M%S)"
REPORT_FILE="/var/log/kylin_security_harden_report_$(date +%Y%m%d_%H%M%S).txt"
OS_TYPE=""
ERROR_COUNT=0
SUCCESS_COUNT=0

# 颜色定义
RED="\033[31m"
GREEN="\033[32m"
YELLOW="\033[33m"
BLUE="\033[34m"
RESET="\033[0m"

# 前置检查
pre_check() {
    echo -e "\n${BLUE}[+] 银河麒麟安全加固脚本(V2.0)${RESET}"
    if [ "$(id -u)" -ne 0 ]; then
        echo -e "${RED}[-] 错误:需root权限执行,执行 sudo -i 切换!${RESET}"
        exit 1
    fi
    if ! grep -q "Kylin" /etc/kylin-release 2>/dev/null; then
        echo -e "${RED}[-] 错误:非银河麒麟系统,停止执行!${RESET}"
        exit 1
    fi
    echo -e "${YELLOW}[?] 选择系统类型:1=桌面版,2=服务器版${RESET}"
    read -p "输入数字:" CHOICE
    [ $CHOICE -eq 1 ] && OS_TYPE="desktop" || OS_TYPE="server"
    mkdir -p $BACKUP_DIR/config && touch $REPORT_FILE
    echo "=== 银河麒麟安全加固报告($(date))===" >> $REPORT_FILE
    echo "系统类型:$([ $OS_TYPE == "desktop" ] && echo "桌面版" || echo "服务器版")" >> $REPORT_FILE
}

# 配置备份
config_backup() {
    echo -e "\n${BLUE}[+] 备份核心配置...${RESET}"
    BACKUP_FILES=(/etc/login.defs /etc/pam.d/system-auth /etc/ssh/sshd_config /etc/sudoers /etc/audit/auditd.conf)
    for file in "${BACKUP_FILES[@]}"; do
        [ -f $file ] && cp -a $file $BACKUP_DIR/config/ && echo "✅ 备份:$file" >> $REPORT_FILE
    done
}

# 密码策略加固
password_harden() {
    echo -e "\n${BLUE}[+] 密码策略加固...${RESET}"
    sed -i 's/^PASS_MAX_DAYS.*/PASS_MAX_DAYS 90/' /etc/login.defs
    sed -i '/pam_cracklib.so/ d' /etc/pam.d/system-auth
    sed -i '/pam_unix.so/ i password    required    pam_cracklib.so minlen=12 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 retry=3' /etc/pam.d/system-auth
    sed -i '/pam_tally2.so/ d' /etc/pam.d/system-auth
    sed -i '/pam_env.so/ a auth        required    pam_tally2.so deny=5 unlock_time=1800 even_deny_root root_unlock_time=3600' /etc/pam.d/system-auth
    for user in $(cat /etc/passwd | grep -v nologin | awk -F: '{print $1}'); do chage -M 90 $user; done
    echo "✅ 密码策略加固完成" >> $REPORT_FILE
    SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
}

# 防火墙加固
firewall_harden() {
    echo -e "\n${BLUE}[+] 防火墙加固...${RESET}"
    systemctl start firewalld && systemctl enable firewalld
    firewall-cmd --set-default-zone=public && firewall-cmd --permanent --remove-all-ports
    if [ $OS_TYPE == "desktop" ]; then
        PORTS=("53/tcp" "53/udp" "80/tcp" "443/tcp")
    else
        PORTS=("22/tcp" "80/tcp" "443/tcp")
        firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='192.168.0.0/16' port port='22' protocol='tcp' accept"
    fi
    for port in "${PORTS[@]}"; do firewall-cmd --permanent --add-port=$port; done
    firewall-cmd --reload && sysctl -w net.ipv4.tcp_syncookies=1 && echo "net.ipv4.tcp_syncookies=1" >> /etc/sysctl.conf
    echo "✅ 防火墙加固完成,开放端口:${PORTS[*]}" >> $REPORT_FILE
    SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
}

# 账户权限加固
account_harden() {
    echo -e "\n${BLUE}[+] 账户权限加固...${RESET}"
    USELESS_ACCOUNTS=(games ftp news)
    for user in "${USELESS_ACCOUNTS[@]}"; do id -u $user &>/dev/null && usermod -L $user; done
    [ $OS_TYPE == "server" ] && sed -i 's/^PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config && systemctl restart sshd
    [ $OS_TYPE == "desktop" ] && [ -f /etc/lightdm/lightdm.conf ] && echo "allow-guest=false" >> /etc/lightdm/lightdm.conf
    chmod 000 /etc/shadow && chmod 440 /etc/sudoers && chattr +i /etc/passwd /etc/shadow
    echo "✅ 账户权限加固完成" >> $REPORT_FILE
    SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
}

# 审计日志加固
audit_harden() {
    echo -e "\n${BLUE}[+] 审计日志加固...${RESET}"
    systemctl start auditd && systemctl enable auditd
    sed -i 's/^max_log_file.*/max_log_file = 100/' /etc/audit/auditd.conf
    > /etc/audit/rules.d/audit.rules
    if [ $OS_TYPE == "desktop" ]; then
        RULES=("-w /etc/passwd -p wa -k account_change" "-w /usr/bin/sudo -p x -k sudo_exec")
    else
        RULES=("-w /etc/passwd -p wa -k account_change" "-w /usr/bin/systemctl -p x -k service_control" "-w /var/log/ -p wa -k log_modify")
    fi
    for rule in "${RULES[@]}"; do echo $rule >> /etc/audit/rules.d/audit.rules; done
    auditctl -R /etc/audit/rules.d/audit.rules && chattr +a /var/log/audit/audit.log
    echo "✅ 审计日志加固完成" >> $REPORT_FILE
    SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
}

# 系统加固
system_harden() {
    echo -e "\n${BLUE}[+] 系统加固...${RESET}"
    USELESS_SERVICES=(bluetooth avahi-daemon cups)
    for service in "${USELESS_SERVICES[@]}"; do systemctl is-enabled $service &>/dev/null && systemctl stop $service && systemctl disable $service; done
    DANGER_PACKAGES=(telnet-server vsftpd)
    for pkg in "${DANGER_PACKAGES[@]}"; do rpm -q $pkg &>/dev/null && yum remove -y $pkg; done
    [ $OS_TYPE == "desktop" ] && setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=permissive/' /etc/selinux/config
    [ $OS_TYPE == "server" ] && setenforce 1 && sed -i 's/^SELINUX=.*/SELINUX=enforcing/' /etc/selinux/config
    echo "✅ 系统加固完成" >> $REPORT_FILE
    SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
}

# 生成报告
generate_report() {
    echo -e "\n${GREEN}[+] 加固完成!${RESET}"
    echo "=== 加固总结 ===" >> $REPORT_FILE
    echo "成功模块数:$SUCCESS_COUNT,失败模块数:$ERROR_COUNT" >> $REPORT_FILE
    echo "报告路径:$REPORT_FILE" >> $REPORT_FILE
    echo "备份路径:$BACKUP_DIR" >> $REPORT_FILE
    echo -e "${GREEN}报告路径:$REPORT_FILE${RESET}"
    echo -e "${GREEN}备份路径:$BACKUP_DIR${RESET}"
}

# 主流程
pre_check
config_backup
password_harden
firewall_harden
account_harden
audit_harden
system_harden
generate_report

附录B 核心配置文件路径速查

配置类型文件路径用途
密码策略/etc/login.defs控制密码有效期、长度等基础规则
PAM认证/etc/pam.d/system-auth、/etc/pam.d/password-auth控制密码复杂度、账户锁定等
防火墙/etc/firewalld/zones/public.xml存储firewalld端口/服务规则
SSH配置/etc/ssh/sshd_config控制SSH远程登录(如PermitRootLogin)
sudo配置/etc/sudoers控制sudo权限分配
审计服务/etc/audit/auditd.conf、/etc/audit/rules.d/audit.rulesauditd服务配置与审计规则
SELinux配置/etc/selinux/config控制SELinux模式(enforcing/permissive)
系统参数/etc/sysctl.conf控制内核参数(如SYN Flood防护、IP转发)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

独角鲸网络安全实验室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值