Vault PKI Intermediate ca etcd Roles and permissions Kubernetes the hard way v2: различия между версиями
Sirmax (обсуждение | вклад) |
Sirmax (обсуждение | вклад) |
||
(не показано 8 промежуточных версий этого же участника) | |||
Строка 1: | Строка 1: | ||
+ | [[Категория:K8s]] |
||
+ | [[Категория:Linux]] |
||
+ | [[Категория:SSL]] |
||
+ | [[Категория:PKI]] |
||
+ | [[Категория:TLS]] |
||
+ | [[Категория:Etcd]] |
||
+ | =Вводная часть= |
||
+ | Тут описывается настройка на примере сначала тестовых данных (тестовый пользователь, тестовый домен), [[Vault_PKI_Intermediate_ca_etcd_Roles_and_permissions_for_real_cliuster_Kubernetes_the_hard_way_v2|во второй части ]] описывается создание сертификатов для '''etcd''' |
||
+ | |||
=Работа с PKI= |
=Работа с PKI= |
||
Создание пользователей и ролей не относится непосредсвенно к настройке PKI но добавлено для полноты так как все равно надо настроить =) |
Создание пользователей и ролей не относится непосредсвенно к настройке PKI но добавлено для полноты так как все равно надо настроить =) |
||
Строка 631: | Строка 640: | ||
vault.example.home.certificate.pem: OK |
vault.example.home.certificate.pem: OK |
||
</PRE> |
</PRE> |
||
− | Однако в этой команде меня смущает слово '''-untrusted''' |
||
+ | |||
− | Второй способ - это создание "бандла" (те поместить в один файл промежуточный CA |
+ | Второй способ - это создание "бандла" (те поместить в один файл промежуточный CA и корневой СА) |
<PRE> |
<PRE> |
||
cat vault.example.home.issuing_ca.pem > vault.example.home.ca_bundle |
cat vault.example.home.issuing_ca.pem > vault.example.home.ca_bundle |
||
Строка 642: | Строка 651: | ||
openssl \ |
openssl \ |
||
verify \ |
verify \ |
||
− | - |
+ | -show_chain \ |
− | -CAfile |
+ | -CAfile k8s_ca_bundle.pem \ |
− | vault.example.home. |
+ | vault.example.home.certificate.pem |
</PRE> |
</PRE> |
||
+ | |||
<PRE> |
<PRE> |
||
− | vault.example.home. |
+ | vault.example.home.certificate.pem: OK |
+ | Chain: |
||
+ | depth=0: C = Ukraine, L = Kharkov, street = Lui Pastera st 322 app. 311, postalCode = 61172, O = Home Network, OU = IT, CN = vault.example.home (untrusted) |
||
+ | depth=1: C = Ukraine, L = Kharkov, street = Lui Pastera st. 322 app. 131, postalCode = 61172, O = K8s The Hardest Way Labs, OU = IT, CN = Intermediate CA for service ETCd |
||
+ | depth=2: C = Ukraine, L = Kharkov, street = app. 131 + street = Lui Pastera St. 322, postalCode = 61172, O = Home Network, OU = IT, CN = Root Certificate Authority for Home Network v2</PRE> |
||
</PRE> |
</PRE> |
||
+ | |||
====Верефикация c nginx==== |
====Верефикация c nginx==== |
||
Для полноты картины создадим тестовый web-сервер и используем подписанный сертификат |
Для полноты картины создадим тестовый web-сервер и используем подписанный сертификат |
||
Строка 887: | Строка 902: | ||
=====Проверка полученного результата===== |
=====Проверка полученного результата===== |
||
Расширенная проверка - проверить что сертификат нельзя использовать в качестве серверного |
Расширенная проверка - проверить что сертификат нельзя использовать в качестве серверного |
||
+ | Конфиг nginx не отличается ничем кроме собственно содержимого сертификата |
||
+ | * Ответ собственно и говорит об этом - '''unsupported certificate purpose''', клиентский сертификат не оч |
||
+ | <PRE> |
||
+ | curl: (60) SSL certificate problem: unsupported certificate purpose |
||
+ | More details here: https://curl.haxx.se/docs/sslcerts.html |
||
+ | |||
+ | curl failed to verify the legitimacy of the server and therefore could not |
||
+ | establish a secure connection to it. To learn more about this situation and |
||
+ | how to fix it, please visit the web page mentioned above. |
||
+ | </PRE> |
||
===Проверка прав для пользователя any=== |
===Проверка прав для пользователя any=== |
||
* работает каки ожидалось - можно получить сертификаты как для сервера так и для клиента |
* работает каки ожидалось - можно получить сертификаты как для сервера так и для клиента |
||
<PRE> |
<PRE> |
||
+ | #!/bin/bash |
||
+ | |||
+ | |||
+ | source ./00_env |
||
+ | unset VAULT_TOKEN |
||
+ | |||
+ | |||
vault \ |
vault \ |
||
login \ |
login \ |
||
Строка 898: | Строка 930: | ||
+ | vault \ |
||
⚫ | |||
+ | write \ |
||
+ | -format=json \ |
||
⚫ | |||
common_name="vault.example.home" \ |
common_name="vault.example.home" \ |
||
alt_names="pki.example.home" \ |
alt_names="pki.example.home" \ |
||
Строка 904: | Строка 939: | ||
+ | vault \ |
||
⚫ | |||
+ | write \ |
||
+ | -format=json \ |
||
⚫ | |||
common_name="vault.example.home" \ |
common_name="vault.example.home" \ |
||
alt_names="pki.example.home" \ |
alt_names="pki.example.home" \ |
||
ttl="43800h" > vault.example.home.SERVER_by_any_user.json |
ttl="43800h" > vault.example.home.SERVER_by_any_user.json |
||
</PRE> |
</PRE> |
||
+ | |||
+ | |||
+ | =Получение сертификатов для кластера etcd= |
||
+ | Вынесено в [[Vault_PKI_Intermediate_ca_etcd_Roles_and_permissions_for_real_cliuster_Kubernetes_the_hard_way_v2|отдельный документ]] |
Текущая версия на 15:54, 25 октября 2022
Вводная часть
Тут описывается настройка на примере сначала тестовых данных (тестовый пользователь, тестовый домен), во второй части описывается создание сертификатов для etcd
Работа с PKI
Создание пользователей и ролей не относится непосредсвенно к настройке PKI но добавлено для полноты так как все равно надо настроить =)
Эта страница - часть большой статьи про CA используемые в k8s: Vault_PKI_Kubernetes_the_hard_way_v2
Упрощение работы
Путь к PKI (k8s_pki_intermediate_ca_for_service_etcd) встречается многократно, и он вынесен в переменную
cat 00_env
export PKI_NAME="k8s_pki_intermediate_ca_for_service_etcd"
Роли
По сути роли здесь - это ПУТЬ к которому нужно будет дать доступ с помощью политик
Тестовая роль для серверных сертификатов
- example-dot-home-server-server-crt - имя роли
- allowed_domains - разрешенный домен для этой роли example.home (настройка работает совместно с allow_subdomains и allow_bare_domains)
- allow_subdomains - разрешить саб-домены к домену определенному в allowed_domains
- allow_any_name - могут ли клиенты запрашивать любой CN. (выглядит небезопасным)
- allow_bare_domains - можно ли запрашивать сертификаты для самого домена из allowed_domains - в примере это example.home
- allow_glob_domain - Позволяет именам, указанным в allow_domains, содержать шаблоны подстановок (например, ftp*.example.home в примере ). Клиентам будет разрешено запрашивать сертификаты с именами, соответствующими шаблонам.
- allow_ip_sans - указывает, могут ли клиенты запрашивать альтернативные имена субъектов IP. Проверка не выполняется, за исключением проверки того, что заданные значения являются допустимыми IP-адресами.
- allow_localhost
- client_flag
- server_flag
- enforce_hostnames
- key_usage
- DigitalSignature
- KeyEncipherment
- ext_key_usage
- ServerAuth
- require_cn
vault\ write \ ${PKI_NAME}/roles/example-dot-home-server-crt \ country="Ukraine" \ locality="Kharkov" \ street_address="Lui Pastera st 322 app. 311"\ postal_code="61172" \ organization="Home Network" \ ou="IT" \ allowed_domains="example.home" \ 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
Success! Data written to: k8s_pki_intermediate_ca_for_service_etcd/roles/example-dot-home-server-crt
Тестовая роль для клиентских сертификатов
vault \ write \ ${PKI_NAME}/roles/example-dot-home-client-crt \ country="Ukraine" \ locality="Kharkov" \ street_address="Lui Pastera st. 322 app. 131" \ postal_code="61172" \ organization="Home Network" \ 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
Success! Data written to: k8s_pki_intermediate_ca_for_service_etcd/roles/example-dot-home-client-crt
Просмотр ролей
Список ролей (применительно к конкретному инстансу PKI)
vault \ list \ ${PKI_NAME}/roles
Keys ---- example-dot-home-client-crt example-dot-home-server-crt
Просмотр роли
vault \ read \ ${PKI_NAME}/roles/example-dot-home-server-crt
Key Value --- ----- allow_any_name false allow_bare_domains false allow_glob_domains false allow_ip_sans true allow_localhost false allow_subdomains true allow_token_displayname false allowed_domains [example.home] allowed_domains_template false allowed_other_sans [] allowed_serial_numbers [] allowed_uri_sans [] basic_constraints_valid_for_non_ca false client_flag false code_signing_flag false country [Ukraine] email_protection_flag false enforce_hostnames true ext_key_usage [ServerAuth] ext_key_usage_oids [] generate_lease false key_bits 2048 key_type rsa key_usage [DigitalSignature KeyEncipherment] locality [Kharkov] max_ttl 87600h no_store false not_before_duration 30s organization [Home Network] ou [IT] policy_identifiers [] postal_code [61172] province [] require_cn true server_flag true street_address [Lui Pastera st 322 app. 311] ttl 0s use_csr_common_name true use_csr_sans true
vault \ read \ ${PKI_NAME}/roles/example-dot-home-client-crt
Key Value --- ----- allow_any_name true allow_bare_domains false allow_glob_domains false allow_ip_sans false allow_localhost false allow_subdomains true allow_token_displayname false allowed_domains [] allowed_domains_template false allowed_other_sans [] allowed_serial_numbers [] allowed_uri_sans [] basic_constraints_valid_for_non_ca false client_flag true code_signing_flag false country [Ukraine] email_protection_flag false enforce_hostnames false ext_key_usage [ClientAuth] ext_key_usage_oids [] generate_lease false key_bits 2048 key_type rsa key_usage [DigitalSignature] locality [Kharkov] max_ttl 87600h no_store false not_before_duration 30s organization [Home Network] ou [IT] policy_identifiers [] postal_code [61172] province [] require_cn true server_flag false street_address [Lui Pastera st. 322 app. 131] ttl 0s use_csr_common_name true use_csr_sans true
Политики
- По сути политики определяют права доступа ТОКЕНА к определнному пути.
Токен же выдается при логине - т.е. в простейшем случае политики должны назначаться на пользователя (авторизация по логину/паролю)
Для доступа к ролям создаем 2 файла с политиками:
Политика для серверных сертефикатов
Политики создаются из файлов, причем удобнее это делать в хашикорповском формате - hlc
Тут к сожалению не получится использовать переменные и нужно вставлять имя PKI вручную
example-dot-home-server-crt-policy.hlc
path "k8s_pki_intermediate_ca_for_service_etcd/issue/example-dot-home-server-crt" { capabilities = ["read", "create", "list", "update"] }
Политика для клиентских сертефикатов
example-dot-home-client-crt-policy.hlc
path "k8s_pki_intermediate_ca_for_service_etcd/issue/example-dot-home-client-crt" { capabilities = ["read", "create", "list", "update"] }
Создание политик из файлов
Политика серверных сертификатов
- Имя политики - example-dot-home-server-crt-policy
- Файл с описанием политики - example-dot-home-server-crt-policy.hlc
vault policy write example-dot-home-server-crt-policy example-dot-home-server-crt-policy.hlc
Success! Uploaded policy: example-dot-home-server-crt-policy
Политика клиентских сертификатов
vault policy write example-dot-home-client-crt-policy example-dot-home-client-crt-policy.hlc
Success! Uploaded policy: example-dot-home-client-crt-policy
Проверка созданных политик
Список политик
vault policy list
default example-dot-home-client-crt-policy example-dot-home-server-crt-policy root
Просмотр политики example-dot-home-server-crt-policy
vault policy read example-dot-home-server-crt-policy path "pki_intermediate_ca/issue/example-dot-home-server-crt" { capabilities = ["read", "create", "list", "update"] }
Просмотр политики example-dot-home-client-crt-policy
vault policy read example-dot-home-client-crt-policy
path "pki_intermediate_ca/issue/example-dot-home-client-crt" { capabilities = ["read", "create", "list", "update"] }
Привязка политик к пользователям
- Пользователи с логином и паролем хорошо подходят для тестирования
- Включить авторизацию по логину/паролю нужно заранее (https://noname.com.ua/mediawiki/index.php/Vault)
Просмотр пользователей
Этот шаг нужен что бы проверить что пользователей которые будем создавать пока не существует
vault \ list \ auth/userpass/users
Создание пользователей
- Политики перечисляются через запятую (что не очевидно из документации, возможно уже исправлено)
- Имена пользователей "говорят" о их назначении
- Пароли простые для тестирования но разные у разных пользователей (для того что бы не допустить ошибок при тестировании и не перепутать пользователя)
Пользователь для получения серверных сертификатов
vault \ write auth/userpass/users/example-dot-home-server-crt-user \ password=server \ policies="example-dot-home-server-crt-policy,default"
Пользователь для получения клиентских сертификатов
vault \ write auth/userpass/users/example-dot-home-client-crt-user \ password=client \ policies="example-dot-home-client-crt-policy,default"
Пользователь для получения и серверных и клиентских сертификатов
vault \ write auth/userpass/users/example-dot-home-any-crt-user \ password=any \ policies="example-dot-home-server-crt-policy,example-dot-home-client-crt-policy,default"
Просмотр созданных пользователей
Список пользователей
vault \ list \ auth/userpass/users
Keys ---- example-dot-home-any-crt-user example-dot-home-client-crt-user example-dot-home-server-crt-user
Просмотр пользователя для создания клиентских и серверных сертификатов
vault \ read \ auth/userpass/users/example-dot-home-any-crt-user
Key Value --- ----- policies [default example-dot-home-client-crt-policy example-dot-home-server-crt-policy] token_bound_cidrs [] token_explicit_max_ttl 0s token_max_ttl 0s token_no_default_policy false token_num_uses 0 token_period 0s token_policies [default example-dot-home-client-crt-policy example-dot-home-server-crt-policy] token_ttl 0s token_type default
Просмотр пользователя для создания серверныхсертификатов
vault \ read \ auth/userpass/users/example-dot-home-server-crt-user
Key Value --- ----- policies [default example-dot-home-server-crt-policy] token_bound_cidrs [] token_explicit_max_ttl 0s token_max_ttl 0s token_no_default_policy false token_num_uses 0 token_period 0s token_policies [default example-dot-home-server-crt-policy] token_ttl 0s token_type default
Просмотр пользователя для создания клиентских сертификатов
vault \ read \ auth/userpass/users/example-dot-home-client-crt-user
Key Value --- ----- policies [default example-dot-home-client-crt-policy] token_bound_cidrs [] token_explicit_max_ttl 0s token_max_ttl 0s token_no_default_policy false token_num_uses 0 token_period 0s token_policies [default example-dot-home-client-crt-policy] token_ttl 0s token_type default
Проверка получения сертефикатов
- Получить сертификат для тестового домена
- Проверить что пользователь с правами на серверные сертификаты не может получить клиентские и то что пользователь с правами на серверные сертификаты не может получить клиентские
Получение серверного сертефиката
Авторизация с логином и паролем
vault \ login \ -method=userpass \ username=example-dot-home-server-crt-user \ password=server
Key Value --- ----- token s.Wiy7YVCrte88i0QIHc4jmvQP token_accessor ptB7o9d6yOq5w4Ra5Q44W1FF token_duration 768h token_renewable true token_policies ["default" "example-dot-home-server-crt-policy"] identity_policies [] policies ["default" "example-dot-home-server-crt-policy"] token_meta_username example-dot-home-server-crt-user
Получение сертефиката
- Получаем сертификат для тестового домена - vault.example.home и Alt Name pki.example.home
vault \ write \ -format=json \ ${PKI_NAME}/issue/example-dot-home-server-crt \ common_name="vault.example.home" \ alt_names="pki.example.home" \ ttl="43800h" > vault.example.home.crt
Проверка полученного сертефиката
Результат в файле:
cat vault.example.home.crt
Сокращенный вывод:
{ "request_id": "d2ff6e16-1bf6-730a-f4d1-2aefa2fcbb3e", "lease_id": "", "lease_duration": 0, "renewable": false, "data": { "ca_chain": [ "-----BEGIN CERTIFICATE-----rCdewvVGkgifREEGI2GltrDrH6rMugtVjuNAWzW40pVLKl/+0/Jv87wAv\nfITqQgiqa0FjitvfYQO2qIxSCJkt+kD3Vg==\n-----END CERTIFICATE-----" ], "certificate": "-----BEGIN CERTIFICATE-----m35waa9ld+hkNIcf/1qR4Gvwae9w0\n-----END CERTIFICATE-----", "expiration": 1822736540, "issuing_ca": "-----BEGIN CERTIFICATE-----rCdewvVGkgifREEGI2GltrDrH6rMugtVjuNAWzW40pVLKl/+0/Jv87wAv\nfITqQgiqa0FjitvfYQO2qIxSCJkt+kD3Vg==\n-----END CERTIFICATE-----", "private_key": "-----BEGIN RSA PRIVATE KEY-----vNhpK6RKn2b4EExuuZTRAcPEV3ddhOOoZpyy48WVEF5Iq3s+7/NZOq66poZUz17z\nwhRJIuic/EzYBnmKy0T4wdCyhkqLVGHIvH+412cJ5eqyHeMQbzG+oA==\n-----END RSA PRIVATE KEY-----", "private_key_type": "rsa", "serial_number": "28:ac:20:32:fe:46:b2:78:61:11:f0:46:da:e7:d2:cf:02:fc:4f:f1" }, "warnings": null }
Из JSON можно выделить отдельные поля
cat vault.example.home.crt | jq -r .data.ca_chain[] > vault.example.home.ca_chain.pem cat vault.example.home.crt | jq -r .data.certificate > vault.example.home.certificate.pem cat vault.example.home.crt | jq -r .data.issuing_ca > vault.example.home.issuing_ca.pem
Сертификат сервера
Наиболее интересные поля - ожидаемые значения:
- CN = vault.example.home
- X509v3 Subject Alternative Name: DNS:pki.example.home, DNS:vault.example.home
- IP адреса в AltNames не присутвуют
openssl x509 -in vault.example.home.certificate.pem -text -noout
Certificate: Data: Version: 3 (0x2) Serial Number: 28:ac:20:32:fe:46:b2:78:61:11:f0:46:da:e7:d2:cf:02:fc:4f:f1 Signature Algorithm: sha256WithRSAEncryption Issuer: C = Ukraine, L = Kharkov, street = Lui Pastera st. 322 app. 131, postalCode = 61172, O = K8s The Hardest Way Labs, OU = IT, CN = Intermediate CA for service ETCd Validity Not Before: Oct 6 11:41:54 2022 GMT Not After : Oct 5 11:42:20 2027 GMT Subject: C = Ukraine, L = Kharkov, street = Lui Pastera st 322 app. 311, postalCode = 61172, O = Home Network, OU = IT, CN = vault.example.home Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public-Key: (2048 bit) Modulus: 00:ad:4e:38:25:33:11:b0:aa:ab:1a:17:7f:8e:df: ... e5:80:12:b9:d2:68:29:5e:85:d3:7a:3e:06:e8:e7: e6:27 Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Key Usage: critical Digital Signature, Key Encipherment X509v3 Extended Key Usage: TLS Web Server Authentication X509v3 Subject Key Identifier: 4C:4C:22:C1:44:68:25:D0:6B:AA:7F:AB:5C:8E:16:F5:B7:BC:DF:AF X509v3 Authority Key Identifier: keyid:60:41:31:79:58:90:A9:63:62:C2:26:FD:8F:02:B6:07:1A:1D:5C:50 Authority Information Access: CA Issuers - URI:http://vault.home:8200/v1/k8s_pki_intermediate_ca_for_service_etcd/ca X509v3 Subject Alternative Name: DNS:pki.example.home, DNS:vault.example.home X509v3 CRL Distribution Points: Full Name: URI:http://vault.home:8200/v1/k8s_pki_intermediate_ca_for_service_etcd/crl Signature Algorithm: sha256WithRSAEncryption 7a:ee:f9:5a:88:dc:ed:0d:b1:f7:26:97:d9:fa:98:e7:b3:43: ...
Промежуточный CA
openssl x509 -in vault.example.home.issuing_ca.pem -text -noout
- Видно CN = Intermediate CA for service ETCd, другими словами это промежуточный сертификат удостоверяющего центра (СА) для ETCd
Certificate: Data: Version: 3 (0x2) Serial Number: 35:0e:d5:7b:85:55:57:d3:99:ed:2c:35:c7:db:d3:99:ac:9b:a3:01 Signature Algorithm: sha256WithRSAEncryption Issuer: C = Ukraine, L = Kharkov, street = app. 131 + street = Lui Pastera St. 322, postalCode = 61172, O = Home Network, OU = IT, CN = Root Certificate Authority for Home Network v2 Validity Not Before: Oct 3 15:53:05 2022 GMT Not After : Sep 28 15:53:35 2042 GMT Subject: C = Ukraine, L = Kharkov, street = Lui Pastera st. 322 app. 131, postalCode = 61172, O = K8s The Hardest Way Labs, OU = IT, CN = Intermediate CA for service ETCd Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public-Key: (2048 bit) Modulus: 00:c3:04:35:f0:29:59:33:db:a3:8a:88:f6:44:b0: ... 58:4a:d6:3d:3c:5d:3f:42:a0:d8:5b:65:5f:71:ba: 3e:57 Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Key Usage: critical Certificate Sign, CRL Sign X509v3 Basic Constraints: critical CA:TRUE X509v3 Subject Key Identifier: 60:41:31:79:58:90:A9:63:62:C2:26:FD:8F:02:B6:07:1A:1D:5C:50 X509v3 Authority Key Identifier: keyid:02:F8:85:2B:75:F8:E1:1C:69:28:30:32:21:2D:86:71:AF:AB:EC:3C Authority Information Access: CA Issuers - URI:http://vault.home:8200/v1/k8s_pki_root_ca/ca X509v3 CRL Distribution Points: Full Name: URI:http://vault.home:8200/v1/k8s_pki_root_ca/crl Signature Algorithm: sha256WithRSAEncryption 65:f8:9d:6c:6d:6a:14:d3:37:32:ae:c1:de:26:f3:c8:9f:e6: ... 42:08:aa:6b:41:63:8a:db:df:61:03:b6:a8:8c:52:08:99:2d: fa:40:f7:56
Верефикация
Окончательная проверка цепочки доверия
Корневой Сертификат → Промежуточный для СА Etcd → Тестовый Сертификат
- Корневой сертификат не является секретным (в отличие от ключа!) и его всегда можно скачать с Vault:
echo "-----BEGIN CERTIFICATE-----" > k8s_pki_root_ca.pem && \ curl "http://vault.home:8200/v1/k8s_pki_root_ca/ca" | base64 >> k8s_pki_root_ca.pem && \ echo "-----END CERTIFICATE-----" >> k8s_pki_root_ca.pem
- Указать промежуточный как untrusted (или добавить в доверенные)
openssl \ verify \ -verbose \ -CAfile k8s_pki_root_ca.pem \ -untrusted vault.example.home.issuing_ca.pem \ vault.example.home.certificate.pem
vault.example.home.certificate.pem: OK
Второй способ - это создание "бандла" (те поместить в один файл промежуточный CA и корневой СА)
cat vault.example.home.issuing_ca.pem > vault.example.home.ca_bundle cat vault.example.home.certificate.pem >> vault.example.home.ca_bundle
Теперь верификация проходит без беспокоящего -untrusted
openssl \ verify \ -show_chain \ -CAfile k8s_ca_bundle.pem \ vault.example.home.certificate.pem
vault.example.home.certificate.pem: OK Chain: depth=0: C = Ukraine, L = Kharkov, street = Lui Pastera st 322 app. 311, postalCode = 61172, O = Home Network, OU = IT, CN = vault.example.home (untrusted) depth=1: C = Ukraine, L = Kharkov, street = Lui Pastera st. 322 app. 131, postalCode = 61172, O = K8s The Hardest Way Labs, OU = IT, CN = Intermediate CA for service ETCd depth=2: C = Ukraine, L = Kharkov, street = app. 131 + street = Lui Pastera St. 322, postalCode = 61172, O = Home Network, OU = IT, CN = Root Certificate Authority for Home Network v2
Верефикация c nginx
Для полноты картины создадим тестовый web-сервер и используем подписанный сертификат
- Пример виртуалхоста
- Путь к ключу и сертификату (ключ можно получить из оригинального вывода Vault при создании сертификата,
ssl_certificate /etc/nginx/certs/vault.example.home.ca_bundle; ssl_certificate_key /etc/nginx/certs/vault.example.home.key;
Формат в nginx отличается - в файле /etc/nginx/certs/vault.example.home.ca_bundle СНАЧАЛА идет сертификат сервера, а потом - промежуточный сертификат (https://nginx.org/en/docs/http/configuring_https_servers.html)
* Полный конфиг server { listen 8203 default_server ssl; root /var/www/html; server_name vault.example.home; access_log /var/log/nginx/vault.example.home-access.log postdata; error_log /var/log/nginx/vault.example.home-error.log; ssl_certificate /etc/nginx/certs/vault.example.home.ca_bundle; ssl_certificate_key /etc/nginx/certs/vault.example.home.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5; location / { client_body_buffer_size 64k; client_body_in_single_buffer on; proxy_pass http://127.0.0.1:8200; proxy_set_header Host $host:$server_port; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_http_version 1.1; proxy_request_buffering off; } }
Для того что бы проверить, нужно на том хосте откуда делается запрос добавить сертификат СА в доверенные
- в /usr/local/share/ca-certificates/extra положить СА (его всегда можно скачать)
- запустить update-ca-certificates
# update-ca-certificates
Updating certificates in /etc/ssl/certs... 1 added, 0 removed; done. Running hooks in /etc/ca-certificates/update.d... Adding debian:k8s_pki_root_ca.pem done. done.
После этого curl может подключиться без ошибок верефикации
curl -v https://vault.example.home:8203
* successfully set certificate verify locations: * CAfile: none CApath: /etc/ssl/certs * TLSv1.3 (OUT), TLS handshake, Client hello (1): * TLSv1.3 (IN), TLS handshake, Server hello (2): * TLSv1.2 (IN), TLS handshake, Certificate (11): * TLSv1.2 (IN), TLS handshake, Server key exchange (12): * TLSv1.2 (IN), TLS handshake, Server finished (14): * TLSv1.2 (OUT), TLS handshake, Client key exchange (16): * TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1): * TLSv1.2 (OUT), TLS handshake, Finished (20): * TLSv1.2 (IN), TLS handshake, Finished (20): * SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384 * ALPN, server accepted to use http/1.1 * Server certificate: * subject: C=Ukraine; L=Kharkov; street=Lui Pastera st 322 app. 311; postalCode=61172; O=Home Network; OU=IT; CN=vault.example.home * start date: Oct 6 11:41:54 2022 GMT * expire date: Oct 5 11:42:20 2027 GMT * subjectAltName: host "vault.example.home" matched cert's "vault.example.home" * issuer: C=Ukraine; L=Kharkov; street=Lui Pastera st. 322 app. 131; postalCode=61172; O=K8s The Hardest Way Labs; OU=IT; CN=Intermediate CA for service ETCd * SSL certificate verify ok. > GET / HTTP/1.1 > Host: vault.example.home:8203 > User-Agent: curl/7.64.0 > Accept: */* > < HTTP/1.1 404 Not Found < Server: nginx/1.14.2 < Date: Fri, 07 Oct 2022 17:22:22 GMT < Content-Type: text/plain; charset=utf-8 < Content-Length: 19 < Connection: keep-alive < Cache-Control: no-store < X-Content-Type-Options: nosniff
Код 404 тут ожидаем так как нет задачи получить данные, а только проверить правильность настройки SSL
Получение клиентского сертефиката
Проверка прав (негативный сценарий)
С "серверным" пользователем - нет прав
source ./00_env vault \ login \ -method=userpass \ username=example-dot-home-server-crt-user \ password=server
Success! You are now authenticated. The token information displayed below is already stored in the token helper. You do NOT need to run "vault login" again. Future Vault requests will automatically use this token. Key Value --- ----- token s.P9nYzZ3Pev2IeNKaUYvDIDdt token_accessor AbXtLIzNhYJRvv6paZr3U6cn token_duration 768h token_renewable true token_policies ["default" "example-dot-home-server-crt-policy"] identity_policies [] policies ["default" "example-dot-home-server-crt-policy"] token_meta_username example-dot-home-server-crt-user
vault \ write \ -format=json \ ${PKI_NAME}/issue/example-dot-home-client-crt \ common_name="vault.example.home" \ alt_names="pki.example.home" \ ttl="43800h" > vault.example.home-client.crt
Error writing data to k8s_pki_intermediate_ca_for_service_etcd/issue/example-dot-home-client-crt: Error making API request. URL: PUT http://127.0.0.1:8200/v1/k8s_pki_intermediate_ca_for_service_etcd/issue/example-dot-home-client-crt Code: 403. Errors: * 1 error occurred: * permission denied
Результат соответствует ожидаемому.
Получение клиентского сертификата c правильным пользователем
vault \ login \ -method=userpass \ username=example-dot-home-any-crt-user \ password=any vault \ write \ -format=json \ ${PKI_NAME}/issue/example-dot-home-client-crt \ common_name="vault.example.home" \ alt_names="pki.example.home" \ ttl="43800h" > vault.example.home-client.crt.json Success! You are now authenticated. The token information displayed below is already stored in the token helper. You do NOT need to run "vault login" again. Future Vault requests will automatically use this token. Key Value --- ----- token s.vAKcP6hGLv9OHkm8ToBHFq5M token_accessor OoNShUinoMhne5s8scFcZ0Hm token_duration 768h token_renewable true token_policies ["default" "example-dot-home-client-crt-policy" "example-dot-home-server-crt-policy"] identity_policies [] policies ["default" "example-dot-home-client-crt-policy" "example-dot-home-server-crt-policy"] token_meta_username example-dot-home-any-crt-user
Проверка полученного результата
cat vault.example.home-client.crt.json | jq -r '.data.certificate' > vault.example.home-client.crt cat vault.example.home-client.crt.json | jq -r '.data.private_key' > vault.example.home-client.key
X509v3 Extended Key Usage: TLS Web Client Authentication
openssl x509 -noout -text -in certificate_client.pem <PRE> Certificate: Data: Version: 3 (0x2) Serial Number: 51:de:46:e0:72:1e:2b:28:30:3b:9e:94:f4:da:71:f8:19:5e:26:6d Signature Algorithm: sha256WithRSAEncryption Issuer: C = Ukraine, L = Kharkov, street = Lui Pastera st. 322 app. 131, postalCode = 61172, O = K8s The Hardest Way Labs, OU = IT, CN = Intermediate CA for service ETCd Validity Not Before: Oct 8 16:53:43 2022 GMT Not After : Oct 7 16:54:10 2027 GMT Subject: C = Ukraine, L = Kharkov, street = Lui Pastera st. 322 app. 131, postalCode = 61172, O = Home Network, OU = IT, CN = vault.example.home Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public-Key: (2048 bit) Modulus: 00:c3:21:f6:55:f9:f0:a7:19:52:b9:22:a6:9a:99: ... 05:e5 Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Key Usage: critical Digital Signature X509v3 Extended Key Usage: TLS Web Client Authentication X509v3 Subject Key Identifier: C9:F1:9F:83:D7:0B:B8:F2:7E:BB:84:D1:FE:6F:7E:75:7B:40:F4:86 X509v3 Authority Key Identifier: keyid:60:41:31:79:58:90:A9:63:62:C2:26:FD:8F:02:B6:07:1A:1D:5C:50 Authority Information Access: CA Issuers - URI:http://vault.home:8200/v1/k8s_pki_intermediate_ca_for_service_etcd/ca X509v3 Subject Alternative Name: DNS:pki.example.home, DNS:vault.example.home X509v3 CRL Distribution Points: Full Name: URI:http://vault.home:8200/v1/k8s_pki_intermediate_ca_for_service_etcd/crl Signature Algorithm: sha256WithRSAEncryption 94:bb:a8:54:41:86:16:75:06:e7:fb:5a:5f:e0:56:61:5d:ff: ... 3e:56:1a:6f
Проверка полученного результата
Расширенная проверка - проверить что сертификат нельзя использовать в качестве серверного Конфиг nginx не отличается ничем кроме собственно содержимого сертификата
- Ответ собственно и говорит об этом - unsupported certificate purpose, клиентский сертификат не оч
curl: (60) SSL certificate problem: unsupported certificate purpose More details here: https://curl.haxx.se/docs/sslcerts.html curl failed to verify the legitimacy of the server and therefore could not establish a secure connection to it. To learn more about this situation and how to fix it, please visit the web page mentioned above.
Проверка прав для пользователя any
- работает каки ожидалось - можно получить сертификаты как для сервера так и для клиента
#!/bin/bash source ./00_env unset VAULT_TOKEN vault \ login \ -method=userpass \ username=example-dot-home-any-crt-user \ password=any vault \ write \ -format=json \ ${PKI_NAME}/issue/example-dot-home-client-crt \ common_name="vault.example.home" \ alt_names="pki.example.home" \ ttl="43800h" > vault.example.home.CLIENT_by_any_user.json vault \ write \ -format=json \ ${PKI_NAME}/issue/example-dot-home-server-crt \ common_name="vault.example.home" \ alt_names="pki.example.home" \ ttl="43800h" > vault.example.home.SERVER_by_any_user.json
Получение сертификатов для кластера etcd
Вынесено в отдельный документ