在网络安全学习中,搭建靶机环境是进行渗透测试和防御技术研究的重要环节。本教程将详细介绍如何在Linux系统(如Kali、Debian、Ubuntu等)上配置一个基于Apache的靶机网站,支持HTTP/HTTPS、虚拟主机、SSL自签名证书、本地域名解析、权限控制及多个子域名站点配置。
前置条件
- 操作系统:Linux发行版(如Kali Linux、Ubuntu 20.04+、Debian 11+)
- 权限要求:具有root或sudo权限
- 网络环境:本地或虚拟机环境,推荐使用VirtualBox/VMware
- 工具:终端、文本编辑器(如nano/vim)、curl、浏览器
- 基础知识:熟悉Linux基本命令、Apache配置和网络概念
一、安装和配置Apache服务
1.1 安装Apache2
首先确保系统软件包是最新的,然后安装Apache2 Web服务器。
sudo apt update
sudo apt install apache2 -y
安装完成后,Apache会自动启动。可以通过以下命令检查服务状态:
sudo systemctl status apache2
若未运行,可手动启动:
sudo systemctl start apache2
1.2 创建站点目录和测试页面
为靶机网站创建一个独立的目录,并添加一个简单的测试页面。
sudo mkdir -p /var/www/test.lab
echo "<h1>Welcome to test.lab</h1>" | sudo tee /var/www/test.lab/index.html
设置正确的目录权限,确保Apache进程(默认用户为www-data
)有访问权限:
sudo chown -R www-data:www-data /var/www/test.lab
sudo chmod -R 755 /var/www/test.lab
二、配置Apache虚拟主机(HTTP)
2.1 创建虚拟主机配置文件
为靶机网站配置一个虚拟主机,域名设置为test.lab
。
sudo nano /etc/apache2/sites-available/test.lab.conf
添加以下内容:
<VirtualHost *:80>
ServerAdmin webmaster@test.lab
ServerName test.lab
DocumentRoot /var/www/test.lab
<Directory /var/www/test.lab>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/test.lab_error.log
CustomLog ${APACHE_LOG_DIR}/test.lab_access.log combined
</VirtualHost>
- ServerName:定义主域名
- DocumentRoot:指定网站根目录
- AllowOverride All:允许
.htaccess
覆盖配置 - ErrorLog/CustomLog:记录错误和访问日志
2.2 启用虚拟主机
启用刚创建的虚拟主机配置,并重新加载Apache服务:
sudo a2ensite test.lab.conf
sudo systemctl reload apache2
2.3 配置本地域名解析
为了在本地访问test.lab
,需要编辑/etc/hosts
文件进行域名解析。
sudo nano /etc/hosts
添加以下内容:
127.0.0.1 test.lab
注意:如果靶机运行在虚拟机或远程设备上,将
127.0.0.1
替换为靶机的实际IP地址(如192.168.1.50
)。
2.4 验证HTTP配置
使用浏览器访问http://test.lab
,或在终端运行:
curl http://test.lab
预期输出:
<h1>Welcome to test.lab</h1>
若无法访问,检查以下内容:
- Apache服务是否运行:
sudo systemctl status apache2
- 防火墙是否阻止80端口:
sudo ufw status
/etc/hosts
配置是否正确
三、配置HTTPS和自签名SSL证书
为靶机网站启用HTTPS,增强安全性并模拟真实生产环境。
3.1 启用Apache SSL模块
sudo a2enmod ssl
sudo systemctl restart apache2
3.2 生成自签名SSL证书
创建证书存储目录并生成自签名证书,有效期365天。
sudo mkdir -p /etc/ssl/test.lab
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/ssl/test.lab/test.lab.key \
-out /etc/ssl/test.lab/test.lab.crt \
-subj "/C=CN/ST=Shanghai/L=Shanghai/O=Test Lab/CN=test.lab"
3.3 创建HTTPS虚拟主机
新建HTTPS虚拟主机配置文件:
sudo nano /etc/apache2/sites-available/test.lab-ssl.conf
添加以下内容:
<VirtualHost *:443>
ServerAdmin webmaster@test.lab
ServerName test.lab
DocumentRoot /var/www/test.lab
SSLEngine on
SSLCertificateFile /etc/ssl/test.lab/test.lab.crt
SSLCertificateKeyFile /etc/ssl/test.lab/test.lab.key
<Directory /var/www/test.lab>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/test.lab_ssl_error.log
CustomLog ${APACHE_LOG_DIR}/test.lab_ssl_access.log combined
</VirtualHost>
启用HTTPS站点并重启Apache:
sudo a2ensite test.lab-ssl.conf
sudo systemctl reload apache2
3.4 配置HTTP到HTTPS自动重定向
编辑HTTP虚拟主机配置文件,将所有HTTP请求重定向到HTTPS:
sudo nano /etc/apache2/sites-available/test.lab.conf
修改为以下内容:
<VirtualHost *:80>
ServerName test.lab
Redirect permanent / https://test.lab/
</VirtualHost>
重新加载配置:
sudo systemctl reload apache2
3.5 验证HTTPS配置
在浏览器访问http://test.lab
,应自动跳转到https://test.lab
,并显示欢迎页面。由于使用自签名证书,浏览器可能提示“证书不安全”,可选择信任继续访问。
使用curl验证:
curl -k https://test.lab
预期输出:
<h1>Welcome to test.lab</h1>
四、启用权限控制(.htaccess)
通过.htaccess
文件实现访问控制,模拟真实场景中的权限管理。
4.1 确保支持.htaccess
虚拟主机配置中已包含AllowOverride All
,无需额外修改。
4.2 示例:限制非本地访问
在站点目录下创建.htaccess
文件:
sudo nano /var/www/test.lab/.htaccess
添加以下内容,限制仅本地(127.0.0.1)访问:
Order Deny,Allow
Deny from all
Allow from 127.0.0.1
4.3 示例:启用基本认证
安装htpasswd
工具并创建密码文件:
sudo apt install apache2-utils
sudo htpasswd -c /etc/apache2/.htpasswd admin
按提示输入密码。接着编辑.htaccess
:
sudo nano /var/www/test.lab/.htaccess
添加以下内容:
AuthType Basic
AuthName "Restricted Area"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
启用auth_basic
模块并重新加载:
sudo a2enmod auth_basic
sudo systemctl reload apache2
访问https://test.lab
时,浏览器会提示输入用户名(admin)和密码。
五、配置多个子域名站点
为了模拟复杂的Web环境,可以为同一靶机配置多个子域名站点(如admin.test.lab
、api.test.lab
、upload.test.lab
)。以下是两种实现方式:通过ServerAlias
实现子域名共享同一站点,或为每个子域名创建独立的虚拟主机。
5.1 方法1:使用ServerAlias共享站点
编辑主站点的虚拟主机配置文件,支持多个子域名:
sudo nano /etc/apache2/sites-available/test.lab-ssl.conf
修改为以下内容,添加ServerAlias
:
<VirtualHost *:443>
ServerAdmin webmaster@test.lab
ServerName test.lab
ServerAlias www.test.lab admin.test.lab api.test.lab upload.test.lab
DocumentRoot /var/www/test.lab
SSLEngine on
SSLCertificateFile /etc/ssl/test.lab/test.lab.crt
SSLCertificateKeyFile /etc/ssl/test.lab/test.lab.key
<Directory /var/www/test.lab>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/test.lab_ssl_error.log
CustomLog ${APACHE_LOG_DIR}/test.lab_ssl_access.log combined
</VirtualHost>
更新/etc/hosts
以支持子域名解析:
sudo nano /etc/hosts
添加以下内容:
127.0.0.1 test.lab www.test.lab admin.test.lab api.test.lab upload.test.lab
重新加载Apache:
sudo systemctl reload apache2
验证:访问https://admin.test.lab
或https://api.test.lab
,应显示相同的欢迎页面。
5.2 方法2:为每个子域名创建独立虚拟主机
为每个子域名创建独立的站点目录和配置文件,以模拟不同的服务。
5.2.1 创建子域名目录和测试页面
sudo mkdir -p /var/www/admin.test.lab
sudo mkdir -p /var/www/api.test.lab
echo "<h1>Welcome to admin.test.lab</h1>" | sudo tee /var/www/admin.test.lab/index.html
echo "<h1>Welcome to api.test.lab</h1>" | sudo tee /var/www/api.test.lab/index.html
设置权限:
sudo chown -R www-data:www-data /var/www/admin.test.lab /var/www/api.test.lab
sudo chmod -R 755 /var/www/admin.test.lab /var/www/api.test.lab
5.2.2 创建子域名虚拟主机配置文件
为admin.test.lab
创建配置文件:
sudo nano /etc/apache2/sites-available/admin.test.lab-ssl.conf
添加以下内容:
<VirtualHost *:443>
ServerAdmin webmaster@admin.test.lab
ServerName admin.test.lab
DocumentRoot /var/www/admin.test.lab
SSLEngine on
SSLCertificateFile /etc/ssl/test.lab/test.lab.crt
SSLCertificateKeyFile /etc/ssl/test.lab/test.lab.key
<Directory /var/www/admin.test.lab>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/admin.test.lab_ssl_error.log
CustomLog ${APACHE_LOG_DIR}/admin.test.lab_ssl_access.log combined
</VirtualHost>
为api.test.lab
创建配置文件:
sudo nano /etc/apache2/sites-available/api.test.lab-ssl.conf
添加以下内容:
<VirtualHost *:443>
ServerAdmin webmaster@api.test.lab
ServerName api.test.lab
DocumentRoot /var/www/api.test.lab
SSLEngine on
SSLCertificateFile /etc/ssl/test.lab/test.lab.crt
SSLCertificateKeyFile /etc/ssl/test.lab/test.lab.key
<Directory /var/www/api.test.lab>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/api.test.lab_ssl_error.log
CustomLog ${APACHE_LOG_DIR}/api.test.lab_ssl_access.log combined
</VirtualHost>
5.2.3 启用子域名站点
sudo a2ensite admin.test.lab-ssl.conf
sudo a2ensite api.test.lab-ssl.conf
sudo systemctl reload apache2
5.2.4 配置子域名HTTP到HTTPS重定向
为每个子域名添加HTTP重定向配置:
sudo nano /etc/apache2/sites-available/admin.test.lab.conf
添加以下内容:
<VirtualHost *:80>
ServerName admin.test.lab
Redirect permanent / https://admin.test.lab/
</VirtualHost>
为api.test.lab
创建类似配置文件:
sudo nano /etc/apache2/sites-available/api.test.lab.conf
添加以下内容:
<VirtualHost *:80>
ServerName api.test.lab
Redirect permanent / https://api.test.lab/
</VirtualHost>
启用并重新加载:
sudo a2ensite admin.test.lab.conf
sudo a2ensite api.test.lab.conf
sudo systemctl reload apache2
5.2.5 验证子域名配置
访问以下地址:
https://admin.test.lab
:显示“Welcome to admin.test.lab”https://api.test.lab
:显示“Welcome to api.test.lab”
使用curl验证:
curl -k https://admin.test.lab
curl -k https://api.test.lab
六、常见问题与解决方法
- 无法访问网站:
- 检查Apache服务状态:
sudo systemctl status apache2
- 确认
/etc/hosts
配置正确 - 检查防火墙规则:
sudo ufw allow 80
和sudo ufw allow 443
- 检查Apache服务状态:
- 证书警告:
- 自签名证书会导致浏览器警告,可忽略或导入证书到信任列表。
- 权限错误:
- 确保目录和文件权限正确:
sudo chown -R www-data:www-data /var/www/*
- 确保目录和文件权限正确: