FreeRADIUS策略限制某些用户尝试login特定设备

我有什么 :在debian上freeradius 2.1.10,configuration为使用数据库。

现在如何工作的 :networking上有很多设备和用户,用户login设备进行configuration等等。 用户可以login到任何东西。 例如,某些设备(ciscos)在radius上的用户帐户随同特权( cisco-avpair属性)一起限制了个人在cisco设备上可以执行和不能执行的操作。

此外,我想freeradius做一个特定的特殊情况 :有一个特殊的设备,只有select用户应该能够进行身份validation。 其他人应该被拒绝访问。 (所以,比上面的cisco示例更严格)。

我想我应该做的是首先定义我自己的属性,例如company-special-privilege以便我可以为数据库中的某些用户设置值为01的值。 然后在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"
  • 因此,如果用户在这种情况下具有“1”, peter1只是获得正常的权利。
  • 如果用户没有“1”( != '1' ),那么它将得到保单中提到的权利。
    • 而不是使用update reply你可以使用reject来完全阻止这个( peterpeter2 )用户的访问。

它可以变得安静复杂,但这对我有用。