Найти в Дзене

Vault. Конфигурация Hashicorp Vault для GitLab (ce v17.11)

Требования: - a) на хосте, с которого идет конфигурация установлен vault
- b) в docker контейнере, на котором требуется использовать VAULT_TOKEN установлен vault
ВАЖНО! Пользователь в vault должен совпадать с пользователем в gitlab, в нашем случае - sys_admin (лучше использовать метод ldap, или userpass если нет ldap) Цель: получать данные секретов из vault для использования в gitlab Конфигурация gitlab 1) В настройках gitlab файл - gitlab.rb выставляем gitlab_rails['omniauth_enabled'] = true
gitlab_rails['jwt_enabled'] = true 2) Выполнить # gitlab-ctl reconfigure
# gitlab-ctl restart Конфигурация vault (с хоста a): 1) логинимся по root (используя root токен , method - Token) # vault login
Token (will be hidden): <ROOT_TOKEN> 2) Разрешим работу с секретами по пути secret: # vault secrets enable -path=secret/ kv 3) Создадим секреты # vault kv put secret/basic/ansible ansible_user=sys_ansible ansible_pass=sys_ansible_pass
# vault kv put secret/basic/gitlab gitlab_user=sys_admin gitlab_

Требования:

- a) на хосте, с которого идет конфигурация установлен vault
- b) в docker контейнере, на котором требуется использовать VAULT_TOKEN установлен vault
ВАЖНО! Пользователь в vault должен совпадать с пользователем в gitlab, в нашем случае - sys_admin (лучше использовать метод ldap, или userpass если нет ldap)

Цель: получать данные секретов из vault для использования в gitlab

Конфигурация gitlab

1) В настройках gitlab файл - gitlab.rb выставляем

gitlab_rails['omniauth_enabled'] = true
gitlab_rails['jwt_enabled'] = true

2) Выполнить

# gitlab-ctl reconfigure
# gitlab-ctl restart

Конфигурация vault (с хоста a):

1) логинимся по root (используя root токен , method - Token)

# vault login
Token (will be hidden): <ROOT_TOKEN>

2) Разрешим работу с секретами по пути secret:

# vault secrets enable -path=secret/ kv

3) Создадим секреты

# vault kv put secret/basic/ansible ansible_user=sys_ansible ansible_pass=sys_ansible_pass
# vault kv put secret/basic/gitlab gitlab_user=
sys_admin gitlab_pass=sys_admin_pass

4) Включаем jwt

# vault auth enable jwt
Success! Enabled jwt auth method at: jwt/

5) Создаем политику

# vault policy write basic_role - <<EOF
path "
secret/basic/*" {
capabilities = [ "read", "list" ]
}
EOF

6) Создаем роль (vault-dev:8202 заменить на свой хост vault)

# vault write auth/jwt/role/basic_role - <<EOF
{
"role_type": "jwt",
"policies": ["
basic_role"],
"token_explicit_max_ttl": 3600,
"user_claim": "sub",
"bound_audiences": "https://vault-dev:8202",
"bound_claims_type": "glob",
"bound_claims": {
"namespace_id": "*",
"ref": "*",
"ref_type": "branch"
}
}
EOF

7) Конфигурация jwt (gitlab-01 заменить на свой хост gitlab)

# vault write auth/jwt/config \
oidc_discovery_url="https://gitlab-01" \
bound_issuer="https://gitlab-01"

8) Выдать права пользователю vault , в нашем случае - sys_admin

# vault write auth/userpass/users/sys_admin policies="default,basic_role"

9) Для чего все это???

мы можем передать окружение через gitlab-ci на запускаемый docker контейнер (хост b):

Кусок из .gitlab-ci.yml

VAULT_BASIC_SECRETS_PATH:
value: "
secret/basic"
......
default:
image: ${ansible-run docker image}
id_tokens:
VAULT_ID_TOKEN:
aud: https://vault-dev:8202 ## расположение vault

before_script:
- |
#credentials
export ANSIBLE_FORCE_COLOR=true
export VAULT_SKIP_VERIFY=true
export
VAULT_TOKEN="$(vault write -field=token auth/jwt/login role=basic_role jwt=$VAULT_ID_TOKEN)"
export GITLAB_USER="$(vault kv get -field=gitlab_user ${VAULT_BASIC_SECRETS_PATH}/gitlab)"
export GITLAB_PASS="$(vault kv get -field=gitlab_pass ${VAULT_BASIC_SECRETS_PATH}/gitlab)"
export
ANSIBLE_USER="$(vault kv get -field=ansible_user ${VAULT_BASIC_SECRETS_PATH}/ansible)"
export
ANSIBLE_PASSWORD="$(vault kv get -field=ansible_pass ${VAULT_BASIC_SECRETS_PATH}/ansible)"

Имея эти данные можно запускать

- ansible-playbook -e ansible_user="${ANSIBLE_USER}" -e ansible_ssh_pass="${ANSIBLE_PASSWORD}" -i <something>