Sudo/Domain

Материал из ALT Linux Wiki


Предназначение

В доменной среде удобно размещать правила sudo не в виде отдельных файлов в /etc/sudoers.d, а хранить их в LDAP каталоге. Именно это реализовано при использовании домена на базе FreeIPA. Но и в среде AD/Samba такая же возможность присутствует и не сложна в настройке. Ниже я опишу 2 варианта конфигурации исходя из того на базе чего поднят домен.

Для того, чтобы иметь возможность хранить правила sudo в LDAP, нужно расширить текущую схему добавив класс sudoRole и его атрибуты.

Формат правил sudo

Класс sudoRole предоставляет множество опций задания правил. Самые базовые это sudoCommand, sudoHost, sudoUser. Кроме этого доступны также sudoOption, sudoRunAsUser, sudoRunAsGroup, sudoNotBefore, sudoNotAfter и т.п.

Таким образом, правило с именем run-coreutils разрешающее запускать /bin/ls, /usr/bin/cat для пользователя username1 и username2 на всех хостах без запроса пароля будет выглядеть примерно так

cn=run-coreutils,ou=sudoers,dc=test,dc=alt 
sudoCommand: /bin/ls
sudoCommand: /usr/bin/cat
sudoHost: ALL
sudoUser: username1
sudoUser: username2
sudoOption: !authenticate

Для задания имени пользователя можно использовать короткое имя (username1), длинное (username1@test.alt), числовой идентификатор (#12345678). Для группы перед именем указывается знак % - (%mygroup)

Изменение LDAP схемы

Схема LDAP для хранения правил sudo - https://github.com/sudo-project/sudo/blob/main/docs/schema.ActiveDirectory

Microsoft ActiveDirectory

Для MS AD все достаточно просто.

  1. Скачиваем файл схемы - https://raw.githubusercontent.com/sudo-project/sudo/main/docs/schema.ActiveDirectory
  2. В скачаном файле меняем DC=X на корень нашего домена (к примеру, DC=test,DC=alt)
  3. В консоли с правами доменного администратора, втягиваем схему командой
ldifde -i -f schema.ActiveDirectory -c "CN=Schema,CN=Configuration,DC=X" #schemaNamingContext

Для хранения правил рекомендуется создать подразделение OU=sudoers,DC=вашпуть

Для непосредственного создания правил, на стороне MS нужно использовать инструмент Редактирование ADSI в котором нужно создать объект класса sudoRole с соответствующими атрибутами.

Samba DC

Не смотря на всю схожесть с AD, конфигурация данного решения требует некоторых корректив.

Для начала скачаем файл схемы

[root@dc ~]#  wget  https://raw.githubusercontent.com/sudo-project/sudo/main/docs/schema.ActiveDirectory

Желательно привести его "внутренний мир" к *nix стандарту

[root@dc ~]# dos2unix schema.ActiveDirectory

Заменим DC=X на реальный путь, в нашем случае DC=test,DC=alt

sed -i 's/DC=X/DC=test,DC=alt/g' schema.ActiveDirectory

Теперь необходимо исходный файл разделить на две части

[root@dc ~]#  head -$(grep -B1 -n '^dn:$' schema.ActiveDirectory | head -1 | grep -oP '\d+') schema.ActiveDirectory > first.ldif
[root@dc ~]#  tail +$(grep -B1 -n '^dn:$' schema.ActiveDirectory | head -1 | grep -oP '\d+') schema.ActiveDirectory | sed '/^-/d' > second.ldif

После чего сделать бэкап/снапшот ВМ, применить изменения схемы

[root@dc ~]# ldbadd -H /var/lib/samba/private/sam.ldb first.ldif --option="dsdb:schema update allowed"=true
Added 10 records successfully
[root@dc ~]# ldbmodify -v -H /var/lib/samba/private/sam.ldb second.ldif --option="dsdb:schema update allowed"=true
Modified 
Modified CN=sudoRole,CN=Schema,CN=Configuration,DC=test,DC=alt
Modified 2 records successfully

Схема расширена, класс с атрибутами добавлен.

Создадим подразделение, для хранения правил

[root@dc ~]# samba-tool ou add 'ou=sudoers'

Теперь нужно создать тестовое правило. На текущий момент нативных графических или консольных инструментов для этого не найдено, предлагаю делать через ldif файл.

Создадим его. Из полей все ясно, что к чему

dn: CN=run-apt,OU=sudoers,DC=test,DC=alt
changetype: add
objectClass: top
objectClass: sudoRole
cn: run-apt
name: run-apt
sudoUser: domainuser1
sudoHost: ALL
sudoCommand: /usr/bin/apt-get

Импортируем это правило

[root@dc ~]# ldbadd -H /var/lib/samba/private/sam.ldb sudoRole-object.ldif
Added 1 records successfully

Можно проверить с помощью ldapsearch

[user@dc /tmp]$ ldapsearch -LLL -Y GSSAPI -h localhost -b ou=sudoers,dc=test,dc=alt '(cn=run-apt)' 
SASL/GSSAPI authentication started
SASL username: da-01@TEST.ALT
SASL SSF: 56
SASL data security layer installed.
dn: CN=run-apt,OU=sudoers,DC=test,DC=alt
objectClass: top 
objectClass: sudoRole
cn: run-apt
instanceType: 4
whenCreated: 20231130073526.0Z
uSNCreated: 10579
name: run-apt
objectGUID:: 3KvR7QAQOkONbk8ZV5F23g==
objectCategory: CN=sudoRole,CN=Schema,CN=Configuration,DC=test,DC=alt
sudoUser: domainuser1
sudoHost: ALL
sudoCommand: /usr/bin/apt-get
whenChanged: 20231130111213.0Z
uSNChanged: 10623
distinguishedName: CN=run-apt,OU=sudoers,DC=test,DC=alt

Редактировать правила, можно теперь и в admc

Admc-sudorole.png

На этом можно было бы закончить, если бы не одна проблема. На вновь созданные правила установлены неверные аттрибуты, и sssd не сможет их найти и получить. Атрибуты задаются в формате SDDL, и выглядят примерно так

[root@dc user]# samba-tool dsacl get --objectdn='CN=run-apt,OU=sudoers,DC=test,DC=alt'
descriptor for CN=run-apt2,OU=sudoers,DC=test,DC=alt:
O:DAG:DAD:AI(OA;CIIOID;RP;4c164200-20c0-11d0-a768-00aa006e0529;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIIOID;RP;4c164200-20c0-11d0-a768-00aa006e0529;bf967aba-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;RP;5f202010-79a5-11d0-9020-00c04fc2d4cf;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIIOID;RP;5f202010-79a5-11d0-9020-00c04fc2d4cf;bf967aba-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;RP;bc0ac240-79a9-11d0-9020-00c04fc2d4cf;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIIOID;RP;bc0ac240-79a9-11d0-9020-00c04fc2d4cf;bf967aba-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;RP;59ba2f42-79a2-11d0-9020-00c04fc2d3cf;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIIOID;RP;59ba2f42-79a2-11d0-9020-00c04fc2d3cf;bf967aba-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;RP;037088f8-0ae1-11d2-b422-00a0c968f939;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIIOID;RP;037088f8-0ae1-11d2-b422-00a0c968f939;bf967aba-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;RP;b7c69e6d-2cc7-11d2-854e-00a0c983f608;bf967a86-0de6-11d0-a285-00aa003049e2;ED)(OA;CIIOID;RP;b7c69e6d-2cc7-11d2-854e-00a0c983f608;bf967a9c-0de6-11d0-a285-00aa003049e2;ED)(OA;CIIOID;RP;b7c69e6d-2cc7-11d2-854e-00a0c983f608;bf967aba-0de6-11d0-a285-00aa003049e2;ED)(OA;CIIOID;RPLCLORC;;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIIOID;RPLCLORC;;bf967a9c-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;RPLCLORC;;bf967aba-0de6-11d0-a285-00aa003049e2;RU)(OA;CIID;RPWPCR;91e647de-d96f-4b70-9557-d63ff4f3ccd8;;PS)(A;CIID;RPWPCRCCDCLCLORCWOWDSDDTSW;;;EA)(A;CIID;LC;;;RU)(A;CIID;RPWPCRCCLCLORCWOWDSDSW;;;BA)S:AI(OU;CIIOIDSA;WP;f30e3bbe-9ff0-11d1-b603-0000f80367c1;bf967aa5-0de6-11d0-a285-00aa003049e2;WD)(OU;CIIOIDSA;WP;f30e3bbf-9ff0-11d1-b603-0000f80367c1;bf967aa5-0de6-11d0-a285-00aa003049e2;WD)

Не очень читабельно для человека. Нам нужно добавить два разрешения которые тут отсутствуют. Прямой и очевидный путь говорит нам использовать samba-tool dsacl set ... , но увы это не работает. Идем обходным путем, меняя атрибут ntSecurityDescriptor последовательно выполняя нижеприведенные команды

[root@dc user]# echo -e "dn: CN=run-apt,OU=sudoers,DC=test,DC=alt\nchangetype: modify\nreplace: nTSecurityDescriptor" > ntGen.ldif 
[root@dc user]# ldbsearch  -H /var/lib/samba/private/sam.ldb -s base -b 'CN=run-apt,OU=sudoers,DC=test,DC=alt' 'nTSecurityDescriptor' | sed -n '/^#/d;s/O:DAG:DAD:AI/O:DAG:DAD:AI\(A\;\;RPLCRC\;\;\;AU\)\(A\;\;RPWPCRCCDCLCLORCWOWDSDDTSW\;\;\;SY\)/;3,$p' | sed ':a;N;$!ba;s/\n\s//g' | sed -e 's/.\{78\}/&\n /g' >> ntGen.ldif

Получили новый атрибут в файл ntGen.ldif

[root@dc user]# cat ntGen.ldif
dn: CN=run-apt,OU=sudoers,DC=test,DC=alt
changetype: modify
replace: nTSecurityDescriptor
nTSecurityDescriptor: O:DAG:DAD:AI(A;;RPLCRC;;;AU)(A;;RPWPCRCCDCLCLORCWOWDSDDT
 SW;;;SY)(A;;RPLCRC;;;AU)(A;;RPWPCRCCDCLCLORCWOWDSDDTSW;;;SY)(OA;CIIOID;RP;4c16
 4200-20c0-11d0-a768-00aa006e0529;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;C
 IIOID;RP;4c164200-20c0-11d0-a768-00aa006e0529;bf967aba-0de6-11d0-a285-00aa0030
 49e2;RU)(OA;CIIOID;RP;5f202010-79a5-11d0-9020-00c04fc2d4cf;4828cc14-1437-45bc-
 9b07-ad6f015e5f28;RU)(OA;CIIOID;RP;5f202010-79a5-11d0-9020-00c04fc2d4cf;bf967a
 ba-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;RP;bc0ac240-79a9-11d0-9020-00c04f
 c2d4cf;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIIOID;RP;bc0ac240-79a9-11d
 0-9020-00c04fc2d4cf;bf967aba-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;RP;59ba
 2f42-79a2-11d0-9020-00c04fc2d3cf;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;C
 IIOID;RP;59ba2f42-79a2-11d0-9020-00c04fc2d3cf;bf967aba-0de6-11d0-a285-00aa0030
 49e2;RU)(OA;CIIOID;RP;037088f8-0ae1-11d2-b422-00a0c968f939;4828cc14-1437-45bc-
 9b07-ad6f015e5f28;RU)(OA;CIIOID;RP;037088f8-0ae1-11d2-b422-00a0c968f939;bf967a
 ba-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;RP;b7c69e6d-2cc7-11d2-854e-00a0c9
 83f608;bf967a86-0de6-11d0-a285-00aa003049e2;ED)(OA;CIIOID;RP;b7c69e6d-2cc7-11d
 2-854e-00a0c983f608;bf967a9c-0de6-11d0-a285-00aa003049e2;ED)(OA;CIIOID;RP;b7c6
 9e6d-2cc7-11d2-854e-00a0c983f608;bf967aba-0de6-11d0-a285-00aa003049e2;ED)(OA;C
 IIOID;RPLCLORC;;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIIOID;RPLCLORC;;b
 f967a9c-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;RPLCLORC;;bf967aba-0de6-11d0
 -a285-00aa003049e2;RU)(OA;CIID;RPWPCR;91e647de-d96f-4b70-9557-d63ff4f3ccd8;;PS
 )(A;CIID;RPWPCRCCDCLCLORCWOWDSDDTSW;;;EA)(A;CIID;LC;;;RU)(A;CIID;RPWPCRCCLCLOR
 CWOWDSDSW;;;BA)S:AI(OU;CIIOIDSA;WP;f30e3bbe-9ff0-11d1-b603-0000f80367c1;bf967a
 a5-0de6-11d0-a285-00aa003049e2;WD)(OU;CIIOIDSA;WP;f30e3bbf-9ff0-11d1-b603-0000
 f80367c1;bf967aa5-0de6-11d0-a285-00aa003049e2;WD)

Осталось его применить

[root@dc user]# ldbmodify -v -H /var/lib/samba/private/sam.ldb ntGen.ldif
Modified CN=run-apt,OU=sudoers,DC=test,DC=alt
Modified 1 records successfully

И переходить к настройке клиентской части т.е. непосредственно службы sssd

Настройка клиентской части

  • Для того чтобы правила sudo из LDAP можно было использовать нужно установить пакет libsss_sudo
apt-get update; apt-get install libsss_sudo
  • Сконфигурировать службу sssd (/etc/sssd/sssd.conf)
[sssd]
services = nss,pam,sudo
....
[domain/TEST.ALT]
sudo_provider = ad
#ad_sudo_search_base не обязателен если вместо samba используется ms ad 
ad_sudo_search_base = ou=sudoers,dc=test,dc=alt
  • Добавить в /etc/nsswitch.conf
sudoers: files sss

Отладка

чуть позже..

Примечания

Все это работает при использовании sssd. В случае использования winbind, вероятно, придется пересобирать sudo с поддержкой ldap (получив в награду небезопасное решение).

Ссылки по теме

  1. https://github.com/sudo-project/sudo/blob/main/docs/schema.ActiveDirectory
  2. https://learn.microsoft.com/ru-ru/windows/win32/secauthz/sid-strings
  3. https://learn.microsoft.com/ru-ru/windows/win32/secauthz/security-descriptor-string-format
  4. https://learn.microsoft.com/ru-ru/windows/win32/secauthz/security-descriptor-definition-language-for-conditional-aces-