воскресенье, 1 июля 2018 г.

Настройка Hashicorp Vault для генерации одноразовых паролей (OTP) для SSH

Vault — это инструмент для управления секретами от компании Hashicorp известной также другими интересными тулами, такими как Consul, Nomad, Terraform, Vagrant, Packer и прочими.

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

Удобство хашикорповских тулов заключается в том, что они распространяются единым бинарником и легко настраиваются, в том числе и Vault. У Vault неплохая документация, по которой в принципе все понятно.

В данной заметке я опишу вариант использования One-Time Passwords для логина в SSH, вместо мучений с менеджментом ssh-ключей.

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

В моем случае я разворачивал Vault в амазоне с помощью packer и terraform. Если у кого-то будет похожий кейс, то рекомендую этот репозиторий.

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

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

Качаем и устанавливаем helper:
VSH_VERSION=0.1.4
SSHD_CONFIG_PATH=/etc/ssh/sshd_config
PAMD_CONFIG_PATH=/etc/pam.d/sshd
wget https://releases.hashicorp.com/vault-ssh-helper/${VSH_VERSION}/vault-ssh-helper_${VSH_VERSION}_linux_amd64.zip
unzip vault-ssh-helper_${VSH_VERSION}_linux_amd64.zip
mv vault-ssh-helper /usr/local/bin/

Конфигурим его:
mkdir /etc/vault-helper.d/
cat << EOF > /etc/vault-helper.d/config.hcl
vault_addr = "https://vault.yourdomain.org:443"
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' ${PAMD_CONFIG_PATH}
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 ${PAMD_CONFIG_PATH}
echo "auth optional pam_unix.so not_set_pass use_first_pass nodelay" | tee -a ${PAMD_CONFIG_PATH}

И конфигурацию SSH:
sed -i -e 's/ChallengeResponseAuthentication no/ChallengeResponseAuthentication yes/g' ${SSHD_CONFIG_PATH}
sed -i -e 's/UsePAM no/UsePAM yes/g' ${SSHD_CONFIG_PATH}
sed -i -e 's/PasswordAuthentication yes/PasswordAuthentication no/g' ${SSHD_CONFIG_PATH}
systemctl restart sshd

Ноду на которую мы будем соединяться мы настроили, далее снова идем на ноду с 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.12
Key                Value
---                -----
lease_id           ssh/creds/otp_key_role/edc499e3-c100-405f-203b-c775d29c0233
lease_duration     192h
lease_renewable    false
ip                 192.168.10.12
key                ce307d33-84d8-0794-f284-b8b3c8e43699
key_type           otp
port               22
username           ubuntu

Пробуем соединиться с любой машины с этими доступами:
ssh [email protected]
Password: ce307d33-84d8-0794-f284-b8b3c8e43699

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

Комментариев нет: