268 lines
10 KiB
Markdown
268 lines
10 KiB
Markdown
---
|
||
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
|
||
```
|
||

|
||
|
||
Создадим шаблон под политику:
|
||
```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
|
||
```
|
||

|
||
|
||
Создадим групповую политику с полным доступом
|
||
```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
|
||
|
||

|
||
|
||
И если вы на этом этапе подумали – «Ну что ж, заведем юзера в Vault!» - то вовсе не угадали.
|
||
|
||
Надо идти в логи AD и смотреть там ошибки авторизации – у какого юзера не идет авторизация. В моем случае – с Source Network Address: 192.168.31.155 прошла успешная авторизация пользователя CONTOSO\VaultSAM
|
||
|
||
Может быть, проблема в пароле товарища Иванова? Проверим. Сменим Pa$$word3 на Pa!!word3 –а вот и нет.
|
||
|
||
Но у нас есть товарищ Волк, без имени и фамилии. Проверим!
|
||
|
||
vault login -method=ldap username=volk
|
||
|
||
и все работает!
|
||
|
||

|
||
|
||
|
||
# Заводим 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`
|
||
|
||

|
||
|
||
Перебрать каждый
|
||
|
||
`vault token lookup -accessor EHlDQ1tFHEgA9aq0R6IptIjo`
|
||
|
||

|
||
|
||
и так по всем. Не самая удобная процедура с точки зрения CLI, ну так Vault не под CLI заточен. |