This is an old revision of the document!
Настройка атрибутов на основе LDAP (Active Directory) групп
На основе принадлежности пользователей к определенным группам AD - удобно раздавать сетевые правила доступа. При этом, в роли NPS Windows Server - решить данную задачу гибко не получится.
Политики NPS работают по принципу “first match”, т.е. мы не сможем суммировать правила для пользователя, состоящего в нескольких разных группах одновременно, ведь сработает только первое совпадение по группам.
Настройка LDAP во freeradius позволяет решить эту проблему достаточно гибко и безопасно. Для этого в данном примере мы будем использовать LDAPS и учётную запись с ограниченными правами в домене AD.
1. Устанавливаем модуль freeradius для работы с LDAP.
sudo apt install freeradius-ldap
2. Подключаем конфиг модуля из доступных модулей в используемые через симлинк.
ln -s /etc/freeradius/3.0/mods-available/ldap /etc/freeradius/3.0/mods-enabled/ldap
3. Дальнейшую конфигурацию мы будем производить в файле /etc/freeradius/3.0/mods-enabled/ldap.
4. Пропишем адрес контроллера домена следующим образом:
server = 'ldaps://dc01.arasaka.local:636'
Здесь можно указать адреса и других контроллеров домена, перечислив в отдельной секции server:
server = 'ldaps://dc02.arasaka.local:636'
Опцию port конфига исплользовать не нужно, т.к. он указан явно в опции server.
5. Настроим учётную запись, под которой будем подключаться к контроллеру домена.
identity = 'CN=vpn radius,OU=RADIUS,DC=arasaka,DC=local' password = mypassword
Важно: имя учётной записи (vpn radius) - это не логин пользователя в AD, а его CN, который можно посмотреть в свойствах учётной записи на вкладке Attribute Editor.
6. Настроим базовое пространство домена, откуда будет производиться дальнейший поиск:
base_dn = 'DC=arasaka,DC=local'
7. В секции “User object identifiication” изменим фильтр таким образом, чтобы он соответствовал фильтру AD, где используется аттрибут sAMAccountName, а не юниксовый uid.
filter = "(sAMAccountName=%{%{Stripped-User-Name}:-%{User-Name}})"
8. В секции “User membership checking” укажем OU домена AD, в котором будем искать группы для правил.
base_dn = 'CN=RADIUS,DC=office,DC=arasaka,DC=local'
9. В этой же секции поменяем аттрибут группы на group вместо юниксового posixGroup.
filter = '(objectClass=group)'
10. Раскомментируем опцию отличающего аттрибута группы:
name_attribute = cn
11. Раскомментируем опцию фильтра членства:
membership_filter = "(|(member=%{control:${..user_dn}})(memberUid=%{%{Stripped-User-Name}:-%{User-Name}}))"
12. Раскомментируем опцию аттрибута членства:
membership_attribute = 'memberOf'
13. Запретим кешироование имен и резрешим кеширование DN:
cacheable_name = 'no' cacheable_dn = 'yes'
14. Изменим стандартный аттрибут кеширования, раскомментировав строку:
cache_attribute = 'LDAP-Cached-Membership'
15. Для совместимости с AD обязательно оставим две опции (раскомментированы по умолчанию)
chase_referrals = yes rebind = yes
16. В секции tls отключаем starttls, т.к. он нужен только в случае использования tls поверх 389 порта, что в нашем случае не релевантно, поскольку мы используем SSL по 636.
start_tls = no
17. В этой же секции указываем путь к сертификату корневого УЦ, который выдал сертификат LDAPS серверам (контроллерам домена), а также путь к папке с сертификатами.
ca_file = ${certdir}/CA1.pem ca_path = ${certdir}
В папку /etc/freeradius/3.0/certs необходимо залить сертификат УЦ, а также сертификаты контроллером домена в pem-формате.
Выгрузить сертификаты в pem-формате можно следующим образом: из хранилища сертификатов сделать экспорт, при экспорте выбрать Base-64 encoded X.509 (.CER). После выгрузки можно просто переименовать сертиификат в pem.
18. Теперь в файле /etc/freeradius/3.0/sites-enabled/default в секции post-auth можно писать правила, которые будут суммировать списки доступа на основании членства в группах (test-network, management-network и т.д.):
if (&LDAP-Group[*] == "test-network") { update reply { Cisco-AVPair += "route=10.100.0.0 255.255.255.0", Cisco-AVPair += "route=10.101.0.0 255.255.255.0", Cisco-AVPair += "route=10.102.0.0 255.255.255.0", } if (&LDAP-Group[*] == "management-network") { update reply { Cisco-AVPair += "ip:inacl#93=permit ip any any" Cisco-AVPair += "route=0.0.0.0 0.0.0.0", } }