Apache/httpd(9)之基于用户、组的访问控制

Apache/httpd(9)之基于用户、组的访问控制

微信搜索 zze_coding 或扫描 👉 二维码关注我的微信公众号获取更多资源推送:

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 服务,访问会发现需要提供用户名和密码:
image.png

添加用户账号和密码:

$ 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

再次访问并提供刚刚设置的用户名和密码后会发现成功返回资源页面:

image.png

再来测试一下组权限控制,修改安全域配置如下:

<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

alexjerry 属于组 group1

此时访问会发现仅有在 group1 组中的 alexjerry 能认证通过。

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://www.zze.xyz/archives/apachehttpd9.html

Buy me a cup of coffee ☕.