配置文件:/etc/readers.conf
,被程序 nnrpd 用来进行权限控制。控制谁可以连接新闻服务器以及用户的访问权限。
配置文件中有两种不同的配置组组成:auth 和 access。auth 组用来判定用户身份——是谁? access 组用来判定用户的权限——能干什么?
如何将 auth 和 access 配置组联系在一起呢?首先遍历所有的 auth 配置组,最后一个匹配的 auth 配置组负责分配一个标识,通常(参见下面的例子)通过 auth 配置组中的 default 和 default-domain 组合成形如 default@default-domain 的 ID 标识。这个标识去和 access 配置组的 users 去匹配。匹配通过,则分配 access 配置组中相应的权限。
对如下的 auth 配置组:
auth <name> { hosts: <host-wildmat> auth: <auth-program> res: <res-program> default: <defuser> default-domain: <defdomain> # ...possibly other settings }
如果定义了 "res: <res-program>",则用程序 res-program 检查用户的连接信息,如果返回一个 用户名(不带 @ 字符),则 auth 配置组返回的标识为 用户名@<defdomain>;如果带 @ 字符,则直接返回 res-program 的返回值;如果 res-program 返回 false 或者根本没有定义 res 参数,则返回 <defuser>@<defdomain>
如果用户连接之后,发出认证的命令(AUTHINFO USER/PASS commands),则用户名和口令传递给程序 <auth-program>,如果定义了 auth 参数的话。 <auth-program>认证通过,则返回新的用户标识,即用户提供的用户名,而不再使用 <defuser> 名称。
如果有多个 auth 配置组,则最后一个匹配用户连接状态或者认证状态的配置组才是最终起作用的。
然后进行第二个步骤,用获得的唯一用户标识去和各个 access 配置组匹配。一个 access 配置组如下:
access <name> { users: <identity-wildmat> newsgroups: <group-wildmat> # ...possibly other settings }
同样 access 后面的 <name> 除了可视之外,没有其它用途。起作用的是 users 参数,它的值用来匹配 auth 配置组返回的用户标识,如果匹配则具有该 access 配置组赋予的相应权限。同样对于多个 access 配置组,类似的最后一个匹配的 access 配置组起作用。
在权限设置复杂的情况下,还可以通过 auth 配置组中的 key 字段,限制匹配范围。即只去检查具有相通 key 字段的 access 配置组,如果 auth 配置组返回的用户标识和对应的 access 配置组的 key 匹配,则分配相应 access 组定义的权限。
基于 IP 地址认证示例:
auth rd { hosts: 10.0.0.0/24 default: intranet default-domain: worldhello } access rd { users: intranet@worldhello newsgroups: "*,!control.*,!junk,!control" localtime: yes access: "Read Post" } auth "localhost" { hosts: "localhost, 127.0.0.1, stdin" default: "<localhost>" } access "localhost" { users: "<localhost>" newsgroups: "*" access: RPA } access fail { users: "<FAIL>@<UNKNOWN>" newsgroups: !* }
口令验证方式需要在 auth 配置组中提供 auth 字段。auth 字段的值是用来验证口令的应用程序,该程序必须位于路径 PATH_NEWS/bin/auth/passwd/
下。
auth "passwords" { hosts: "*" key: "pwd" auth: "ckpasswd -d /usr/local/news/db/newsusers" auth: "ckpasswd -s" } access "passwords" { key: "pwd" newsgroups: "*,!local.newstest,!control*,!junk" access: "Read Post" } access "admin" { users: "johnson" key: "pwd" newsgroups: "*" access: "Read Post" }
定义了两组用户,可以从任何地址访问(hosts: "*")。外部程序check_password ,用来和客户端通讯,完成口令认证。
如果用户通过了身份验证,并且用户名为:johnson,则通过名为“admin”的控制域,为用户赋予更大的权限(能够访问包括 control.*, junk 在内的所有新闻组)。
如果用户通过了身份认证,但是是其它用户名,则通过名为“passwords”的控制域,为用户赋予权限。
测试口令验证,参见:测试新闻服务器。
参见 MAN 手册: readers.conf(5), ckpasswd(1) |
Copyright © 2006 WorldHello 开放文档之源 计划 |