Vault PKI Intermediate ca etcd Roles and permissions Kubernetes the hard way v2

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску

Работа с 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 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

Верефикация

  • Указать промежуточный как 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