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 и Issuer в доступных пространствах имён.
ClusterEditor Управление ресурсами Certificate и Issuer во всех пространствах имён.
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.

Если провайдер не поддерживается напрямую, можно настроить вебхук и разместить в кластере собственный обработчик ACME-запросов, который будет выполнять нужные операции для обновления DNS-записей.

Данный пример основан на использовании сервиса Yandex Cloud DNS:

  1. Для обработки вебхука разместите в кластере сервис Yandex Cloud DNS ACME webhook согласно официальной документации.
  2. Создайте ресурс ClusterIssuer, следуя примеру:

    apiVersion: cert-manager.io/v1
    kind: ClusterIssuer
    metadata:
      name: yc-clusterissuer
      namespace: default
    spec:
      acme:
        # Заменить этот адрес электронной почты на свой собственный.
        # Let's Encrypt будет использовать его, чтобы связаться с вами по поводу истекающих
        # сертификатов и вопросов, связанных с вашей учетной записью.
        email: your@email.com
        server: https://acme-staging-v02.api.letsencrypt.org/directory
        privateKeySecretRef:
          # Ресурс секретов, который будет использоваться для хранения закрытого ключа аккаунта.
          name: secret-ref
        solvers:
          - dns01:
              webhook:
                config:
                  # Идентификатор папки, в которой расположена DNS-зона.
                  folder: <your-folder-ID>
                  # Секрет, используемый для доступа к учетной записи сервиса.
                  serviceAccountSecretRef:
                    name: cert-manager-secret
                    key: iamkey.json
                groupName: acme.cloud.yandex.com
                solverName: yandex-cloud-dns
    

Добавление ClusterIssuer, использующего собственный удостоверяющий центр (CA)

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

    openssl genrsa -out rootCAKey.pem 2048
    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, использующих HashiСorp Vault для заказа сертификатов

Для настройки заказа сертификатов с помощью Vault используйте документацию HashiСorp.

После настройки 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