部署httpd服务时,有些路径下的内容不希望所有用户都能访问,只有提供用户名和密码才能正常访问,此时就会用到基于用户的访问控制。
前提
vmware的CentOS 7虚拟主机地址为192.168.43.78;
httpd的基本配置情况:
DocumentRoot “/data/www/html”
ServerName 192.168.43.78
Listen 80
要求:
httpd设置一个Alias,名称为/backgrounds/,指向/usr/share/backgrounds/目录;
现在只让指定用户通过“用户名+密码”登录的方式访问backgrounds中的文件。
配置步骤
目前需要做的是将/usr/share/backgrounds/目录定义为安全域,基于Basic方式认证。
1. 定义安全域
在/etc/httpd/conf.d/目录下新建配置文件basic_test.conf,添加如下配置:
Alias /backgrounds/ "/usr/share/backgrounds/"
<Directory "/usr/share/backgrounds/">
Options Indexes` #允许访问索引
AllowOverride None
AuthType Basic #基于Basic认证
AuthName "Test BasicAuthType To Directory backgrounds/"
AuthUserFile "/etc/httpd/conf.d/.basic_test.user" #指定账号文件(最好设为隐藏文件)
Require valid-user #指定允许登录的用户,valid-user表示账号文件内的所有用户
</Directory>
2. 制作账号密码的存储文件
使用htpasswd命令(httpd自带的账号密码创建工具)创建,并对用户进行管理。
这里创建三个用户:user_a,user_b,user_c,密码分别为a123,b123,c123。
首次创建使用-c选项新建存储文件:
# htpasswd -c /etc/httpd/conf.d/.basic_test.user user_a
输入用户密码:
New password:
确认密码:
Re-type new password:
Adding password for user user_a
也可以使用-b选项直接给出密码串,-m选项使用md5加密:
(之后添加用户不能使用-c选项,否则会覆盖之前的用户)
# htpasswd -b -m /etc/httpd/conf.d/.basic_test.user user_b b123
Adding password for user user_b
# htpasswd -b -m /etc/httpd/conf.d/.basic_test.user user_c c123
Adding password for user user_c
三个用户创建完成:
# cat .basic_test.user
user_a:$apr1$RYCy74cb$hOmC0GVSEBBeD0Ln.CUo51
user_b:$apr1$5fA4WNKL$cA740WsK4c8hOKOSvbtXP/
user_c:$apr1$BdRPl/Rz$/2.a1naVcq1.oT3hDVvwu1
3. 验证配置结果
检查配置文件语法,重启服务:
# httpd -t
Syntax OK
# systemctl restart httpd.service
浏览器访问http://192.168.43.78/backgrounds/,要求输入用户名和密码:
输入任意一个用户,访问backgrounds目录:
4. 只允许账号文件中的个别用户登录访问
上边的配置方式是,账号文件中存储的所有用户都可以通过登录来访问指定路径,也可以限制只有特定用户才能登录访问。
有两种方式:
(1) 允许访问的用户数量少的情况下,可以逐个指定:
比如,将Require valid-user改为:
Require user user_a user_b
表示只允许user_a和user_b登录访问
(2) 允许访问的用户数量多时,可以通过组来指定:
创建组文件.basic_test.group,在其中指定PermitUsers组中的用户为user_a和user_b:
# vim /etc/httpd/conf.d/.basic_test.group
PermitUsers: user_a user_b
在配置文件中指定所使用的组文件和允许登录的组:
<Directory "/usr/share/backgrounds/">
Options Indexes
AllowOverride None
AuthType Basic
AuthName "Test BasicAuthType To Directory backgrounds/"
AuthUserFile "/etc/httpd/conf.d/.basic_test.user"
AuthGroupFile "/etc/httpd/conf.d/.basic_test.group"
Require group PermitUsers
</Directory>
此时,就只有user_a和user_b可以通过登录访问,user_c不可以。
通过这样的配置,就可以快速建立一个基于安全域和用户的访问控制,对特定路径进行简单的内容保护。