Apache httpd功能篇02—目录保护

概述

本章, 您将学习到 Apache httpd 的目录保护功能,即对用户访问的资源设置相关的用户身份认证机制,以保护相关的资源。

Apache httpd 当中的目录保护有两种认证方式:

  • 基础认证(Basic) - 用户名和密码经过 Base64 编码后传输,配置简单,但‌必须配合 HTTPS 使用‌,否则密码相当于明文传输,非常不安全。基础认证需要使用 ‌htpasswd‌ 命令来创建和管理密码文件
  • 摘要认证(Digest) - 更安全,密码经过哈希加密后再传输,但对浏览器的兼容性要求稍高一些。仍然强烈建议配合 HTTPS 使用。摘要认证需要使用 ‌htdigest 命令来创建和管理密码文件

无论是哪种认证方式,最终实现的效果都需要有三个步骤:

  1. 创建密码文件
  2. 配置认证指令
  3. 重启服务生效‌

基础认证

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 - 允许密码文件中的所有用户访问

尝试访问则会弹出身份认证的窗口:

basic

还原

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 - 允许摘要密码文件中的所有用户访问

尝试访问则会弹出身份认证的窗口:

digest

还原

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>
Avatar photo

关于 陸風睿

GNU/Linux 从业者、开源爱好者、技术钻研者,撰写文档既是兴趣也是工作内容之一。Q - "281957576";WeChat - "jiulongxiaotianci",Github - https://github.com/jimcat8
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇