HashiCorp Vault имеет в своём арсенале SSH secrets engine, который позволяет организовать защищённый доступ к вашим машинам по ssh, через создание клиентских сертификатов и одноразовых паролей. Про последнее – создани е одноразовых паролей (OTP) – мы и поговорим в этой статье.
Ссылка на статью на хабре – https://habr.com/ru/articles/785052/
Как это работает?
Клиент генерирует OTP для нужного пользователя и ip-адреса, далее обычным ssh username@host
подключается к серверу. Сгенерировать ключ можно напрямую через vault, используя cli, API или
веб-интерфейс, или через вашу внутреннюю систему, которая сама будет дёргать vault API и создавать
OTP.
Когда SSH-сервер получает запрос на аутентификацию, он вызывает PAM (Pluggable Authentication Modules) модуль, который в процессе выполняет внешнюю команду. Этой внешней командой является vault-ssh-helper, который, в свою очередь, стучится в ваш Vault-кластер для проверки токена, отправленного клиентом. Если всё ок, то доступ предоставляется, а токен инвалидируется.
Установка и настройка
Вся настройка достаточно быстрая и состоит из двух этапов: необходимые манипуляции внутри кластера 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 <<EOF
path "ssh/creds/otp_role" {
capabilities = ["update"]
}
EOF
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 <<EOF
vault_addr = "VAULT_ADDR"
tls_skip_verify = false
ca_path = "CA_CRT_PATH"
ssh_mount_point = "ssh"
allowed_roles = "*"
EOF
Меняем конфигурация для 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