Vault удобен тем, что может хранить различные типы секретов, например одноразовые пароли для SSH, доступы к БД, облачным сервисам и прочие key-value варианты. Получается некий аналог keepass/lastpass и google authenticator pam.

Как установить Vault описано в предыдущей статье. Ничего сложного нет, достаточно только лишь скачать бинарник и запустить его.

Vault мы установили, мы можем залогиниться в веб-интерфейс с помощью рутового токена, создать SSH engine и некоторую роль.

Для того чтобы можно было генерировать одноразовые токены, на всех машинах, на которые мы хотим соединяться должен быть установлен ssh-helper. Опять же, вся установка сводится к скачиванию бинарника и настройке пары конфигов.

Установка Vault SSH Helper

HashiCorp предоставляет Vault SSH Helper как единый бинарный файл, поэтому можно загрузить и установить исполняемый файл Vault SSH Helper вручную.

Сначала загрузите сжатый ZIP-архив Vault SSH Helper для 64-битной Linux. Вы можете найти ссылку на последнюю версию на странице загрузки Vault SSH Helper.

# cd /usr/local/bin/ && curl -O https://releases.hashicorp.com/vault-ssh-helper/0.2.1/vault-ssh-helper_0.2.1_linux_amd64.zip
# cd /usr/local/bin/ && curl -O https://releases.hashicorp.com/vault-ssh-helper/0.2.1/vault-ssh-helper_0.2.1_SHA256SUMS

Затем проверьте целостность zip-архива. Команда подтвердит, что содержимое zip-архива соответствует версии 0.2.1 Vault SSH Helper от Hashicorp.

grep linux_amd64 vault-ssh-helper_*_SHA256SUMS | sha256sum -c -

Каждая строка в файле SHA256SUMS имеет контрольную сумму и имя файла, по одному для каждого архива zip, который предоставляет HashiCorp. Компонент grep вышеприведенной команды выводит строку с контрольной суммой и именем 64-битного двоичного файла Linux, а затем передает (|) эту строку следующей команде. Команда SHA-256 подтверждает, что файл с таким именем в этой строке соответствует контрольной сумме из этой строки.

Команда подтвердит целостность архива:

vault-ssh-helper_0.2.1_linux_amd64.zip: OK

Если этого не произошло, загрузите архив заново.

После завершения проверки контрольной суммы установите команду unzip, чтобы распаковать архив. Перед этим обновите индекс пакетов.

sudo apt-get update
sudo apt-get install unzip

Затем распакуйте бинарный файл Vault SSH Helper в рабочем каталоге:

unzip vault-ssh-helper_0.2.1_linux_amd64.zip
Archive: vault-ssh-helper_0.2.1_linux_amd64.zip
inflating: vault-ssh-helper

Сделайте загружаемый файл исполняемым:

chmod +x /usr/local/bin/vault-ssh-helper

Наконец, установите флаг Linux в двоичном формате. Это повышает безопасность, позволяя блокировать память без повышения привилегий.

sudo setcap cap_ipc_lock=+ep /usr/local/bin/vault-ssh-helper

Vault SSH Helper успешно установлен на сервер.

Инициализация Vault SSH Helper

mkdir /etc/vault-helper.d/
cat << EOF > /etc/vault-helper.d/config.hcl
vault_addr = "https://example.com:8200"
ssh_mount_point = "ssh"
tls_skip_verify = true
allowed_roles = "*"
allowed_cidr_list="0.0.0.0/0"
EOF

Также настраиваем конфигурацию PAM:

sed -i -e 's/^@include common-auth/#@include common-auth/g' /etc/pam.d/sshd
echo "auth requisite pam_exec.so quiet expose_authtok log=/tmp/vaultssh.log /usr/local/bin/vault-ssh-helper -config=/etc/vault-helper.d/config.hcl" | tee -a /etc/pam.d/sshd
echo "auth optional pam_unix.so not_set_pass use_first_pass nodelay" | tee -a /etc/pam.d/sshd

И конфигурацию SSH:

sed -i -e 's/ChallengeResponseAuthentication no/ChallengeResponseAuthentication yes/g' /etc/ssh/sshd_config
sed -i -e 's/UsePAM no/UsePAM yes/g' /etc/ssh/sshd_config
sed -i -e 's/PasswordAuthentication yes/PasswordAuthentication no/g' /etc/ssh/sshd_config
systemctl restart sshd.service

Ноду на которую мы будем соединяться мы настроили, далее снова идем на ноду с Vault и включаем engine SSH:

vault secrets enable ssh

Создаем роль:

vault write ssh/roles/otp_key_role key_type=otp default_user=ubuntu cidr_list=0.0.0.0/0
Success! Data written to: ssh/roles/otp_key_role

И генерируем доступы:

vault write ssh/creds/otp_key_role ip=192.168.10.10

Key                Value
---                -----
lease_id           ssh/creds/otp_key_role/edc499e3-c100-405f-203b-c775d29c0232
lease_duration     192h
lease_renewable    false
ip                 192.168.10.10
key                ce307d33-84d8-0794-f284-b8b3c8e43698
key_type           otp
port               22
username           ubuntu

Пробуем соединиться с любой машины с этими доступами:

ssh username@remote_host
Password: ce307d33-84d8-0794-f284-b8b3c8e43698

Если же попробуете с этими доступами соединиться повторно, то ничего не выйдет, так как они одноразовые. Генерировать доступы можно и через веб-интерфейс, нужно лишь в настройках включить вход по LDAP или GitHub например, настроить политику для юзеров (например определенному юзеру разрешено заходить только на разрешенные ноды).

Вывод

Теперь вы умеете устанавливать и инициализировать Агент Vault SSH для включения одноразовых ключей и паролей (OTP) в Ubuntu 20.04.