# Выпуск сертификатов для домена на базе HC Vault PKI ## Необходимо: 1. Сгенерировать корневой и промежуточный сертификаты для CA: - ca.home.office - корневой - intermediate.ca.home.office - промежуточный 2. Выпустить сертикат для доступа к Vault по TLS (хост: vault.ca.home.office) 3. Развернуть Vault. ## Подготовка PKI *Соглашения*: - домен `home.office` - Vault доступен по адресу https://vault.ca.home.office - файл `home-office-all-bundle.pem` содержит в себе: `ca.home.office.crt` (корневой сертификат), `intermediate.ca.home.office.crt` (промежуточный сертификат), `intermediate.ca.home.office.key` (секретный ключ промежуточного сертификата в формате PEM) - путь к секрету в Vault `pki_home_office` - Vault запущен и распечатан (unseal) ### Настройка Vault 1. Создать секрет для PKI ```bash vault secrets enable -path pki_home_office pki ``` 2. Настроить подписание/выпуск (issue) сертификатов ```bash vault write pki_home_office/config/ca pem_bundle=@home-office-all-bundle.pem ``` 3. Создать политику доступа ```bash cat <<EOF | vault policy write pki_home_office - path "pki_home_office*" { capabilities = ["read", "list"] } path "pki_home_office/roles/*" { capabilities = ["create", "update"] } path "pki_home_office/sign/*" { capabilities = ["create", "update"] } path "pki_home_office/issue/*" { capabilities = ["create", "update"] } EOF ``` 4. Активировать аутентификацию по логину/паролю, создать учетную запись (путь pki_pass) и подключить политику ```bash vault auth enable -path pki_pass userpass vault write auth/pki_pass/users/cert_creator password=1234569870 policies=pki_home_office ``` 5. Создаем роль, позволяющую выдачу сертификатов для домена и поддоменов ```bash vault write pki_home_office/roles/home-office allowed_domains="home.office" allow_subdomains=true ``` ### Получение сертификата (curl) *Соглашения*: - на хосте в контейнере имеются утилиты curl и jq - Адрес Vault, логин и пароль подключения находятся в переменных VAULT_ADDR, $VAULT_USER, $VAULT_PASSWORD соотвественно. 1. Авторизуемся в Vault, чтобы получить токен ```bash VAULT_TOKEN=$(curl -k -X POST $VAULT_ADDR/v1/auth/pki_pass/login/$VAULT_USER --data '{"password":"'$VAULT_PASSWORD'"}' | jq -r '.auth.client_token') ``` 2. Запрашиваем сертификат/приватный ключ со временем жизни 1 час для домена site1.home.office и сохраняем в файлы ```bash curl -ks -X POST -H "X-Vault-Token: $VAULT_TOKEN" $VAULT_ADDR/v1/$VAULT_ISSUER --data '{"common_name": "site1.home.office", "ttl": "1h"}' | tee data.raw cat data.raw| jq -r '.data.private_key' > /certs/site1.home.office.key cat data.raw| jq -r '.data.certificate' > /certs/site1.home.office.crt ``` Теперь файлы site1.home.office.crt и site1.home.office.key содержат сертификат и приватный ключ соответственно. ### Получение сертификата (consul-template) *Соглашения*: - consult-template скачан в виде утилиты или действия выполняются внутри контейнера `hashicorp/consul-template` - имеется токен для аутентификации в Vault (может быть использован токен из пункта 1 предыдущего шага) 1. Создаем файл с настройками для consul-template и домена site-consul.home.office ```bash cat <<EOF >> config.hcl vault { address = "https://vault.ca.home.office:8200" token="hvs.CAESIMCKDh9o5kNkzlS2RPaIIWZla3rg48wn1TzIOgfBsCTqGh4KHGh2cy5EMEhtSXVhd3Zza1JzUVlWUW1FeUxldjU" unwrap_token = false renew_token = false ssl { verify = false } } template { contents="{{ with secret \"pki_home_office/issue/home-office\" \"common_name=site-consul.home.office\" \"ttl=1h\" }}{{ .Data.private_key }}{{ end }}" destination="site-consul.home.office.key" } template { contents="{{ with secret \"pki_home_office/issue/home-office\" \"common_name=site-consul.home.office\" \"ttl=1h\" }}{{ .Data.certificate }}{{ end }}" destination="site-consul.home.office.crt" } ``` 2. Получаем сертификат: ``` consul-template -config /opt/consul.hcl -once ``` Теперь файлы site-consul.home.office.key site-consul.home.office.crt содержат сертификат и приватный ключ соответственно.