wiki-js/DevOps/Hashicorp-Vault/vault-with-ldap.md

268 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

---
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 заточен.