前置知识
Apache
Apache HTTP server,a free open-souce web server software.
核心概念和特点
- HTTP 协议处理:旨在有效处理 HTTP 请求响应,支持 HTTP/1.1 并具有可用于 HTTP/2 的模块
- 模块化:apache 主要优势之一是其模块化架构。功能可以通过模块进行扩展,定制化轻量服务器
- 虚拟主机:支持基于 IP 和基于名称的虚拟主机,允许单个服务器托管多个网站
- 安全功能:包括对 SSL/TLS 加密,身份验证机制和访问控制的支持
- configure:使用纯文本配置文件,主要是
httpd.conf
进行服务器设置,使用.htaccess
进行目录级配置
模块
mod_auth_basic
,mod_auth_digest
:身份验证和授权模块,控制对资源的访问mod_ssl
:启用加密连接的 SSL/TLS 支持。mod_proxy
:提供正向和反向代理功能。mod_rewrite
:允许灵活的 URL 操作和重定向。mod_deflate
:在将内容发送到客户端之前对其进行压缩以节省带宽。mod_cache
、mod_cache_disk
、mod_cache_socache
:通过缓存经常访问的内容来提高性能。
配置 apache HTTP server
目录结构
- 主配置文件:
/etc/apache2/apache2.conf
- 默认站点配置:
/etc/apache2/sites-available/000-default.conf
- 模块目录:
/etc/apache2/mods-available/
和/etc/apache2/mods-enabled/
- 文档根目录:
/var/www/html/
- 主配置文件:
启用模块
sudo a2enmod module_name
sudo systemctl restart apache2
Virtual Hosts
创建一个新的配置文件:
/etc/apache2/sites-available/psych.green.conf
1
2
3
4
5
6
7
8
9
10
11
12
13<VirtualHost *:80>
ServerName psych.green
DocumentRoot /var/www/psych.green/public_html
<Directory /var/www/psych.green/public_html>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/psych.green_error.log
CustomLog ${APACHE_LOG_DIR}/psych.green_access.log combined
</VirtualHost>使用 FastCGI(一种允许 Web 服务器与外部应用程序(如 PHP 脚本)交互以生成动态内容的协议)和PHP-FPM(进程管理器,管理 PHP 进程并允许 Apache 通过 FastCGI 与 PHP 脚本进行通信)
1
2
3
4
5
6
7
8
9
10<VirtualHost *:80>
ServerName psych.green
DocumentRoot /var/www/psych.green/
<FilesMatch \\.php$>
SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost/"
</FilesMatch>
# Other configurations
</VirtualHost>.htccess
—— 提供目录级配置覆盖。- URL 重写(使用
mod_rewrite
) - 访问控制
在 Apache 中启用
.htaccess
1
2
3<Directory /var/www/psych.green/public_html>
AllowOverride All
</Directory>- URL 重写(使用
实验一 - TLS 配置与流量分析
实验内容
- 配置 TLS 协议分析环境
- 配置 apache 服务器的 https 协议
- 对指定域名发起 HTTPS 请求,抓包分析 TLS 协议流程、提取其中的关键信息
实验原理
TLS 协议
网络安全协议概览
TLS协议主要用于网络通信中的数据加密、完整性验证和身份认证,通常应用于HTTPS、电子邮件、即时通讯等需要保护数据安全的场景。TLS主要由三部分组成:记录协议、握手协议、警报协议。
主要概念:
加密算法
包括对称加密(如AES)、非对称加密(如RSA)和哈希函数(如SHA-256)。对称加密用于数据加密,非对称加密用于身份认证和密钥交换,哈希函数用于数据完整性验证。
数字证书
数字证书包含服务器的公钥及身份信息,由受信任的CA(证书颁发机构)签发。客户端通过验证服务器证书来确定服务器的真实性。
密钥交换
TLS1.3之前通常使用 RSA 和 Diffie-Hellman 算法。TLS1.3 采用了更高效的密钥交换算法如 ECDHE(椭圆曲线Diffie-Hellman)。
OpenSSL
一个强大的开源工具包,支持 TLS 和 SSL 协议的实现及加密功能,包括加密、解密、数字证书的生成和管理。它广泛应用于网络服务器(如Nginx、Apache)和客户端程序,用于保护数据的传输安全。
Diffie-Hellman(DH)
Diffie-Hellman 密钥交换
:
- DH 是一种加密协议,允许双方在公开信道上安全地生成共享密钥。这个密钥可以用于后续的加密通信。
安全性
:
- DH 协议的安全性基于离散对数问题的困难性,使得即使攻击者能够监听通信,也无法轻易推算出共享密钥。
- 在 TLS 配置中使用 DH 参数可以增强服务器的安全性,特别是在使用前向保密(Perfect Forward Secrecy, PFS)时。
支持多种加密套件
:
- 一些 TLS 加密套件依赖于 DH 参数来进行密钥交换,因此生成这些参数是安全配置的一部分。
实验内容
环境配置
基本信息
- 主机:windows,安装 wireshark 抓包
- 虚拟机:Ubuntu,与主机网络连通
Ubuntu 配置 apache 服务器的 HTTPS
创建证书,密钥等
创建一个强的 DH 群以增强服务安全性:
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
安装 apache
创建 apache 配置文件,并进行强加密设置
- 在 /etc/apache2/conf-available 下创建 ssl-params.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19# from <https://cipherli.st/>
# and <https://raymii.org/s/tutorials/Strong_SSL_Security_On_Apache2.html>
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLProtocol All -SSLv2 -SSLv3
SSLHonorCipherOrder On
# Disable preloading HSTS for now. You can use the commented out header line that includes
# the "preload" directive if you understand the implications.
# Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
# Requires Apache >= 2.4
SSLCompression off
SSLSessionTickets Off
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
SSLOpenSSLConfCmd DHParameters "/etc/ssl/certs/dhparam.pem"修改默认的 Apache SSL 虚拟主机文件
/etc/apache2/sites-available/default-ssl.conf
包括 Email & Domain、SSLCertificateFile、BrowserMatch为了更好的安全性,通常也推荐设置为自动重定向 http 访问到 https 访问:修改配置文件
/etc/apache2/sites-available/000-default.conf
加入一个 Redirect 指令来指向 SSL 版本的站点1
2
3
4
5<VirtualHost *:80>
. . .
Redirect "/" "https://your_domain_or_IP/"
. . .
</VirtualHost>使模块 mod_ssl、mod_headers(配置文件中某些设置需要)生效:
sudo a2enmod ssl; sudo a2enmod headers
使 SSL 虚拟主机生效:
sudo a2ensite default-ssl
使 ssl-params.conf 生效:
sudo a2enconf ssl-params
检查:
sudo apache2ctl configtest
重启:
sudo systemctl restart apache2
TLS 流量分析
主机打开 wireshark,设置过滤器为 ssl (仅对 TLS 协议数据分析)。
注意这里的坑是:加了代理之后主机设置了 hosts 也没办法正确重定向到局域网ip,需要关闭代理。。。
设置过滤器为 ssl
按照TLS协议的流程,捕获的消息包含如下内容:
ClientHello
客户端向服务器发送
ClientHello
消息,包括TLS版本、支持的加密套件、随机数以及支持的扩展列表。它是 TLS 握手的起始点。ServerHello
服务器回应
ClientHello
,选择一个加密套件并确认TLS版本。同时,服务器发送自己的随机数和扩展列表,确定接下来的通信参数。ChangeCipherSpec
服务器和客户端会分别发送
ChangeCipherSpec
消息,通知对方接下来的通信内容将使用协商的加密算法和密钥进行加密。Application Data应用数据
握手完成后,服务器和客户端可以开始发送加密的应用数据。这些数据通过对称加密加密,因此无法直接查看内容。