Deckhouse Virtualization Platform (DVP) предоставляет встроенные средства управления TLS-сертификатами в кластере и поддерживает:
- заказ сертификатов во всех поддерживаемых источниках, таких как Let’s Encrypt, HashiCorp Vault, Venafi;
- выпуск самоподписанных сертификатов;
- автоматический перевыпуск и контроль срока действия сертификатов;
- установку
cm-acme-http-solverна master-узлы и выделенные узлы.
На этой странице описаны доступные в DVP возможности управления сертификатами, а также порядок работы с издателями сертификатов.
Описание примеров настройки сертификатов, порядок работы с аннотацией tls-acme и способы безопасного использования учётных данных приведены на странице «Использование TLS-сертификатов».
Мониторинг
DVP экспортирует метрики в Prometheus, что позволяет отслеживать:
- срок действия сертификатов;
- статус перевыпуска сертификатов.
Роли доступа
В DVP предопределены несколько ролей для доступа к ресурсам:
| Роль | Права доступа |
|---|---|
User |
Просмотр ресурсов Certificate и Issuer в доступных пространствах имён, а также глобальных ресурсов ClusterIssuer. |
Editor |
Управление ресурсами Certificate в доступных пространствах имён. |
Admin |
Управление ресурсами Issuer в доступных пространствах имён. |
ClusterEditor |
Управление ресурсами Certificate и Issuer во всех пространствах имён, а также ресурсами ClusterIssuer. |
SuperAdmin |
Управление внутренними служебными объектами. |
Работа с издателями сертификатов
В DVP по умолчанию поддерживаются следующие издатели сертификатов (ClusterIssuer):
-
letsencrypt— выпускает TLS-сертификаты, используя публичный удостоверяющий центр Let’s Encrypt и HTTP-валидацию по протоколу ACME. Используется для автоматического получения доверенных сертификатов, подходящих для большинства публичных сервисов. Подробное описание настроек доступно в официальной документацииcert-manager. -
letsencrypt-staging— аналогиченletsencrypt, но использует тестовый сервер Let’s Encrypt. Подходит для отладки конфигурации и проверки процесса выпуска сертификатов. Подробнее про тестовую среду Let’s Encrypt можно прочитать в официальной документации. -
selfsigned— выпускает самоподписанные сертификаты. Используется в ситуациях, когда не требуется внешнее доверие к сертификату (например, для внутренних сервисов). -
selfsigned-no-trust— также выпускает самоподписанные сертификаты, но без автоматического добавления корневого сертификата в доверенные. Используется для ручного управления доверием.
В некоторых случаях вам могут понадобиться дополнительные виды ClusterIssuer:
- если вы хотите использовать сертификат от Let’s Encrypt, но с DNS-валидацией через стороннего DNS-провайдера;
- когда необходимо использовать удостоверяющий центр (CA), отличный от Let’s Encrypt.
Все виды поддерживаемых удостоверяющих центров перечислены в документации
cert-manager.
Добавление ClusterIssuer с валидацией DNS-01 через вебхук
Для подтверждения владения доменом через Let’s Encrypt с помощью метода DNS-01 необходимо,
чтобы модуль cert-manager мог создавать TXT-записи в зоне DNS, связанной с доменом.
У модуля cert-manager есть встроенная поддержка популярных DNS-провайдеров,
таких как AWS Route53, Google Cloud DNS, Cloudflare и других.
Полный перечень доступен в официальной документации cert-manager.
Модуль cert-manager в Deckhouse Platform может автоматически создавать ClusterIssuer для Cloudflare, Amazon Route53, DigitalOcean, Google Cloud DNS и Yandex Cloud DNS при заполнении соответствующих параметров модуля.
Порядок настройки Yandex Cloud DNS описан в разделе Заказ wildcard-сертификата с DNS в Yandex Cloud DNS.
Если провайдер не поддерживается напрямую,
можно настроить вебхук и разместить в кластере собственный обработчик ACME-запросов,
который будет выполнять нужные операции для обновления DNS-записей,
а затем создать ClusterIssuer с настройками dns01.webhook согласно документации вебхука.
Добавление ClusterIssuer, использующего собственный удостоверяющий центр (CA)
-
Сгенерируйте сертификат:
openssl ecparam -name prime256v1 -genkey -out rootCAKey.pem openssl req -x509 -sha256 -new -nodes -key rootCAKey.pem -days 3650 -out rootCACert.pem -
В пространстве имён
d8-cert-managerсоздайте секрет с произвольным именем, содержащий данные файлов сертификатов.-
Пример создания секрета с помощью команды
d8 k:d8 k create secret tls internal-ca-key-pair -n d8-cert-manager --key="rootCAKey.pem" --cert="rootCACert.pem" -
Пример создания секрета из YAML-файла (содержимое файлов сертификатов должно быть закодировано в Base64):
apiVersion: v1 data: tls.crt: <результат команды `cat rootCACert.pem | base64 -w0`> tls.key: <результат команды `cat rootCAKey.pem | base64 -w0`> kind: Secret metadata: name: internal-ca-key-pair namespace: d8-cert-manager type: Opaque
-
-
Создайте ClusterIssuer с произвольным именем из созданного секрета:
apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: inter-ca spec: ca: secretName: internal-ca-key-pair # Имя созданного секрета.
Теперь можно использовать созданный ClusterIssuer для получения сертификатов для всех компонентов DVP или конкретного компонента.
Например, чтобы использовать ClusterIssuer для получения сертификатов для всех компонентов DVP,
укажите его имя в глобальном параметре clusterIssuerName:
spec:
settings:
modules:
https:
certManager:
clusterIssuerName: inter-ca
mode: CertManager
publicDomainTemplate: '%s.<public_domain_template>'
version: 1
Добавление Issuer и ClusterIssuer, использующих HashiCorp Vault для заказа сертификатов
Для настройки заказа сертификатов с помощью Vault используйте документацию HashiCorp.
После настройки PKI и включения авторизации в Kubernetes, выполните следующее:
-
Создайте ServiceAccount и скопируйте ссылку на его Secret:
d8 k create serviceaccount issuer ISSUER_SECRET_REF=$(d8 k get serviceaccount issuer -o json | jq -r ".secrets[].name") -
Создайте ресурс Issuer:
d8 k apply -f - <<EOF apiVersion: cert-manager.io/v1 kind: Issuer metadata: name: vault-issuer namespace: default spec: vault: server: http://vault.default.svc.cluster.local:8200 # Указывается на этапе конфигурации PKI. path: pki/sign/example-dot-com auth: kubernetes: mountPath: /v1/auth/kubernetes role: issuer secretRef: name: $ISSUER_SECRET_REF key: token EOF -
Создайте ресурс Certificate для получения TLS-сертификата, подписанного CA Vault:
d8 k apply -f - <<EOF apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: example-com namespace: default spec: secretName: example-com-tls issuerRef: name: vault-issuer # Домены указываются на этапе конфигурации PKI в Vault. commonName: www.example.com dnsNames: - www.example.com EOF