Как добавить сертификат в кластер

В развернутом кластере РОСА Кубис можно:

  • заменить сертификат, установленный в процессе инсталляции кластера на промежуточный, корпоративный;
  • установить сертификат ACME (Automatic Certificate Management Environment).

Сценарий замены сертификата

Сценарий замены сертификата:

  1. сделать бэкап существующей конфигурации;
  2. добавить сертификат в кластер Комплекса:
  • промежуточный;
  • сертификат ACME;
  • сертификат ACME сервера Let’s Enсrypt;
  • корпоративный.
  1. обновить настройки сертификатов в системных сервисах. Это действие необходимо выполнить, если добавляется промежуточный сертификат или сертификат ACME.

Создание бэкапа

Перед изменением сертификата в кластере следует создать бэкап ресурсов, чтобы иметь возможность оперативно откатить изменения

В кластере нужно перейти в раздел "Резервное копирование и восстановление". Следует убедиться, что подключено S3-хранилище или подключить его.

Далее необходимо создать резервную копию, после чего перейти к добавлению в кластер сертификата:

  • промежуточный;
  • сертификат ACME;
  • сертификат ACME сервера Let’s Enсrypt;
  • корпоративный.

Типы сертификатов

Промежуточный и ACME-сертификаты

Сценарий добавления в кластер

  1. Создать сертификат.
  2. Разместить созданный сертификат в секрете неймспейса cert-manager (только для промежуточного сертификата).
  3. Настроить ClusterIssuer.
  4. Обновить корневой сертификат (CA-bundle).
  5. Обновить настройки сертификатов в системных сервисах.

Чтобы сгенерировать промежуточный или ACME-сертификат к существующей инфраструктуре, предлагается воспользоваться Step. Step представляет собой центр сертификации (CA) для автоматизированного управления сертификатами X.509.

Важно ‒ Если в кластер добавлен сертификат ACME, необходимо мониторить работу ACME-сервера. В случае сбоя на сервере кластеры с сертификатами ACME будут недоступны.

Создание сертификата

Промежуточный сертификат

Если у вас есть промежуточный сертификат центра сертификации (Intermediate CA), подписанный корпоративным центром сертификации (Certificate Authority, CA), то следует перейти сразу к шагу 3) инструкции:

  1. после установки Step сформировать запрос на подпись сертификата (CSR) и сгенерировать ключ промежуточного сертификата:
step certificate create "Intermediate CA Name" intermediate-ca.csr intermediate-ca.key --csr
  1. получить подписанный промежуточный сертификат (intermediate-ca.crt) в формате PEM, отправив сформированный запрос intermediate-ca.csr на подпись администратору удостоверяющего корпоративного центра сертификации (Certificate Authority, CA);
  2. после получения подписанного промежуточного сертификата (intermediate-ca.crt) создать цепочку сертификатов (промежуточный сертификат CA → корневой CA) в формате PEM, например, с именем intermediate-ca-chain.crt, командой:
cat intermediate-ca.crt root-ca.crt >intermediate-ca-chain.crt

где intermediate-ca.crt ‒ промежуточный сертификат, root-ca.crt ‒ корпоративный корневой сертификат CA.

  1. создать секрет corp-intermediate-ca, содержащий цепочку сертификатов и ключ;
  2. указать в ClusterIssuer oauth-ca-issuer данные созданного секрета;
  3. в кластере перейти в неймcпейс cert-manager, открыть страницу "Secrets" раздела "Хранилище" (рисунок 65), создать секрет с именем corp-intermediate-ca, выбрать тип kubernetes.io/tls (рисунок 66).

Рисунок 65 ‒ Страница "Secrets"

Рисунок 66 ‒ Создание секрета

  1. добавить intermediate-ca-chain.crt и intermediate-ca.key в ключи Secret corp-intermediate-ca (рисунки 67, 68, 69).

Рисунок 67 ‒ Добавление ключей. Шаг 1

Рисунок 68 ‒ Добавление ключей. Шаг 2

Рисунок 69 ‒ Добавление ключей. Шаг 3

Сертификат ACME

Сертификат ACME в Kubernetes автоматизирует процесс получения SSL-сертификатов. Чтобы настроить автоматическую выдачу сертификатов через ACME-сервер необходимо:

  1. получить корневой CA-сертификат, который использует ACME-сервер, и закодировать его данные;
  2. добавить в кластер ClusterIssuer, содержащий корневой CA-сертификат от ACME;

Если в вашей организации есть ACME-сервер, следует запросить корневой CA-сертификат от ACME у администратора сервера и перейти к разделу "Установка корневого СА-сертификата ACME в кластер" Руководства.

Если ACME-сервера нет, можно установить step-ca-сервер, чтобы получить корневой СА-сертификат. Использование в Комплексе корневого СА-сертификата от step-ca обеспечит доверие всем сертификатам, которые будут выписаны, полученным сертификатом от step-ca.

Корневой СА-сертификат от step-ca можно установить несколькими способами. В этой инструкции приведен пример инсталляции с помощью docker-контейнера. При необходимости можно выбрать другой способ инсталляции из официальной документации.

Для установки корневого СА-сертификата от step-ca нужно:

  1. создать директорию, в которой будут храниться конфигурация и сертификаты step-ca:
mkdir data
chown 1000:1000 data
  1. создать YAML-файл docker-compose.yaml;

Например, в параметре DOCKER_STEPCA_INIT_DNS_NAMES указать DNS-имя, по которому отвечает сервер:

services:
  step-ca:
    container_name: step-ca
    image: smallstep/step-ca:0.27.2
    restart: always
    ports:
 "9443:9000"
    environment:
       DOCKER_STEPCA_INIT_DNS_NAMES: issuer.ip-XX-XX-XXX-XX.shturval.link # the hostname(s) or IPs that the CA will accept requests on
       DOCKER_STEPCA_INIT_NAME: shturval # the name of your CA—this will be the issuer of your CA certificates
       DOCKER_STEPCA_INIT_REMOTE_MANAGEMENT: true # enable remote provisioner management
       DOCKER_STEPCA_INIT_ACME: true # also create an initial ACME provisioner for the CA
       # DOCKER_STEPCA_INIT_PROVISIONER_NAME: admin # a label for the initial admin (JWK) provisioner.
       # DOCKER_STEPCA_INIT_SSH: " # set this to a non-empty value to enable SSH certificate support
       # DOCKER_STEPCA_INIT_PASSWORD_FILE: " #  the location of a password file to be used for both private keys and the default CA provisioner.
       # DOCKER_STEPCA_INIT_PASSWORD: shturval #Normally, CA passwords will be generated for you. With this option, you can specify a password for the encrypted CA keys and the default CA provisioner.
    volumes:
 ./data:/home/step # 1000:1000
    logging:
      driver: "json-file"
      options:
        max-size: "200m"
  1. запустить step-ca-сервер:
# Запуск step-ca сервера
docker compose up -d
# Проверка запуска
docker compose ps

Если docker (контейнер) находится в состоянии "UP", то сервер step-ca готов выписывать сертификаты.

  1. после развертывания step-ca получить корневой СА-сертификат сервера step-ca:
cat data/certs/root_ca.crt

Пример ответа, в котором содержится корневой CA-сертификат:

-----BEGIN CERTIFICATE-----
MIIBoDCCAUagAwIBAgIRAJV9+1S0q+d9+V/UmBXhR+4wCgYIKoZIzj0EAwIwLjER
MA8GA1UEChMIc2h0dXJ2YWwxGTAXBgNVBAMTEHNodHVydmFsIFJvb3QgQ0EwHhcN
MjQxMTIyMTUyMzQ5WhcNMzQxMTIwMTUyMzQ5WjAuMREwDwYDVQQKEwhzaHR1cnZh
bDEZMBcGA1UEAxMQc2h0dXJ2YWwgUm9vdCBDQTBZMBMGByqGSM49AgEGCCqGSM49
AwEHA0IABNhNCtkBTfs+HXA6h1Ty8Qlg+zKQNu
-----END CERTIFICATE-----

Настройка ClusterIssuer

Промежуточный сертификат

В кластере нужно перейти в раздел "Администрирование" на страницу "ClusterIssuers" и создать объект, указав корпоративный тип сертификата и имя секрета corp-intermediate-ca (рисунок 70).

Рисунок 70 ‒ Пример ClusterIssuer

Сертификат ACME

Важно ‒ Если устанавливается сертификат в кластер управления, необходимо выполнить все действия, описанные в инструкции. При установке в клиентский кластер требуется выполнить шаги 1)-2) инструкции:

  1. в кластере перейти на страницу "ClusterIssuers" раздела "Администрирование". Создать ClusterIssuer, например, с именем corp-acme (рисунки 71‒72).

Рисунок 71 ‒ Создание ClusterIssuer

Рисунок 72 ‒ Страница "ClusterIssuers"

  1. в блоке "Спецификация объекта" (рисунок 73):

Рисунок 73 ‒ Блок "Спецификация объекта"

  • выбрать тип ACME;
  • заполнить адрес сервера ACME;
  • в CA Bundle загрузить корневой CA-сертификат от ACME-сервера;
  • в блоке "Ключ учетной записи" указать имя секрета, в котором будет сохранен автоматически ключ;
  • добавить solver с типом http01 и nginx в ClassIngress.

Пример corp-acme:

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: corp-acme
spec:
  acme:
    caBundle: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJvRENDQVVhZ0F3SUJBZ0lSQUpWOSsxUzBxK2Q5K1YvVW1CWGhSKzR3Q2dZSUtvWkl6ajBFQXdJd0xqRVIKTUE4R0ExVUVDaE1JYzJoMGRYSjJZV3d4R1RBWEJnTlZCQU1URUhOb2RIVnlkbUZzSUZKdmIzUWdRMEV3SGhjTgpNalF4TVRJeU1UVXlNelE1V2hjTk16UXhNVEl3TVRVeU16UTVXakF1TVJFd0R3WURWUVFLRXdoemFIUjFjblpoCmJERVpNQmNHQTFVRUF4TVFjMmgwZFhKM
    email: test-cluster@shturval.tech
    privateKeySecretRef:
      name: corp-acme
    server: https://issuer.ip-XX-XX-XX-XX.shturval.link:9443/acme/acme/directory
    solvers:
 http01:
        ingress:
          class: nginx

Обновление корневого сертификата

На странице "Configmaps" раздела "Хранилище" нужно найти Configmap с именем root-ca:

  • Если Configmap с именем root-ca есть, перейти на страницу просмотра и в блоке "Текстовые ключи" заменить значение ключа ca.crt данными сертификата (корпоративного или ACME acme-ca.crt).
  • Если такого Configmap нет, то создать Configmap с именем root-ca, добавить ключ в блоке "Текстовые ключи", в значении указать данные сертификата (корпоративного или ACME acme-ca.crt) (рисунок 74).

Рисунок 74 ‒ Добавление Configmap

Корпоративный сертификат

Прежде чем перейти к добавлению сертификата в кластер, нужно создать бэкап. В случае ошибки изменения сертификата в кластере можно будет использовать бэкап для отката изменений.

Сценарий добавления корпоративного сертификата в кластер:

  1. Создать сертификат.
  2. Обновить корневой сертификат в неймспейсе cert-manager.
  3. Разместить созданный сертификат в секрете неймспейса ingress.
  4. Добавить customvalues в Модуль управления внешними подключениями (shturval-ingress-controller).

После добавления в кластер корпоративного сертификата дополнительная настройка в системных сервисах не требуется. По умолчанию будет использован корпоративный сертификат.

Создание сертификата

Подготовка корпоративного сертификата описана в Руководстве.

Обновление корневого сертификата

При наличии корпоративного сертификата нужно в кластере перейти в неймспейс cert-manager. В разделе "Хранилище" найти "Configmap" с именем root-ca (рисунок 75). На странице root-ca изменить значение ключа ca.crt. В значении должен быть ваш корпоративный сертификат (рисунок 76).

Рисунок 75 ‒ Корпоративный сертификат

Рисунок 76 ‒ Изменение корпоративного сертификата

Далее необходимо сохранить изменения в Configmap root-ca.

Затем в неймcпейсе ingress следует перейти в раздел "Хранилище", открыть страницу "Secrets" и создать секрет с именем corp-tls (рисунок 77), выбрав тип kubernetes.io/tls (рисунок 78).

Рисунок 77 ‒ Создание секрета corp-tls

Рисунок 78 ‒ Выбор типа

Размещение сертификата в секрете

Для размещения сертификата в секрете нужно добавить корпоративный сертификат и ключ корпоративного сертификата в ключ Secret corp-tls (рисунок 79).

Рисунок 79 ‒ Добавление ключа

Затем необходимо сохранить Secret corp-tls.

Добавление customvalues в ingress-controller

Чтобы внести изменения в customvalues Модуля управления внешними подключениями (shturval-ingress-controller), следует использовать объект ShturvalServicePatch (PatchSSC):

  1. Подготовить манифест ShturvalServicePatch с требуемым параметром в customvalues, как в приведенном примере (описание параметров ‒ в таблице 19):
apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: <имя ресурса>
spec:
  shturvalServiceConfigName: shturval-ingress-controller
  customvalues:
    controller:
      extraArgs:
        default-ssl-certificate: "ingress/corp-tls"
  1. В графическом интерфейсе с помощью импорта манифеста загрузить в кластер ShturvalServicePatch, для чего нажать на иконку импорта манифестов, расположенную слева от имени пользователя, загрузить файл с подготовленным манифестом ShturvalServicePatch для shturval-ingress-controller или переместить манифест в открывшееся окно, затем выполнить проверку и нажать Загрузить.
  2. В кластере перейти в раздел "Сервисы и репозитории" на страницу "Установленные сервисы", найти Модуль управления внешними подключениями (shturval-ingress-controller) и перейти к управлению (рисунок 80). На вкладке "Примененные PatchSSC" отобразится загруженный ShturvalServicePatch. Когда ShturvalServicePatch будет применен, на вкладке "Сервис" статус будет Patched (рисунок 81).

Рисунок 80 ‒ Модуль управления внешними подключениями

Рисунок 81 ‒ Вкладка "Сервис"

Создание и установка сертификата с помощью Let’s Enсrypt

Для создания сертификатов с помощью Let’s Enсrypt необходимо, чтобы ingress-контроллер был доступен из сети Интернет. Для реализации этого требования должно выполняться хотя бы одно из следующих условий:

  • Внешний балансировщик должен иметь белый (публичный) IP-адрес;
  • Должен быть указан белый (публичный) IP адрес для IngressVIP.

Сценарий добавления в кластер:

  1. Настроить и добавить ClusterIssuer в кластер.
  2. Обновить настройки сертификатов в системных сервисах.

Создание и установика сертификат в кластере с помощью Let’s Enсrypt

  1. Создать YAML-файл acme-issuer.yaml с манифестом объекта ClusterIssuer.

Пример ClusterIssuer (описание параметров ‒ в таблице 20):

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: <имя ресурса>
  namespace: cert-manager
spec:
  acme:
    server: <ваше значение параметра> 
    email: <ваше значение параметра>
    privateKeySecretRef:
      name: <ваше значение параметра>
    solvers:
    - http01:
        ingress:
          class: nginx
  1. Применить созданный манифест ClusterIssuer:
kubectl apply -f acme-issuer.yaml
  1. Присвоить секреты в системных сервисах.

Добавление сертификатов в системные сервисы

Если требуется изменить сертификаты в кластере управления, всегда требуется обновление системных компонентов:

  • "Модуль программного управления Комплексом" (shturval-backend);
  • "Модуль графического управления Комплексом" (shturval-frontend);
  • "Модуль управления аутентификацией" (shturval-auth).

Если в кластере работают сервисы, такие как ArgoCD, Grafana, то при добавлении промежуточного или ACME-сертификата в кластер требуется настройка customvalues в в этих системных сервисах (shturvalserviceconfigs). Это обеспечит корректную работу авторизации при переходе в сервисы из кластера.

Для кластера управления

Backend, Frontend, Auth

  1. Подготовить манифесты ресурсов ShturvalServicePatch для применения к спецификациям (SSC) Модуля программного управления (shturval-backend), Модуля графического управления (shturval-frontend), Модуля управления аутентификацией (shturval-auth). В блок customvalues добавить параметры, как в приведенных ниже примерах.

Пример ShturvalServicePatch для backend (описание параметров ‒ в таблице 21):

apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: <имя ресурса>
spec:
  shturvalServiceConfigName: shturval-backend
  customvalues:
    tls:
      enabled: true
      backend_tls_secretname: <ваше значение параметра>
      cluster_issuer_name: <ваше значение параметра>

Пример ShturvalServicePatch для frontend (описание параметров ‒ в таблице 22):

apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: <имя ресурса>
spec:
  shturvalServiceConfigName: shturval-frontend
  customvalues:
    tls:
      enabled: true
      front_tls_secretname: <ваше значение параметра>
      docs_tls_secretname: <ваше значение параметра>
      cluster_issuer_name: <ваше значение параметра>

Пример ShturvalServicePatch для auth (описание параметров ‒ в таблице 23):

apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: <имя ресурса>
spec:
  shturvalServiceConfigName: shturval-auth
  customvalues:
    tls:
      enabled: true
      auth_tls_secretname: <ваше значение параметра>
      cluster_issuer_name: <ваше значение параметра>
  1. Загрузить с помощью импорта манифеста подготовленные ShturvalServicePatches, для чего нажать на иконку импорта манифестов, расположенную слева от имени пользователя, загрузить файлы или переместить манифесты ShturvalServicePatch в открывшееся окно, выполнить проверку и нажать Загрузить.
  2. Для просмотра примененных манифестов перейти в раздел "Сервисы и репозитории", открыть страницу "Установленные сервисы", перейти к управлению:
  • Модуль программного управления (shturval-backend) ‒ на вкладке "Примененные PatchSSC" отобразится загруженный ShturvalServicePatch.
  • Модуль графического управления (shturval-frontend) ‒ на вкладке "Примененные PatchSSC" отобразится загруженный ShturvalServicePatch.
  • Модуль управления аутентификацией (shturval-auth) ‒ на вкладке "Примененные PatchSSC" отобразится загруженный ShturvalServicePatch.

Grafana

  1. Подготовить манифест ShturvalServicePatch для применения к спецификации (SSC) Модуля графического отображения метрик (Grafana) (shturval-dashboards). В блок customvalues добавить параметры, как в приведенном примере (описание параметров ‒ в таблице 24).

Пример ShturvalServicePatch для shturval-dashboards:

apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: <имя ресурса> 
spec:
  shturvalServiceConfigName: shturval-dashboards
  customvalues:
    grafana.ini:
      security:
        cookie_secure: true
      auth.generic_oauth:
        tls_skip_verify_insecure: true
    ingress:
      annotations:
        cert-manager.io/cluster-issuer: <ваше значение параметра> 
      enabled: true
      tls:
      - hosts:
        - <ваше значение параметра> 
        secretName: <ваше значение параметра>
  1. Загрузить в кластер управления с помощью импорта манифеста подготовленный ShturvalServicePatch для shturval-dashboards, для чего нажать на иконку импорта манифестов, расположенную слева от имени пользователя, загрузить файл или переместить манифест созданного ShturvalServicePatch в открывшееся окно, выполнить проверку и нажать Загрузить.
  2. После загрузки манифеста из раздела "Сервисы и репозитории" открыть страницу "Установленные сервисы", найти Модуль графического отображения метрик (Grafana) (shturval-dashboards) и перейти к управлению. На вкладке "Примененные PatchSSC" отобразится загруженный ShturvalServicePatch.

Для любого типа кластера

ArgoCD:

  1. Подготовить манифест ShturvalServicePatch для применения к спецификации (SSC) Модуля непрерывной доставки приложений (ArgoCD) (shturval-cd). В блок customvalues добавьить параметры, как в приведенном примере ShturvalServicePatch для shturval-cd (описание параметров ‒ в таблице 25):
apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: <имя ресурса>
spec:
  shturvalServiceConfigName:  shturval-cd
  customvalues:
    server:
      ingress:
        annotations:
          cert-manager.io/cluster-issuer: <ваше значение параметра> 
        enabled: true
        hostname: <ваше значение параметра>
        path: /
        pathType: Prefix
        tls: true
  1. Загрузить в кластер управления с помощью импорта манифеста подготовленный ShturvalServicePatch для shturval-dashboards, для чего нажать на иконку импорта манифестов, расположенную слева от имени пользователя, загрузить файл или переместить манифест созданного ShturvalServicePatch в открывшееся окно, выполнить проверку и нажать Загрузить.
  2. После загрузки манифеста из раздела "Сервисы и репозитории" открыть страницу "Установленные сервисы", найти Модуль графического отображения метрик (Grafana) (shturval-dashboards) и перейти к управлению. На вкладке "Примененные PatchSSC" отобразится загруженный ShturvalServicePatch.