第三届全国技能大赛网络安全(模块A)复现与练习(七)— 域内Web服务器的创建和证书申请流程

28 阅读8分钟

本文是全国技能大赛网络安全赛项关于 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

image.png 输入域管理员账户(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」

image.png

image.png

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

image.png

image.png

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。

image.png

image.png

  • 配置项:

    • Domain:(示例网站名)
    • IP Address:10.0.8.1

image.png

4.2 DC 服务器 DNS 配置

实现目的:dc域控服务器内添加对(示例网站名)的解析。

登录 DC 服务器(Windows Server 2022):

  • 打开「Server Manager → Tools → DNS」。

image.png 添加 A 记录:

  • 展开DC → 【Forward Lookup Zones】 → 【(示例网站名)】
  • 右键【(示例网站名)】→ 【New Host (A or AAAA)...】

image.png

image.png

五、系统安全加固配置

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 安全规则验证

测试目录穿越攻击:

6.3 DNS 解析验证

客户端执行:ping 示例网站→ 解析到 10.0.1.1→ 解析成功

转载于:第三届全国技能大赛网络安全(模块A)复现与练习(七)— 域内Web服务器的创建和证书申请流程-CSDN博客