Apache HTTP Server 内置了一套灵活的认证框架,不依赖额外模块就能对指定目录或URL实施访问限制。常见做法是在配置文件里声明认证类型、认证提示信息、密码文件位置,再配合 Require 指令决定谁能通过。实际部署时,目录保护经常用于后台管理系统、phpMyAdmin、私有文档库等场景。配置过程虽然不复杂,但细节处理不当会导致认证反复失败或规则被忽略。下面先梳理认证的工作机制,再逐步完成一个可用的密码保护目录。

一、Apache目录认证的工作机制
Apache的认证体系由多个模块协同完成。最常见的HTTP Basic认证会要求浏览器弹出一个原生对话框,用户输入账号密码后浏览器将凭据以Base64编码的形式发送到服务器。服务器端由 mod_auth_basic 模块解析认证头,再由 mod_authn_file 模块读取密码文件进行比对。认证成功后,授权模块根据 Require 指令决定该用户是否可以访问目录。整个过程不需要Cookie,也没有会话状态,每次请求都会带上认证信息,这也是它简单但适合保护静态目录的原因。
与 Digest 认证相比,Basic 认证的账号密码只是Base64编码,并不是加密,因此如果网站没有启用HTTPS,凭据在网络传输中很容易被截获。实际生产环境中,如果要用Basic认证保护敏感目录,必须配合SSL证书使用。另一个常见的误解是以为Basic认证会主动加密密码,其实加密只发生在密码文件存储环节,传输环节依然依赖HTTPS。
在开始配置之前,需要确认Apache已经启用了 mod_auth_basic 和 mod_authn_file 模块。在Debian或Ubuntu系统中,可以使用 a2enmod auth_basic 和 a2enmod authn_file 命令启用;在CentOS或Rocky Linux中,这些模块通常默认编译在 httpd 包内,可以通过 httpd -M 命令检查。确认完成后即可进入密码文件创建环节。
二、使用htpasswd管理密码文件
htpasswd 是Apache自带的密码文件管理工具,用来创建和更新存储用户名与密码哈希的文本文件。在Ubuntu或Debian中,它由 apache2-utils 包提供,可以使用 apt install apache2-utils 安装;在CentOS或RHEL中,它随 httpd-tools 包发布。首次创建密码文件时需要加 -c 参数,表示创建新文件,如果文件已经存在,使用 -c 会覆盖原有内容,这一点在维护用户时非常容易出错。
执行以下命令可以创建第一个用户 alice:
sudo htpasswd -c /etc/apache2/.htpasswd alice
系统会提示输入两次密码。后续继续添加用户时,不要带 -c:
sudo htpasswd /etc/apache2/.htpasswd bob
默认情况下,htpasswd 使用 bcrypt 算法加密(新版本),也可以显式指定 -B 使用 bcrypt,或者 -m 使用MD5、-s 使用SHA1、-d 使用crypt。bcrypt 目前是相对安全的选择,推荐使用 -B 参数。查看密码文件内容可以看到每行一个用户,格式为 用户名:密码哈希,哈希前的 $2y$ 标识表示bcrypt算法。注意不要把密码文件放在网站可访问的目录下,否则可能被下载。常规做法是放在 /etc/apache2/ 或 /etc/httpd/ 这类系统目录。
三、配置Directory与.htaccess两种保护方式
最推荐的配置方式是直接在主配置文件或虚拟主机配置中使用 <Directory> 块进行保护。打开对应虚拟主机配置文件,例如Ubuntu下的 /etc/apache2/sites-available/000-default.conf 或CentOS下的 /etc/httpd/conf/httpd.conf,在VirtualHost内部加入以下内容:
<Directory "/var/www/html/admin">
AuthType Basic
AuthName "Restricted Area"
AuthUserFile "/etc/apache2/.htpasswd"
Require valid-user
</Directory>
其中 AuthType Basic 指定使用基础认证,AuthName 是浏览器弹窗中显示的提示信息,可以根据需要改成中文,例如 请登录后台管理系统。AuthUserFile 必须使用绝对路径,并且确保Apache运行用户(通常是www-data或apache)对该文件有读取权限。Require valid-user 表示任何在密码文件中存在的用户都可以访问。如果只想允许特定用户,可以改为 Require user alice bob,多个用户用空格分隔。
如果不想修改主配置文件,也可以使用 .htaccess 文件实现目录级保护。首先需要在对应目录的配置中允许 .htaccess 覆盖认证设置,通常是在 <Directory> 块中设置 AllowOverride AuthConfig。然后在要保护的目录下创建 .htaccess 文件,内容与上面的Directory块基本相同,但不再需要 <Directory> 包裹。示例:
AuthType Basic AuthName "Restricted Area" AuthUserFile "/etc/apache2/.htpasswd" Require valid-user
使用 .htaccess 方式的好处是无需重启Apache即可生效,修改后立即应用;缺点是每次请求都要读取并解析 .htaccess 文件,性能略低于主配置方式。在生产环境中如果追求性能,建议尽量将认证规则集中写在主配置文件中,并关闭 AllowOverride。
四、用户组授权与安全加固建议
当用户数量较多或者需要区分多个权限级别时,可以使用用户组文件配合 Require group 指令。先创建一个组文件,例如 /etc/apache2/.htgroup,内容为:
admins: alice bob editors: carol
然后在Directory配置中增加 AuthGroupFile 指令并修改 Require:
<Directory "/var/www/html/reports">
AuthType Basic
AuthName "Report Area"
AuthUserFile "/etc/apache2/.htpasswd"
AuthGroupFile "/etc/apache2/.htgroup"
Require group admins
</Directory>
这样只有属于 admins 组的用户才能访问 reports 目录。如果要同时允许组和特定用户,可以使用 Require group admins 配合 Require user carol,多条Require指令之间默认是或的关系,也可以用 RequireAll 和 RequireAny 包裹实现更复杂的逻辑。
安全方面需要特别留意三点。第一,Basic认证的密码在网络上以Base64形式传输,必须搭配HTTPS,否则相当于明文。第二,密码文件权限应设置为600,且属主为Apache运行用户,避免其他系统用户读取。第三,如果公网环境频繁遭受暴力破解,可以在外层增加IP访问限制,例如使用 Require ip 192.168.1.0/24 与认证规则组合,或者借助Fail2ban分析访问日志,对反复401的IP进行封禁。另外,定期使用 htpasswd -d 或 htpasswd -B 重新生成哈希,避免使用过弱的crypt算法。