AppRole подходит для приложений и скриптов, которым нужен доступ к секретам без участия человека. Приложение предъявляет пару идентификаторов: role_id (почти не меняется, не секрет) и secret_id (выдаётся на ограниченное время и число использований), и получает токен с политиками роли.
Цель
Настроить роль для приложения myapp, получить для неё role_id и secret_id, войти по ним и прочитать секрет, ограничив срок жизни токена, число использований secret_id и сети, из которых разрешён вход.
Предварительные требования
Перед началом подготовьте:
- Токен Stronghold с правами на включение методов аутентификации, запись политик и ролей.
- Механизм секретов KV версии 2, смонтированный в
secret/(в режиме разработки он включён по умолчанию).
Шаг 1. Создайте секрет и политику
Запишите тестовый секрет и ограничьте доступ к нему политикой.
Запишите секрет, который будет читать приложение:
d8 stronghold kv put -mount=secret myapp/config db_password=s3cr3tСоздайте политику, которая разрешает только чтение этого пути:
d8 stronghold policy write myapp - <<'POLICY' path "secret/data/myapp/*" { capabilities = ["read"] } POLICY
Шаг 2. Включите метод и создайте роль
Включите метод аутентификации AppRole и создайте роль myapp:
d8 stronghold auth enable approle
d8 stronghold write auth/approle/role/myapp token_policies=myapp token_ttl=15m token_max_ttl=1h secret_id_ttl=24h secret_id_num_uses=1 token_bound_cidrs="127.0.0.1/32,10.0.0.0/8" secret_id_bound_cidrs="127.0.0.1/32,10.0.0.0/8"Параметры роли:
| Параметр | Назначение |
|---|---|
token_policies | Политики токена, который получит приложение |
token_ttl, token_max_ttl | Срок жизни токена и предел его продления |
secret_id_ttl | Срок, в течение которого можно использовать выданный secret_id |
secret_id_num_uses | Сколько раз можно войти по одному secret_id. 1 означает одноразовый secret_id |
token_bound_cidrs | Сети, из которых можно использовать выданный токен |
secret_id_bound_cidrs | Сети, из которых можно войти по secret_id |
Укажите в token_bound_cidrs и secret_id_bound_cidrs реальные сети серверов приложения. В примере добавлен 127.0.0.1/32, чтобы его можно было проверить на одной машине.
Шаг 3. Получите идентификаторы
Прочитайте role_id роли и выпустите secret_id:
ROLE_ID=$(d8 stronghold read -field=role_id auth/approle/role/myapp/role-id)
SECRET_ID=$(d8 stronghold write -f -field=secret_id auth/approle/role/myapp/secret-id)role_id можно указать в конфигурации приложения. secret_id передайте по защищённому каналу. Обёрнутый secret_id можно получить только один раз, поэтому его перехват обнаруживается.
Шаг 4. Войдите и прочитайте секрет
Войдите от имени приложения и прочитайте секрет выданным токеном.
Войдите по
role_idиsecret_id:APP_TOKEN=$(d8 stronghold write -field=token auth/approle/login role_id="$ROLE_ID" secret_id="$SECRET_ID")Прочитайте секрет токеном приложения:
STRONGHOLD_TOKEN="$APP_TOKEN" d8 stronghold kv get -mount=secret myapp/config
Проверка
Проверьте ограничения роли и токена.
Убедитесь, что токен получил только политики роли:
STRONGHOLD_TOKEN="$APP_TOKEN" d8 stronghold token lookupВ поле
policiesдолжны бытьdefaultиmyapp.Убедитесь, что
secret_idодноразовый: повторный вход должен завершиться ошибкой:# Повторный вход по тому же secret_id. d8 stronghold write auth/approle/login role_id="$ROLE_ID" secret_id="$SECRET_ID"Убедитесь, что приложение не читает чужие секреты:
# Чтение пути вне политики. STRONGHOLD_TOKEN="$APP_TOKEN" d8 stronghold kv get -mount=secret other/configЗапрос должен завершиться ошибкой
permission denied.
Очистка
Отзовите токен и удалите роль, политику и секрет:
d8 stronghold token revoke "$APP_TOKEN"
d8 stronghold delete auth/approle/role/myapp
d8 stronghold policy delete myapp
d8 stronghold kv metadata delete -mount=secret myapp/config