介绍
作为 Web 管理员,您可能觉得有价值暂时或永久地限制访问者访问网站的某些部分,虽然 Web 应用程序可能提供自己的身份验证和授权方法,但如果这些方法不充分或不可用,您也可以依赖 Web 服务器本身来限制访问。
本教程将引导您通过在Ubuntu 20.04上运行的ApacheWeb服务器上的密码保护资产,这将为您的服务器提供额外的安全层。
前提条件
要完成本教程,您将需要:
- 设置一个Ubuntu 20.04服务器,配备一个非root用户,并启用`sudo'权限和防火墙。 您可以遵循 [Ubuntu 20.04 初始服务器设置指南] (https://andsky.com/tech/tutorials/initial-server-setup-with-ubuntu-20-04).
- Apache 网络服务器安装在您的 Ubuntu 服务器上 。 如果您还没有设置, [如何在 Ubuntu 20. 04 上安装 Apache 网络服务器 (https://andsky.com/tech/tutorials/how-to-install-the-apache-web-server-on-ubuntu-20-04 ) 教程可以引导您 。 请确定完成 ** 第 5 段 ** , 并为您域设置 [虚拟主机文件] (https://andsky.com/tech/tutorials/how-to-install-the-apache-web-server-on-ubuntu-20-04#step-5-setting-up-virtual-hosts-recommended ) 。 此教程会将 你的_域 用作整个实例,并在虚拟主机文件中使用
/etc/apaches2/ sites-capables/ your_域.conf' 。 (_) ( )* 您的虚拟主机以 SSL 安全 。 设置此选项取决于您是否有您网站的域名 。 (_) ) - 如果您有域名, 您可以使用提供免费可信证书的
Let's Enterpress` 来保护您的网站 。 遵循 Apache [让我们加密指南] (https://andsky.com/tech/tutorials/how-to-secure-apache-with-let-s-encrypt-on-ubuntu-20-04) 来设置此设置.
- 如果您没有域名,并且您正在使用此配置进行测试或个人使用,您可以使用自签名的证书取而代之. 这提供了同类型的加密,但没有域验证. 遵循 [自签的 Apache (https://andsky.com/tech/tutorials/how-to-create-a-self-signed-ssl-certificate-for-apache-in-ubuntu-20-04) SSL 指南来设置 。
- 如果您想设置一个域名( 可选), 您可以在 [Namecheap] (https://namecheap.com/ 上购买一个域名, 在 [Freenom] (http://www.freenom.com/en/index.html ) 上免费获取一个域名, 或者使用您选择的域名登记器 。 此外,您还需要为您的服务器设置以下两个 DNS 记录 。 遵循此选项[引入到 DigitalOcean DNS (https://andsky.com/tech/tutorials/an-introduction-to-digitalocean-dns) ,以了解如何添加它们的细节.
- 一张带有‘你的_域'指向您服务器的公开IP地址的记录. () ) - 一个记录有‘www.your_domain'指向您服务器的公开IP地址. () (英语)
一旦你完成了这些前提条件,登录你的服务器作为sudo
用户,并继续到第一步。
步骤 1 – 安装 Apache 工具包
为了完成本教程,我们将使用一个名为htpasswd
的实用程序,是apache2-utils
包的一部分,创建该文件并管理访问受限制内容所需的用户名和密码。
首先,更新您的服务器的包索引:
1sudo apt update
然后安装 Apache 实用程序包:
1sudo apt install apache2-utils
有了这个安装,你现在可以访问htpasswd
命令。
步骤2:创建密码文件
htpasswd
命令允许您创建一个密码文件,Apache可以用来验证用户,您将在您的/etc/apache2
配置目录中创建一个名为.htpasswd
的隐藏文件。
第一次使用此实用程序时,您需要添加 -c
选项来创建指定的 .htpasswd
文件. 在这里,我们在命令的末尾指定一个用户名 (`sammy' 在本例中) 以在文件中创建一个新的条目:
1sudo htpasswd -c /etc/apache2/.htpasswd sammy
您将被要求提供并确认用户的密码。
如下示例所示,为您想要添加的任何额外用户留下-c
参数,以免重写文件:
1sudo htpasswd /etc/apache2/.htpasswd another_user
如果您检查文件的内容,它将包含每个记录的用户名和加密密码:
1cat /etc/apache2/.htpasswd
1[secondary_label Output]
2sammy:$apr1$eponJaBR$9uyVIRpDpbHoseI.hS1cq/
3another_user:$apr1$dDXiQxte$RGn3CVfFLQOPf5lSJgNvV1
现在你有你的用户和密码在一个Apache可以读取的格式。
步骤 3 – 配置 Apache 密码身份验证
在此步骤中,您需要配置Apache以检查.htpasswd
文件,然后为您提供受保护的内容。您可以这样做两种方式之一:要么直接在网站的虚拟主机文件中,要么在需要限制的目录中放置.htaccess
文件。一般来说,最好使用虚拟主机文件,但如果您需要允许非root用户管理自己的访问限制,请参考第二种选项来检查版本控制的限制,或者有一个Web应用程序已经使用了.htaccess
文件用于其他目的。
<$>[注] **注:**您可以对任何活跃的虚拟主机执行下列选项。如果您正在使用自己的主机,请确保更改任何命令和值以反映您的配置。
选择最适合您的需求的选项。
选项1:在虚拟主机定义中配置访问控制(偏好)
第一种选择是编辑Apache配置,并将密码保护添加到虚拟主机文件中,这通常会提供更好的性能,因为它避免了阅读分布式配置文件的成本。
為我們的例子,我們將使用持有虛擬主機的 /etc/apache2/sites-available/your_domain.conf
檔案。
1sudo nano /etc/apache2/sites-available/your_domain.conf
内部,随着评论被删除,该文件应该看起来如下:
1[label /etc/apache2/sites-available/your_domain.conf]
2<VirtualHost *:80>
3 ServerAdmin webmaster@localhost
4 ServerName your_domain
5 ServerAlias www.your_domain
6 DocumentRoot /var/www/your_domain
7 ErrorLog ${APACHE_LOG_DIR}/error.log
8 CustomLog ${APACHE_LOG_DIR}/access.log combined
9</VirtualHost>
要设置身份验证,您需要用一个<Directory ___>
块来瞄准您想要限制的目录. 在我们的示例中,我们将限制整个文档根,但您可以修改此列表以仅针对 Web 空间中的特定目录:
1[label /etc/apache2/sites-available/your_domain.conf]
2<VirtualHost *:80>
3 ServerAdmin webmaster@localhost
4 ServerName your_domain
5 ServerAlias www.your_domain
6 DocumentRoot /var/www/your_domain
7 ErrorLog ${APACHE_LOG_DIR}/error.log
8 CustomLog ${APACHE_LOG_DIR}/access.log combined
9
10<Directory "/var/www/your_domain">
11 </Directory>
12</VirtualHost>
在此目录块中,指定您正在设置基本
身份验证。对于AuthName
,选择一个域名,在请求凭证时会显示给用户。使用AuthUserFile
指令将Apache指向您创建的密码文件。最后,要求只有有效用户
才能访问该资源,这意味着任何可以用密码验证身份的人都将被允许进入:
1[label /etc/apache2/sites-available/your_domain.conf]
2<VirtualHost *:80>
3 ServerAdmin webmaster@localhost
4 ServerName your_domain
5 ServerAlias www.your_domain
6 DocumentRoot /var/www/your_domain
7 ErrorLog ${APACHE_LOG_DIR}/error.log
8 CustomLog ${APACHE_LOG_DIR}/access.log combined
9
10<Directory "/var/www/your_domain">
11 AuthType Basic
12 AuthName "Restricted Content"
13 AuthUserFile /etc/apache2/.htpasswd
14 Require valid-user
15 </Directory>
16</VirtualHost>
如果您正在使用nano
,您可以通过按CTRL + X
然后按Y
然后按ENTER
来完成保存和关闭文件。
在重新启动 Web 服务器之前,您可以使用以下命令检查配置:
1sudo apache2ctl configtest
如果一切都被检查出来,并且您输出Syntax OK
,您可以重新启动服务器来执行您的密码策略:
1sudo systemctl restart apache2
由于systemctl
不显示所有服务管理命令的结果,请使用状态
命令确保服务器正在运行:
1sudo systemctl status apache2
1[secondary_label Output]
2● apache2.service - The Apache HTTP Server
3 Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor prese>
4 Active: active (running) since Fri 2022-04-29 17:12:24 UTC; 4s ago
5 Docs: https://httpd.apache.org/docs/2.4/
6 Process: 4493 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SU>
7 Main PID: 4514 (apache2)
8 Tasks: 55 (limit: 9508)
9 Memory: 5.8M
10 CGroup: /system.slice/apache2.service
11 ├─4514 /usr/sbin/apache2 -k start
12 ├─4516 /usr/sbin/apache2 -k start
13 └─4517 /usr/sbin/apache2 -k start
现在,您指定的目录应该是密码保护的。
选项2:使用.htaccess 文件配置访问控制
由于Apache必须在涉及目录的每个请求上重新读取这些文件,这可能会对性能产生负面影响,但如果您已经使用了.htaccess 文件或需要允许非root用户管理限制,则.htaccess 文件是有意义的。
要使用.htaccess 文件启用密码保护,请使用命令行文本编辑器,如 'nano' 打开主 Apache 配置文件:
1sudo nano /etc/apache2/apache2.conf
查找包含文档根的 /var/www/
目录的 <Directory>
区块. 更新此行以反映您的文档根. 接下来,通过将该区块内的 AllowOverride
指令从 None
改为 All
来启用 .htaccess
处理。
1[label /etc/apache2/apache2.conf]
2. . .
3
4<Directory /var/www/your_domain>
5 Options Indexes FollowSymLinks
6 AllowOverride All
7 Require all granted
8</Directory>
9
10. . .
保存并关闭文件,当你完成。
在我们的演示中,我们将限制基于 /var/www/your_domain
的整个文档根(整个网站),但您可以将此文件放置在您想要限制访问的任何目录中:
1sudo nano /var/www/your_domain/.htaccess
在此文件中,指定您想要设置基本
身份验证。对于AuthName
,选择一个域名,在请求凭证时会显示给用户。使用AuthUserFile
指令将Apache指向我们创建的密码文件。最后,您将需要一个有效用户
来访问此资源,这意味着任何可以用密码验证身份的用户将被允许进入:
1[label /var/www/your_domain/.htaccess]
2AuthType Basic
3AuthName "Restricted Content"
4AuthUserFile /etc/apache2/.htpasswd
5Require valid-user
重新启动 Web 服务器以通过密码保护.htaccess
文件的目录内或下方的所有内容:
1sudo systemctl restart apache2
然后运行systemctl status
来验证重启的成功:
1sudo systemctl status apache2
1[secondary_label Output]
2● apache2.service - The Apache HTTP Server
3 Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor prese>
4 Active: active (running) since Fri 2022-04-29 17:18:17 UTC; 3s ago
5 Docs: https://httpd.apache.org/docs/2.4/
6 Process: 4721 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SU>
7 Main PID: 4744 (apache2)
8 Tasks: 55 (limit: 9508)
9 Memory: 5.9M
10 CGroup: /system.slice/apache2.service
11 ├─4744 /usr/sbin/apache2 -k start
12 ├─4745 /usr/sbin/apache2 -k start
13 └─4746 /usr/sbin/apache2 -k start
您指定的目录现在应该被密码保护。
步骤 4 – 确认密码身份验证
要确认您的内容是受保护的,请尝试在网页浏览器中访问受限制的内容,通过导航到https://your_domain_or_server_IP
。
您将收到一个用户名和密码提示,看起来如下:
如果您输入正确的凭证,您将被允许访问内容. 如果您输入错误的凭证或点击取消
,您将收到未经授权
错误页面:
结论
您现在已经为您的网站设置了基本的身份验证。
您可以使用 Apache 配置和.htaccess 做得更多。 要了解有关 Apache 配置中可用的灵活性和功率的更多信息,请尝试以下教程之一:
- 要更好地了解主配置文件,请阅读有关 [ 熟悉重要的 Apache 文件和目录 ] 的部分。
](https://andsky.com/tech/tutorials/how-to-install-the-apache-web-server-on-ubuntu-20-04#step-6-getting-familiar-with-important-apache-files-and-directories)在我们的Apache安装指南。
- 了解更多关于 如何在Apache中设置虚拟主机文件
- 了解如何重写URL,定制错误页面,如上一封
未经授权
消息,或在您的所有页面上包含常见元素,服务器侧包括我们的指南 如何使用.htaccess 文件)。