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)

  1. Сгенерируйте сертификат:

    openssl ecparam -name prime256v1 -genkey -out rootCAKey.pem
    openssl req -x509 -sha256 -new -nodes -key rootCAKey.pem -days 3650 -out rootCACert.pem
    
  2. В пространстве имён 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
      
  3. Создайте 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, выполните следующее:

  1. Создайте ServiceAccount и скопируйте ссылку на его Secret:

    d8 k create serviceaccount issuer
         
    ISSUER_SECRET_REF=$(d8 k get serviceaccount issuer -o json | jq -r ".secrets[].name")
    
  2. Создайте ресурс 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
    
  3. Создайте ресурс 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
    

Дополнительные ресурсы