如何在Ubuntu14.04上使用Apache设置密码验证

来自菜鸟教程
跳转至:导航、​搜索

介绍

设置 Web 服务器时,您通常希望限制访问网站的某些部分。 Web 应用程序通常提供自己的身份验证和授权方法,但如果这些方法不充分或不可用,则可以使用 Web 服务器本身来限制访问。

在本指南中,我们将演示如何在 Ubuntu 14.04 上运行的 Apache Web 服务器上对资产进行密码保护。

先决条件

要开始使用,您需要访问 Ubuntu 14.04 服务器环境。 您需要具有 sudo 权限的非 root 用户才能执行管理任务。 要了解如何创建这样的用户,请遵循我们的 Ubuntu 14.04 初始服务器设置指南

安装 Apache 实用程序包

为了创建存储访问受限内容所需密码的文件,我们将使用一个名为 htpasswd 的实用程序。 这可以在 Ubuntu 存储库中的 apache2-utils 包中找到。

通过键入此命令更新本地包缓存并安装包。 我们将借此机会获取 Apache2 服务器,以防服务器上尚未安装它:

sudo apt-get update
sudo apt-get install apache2 apache2-utils

创建密码文件

我们现在可以访问 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$lzxsIfXG$tmCvCfb49vpPFwKGVsuYz.
another_user:$apr1$p1E9MeAf$kiAhneUwr.MhAE2kKGYHK.

配置 Apache 密码验证

现在我们有了一个包含 Apache 可以读取格式的用户和密码的文件,我们需要配置 Apache 以在提供受保护的内容之前检查该文件。 我们可以通过两种不同的方式做到这一点。

第一个选项是编辑 Apache 配置并将我们的密码保护添加到虚拟主机文件中。 这通常会提供更好的性能,因为它避免了读取分布式配置文件的开销。 如果您有此选项,建议使用此方法。

如果您无法修改虚拟主机文件(或者如果您已经在使用 .htaccess files for other purposes), you can restrict access using an .htaccessfile. Apache uses.htaccess` 文件以允许在内容目录中的文件。 缺点是 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>

完成后保存并关闭文件。 重新启动 Apache 以实施您的密码策略:

sudo service apache2 restart

您指定的目录现在应该受密码保护。

使用 .htaccess 文件配置访问控制

如果您希望使用 .htaccess 文件来设置密码保护,您应该首先编辑主 Apache 配置文件以允许 .htaccess 文件:

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 文件对目录中或目录下的所有内容进行密码保护:

sudo service apache2 restart

确认密码认证

要确认您的内容受到保护,请尝试在 Web 浏览器中访问您的受限内容。 您应该看到如下所示的用户名和密码提示:

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

结论

您现在应该拥有为您的站点设置基本身份验证所需的一切。 请记住,密码保护应该与 SSL 加密相结合,这样您的凭据就不会以纯文本形式发送到服务器。 要了解如何创建用于 Apache 的自签名 SSL 证书,请遵循 本指南 。 要了解如何安装商业证书,请按照 本指南