Vault PKI Intermediate ca etcd Roles and permissions Kubernetes the hard way v2
Материал из noname.com.ua
Версия от 15:47, 4 октября 2022; Sirmax (обсуждение | вклад) (→Тестовая роль для серверных сертификатов)
Работа с 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
Тестовая роль для клиентских сертификатов
vault \ write \ pki_intermediate_ca/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
Просмотр ролей
vault \ list \ pki_intermediate_ca/roles Keys ---- example-dot-home-client-crt example-dot-home-server-crt
vault read pki_intermediate_ca/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 файла с политиками:
Политика для серверных сертефикатов
example-dot-home-server-crt-policy.hlc
path "pki_intermediate_ca/issue/example-dot-home-server-crt" { capabilities = ["read", "create", "list", "update"] }
Политика для клиентских сертефикатов
example-dot-home-client-crt-policy.hlc
path "pki_intermediate_ca/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
vault policy write example-dot-home-client-crt-policy example-dot-home-client-crt-policy.hlc
Проверка созданных политик
vault policy list default example-dot-home-client-crt-policy example-dot-home-server-crt-policy root
vault policy read example-dot-home-server-crt-policy path "pki_intermediate_ca/issue/example-dot-home-server-crt" { capabilities = ["read", "create", "list", "update"] }
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 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.crt
Проверка полученного сертефиката
cat vault.example.home.crt { "request_id": "3d679cb8-0aa1-9920-672e-b56831fc53b8", "lease_id": "", "lease_duration": 0, "renewable": false, "data": { "ca_chain": [ "-----BEGIN CERTIFICATE-----uVGvIFquMpVj\n0ajUAed1yuVd7S2USE1s8RyN7j3t0D7FG7pRECTBnZYKqBc7OI2YdiwdPvQH\n-----END CERTIFICATE-----" ], "certificate": "-----BEGIN CERTIFICATE-----dNVFGyG16ZABF66E1j1O/MTRjB3cZIHj1rMP\nc84dH3ykPoe80T6zGblRgxrZOIh/EQ==\n-----END CERTIFICATE-----", "expiration": 1791633878, "issuing_ca": "-----BEGIN CERTIFICATE-----uVGvIFquMpVj\n0ajUAed1yuVd7S2USE1s8RyN7j3t0D7FG7pRECTBnZYKqBc7OI2YdiwdPvQH\n-----END CERTIFICATE-----", "private_key": "-----BEGIN RSA PRIVATE KEY-----aAg7YWcEsZMl\ntdqBAoGAX5UJPX9VSbm/kI5nruAnQXcfkmUWIQA3GDWdbGfqaY4AZZleQv/0mMJf\nAgUT+e/vFuHaDAxY6rXh7dl3aM3JiJgdLxJ1vFFeaKqHHonH83PT0921S+MLiB5/\n9EdomgHndqzJXVrMLThUR6PiUTZtrG48tsI6w9rOk1ZELvE5HJI=\n-----END RSA PRIVATE KEY-----", "private_key_type": "rsa", "serial_number": "3b:a5:4d:03:64:bf:91:b5:6a:6f:0a:c8:aa:05:11:68:29:a8:6d:dd" }, "warnings": null }
cat vault.example.home.crt | jq -r .data.ca_chain[] > ca_chain.pem cat vault.example.home.crt | jq -r .data.certificate > certificate.pem cat vault.example.home.crt | jq -r .data.issuing_ca > issuing_ca.pem
Сертификат сервера
Наиболее интересные поля - ожидаемые значения:
- CN = vault.example.home
- X509v3 Subject Alternative Name: DNS:pki.example.home, DNS:vault.example.home
openssl x509 -in certificate.pem -text -noout
Certificate: Data: Version: 3 (0x2) Serial Number: 3b:a5:4d:03:64:bf:91:b5:6a:6f:0a:c8:aa:05:11:68:29:a8:6d:dd 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:04:12 2021 GMT Not After : Oct 10 12:04:38 2026 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: 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: 5B:00:DB:44:EB:59:B4:9A:86:BE:9D:3D:A3:E0:DC:C6:EC:71:E4:BB X509v3 Authority Key Identifier: keyid:57:CC:17:CF:CF:21:94:71:42:B8:AB:06:7C:FD:FC:45:6D:F9:6A:4F Authority Information Access: CA Issuers - URI:http://vault.home:8200/v1/pki_intermediate_ca/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/pki_intermediate_ca/crl Signature Algorithm: sha256WithRSAEncryption
Промежуточный 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