
简介面向银河麒麟高级服务器操作系统 V10 SP3 2303 的系统管理员与安全运维人员该安全三级加固手册针对等保三级测评要求系统梳理了安全服务、密码强度、账户锁定、系统安全、系统审计、系统设置、磁盘检查、资源分配、系统维护 9 大领域的关键加固项。内容不限于理论说明每一项均按说明、检查方法、修改建议三段式组织覆盖口令复杂度配置、登录失败锁定、审计策略开启、系统服务精简、磁盘空间检查等高频整改场景条目化结构便于快速定位与落地执行可直接用于生产环境的安全自查与加固。资源为单个 PDF 文档压缩包整体仅 321KB体积小巧便于服务器维护时随时查阅。目前已有 1797 人浏览学习对正在准备麒麟系统等保三级合规、需要建立系统安全基线或进行加固效果复核的工程师均具有较好的参考价值。1. 安全三级加固为什么值得花时间做银河麒麟高级服务器操作系统V10 SP3 2303在政务、金融、能源这些行业里已经不算新鲜面孔了但“装好系统”和“过等保”是两回事。安全三级加固通常指等保2.0三级要求下的主机层面整改——身份鉴别、访问控制、安全审计、入侵防范这些条款逐条落成可执行的配置。绝大部分系统默认装完直接扫描身份鉴别和审计项都是红的单靠改几个密码策略远远不够。这篇手册围绕V10 SP3 2303这个具体版本按等保三级的主机测评项拆解配置步骤、参数依据和验证方法适合正在做等保整改、密评前自查或者内部安全基线建设的技术人员。照着做能过测评也能让系统在真实对抗里少几个容易被利用的口子。2. 加固前的态势评估先分清哪些项必须动、哪些项不能动2.1 三级测评里主机层面到底查哪些对象等保三级的主机安全测评项不算少但落到银河麒麟V10 SP3上核心就五块身份鉴别密码策略、登录失败处理、远程管理防暴力破解、访问控制默认账号、权限分离、umask、安全审计auditd、syslog、日志集中、入侵防范危险服务、系统补丁、核心文件完整性、恶意代码防范防病毒、可疑进程。这五块里审计和补丁是执行层面的事身份鉴别和访问控制是配置层面的事真正容易翻车的是那些“改完服务起不来”的项目比如PAM模块、SSH配置、auditd规则。我一般会在动手前先跑一遍完整的信息采集把当前系统的服务清单、账号清单、审计状态、防火墙状态全部摸清楚再动配置。采集时注意V10 SP3有x86_64和aarch64两个架构部分命令输出格式有细微差异但主要的配置文件路径是一致的。2.2 用脚本建立加固前的基线快照加固前一定要留后悔药。常见的做法是先把关键配置文件的hash和内容存一份再记录当前开启的服务这样后续改出问题能快速比对回滚。下面这个脚本采集的信息足够覆盖三级测评的主机项。#!/bin/bash # 加固前基线采集适用于银河麒麟V10 SP3 DATE$(date %Y%m%d%H%M) mkdir -p /root/baseline_$DATE # 系统基本信息 hostname /root/baseline_$DATE/hostname.txt cat /etc/kylin-release /root/baseline_$DATE/hostname.txt 2/dev/null uname -a /root/baseline_$DATE/hostname.txt # 账号与口令策略 cp /etc/passwd /etc/shadow /etc/login.defs /root/baseline_$DATE/ cp /etc/pam.d/system-auth /etc/pam.d/password-auth /root/baseline_$DATE/ 2/dev/null # 审计与日志 cp /etc/audit/auditd.conf /etc/audit/rules.d/audit.rules /root/baseline_$DATE/ 2/dev/null cp /etc/rsyslog.conf /root/baseline_$DATE/ 2/dev/null # 服务与端口 systemctl list-unit-files --stateenabled /root/baseline_$DATE/services_enabled.txt ss -lntup /root/baseline_$DATE/ports.txt # sshd配置与关键文件hash cp /etc/ssh/sshd_config /root/baseline_$DATE/ sha256sum /etc/passwd /etc/shadow /etc/ssh/sshd_config /etc/audit/rules.d/audit.rules /root/baseline_$DATE/file_checksum.txt echo 基线已保存至 /root/baseline_$DATE这个脚本的原理很简单把所有要改的文件先原样复制一份到带时间戳的目录同时记录服务列表和监听端口方便加固后做差异对比。文件hash记录在file_checksum.txt里改完配置可以用sha256sum -c校验。要注意的是/etc/shadow文件里存的是密码hash采集后注意别让这份基线文件落到不相关的人手里建议采集完直接放到加密盘或者随手下线。2.3 加固顺序和回滚策略怎么定我的习惯是先改不依赖网络服务的配置login.defs、PAM策略、umask再改SSHD这类远程管理服务最后动审计和内核参数。改SSHD之前一定确认本机还有其他登录方式比如物理终端或者带外管理否则sshd_config写错一行远程直接断连后悔药都吃不上。回滚策略分两级单文件回滚用备份副本直接覆盖服务级回滚用systemctl restart失败时自动还原。实际操作中我会在改完每个配置文件后立刻做语法检查比如sshd -t、nft -c -f /etc/nftables.conf语法不过直接还原不等服务重启才暴露问题。3. 身份鉴别加固密码策略、PAM锁定与SSH防爆破的参数落地3.1 密码复杂度策略/etc/login.defs与PAM的配合三级测评对身份鉴别的第一条要求通常是“密码复杂度”和“定期更换”。银河麒麟的密码策略由/etc/login.defs和PAM模块共同控制login.defs控制密码有效期和最小长度基线PAM控制复杂度。只改login.defs而不改PAMpasswd命令依然接受弱密码——这是最常见的翻车点。先改/etc/login.defs把密码有效期的几个参数从默认值收紧# /etc/login.defs 关键参数 PASS_MAX_DAYS 90 PASS_MIN_DAYS 7 PASS_MIN_LEN 8 PASS_WARN_AGE 7这三个参数含义很直接90天强制换密、7天内不能改防止改了立刻改回去、提前7天警告。这里注意PASS_MIN_LEN只是最低基线真正的复杂度要求由PAM的pam_pwquality.so模块强制执行所以login.defs这里设8就够别在login.defs里设太长否则PAM的复杂度规则叠上去之后用户改密码会非常痛苦。然后改PAM配置新增或调整密码质量规则# /etc/pam.d/system-auth 和 /etc/pam.d/password-auth 都要改 password requisite pam_pwquality.so try_first_pass local_users_only retry3 authtok_type # 在password-auth的pam_pwquality.so行增加如下参数 # minlen12 最小长度 # dcredit-1 至少一个数字 # ucredit-1 至少一个大写字母 # lcredit-1 至少一个小写字母 # ocredit-1 至少一个特殊字符 # 修改后的完整行 password requisite pam_pwquality.so try_first_pass local_users_only retry3 minlen12 dcredit-1 ucredit-1 lcredit-1 ocredit-1这两行配置是身份鉴别里最核心的。pam_pwquality.so的minlen指的是密码总长度的强制下限而dcredit、ucredit这些参数设成负数表示“至少有多少类字符”取值范围是-1到-999数值越小要求该类字符越多。这里有个容易踩的细节如果minlen设成12同时四类字符各要求至少1个实际密码最短可以到8位——因为minlen会扣掉已满足的字符类数量。所以要么minlen设到16以上要么四个credit参数都设-1别指望minlen12能真卡住12位。改完后验证方式很简单用普通用户执行两次passwd尝试设置弱密码看是否被拒绝。测试完把测试账号删除。3.2 登录失败锁定策略pam_faillock在两处配置都要改登录失败锁定这个项银河麒麟的坑在于同时涉及system-auth和password-auth两个文件而且SSH登录走的是system-auth本地终端登录走的是password-auth两个文件都要配否则测评员用SSH连上来测试锁定策略你会看到策略只在本地生效的诡异现象。# /etc/pam.d/system-auth 在auth段开头加 auth required pam_faillock.so preauth audit deny5 unlock_time900 fail_interval900 auth sufficient pam_unix.so try_first_pass # auth段结尾加 auth required pam_faillock.so authfail audit deny5 unlock_time900 fail_interval900 # account段加 account required pam_faillock.so # /etc/pam.d/password-auth 同样在对应位置加同样的三行逻辑说明pam_faillock.so分为preauth、authfail、account三个阶段。preauth在最前面拦截已锁定用户authfail在密码验证失败后记录失败次数account在会话建立前检查是否锁定期满。deny5表示5次失败就锁定unlock_time900表示锁15分钟fail_interval900表示这5次失败必须在15分钟内累计。这里务必注意顺序preauth必须在pam_unix.so之前authfail必须在pam_unix.so之后顺序乱了锁定策略直接失效。改完还要处理root账号。测评要求一般是root也要受锁定策略约束但也有单位勾选“仅限制非root用户”作为补偿项。我一般建议测试环境全开生产环境给root留个白名单避免运维被锁在门外只能去机房。给root加白名单的方式是加一行auth required pam_faillock.so preauth audit deny5 even_deny_root unlock_time900其中even_deny_root表示root也被限制不加这个参数就是root不受限制。3.3 SSH防暴力破解sshd_config参数和实际端口暴露面的控制SSH是三级测评里身份鉴别和入侵防范都要看的地方。V10 SP3默认的sshd_config没有开启太多安全项需要手动补的参数下面这几个是测评必查的。# /etc/ssh/sshd_config PermitRootLogin no # 禁止root直接SSH登录 Protocol 2 # 仅允许SSH协议v2 MaxAuthTries 3 # 单次连接最多尝试3次 LoginGraceTime 30 # 登录超时30秒 ClientAliveInterval 300 # 每300秒探测客户端存活 ClientAliveCountMax 0 # 探测失败立即断开 PubkeyAuthentication yes # 开启公钥认证 PasswordAuthentication yes # 保留密码认证内网可考虑关 AllowUsers opsadmin secadmin # 白名单账号按实际改MaxAuthTries可以配合前面的pam_faillock做双层防护SSH层的3次尝试配合PAM的5次锁定基本能挡住大部分脚本扫描。PermitRootLogin no这个参数注意和AllowUsers的关系——如果开了AllowUsers是包含root的PermitRootLogin no仍然生效两处规则同时满足才放行。建议生产环境root一律禁止直接登录用普通账号加sudo提权。改完sshd_config一定要跑sshd -t验证语法然后systemctl restart sshd。重启前开一个额外的SSH会话保持在线万一语法错误导致服务起不来还有退路。这里的实际经验是sshd_config里不允许出现重复参数后出现的会覆盖先出现的如果你之前配过AllowUsers又追加一次结果可能是只有第二次配置的账号能登录排查时第一反应应该是搜索全文有没有重复项。3.4 最小权限与账号清理确保持久化账号、空口令、默认口令一锅端身份鉴别做完之后访问控制的第一步是账号清理。三级测评里查“默认账号”通常不是要求删掉所有系统账号而是要求不存在空口令、弱口令、多余的高权限账号。# 检查空口令账号重点是shadow文件第二字段为空 awk -F: ($2){print $1 空口令} /etc/shadow # 检查UID为0的账号正常情况只有root一个 awk -F: ($30){print $1 UID0} /etc/passwd # 检查最近90天未登录但仍有shell的账号 lastlog -b 90 | grep -v Never logged in | grep -v Username输出为空的说明干净有输出的逐条处理。UID0账号如果出现多个多半是后门需要锁定或删掉。空口令账号直接passwd -l 用户名锁定。长期不登录的账号如果不是业务需要直接usermod -s /usr/sbin/nologin 用户名把shell改成nologin保留账号但不提供登录能力。这里补充一个常见的误操作删账号之前先确认没有进程属于这个账号否则删了用户但文件还在进程还在跑反而制造了没主文件的进程残留审计时不好解释。正确顺序是先杀进程再锁账号最后决定删不删。4. 访问控制、审计与入侵防范把三层防线叠起来4.1 文件权限和umask让默认创建的文件不裸奔访问控制的第二个层面是文件权限。三级测评会抽查关键目录和文件的权限设置/etc/shadow必须600权限、属主root/etc/ssh/sshd_config必须600或644且属主root。常见的问题出在umask上——V10 SP3默认umask是0022意味着普通用户创建的文件默认644其他用户可读。对服务器场景这个太宽了。# /etc/profile 和 /etc/bashrc 里设置默认umask # 在文件末尾追加或修改 umask 0027umask设成0027后新文件默认权限是640新目录默认750组内成员只读不写、组外无权限。改完umask要注意已经存在的文件不会自动变化需要手动chmod。另外一个隐藏坑是某些应用会用自己定义的umask创建文件比如Tomcat、Nginx的worker进程这些要看应用的启动脚本里有没有单独设置umask光改系统的没用。关键文件的权限巡检我习惯用一条find命令跑完find /etc -type f -perm -ow -exec ls -l {} \; 2/dev/null find /etc -type f -name *.conf -perm -or -exec ls -l {} \; 2/dev/null第一条找出其他用户可写的重要配置文件第二条找出全局可读的conf文件。正常情况下/etc下的配置文件不应全局可写出现结果逐条修正。4.2 auditd审计规则覆盖关键目录、文件访问和特权命令调用等保三级对安全审计的要求是审计记录覆盖到每个用户的每个重要行为和文件访问记录。银河麒麟V10 SP3自带auditd但默认规则基本是空的需要手工写规则。先确认auditd在运行systemctl status auditd systemctl enable auditd然后写审计规则。审计规则有三类文件访问审计-w、系统调用审计-a、目录审计-w。三级测评重点查文件访问和特权命令。下面这组规则覆盖了最常见的检查项# /etc/audit/rules.d/audit.rules 追加以下内容 ## 删除现有规则 -D ## 缓冲区和日志配置 -b 8192 -f 1 ## 审计关键文件改动 -w /etc/passwd -p wa -k identity -w /etc/shadow -p wa -k identity -w /etc/group -p wa -k identity -w /etc/sudoers -p wa -k sudoers -w /etc/ssh/sshd_config -p wa -k sshd_config ## 审计特权命令执行按实际存在的命令 -a always,exit -F path/usr/bin/su -F permx -k su_usage -a always,exit -F path/usr/bin/sudo -F permx -k sudo_usage -a always,exit -F path/usr/bin/passwd -F permx -k passwd_usage -a always,exit -F path/usr/bin/useradd -F permx -k useradd_usage -a always,exit -F path/usr/sbin/sshd -F permx -k sshd_usage ## 审计时间和时钟修改 -a always,exit -F archb64 -S adjtimex -S settimeofday -S clock_settime -k time_change ## 审计登录和会话 -w /var/log/faillock -p wa -k login_fail -w /var/log/lastlog -p wa -k login_info这些规则的关键参数-p wa表示记录写操作和属性更改-k是关键词后续用ausearch -k identity就能过滤出相关记录。-b 8192设置缓冲区大小为8192条超过这个数auditd会向日志目录写警告-f 1表示磁盘满或严重错误时设置为single模式这是三级测评的加分项但生产环境要慎重——磁盘满直接进单用户模式可能让业务中断可以退一步把-f改成2只输出错误信息不切换模式。规则写完后重启auditd并验证规则已加载systemctl restart auditd auditctl -l | wc -l # 查看规则条数 auditctl -s # 查看状态注意auditd的规则重启后应用通过/etc/audit/rules.d/下的文件自动加载不要用auditctl命令行直接加的规则那是临时的重启就没了。还有一个坑V10 SP3上auditd的service可能没有真正启动状态显示failed多半是/var/log/audit目录权限不对chmod 750 /var/log/audit chown root:root /var/log/audit处理后重新启动即可。4.3 防火墙与危险服务收敛用nftables替代iptables的注意点银河麒麟V10 SP3默认的防火墙是nftables但很多管理员习惯性地去找iptables。系统里iptables命令确实存在但底层已经转到nftables框架直接service iptables save这种老命令并不生效这就是为什么很多人在麒麟上配了防火墙规则重启后消失。正确做法是用firewall-cmd或直接编辑nftables配置。# 查看当前防火墙状态 systemctl status firewalld firewall-cmd --state # 开放必要端口比如SSH按实际业务改 firewall-cmd --permanent --add-servicessh firewall-cmd --permanent --add-port80/tcp firewall-cmd --reload # 查看生效规则 firewall-cmd --list-all危险服务收敛做两件事关掉不需要的网络服务和禁止不安全的协议。常用命令# 确认不用的服务直接禁用 systemctl disable --now telnet.socket 2/dev/null systemctl disable --now rlogin.socket 2/dev/null systemctl disable --now rexec.socket 2/dev/null # 检查监听端口找出意外暴露的服务 ss -lntup | grep LISTEN这里要特别注意V10 SP3默认开启的服务比CentOS多一些比如一些国产化相关服务。判断一个服务能不能关先看它的进程属主和启动参数不要按名字猜有些服务是系统依赖关了会导致登录异常。稳妥的方法是先systemctl stop 服务名观察半天确认没有异常再disable。4.4 内核参数和核心转储把容易被忽略的后门堵上内核参数里有几个等保测评经常查但很多人不知道怎么改的项目。主要是核心转储core dump和内核参数随机化。# /etc/sysctl.conf 追加 fs.suid_dumpable 0 # 禁止setuid程序产生core dump kernel.randomize_va_space 2 # 开启ASLR net.ipv4.conf.all.accept_redirects 0 # 禁止接受ICMP重定向 net.ipv4.conf.all.send_redirects 0 # 禁止发送ICMP重定向 net.ipv4.tcp_syncookies 1 # 开启SYN cookies防半连接攻击 net.ipv4.icmp_echo_ignore_broadcasts 1 # 忽略广播ping # 立即生效 sysctl -pcore dump这个点等级保护测评里属于“入侵防范——漏洞防护”的检查项设成0能防止利用core文件泄露内存中敏感信息。ASLR地址空间随机化设成2是完整随机化这是Linux默认值但有些国产化系统内核编译参数可能没开需要确认。sysctl.conf的写法要小心重复的参数多次出现后面覆盖前面所以先grep -v删掉旧配置再追加新行避免留下冲突项。改完sysctl -p后用sysctl fs.suid_dumpable验证当前值。5. 加固后的常见翻车点与排查手段5.1 用户能登录但sudo提权失效提示“不在sudoers中”现象加固后普通用户登录正常但执行sudo时提示“用户不在sudoers文件中此事将被报告”。原因加固过程中修改了/etc/sudoers或者把用户从某个组里移除了。银河麒麟的sudoers默认会读取/etc/sudoers.d/下的文件部分用户的管理权限是通过这个目录下的独立文件授予的加固时如果执行了chmod或chown操作改变了这些文件的属主sudo直接拒绝读取。另一个常见原因是#includedir /etc/sudoers.d被注释掉了。解决用root登录检查/etc/sudoers里是否有#includedir /etc/sudoers.d这行没有就补上。再检查/etc/sudoers.d/下的文件权限是否为440或管理员手动设置的可用权限必须属主root。让用户重新登录一次sudo -l验证。5.2 pam_faillock生效后正确的密码也登录不上现象配置faillock后用户连续输错密码等到unlock_time过去后依然无法登录输入正确密码也反复被拒。原因unlock_time的计时是从第一次失败开始算的而faillock在preauth阶段会拦下所有用户包括密码正确的用户。另外更隐蔽的是/var/run/faillock或/var/log/faillock目录权限不对PAM模块无法写入/读取记录导致每次登录都被当成失败处理。解决先查看faillock --user 用户名的输出确认锁定状态和时间。如果unlock_time还没到只能等或者root执行faillock --user 用户名 --reset。如果reset后还是不行检查ls -ld /var/run/faillock正常应该是drwxrwxrwt这种粘滞位权限不对就chmod 1777 /var/run/faillock。这个问题在V10 SP3上出现频率很高因为默认的临时目录权限偏紧。5.3 auditd配置了规则但ausearch查不到任何记录现象auditctl -l能看到规则但ausearch -k identity输出为空。原因上面提到过的坑——auditd服务实际没起来。V10 SP3上auditd的启动脚本依赖/var/log/audit目录存在且有正确权限如果目录缺失或属主变过服务反复重启失败。另一个原因是用auditctl -D清空规则后没有重新加载配置文件。解决systemctl status auditd看状态然后确认/var/log/audit目录存在且属主root、权限750。启动服务后手动touch /var/log/audit/audit.log创建日志文件再看状态。规则加载后不要急着ausearch先执行一次被审计的操作比如修改/etc/passwd的访问时间再ausearch就能看到记录了。5.4 系统更新后sshd配置被覆盖加固项丢失现象执行yum update或dnf update后sshd_config里的PermitRootLogin no等设置全部恢复默认。原因软件包更新会覆盖配置文件这是RPM类系统的默认行为。银河麒麟V10 SP3的openssh包升级时会让你选择是否替换原有的sshd_config如果选错了就会覆盖。解决现在V10 SP3的repo源默认配置保留了旧配置文件rpmnew机制升级后去/etc/ssh/目录下找sshd_config.rpmnew把里面的新参数合并回现有配置。更好的做法是把自定义的SSH配置单独放到/etc/ssh/sshd_config.d/目录下新建一个custom.conf放自定义参数主配置文件里的Include指令会自动加载。这样升级也不会丢失。如果默认没有Include这行就自己在主配置文件末尾加一行Include /etc/ssh/sshd_config.d/*.conf。5.5 防火墙放行的端口业务还是不通现象firewall-cmd --add-port8080/tcp后外部访问8080端口仍然超时。原因V10 SP3有两层防火墙机制。firewalld只是第一层底层还有nftables的规则集在系统启动阶段就加载了一个默认的DROP策略集。firewalld添加的规则是动态写到nftables的但如果之前有手动执行的nft命令加载了另一套规则集两者冲突firewalld的规则不会按预期生效。解决先检查nft list ruleset看当前真实规则集再对比firewall-cmd --list-all的放行列表。如果firewall-cmd有放行但nftables没有执行systemctl restart firewalld让服务重新生成规则集。如果业务还不同再看ss -lntup里监听地址是0.0.0.0还是具体IP很多情况是服务本身只监听了内网IP防火墙放行的是公网网卡两件事不在一个层面。6. 加固结果验证用一条命令链模拟测评员视角等保测评员做的事本质上就是三个动作看配置、看状态、做验证。加固完成后我会按下面的顺序自己先“测评”一遍。# 检查密码策略是否生效 chage -l opsadmin # 看最近修改时间和过期时间 # 检查UID0账号数量 awk -F: ($30){print $1} /etc/passwd # 检查登录失败锁定 faillock --user opsadmin # 看当前失败记录 # 检查auditd规则数量和最近记录 auditctl -l | wc -l ausearch -k identity -ts today | tail -20 # 检查端口暴露 ss -lntup | grep LISTEN | awk {print $4} | sort -u # 检查防火墙状态 firewall-cmd --state firewall-cmd --list-all # 检查免密root登录 grep -E ^PermitRootLogin|^AllowUsers /etc/ssh/sshd_config这些命令全部过一遍大概率能覆盖测评员的人工检查项。但我个人经验是真正卡人的不是这些静态项而是“加固后应用跑不起来”这个连带事故。所以每改一个模块至少跑一次业务冒烟登录验证、重启验证、关键进程验证。还有两个容易被忽略的收尾动作。第一清理掉加固过程中产生的临时文件特别是基线目录里的shadow副本建议加固完成后把整个baseline目录移到加密分区或直接删除只剩hash值就够了。第二把加固手册里对应的整改项填到等保自查表里每项写明“配置了XX参数到XX值验证结果通过”。这一步看着麻烦但测评机构复核时可省去大量反复询问的时间。最后说个习惯我在每台机器上做加固都会在/etc/motd里记一行“加固日期等保三级联系人”但真正的配置变更记录放在独立变更单里不写在系统可见位置。这样下次有人接手第一眼就知道这台机器动过哪里。希望帮到你。本文还有配套的精品资源点击获取