如何在Ubuntu16.04上使用Apache设置密码验证
介绍
运行网站时,您通常希望限制访问者访问网站的某些部分。 Web 应用程序可以提供自己的身份验证和授权方法,但如果这些方法不充分或不可用,Web 服务器本身也可以用于限制访问。
在本指南中,我们将演示如何在 Ubuntu 16.04 上运行的 Apache Web 服务器上对资产进行密码保护。
先决条件
为了完成本教程,您需要访问 Ubuntu 16.04 服务器。
此外,在开始之前,您将需要以下内容:
- 服务器上的 sudo 用户:您可以按照 Ubuntu 16.04 初始服务器设置指南 创建具有
sudo
权限的用户。 - 一个 Apache2 网络服务器:如果你还没有设置一个,深入文章的 Apache 部分,如何在 Ubuntu 上安装 Linux、Apache、MySQL、PHP (LAMP) 堆栈16.04【X186X】,可以指导你。
- 受 SSL 保护的站点:如何设置取决于您是否有站点的域名。
- 如果您有域名... 保护您的网站的最简单方法是使用 Let's Encrypt,它提供免费的、受信任的证书。 按照 Let's Encrypt guide for Apache 进行设置。
- 如果您没有域...并且您只是将此配置用于测试或个人使用,您可以使用自签名证书代替。 这提供了相同类型的加密,但没有域验证。 按照 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 用户管理他们自己的访问限制,请将限制检查到网站旁边的版本控制中,或者让 Web 应用程序使用 .htaccess 文件用于其他目的,请查看第二个选项。
选择最适合您需求的选项。
选项 1:在虚拟主机定义中配置访问控制(首选)
第一个选项是编辑 Apache 配置并将密码保护添加到虚拟主机文件。 这通常会提供更好的性能,因为它避免了读取分布式配置文件的开销。 此选项需要访问配置,这并不总是可用的,但当您有权访问时,建议您这样做。
首先打开您希望添加限制的虚拟主机文件。 对于我们的示例,我们将使用包含通过 Ubuntu 的 apache 包安装的默认虚拟主机的 000-default.conf
文件:
sudo nano /etc/apache2/sites-enabled/000-default.conf
在内部,去掉注释后,该文件应类似于以下内容:
/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>
身份验证是在每个目录的基础上完成的。 要设置身份验证,您需要使用 <Directory ___>
块来定位您希望限制的目录。 在我们的示例中,我们将限制整个文档根目录,但您可以修改此列表以仅针对 Web 空间中的特定目录:
/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 <Directory "/var/www/html"> </Directory> </VirtualHost>
在此目录块中,指定我们希望设置 Basic
身份验证。 对于 AuthName
,选择在提示输入凭据时将向用户显示的领域名称。 使用 AuthUserFile
指令将 Apache 指向我们创建的密码文件。 最后,我们将需要一个 valid-user
来访问此资源,这意味着任何可以使用密码验证其身份的人都将被允许进入:
/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 <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 文件或需要允许非 root 用户管理限制,[ X250X] 文件有意义。
要使用 .htaccess
文件启用密码保护,请打开主 Apache 配置文件:
sudo nano /etc/apache2/apache2.conf
找到包含文档根目录的 /var/www
目录的 <Directory>
块。 通过将该块中的 AllowOverride
指令从“无”更改为“全部”来打开 .htaccess
处理:
/etc/apache2/apache2.conf
. . . <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
来访问此资源,这意味着任何可以使用密码验证其身份的人都将被允许进入:
/var/www/html/.htaccess
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 服务器
- 在 How To Set Up Apache Virtual Hosts on Ubuntu 16.04 中了解有关虚拟主机文件的更多信息
- 在我们的指南 如何使用 .htaccess 文件 中了解重写 URL、自定义错误页面(如上面的“未经授权”消息)或使用服务器端包含在所有页面上包含常见元素。