Настройка атрибутов на основе 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.
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. Кликнув на информацию о сеансе - можно увидеть правла, если всё сделано верно.