本文是全国技能大赛网络安全赛项关于 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 的证书注册页面:http://10.0.8.1/certsrv
输入域管理员账户(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 ~]# 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/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→ 解析成功