FreeRADIUS 策略用于限制某些用户尝试登录特定设备

FreeRADIUS 策略用于限制某些用户尝试登录特定设备

我拥有的:debian 上的 freeradius 2.1.10,配置为使用数据库。

现在如何运作:网络上有许多设备和用户,用户登录设备进行配置等等。用户可以登录任何设备。例如,某些设备(思科)radius 上的用户帐户附带权限(cisco-avpair属性),限制个人在思科设备上可以做什么和不能做什么。

我希望 freeradius 做什么添加,针对特定的特殊情况:有一种特殊设备,只有选定的用户才能进行身份验证。其他人应该被拒绝访问。(因此,比上面的思科示例更严格)。

我认为我应该做的是首先定义我自己的属性,例如,company-special-privilege以便我可以为数据库中的某些用户设置该属性,其值为01。然后在 中定义一些策略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.confpolicy {}。然后,您可以像引用普通模块一样引用它们(通过其名称),在授权、验证、后验证等中...

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完全阻止此用户(peterpeter2)的访问。

它可能变得非常复杂,但对我来说这有效。

相关内容