httpd 要完成基于用户的访问控制首先要进行认证质询和认证操作:
- 认证质询(www Authenticate):响应码为 401,拒绝客户端请求,并说明要求客户提供账号和密码;
- 认证(Authorization):客户端用户填入账号和密码后再次发送请求报文,认证通过,则服务器发送响应的资源;
认证有两种类型:
- basic:明文;
- digest:消息摘要;
可指定特定的路径让通过认证的用户才能访问,这些路径称为安全域。
每一个安全域应该通过名称对其进行标识,并用于告知用户认证的原因等信息。
虚拟账号
用户认证使用的账号和密码存储在哪里呢?
httpd 提供了虚拟账号的方式完成认证,虚拟账号仅用于访问某服务时作为认证标识。
虚拟账号的用户名及密码可存储在文本文件、SQL 数据库、ldap 或 nis 中。
basic认证使用
定义安全域
在 /etc/httpd/conf/httpd.conf
配置文件中定义安全域格式如下:
<Directory "">
Options None
Allowoverride None
AuthType Basic
AuthName "STRING"
AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"
Require username1 username2 username3...
</Directory>
其中各字段含义如下:
AuthType
:指定认证类型;AuthName
:安全域名称;AuthUserFile
:虚拟账号的用户和密码存储的文件;Require
:仅允许指定的虚拟账号认证,多个用空格隔开,如果要允许所有虚拟账号可指定valid-users
。
提供存储用户名和密码的文件
这里的文本文件中的密码是通过 htpasswd
命令进行管理的,其语法格式如下:
htpasswd [ -c ] [ -m ] [ -D ] [-s] passwdfile username
-c:自动创建 passwdfile,因此,进应该在添加第一个用户时使用;
-m:添加用户账号,使用 md5 加密存储密码;
-D:删除用户账号;
-s:使用 sha1 加密存储密码;
基于组进行认证
基于组认证需要修改安全域格式为如下:
<Directory "">
Options None
Allowoverride None
AuthType Basic
AuthName "STRING"
AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"
AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE"
Require group group1 grou2 ...
</Directory>
该方式要同时提供用户帐号文件和组文件。
组文件内容格式如下:
GROUP_NAME1: user1 user2 user3 ...
GROUP_NAME2: user1 user3 user4 ...
...
示例
先定义安全域:
<Directory "/var/www/html/admin">
Options None
AllowOverride None
AuthType Basic
AuthName "管理员专用"
AuthUserFile "/etc/httpd/conf.d/.htpasswd"
Require valid-user
</Directory>
重新加载 httpd 服务,访问会发现需要提供用户名和密码:
添加用户账号和密码:
$ htpasswd -cm /etc/httpd/conf.d/.htpasswd tom
New password:
Re-type new password:
Adding password for user tom
$ htpasswd -m /etc/httpd/conf.d/.htpasswd jerry
New password:
Re-type new password:
Adding password for user jerry
查看 .htpasswd
文件:
$ cat /etc/httpd/conf.d/.htpasswd
tom:$apr1$QqdeecOR$AW9lqz0lusF5a5kqMJVzq/
jerry:$apr1$qit41c4o$pBiImDX4TxBn/L/xiKb3j1
再次访问并提供刚刚设置的用户名和密码后会发现成功返回资源页面:
再来测试一下组权限控制,修改安全域配置如下:
<Directory "/var/www/html/admin">
Options None
AllowOverride None
AuthType Basic
AuthName "管理员专用"
AuthUserFile "/etc/httpd/conf.d/.htpasswd"
AuthGroupFile "/etc/httpd/conf.d/.htgroup"
Require group group1
</Directory>
继续添加两个用户:
$ htpasswd -m /etc/httpd/conf.d/.htpasswd bob
New password:
Re-type new password:
Adding password for user bob
$ htpasswd -m /etc/httpd/conf.d/.htpasswd alex
New password:
Re-type new password:
Adding password for user alex
编辑 /etc/httpd/conf.d/.htgroup
文件内容如下:
group1: alex jerry
即
alex
和jerry
属于组group1
。
此时访问会发现仅有在 group1
组中的 alex
和 jerry
能认证通过。
评论区