- 论坛徽章:
- 0
|
配置文件:/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 { 1
hosts: 10.0.0.0/24
default: intranet
default-domain: worldhello
}
access rd {
users: intranet@worldhello
newsgroups: "*,!control.*,!junk,!control" 2
localtime: yes 3
access: "Read Post"
}
auth "localhost" { 4
hosts: "localhost, 127.0.0.1, stdin"
default: "<localhost>"
}
access "localhost" {
users: "<localhost>"
newsgroups: "*"
access: RPA
}
access fail {
users: "<FAIL>@<UNKNOWN>"
newsgroups: !*
}
1
通过 IP 地址对用户进行身份认证。当然也可以将IP地址替换为域名,如:“*.foo.bar”。
auth 后面紧跟的名称 rd 除了标识之外,不起任何作用。和 access rd 中的 rd 无关。
2
冒号分隔的 Parameter/value 对中的 Value 部分如果包含空格,一定要用引号引起来;目前也没有方法使 value 部分分行,所以 value 的长度受到一行的容量的限制,通常是 8,180 字符;
3
"yes" 是布尔值,同样的布尔值还有 "true/false", "yes/no", 和 "on/off";
4
本地用户,具有更高的权限
*
基于口令的认证:
口令验证方式需要在 auth 配置组中提供 auth 字段。auth 字段的值是用来验证口令的应用程序,该程序必须位于路径 PATH_NEWS/bin/auth/passwd/ 下。
auth "passwords" {
hosts: "*"
key: "pwd"
auth: "ckpasswd -d /usr/local/news/db/newsusers" 1
auth: "ckpasswd -s" 2
}
access "passwords" {
key: "pwd"
newsgroups: "*,!local.newstest,!control*,!junk"
access: "Read Post"
}
access "admin" {
users: "johnson"
key: "pwd"
newsgroups: "*"
access: "Read Post"
}
1
使用用户数据库 /usr/local/news/db/newsusers ,进行口令验证
2
使用系统用户数据库进行口令验证。可能需要设置 ckpasswd 的 setuid 权限。
定义了两组用户,可以从任何地址访问(hosts: "*")。外部程序check_password ,用来和客户端通讯,完成口令认证。
如果用户通过了身份验证,并且用户名为:johnson,则通过名为“admin”的控制域,为用户赋予更大的权限(能够访问包括 control.*, junk 在内的所有新闻组)。
如果用户通过了身份认证,但是是其它用户名,则通过名为“passwords”的控制域,为用户赋予权限。
这个就是我在google 找的 可是根本就是不行的 网上的资料很多
但是网上的资料不一定是正确的 |
|