概述
本章, 您将学习到 Apache httpd 的目录保护功能,即对用户访问的资源设置相关的用户身份认证机制,以保护相关的资源。
Apache httpd 当中的目录保护有两种认证方式:
- 基础认证(Basic) - 用户名和密码经过 Base64 编码后传输,配置简单,但必须配合 HTTPS 使用,否则密码相当于明文传输,非常不安全。基础认证需要使用
htpasswd命令来创建和管理密码文件 - 摘要认证(Digest) - 更安全,密码经过哈希加密后再传输,但对浏览器的兼容性要求稍高一些。仍然强烈建议配合 HTTPS 使用。摘要认证需要使用
htdigest命令来创建和管理密码文件
无论是哪种认证方式,最终实现的效果都需要有三个步骤:
- 创建密码文件
- 配置认证指令
- 重启服务生效
基础认证
htpasswd 命令
该命令的常用选项有:
-c- 创建密码文件。不能与-n选项一起使用-n- 不更新密码文件,仅将加密后的用户名密码输出在屏幕上(即标准输出)-m- 使用 MD5 算法加密密码。这是默认的。-2- 使用 SHA-256 加密密码-5- 使用 SHA-512 加密密码-B- bcrypt 哈希算法加密密码。目前认为这种方式非常安全。-C- 与-B选项一起使用,指定 bcrypt 哈希算法所使用的计算时间,选项值的范围为 4-17,默认值为 5-D- 删除密码文件中的用户-v- 校验密码,验证给定的密码与密码文件中的用户密码是否一致
提示
虽然 Apache httpd 对密码文件的文件名称以及文件后缀无明确要求,但是根据行业习惯,人们通常都是以
.htpasswd 命名或开头,如 .htpasswd 或 .htpasswd-users 或 .htpasswd-all 等。另外,对密码文件存放的路径位置没有要求,但为了安全性考虑,建议将该密码文件存放在除网页根目录之外的任何位置。基础认证方式的演示
需求:现在对 /usr/local/apache2/htdocs/admin/ 目录添加目录保护,只有输入正确的用户名和密码才能访问。
步骤一:确认相关模块已被加载
Shell > grep -E "auth_basic|authz_user" /usr/local/apache2/conf/httpd.conf
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule auth_basic_module modules/mod_auth_basic.so
步骤二:创建密码文件
Shell > mkdir /usr/local/apache2/htdocs/admin/
# 添加第一个用户需要使用到 -c 选项,添加第二个用户则不需要 -c 选项
Shell > /usr/local/apache2/bin/htpasswd -B -c /usr/local/.htpasswd-all admin1
New password:
Re-type new password:
Adding password for user admin1
# 添加第二个用户
## 需要注意的是,密码文件不支持对已有用户的密码进行更新,若要执行密码更新操作,需要先使用 -D 选项删除对应用户,然后执行添加用户的操作
Shell > /usr/local/apache2/bin/htpasswd -B /usr/local/.htpasswd-all guest1
New password:
Re-type new password:
Adding password for user guest1
# 文件内容为
Shell > cat /usr/local/.htpasswd-all
admin1:$2y$05$RGc1Vi4HsotIBQ1hRwXrHOBCcIxIqXKMxFNfBXXy7mwLCHO9ZmV3i
guest1:$2y$05$/lz9dCB9pbeKkIE9U0wGH.gVip5d5rRDDOmMF0AMp2a.gmQXi9MF.
# 对密码文件设置严格的权限
Shell > chown daemon:daemon /usr/local/.htpasswd-all && chmod 600 /usr/local/.htpasswd-all
Shell > ls -l /usr/local/.htpasswd-all
-rw------- 1 daemon daemon 68 Jun 25 10:09 /usr/local/.htpasswd-all
步骤三:配置相关的指令
因 admin 目录在网页根目录中,所以不需要目录别名功能。
在 httpd.conf 配置文件的最底部追加以下内容:
Shell > vim /usr/local/apache2/conf/httpd.conf
...
<Directory "/usr/local/apache2/htdocs/admin">
AllowOverride None
AuthType Basic
AuthName "Please log in"
AuthUserFile /usr/local/.htpasswd-all
Require valid-user
</Directory>
# 语法检查
Shell > /usr/local/apache2/bin/apachectl -t
Syntax OK
# 重启服务
Shell > /usr/local/apache2/bin/apachectl restart
配置说明:
- 使用 Directory 配置段并应用于 /usr/local/apache2/htdocs/admin 目录
AllowOverride None- 完全忽略 .htaccess 文件的内容AuthType Basic- 认证类型为基本AuthName "Please log in"- 弹出的提示内容AuthUserFile /usr/local/.htpasswd-all- 绝对路径下的密码文件Require valid-user- 允许密码文件中的所有用户访问
尝试访问则会弹出身份认证的窗口:

还原
Shell > /usr/local/apache2/bin/apachectl stop
Shell > vim /usr/local/apache2/conf/httpd.conf
...
#<Directory "/usr/local/apache2/htdocs/admin">
# AllowOverride None
# AuthType Basic
# AuthName "Please log in"
# AuthUserFile /usr/local/.htpasswd-all
# Require valid-user
#</Directory>
Shell > rm -rf /usr/local/apache2/htdocs/admin/
Shell > rm -rf /usr/local/.htpasswd-all
htdigest 命令
该命令的语法为 htdigest [ -c ] passwdfile realm username
-c- 用来创建摘要密码文件- passwdfile - 替换为具体的摘要密码文件
- realm - 替换为具体的领域名称,领域名称即具有描述性质的字符串,如 "Admin Dir"
- username - 替换为具体的用户名称
提示
摘要密码文件的文件名称以及文件后缀无明确要求,但是根据行业习惯,人们通常都是以
.htdigest 命名。另外,对摘要密码文件存放的路径位置没有要求,但为了安全性考虑,建议将该摘要密码文件存放在除网页根目录之外的任何位置。摘要认证方式的演示
需求:现在对 /usr/local/apache2/htdocs/private/ 目录添加目录保护,只有输入正确的用户名和密码才能访问。
步骤一:确认相关模块已被加载
Shell > grep -E "auth_digest|authn_core|authz_core|authn_file|authz_user" /usr/local/apache2/conf/httpd.conf
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule auth_digest_module modules/mod_auth_digest.so
步骤二:创建摘要密码文件
Shell > mkdir /usr/local/apache2/htdocs/private/
# 创建摘要密码文件并添加第一个用户,添加第二个用户则不需要 -c 选项
Shell > /usr/local/apache2/bin/htdigest -c /usr/local/.htdigest "private Dir" alice
dding password for alice in realm private Dir.
New password:
Re-type new password:
# 添加第二个用户
Shell > /usr/local/apache2/bin/htdigest /usr/local/.htdigest "private Dir" frank
Adding user frank in realm private Dir
New password:
Re-type new password:
# 文件内容为
Shell > cat /usr/local/.htdigest
alice:private Dir:e233890d49c92a73cc1dd2d83221a488
frank:private Dir:f5de340abfa2bb3644ea592b3a65e00a
# 对密码文件设置严格的权限
Shell > chown daemon:daemon /usr/local/.htdigest && chmod 600 /usr/local/.htdigest
Shell > ls -l /usr/local/.htdigest
-rw------- 1 daemon daemon 102 Jun 25 12:55 /usr/local/.htdigest
步骤三:配置相关的指令
因 private 目录在网页根目录中,所以不需要目录别名功能。
在 httpd.conf 配置文件的最底部追加以下内容:
Shell > vim /usr/local/apache2/conf/httpd.conf
...
<Directory "/usr/local/apache2/htdocs/private">
AuthType Digest
AuthName "private Dir"
AuthDigestDomain /private/ http://192.168.100.20:80/private/
AuthDigestProvider file
AuthUserFile /usr/local/.htdigest
Require valid-user
</Directory>
# 语法检查
Shelle > /usr/local/apache2/bin/apachectl -t
Syntax OK
# 重启服务
Shell > /usr/local/apache2/bin/apachectl restart
配置说明:
- 使用 Directory 配置段并应用于 /usr/local/apache2/htdocs/private 目录
AuthType Digest- 认证类型为摘要AuthName "private Dir"- 认证领域名称,必需与htdigest命令指定的领域名称一致AuthDigestDomain /private/ http://192.168.100.20:80/private/- 可选,指定摘要认证的使用范围AuthDigestProvider file- 指定摘要认证的提供者为文件AuthUserFile /usr/local/.htdigest- 指定摘要密码文件的路径Require valid-user- 允许摘要密码文件中的所有用户访问
尝试访问则会弹出身份认证的窗口:

还原
Shell > /usr/local/apache2/bin/apachectl stop
Shell > rm -rf /usr/local/apache2/htdocs/private
Shell > rm -rf /usr/local/.htdigest
Shell > vim /usr/local/apache2/conf/httpd.conf
...
#LoadModule auth_digest_module modules/mod_auth_digest.so
...
#<Directory "/usr/local/apache2/htdocs/private">
# AuthType Digest
# AuthName "private Dir"
# AuthDigestDomain /private/ http://192.168.100.20:80/private/
# AuthDigestProvider file
# AuthUserFile /usr/local/.htdigest
# Require valid-user
#</Directory>
版权声明:「自由转载-保持署名-非商业性使用-禁止演绎 3.0 国际」(CC BY-NC-ND 3.0)
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论








