在CentOS系统中,为Apache HTTP服务器(httpd)配置访问控制是保障网站安全、管理资源访问权限的核心环节,通过精细的访问控制策略,管理员可以精确地定义哪些用户或客户端可以访问特定的目录或文件,从而有效防止未授权访问,Apache的访问控制主要分为两大类:基于主机的控制和基于用户认证的控制。

基于主机的访问控制
这是最基础的控制方式,它根据客户端的IP地址或域名来决定是否允许访问,在Apache 2.4及以上版本中,主要使用Require指令来实现。
这种方法常用于限制管理后台或内部资源,只允许特定网络(如公司内网)的IP地址访问,要保护一个位于/var/www/html/admin的目录,只允许168.1.0/24网段的IP访问,可以在Apache配置文件(如/etc/httpd/conf.d/admin.conf)或.htaccess文件中进行如下设置:
<Directory "/var/www/html/admin">
# 只允许来自192.168.1.0/24网段的访问
Require ip 192.168.1.0/24
# 也可以指定具体IP
# Require ip 192.168.1.100
# 拒绝所有其他请求(这是默认行为,无需显式声明)
</Directory>
如果需要允许多个IP或网段,可以多次使用Require ip指令,Apache还支持Require host指令,允许使用域名进行控制,但需注意DNS解析的安全性和可靠性。
基于用户认证的访问控制
当需要根据用户身份进行控制时,就需要启用用户认证,这通常包含两个步骤:创建一个存储用户名和密码的文件,然后在Apache配置中启用认证。
创建密码文件
使用Apache提供的htpasswd工具来创建和管理密码文件,建议将此文件存放在Web根目录之外,以防被意外下载,将其放在/etc/httpd/conf/目录下。
首次创建文件并添加第一个用户(例如admin):

sudo htpasswd -c /etc/httpd/conf/.htpasswd admin
系统会提示您输入并确认密码。-c选项表示创建新文件,若要添加更多用户,则不能使用-c选项,否则会覆盖原有文件:
sudo htpasswd /etc/httpd/conf/.htpasswd user2
配置Apache
在需要保护的目录配置中添加认证指令,保护/var/www/html/private目录:
<Directory "/var/www/html/private">
# 设置认证类型为Basic
AuthType Basic
# 设置认证领域,这会显示在浏览器弹出的登录框中
AuthName "Restricted Area"
# 指定密码文件的路径
AuthUserFile /etc/httpd/conf/.htpasswd
# 要求所有访问者必须是密码文件中的合法用户
Require valid-user
</Directory>
配置完成后,任何尝试访问/private目录的用户都会看到一个弹出窗口,要求输入有效的用户名和密码。
混合访问控制策略
在实际应用中,常常将两种方法结合使用,允许内网用户直接访问,而外网用户则必须通过密码认证,这可以通过<RequireAll>和<RequireAny>等高级指令实现。
<Directory "/var/www/html/secret">
AuthType Basic
AuthName "Internal or Authenticated"
AuthUserFile /etc/httpd/conf/.htpasswd
# 使用RequireAny逻辑:满足以下任一条件即可
<RequireAny>
# 条件1:来自内网IP
Require ip 192.168.1.0/24
# 条件2:通过身份认证的合法用户
Require valid-user
</RequireAny>
</Directory>
配置生效与验证
所有修改完成后,务必先检查Apache配置文件的语法是否正确:
sudo apachectl configtest
如果显示Syntax OK,则可以安全地重启服务以使配置生效:

sudo systemctl restart httpd
从不同IP地址和使用不同浏览器进行测试,验证访问控制策略是否按预期工作。
相关问答FAQs
Q1: 为什么将Apache的密码文件(.htpasswd)放在网站目录(如/var/www/html)下是不安全的?
A1: 将.htpasswd文件放在网站目录下存在严重的安全风险,如果Apache配置出现疏漏,或者未来某个模块的错误配置,该密码文件可能会被当作普通文件提供给任何访问者下载,虽然文件内容是经过加密的密码哈希,但攻击者获取后仍可使用离线破解工具尝试还原密码,从而对服务器安全构成威胁,最佳实践是始终将其存放在Web服务器无法直接访问的目录中,例如/etc/httpd/conf/。
Q2: Require all granted 和 Require ip 192.168.1.0/24 在访问控制上的核心区别是什么?
A2: Require all granted 是一个无条件允许所有请求的指令,它会覆盖任何之前的拒绝规则,使得该目录下的资源对所有客户端开放,而 Require ip 192.168.1.0/24 是一个有条件的白名单指令,它仅允满足条件的IP地址(即来自168.1.0/24网段)的客户端访问,所有其他IP的请求都会被拒绝,简而言之,前者是“允许所有人”,后者是“仅允许特定的人”。