如何在 Ubuntu 16.04 上使用 Apache 设置密码验证
介绍
在运行网站时,您通常希望限制访问者访问网站的某些部分。 Web 应用程序可能会提供自己的身份验证和授权方法,但如果这些方法不充分或不可用,Web 服务器本身也可用于限制访问。
在本指南中,我们将演示如何在 Ubuntu 16.04 上运行的 Apache Web 服务器上使用密码保护资产。
先决条件
为了完成本教程,您需要访问 Ubuntu 16.04 服务器。
此外,在开始之前,您还需要具备以下条件:
- <李> 服务器上的
- 如果您有域名……保护您网站的最简单方法是使用 Let's Encrypt,它提供免费、可信的证书。按照 Apache 的 Let's Encrypt 指南进行设置。
- 如果您没有域……并且您只是将此配置用于测试或个人使用,则可以改用自签名证书。这提供了相同类型的加密,但没有域验证。按照 Apache 的自签名 SSL 指南进行设置。
sudo
用户:您可以按照 Ubuntu 16.04 初始服务器设置指南创建具有 sudo
权限的用户。 <李> Apache2 Web 服务器:如果您还没有设置一个,请参阅深度文章 How To Install Linux, Apache, MySQL, PHP (LAMP) stack on Ubuntu 16.04 的 Apache 部分 ,可以指导你。 <李> 使用 SSL 保护的网站:设置方式取决于您的网站是否有域名。 当所有这些都准备就绪后,以 sudo
用户身份登录到您的服务器,然后继续下面的操作。
第 1 步 — 安装 Apache 实用程序包
我们将使用名为 htpasswd
的实用程序(apache2-utils
包的一部分)来创建文件并管理访问受限内容所需的用户名和密码。
- sudo apt-get update
- sudo apt-get install apache2-utils
第 2 步 — 创建密码文件
我们现在可以访问 htpasswd
命令。我们可以用它来创建一个密码文件,Apache 可以用它来验证用户。为此,我们将在我们的 /etc/apache2
配置目录中创建一个名为 .htpasswd
的隐藏文件。
我们第一次使用这个实用程序时,我们需要添加 -c
选项来创建指定的文件。我们在命令末尾指定一个用户名(本例中为 sammy
)以在文件中创建一个新条目:
- sudo htpasswd -c /etc/apache2/.htpasswd sammy
您将被要求提供并确认用户密码。
对于您希望添加的任何其他用户,省略 -c
参数:
- sudo htpasswd /etc/apache2/.htpasswd another_user
如果我们查看文件的内容,我们可以看到每条记录的用户名和加密后的密码:
- cat /etc/apache2/.htpasswd
Outputsammy:$apr1$.0CAabqX$rb8lueIORA/p8UzGPYtGs/
another_user:$apr1$fqH7UG8a$SrUxurp/Atfq6j7GL/VEC1
第 3 步 — 配置 Apache 密码验证
现在我们有了一个 Apache 可以读取格式的用户和密码文件,我们需要配置 Apache 在提供我们受保护的内容之前检查这个文件。我们可以通过以下两种方式之一执行此操作:直接在站点的虚拟主机文件中或将 .htaccess 文件放在需要限制的目录中。通常最好使用虚拟主机文件,但如果您需要允许非 root 用户管理他们自己的访问限制,请将限制检查到网站旁边的版本控制中,或者已经有一个使用 .htaccess 文件的 Web 应用程序用于其他目的,查看第二个选项。
选择最适合您需要的选项。
选项 1:在虚拟主机定义中配置访问控制(首选)
第一个选项是编辑 Apache 配置并为虚拟主机文件添加密码保护。这通常会提供更好的性能,因为它避免了读取分布式配置文件的开销。此选项需要访问配置,这并不总是可用,但当您有权访问时,建议这样做。
首先打开您希望添加限制的虚拟主机文件。对于我们的示例,我们将使用 000-default.conf
文件,该文件包含通过 Ubuntu 的 apache 软件包安装的默认虚拟主机:
- sudo nano /etc/apache2/sites-enabled/000-default.conf
在内部,删除注释后,文件应类似于以下内容:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
身份验证是在每个目录的基础上完成的。要设置身份验证,您需要使用
块定位您希望限制的目录。在我们的示例中,我们将限制整个文档根目录,但您可以修改此清单以仅针对网络空间中的特定目录:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory "/var/www/html">
</Directory>
</VirtualHost>
在此目录块中,指定我们希望设置 Basic
身份验证。对于 AuthName
,选择将在提示输入凭据时向用户显示的域名。使用 AuthUserFile
指令将 Apache 指向我们创建的密码文件。最后,我们将要求 valid-user
访问此资源,这意味着任何可以使用密码验证其身份的人都将被允许进入:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory "/var/www/html">
AuthType Basic
AuthName "Restricted Content"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
</Directory>
</VirtualHost>
完成后保存并关闭文件。
在重新启动 Web 服务器之前,您可以使用以下命令检查配置:
- sudo apache2ctl configtest
如果一切正常并且您得到 Syntax OK
,则重新启动服务器以实施您的密码策略。由于 systemctl
不显示所有服务管理命令的结果,我们将使用 status
来确保服务器正在运行:
- sudo systemctl restart apache2
- sudo systemctl status apache2
现在,您指定的目录现在应该受密码保护。
选项 2:使用 .htaccess 文件配置访问控制
Apache 可以使用 .htaccess
文件来允许在内容目录中设置某些配置项。由于 Apache 必须在涉及目录的每个请求上重新读取这些文件,这会对性能产生负面影响,因此首选选项 1,但如果您已经在使用 .htaccess 文件或需要允许非根用户管理限制,.htaccess
文件是有意义的。
要使用 .htaccess
文件启用密码保护,请打开主 Apache 配置文件:
- sudo nano /etc/apache2/apache2.conf
找到包含文档根目录的 /var/www
目录的
块。通过将该块中的 AllowOverride
指令从“None”更改为“All”来打开 .htaccess
处理:
. . .
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
. . .
完成后保存并关闭文件。
接下来,我们需要将一个 .htaccess
文件添加到我们希望限制的目录中。在我们的演示中,我们将限制基于 /var/www/html
的整个文档根目录(整个网站),但您可以将此文件放在您希望限制访问的任何目录中:
- sudo nano /var/www/html/.htaccess
在此文件中,指定我们希望设置 Basic
身份验证。对于 AuthName
,选择将在提示输入凭据时向用户显示的域名。使用 AuthUserFile
指令将 Apache 指向我们创建的密码文件。最后,我们将要求 valid-user
访问此资源,这意味着任何可以使用密码验证其身份的人都将被允许进入:
AuthType Basic
AuthName "Restricted Content"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
保存并关闭文件。重启web服务器,使用.htaccess
文件对目录下的所有内容进行密码保护,并使用systemctl status
验证重启是否成功:
- sudo systemctl restart apache2
- sudo systemctl status apache2
第 4 步 — 确认密码验证
要确认您的内容受到保护,请尝试在 Web 浏览器中访问您的受限内容。您应该看到如下所示的用户名和密码提示:

如果输入正确的凭据,您将被允许访问内容。如果输入错误的凭据或点击“取消”,您将看到“未经授权”的错误页面:

结论
恭喜!如果您一直跟进,那么您现在已经为您的站点设置了基本身份验证。但是,Apache 配置和 .htaccess 可以做的远不止基本身份验证。要了解有关 Apache 配置中可用的灵活性和强大功能的更多信息,请尝试以下教程之一:
- 为了更好地了解主配置文件,请参阅如何在 Ubuntu 或 Debian VPS 上配置 Apache Web 服务器
- 在如何在 Ubuntu 16.04 上设置 Apache 虚拟主机中了解有关虚拟主机文件的更多信息
- 在我们的指南如何使用 .htaccess 文件中了解重写 URL、自定义错误页面(如上面的“未经授权”消息)或使用服务器端包含在所有页面上包含通用元素。