Исторически разрешения sudo регулировались содержимым файлов из /etc/sudoers.d И визудо , а авторизация по ключу осуществлялась с помощью ~/.
ssh/authorized_keys .
Однако по мере роста инфраструктуры возникает желание централизованно управлять этими правами.
Сегодня может быть несколько вариантов решения:
- Система управления конфигурациями - Шеф-повар , Кукольный , Анзибль , Соль
- Активный каталог + SSD
- Различные извращения в виде скриптов и ручного редактирования файлов
Преимущества этого подхода:
- Действительно единый централизованный каталог пользователей.
- Распределение прав судо сводится к добавлению пользователя в определенную группу безопасности.
- В случае различных систем Linux возникает необходимость введения дополнительных проверок для определения ОС при использовании систем конфигурации.
Итак, зал замер в напряженной тишине, дирижер поднял палочку, и оркестр приготовился.
Идти.
Данный:
- Домен Active Directory testopf.local на Windows Server 2012 R2.
- Хост Linux под управлением Centos 7
- Настроил авторизацию с помощью SSD
Хочу отметить, что все изменения целевые и по сути добавляют только необходимые атрибуты и классы.
Действие 1: контроль судо роли через Активный каталог .
Чтобы расширить схему Активный каталог вам нужно скачать последнюю версию судо — 1.8.27 на сегодняшний день.
Распакуйте и скопируйте файл схема.
ActiveDirectory из каталога .
/doc на контроллер домена.
Из командной строки с правами администратора из каталога, куда был скопирован файл, выполните:
(Не забудьте заменить свои значения) Открытие adiedit.msc и подключитесь к контексту по умолчанию: Создать подразделение в корне домена судоеры .ldifde -i -f schema.ActiveDirectory -c dc=X dc=testopf,dc=local
(Буржуазия упорно утверждает, что именно в этом подразделении демон SSD ищет предмет sudoRole объекты.
Однако после включения детальной отладки и изучения логов выяснилось, что поиск ведется по всему дереву каталогов.
) Создаем первый объект, принадлежащий классу в подразделении sudoRole .
Имя можно выбрать абсолютно произвольно, поскольку оно служит исключительно для удобной идентификации.
Среди возможных доступных атрибутов расширения схемы основными являются следующие:
- sudoCommand — определяет, какие команды разрешено выполнять на хосте.
- sudoHost — определяет, к каким хостам применяется эта роль.
Может быть указано как ВСЕ и для отдельного хоста по имени.
Также возможно использование маски.
- sudoUser — указать, каким пользователям разрешено выполнять судо .
Если вы указываете группу безопасности, добавьте знак «%» в начале имени.
Если в названии группы есть пробелы, беспокоиться не о чем.
Судя по логам, задачу выхода из пробелов берет на себя механизм SSD .
Рис.
1. Объекты sudoRole в подразделе sudoers в корне каталога
Рисунок 2. Членство в группах безопасности, указанных в объектах sudoRole.
Следующая настройка выполняется на стороне Linux.
В файле /etc/nsswitch.conf добавьте строку в конец файла: sudoers: files sss
В файле /etc/sssd/sssd.conf в разделе [сссд] добавить в услуги судо cat /etc/sssd/sssd.conf | grep services
services = nss, pam, sudo
После всех операций необходимо очистить кэш демона sssd. Автоматические обновления происходят каждые 6 часов, но зачем нам ждать так долго, если мы хотим этого сейчас? sss_cache -E
Часто бывает, что очистка кэша не помогает. Затем мы останавливаем службу, очищаем базу данных и запускаем службу.
service sssd stop
rm -rf /var/lib/sss/db/*
service sssd start
Подключаемся как первый пользователь и проверяем, что ему доступно по sudo: su user1
[user1@testsshad log]$ id
uid=1109801141(user1) gid=1109800513(domain users) groups=1109800513(domain users),1109801132(admins_)
[user1@testsshad log]$ sudo -l
[sudo] password for user1:
Matching Defaults entries for user1 on testsshad:
!visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin,
env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS",
env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE",
env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES",
env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE",
env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",
secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin
User user1 may run the following commands on testsshad:
(root) /usr/bin/ls, /usr/bin/cat
То же самое делаем со вторым пользователем: su user2
[user2@testsshad log]$ id
uid=1109801142(user2) gid=1109800513(domain users) groups=1109800513(domain users),1109801138(sudo_root)
[user2@testsshad log]$ sudo -l
Matching Defaults entries for user2 on testsshad:
!visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin,
env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS",
env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE",
env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES",
env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE",
env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",
secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin
User user2 may run the following commands on testsshad:
(root) ALL
Такой подход позволяет централизованно определять роли sudo для разных групп пользователей.
Хранение и использование ключей ssh в Active Directory
При небольшом расширении схемы можно хранить ssh-ключи в атрибутах пользователя Active Directory и использовать их при авторизации на Linux-хостах.Авторизация через sssd должна быть настроена.
Добавьте обязательный атрибут с помощью сценария PowerShell. AddsshPublicKeyAttribute.ps1 Функция New-AttributeID { $Prefix="1.2.840.113556.1.8000.2554" $GUID=[System.Guid]::NewGuid().
ToString() $Части=@() $Parts+=[UInt64]::Parse($guid.SubString(0,4),“AllowHexSpecifier”) $Parts+=[UInt64]::Parse($guid.SubString(4,4),“AllowHexSpecifier”) $Parts+=[UInt64]::Parse($guid.SubString(9,4),“AllowHexSpecifier”) $Parts+=[UInt64]::Parse($guid.SubString(14,4),“AllowHexSpecifier”) $Parts+=[UInt64]::Parse($guid.SubString(19,4),“AllowHexSpecifier”) $Parts+=[UInt64]::Parse($guid.SubString(24,6),“AllowHexSpecifier”) $Parts+=[UInt64]::Parse($guid.SubString(30,6),“AllowHexSpecifier”) $oid=[String]::Format("{0}.
{1}.
{2}.
{3}.
{4}.
{5}.
{6}.
{7}",$prefix,$Parts[ 0], $Parts[1],$Parts[2],$Parts[3],$Parts[4],$Parts[5],$Parts[6]) $oid } $schemaPath = (Get-ADRootDSE).
schemaNamingContext $oid = Новый идентификатор атрибута $attributes = @{ lDAPDisplayName = 'sshPublicKey'; атрибутId = $oid; оМСинтаксис = 22; атрибутСинтаксис = "2.5.5.5"; isSingleValued = $true; adminDescription = 'Открытый ключ пользователя для входа по SSH'; } New-ADObject -Name sshPublicKey -Type AttributeSchema -Path $schemapath -OtherAttributes $attributes $userSchema = get-adobject -SearchBase $schemapath -Filter 'name -eq "user"' $userSchema | Set-ADObject -Add @{mayContain = 'sshPublicKey'} После добавления атрибута необходимо перезапустить доменные службы Active Directory. Перейдем к пользователям Active Directory. Мы сгенерируем пару ключей для ssh-подключения любым удобным для вас способом.
Запускаем PuttyGen, нажимаем кнопку «Создать» и судорожно водим мышкой по пустой области.
По завершении процесса мы можем сохранить открытый и закрытый ключи, загрузить открытый ключ в атрибут пользователя Active Directory и наслаждаться процессом.
Однако открытый ключ необходимо использовать из окна" Открытый ключ для вставки в файл OpenSSHauthorized_keys: ".
Добавьте ключ к атрибуту пользователя.
Вариант 1 – графический интерфейс:
Вариант 2 — PowerShell: get-aduser user1 | set-aduser -add @{sshPublicKey = 'AAAAB.XAVnX9ZRJJ0p/Q=='}
Итак, на данный момент у нас есть: пользователь с заполненным атрибутом sshPublicKey, настроенный клиент Putty для авторизации по ключам.
Остался один небольшой момент: как заставить демон sshd извлечь нужный нам публичный ключ из атрибутов пользователя.
С этим успешно справится небольшой скрипт, найденный в буржуйском Интернете.
cat /usr/local/bin/fetchSSHKeysFromLDAP
#!/bin/sh
ldapsearch -h testmdt.testopf.local -xb "dc=testopf,dc=local" '(sAMAccountName='"${1%@*}"')' -D [email protected] -w superSecretPassword 'sshPublicKey' | sed -n '/^ /{H;d};/sshPublicKey:/x;$g;s/\n *//g;s/sshPublicKey: //gp'
Устанавливаем ему права 0500 для root. chmod 0500 /usr/local/bin/fetchSSHKeysFromLDAP
В этом примере для привязки к каталогу используется учетная запись администратора.
В боевых условиях должна быть отдельная учетная запись с минимальным набором прав.
Меня лично очень смутил момент ввода пароля в чистом виде в скрипте, несмотря на выставленные права.
Вариант решения:
- Сохраняю пароль в отдельный файл:
echo -n Supersecretpassword > /usr/local/etc/secretpass
- Я установил права доступа к файлам на 0500 для root
chmod 0500 /usr/local/etc/secretpass
- Изменение параметров запуска ldapsearch: параметр -w суперсекретныйпароль Я меняю это на -y /usr/local/etc/secretpass
cat /etc/ssh/sshd_config | egrep -v -E "#|^$" | grep -E "AuthorizedKeysCommand|PubkeyAuthe"
PubkeyAuthentication yes
AuthorizedKeysCommand /usr/local/bin/fetchSSHKeysFromLDAP
AuthorizedKeysCommandUser root
В результате получаем следующую последовательность с авторизацией по ключу, настроенной в ssh-клиенте:
- Пользователь подключается к серверу, указав свой логин.
- Демон sshd с помощью сценария извлекает значение открытого ключа из атрибута пользователя в Active Directory и выполняет авторизацию с использованием ключей.
- Демон sssd дополнительно проверяет подлинность пользователя на основе членства в группе.
Внимание! Если это не настроено, то доступ к хосту будет иметь любой пользователь домена.
- Когда вы пытаетесь выполнить sudo, демон sssd ищет роли в Active Directory. Если роли присутствуют, проверяются атрибуты пользователя и членство в группах (если sudoRoles настроено на использование групп пользователей).
Нижняя граница
Таким образом, ключи хранятся в атрибутах пользователей Active Directory, разрешениях sudo — аналогично доступ к хостам Linux по учетным записям домена осуществляется путем проверки членства в группе Active Directory. Последний взмах дирижерской палочки – и зал замирает в благоговейной тишине.Ресурсы, использованные при написании:
- Судо через Active Directory
- Ssh-ключи через Active Directory
- Скрипт Powershell, добавляющий атрибут в схему Active Directory
- стабильная версия sudo
-
40 Лет Ноутбуку
19 Oct, 24 -
День Закрытия: 3 Мая 2008 Г.
19 Oct, 24 -
Идея Для Соцсетей: «Сарафанное Радио»
19 Oct, 24 -
Global Devops Bootcamp 2019 В Москве
19 Oct, 24