介绍
作为网络管理员,您可能会发现限制访问者访问网站的某些部分很有价值,无论是暂时还是永久。 虽然 Web 应用程序可能提供自己的身份验证和授权方法,但如果这些方法不充分或不可用,您也可以依靠 Web 服务器本身来限制访问。
本教程将引导您了解在 Ubuntu 20.04 上运行的 Apache Web 服务器上的密码保护资产。 这将为您的服务器提供额外的安全层。
先决条件
要完成本教程,您需要:
- 一台 Ubuntu 20.04 服务器设置有非 root 用户,具有
sudo
权限并启用了防火墙。 您可以按照 Ubuntu 20.04 初始服务器设置指南 执行此操作。 - 安装在 Ubuntu 服务器上的 Apache Web 服务器。 如果您还没有设置,如何在 Ubuntu 20.04 上安装 Apache Web 服务器教程可以指导您。 请务必完成 步骤 5 并为您的域拥有一个 虚拟主机文件 。 本教程将自始至终以 your_domain 为例,并使用
/etc/apache2/sites-available/your_domain.conf
作为虚拟主机文件。 - 使用 SSL 保护您的虚拟主机。 设置这取决于您是否有网站的域名。
- 如果您有域名,您可以使用 Let's Encrypt 保护您的网站,它提供免费、受信任的证书。 按照 Let's Encrypt guide for Apache 进行设置。
- 如果您没有域并且将此配置用于测试或个人用途,则可以改用自签名证书。 这提供了相同类型的加密,但没有域验证。 按照 Apache 的 自签名 SSL 指南进行设置。
- 如果您想设置一个域(可选),您可以通过在 Namecheap 上购买一个域名,在 Freenom 上免费获得一个,或使用您的域名注册商来实现。选择。 此外,您需要为您的服务器设置以下两个 DNS 记录。 请按照此 DigitalOcean DNS 简介了解如何添加它们的详细信息。
- 带有
your_domain
的 A 记录指向您服务器的公共 IP 地址。 - 带有
www.your_domain
的 A 记录指向您服务器的公共 IP 地址。
- 带有
完成这些先决条件后,以 sudo
用户身份登录您的服务器并继续第一步。
第 1 步 — 安装 Apache 实用程序包
让我们首先更新我们的服务器并安装我们需要的包。 为了完成本教程,我们将使用一个名为 htpasswd
的实用程序,它是 apache2-utils
软件包的一部分,用于创建文件并管理访问受限内容所需的用户名和密码。
首先,更新服务器的包索引:
sudo apt update
然后安装 Apache 实用程序包:
sudo apt install apache2-utils
安装此程序后,您现在可以访问 htpasswd
命令。
第 2 步 — 创建密码文件
htpasswd
命令允许您创建 Apache 可以用来验证用户的密码文件。 为此,您将在 /etc/apache2
配置目录中创建一个名为 .htpasswd
的隐藏文件。
首次使用此实用程序时,需要添加 -c
选项来创建指定的 passwdfile
。 在这里,我们在命令末尾指定一个用户名(在此示例中为 sammy
)以在文件中创建一个新条目:
sudo htpasswd -c /etc/apache2/.htpasswd sammy
您将被要求提供并确认用户的密码。
为您希望添加的任何其他用户省略 -c
参数,如下例所示,因此您不会覆盖文件:
sudo htpasswd /etc/apache2/.htpasswd another_user
如果您检查文件的内容,它将包含每条记录的用户名和加密密码:
cat /etc/apache2/.htpasswd
Outputsammy:$apr1$eponJaBR$9uyVIRpDpbHoseI.hS1cq/ another_user:$apr1$dDXiQxte$RGn3CVfFLQOPf5lSJgNvV1
现在,您的用户和密码采用了 Apache 可以读取的格式。
第 3 步 — 配置 Apache 密码验证
在此步骤中,您需要配置 Apache 以在提供受保护的内容之前检查 .htpasswd
文件。 您可以通过以下两种方式之一执行此操作:直接在站点的虚拟主机文件中或将 .htaccess
文件放在需要限制的目录中。 通常最好使用虚拟主机文件,但如果您需要允许非 root 用户管理自己的访问限制,请参阅第二个选项将限制检查到网站旁边的版本控制中,或者已经有一个将 .htaccess
文件用于其他目的的 Web 应用程序。
注意: 您可以对任何活动的虚拟主机执行以下选项。 如果您使用自己的,请务必更改任何命令和值以反映您的配置。
选择最适合您需求的选项。
选项 1:在虚拟主机定义中配置访问控制(首选)
第一个选项是编辑 Apache 配置并向虚拟主机文件添加密码保护。 这通常会提供更好的性能,因为它避免了读取分布式配置文件的开销。 此选项需要访问配置,这并不总是可用的,但当您有权访问时,建议您这样做。
首先打开您希望添加限制的虚拟主机文件。 对于我们的示例,我们将使用包含虚拟主机的 /etc/apache2/sites-available/your_domain.conf
文件。 使用命令行文本编辑器打开文件,例如 nano
:
sudo nano /etc/apache2/sites-available/your_domain.conf
在内部,去掉注释后,该文件应类似于以下内容:
/etc/apache2/sites-available/your_domain.conf
<VirtualHost *:80> ServerAdmin webmaster@localhost ServerName your_domain ServerAlias www.your_domain DocumentRoot /var/www/your_domain ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
身份验证是在每个目录的基础上完成的。 要设置身份验证,您需要使用 <Directory ___>
块来定位您希望限制的目录。 在我们的示例中,我们将限制整个文档根目录,但您可以修改此列表以仅针对 Web 空间中的特定目录:
/etc/apache2/sites-available/your_domain.conf
<VirtualHost *:80> ServerAdmin webmaster@localhost ServerName your_domain ServerAlias www.your_domain DocumentRoot /var/www/your_domain ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined <Directory "/var/www/your_domain"> </Directory> </VirtualHost>
在此目录块中,指定您正在设置 Basic
身份验证。 对于 AuthName
,选择在提示输入凭据时将向用户显示的领域名称。 使用 AuthUserFile
指令将 Apache 指向您创建的密码文件。 最后,要求只有 valid-user
可以访问此资源,这意味着可以使用密码验证其身份的任何人都将被允许进入:
/etc/apache2/sites-available/your_domain.conf
<VirtualHost *:80> ServerAdmin webmaster@localhost ServerName your_domain ServerAlias www.your_domain DocumentRoot /var/www/your_domain ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined <Directory "/var/www/your_domain"> AuthType Basic AuthName "Restricted Content" AuthUserFile /etc/apache2/.htpasswd Require valid-user </Directory> </VirtualHost>
完成后保存并关闭文件。 如果您使用 nano
,您可以按 CTRL + X
,然后按 Y
,然后按 ENTER
。
在重新启动 Web 服务器之前,您可以使用以下命令检查配置:
sudo apache2ctl configtest
如果一切顺利并且您得到 Syntax OK
作为输出,您可以重新启动服务器以实施您的密码策略:
sudo systemctl restart apache2
由于 systemctl
不显示所有服务管理命令的结果,请使用 status
命令确保服务器正在运行:
sudo systemctl status apache2
Output● apache2.service - The Apache HTTP Server Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor prese> Active: active (running) since Fri 2022-04-29 17:12:24 UTC; 4s ago Docs: https://httpd.apache.org/docs/2.4/ Process: 4493 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SU> Main PID: 4514 (apache2) Tasks: 55 (limit: 9508) Memory: 5.8M CGroup: /system.slice/apache2.service ├─4514 /usr/sbin/apache2 -k start ├─4516 /usr/sbin/apache2 -k start └─4517 /usr/sbin/apache2 -k start
现在,您指定的目录应该受密码保护。
选项 2:使用 .htaccess 文件配置访问控制
Apache 可以使用 .htaccess
文件来允许在内容目录中设置某些配置项。 由于 Apache 必须在每个涉及目录的请求上重新读取这些文件,这会对性能产生负面影响,因此首选 Option 1,但如果您已经在使用 .htaccess
文件或需要允许非 root 用户管理限制,.htaccess
文件有意义。
要使用 .htaccess
文件启用密码保护,请使用 nano
等命令行文本编辑器打开主 Apache 配置文件:
sudo nano /etc/apache2/apache2.conf
找到包含文档根目录的 /var/www/
目录的 <Directory>
块。 更新此行以反映您的文档根目录。 接下来,通过将该块中的 AllowOverride
指令从 None
更改为 All
来打开 .htaccess
处理。 这个 <Directory>
块的内容现在将如下所示:
/etc/apache2/apache2.conf
. . . <Directory /var/www/your_domain> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> . . .
完成后保存并关闭文件。
接下来,将 .htaccess
文件添加到您要限制的目录中。 在我们的演示中,我们将限制基于 /var/www/your_domain
的整个文档根目录(整个网站),但是您可以将此文件放在您希望限制访问的任何目录中:
sudo nano /var/www/your_domain/.htaccess
在此文件中,指定您要设置 Basic
身份验证。 对于 AuthName
,选择在提示输入凭据时将向用户显示的领域名称。 使用 AuthUserFile
指令将 Apache 指向我们创建的密码文件。 最后,您将需要一个 valid-user
来访问此资源,这意味着可以使用密码验证其身份的任何人都将被允许进入:
/var/www/your_domain/.htaccess
AuthType Basic AuthName "Restricted Content" AuthUserFile /etc/apache2/.htpasswd Require valid-user
保存并关闭文件。 重新启动 Web 服务器以使用 .htaccess
文件对目录中或目录下的所有内容进行密码保护:
sudo systemctl restart apache2
然后运行systemctl status
验证重启成功:
sudo systemctl status apache2
Output● apache2.service - The Apache HTTP Server Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor prese> Active: active (running) since Fri 2022-04-29 17:18:17 UTC; 3s ago Docs: https://httpd.apache.org/docs/2.4/ Process: 4721 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SU> Main PID: 4744 (apache2) Tasks: 55 (limit: 9508) Memory: 5.9M CGroup: /system.slice/apache2.service ├─4744 /usr/sbin/apache2 -k start ├─4745 /usr/sbin/apache2 -k start └─4746 /usr/sbin/apache2 -k start
您指定的目录现在应该受密码保护。
第 4 步 — 确认密码验证
要确认您的内容受到保护,请尝试通过导航到 https://your_domain_or_server_IP
在 Web 浏览器中访问您的受限内容。
您将看到如下所示的用户名和密码提示:
如果您输入正确的凭据,您将被允许访问内容。 如果您输入错误的凭据或点击“取消”,您将收到“未经授权”错误页面:
结论
您现在已经为您的站点设置了基本身份验证。
您可以使用 Apache 配置和 .htaccess
做更多事情。 要了解有关 Apache 配置中可用的灵活性和功能的更多信息,请尝试以下教程之一:
- 为了更好地理解主配置文件,请阅读我们的 Apache 安装指南中关于 熟悉重要的 Apache 文件和目录 的部分。
- 详细了解 如何在 Apache 中设置虚拟主机文件
- 在我们的指南 如何使用 .htaccess 文件 中了解如何重写 URL、自定义错误页面(如之前的“未经授权”消息)或使用服务器端包含在所有页面上包含常见元素。