Пост

HashiCorp Vault как центр сертификации (CA) / Vault PKI

PKI (Public Key Infrastructure, инфраструктура открытых ключей) -  набор средств, распределённых служб и компонентов, в совокупности используемых для поддержки криптозадач на основе закрытого и открытого ключей.

Подготовка

Устанавливаем в систему утилиту jq

1
$ sudo dnf -y install jq

Настройка PKI

Авторизуемся в Vault

1
$ vault login

Активируем PKI тип секрета для корневого центра сертификации

1
2
3
4
5
$ vault secrets enable \
    -path=pki_root_ca \
    -description="PKI Root CA" \
    -max-lease-ttl="262800h" \
    pki

Создаем корневой центра сертификации (CA). 262800h = 30 лет

1
2
3
4
5
6
7
8
9
$ vault write -format=json pki_root_ca/root/generate/internal \
    common_name="Root Certificate Authority" \
    country="Russian Federation" \
    locality="Moscow" \
    street_address="Red Square 1" \
    postal_code="101000" \
    organization="Horns and Hooves LLC" \
    ou="IT" \
    ttl="262800h" > pki-root-ca.json

Сохраняем корневой сертификат. В дальнейшем именно его надо распространять в организации и делать доверенным

1
$ cat pki-root-ca.json | jq -r .data.certificate > rootCA.pem

Публикуем URL’ы для корневого центра сертификации

1
2
3
$ vault write pki_root_ca/config/urls \
    issuing_certificates="http://vault.example.com:8200/v1/pki_root_ca/ca" \
    crl_distribution_points="http://vault.example.com:8200/v1/pki_root_ca/crl"

Активируем PKI тип секрета для промежуточного центра сертификации

1
2
3
4
5
$ vault secrets enable \
    -path=pki_int_ca \
    -description="PKI Intermediate CA" \
    -max-lease-ttl="175200h" \
    pki

Генерируем запрос на выдачу сертификата для промежуточного центра сертификации

1
2
3
4
5
6
7
8
9
$ vault write -format=json pki_int_ca/intermediate/generate/internal \
   common_name="Intermediate CA" \
   country="Russian Federation" \
   locality="Moscow" \
   street_address="Red Square 1" \
   postal_code="101000" \
   organization="Horns and Hooves LLC" \
   ou="IT" \
   ttl="175200h" | jq -r '.data.csr' > pki_intermediate_ca.csr

Отправляем полученный CSR файл в корневой центр сертификации, получаем сертификат для промежуточного центра сертификации. 175200h = 20 лет

1
2
3
4
5
6
7
8
9
$ vault write -format=json pki_root_ca/root/sign-intermediate csr=@pki_intermediate_ca.csr \
   country="Russia Federation" \
   locality="Moscow" \
   street_address="Red Square 1" \
   postal_code="101000" \
   organization="Horns and Hooves LLC" \
   ou="IT" \
   format=pem_bundle \
   ttl="175200h" | jq -r '.data.certificate' > intermediateCA.cert.pem

Публикуем подписанный сертификат промежуточного центра сертификации

1
2
$ vault write pki_int_ca/intermediate/set-signed \
    certificate=@intermediateCA.cert.pem

Публикуем URL’ы для промежуточного центра сертификации

1
2
3
$ vault write pki_int_ca/config/urls \
    issuing_certificates="http://vault.example.com:8200/v1/pki_int_ca/ca" \
    crl_distribution_points="http://vault.example.com:8200/v1/pki_int_ca/crl"

Создаем роль, с помощью которой будем выдавать сертификаты для серверов

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ vault write pki_int_ca/roles/example-dot-com-server \
    country="Russia Federation" \
    locality="Moscow" \
    street_address="Red Square 1" \
    postal_code="101000" \
    organization="Horns and Hooves LLC" \
    ou="IT" \
    allowed_domains="example.com" \
    allow_subdomains=true \
    max_ttl="87600h" \
    key_bits="2048" \
    key_type="rsa" \
    allow_any_name=false \
    allow_bare_domains=false \
    allow_glob_domain=false \
    allow_ip_sans=true \
    allow_localhost=false \
    client_flag=false \
    server_flag=true \
    enforce_hostnames=true \
    key_usage="DigitalSignature,KeyEncipherment" \
    ext_key_usage="ServerAuth" \
    require_cn=true

Создаем роль, с помощью которой будем выдавать сертификаты для клиентов

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ vault write pki_int_ca/roles/example-dot-com-client \
    country="Russia Federation" \
    locality="Moscow" \
    street_address="Red Square 1" \
    postal_code="101000" \
    organization="Horns and Hooves LLC" \
    ou="IT" \
    allow_subdomains=true \
    max_ttl="87600h" \
    key_bits="2048" \
    key_type="rsa" \
    allow_any_name=true \
    allow_bare_domains=false \
    allow_glob_domain=false \
    allow_ip_sans=false \
    allow_localhost=false \
    client_flag=true \
    server_flag=false \
    enforce_hostnames=false \
    key_usage="DigitalSignature" \
    ext_key_usage="ClientAuth" \
    require_cn=true

Создаем сертификат на 5 лет для домена vault.example.com

1
2
3
4
$ vault write -format=json pki_int_ca/issue/example-dot-com-server \
    common_name="vault.example.com" \
    alt_names="vault.example.com" \
    ttl="43800h" > vault.example.com.crt

Сохраняем сертификат в правильном формате

1
2
3
$ cat vault.example.com.crt | jq -r .data.certificate > vault.example.com.crt.pem
$ cat vault.example.com.crt | jq -r .data.issuing_ca >> vault.example.com.crt.pem
$ cat vault.example.com.crt | jq -r .data.private_key > vault.example.com.crt.key

Работаем с сертификатами

Посмотреть список сертификатов

1
$ vault list pki_int_ca/certs

Прочитать сертификат (вывести содержимое)

1
$ vault read pki_int_ca/cert/<serial number>

Отозвать сертификат

1
$ vault write pki_int_ca/revoke serial_number=<serial number>

Очистить просроченные / отозванные сертификаты

1
2
3
4
$ vault write pki_int_ca/tidy \
    safety_buffer=5s \
    tidy_cert_store=true \
    tidy_revocation_list=true

Bash-скрипт

Для удобства разворачивания PKI подготовил Bash-скрипт в своем репозитории на GitHub

Авторский пост защищен лицензией CC BY 4.0 .

© IT Draft. Некоторые права защищены.