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