Vault PKI Intermediate ca etcd Roles and permissions Kubernetes the hard way v2: различия между версиями
Sirmax (обсуждение | вклад) |
Sirmax (обсуждение | вклад) |
||
Строка 541: | Строка 541: | ||
</PRE> |
</PRE> |
||
− | + | ==Получение клиентского сертефиката== |
|
====Проверка прав==== |
====Проверка прав==== |
||
С "серверным" пользователем - нет прав |
С "серверным" пользователем - нет прав |
Версия 17:49, 7 октября 2022
Работа с 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
Политики
- По сути политики определяют права доступа ТОКЕНА к определнному пути.
Токен же выдается при логине - т.е. в простейшем случае политики должны назначаться на пользователя (авторизация по логину/паролю)
Для доступа к ролям создаем 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_etc/issue/example-dot-home-client-crt" { capabilities = ["read", "create", "list", "update"] }
Создание политик из файлов
Политика серверных сертификатов
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 issuing_ca.pem -text -noout Certificate: Data: Version: 3 (0x2) Serial Number: 40:b2:aa:32:ee:ea:2f:84:75:bb:8f:ec:2e:98:56:70:1c:66:f6:0d 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 Validity Not Before: Oct 11 09:22:37 2021 GMT Not After : Oct 6 09:23:07 2041 GMT Subject: C = Ukraine, L = Kharkov, street = Lui Pastera st. 322 app. 131, postalCode = 61172, O = Home Network, OU = IT, CN = Intermediate CA Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public-Key: (2048 bit) Modulus: Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Key Usage: critical Certificate Sign, CRL Sign X509v3 Basic Constraints: critical CA:TRUE X509v3 Subject Key Identifier: 57:CC:17:CF:CF:21:94:71:42:B8:AB:06:7C:FD:FC:45:6D:F9:6A:4F X509v3 Authority Key Identifier: keyid:DB:3A:73:7A:03:25:2E:17:48:46:58:67:19:AD:86:2E:04:3D:EB:EC Signature Algorithm: sha256WithRSAEncryption
Верефикация
- Указать промежуточный как untrusted (или добавить rootCA в доверенные)
openssl verify -verbose -CAfile rootCA.pem -untrusted issuing_ca.pem certificate.pem certificate.pem: OK
Получение клиентского сертефиката
Проверка прав
С "серверным" пользователем - нет прав
URL: PUT http://vault.home:8200/v1/pki_intermediate_ca/issue/example-dot-home-client-crt Code: 403. Errors: * 1 error occurred: * permission denied
Получение клиентского сертификата c правильным пользователем
vault \ login \ -method=userpass \ username=example-dot-home-client-crt-user \ password=client vault write -format=json pki_intermediate_ca/issue/example-dot-home-client-crt \ common_name="vault.example.home" \ alt_names="pki.example.home" \ ttl="43800h" > vault.example.home.CLIENT.json
Ожидаемый результат:
X509v3 Extended Key Usage: TLS Web Client Authentication
openssl x509 -noout -text -in certificate_client.pem Certificate: Data: Version: 3 (0x2) Serial Number: 29:02:a3:28:8e:fc:48:bd:1a:5b:f9:46:e1:bf:87:27:e0:80:79:c3 Signature Algorithm: sha256WithRSAEncryption Issuer: C = Ukraine, L = Kharkov, street = Lui Pastera st. 322 app. 131, postalCode = 61172, O = Home Network, OU = IT, CN = Intermediate CA Validity Not Before: Oct 11 12:31:10 2021 GMT Not After : Oct 10 12:31:37 2026 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: Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Key Usage: critical Digital Signature X509v3 Extended Key Usage: TLS Web Client Authentication X509v3 Subject Key Identifier: 4A:1E:33:0C:03:E0:91:6D:17:1E:2B:4A:9F:53:98:7D:4C:80:43:83
Проверка прав для пользователя any
- работает каки ожидалось - можно получить сертификаты как для сервера так и для клиента
vault \ login \ -method=userpass \ username=example-dot-home-any-crt-user \ password=any vault write -format=json pki_intermediate_ca/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_intermediate_ca/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