
简介这份2021年全国职业院校技能大赛网络安全竞赛试题文档面向备赛选手、指导教师及希望系统梳理竞赛考点的安全从业者可用于模拟训练、教学拆解与自查补漏。压缩包内仅含1个docx文件大小约119KB内容围绕A、B模块组织覆盖登录安全加固、数据库加固、流量完整性保护、事件监控、SSH/VSFTPD/IIS服务加固、防火墙策略以及网络安全事件响应、数字取证调查和应用安全等任务并列出Windows与Linux环境下的配置路径、命令示例和截图要求。文档以任务驱动方式呈现密码策略、远程会话超时、用户登录时间限制、MySQL权限收紧、HTTPS重定向、日志审核与端口封禁等检查项便于对照实验环境逐条核验。该资料已有961人学习适合按赛题任务复现实验、理解加固思路与取证分析流程也可作为赛前集中复盘和团队分工训练的参考清单。1. 一份加固清单能踩出多少坑先说清这份赛题包到底是什么带参赛队复盘时最扎心的不是不会做而是六台靶机里有一半加固项评分脚本读不到——密码策略改了没生效、Banner 文件建了路径写错、iptables 规则加完自己先掉线。这套 2021 赛年的网络安全技能大赛试题包价值就在于它把 Windows 与 Linux 双平台的账户加固、数据库降权、HTTPS 强制跳转、审核策略、防火墙收敛以及内存取证、流量分析、MSF 渗透三条取证链路压进了四十多个可打分的检查点。准备竞赛的人拿它练流程刚接手安全整改的运维拿它逐条核自己的机器都能对上位置。2. 账户与登录面密码策略、Banner 与会话超时的双平台落地账户面是所有加固题的第一道关也是最容易被“看起来改了”骗过去的一关。Windows 走的是本地安全策略加组策略两条线Linux 走的是/etc/login.defs、PAM、sshd_config三个文件两边都有一个共同特征配置写进去了不等于策略生效生效了不等于对存量账户生效。这一章按“密码长度 → 登录提示 → 会话超时 → 登录时段与访问来源”的顺序拆每一步都给可抄的命令和该看的回显。2.1 密码长度 16 位Windows 与 Linux 各自的生效链路Windows 侧最直接的是本地安全策略图形路径为“管理工具 → 本地安全策略 → 账户策略 → 密码策略 → 最小密码长度”改成 16 即可。批量或远程场景我一般用命令行省得点错# 查看当前密码策略 net accounts # 最小密码长度改为 16 net accounts /minpwlen:16 # 复核MinPasswordLength 一行应显示 16 net accounts | Select-String 密码长度|Minimum password lengthnet accounts改的是本机 SAM 的策略等价于secedit里的MinimumPasswordLength。参数/minpwlen取值 0-14 是“允许”14 以上才是强制长密码注意这条命令只影响本地账户域环境要走组策略的“默认域策略”改完gpupdate /force再在域控上gpresult /h看结果。另一个细节Windows 的密码策略对已存在的账户在下一次改密时才校验想立刻验证就新建一个测试账户试设 8 位密码被拒才算真的生效。Linux 侧题面给的是改/etc/login.defs的PASS_MIN_LEN# 备份后修改 cp /etc/login.defs /etc/login.defs.bak sed -i s/^PASS_MIN_LEN.*/PASS_MIN_LEN\t16/ /etc/login.defs grep -E ^PASS_(MIN|MAX) /etc/login.defsPASS_MIN_LEN控制的是新建用户和改密时的最小长度配套还有PASS_MAX_DAYS最长有效期、PASS_MIN_DAYS两次改密间隔、PASS_WARN_AGE过期前提醒天数做完整加固时一起设。这里有个高频翻车点RHEL/CentOS 7 之后默认走pam_pwquality模块login.defs里的PASS_MIN_LEN会被 PAM 的minlen覆盖只改前者passwd照样让你设 6 位密码。稳妥做法是两处都改# pwquality 侧同步收紧minlen16 且要求字符类别 sed -i s/^#\?minlen.*/minlen 16/ /etc/security/pwquality.conf grep -E minlen|minclass /etc/security/pwquality.conf # 确认 PAM 栈里引用了 pwqualityDebian 系是 common-password grep pwquality /etc/pam.d/system-auth /etc/pam.d/common-password 2/dev/nullminlen是硬长度下限minclass是字符类别数大写、小写、数字、符号两个参数配合才能挡住aaaaaaaaaaaaaaaa这种 16 位弱密码。改完用passwd testuser实测一次比看配置文件可靠。2.2 登录提示语与 SSH Banner本地链路和远程链路要分开配题面要求登录时出现“For authorized users only”很多人只改了/etc/issue就交卷结果远程 SSH 登录看不到提示扣分。原因是本地 tty 登录读的是/etc/issueSSH 登录读的是sshd_config里Banner指向的文件两条链路互相独立。# 1. 本地 tty 登录提示 echo For authorized users only /etc/issue echo For authorized users only /etc/issue.net # 2. SSH 登录提示 mkdir -p /etc/ssh echo For authorized users only /etc/ssh/banner chmod 644 /etc/ssh/banner # 3. 在 sshd_config 中挂上 Banner并做语法检查 sed -i s|^#\?Banner.*|Banner /etc/ssh/banner| /etc/ssh/sshd_config sshd -t echo config ok systemctl restart sshd/etc/issue支持\r、\m、\n这类转义分别代表系统版本、硬件架构、主机名而issue.net和 Banner 文件不做转义写了\m会原样打印出来。所以 Banner 文件内容建议纯文本别从issue直接复制带转义的模板。chmod 644是防止某些发行版的 sshd 在权限过宽时告警。sshd -t是我每次改 sshd 配置都强制走的一步它能提前抓出拼写错误和路径问题避免重启失败把远程连接全断掉。Windows 侧对应的是“本地安全策略 → 本地策略 → 安全选项”里的两条交互式登录试图登录的用户的消息标题和消息文本。题面原文写成“交换式登录”是错别字实际条目名是“交互式登录”。标题填For authorized users only文本可以写单位用途说明。改完锁屏再登录一次验证只改标题不改文本的话登录框只会显示标题栏正文区域仍是空白评分脚本按文本匹配就会判失败。2.3 会话超时 5 分钟ClientAlive 计数与 RDP 空闲限制远程会话超时这条Linux 靠sshd_config的两个参数组合计算Windows 靠 RDP 会话限制两边的“5 分钟”落点不一样。# SSH每 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 sshdClientAliveInterval是服务端向客户端发探测的间隔秒数ClientAliveCountMax是允许无响应的次数乘积就是实际超时时间。想设 5 分钟60×5 和 300×1 都行但后者只要一次网络抖动就断连体验很差我一般用 60×5。要注意这两个参数断开的是“客户端无响应”的会话不是“用户没敲键盘”的会话——真按空闲算得配合 shell 的TMOUT环境变量但TMOUT会连本地终端一起踢赛题环境一般不用。Windows 侧走“管理工具 → 远程桌面服务 → 远程桌面会话主机配置 → RDP-Tcp 属性 → 会话”选项卡把“空闲会话限制”设为 5 分钟。三个限制别搞混活动会话限制是会话总时长空闲会话限制才是题面要的非活动超时结束已断开的会话管的是连接断开后会话保留多久。组策略路径在“计算机配置 → 管理模板 → Windows 组件 → 远程桌面服务 → 远程桌面会话主机 → 会话时间限制”域环境优先走组策略本地配置会被覆盖。2.4 登录时段与网络访问权限net user 和组策略的边界限制 user1 只能在工作日 9:00-18:00 登录单机用net user域用户走账户属性里的“登录时间”对话框# 单机周一至周五 9:00-18:00 允许登录其余时段拒绝 net user user1 /time:M-F,9:00-18:00 # 复核 net user user1 | Select-String 允许登录时间|Logon hours时间格式必须是英文逗号分隔天、英文连字符表示区间M-F是周一到周五9:00-18:00是 24 小时制写成9am-6pm或中文逗号都会报“命令成功完成”但实际没设上这是最阴的一类失败。域用户的最小时间粒度是 1 小时9:00-18:00 刚好落在整点不会有精度损失要设 9:30 就得接受它被取整。改完让 user1 在非允许时段runas登录一次能登进去说明策略没落到这台机器上本地策略和域策略冲突时域策略赢。“只允许管理员账号从网络访问本机”在“计算机配置 → Windows 设置 → 安全设置 → 本地策略 → 用户权限分配 → 从网络访问此计算机”里改把Everyone、Users、Authenticated Users删掉只留Administrators。这条的血泪教训是删之前先开第二个 RDP 会话验证因为不少环境里管理员的远程登录本身就依赖某个服务账户一刀切完可能连自己都进不去。另外这个权限只管 SMB、RPC 这类网络登录不影响本地交互式登录别和“允许本地登录”搞混。3. 数据库与服务面MySQL 降权、改名和服务端口收敛服务加固是这套题里分值密度最高的部分MySQL 五条、SSH 两条、VSFTPD 两条、IIS 两条每条都是一到两行配置。但恰恰是这种“看起来一行就能搞定”的题藏了最多版本差异和语义陷阱——同一条 SQL 在 MySQL 5.7 能跑、8.0 直接报错同一个超时参数题面给的值和实际语义对不上。这一章按服务维度拆每个动作都标清楚适用版本和验证方式。3.1 用普通账户跑 mysqldmy.cnf 的 user 参数与目录属主让 MySQL 以普通账户运行配置项只有一行但要让它真的生效得同时满足三个条件配置文件里有user、系统里有这个用户、数据目录属主对得上。# /etc/my.cnf [mysqld] user mysql datadir /var/lib/mysql# 确认 mysql 用户存在 id mysql # 数据目录属主必须是 mysql否则启动报 Permission denied chown -R mysql:mysql /var/lib/mysql # 重启并确认进程属主 systemctl restart mysqld ps -o user,pid,cmd -C mysqlduser mysql写在[mysqld]段下不是[client]写错段落 MySQL 会忽略且不报错这是隐性失败。重启后用ps看进程的 USER 列显示mysql才算落地只看配置文件不算数。如果启动报Fatal error: Please read Security section of the manual to find out how to run mysqld as root说明配置没被读到或者被命令行参数覆盖了检查systemctl cat mysqld里的ExecStart有没有硬编码--userroot。另外数据目录属主错了会报Cant create/write to file这类错误在/var/log/mysqld.log里能直接看到别急着改配置先看日志。3.2 删默认库、改管理员名两条 SQL 背后的 host 记录陷阱删test库和把root改名成SuperRoot题面各给了一行实际执行要处理两个额外问题test库的残留授权以及root的多条 host 记录。-- 删库MySQL 8 默认没有 test 库加 IF EXISTS 避免报错中断 DROP DATABASE IF EXISTS test; -- 清掉 mysql.db 里 test 相关的库级授权否则授权表里还留着口子 DELETE FROM mysql.db WHERE Db IN (test, test\_%); -- 看清 root 到底有几条记录localhost / 127.0.0.1 / ::1 往往同时存在 SELECT user, host FROM mysql.user WHERE user root; -- 5.7逐条改名漏一条就等于没改 UPDATE mysql.user SET user SuperRoot WHERE user root; FLUSH PRIVILEGES;mysql.user表的主键是(user, host)组合rootlocalhost和root127.0.0.1是两条独立记录。只改一条另一个 host 上的 root 照样能登评分脚本一查SELECT user FROM mysql.user WHERE userroot还有结果直接判失败。更稳的写法是用RENAME USER它会同时处理授权表联动RENAME USER rootlocalhost TO SuperRootlocalhost; RENAME USER root127.0.0.1 TO SuperRoot127.0.0.1; FLUSH PRIVILEGES;MySQL 8.0 起不能直接UPDATE mysql.user会报The MySQL server is running with the --skip-grant-tables option或权限表只读类错误必须走RENAME USER或ALTER USER ... RENAME TO。改完名先别关当前会话新开一个窗口用SuperRoot登录验证成功了再退——这是所有改认证信息的通用后悔药。3.3 密码加密与最小权限md5() 为什么不能用题面写的是Update user set passwordmd5(password) where useruser1;这行是伪代码照抄会得到一个登不进去的账户。原因在于 MySQL 的认证串不是“密码的 MD5”而是插件生成的特定格式哈希MD5()函数把哈希再哈希一次存进authentication_string认证时对不上。-- 5.7 正确写法PASSWORD() 生成 mysql_native_password 格式的认证串 UPDATE mysql.user SET authentication_string PASSWORD(Pssw0rd1!) WHERE user user1 AND host localhost; FLUSH PRIVILEGES; -- 8.0 正确写法直接 ALTER USER默认插件即可 ALTER USER user1localhost IDENTIFIED BY Pssw0rd1!; -- 兼容老客户端如 5.x 的 mysql 命令行时显式指定插件 ALTER USER user1localhost IDENTIFIED WITH mysql_native_password BY Pssw0rd1!;PASSWORD()在 5.7 里返回 41 位带*前缀的哈希8.0 已移除该函数所以版本判断必须先做SELECT VERSION();。改完用mysql -uuser1 -pPssw0rd1!实登一次能进才算数。另一个坑是user表里user1可能不存在UPDATE影响 0 行且不报错先SELECT确认或者用CREATE USER IF NOT EXISTS兜底。最小权限这条GRANT之前要保证库和用户都存在CREATE DATABASE IF NOT EXISTS testdb; CREATE USER IF NOT EXISTS user1localhost IDENTIFIED BY Pssw0rd1!; -- 先收回多余权限再授予四条 REVOKE ALL PRIVILEGES, GRANT OPTION FROM user1localhost; GRANT SELECT, INSERT, UPDATE, DELETE ON testdb.* TO user1localhost; FLUSH PRIVILEGES; -- 复核应只看到 USAGE 加四条 DML SHOW GRANTS FOR user1localhost;USAGE是“无权限”的占位符看到它别慌。REVOKE ALL要先执行否则用户可能带着历史授权SHOW GRANTS一看就露馅。库级授权testdb.*要求库已存在MySQL 8 在不存在的库上GRANT会直接报Unknown database所以CREATE DATABASE不能省。3.4 SSH 与 VSFTPD端口、root 登录、匿名上传和超时单位SSH 两条改完必须做语法检查否则一个缩进错误就能让 sshd 起不来# 端口 2222 禁止 root 远程登录 sed -i s|^#\?Port .*|Port 2222| /etc/ssh/sshd_config sed -i s|^#\?PermitRootLogin.*|PermitRootLogin no| /etc/ssh/sshd_config # 语法检查通过再重启 sshd -t systemctl restart sshd # 防火墙与 SELinux 两处都要放行否则新端口连不上 firewall-cmd --permanent --add-port2222/tcp firewall-cmd --reload semanage port -a -t ssh_port_t -p tcp 2222 2/dev/null || \ semanage port -m -t ssh_port_t -p tcp 2222Port指令写多个就是监听多个端口题面要求“改为 2222”就把 22 那行注释掉或替换掉别留两个。RHEL 系上 SELinux 默认只放行 22改端口不放行ssh_port_t的话sshd 起来了但连接被拒ss -lntp | grep 2222能看到监听、curl却连不上这个现象很容易误判成防火墙问题。PermitRootLogin no改完root 用密钥也登不进验证时用普通用户测别拿 root 反复试把自己锁外面。VSFTPD 两条# /etc/vsftpd/vsftpd.conf anonymous_enableNO local_enableYES # 主动模式连接超时秒 connect_timeout60 # 被动模式 accept 超时秒 accept_timeout60 # 数据连接无数据超时秒 data_connection_timeout300 # 无命令操作超时秒5 分钟 300 idle_session_timeout300题面要求“无任何操作的超时时间为 5 分钟”落点是idle_session_timeout单位秒写 300。原始材料里给的 600 是 10 分钟和题面要求对不上以 300 为准。connect_timeout和accept_timeout管的是数据连接的建立阶段不是空闲阶段别混用。anonymous_enableNO之后如果还留着anon_upload_enableYESvsftpd 启动会告警但能跑匿名登录被拒、上传自然也不通验证时用ftp 127.0.0.1试anonymous登录返回530 Permission denied就对了。3.5 IIS日志字段裁剪与并发连接数上限IIS 日志要求 W3C 格式且只记录日期、时间、客户端 IP、用户名、方法五个字段在“网站 → 日志 → 选择字段”里操作对应字段名是date、time、c-ip、cs-username、cs-method其余全部取消勾选。# 导入 WebAdministration 模块后按站点配置 Import-Module WebAdministration # 日志格式设为 W3C Set-ItemProperty IIS:\Sites\Default Web Site -Name logFile.logFormat -Value W3C # 只保留五个字段 Set-ItemProperty IIS:\Sites\Default Web Site -Name logFile.logExtFileFlags -Value Date,Time,ClientIP,UserName,Method # 最大并发连接数 1000 Set-ItemProperty IIS:\Sites\Default Web Site -Name limits.maxConnections -Value 1000logExtFileFlags是逗号分隔的枚举字符串字段名大小写不敏感但拼错会静默忽略配完Get-ItemProperty回读一次。maxConnections的默认值是 4294967295几乎不限设 1000 后会限制同时处理的请求数超出部分排队或拒绝赛题环境里这是“减轻负载”的意思生产上要配合队列长度一起评估别单改这一个值。日志字段裁剪要注意去掉cs-uri-stem之后就没法做 URL 级分析了赛题要求是“只记录”照做即可真实环境里我会保留cs-uri-stem和sc-status。4. 边界与取证面HTTPS 强制跳转、审核策略、防火墙与三条取证链路A 模块剩下的是边界类配置B 模块整段是取证与应急响应。这两块在题里是分开的但实操时经常串起来先靠防火墙和日志把攻击面收窄出事后再靠内存和流量还原现场。这一章按“先把门关好再学怎么查”的顺序写HTTPS 跳转、审核策略、防火墙三节属于前者内存取证、流量分析、MSF 三节属于后者。4.1 IIS URL 重写把 80 的流量 301 到 443强制 HTTPS 有两个前提证书已绑定 443、80 站点还在监听。然后在站点根目录的web.config里加规则或者用 IIS 管理器的“URL 重写”图形界面配置。configuration system.webServer rewrite rules rule nameForce HTTPS stopProcessingtrue match url(.*) / conditions add input{HTTPS} pattern^OFF$ / /conditions action typeRedirect urlhttps://{HTTP_HOST}/{R:1} redirectTypePermanent / /rule /rules /rewrite /system.webServer /configurationmatch url(.*)捕获全部路径{R:1}在重定向目标里回填保证深链接不丢。{HTTPS}变量值为ON或OFF条件写成^OFF$才触发写成ON就是死循环——浏览器报ERR_TOO_MANY_REDIRECTS基本都是这个原因。redirectTypePermanent是 301浏览器会缓存调试阶段建议先写Found302确认无误再改 301否则清缓存能烦死人。{HTTP_HOST}会带上请求的 Host 头如果站点只绑了www前缀用{HTTP_HOST}可能跳到未绑定域名稳妥写法是硬编码目标域名。前置条件容易被忽略URL Rewrite 模块不是 IIS 默认组件得单独装站点必须同时有 80 和 443 绑定证书的 CN 要和访问域名一致题面里证书颁发给某个测试域名并通过带www的地址访问说明证书得包含 SAN 或者用通配符否则浏览器照样告警。验证时用curl -I http://站点看返回码是不是 301 且Location指向 https再curl -kI https://站点看 200。4.2 审核策略四条子类别和 auditpol 的本地化坑题面要求开启登录事件成功/失败、特权使用成功、策略更改成功/失败、进程跟踪成功/失败。图形路径是“本地安全策略 → 本地策略 → 审核策略”命令行用auditpol# 先看本机子类别的本地化名称中文系统里是“登录”不是“Logon” auditpol /list /subcategory:* /category:登录/注销 # 按子类别逐条开启 auditpol /set /subcategory:登录 /success:enable /failure:enable auditpol /set /subcategory:特权使用 /success:enable /failure:disable auditpol /set /subcategory:审核策略更改 /success:enable /failure:enable auditpol /set /subcategory:进程跟踪 /success:enable /failure:enable # 复核全部子类别状态 auditpol /get /category:*中文版 Windows 的auditpol子类别名是本地化的直接抄英文Logon会返回“参数错误 0x57”这是最高频的坑。先auditpol /list /subcategory:*把名字打出来再粘贴。第二个坑是“审核策略”和“高级审核策略”两套机制并存域环境里组策略的“高级审核策略配置”优先级高于本地“审核策略”本地改完gpupdate一跑就被覆盖auditpol /get看到的是最终生效值以它为准。第三个坑是进程跟踪开启后事件量巨大系统盘小的话几天就写满赛题环境无所谓真实机器上要配合日志大小和滚动策略。4.3 防火墙与 iptables445/23 封堵、禁 ping 和一条 ssh 白名单Windows 侧封 445 和 23用高级安全防火墙建两条入站阻止规则New-NetFirewallRule -DisplayName Block-TCP-445 -Direction Inbound -Protocol TCP -LocalPort 445 -Action Block New-NetFirewallRule -DisplayName Block-TCP-23 -Direction Inbound -Protocol TCP -LocalPort 23 -Action Block # 复核 Get-NetFirewallRule -DisplayName Block-TCP-* | Select-Object DisplayName, Enabled, Direction, Action-Direction Inbound只挡进来的流量出站不受影响如果写成Outbound本机访问别人的共享反而断了。445 是 SMB封了之后本机作为文件服务器对外提供共享也会失效赛题环境是 Web 服务器所以无所谓真实环境要先确认角色。Linux 侧四条# 封 23 iptables -A INPUT -p tcp --dport 23 -j DROP # 禁 ping1 才是禁止0 是允许 echo 1 /proc/sys/net/ipv4/icmp_echo_ignore_all # 永久生效 echo net.ipv4.icmp_echo_ignore_all1 /etc/sysctl.conf sysctl -p # 只允许指定源访问 22其余拒绝ACCEPT 必须排在 DROP 前面 iptables -A INPUT -s 172.16.1.1 -p tcp --dport 22 -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j DROPicmp_echo_ignore_all的取值语义是反的0表示响应 ping1表示忽略。原始材料里临时方法写echo 0实际是放开而不是禁止这条要特别留意。禁 ping 只挡 ICMP type 8echo request路径 MTU 发现用的 type 3 和超时用的 type 11 仍然要放行全禁 ICMP 会导致大包传输玄学故障。iptables规则默认追加到链尾如果前面已有-j ACCEPT的兜底规则你加的 DROP 永远不生效用iptables -L INPUT -n --line-numbers看序号必要时-I INPUT 1插到最前。规则改完必须持久化否则重启就没了# RHEL 系 service iptables save # 或 iptables-save /etc/sysconfig/iptables # Debian 系 netfilter-persistent save限制 22 端口那条最容易把自己踢下线。改之前先确认自己当前的源 IP 是不是白名单里那个不是的话先加临时放行或者用at挂一个 5 分钟后iptables-restore的后悔药任务# 5 分钟后自动还原先备份 iptables-save /tmp/iptables.bak echo iptables-restore /tmp/iptables.bak | at now 5 minutes4.4 内存取证hashdump、netscan、svcscan 的取数顺序B 模块的内存取证题给了五个问题我一般按“先定 profile再按问题找插件”的顺序做避免反复重跑镜像。# 1. 识别镜像类型拿到 profile volatility -f server1.raw imageinfo # 2. 提取用户 hash再离线破解 6 位密码 volatility -f server1.raw --profileWin7SP1x64 hashdump # 3. 当前网络连接与主机名 volatility -f server1.raw --profileWin7SP1x64 netscan volatility -f server1.raw --profileWin7SP1x64 printkey \ -K ControlSet001\Control\ComputerName\ComputerName # 4. 浏览器搜索关键词 volatility -f server1.raw p a hrefhttps://download.csdn.net/download/hesysd/19087688 stylecolor:#ec7500;font-size:14px; 本文还有配套的精品资源点击获取 /a img altmenu-r.4af5f7ec.gif srchttps://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif stylewidth:16px;margin-left:4px;vertical-align:text-bottom;cursor:text; /p