Одноразовые пароли для доступа по ssh через HashiCorp Vault

3a83412f761be8de364dade1a87f42e5

Вся настройка достаточно быстрая и состоит из двух этапов: необходимые манипуляции внутри кластера Vault и на самом host’е.

Как всё настроить подробно описано в официальной статье от HashiCorp. Инструкция ниже это по сути её перевод. Вы можете это пропустить и перейти сразу к нюансам.

Манипуляции внутри Vault’а

Включаем SSH secrets engine.

vault secrets enable ssh

Создаём роль, которая будет использована для генерации OTP ключей для клиентов. Указываем дефолтного юзера и список разрешённых. А также в cidr_list задаём список адресов, к которым будут подходить ключи.

Рекомендуется создавать по одной роли для каждого пользователя.

vault write ssh/roles/otp_role \
    key_type=otp \
    default_user=worker \
    allowed_users=worker, worker2 \
    cidr_list=10.10.10.10/32

Далее осталось создать policy к нашей роли для генерации ключей и сгенерировать access-token, привязанный к этой policy.

tee test.hcl <
vault policy write otp-polcy ./test.hcl

Создаём token и сохраняем его, потому что потом запросить его у vault не удастся.

vault token create -policy=otp-polcy

Key                  Value
---                  -----
token                hvs.CAESIG1_CrngaECzf6yvTDBgUZz2Lt-mYfdZXogrsiV0ulH1Gh4KHGh2cy4bPmFmN24xNVM5cnBqbFNLTUdpd1JDcTM
token_accessor       n76E8Bc8P9SyPLpVZa2EoWGq
token_duration       768h
token_renewable      true
token_policies       ["default" "otp-polcy"]
identity_policies    []
policies             ["default" "otp-polcy"]

Манипуляции внутри нужной машины

Скачиваем последнюю версию vaul-ssh-helper с этой ссылки, указанной в этом репозитории.

wget https://releases.hashicorp.com/vault-ssh-helper/0.2.1/vault-ssh-helper_0.2.1_linux_amd64.zip

Распаковываем в директорию /usr/local/bin.

unzip -q vault-ssh-helper_0.2.1_linux_amd64.zip -d /usr/local/bin

Указываем владельцем root’а и устанавливаем права доступа 0755 (rwxr-xr-x).

sudo chown root:root /usr/local/bin/vault-ssh-helper
sudo chmod 0755 /usr/local/bin/vault-ssh-helper

Создаём файл с конфигурацией vault-ssh-helper в директории /etc/vault-ssh-helper.d.

sudo mkdir /etc/vault-ssh-helper.d
sudo tee /etc/vault-ssh-helper.d/config.hcl <

Меняем конфигурация для PAM sshd (/etc/pam.d/sshd).

# на всякий случай бэкапим её
sudo cp /etc/pam.d/sshd /etc/pam.d/sshd.orig

Комментируем строчку include common-auth и добавляем следующие две: в них для vault-ssh-helper указываем конфиг helper’а и файл, куда будут выводиться логи.

auth requisite pam_exec.so quiet expose_authtok log=/var/log/vault-ssh.log /usr/local/bin/vault-ssh-helper -config=/etc/vault-ssh-helper.d/config.hcl
auth optional pam_unix.so not_set_pass use_first_pass nodelay

Меняем конфигурацию sshd (/etc/ssh/sshd_config).

# на всякий случай бэкапим её
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.orig

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

KbdInteractiveAuthentication yes
UsePAM yes
PasswordAuthentication no

Старые версии Ubuntu используют ChallengeResponseAuthentication вместо KbdInteractiveAuthentication.

Так как вы отключаете аутентификацию по паролю, убедитесь, что возможны другие способы доступа к серверу. Например доступ по ssh ключу у root’а.

Перезапускаем sshd.

sudo systemctl restart sshd

Проверка

Авторизуемся в vault с токеном, полученным выше.

vault login $TOKEN

Генерируем OTP ключ для нужного ip-адреса (юзера не указываем — используется дефолтный).

vault write ssh/creds/otp_key_role ip=$IP_ADDRESS

Key                Value
---                -----
lease_id           ssh/creds/otp_key_role/yZaiE4bRiVUVvc6LetQDtDmS
lease_duration     768h
lease_renewable    false
ip                 10.10.10.10
key                edcf6837-902f-43c6-9e54-c8c26ab80ff3
key_type           otp
port               22
username           username

Подключаемся к серверу с полученным ключём.

ssh username@10.10.10.10

© Habrahabr.ru