我有什么 :在debian上freeradius 2.1.10,configuration为使用数据库。
现在是如何工作的 :networking上有很多设备和用户,用户login设备进行configuration等等。 用户可以login到任何东西。 例如,某些设备(ciscos)在radius上的用户帐户随同特权( cisco-avpair属性)一起限制了个人在cisco设备上可以执行和不能执行的操作。
此外,我想freeradius做一个特定的特殊情况 :有一个特殊的设备,只有select用户应该能够进行身份validation。 其他人应该被拒绝访问。 (所以,比上面的cisco示例更严格)。
我想我应该做的是首先定义我自己的属性,例如company-special-privilege以便我可以为数据库中的某些用户设置值为0或1的值。 然后在policy.conf定义一些策略。
我所问 :从来没有做过的政策,我不明白他们在freeradiusconfiguration的其余部分(我应该把我的special_access政策)应用在哪里。 也不确定如何制定它,但下面的伪代码应该代表我想要的:
special_access { if (request to log in $special_device_ip) { if ($username company-special-privilege) { reject # } } }
从上面我不知道如何获取设备的IP或用户设置的属性。 我没有做第二个条件属性中的== 1,以防用户没有属性,因为我不知道这将暗示什么,但是没有1的用户必须被拒绝。
你应该把它放在policy {}节里的raddb/policy.conf 。 然后,他们可以被引用(通过他们的名字),就像你正常的模块,在授权,validation,后validation等…
FreeRADIUS中的策略本质上是macros,它们不是函数,也不需要参数。
定义一个特殊的属性来控制策略决定是好的,在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 } } }
感谢我在http://linotp.org/doc/2.6/part-installation/integration/index.html上find的一些信息,如果您使用MySQL数据库中的nas表,则可以使用以下configuration。 在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" } } } } ...
当然,在您的SQL查询中引用的radusergroup表中,您可以添加一个额外的列,允许特定用户拥有额外的权限。
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" peter1只是获得正常的权利。 != '1' ),那么它将得到保单中提到的权利。
update reply你可以使用reject来完全阻止这个( peter和peter2 )用户的访问。 它可以变得安静复杂,但这对我有用。