本文是全国技能大赛网络安全赛项关于 APP 服务器的配置,基于 CentOS 9 系统,核心围绕网站域名的 Web 服务部署、CA 证书申请与认证、LDAP 权限控制及系统安全加固展开。该服务器作为域内 Web 服务节点,承接所有对域名的访问请求,并通过https 加密、LDAP 身份认证及安全规则防护,保障服务稳定性与安全性。
- 实现目标:实现https 加密访问、域用户 LDAP 认证授权、Web 安全防护(防目录穿越 / 文件包含)、DNS 解析。
一、前置准备与环境检查
1.1 基础环境要求
| 检查项 | 要求 |
| 操作系统版本 | CentOS 9 |
| 域环境依赖 | 已加入示例网站域,DC 服务器(10.0.8.1)可访问 |
| 静态 IP 配置 | 已固定(示例:10.0.8.3) |
| 管理员权限 | 拥有 root 账户或 sudo 权限 |
| 依赖工具预装 | OpenSSL 已安装 |
| CA 环境 | 中间 CA/DC CA 已部署,支持证书申请 |
| 复现平台 |
1.2 工具与资源准备
- 域管理员账户:SKILLS\Administrator及密码(用于证书申请与 LDAP 认证)
- 证书相关:后续生成的密钥、证书请求需妥善保存
- 配置文件模板:HTTPD 虚拟主机配置文件、ModSecurity 规则文件(将手动创建)
- 测试账户:域内WEB组用户(如 ldap@skills.cn,用于 LDAP 认证测试)
二、证书申请与 CA 认证(向 DC 服务器申请)
2.1 生成证书密钥与请求文件
实现目的:创建服务器端 RSA 密钥(用于https 加密)和证书请求文件(CSR),CSR 将提交至 DC 的 AD CS 服务申请签名认证。
- 终端切换至 root 用户:
- 生成 2048 位 RSA 密钥与 CSR 文件(-nodes表示不加密密钥,便于服务自动加载):
| [root@localhost ~]# openssl req -new -newkey rsa:2048 -nodes -keyout www.skills.cn.key -out www.skills.cn.csr |
- 按提示填写证书主体信息(需与域环境一致):
| Country Name (2 letter code) [XX]:CN # 国家代码 State or Province Name []:Chongqing # 省/州(与DC/CA一致) Locality Name []:Chongqing # 城市(与DC/CA一致) Organization Name []:DubheLjsec # 组织名称(与DC/CA一致) Organizational Unit Name []:IT # 部门名称 Common Name []:(示例网站名) # 核心:必须与域名一致 Email Address []: # 可选,留空 A challenge password []:dubhe # 验证密码(需牢记) An optional company name []:dubhe # 可选,与组织名一致 |
- 验证文件生成:
| [root@localhost ~]# ls -l (示例网站名).* # 显示(示例网站名).key(密钥)和(示例网站名).csr(请求文件)即为成功 |
2.2 提交 CSR 至 DC 服务器认证
实现目的:通过 DC 的 AD CS Web 服务,将 CSR 文件提交给 CA 签名,获取合法的服务器证书。
- 传输 CSR 文件:
- 由于 APP 服务器为无图形化 Linux,所以不好访问dc服务器的认证页面,我们将csr文件发送到任意一个可以访问到dc服务器的地方然后操作。
- 客户端浏览器访问 DC 的证书注册页面:

输入域管理员账户(SKILLS\Administrator)和密码登录。
- 提交证书请求:
- 点击「Request a certificate」→ 选择「advanced certificate request」
- 打开拷贝的(示例网站名).csr文件,复制全部内容(含-----BEGIN CERTIFICATE REQUEST-----和-----END CERTIFICATE REQUEST-----)
- 粘贴至「Base-64-encoded certificate request」输入框
- 「Certificate Template」选择「Web Server」(之前在 DC 配置的模板)→ 点击「Submit」


选择webserver并将csr内容复制进入


2.3 转换证书格式并传输至 APP 服务器
实现目的:将 DC 颁发的 DER 格式证书转换为 PEM 格式,并传输回 APP 服务器。
- 转换证书格式(DER→PEM):
| [root@localhost ~]# openssl x509 -inform der -in certnew.cer -out www.skills.cn.crt.pem |
- 验证转换后的证书:
| [root@localhost ~]# openssl x509 -in www.skills.cn.crt.pem -noout -subject # 输出包含“CN=(示例网站名)”即为正常 |
三、httpd 服务部署与配置
3.1 安装httpd 及依赖模块服务
实现目的:安装 Apachehttpd 服务及所需模块(SSL 加密、LDAP 认证、安全防护),为 Web 服务提供基础环境。
- 安装相关包:
| [root@localhost ~]# dnf install httpd mod_ldap mod_ssl mod_security -y |
- 验证安装:
| [root@localhost ~]#httpd -v # 显示httpd 版本(如2.4.53)即为成功 |
3.2 部署证书与密钥
实现目的:将证书和密钥统一存储至httpd 指定目录,便于管理并保障权限安全。
- 创建证书存储目录,复制证书和密钥至该目录,并设置严格权限:
| [root@localhosthttpd]# mkdir pki [root@localhosthttpd]# cp ~/(示例网站名). www.skills.cn.crt.pem (示例网站名).csr (示例网站名).key [root@localhosthttpd]# cp ~/(示例网站名).key pki/ [root@localhosthttpd]# cp ~/www.skills.cn.c www.skills.cn.crt.pem (示例网站名).csr [root@localhosthttpd]# cp ~/(示例网站名).crt.pem pki/ [root@localhosthttpd]# pwd /etc/httpd [root@localhosthttpd]# |
3.3 配置httpd 虚拟主机(https+LDAP 认证)
实现目的:配置(示例网站名)的虚拟主机,实现 HTTP 自动跳转https、SSL 加密、LDAP 权限控制及安全防护。
- 创建虚拟主机配置文件:
在/etc/httpd/conf.d目录下添加一个服务的配置文件,内容如下:
此处配置了无法直接访问目录和访问auth目录需要ldap权限
| [root@localhost conf.d]# cat (示例网站名).conf # ServerName www.skills.cn <VirtualHost *:80> ServerName www.skills.cn Redirect permanent / https://(示例网站名)/ </VirtualHost> <VirtualHost *:443> ServerName (示例网站名) SSLEngine on SSLCertificateFile /etc/httpd/pki/(示例网站名).cert.pem SSLCertificateKeyFile /etc/httpd/pki/(示例网站名).key # 添加SSL协议和密码套件配置 SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1 SSLCipherSuite HIGH:!aNULL:!MD5 SSLHonorCipherOrder off DocumentRoot /var/www/html # 禁止目录浏览 <Directory "/var/www/html"> Options -Indexes AllowOverride None Require all granted </Directory> # LDAP Basic Auth - 使用Directory替代Location <Directory "/var/www/html/auth"> AuthType Basic AuthName "Restricted Content - LDAP Authentication Required" # 生产环境建议降低日志级别 LogLevel warn AuthBasicProvider ldap # 更精确的LDAP查询 AuthLDAPURL "ldap://dc.skills.cn:389/DC=skills,DC=cn?sAMAccountName?sub?(objectClass=user)" AuthLDAPBindDN "CN=Administrator,CN=Users,DC=skills,DC=cn" AuthLDAPBindPassword "Skills@123" # 防止LDAP引用错误 LDAPReferrals off
# 添加LDAP超时设置 #AuthLDAPTimeout 10
# 使用authnz_ldap模块进行组验证 Require ldap-group CN=WEB,CN=Users,DC=skills,DC=cn
# 备用:如果组验证有问题,可以使用属性匹配 # Require ldap-attribute memberOf=CN=WEB,CN=Users,DC=skills,DC=cn </Directory>
# 隐藏 Apache 版本信息 ServerSignature Off # 安全头设置 Header always set X-Content-Type-Options nosniff Header always set X-Frame-Options DENY Header always set X-XSS-Protection "1; mode=block" # mod_security IncludeOptional /etc/httpd/modsecurity.d/*.conf </VirtualHost> [root@localhost conf.d]# |
3.4 配置 ModSecurity 安全规则
实现目的:
- 拒绝请求参数中包含目录穿越符号(../" 或 "..\\)的请求,返回 403 状态码。
- 拒绝请求参数中包含与文件包含相关的 PHP 函数名("include"、"require"、
在/etc/httpd/modsecurity.d文件夹下创建一个custom_rules.conf文件
| [root@localhost modsecurity.d]# cat custom_rules.conf SecRuleEngine On SecRule ARGS|REQUEST_URI|REQUEST_BODY|REQUEST_HEADERS "@rx \.\.(/|\\x5c)" \ "id:1001,phase:2,deny,status:403,msg:'Directory Traversal Attack Detected',logdata:'%{MATCHED_VAR}'" SecRule ARGS|REQUEST_URI|REQUEST_BODY|REQUEST_HEADERS "@rx (?i:(include|require)(?:_once)?)" \ "id:1002,phase:2,deny,status:403,msg:'Potential PHP File Inclusion Attack Detected',logdata:'%{MATCHED_VAR}'" |
3.5 启动httpd 服务并设置自启
- 启动httpd 服务:
| [root@localhost conf.d]# systemctl start httpd |
- 设置开机自启(避免服务器重启后服务中断):
| [root@localhost conf.d]# systemctl status httpd |
- 验证服务状态:
| [root@localhost conf.d]## systemctl status httpd # 显示“Active: active (running)”即为正常 |
四、DNS 解析配置
4.1 pfSense DNS 域覆盖配置
操作目的:让域内客户端访问skills.cn域名时,自动指向 DC 服务器(10.0.8.1)解析,确保(示例网站名)能正确解析到 APP 服务器 IP。
- 登录 pfSense 管理界面:
- 访问地址:https://10.0.8.254(pfSense 的 IP)


- 配置项:
-
- Domain:(示例网站名)
- IP Address:10.0.8.1
-

4.2 DC 服务器 DNS 配置
实现目的:dc域控服务器内添加对(示例网站名)的解析。
登录 DC 服务器(Windows Server 2022):
-
- 打开「Server Manager → Tools → DNS」。

添加 A 记录:
-
- 展开DC → 【Forward Lookup Zones】 → 【(示例网站名)】
- 右键【(示例网站名)】→ 【New Host (A or AAAA)...】


五、系统安全加固配置
5.1 防火墙端口放行
操作目的:开放 HTTP(80 端口)和https(443 端口),允许外部客户端访问 Web 服务,同时拒绝其他不必要端口。
- 开放 HTTP/HTTPS 服务:
| [root@localhost conf.d]# firewall-cmd --permanent --add-service=http [root@localhost conf.d]# firewall-cmd --permanent --add-service=https |
- 重新加载防火墙规则(即时生效):
| [root@localhost ~]# firewall-cmd --reload |
- 验证端口开放:
| [root@localhost ~]# firewall-cmd --list-services # 输出包含“http https ssh”即为正常(ssh用于远程管理) |
5.2 启用 selinux(强制模式)
实现目的:selinux 是 Linux 内核安全机制,强制模式下可防止未授权进程访问敏感文件,提升系统安全性。
- 修改 selinux 配置文件:
| [root@localhost ~]# vi /etc/selinux/config |
- 修改selinux 参数:
| selinux =enforcing # 改为强制模式 |
5.3 密码安全规则配置
实现目的:强化本地用户密码策略,防止弱密码攻击,要求密码复杂度、有效期及超时锁定。
- 修改密码有效期配置(/etc/login.defs):
| [root@localhost ~]# vi /etc/login.defs |
- 修改以下参数:
| PASS_MAX_DAYS 10 # 密码最长使用10天 PASS_WARN_AGE 0 # 密码过期后立即锁定(无警告期) |
- 配置密码复杂度(/etc/security/pwquality.conf):
| [root@localhost ~]# vi /etc/security/pwquality.conf |
- 添加 / 修改以下配置:
| minlen = 8 # 密码最小长度8位 dcredit = -1 # 至少包含1个数字 ucredit = -1 # 至少包含1个大写字母 lcredit = -1 # 至少包含1个小写字母 ocredit = -1 # 至少包含1个特殊字符(如!@#$%) |
- 验证密码规则:
| [root@localhost ~]# passwd testuser # 创建测试用户 # 若输入弱密码(如12345678),会提示“密码不符合复杂度要求”即为正常 |
六、全流程验证
6.1https 访问验证
客户端浏览器访问:
- 浏览器地址栏显示 “小锁” 图标(无证书警告)→ 证书验证成功访
- https://示例网站/auth→ 弹出登录框→ 输入 WEB 组用户(如 ldap@skills.cn)和密码→ 能正常访问→ LDAP 认证成功
6.2 安全规则验证
测试目录穿越攻击:
- 访问https://示例网站/../etc/passwd→ 返回 403 Forbidden→ 规则生效
测试文件包含攻击:
- 访问https://示例网站/?file=include(/etc/passwd)→ 返回 403 Forbidden→ 规则生效
6.3 DNS 解析验证
客户端执行:ping 示例网站→ 解析到 10.0.1.1→ 解析成功

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



