Что у меня есть: freeradius 2.1.10 на debian, настроен на использование базы данных.
Как это работает сейчас: В сети много устройств и пользователей, пользователи входят в устройства, чтобы настроить их, и так далее. Пользователи могут войти в систему во что угодно. Например, на некоторых устройствах (ciscos) учетная запись пользователя на radius имеет привилегии (cisco-avpair
атрибут), которые ограничивают то, что этот человек может и не может делать на устройствах cisco.
Что я хочу, чтобы freeradius делал в дополнение, для конкретного особого случая: Есть специальное устройство, на котором только избранные пользователи могут проходить аутентификацию. Всем остальным нужно просто запретить доступ. (так что более строго, чем пример cisco выше).
Я думаю, что мне следует сначала определить свой собственный атрибут, например 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, должен быть отклонен.
Вы должны положить это в 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
}
}
}
Благодаря некоторой информации, которую я нашел на http://linotp.org/doc/2.6/part-installation/integration/index.html вы можете использовать следующую конфигурацию, если используете таблицу nas в базе данных MySQL. в 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"
peter1
просто получает нормальные права. != '1'
), он получит право, указанное в политике. update reply
ты можешь использовать reject
чтобы полностью заблокировать доступ для этого (peter
и peter2
) пользователи. это может быть довольно сложно, но это работает для меня.