20.09.2024

Аутентификация пользователей в OpenConnect VPN Server – AD, Kerberos

Аутентификация — это процесс подтверждения личности. Для сетевых взаимодействий аутентификация подразумевает идентификацию одной стороны другой стороной. Существует множество способов использования аутентификации в сетях: простые пароли, сертификаты, токены одноразовых паролей (OTP), биометрическое сканирование.

Аутентификация

Подготовка

Round-Robin записи в DNS для котроллеров домена Active Directory

У многих используется несколько котроллеров домена Active Directory.

В данном случае 2 контроллера dc1.notdev.local – 192.168.10.11 и dc2.notdev.local – 192.168.10.12. Для повышения отказоустойчивости работы сервисов которые нуждаются в указании конкретного сервера, соответствующие записи  Round-Robin, dc.notdev.local – 192.168.10.11 и dc.notdev.local – 192.168.10.12, что позволят указывать dc.notdev.local в роли сервера аутентификации.

PTR запись в DNS для VPN сервера

Создайте на DNS серверах, PTR-запись VPN сервера.

Для использования Kerberos-аутентификации необходимо убедиться, что на серверах DNS присутствует PTR-запись для каждого контроллера домена Active Directory.

Установить локальные DNS сервера

Отредактируйте nano /etc/resolv.conf

search notdev.local
nameserver 192.168.10.11
nameserver 192.168.10.12

Варианты установки

  • Установка и настройка отдельных служб Kerberos и SSSD
  • Установка и настройка только SSSD для использования нужного способа аутентификации, например: Kerberos, LDAP, AD DC, AD DC + Samba, FreeIPA и другие

Настройка OpenConnect VPN Server

Отредактируйте ocserv.conf согласно вашей конфигурации, nano /etc/ocserv/ocserv.conf

Для удалённых клиентов, которые не могут получить билет находясь за пределами организации с Active Directory или на мобильных устройствах. Используется PAM аутентификация. Для этого может потребуется настроить /etc/pam.d/ocserv. Ниже приведен конфигурации SSSD PAM + Kerberos.

auth = "pam"

Аутентификация с помощью билетов Kerberos. Кроме того, опция keytab явно устанавливает общий ключ OCServ с KDC.

Опция tgt-freshness-time указывает допустимое для аутентификации VPN время жизни билета Kerberos (TGT) в секундах. Пользователю придется проходить повторную аутентификацию, если это время будет превышено. По сути, это предотвращает использование VPN в течение всего времени жизни билета Kerberos. Опция require-local-user-map=true позволяет обращается не к локальному vpn.notdev.local имени сервера а к внешнему vpn.notdev.ru для осуществления аутентификации по билету Kerberos.

# без ограничений по времени жизни Kerberos ticket
enable-auth = "gssapi[keytab=/etc/host.keytab,require-local-user-map=true]"
# 24 часа
enable-auth = "gssapi[keytab=/etc/host.keytab,require-local-user-map=true,tgt-freshness-time=86400]"

Включение прокси-сервера MS-KKDCP на OCServ. Вам нужно будет заменить KERBEROS.REALM на вашу область и IP-адрес KDC. Этот прокси позволит клиенту получать билеты Kerberos через OCServ. Последний шаг необязателен, если ваши клиенты могут получать билеты другими способами.

kkdcp = /KdcProxy KERBEROS.REALM tcp@KDC-IP-ADDRESS:88

kkdcp = "/KdcProxy NOTDEV.LOCAL [email protected]:88"
kkdcp = "/KdcProxy NOTDEV.LOCAL [email protected]:88"

Обязательно ограничьте возможность авторизоваться на сервере по ssh с учетной записью, которая выдается для VPN пользователей

# Disable login to VPN server
default_shell = /usr/sbin/nologin
override_shell = /usr/sbin/nologin

Синхронизация времени с контроллером домена

apt install -y ntp ntpdate

Добавляем в секцию server ntp.your-provider.example свои сервера времени

Отредактируйте ntp.conf, для Debian 9/10/11 /etc/ntp.conf, а Debian 12 /etc/ntpsec/ntp.conf

# You do need to talk to an NTP server or two (or three).
#server ntp.your-provider.example
server dc1.notdev.local
server dc2.notdev.local

Останавливаем службу NTP, выполняем синхронизацию с указанным сервером и запускаем службу NTP.

service ntp stop
ntpdate dc.notdev.local
# ntpdate[10465]: adjust time server 192.168.10.11 offset +0.048560 sec

service ntp start

Состояние активного NTP-сервера отображается командой.

ntpq -p

#     remote         refid   st t  when   poll   reach   delay   offset  jitter
#==============================================================================
#-dc1.notdev.loc XX.XX.XX.XX  2 u   506   512     377    0.711   +52.723  6.169
#-dc2.notdev.loc YY.YY.YY.YY  3 u   474   512     377    1.148   +22.318  7.211

Создание keytab-файла для сервиса OCServ

Подключитесь к контроллеру домена Active Directory. В оснастке Domains Users and Computers создайте пользователя с именем ocserv с паролем qwerty123. Запустите командную строку или PowerShell от имени администратора и выполните одну из команд.

Достаточно создать keytab-файл используя шифрование RC4-HMAC-NT

ktpass -princ HOST/[email protected] -mapuser [email protected] -pass qwerty123 -crypto RC4-HMAC-NT -ptype KRB5_NT_PRINCIPAL -out host.keytab

Но можно создать используя все доступные алгоритмы для большей совместимости

ktpass -princ HOST/vpn[email protected] -mapuser ocserv@NOTDEV.LOCAL -pass qwerty123 -crypto ALL -ptype KRB5_NT_PRINCIPAL -out host.keytab

ktpass -princ HOST/<имя сервера с сервисом OCServ в нижнем регистре>@<realm Active Directory в верхнем регистре> -mapuser ocserv@<realm Active Directory в верхнем регистре> -crypto <тип шифрования, рекомендуется указать RC4-HMAC-NT или ALL для совместимости> -ptype KRB5_NT_PRINCIPAL -pass <пароль пользователя ocserv> -out host.keytab

Должен быть ТОЛЬКО ОДИН пользователь, сопоставленный одной записью SPN (HOST/<имя сервера с сервисом OCServ в нижнем регистре>@<realm Active Directory в верхнем регистре>). Если несколько разных пользователей сопоставленных с записью SPN, то проверка подлинности Kerberos будет ВСЕГДА НЕУДАЧНОЙ.

Скопируйте файл host.keytab в директорию /etc/

SSSD – System Security Services Daemon

SSSD — это системный демон. Его основная функция — предоставление доступа к локальным или удаленным ресурсам идентификации и аутентификации через общую структуру, которая может обеспечить кэширование и офлайн-поддержку системы. Он предоставляет несколько интерфейсов, включая модули NSS и PAM или интерфейс D-Bus.

Ключевая настройка SSSD может комбинироваться, рекомендуется использовать Kerberos + SSSD, в секции домена рекомендуется дополнительно указать блок подключения krb5 описанный в 2. Вариант Установка и настройка только SSSD. Поверх данной настройки можно добавить двухфакторную проверку подлинности.

При использовании аутентификации Kerberos можно использовать фильтры simple, ad и ladp при соответствующей настройке фильтров и сопутствующих параметров.

Многие используют Kerberos+Samba+SSSD, но использование Samba и добавление сервера к контроллеру домена Active Directory может добавить некоторые неудобства при восстановлении из резервной копий или других проблемах с доступностью DC. Исключив использование Samba можно упростить работу с учетными записями в контроллере домена Active Directory.

1. Вариант установки Kerberos + SSSD

Установка и настройка Kerberos

apt install -y krb5-config krb5-user libsasl2-modules-gssapi-mit ldap-utils

Резервная копия конфигурации Kerberos

cp /etc/krb5.conf{,.bak}

Отредактируйте nano /etc/krb5.conf

[libdefaults]
    default_realm = NOTDEV.LOCAL
    default_keytab_name = /etc/host.keytab
    dns_lookup_kdc = yes
    dns_lookup_realm = yes
    kdc_timesync = 1
    ccache_type = 4
    ticket_lifetime = 24h
    forwardable = true
    proxiable = true
    # Windows 2003
    #default_tgs_enctypes = rc4-hmac des-cbc-crc des-cbc-md5
    #default_tkt_enctypes = rc4-hmac des-cbc-crc des-cbc-md5
    #permitted_enctypes = rc4-hmac des-cbc-crc des-cbc-md5
    # Windows 2008 with AES
    default_tgs_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
    default_tkt_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
    permitted_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
    # Windows 2012 R2 with DES3
    #default_tgs_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5 des3-hmac-sha1
    #default_tkt_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5 des3-hmac-sha1
    #permitted_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5 des3-hmac-sha1

[realms]
    NOTDEV.LOCAL = {
        kdc = dc1.notdev.local
        kdc = dc2.notdev.local
        admin_server = dc1.notdev.local
        admin_server = dc2.notdev.local
        default_domain = notdev.local
auto_to_local = DEFAULT } [domain_realm] .notdev.local = NOTDEV.LOCAL notdev.local = NOTDEV.LOCAL
.NOTDEV.LOCAL = NOTDEV.LOCAL
NOTDEV.LOCAL = NOTDEV.LOCAL

Проверка аутентификации

kinit [email protected]
#Password for [email protected]: klist
#Ticket cache: FILE:/tmp/krb5cc_0 #Default principal: [email protected] # #Valid starting Expires Service principal #04/21/2022 19:36:42 07/15/2024 05:36:42 krbtgt/[email protected] #renew until 07/15/2024 19:36:36 kdestroy

 

kinit -Vvkt /etc/host.keytab HOST/[email protected]

#Using default cache: /tmp/krb5cc_0

#Using principal: HOST/[email protected]
#Using keytab: /etc/host.keytab
#Authenticated to Kerberos v5

kinit -kV -p HOST/vpn.notdev.local
#Using default cache: /tmp/krb5cc_0 #Using principal: HOST/[email protected] #Authenticated to Kerberos v5 klist
#Ticket cache: FILE:/tmp/krb5cc_0 #Default principal: HOST/[email protected] # #Valid starting Expires Service principal #04/21/2022 19:46:46 07/15/2024 05:46:46 krbtgt/[email protected] #renew until 07/15/2024 19:46:46

klist -k -e

#Keytab name: FILE:/etc/host.keytab
#KVNO Principal
#---- --------------------------------------------------------------------------
#3 HOST/[email protected] (DEPRECATED:des-cbc-crc)
#3 HOST/[email protected] (DEPRECATED:des-cbc-md5)
#3 HOST/[email protected] (DEPRECATED:arcfour-hmac)
#3 HOST/[email protected] (aes256-cts-hmac-sha1-96)
#3 HOST/[email protected] (aes128-cts-hmac-sha1-96)
kdestroy

Установка и настройка SSSD

SSD предоставляет набор демонов для управления доступом к удаленным каталогам и механизмам аутентификации, таким как LDAP, Kerberos или FreeIPA. Он предоставляет интерфейс NSS и PAM к системе и подключаемую внутреннюю систему для подключения к нескольким различным источникам учетных записей.

apt install -y sssd sssd-ad sssd-krb5 sssd-ldap sssd-tools

Создать конфигурационный файл и назначить корректные права

touch /etc/sssd/sssd.conf
chmod 600 /etc/sssd/sssd.conf

Минимальная конфигурация для работы с Kerberos, в  параметрах domains и ad_domain указываем домен который указывали в настройках Kerberos /etc/krb5.conf в default_realm.

nano /etc/sssd/sssd.conf

[sssd]
services = nss, pam
domains = NOTDEV.LOCAL
config_file_version = 2
debug_level = 1

[domain/NOTDEV.LOCAL]
ad_domain = NOTDEV.LOCAL
ad_server = dc.notdev.local
ad_backup_server = dc1.notdev.local, dc2.notdev.local
ad_hostname = vpn.notdev.local

# Disable enumeration to improve processing speed
enumerate = false

id_provider = ad
auth_provider = ad
# Disallows password changes
chpass_provider = none

# Restrict authorization only if the user is a member of a group
# via access provider = ad
#access_provider = ad
#ad_access_filter = (memberOf=cn=vpn,dc=notdev,dc=local)
# FIX [ad_gpo_access_done] (0x0040): GPO-based access control failed
#ad_gpo_access_control = disabled

# via access provider = simple
#access_provider = simple
#simple_allow_groups = [email protected]

# NOT cache credentials
cache_credentials = false

# Home dir
fallback_homedir = /home/%d/%u
override_homedir = /home/%d/%u

# Disable login to VPN server
default_shell = /usr/sbin/nologin
override_shell = /usr/sbin/nologin

debug_level = 1

[nss]
entry_negative_timeout = 0
debug_level = 1

[pam]
debug_level = 1

Проверка аутентификации

getent passwd vpn-test-user

#vpn-test-user:*:1173202995:1173200513:vpn-test-user:/home/NOTDEV.LOCAL/vpn-test-user:/usr/sbin/nologin

2. Вариант установки только SSSD

SSD предоставляет набор демонов для управления доступом к удаленным каталогам и механизмам аутентификации, таким как LDAP, Kerberos или FreeIPA. Он предоставляет интерфейс NSS и PAM к системе и подключаемую внутреннюю систему для подключения к нескольким различным источникам учетных записей.

apt install -y sssd sssd-ad sssd-krb5 sssd-ldap sssd-tools

Создать конфигурационный файл и назначить корректные права

touch /etc/sssd/sssd.conf
chmod 600 /etc/sssd/sssd.conf

Минимальная конфигурация для работы с Kerberos, в  параметрах domains и ad_domain указываем домен который указывали в Kerberos в default_realm.

nano /etc/sssd/sssd.conf

[sssd]
services = nss, pam
domains = NOTDEV.LOCAL
config_file_version = 2
debug_level = 1

[domain/NOTDEV.LOCAL]
ad_domain = NOTDEV.LOCAL
ad_server = dc.notdev.local
ad_backup_server = dc1.notdev.local, dc2.notdev.local
ad_hostname = vpn.notdev.local

# Disable enumeration to improve processing speed
enumerate = false

id_provider = ad
auth_provider = ad
# Disallows password changes
chpass_provider = none

krb5_realm = NOTDEV.LOCAL
krb5_server = dc.notdev.local
krb5_backup_server = dc1.notdev.local, dc2.notdev.local
krb5_validate = true
krb5_keytab = /etc/host.keytab
krb5_store_password_if_offline = false

# Restrict authorization only if the user is a member of a group
# via access provider = ad
#access_provider = ad
#ad_access_filter = (memberOf=cn=vpn,dc=notdev,dc=local)
# FIX [ad_gpo_access_done] (0x0040): GPO-based access control failed
#ad_gpo_access_control = disabled

# via access provider = simple
#access_provider = simple
#simple_allow_groups = [email protected]

# NOT cache credentials
cache_credentials = false

# Home dir
fallback_homedir = /home/%d/%u
override_homedir = /home/%d/%u

# Disable login to VPN server
default_shell = /usr/sbin/nologin
override_shell = /usr/sbin/nologin

debug_level = 1

[nss]
entry_negative_timeout = 0
debug_level = 1

[pam]
debug_level = 1

Проверка аутентификации

getent passwd vpn-test-user

#vpn-test-user:*:1173202995:1173200513:vpn-test-user:/home/NOTDEV.LOCAL/vpn-test-user:/usr/sbin/nologin

Контроль доступа

Рекомендуемый способ подключения клиента GNU/Linux к домену Active Directory — использование поставщика AD . Однако в конфигурации поставщика Active Directory по умолчанию проверяется только истечение срока действия учетной записи. Очень часто администратору необходимо дополнительно ограничить доступ к клиентской станции, ограничив доступ определенным пользователем, группой пользователей или используя какой-либо другой механизм фильтрации. Для этого администратору необходимо использовать альтернативного поставщика контроля доступа. Однако ни один из альтернативных вариантов не обеспечивает полную требуемую функциональность для всех пользователей, разрешенных поставщиком AD, более того, их сложно настроить. Эта страница дизайна предлагает расширение поставщика доступа AD для решения этих проблем.

Simple

Поставщик простого доступа предоставляет или запрещает доступ на основе содержимого списков разрешений и запретов. Существуют отдельные списки для имен пользователей и групп, а также разрешенных и запрещенных объектов.

Пример: Конфигурация, которая предоставляет доступ пользователю с именем tux и группе с именем vpn.

access_provider = simple
simple_allow_users = tux
simple_allow_groups = vpn@notdev.local

Плюсы:

  • Легко настроить
  • Realmd предоставляет интерфейс для настройки простого провайдера доступа с помощью CLI

Минусы:

  • Срок действия аккаунта не проверяется
  • Нет возможности объединить несколько предложений
  • Не соответствует структуре LDAP, используемой Active Directory

LDAP

Поставщик доступа LDAP предлагает способ настройки решения о контроле доступа на основе соответствия пользователя предварительно настроенному фильтру. Более того, поставщик доступа LDAP также предлагает цепочку других проверок на основе LDAP. Для среды AD применяется только проверка срока действия учетной записи.

Пример: Конфигурация, которая разрешает доступ тем пользователям, которые являются членами группы с именем vpn. И имеют допустимый домашний каталог, установленный с помощью ldap_access_filter директивы. Пользователи, которые соответствуют настроенному фильтру, также проверяются на предмет того, истек ли их срок действия ( ldap_access_order содержит expire).

ldap_schema = ad
ldap_id_mapping = true
ldap_sasl_mech = gssapi
ldap_sasl_authid = HOST/[email protected]
ldap_access_order = filter, expire
ldap_account_expire_policy = ad
ldap_krb5_init_creds = true

access_provider = ldap
ldap_access_filter = (memberOf=cn=vpn,dc=notdev,dc=local)

Плюсы:

  • Позволяет администратору основывать контроль доступа на настраиваемом фильтре LDAP, что позволяет комбинировать несколько условий
  • Условия не ограничиваются именами пользователей или членством в группах

Минусы:

  • Конфигурация должна включать несколько низкоуровневых настроек LDAP
  • Администратору необходимо объединить поставщиков AD и LDAP
  • Проверку срока действия учетной записи необходимо настраивать отдельно
  • Нет поддержки для пользователей из доверенных доменов AD
  • Нет интеграции с realmd

Поставщик доступа AD предлагает способ настройки решения о контроле доступа на основе соответствия пользователя предварительно настроенному фильтру. Который сначала сопоставит запись с фильтром ad_access_filter в этом параметре. Если запись совпадет, то учетная запись будет проверена на предмет истечения срока действия.

Пример: Конфигурация, которая разрешает доступ тем пользователям, которые являются членами группы с именем vpn. И имеют допустимый домашний каталог, установленный с помощью ad_access_filter директивы.

access_provider = ad
ad_access_filter = (memberOf=cn=vpn,dc=notdev,dc=local)
# Исправление ошибки [ad_gpo_access_done] (0x0040): GPO-based access control failed
ad_gpo_access_control = disabled

Плюсы:

  • Простая и интуитивно понятная настройка. Настраивается только один тип провайдера
  • Разумные настройки по умолчанию — всегда проверяет срок действия, а также проверяет фильтр доступа, если настроено соответствующим образом
  • Будет поддерживать пользователей и группы из доверенных доменов, используя существующую инфраструктуру поставщика AD

Минусы:

  • Нет интеграции с realmd

В имени группы возможно использование групп с пробелами и русскими символами, но у вас могут возникнуть проблемы

simple_allow_groups = Доступ [email protected]
ldap_access_filter = (memberOf=CN=Доступ VPN,DC=notdev,DC=local)
ad_access_filter = (memberOf=CN=Доступ VPN,DC=notdev,DC=local)

Дополнительные настройки


Дополнительная информация

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *