Помимо подписи SSH-сертификатов (режим CA), механизм секретов SSH поддерживает режим одноразовых паролей (OTP). В этом режиме Stronghold выдаёт клиенту одноразовый пароль для входа на конкретный хост, а агент на удалённом хосте проверяет этот пароль через Stronghold при входе пользователя.

Особенности режима OTP:

  • пароль действует для одного входа и одного IP-адреса;
  • на каждом удалённом хосте необходим агент, который проверяет OTP через эндпоинт verify механизма секретов SSH;
  • Stronghold не хранит и не распространяет SSH-ключи.

Для режима OTP на удалённых хостах требуется агент, совместимый с эндпоинтом ssh/verify (например, помощник SSH, интегрированный с PAM). Установка и настройка агента не входят в эту документацию.

Настройка

  1. Включите механизм секретов SSH, если он ещё не включён:

    d8 stronghold secrets enable ssh
  2. Создайте роль с типом ключа otp:

    d8 stronghold write ssh/roles/otp-role key_type=otp default_user=ubuntu cidr_list=10.0.0.0/24 exclude_cidr_list=10.0.0.1/32 allowed_users="ubuntu,deploy" port=22

    Параметры роли для режима OTP:

    ПараметрОписание
    key_typeТип ключа: otp или ca. Для этого режима — otp.
    default_userИмя пользователя по умолчанию на удалённом хосте. Обязателен для типа otp.
    cidr_listСписок CIDR-блоков через запятую, для хостов из которых применяется роль.
    exclude_cidr_listСписок CIDR-блоков через запятую, IP-адреса из которых роль не принимает.
    allowed_usersСписок пользователей, для которых можно запросить OTP. Значение * разрешает любого пользователя.
    portПорт SSH, который возвращается клиенту вместе с OTP. На генерацию OTP не влияет. По умолчанию 22.
  3. Если роль должна выдавать OTP для любого IP-адреса, добавьте её в список ролей с нулевым адресом. Ранее заданные для этих ролей CIDR-блоки будут игнорироваться:

    d8 stronghold write ssh/config/zeroaddress roles="otp-role"
  4. Настройте на удалённых хостах агент, который проверяет OTP через Stronghold.

Использование

  1. Запросите одноразовый пароль для хоста:

    d8 stronghold write ssh/creds/otp-role ip=10.0.0.15 username=ubuntu

    Если username не указан, используется default_user роли. В ответе возвращается одноразовый пароль, имя пользователя, IP-адрес и порт.

  2. Подключитесь к хосту по SSH и введите полученный OTP в качестве пароля. Агент на хосте проверит его через эндпоинт ssh/verify, после чего пароль станет недействительным.

Чтобы узнать, какие роли применимы к IP-адресу, используйте эндпоинт lookup:

d8 stronghold write ssh/lookup ip=10.0.0.15

Пример политики

Политика, которая разрешает получать OTP только для роли otp-role:

path "ssh/creds/otp-role" {
  capabilities = ["create", "update"]
}

Полный список эндпоинтов и параметров приведён в справочнике API механизмов секретов.