我拥有的:debian 上的 freeradius 2.1.10,配置为使用数据库。
现在如何运作:网络上有许多设备和用户,用户登录设备进行配置等等。用户可以登录任何设备。例如,某些设备(思科)radius 上的用户帐户附带权限(cisco-avpair
属性),限制个人在思科设备上可以做什么和不能做什么。
我希望 freeradius 做什么添加,针对特定的特殊情况:有一种特殊设备,只有选定的用户才能进行身份验证。其他人应该被拒绝访问。(因此,比上面的思科示例更严格)。
我认为我应该做的是首先定义我自己的属性,例如,company-special-privilege
以便我可以为数据库中的某些用户设置该属性,其值为0
或1
。然后在 中定义一些策略policy.conf
。
我问的是:从未制定过策略,我不明白它们在 freeradius 配置的其余部分中应用在哪里(我应该将策略放在哪里special_access
)。也不确定如何制定它,但以下伪代码应该代表我想要的:
special_access {
if (request to log in $special_device_ip) {
if ($username company-special-privilege) {
reject #
}
}
}
从上面我不清楚如何获取设备 IP 或用户设置的属性。在第二个条件中,我不会对属性执行 == 1,以防用户没有该属性,因为我不知道这意味着什么,但任何没有 1 的用户都必须被拒绝。
答案1
您应该将其放入节raddb/policy.conf
内policy {}
。然后,您可以像引用普通模块一样引用它们(通过其名称),在授权、验证、后验证等中...
FreeRADIUS 中的策略本质上是宏,它们不是函数,它们不接受参数。
raddb/dictionary
定义一个特殊属性来控制策略决策是可以的,除非您有 IANA 编号并想编写自己的自定义词典,否则请这样做。更简单的方法可能是直接查询 SQL。
我不确定你具体想做什么,但这里有一个例子可能会有所帮助...根据需要修改
special_access {
if ("%{Called-Station-ID}" == 'special device') {
if ("%{sql:SELECT special_priv FROM table WHERE username = '%{User-Name}'}" != '1') {
reject
}
}
}
答案2
感谢我在http://linotp.org/doc/2.6/part-installation/integration/index.html如果您使用 MySQL 数据库中的 nas 表,则可以使用以下配置。nas
表中每个设备组都有 IP 范围,因此如果您的设备位于特定 IP 范围内,则将使用该策略:
mysql> SELECT * FROM nas WHERE is = '1';
+----+------------------+-------------+-------+------------+----------------------------------+
| id | nasip | shortname | type | secret | description |
+----+------------------+-------------+-------+------------+----------------------------------+
| 1 | 192.168.1.0/24 | restricted | other | ********* | only some users have access |
+----+------------------+-------------+-------+------------+----------------------------------+
在文件中sites-enabled/default
您参考了该政策;
authorize {
...
update request {
FreeRADIUS-Client-Shortname = "%{Client-Shortname}"
}
my_policy
...
}
并在其中policy.conf
写下您的政策。此政策首先检查nas
表格中的受限制的前缀,然后检查用户是否有足够的权限
...
my_policy {
if (FreeRadius-Client-Shortname =~ /^restricted/) {
if ("%{sql:SELECT moreaccess FROM radusergroup WHERE username = '%{User-Name}'}" != '1') {
update reply {
Cisco-AVPair := "shell:priv-lvl=1"
}
}
}
}
...
当然,radusergroup
您在 SQL 查询中引用的表中添加了一个额外的列,以便特定用户拥有额外的权限。
mysql> SELECT * FROM radusergroup WHERE username like 'peter%';
+------------------+--------------+----------+------------+
| username | groupname | priority | moreaccess |
+------------------+--------------+----------+------------+
| peter | super-rights | 1 | NULL |
| peter1 | super-rights | 1 | 1 |
| peter2 | super-rights | 1 | 0 |
+------------------+--------------+----------+------------+
在这种情况下,我这样写了政策;
- 通常已经获得高权限:
Cisco-AVPair := "shell:priv-lvl=15"
- 因此,如果用户在这种情况下拥有“1”,
peter1
则只是获得正常权利。 - 如果用户没有‘1’(
!= '1'
),则将获得策略中提到的权利。update reply
您可以使用而不是reject
完全阻止此用户(peter
和peter2
)的访问。
它可能变得非常复杂,但对我来说这有效。