Как добавить в кластер промежуточный и ACME сертификаты

В развернутом кластере Комплекса можно:

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

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

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

Сценарий установки сертификата

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

  1. сделать бэкап существующей конфигурации;
  2. создать сертификат и разместить его в секрете неймспейса cert-manager;
  3. настроить ClusterIssuer;
  4. обновить корневой сертификат (CA-bundle);
  5. обновить настройки сертификатов в системных сервисах.

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

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

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

  • Не неймспейсные ресурсы:
    • shturvalserviceconfigs;
  • Неймспейсы:
  • для любого типа кластера:
    • shturval-cd (при использовании ARGO CD);
    • cert-manager;
  • для кластера управления:
    • shturval-backend;
    • shturval-frontend;
    • shturval-logging (при использовании OpenSearch);
    • shturval-dashboards (при использовании Grafana);
  • неймспейсные ресурсы:
    • secrets;
    • configmaps;
    • clusterissuers.

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

В кластере нужно перейти в неймспейс cert-manager и в разделе "Хранилище" удалить Configmap с именем "root-ca".

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

Если у вас есть промежуточный сертификат центра сертификации (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" раздела "Хранилище" (рисунок 74), создать секрет с именем "corp-intermediate-ca", выбрать тип "kubernetes.io/tls" (рисунок 75).

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

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

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

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

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

Рисунок 78 ‒ Добавление ключей. Шаг 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

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

В кластере нужно перейти в раздел "Администрирование" на страницу загрузки манифестов и применить манифест ClusterIssuer:

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: oauth-ca-issuer
spec:
ca:
secretName: corp-intermediate-ca

Сертификат ACME

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

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

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

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

  1. в блоке "Спецификация объекта" (рисунок 81):
  • выбрать тип 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

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

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

На странице "Configmaps" раздела "Хранилище" нужно создать Configmap root-ca, добавить ключ "Configmap" в блоке "Текстовые ключи", в значении указать данные сертификата (корпоративного или ACME acme-ca.crt) (рисунок 82).

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

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

Если требуется изменить сертификаты в кластере управления, обновление системных компонентов "Модуль программного управления Комплексом" (shturval-backend) и "Модуль графического управления Комплексом" (shturval-frontend) требуется всегда.

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

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

Backend:

  1. В боковом меню открыть раздел "Сервисы и репозитории" и перейти на страницу "Установленные сервисы", найти "Модуль программного управления Комплексом" (shturval-backend), перейти к управлению и в блоке "Спецификация сервиса":
  • прописать в backend_tls_secretname и auth_tls_secretname имена секретов для backend и auth;
  • указать в параметре "cluster_issuer_name" имя созданного ClusterIssuer.

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

tls:
enabled: true
backend_tls_secretname: <ваше значение параметра>
auth_tls_secretname: <ваше значение параметра>
cluster_issuer_name: <ваше значение параметра>
  • сохранить изменения.

Frontend:

  1. В боковом меню открыть раздел "Сервисы и репозитории", перейти на страницу "Установленные сервисы", найти "Модуль графического управления Комплексом" (shturval-frontend), перейти к управлению и в блоке "Спецификация сервиса":
  • прописать в параметрах "docs_tls_secretname" и "front_tls_secretname" имена секретов;
  • указать в параметре "cluster_issuer_name" имя созданного ClusterIssuer.

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

tls:
enabled: true
front_tls_secretname: <ваше значение параметра>
docs_tls_secretname: <ваше значение параметра>
cluster_issuer_name: <ваше значение параметра>
  • сохранить изменения.

Grafana:

  1. В SSC shturval-dashboards добавить:
  • параметр "cert-manager.io/cluster-issuer" и указать имя созданного ClusterIssuer;
  • параметр "secretName" и указать имя Secret, в котором будет сохранен сертификат для Grafana.

Команда:

kubectl edit ssc/shturval-dashboards

Изменения customvalues (описание параметров ‒ в таблице 15):

ingress:
annotations:
cert-manager.io/cluster-issuer: <ваше значение параметра>
enabled: true
tls:
‒ hosts:
‒ <ваше значение параметра>
secretName: <ваше значение параметра>

OpenSearch:

  1. В SSC shturval-logs-operator добавить:
  • блок getcert с параметром "enable: false";
  • в Ingress параметр "cert-manager.io/cluster-issuer" с именем созданного ClusterIssuer;
  • в параметрах "secretName" имена Secrets, в которых будут сохранены сертификаты для кластера и дашборда OpenSearch.

Команда:

kubectl edit ssc/shturval-logs-operator

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

getcert:
enable: false
ingress:
cluster:
annotations:
cert-manager.io/cluster-issuer: <ваше значение параметра>
hosts:
‒ <ваше значение параметра>
tls:
‒ secretName: <ваше значение параметра>
hosts:
‒ <ваше значение параметра>
dashboards:
annotations:
cert-manager.io/cluster-issuer: <ваше значение параметра>
hosts:
‒ <ваше значение параметра>
tls:
‒ secretName: <ваше значение параметра>
hosts:
‒ <ваше значение параметра>

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

ArgoCD:

В SSC shturval-cd добавить параметр "cert-manager.io/cluster-issuer" и указать название "ClusterIssuer corp-acme".

Команда:

kubectl edit ssc/shturval-cd

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

server:
ingress:
annotations:
cert-manager.io/cluster-issuer: <ваше значение параметра>
enabled: true
hostname: <ваше значение параметра>
path: /
pathType: Prefix
tls: true