Победители Международных Соревнований По Ssh И Sudo Снова На Сцене. Под Руководством Заслуженного Руководителя Active Directory

Исторически разрешения sudo регулировались содержимым файлов из /etc/sudoers.d И визудо , а авторизация по ключу осуществлялась с помощью ~/.

ssh/authorized_keys .

Однако по мере роста инфраструктуры возникает желание централизованно управлять этими правами.

Сегодня может быть несколько вариантов решения:

  • Система управления конфигурациями - Шеф-повар , Кукольный , Анзибль , Соль
  • Активный каталог + SSD
  • Различные извращения в виде скриптов и ручного редактирования файлов
По моему субъективному мнению, лучшим вариантом централизованного управления все же является комбинация Активный каталог + SSD .

Преимущества этого подхода:

  • Действительно единый централизованный каталог пользователей.

  • Распределение прав судо сводится к добавлению пользователя в определенную группу безопасности.

  • В случае различных систем Linux возникает необходимость введения дополнительных проверок для определения ОС при использовании систем конфигурации.

Сегодняшний выпуск будет посвящен именно связи Активный каталог + SSD для управления правами судо и хранение сш ключи в одном репозитории.

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

Идти.

Данный:

  • Домен Active Directory testopf.local на Windows Server 2012 R2.
  • Хост Linux под управлением Centos 7
  • Настроил авторизацию с помощью SSD
Оба решения вносят изменения в схему Активный каталог , поэтому мы проверяем все в тестовой среде и только потом вносим изменения в рабочую инфраструктуру.

Хочу отметить, что все изменения целевые и по сути добавляют только необходимые атрибуты и классы.



Действие 1: контроль судо роли через Активный каталог .

Чтобы расширить схему Активный каталог вам нужно скачать последнюю версию судо — 1.8.27 на сегодняшний день.

Распакуйте и скопируйте файл схема.

ActiveDirectory из каталога .

/doc на контроллер домена.

Из командной строки с правами администратора из каталога, куда был скопирован файл, выполните:

  
  
  
  
  
  
  
  
  
  
   

ldifde -i -f schema.ActiveDirectory -c dc=X dc=testopf,dc=local

(Не забудьте заменить свои значения) Открытие adiedit.msc и подключитесь к контексту по умолчанию: Создать подразделение в корне домена судоеры .

(Буржуазия упорно утверждает, что именно в этом подразделении демон SSD ищет предмет sudoRole объекты.

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

) Создаем первый объект, принадлежащий классу в подразделении sudoRole .

Имя можно выбрать абсолютно произвольно, поскольку оно служит исключительно для удобной идентификации.

Среди возможных доступных атрибутов расширения схемы основными являются следующие:

  • sudoCommand — определяет, какие команды разрешено выполнять на хосте.

  • sudoHost — определяет, к каким хостам применяется эта роль.

    Может быть указано как ВСЕ и для отдельного хоста по имени.

    Также возможно использование маски.

  • sudoUser — указать, каким пользователям разрешено выполнять судо .

    Если вы указываете группу безопасности, добавьте знак «%» в начале имени.

    Если в названии группы есть пробелы, беспокоиться не о чем.

    Судя по логам, задачу выхода из пробелов берет на себя механизм SSD .



Победители международных соревнований по SSH и sudo снова на сцене.
</p><p>
 Под руководством заслуженного руководителя Active Directory

Рис.

1. Объекты sudoRole в подразделе sudoers в корне каталога

Победители международных соревнований по SSH и sudo снова на сцене.
</p><p>
 Под руководством заслуженного руководителя Active Directory

Рисунок 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: ".



Победители международных соревнований по SSH и sudo снова на сцене.
</p><p>
 Под руководством заслуженного руководителя Active Directory

Добавьте ключ к атрибуту пользователя.

Вариант 1 – графический интерфейс:

Победители международных соревнований по SSH и sudo снова на сцене.
</p><p>
 Под руководством заслуженного руководителя Active Directory

Вариант 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
Последний аккорд сегодняшнего урока — редактирование sshd_config.

cat /etc/ssh/sshd_config | egrep -v -E "#|^$" | grep -E "AuthorizedKeysCommand|PubkeyAuthe" PubkeyAuthentication yes AuthorizedKeysCommand /usr/local/bin/fetchSSHKeysFromLDAP AuthorizedKeysCommandUser root

В результате получаем следующую последовательность с авторизацией по ключу, настроенной в ssh-клиенте:
  1. Пользователь подключается к серверу, указав свой логин.

  2. Демон sshd с помощью сценария извлекает значение открытого ключа из атрибута пользователя в Active Directory и выполняет авторизацию с использованием ключей.

  3. Демон sssd дополнительно проверяет подлинность пользователя на основе членства в группе.

    Внимание! Если это не настроено, то доступ к хосту будет иметь любой пользователь домена.

  4. Когда вы пытаетесь выполнить sudo, демон sssd ищет роли в Active Directory. Если роли присутствуют, проверяются атрибуты пользователя и членство в группах (если sudoRoles настроено на использование групп пользователей).



Нижняя граница

Таким образом, ключи хранятся в атрибутах пользователей Active Directory, разрешениях sudo — аналогично доступ к хостам Linux по учетным записям домена осуществляется путем проверки членства в группе Active Directory. Последний взмах дирижерской палочки – и зал замирает в благоговейной тишине.

Ресурсы, использованные при написании:

Теги: #linux #*nix #itинфраструктура #Системное администрирование #Администрирование сервера #Конфигурация Linux #безопасность #bash #PowerShell #ssh #active каталог #Active Directory #Sudo #windows server 2012 r2
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.