--- title: Vault с доменной авторизацией description: published: true date: 2024-07-17T10:14:10.792Z tags: editor: markdown dateCreated: 2024-07-09T14:09:31.262Z --- # Развертывание Hashicorp Vault на стенде с Microsoft Active Directory (LDAP) ## Политики и пользователи Политики в Vault по сути напоминают права или access list (ACL). К юзеру или группе привязан ACL, с разного рода правами же. ## Настройка образца политик Сначала настроим политики – потому что пользователи и группы привязаны в политике, а ввиду убогого GUI делается это не очевидно. Да и в руководстве по политикам прописано как-то странновато. https://developer.hashicorp.com/vault/tutorials/getting-started/getting-started-policies?in=vault%2Fgetting-started Посмотрим, что у нас есть: Логинимся через токенЖ ``` vault login ``` Проверяем, что все успешно ``` vault status ``` Окей, сервер работает. Проверим сикреты. ``` vault secrets list ``` Проверим существующие политики: ``` vault policy list ``` ![alt text](image.png) Создадим шаблон под политику: ```bash nano policyUSER1.hcl # policyUSER1 # Write and manage secrets in key/value secrets engine path "kv_UserAD/*" { capabilities = [ "create", "read", "update", "delete", "list" ] } ``` Почитаем help и применим политику ``` vault policy write -h vault policy write policyuser1 /home/vuser/policyUSER.hcl ``` ![alt text](image-1.png) Создадим групповую политику с полным доступом ```bash nano policy_groupad_fullacess1.hcl # policy_groupad_fullacess1 path "kv_groupAD/*" { capabilities = [ "create", "read", "update", "delete", "list" ] } # Выполним vault policy write policy_groupad_fullacess1 /home/vuser/policy_groupad_fullacess1.hcl ``` Удостоверимся, что все записалось ``` vault policy list vault policy read policy_groupad_fullacess1 ``` # Привяжем LDAP к AD Идем и читаем *Auth Methods* https://developer.hashicorp.com/vault/docs/auth Без чтения дальше продолжать бессмысленно. Особенно внимательно читаем LDAP Auth Method Включаем LDAP по руководству, раздел Configuration ``` vault auth enable ldap ``` Сначала настроим связку с AD – потому что сейчас в Vault пользователей нет. >Учитывать: пробелы и переносы строк значимы, если не поставите пробел перед закрывающим “\”, то получите проблемы. Учтите, в тестовой конфигурации пароль прописан в исполняемом файле в открытом виде, не забудьте потом удалить файл и историю. ```bash nano ad_auth_1.sh #!/bin/sh vault write auth/ldap/config \ url="ldap://192.168.32.155:389" \ groupdn="OU=N Watch,OU=Zoo MSK,DC=contoso,DC=lab" \ groupfilter="(&(objectClass=group)(member:1.2.840.113556.1.4.1941:={{.UserDN}}))" \ userdn="OU=N Watch,OU=Zoo MSK,DC=contoso,DC=lab " \ userattr=sAMAccountName \ groupattr="memberOf" \ insecure_tls=false \ deny_null_bind=true \ use_token_groups=true \ starttls=false ``` И выполняем ``` sh ad_auth_1.sh ``` теперь нам надо бы проверить что все работает и привязать юзеров к политикам. Проверим через GUI User- Ivanov, Password - Pa$$word3 Получаем ошибку: ``` Authentication failed: 1 error occurred: * error connecting to host "ldap://192.168.32.155:389": LDAP Result Code 200 "Network Error": dial tcp 192.168.32.155:389: connect: connection refused ``` Посмотрим в CLI ``` vault login -method=ldap username=Ivanov ``` та же ошибка, а все почему? Потому что по невнимательности я прописал url="ldap://192.168.32.155:389" \ а AD у нас где? 192.168.31.151 и заодно, insecure_tls=false – а у нас ничего для TLS нет, так что читаем руководство еще раз, insecure_tls - (bool, optional) - If true, skips LDAP server SSL certificate verification - insecure, use with caution! **В БОЕВОЙ СРЕДЕ НЕ ЗАБЫВАЕМ СЕРТИФИКАТЫ AD!** И мы же не прописали самое главное – bindDN! Исправляемся, не зря в ldapsearch проверяли. Не забываем про “\”, кроме последней строки `binddn="CN=Vault connector,OU=Vault,OU=Robo base,DC=contoso,DC=lab " \` `bindpass="Pa!!word2"` Исправляем, выполняем ``` vault auth disable ldap vault auth enable ldap sh ad_auth_1.sh ``` Учтите: 1) При выполнении vault auth disable ldap – будут удалены не только настройки ldap, но и пользователи. У нас пока пользователей нет, а когда будут – попробуйте и увидите. 2) При каждой удачной команде vault login(и так далее) – вы будете получать новый токен. Поэтому лучше бы держать две SSH сессии – одну с vault login и root token, а вторую для проверок. Я в тексте не пишу про переключение, потому что по лени ввожу vault login каждый раз. *Проверяем* `vault login -method=ldap username=Ivanov` Получаем годное красивое Error authenticating: Error making API request. URL: PUT http://192.168.31.155:8200/v1/auth/ldap/login/Ivanov Code: 400. Errors: * ldap operation failed: failed to bind as user ![alt text](image-2.png) И если вы на этом этапе подумали – «Ну что ж, заведем юзера в Vault!» - то вовсе не угадали. Надо идти в логи AD и смотреть там ошибки авторизации – у какого юзера не идет авторизация. В моем случае – с Source Network Address: 192.168.31.155 прошла успешная авторизация пользователя CONTOSO\VaultSAM Может быть, проблема в пароле товарища Иванова? Проверим. Сменим Pa$$word3 на Pa!!word3 –а вот и нет. Но у нас есть товарищ Волк, без имени и фамилии. Проверим! vault login -method=ldap username=volk и все работает! ![alt text](image-3.png) # Заводим MS AD юзеров в Vault LDAP Не забудем перейти в соседнюю сессию или перелогинимся ``` vault login ``` Юзер у нас ходит, а политик ему не назначили – так заведем. ``` vault write auth/ldap/users/Ivanov ``` и получим ошибку, Must supply data or use –force Заведем сразу с политикой - ``` vault write auth/ldap/users/Ivanov policies=policyuser1 vault login -method=ldap username=Ivanov ``` работает, отлично – политика и токен["default" "policyuser1"],а как с группой быть? В конфиге я считерил и сразу прописал `groupfilter="(&(objectClass=group)(member:1.2.840.113556.1.4.1941:={{.UserDN}}))` В конфиге я считерил и сразу прописал `groupfilter="(&(objectClass=group)(member:1.2.840.113556.1.4.1941:={{.UserDN}}))" \` это известное читерство, описанное тут Поиск всех групп пользователя AD по протоколу LDAP, и случайно мне попавшееся в обсуждении на hashicorp и в google groups ,да и в документации в разделе Group Membership Resolution, но как-то совсем косо, с первого второго и далее раза не очевидно. **Проверим**: ``` vault login -method=ldap username=Petrov ``` теперь логинится, и получает политику ["default"] Пропишем группу AD ``` vault login vault policy list vault write auth/ldap/groups/VltADM policies=policy_groupad_fullacess1 vault login -method=ldap username=Petrov ``` и получим что: Верно. Индейскую народную национальную избу мы получим. Логин есть – политики нет. ``` vault list auth/ldap/groups vault delete auth/ldap/groups/VltADM vault write "auth/ldap/groups/Vault login" policies=policy_groupad_fullacess1 vault login -method=ldap username=Petrov ["default" "policy_groupad_fullacess1"] ``` **Теперь про неприятное.** Удалим пользователя Иванова без очистки токенов. `vault delete auth/ldap/users/Ivanov` зайдем им `vault login -method=ldap username=Ivanov` ОП – и у нас по прежнему есть старая политика. Для сброса придется в обязательном порядке отзывать токены – Получить список токенов `vault list auth/token/accessors` ![alt text](image-4.png) Перебрать каждый `vault token lookup -accessor EHlDQ1tFHEgA9aq0R6IptIjo` ![alt text](image-5.png) и так по всем. Не самая удобная процедура с точки зрения CLI, ну так Vault не под CLI заточен.