Windows/Linux主机加固清单:密码策略、端口收敛与取证复盘
简介:这份2021年全国职业院校技能大赛网络安全竞赛试题文档,面向职业院校网络安全竞赛选手、指导教师及备赛训练人员,围绕赛项任务还原服务器加固、数据库防护、流量完整性与事件监控等典型考点,适合用于赛前模拟、专项训练与教学对照。压缩包内仅1个docx文件,大小约119KB,内容以赛题任务和操作要求为主线,涵盖Windows与Linux双平台的密码策略、登录提示、用户权限管理,MySQL安全运行与权限授予,HTTP重定向HTTPS、IIS日志审计,以及SSH、VSFTPD、IIS服务加固和防火墙端口封禁策略,并延伸至网络安全事件响应、数字取证调查与应用安全模块。读者可据此梳理竞赛任务结构、明确加固要点与验证方向,形成较完整的备赛清单和排错参照。目前已有961人学习下载,适合作为网络安全竞赛入门到进阶阶段的赛题样本与训练底稿。
1. 一份能当“加固清单”翻的赛题:Windows 与 Linux 双平台到底考什么
拿到这份 2021 年网络安全赛项试题文档,我第一反应不是“题目”,而是“清单”——它把 Windows 和 Linux 两台机器上该收紧的登录策略、该关的端口、该改的服务参数,按任务一到任务六排得明明白白。很多同行做等保整改时最头疼的就是“知道要加固,但记不全条目”,这份文档恰好能补这个缺口:密码长度、Banner 提示、会话超时、数据库运行账户、445 和 23 端口、ICMP 禁 ping,一条条都是能直接落到配置文件里的动作。适合刚接触主机加固的新手照着复现,也适合熟手当检查表用,看自己漏了哪一项。
它更像一份带评分点的实操任务书,并非教程。模块 A 是防守侧的加固,模块 B 是事件响应与取证,两边合起来正好是一条完整的“先防住、再查清”的链路。下面我按实际动手顺序拆开讲,重点放在参数怎么写、命令怎么敲、改完怎么验证,以及我踩过的那些坑。
2. 登录与账户加固:把密码策略和会话超时落到配置文件
这一章对应任务一的全部内容,也是整套加固里最容易“改了没生效”的部分。Windows 走的是本地安全策略和组策略两条路,Linux 走的是/etc/login.defs和/etc/ssh/sshd_config两个文件,看着简单,但每一条都有生效前提。
2.1 密码长度 16 位:两个平台的最小长度参数
Windows 侧打开“管理工具 → 本地安全策略 → 账户策略 → 密码策略”,把“密码长度最小值”改成 16。注意这里改的是本地策略,如果机器已入域,域策略会覆盖本地设置,改完不生效先去gpresult /h report.html看一眼实际生效的是哪条策略。
Linux 侧改/etc/login.defs:
# 密码最小长度,改为 16 sed -i 's/^PASS_MIN_LEN.*/PASS_MIN_LEN\t16/' /etc/login.defs # 验证是否写入 grep -E '^PASS_MIN_LEN' /etc/login.defs逻辑说明:login.defs是useradd、passwd等工具读取的默认参数文件,PASS_MIN_LEN控制新建密码的最小长度。参数说明:这里只影响之后修改密码的行为,已存在的旧密码不会因此失效;另外如果系统装了pam_pwquality,真正卡长度的是/etc/security/pwquality.conf里的minlen,两处不一致时以 PAM 为准。我一般两处都设,避免出现“文件改了但 passwd 还是能设短密码”的翻车现场。
2.2 登录 Banner:本地提示与远程提示要分开配
题目要求登录时出现 “For authorized users only”。Linux 本地终端读的是/etc/issue,SSH 远程读的是sshd_config里的Banner指向的文件,这两个是不同的入口,只改一个会出现“本地有提示、SSH 进来没提示”的情况。
# 本地登录欢迎语 echo "For authorized users only" > /etc/issue # SSH 远程登录 Banner echo "For authorized users only" > /etc/ssh/banner chmod 644 /etc/ssh/banner # 在 sshd_config 中启用 Banner grep -q '^Banner' /etc/ssh/sshd_config || echo 'Banner /etc/ssh/banner' >> /etc/ssh/sshd_config sshd -t && systemctl restart sshd逻辑说明:sshd -t是配置语法自检,先测再重启,能避免改错一个字符把 SSH 服务搞挂、把自己锁在门外。参数说明:Banner的路径建议用绝对路径;文件权限给 644 即可,属主不必是 root,但目录必须可读。Windows 侧对应的是“本地安全策略 → 本地策略 → 安全选项 → 交互式登录:试图登录的用户的消息标题/文本”,标题和正文两栏都要填,只填文本栏在某些版本上不显示。
2.3 非活动会话 5 分钟超时:ClientAlive 两个参数配合
SSH 超时靠ClientAliveInterval和ClientAliveCountMax两个参数相乘,题目要求小于等于 5 分钟,常见做法是 60 秒 × 5 次 = 300 秒,正好卡线。
# 每 60 秒探测一次,连续 5 次无响应断开,合计 300 秒 sed -i 's/^#\?ClientAliveInterval.*/ClientAliveInterval 60/' /etc/ssh/sshd_config sed -i 's/^#\?ClientAliveCountMax.*/ClientAliveCountMax 5/' /etc/ssh/sshd_config sshd -t && systemctl restart sshd逻辑说明:服务端每隔ClientAliveInterval秒向客户端发一次探测,连续ClientAliveCountMax次收不到回应就断开连接。参数说明:两个值必须同时设置,只设 Interval 会取默认的 3 次,实际超时就变成 180 秒,虽然也满足“小于 5 分钟”,但如果题目卡的是“等于 5 分钟”,就得按 60×5 来。Windows 侧在“远程桌面会话主机设置 → RDP-Tcp 属性 → 会话”里设“结束已断开的会话”和“活动会话限制”,注意单位是分钟,别按秒填。
2.4 限制 user1 的登录时段与网络访问权限
Windows 单机环境下用net user最直接:
# 只允许周一至周五 9:00-18:00 登录 net user "user1" /time:M-F,9:00-18:00 # 查看结果确认 net user "user1"逻辑说明:/time参数接受星期缩写加时间段,M-F表示周一到周五,时间段用 24 小时制、逗号分隔多段。参数说明:时间粒度为 1 小时,写 9:30 会被取整;如果账号属于域,这条命令改的是本地账户库,域账户要在“Active Directory 用户和计算机”里改登录时间才生效。
“只允许管理员账号从网络访问本机”这条走组策略:计算机配置 → Windows 设置 → 安全设置 → 本地策略 → 用户权限分配 → “从网络访问此计算机”,把除 Administrators 之外的组全部删除。这里有个细节,删除 Users 组后本机共享访问会一起断掉,如果业务上还要用共享,就得把需要访问的账号单独加进去,别一刀切。
3. 数据库与服务加固:MySQL 运行账户和三个服务的安全参数
任务二和任务五合起来是一整块“服务面收敛”,MySQL 改运行身份、改管理员名、缩权限,SSH / VSFTPD / IIS 改端口、禁匿名、开日志。这一层的共性是:改配置容易,改完服务还能正常起来才是本事。
3.1 MySQL 以普通账户运行并清理默认库
先确认系统里已有mysql这个普通用户,然后在/etc/my.cnf的[mysqld]段加user参数:
[mysqld] user = mysql-- 删除默认测试库 DROP DATABASE IF EXISTS test; -- 管理员改名(MySQL 5.7 及以下写法) UPDATE mysql.user SET user='SuperRoot' WHERE user='root'; FLUSH PRIVILEGES; -- 用内置 MD5 加密 user1 密码 UPDATE mysql.user SET password=MD5('P@ssw0rd1!') WHERE user='user1'; FLUSH PRIVILEGES; -- 只给增删改查权限 GRANT SELECT,INSERT,DELETE,UPDATE ON testdb.* TO 'user1'@'localhost'; FLUSH PRIVILEGES;逻辑说明:user=mysql让 mysqld 进程以低权限账户启动,即使被拿下也拿不到 root 壳。参数说明:MySQL 8.0 已经移除了password字段和PASSWORD()函数,改密码要用ALTER USER 'user1'@'localhost' IDENTIFIED BY 'P@ssw0rd1!',赛题里的 MD5 写法是 5.7 时代的产物,照抄到 8.0 上会直接报错——这是我最想提醒的一处版本坑。另外改名管理员后,配置文件里的mysql.user表操作要重新登录验证,FLUSH PRIVILEGES别漏。
3.2 SSH 改端口 2222 并禁 root 远程登录
# 端口改 2222,注意 SELinux 和防火墙要同步放行 sed -i 's/^#\?Port .*/Port 2222/' /etc/ssh/sshd_config # 禁止 root 直接远程登录 sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config sshd -t && systemctl restart sshd逻辑说明:改端口属于“降低扫描命中率”的常规手段,PermitRootLogin no则是强制运维先登录普通账号再su,把 root 的口令暴露面收窄。参数说明:改端口后如果开了 firewalld,要执行firewall-cmd --permanent --add-port=2222/tcp && firewall-cmd --reload;如果开了 SELinux,还得semanage port -a -t ssh_port_t -p tcp 2222,否则服务起不来但日志只报一句含糊的权限拒绝,很容易查半天。
3.3 VSFTPD 禁匿名上传与无操作超时
# /etc/vsftpd/vsftpd.conf anonymous_enable=NO connect_timeout=600 accept_timeout=600 data_connection_timeout=300 idle_session_timeout=300逻辑说明:anonymous_enable=NO直接关掉匿名登录,比“禁匿名上传”更彻底,也符合赛题意图。参数说明:四个超时参数单位都是秒,题目要求“无任何操作超时 5 分钟”,真正对应的是idle_session_timeout,设 300;data_connection_timeout管数据传输中断,设 300 也合理;connect_timeout和accept_timeout管主动/被动模式建连,给 600 是留余量。改完记得systemctl restart vsftpd,并用ftp客户端实测一次匿名登录应被拒。
3.4 IIS 日志字段与最大并发连接数
IIS 侧在“网站 → 日志设置”里把格式选为 W3C,然后只勾选日期、时间、客户端 IP 地址、用户名、方法五项,其余取消。并发连接数在“网站 → 高级设置 → 限制 → 最大并发连接数”改成 1000。这两项在图形界面点几下就完事,但要注意日志目录默认在%SystemDrive%\inetpub\logs\LogFiles,磁盘小的话建议顺手改到数据盘,否则跑一段时间日志能把系统盘写满——这是我在实际环境里真翻过的车。另外 HTTP 跳转 HTTPS 那条,用 IIS 的 URL 重写模块加一条规则,匹配http且{HTTPS}为 off 时重定向到https://{HTTP_HOST}/{RREQUEST_URI},证书要提前绑定到站点,否则跳过去也是证书错误页。
4. 防火墙与端口收敛:445、23 和 ICMP 的处理顺序
任务六看着是“关几个端口”,实际上考的是对流量方向和策略顺序的理解。Windows 走高级防火墙入站规则,Linux 走 iptables,两边都要注意“默认策略”和“规则顺序”这两个隐含前提。
4.1 Windows 禁用 445 与 23 端口
图形界面在“高级安全 Windows Defender 防火墙 → 入站规则 → 新建规则 → 端口”,分别填 445 和 23,动作选“阻止”。命令行更省事:
New-NetFirewallRule -DisplayName "Block-SMB-445" -Direction Inbound -Protocol TCP -LocalPort 445 -Action Block New-NetFirewallRule -DisplayName "Block-Telnet-23" -Direction Inbound -Protocol TCP -LocalPort 23 -Action Block Get-NetFirewallRule -DisplayName "Block-*" | Select DisplayName,Enabled,Direction,Action逻辑说明:New-NetFirewallRule创建的是入站阻止规则,优先级高于允许规则,比直接删服务更稳妥。参数说明:-Protocol TCP只挡 TCP,445 的 UDP 137/138 属于 NetBIOS 另一套,题目只要求 445 就按 TCP 处理;如果机器上跑着文件共享业务,封 445 会直接导致共享不可用,动手前先确认业务依赖。
4.2 Linux 禁 23 端口与禁 ping
# 禁 telnet 23 端口 iptables -A INPUT -p tcp --dport 23 -j DROP # 禁 ping:临时 echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all # 禁 ping:永久写 sysctl echo 'net.ipv4.icmp_echo_ignore_all=1' >> /etc/sysctl.conf sysctl -p # 或用 iptables 丢 ICMP echo-request iptables -A INPUT -p icmp --icmp-type 8 -s 0/0 -j DROP逻辑说明:icmp_echo_ignore_all=1是内核级开关,效果最干净;iptables 方式更灵活,可以只针对某些源地址放行。参数说明:--icmp-type 8就是 echo-request,别写成 0(那是 echo-reply)。这里有个血泪经验——iptables -A是追加到链尾,如果前面已有ACCEPT规则,后面这条 DROP 根本轮不到执行,正确做法是用-I INPUT 1插到最前面,或者先iptables -L -n --line-numbers看清现有规则再决定插哪。
4.3 只允许 172.16.1.1 访问 SSH
# 先放行指定源,再拒绝其余,顺序不能反 iptables -I INPUT 1 -s 172.16.1.1 -p tcp --dport 22 -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j DROP # 持久化 iptables-save > /etc/sysconfig/iptables逻辑说明:iptables 从上往下匹配,第一条命中即生效,所以白名单必须放在拒绝之前。参数说明:-I INPUT 1表示插到 INPUT 链第一位;持久化命令在不同发行版上不一样,CentOS 系用service iptables save或写/etc/sysconfig/iptables,Debian 系用iptables-persistent。改完一定先开一个新终端测试能不能连上,再关掉旧会话,否则就是自己把自己踢下线的经典事故。
5. 避坑与排查:这几处“改了不生效”最耗时间
这一章单独拎出来,是因为上面每一条命令背后几乎都对应一次失败。赛场上时间紧,排查靠的是知道先看哪里,而不是从头再读一遍配置。
现象一:改完sshd_config重启服务直接失败,SSH 断了。原因多半是配置行重复或语法错,sed替换时匹配到了注释行又追加了一条。解决:改之前先cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak,改完务必sshd -t通过再 restart;如果已经断了,从控制台进单用户或救援模式回滚备份,别急着重装。
现象二:密码长度设了 16,但passwd仍能设 8 位密码。原因是有pam_pwquality在管事,login.defs只是默认值。解决:检查/etc/security/pwquality.conf的minlen,以及/etc/pam.d/system-auth里pam_pwquality.so那行有没有带minlen参数覆盖。
现象三:Windows 封锁 445 后域内共享和打印全挂。原因是 SMB 不只是“文件共享”,域控的组策略下发、打印机连接都走 445。解决:先确认机器是否入域,入域机器封 445 要同步调整业务路径,或者只对来自外网的源地址做阻止,内网放行。
现象四:iptables 规则写了、iptables -L也能看到,但端口照样通。原因是规则被追加在已有的ACCEPT之后,或者服务本身监听在别的链(比如 Docker 会自动插规则到DOCKER链)。解决:用iptables -L INPUT -n --line-numbers看顺序,用iptables -I插到最前;有 Docker 的环境还要在DOCKER-USER链里做限制。
现象五:MySQL 改user=mysql后服务启动报权限错误。原因是数据目录和 socket 文件的属主还是 root。解决:chown -R mysql:mysql /var/lib/mysql和/var/run/mysqld,再看my.cnf里socket、datadir两处路径是否一致。改运行账户这事,权限和路径必须一起捋。
6. 从加固到取证:把模块 B 的取证思路接在加固后面
模块 A 是把门关好,模块 B 是门已经被撬过之后怎么查——内存取证、流量分析、渗透测试三条线,恰好对应“主机层、网络层、攻击面”三个视角。我平时做完加固复测,会顺手用模块 B 的方法反向验证一遍:加固到底有没有把攻击路径堵死。
内存取证那条线,核心是拿到镜像后先hashdump提用户哈希再离线破解,题目里 6 位密码属于可爆破范围,用john配rockyou字典基本几分钟出结果。查浏览器关键词、找挖矿进程的矿池地址,靠的是netstat -anp看异常外联,再顺着 PID 找进程路径。这部分我一般会加一步:把netstat结果和ps aux交叉比对,因为有些挖矿程序会伪装进程名,单看一个视图容易漏。
流量分析这条线更考验过滤器熟练度。Wireshark 里ftp过滤能直接看到USER/PASS明文,ftp.request.command能定位登录后执行的第一条命令,ftp-data过滤才能抓到真正下载的文件内容。下面这段是我常用的提取思路,把 pcap 里的 FTP 控制流和数据流分开看:
# 只看 FTP 控制通道的命令与响应 tshark -r capture.pcapng -Y "ftp" -T fields -e frame.time -e ip.src -e ftp.request.command -e ftp.request.arg # 提取 FTP 数据传输内容 tshark -r capture.pcapng -Y "ftp-data" -T fields -e ftp-data逻辑说明:-Y是显示过滤器,-T fields -e指定输出字段,比在图形界面一条条点开高效得多。参数说明:ftp.request.command只对控制通道有效,数据通道要用ftp-data;如果数据是二进制,-e ftp-data输出的是十六进制,需要配合-T fields -e data.data再转存还原。
渗透测试那条线,考点集中在 Nmap 和 MSF 的参数记忆上:-oX输出 XML、msfdb init初始化数据库、db_import导入扫描结果、hosts查看已导入主机、search cve-2019-0708找模块。这些命令不难,难在环境——Kali 里 PostgreSQL 没起来时msfdb init会失败,先systemctl start postgresql再初始化。CVE-2019-0708 那个检测模块跑完,回显最后一个单词通常是Vulnerable或Safe,题目要的就是这个词。
我自己的习惯是:每做完一台机器的加固,立刻用模块 B 的思路打一遍自己——端口扫一遍看该关的关没关,抓一段流量看有没有明文口令,跑一次漏洞检测看补丁打没打。从那以后我每次交付加固报告前,都强制走一遍“加固 → 自测 → 取证视角复查”这个循环,比只看配置文件靠谱得多。这份试题文档的价值也在这里:它把两个方向的动作都列全了,照着做一遍,等于把主机加固和应急响应的主干流程都过了一遍。希望帮到你。
本文还有配套的精品资源,点击获取