文档信息
| 项目 | 内容 |
|---|---|
| 文档名称 | 银河麒麟操作系统(桌面版/服务器版)安全加固操作手册 |
| 编写目的 | 指导运维/安全人员完成银河麒麟系统安全加固,满足等保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-release 或 lsb_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 --version、awk --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_DAYS | PASS_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 -a | grep net.ipv4.tcp_syncookies` |
| IP转发配置 | `sysctl -a | grep 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 kernel | grep -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 通用回滚原则
- 优先回滚最近修改的模块(如刚执行完防火墙加固就报错,先回滚防火墙配置);
- 回滚前备份当前配置(避免回滚后无法恢复);
- 回滚后验证业务状态(确保恢复正常)。
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权限为000 | ls -l /etc/shadow | |
| 2. sudo禁止普通用户切换root | grep "!\/bin\/su" /etc/sudoers | ||
| 3. 无用账户已锁定 | passwd -S games | ||
| 安全审计 | 1. auditd服务已启用 | systemctl status auditd | |
| 2. 审计日志包含账户变更、sudo操作 | ausearch -k account_change、ausearch -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 -a | grep net.ipv4.tcp_syncookies` | |
| 入侵防范 | 1. SELinux已启用(服务器版强制,桌面版宽容) | getenforce | |
| 2. 无用服务已禁用 | systemctl is-enabled bluetooth | ||
| 3. 危险软件已卸载 | rpm -q vsftpd | ||
| 漏洞管理 | 1. 系统已更新至最新安全补丁 | yum history list |
5.2 验收标准
- 所有自查项均需标记“√”,若存在“×”需整改;
- 加固后业务正常运行(无服务中断、功能异常);
- 加固报告与配置备份完整留存(至少1年);
- 可通过第三方漏洞扫描工具(如绿盟、启明星辰)验证,无高危漏洞。
第六章 常见问题与解决方案
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
执行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.rules | auditd服务配置与审计规则 |
| SELinux配置 | /etc/selinux/config | 控制SELinux模式(enforcing/permissive) |
| 系统参数 | /etc/sysctl.conf | 控制内核参数(如SYN Flood防护、IP转发) |

35

被折叠的 条评论
为什么被折叠?



