===== Настройка атрибутов на основе 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. Дальнейшую конфигурацию (вплоть до п.18) мы будем производить в файле ///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//. ;#; {{::radius_ad_user_ldap.jpg?direct&400|}} ;#; 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-формате можно следующим образом: из хранилища сертификатов Windows сделать экспорт, при экспорте выбрать //"Base-64 encoded X.509 (.CER)"//. После выгрузки можно просто переименовать расширение сертиификата в pem. 18. Теперь в файле ///etc/freeradius/3.0/sites-enabled/default// в секции //post-auth// можно писать правила, которые будут суммировать списки доступа на основании членства в группах (//"test-network"//, //"management-network"// и т.д.), используя аттрибут **LDAP-Group**: 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", } } 19. Данную схему удобно использовать, к примеру, для раздачи доступов пользователям OpenVPN. В pfSense проверить проверить добавление правил можно использовав пункт меню status->openvpn. Кликнув на информацию о сеансе - можно увидеть правла, если всё сделано верно. ;#; {{::pf_sense_radius_rules_ovpn.jpg?direct&400|}} ;#; {{tag>Debian Linux freeradius NPS LDAP pfSense ActiveDirectory}}