Данная статья применима к:

  • Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.7), РУСБ.10015-10
  • Astra Linux Special Edition РУСБ.10015-17
  • Astra Linux Special Edition РУСБ.10015-37 (очередное обновление 7.7)
  • Astra Linux Special Edition РУСБ.10015-03 (очередное обновление 7.6)
  • Astra Linux Special Edition РУСБ.10152-02 (очередное обновление 4.7)
  • Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.6)
  • Astra Linux Special Edition РУСБ.10015-16 исп. 1
  • Astra Linux Special Edition РУСБ.10015-16 исп. 2
  • Astra Linux Special Edition РУСБ.10265-01 (очередное обновление 8.1)
  • Astra Linux Common Edition 2.12

При вводе клиента в несколько доменов необходимо помнить, что:

  • В этих доменах могут быть пересекающиеся диапазоны пользовательских идентификаторов, что может позволить клиенту получать доступ к чужим данным;
  • В разных доменах под управлением Astra Linux Special Edition могут быть разные справочники мандатных атрибутов, что может позволить клиенту получать доступ к конфиденциальным данным, не соответствующим его уровню допуска;

Исходные данные

Стенд состоит из четырёх компьютеров:

  • Контроллер домена ipa0.ipadomain0.ru с IP-адресом 100.0.2.100. Это будет "основной" домен;
    • Клиент host0.ipadomain0.ru в "основном" домене ipadomain0.ru. В "чужом" домене этот клиент будет зарегистрирован под именем hostx.ipadomain1.ru;
  • Контроллер домена ipa0.ipadomain1.ru с IP-адресом 100.0.2.110. Это будет "чужой" домен;
    • Клиент host0.ipadomain1.ru в "чужом" домене ipadomain1.ru. С этого клиента будем копировать конфигурационные файлы. В принципе, конфигурационные файлы можно копировать и не с клиентской машины, а непосредственно с контроллера домена, но они могут отличаться от клиентских;

Обратите внимание - имена хостов, находящихся в  разных доменах (host0), в данном примере совпадают. Использовать одинаковые имена не обязательно, более того, это может быть нежелательно. Далее будет показано, как обойти возможный конфликт имён.

Дополнительно рекомендуется установить на все машины:

  • Пакеты dnsutils  и sssd-tools для проверки корректности работы сервиса разрешения имён (DNS) и сервиса SSSD:

    sudo apt install dnsutils sssd-tools

  • Службу ssh, которая позволит копировать файлы между машинами из командной строки:

    sudo apt install ssh
    sudo systemctl enable --now ssh


Настройка DNS

В первую очередь клиент "основного" домена должен получить доступ к разрешению IP-адресов "чужого" домена.

Проще всего это сделать, добавив зону перенаправления DNS в службу разрешения имён "основного" домена.

Эта операция выполняется на контроллере "основного" домена.

Добавление зоны перенаправления можно сделать через WEB-интерфейс FreeIPA:

  • "Сетевые службы" - "DNS" - "Зоны перенаправления DNS" - "Добавить";
  • В качестве имени зоны указать имя "чужого" домена и точка в конце (ipadomain1.ru.) ;
  • В поле "Перенаправители зон" добавить IP-адрес контроллера "чужого" домена (в примере - 10.0.2.110).

Или из командной строки на "основном" контроллере домена (тут точку к имени добавлять не нужно):

kinit admin
ipa dnsforwardzone-add ipadomain1.ru --forward-policy=first --forwarder=10.0.2.110

Проверка

Если всё сделано правильно, то на компьютерах, входящих в "основной" домен можно будет получить IP-адреса серверов и служб "чужого" домена, использовав для этого, например, команду host:

host ipa0.ipadomain1.ru

или (если установлен пакет dnsutils) разные варианты команды dig:

dig ipadomain1.ru
dig ipa0.ipadomain1.ru
dig SRV _ldap._tcp.ipadomain1.ru
dig SRV _kerberos._tcp.ipadomain1.ru


Настройка sssd

Выполнить настройку SSSD в "основном" домене проще всего скопировав секцию параметров домена из конфигурации SSSD "чужого" домена.

Кроме того, из "чужого" контроллера домена нужно скопировать файл сертификата /etc/ipa/ca.crt. В примере ниже он скопирован в файл /etc/ipa/ca-other.crt.
Если на контроллере "чужого" домена запущена служба ssh сделать это можно командой:

sudo scp -q admin@ipa0.ipadomain1.ru:/etc/ipa/ca.crt /etc/ipa/ca-other.crt

В конфигурации sssd (файл /etc/sssd/sssd.conf ) можно указать отдельное имя хоста, которое будет применяться в "чужом" домене (параметр ipa_hostname в секции "чужого" домена. В примере имя хоста host0 подменяется на имя hostx).

Если используется конфигурация sssd, скопированная не с "чужого" клиента, а  с"чужого" контроллера домена, то убрать параметр "ipa_server_mode = True" и в записи имён добавить параметр  "_srv_".

В секцию [sssd] добавить имя "чужого" домена.

Ниже примерный вид конфигурации, добавленные и изменённые параметры выделены шрифтом:

[domain/ipadomain0.ru]
    cache_credentials = True
    krb5_store_password_if_offline = True
    ipa_domain = ipadomain0.ru
    id_provider = ipa
    auth_provider = ipa
    access_provider = ipa
    ipa_hostname = _srv_, host0.ipadomain0.ru
    chpass_provider = ipa
    ipa_server = ipa0.ipadomain0.ru
    default_shell = /bin/bash
    ldap_tls_cacert = /etc/ipa/ca.crt

[domain/ipadomain1.ru]
    cache_credentials = True
    krb5_store_password_if_offline = True
    ipa_domain = ipadomain1.ru
    id_provider = ipa
    auth_provider = ipa
    access_provider = ipa
    ipa_hostname = hostx.ipadomain1.ru
    chpass_provider = ipa
    ipa_server = _srv_, ipa0.ipadomain1.ru
    default_shell = /bin/bash
    # ipa_server_mode = True # убрать если такая запись есть
    ldap_tls_cacert = /etc/ipa/ca-other.crt

[sssd]
services = sudo, nss, ifp, pam, ssh
domains = ipadomain0.ru, ipadomain1.ru

[nss]
memcache_timeout = 600
homedir_substring = /home

[pam]

[sudo]

[autofs]

[ssh]

[pac]

[ifp]
allowed_uids = 0, 33, 114, 999

[secrets]

[session_recording]


После внесения изменений в конфигурационный файл перезапустить службу sssd:

sudo systemctl restart sssd

Проверка

Если всё сделано правильно, то служба sssd должна перезапуститься без ошибок и начать обслуживать два домена:

sudo systemctl status sssd

● sssd.service - System Security Services Daemon
Loaded: loaded (/lib/systemd/system/sssd.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2020-02-06 13:45:07 MSK; 14min ago
Main PID: 5601 (sssd)
Tasks: 9 (limit: 4915)
CGroup: /system.slice/sssd.service
├─5601 /usr/sbin/sssd -i --logger=files
├─5603 /usr/lib/x86_64-linux-gnu/sssd/sssd_be --domain ipadomain0.ru --uid 0 --gid 0 --logger=files
├─5604 /usr/lib/x86_64-linux-gnu/sssd/sssd_be --domain ipadomain1.ru --uid 0 --gid 0 --logger=files
├─5605 /usr/lib/x86_64-linux-gnu/sssd/sssd_sudo --uid 0 --gid 0 --logger=files
├─5606 /usr/lib/x86_64-linux-gnu/sssd/sssd_nss --uid 0 --gid 0 --logger=files
├─5607 /usr/lib/x86_64-linux-gnu/sssd/sssd_ifp --uid 0 --gid 0 --logger=files
├─5608 /usr/lib/x86_64-linux-gnu/sssd/sssd_pam --uid 0 --gid 0 --logger=files
├─5609 /usr/lib/x86_64-linux-gnu/sssd/sssd_ssh --uid 0 --gid 0 --logger=files
└─5610 /usr/lib/x86_64-linux-gnu/sssd/sssd_pac --uid 0 --gid 0 --logger=files


Если установлен пакет sssd-tools, то можно использовать команду sssctl:

sudo sssctl domain-list

ipadomain0.ru
ipadomain1.ru


sudo sssctl domain-status ipadomain1.ru

Online status: Offline

Active servers:
IPA: ipa1.ipadomain1.ru

Discovered IPA servers:
- ipa1.ipadomain1.ru
- ipa1.ipadomain1.ru

Обратите внимание, на данном этапе cерверы "чужого" домена обнаружены, но сам домен находится в статусе "offline". Происходит это потому, что "чужой" домен не знает, что это за хост к нему обращается, и отказывается выдавать информацию.


Настройка Kerberos-авторизации хоста

Для настройки авторизации клиента через Kerberos нужно из "чужого" домена скопировать файлы сертификатов "чужого" домена, чтобы предъявлять их при подключении к этому домену. Это файлы:

  • /var/lib/ipa-client/pki/kdc-ca-bundle.pem
  • /var/lib/ipa-client/pki/ca-bundle.pem

В примере ниже сертификаты скопирован в файлы:

  • /var/lib/ipa-client/pki/kdc-ca-bundle-other.pem
  • /var/lib/ipa-client/pki/ca-bundle-other.pem

Если на клиенте в "чужом" домене запущена служба ssh, то файлы можно скопировать командами:

sudo scp -q admin@host0.ipadomain1.ru:/var/lib/ipa-client/pki/kdc-ca-bundle.pem /var/lib/ipa-client/pki/kdc-ca-bundle-other.pem
sudo scp -q admin@host0.ipadomain1.ru:/var/lib/ipa-client/pki/ca-bundle.pem /var/lib/ipa-client/pki/ca-bundle-other.pem

Проверка

Если всё сделано правильно, то на клиенте "основного" домена можно будет получать билеты Kerberos как "основного", так и "чужого" доменов:

kinit admin@IPADOMAIN1.RU
При этом можно одновременно иметь билеты двух доменов:
sudo klist -A

Ticket cache: KEYRING:persistent:0:krb_ccache_cY1rfoy
Default principal: admin@IPADOMAIN1.RU

Valid starting Expires Service principal
07.02.2020 11:17:51 08.02.2020 11:15:20 ldap/ipa0.ipadomain1.ru@IPADOMAIN1.RU
07.02.2020 11:17:51 08.02.2020 11:15:20 ldap/ipa0.ipadomain1.ru@
07.02.2020 11:16:45 08.02.2020 11:15:20 host/host0.ipadomain1.ru@IPADOMAIN1.RU
07.02.2020 11:16:45 08.02.2020 11:15:20 host/host0.ipadomain1.ru@
07.02.2020 11:15:22 08.02.2020 11:15:20 krbtgt/IPADOMAIN1.RU@IPADOMAIN1.RU

Ticket cache: KEYRING:persistent:0:0
Default principal: admin@IPADOMAIN0.RU

Valid starting Expires Service principal
07.02.2020 11:07:04 08.02.2020 11:07:04 krbtgt/IPADOMAIN0.RU@IPADOMAIN0.RU



Регистрация клиента в чужом домене и запуск службы SSSD

Для того, чтобы "чужой" контроллер домена выдавал хосту информацию, необходимо

  1. Зарегистрировать этот хост на "чужом" контроллере домена. Это можно сделать через WEB-интерфейс контроллера: "Идентификация" - "Узлы" - "Добавить", или из командной строки на "чужом" контроллере домена:

    kinit admin
    ipa host-add hostx.ipadomain1.ru --force
    В общем случае клиентская машина не имеет постоянного IP-адреса, поэтому регистрируем хост без IP-адреса (опция --force). 

  2. На хосте в таблицу ключей добавить ключ Kerberos для "чужого" домена:

    sudo kinit admin@IPADOMAIN1.RU
    sudo ipa-getkeytab -k /etc/krb5.keytab -s ipa0.ipadomain1.ru -p host/hostx.ipadomain1.ru@IPADOMAIN1.RU --cacert=/var/lib/ipa-client/pki/ca-bundle-other.pem
    где:
    -k /etc/krb5.keytab - таблица ключей, к которой будет добавлен новый ключ;
    -s ipa0.ipadomain1.ru - "чужой" сервер, от которого получаем ключ;
    -p host/hostX.ipadomain1.ru@IPADOMAIN1.RU - принципал, для которого получаем ключ;
    --cacert=/var/lib/ipa-client/pki/ca-bundle-other.pem - скопированный с "чужого" клиента "чужой" сертификат, который используем для подключения к "чужому" Kerberos.

После того, как хост зарегистрирован в Kerberos и получил ключ, следует перезапустить службу sssd, которая теперь сможет предъявить ключ хоста, и получить доступ к информации о домене:

sudo systemctl restart sssd

Проверка

Запись про наличие  ключа появится в записи о хосте  в WEB-интерфейсе "чужого" сервера, также наличие ключа можно проверить выполнением на самом хосте команды:

sudo klist -k /etc/krb5.keytab

Keytab name: FILE:/etc/krb5.keytab
KVNO Principal
---- --------------------------------------------------------------------------
2 host/host0.ipadomain0.ru@IPADOMAIN0.RU
3 host/hostx.ipadomain1.ru@IPADOMAIN1.RU

Если всё сделано правильно, то теперь статус домена в sssd должет быть "Online":

sudo sssctl domain-status ipadomain1.ru

Online status: Online

Active servers:
IPA: ipa0.ipadomain1.ru

Discovered IPA servers:
- ipa0.ipadomain1.ru
- ipa0.ipadomain1.ru

Кроме того, теперь можно получать информацию о клиентах разных доменов. Клиент "основного" домена ipadomain0.ru:
id ipauser01

uid=96001(ipauser01) gid=96001(ipauser01) группы=96001(ipauser01)
Клиент "чужого" домена ipadomain1.ru:
id ipauser11

uid=312001(ipauser11) gid=312001(ipauser11) группы=312001(ipauser11)
И, после всего этого, должен стать возможен вход пользователей "чужого" домена.


Диагностика проблем

В случае возникновения проблем с подключением следует включить отладочную диагностику в службе sssd, для чего добавить параметр

debug_level = 0x37F0

в секцию настроек "чужого" домена в конфигурационном файле /etc/sssd/sssd.conf и перезапустить службу sssd. Отладочную информацию искать в каталоге /var/log/sssd в файле с названием, сответствующим имени домена.

Включить добавочную диагностику при получении билетов Kerberos командой kinit можно так:

KRB5_TRACE=/dev/stdout kinit -V admin@IPADOMAIN1.RU