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

В развернутом кластере платформы “Штурвал” вы можете:

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

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

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

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

  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.
Команда
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.

Далее необходимо:

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

secretscertmanager1 secretcorpinterca

  1. Добавьте intermediate-ca-chain.crtи intermediate-ca.key в ключи Secret corp-intermediate-ca.
Скриншот

secretkeyadd secretkeys secrettls

Сертификат ACME

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

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

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

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

Корневой СА сертификат от step-ca

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

  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.
Скриншот

clusterissuers1 addclusterissuer

  1. В блоке Спецификация объекта:
  • выберите тип 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
Скриншот

clusterissueradd

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

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

Скриншот

configmapcacrt1

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

Если вы изменяете сертификаты в кластере управления, обновление системных компонентов “Модуль программного управления Платформой” (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
tls:
  enabled: true
  backend_tls_secretname: <ваше значение параметра>
  auth_tls_secretname: <ваше значение параметра>
  cluster_issuer_name: <ваше значение параметра>
Параметр Описание Тип данных Пример
backend_tls_secretname Имя секрета для backend string back-tls
auth_tls_secretname Имя секрета для auth string auth-tls
cluster_issuer_name Имя созданного ClusterIssuer с корневым CA сертификатом (промежуточным или ACME) string corp-acme
Скриншот

backtls

Сохраните изменения.

Frontend

  1. В боковом меню откройте раздел Сервисы и репозитории и перейдите на страницу Установленные сервисы, найдите Модуль графического управления Платформой (shturval-frontend). Перейдите к управлению и в блоке Спецификация сервиса:
  • пропишите в параметрах docs_tls_secretname и front_tls_secretname имена секретов;
  • укажите в параметре cluster_issuer_name имя созданного ClusterIssuer.
Пример customvalues
tls:
  enabled: true
  front_tls_secretname: <ваше значение параметра>
  docs_tls_secretname: <ваше значение параметра>
  cluster_issuer_name: <ваше значение параметра>
Параметр Описание Тип данных Пример
front_tls_secretname Имя секрета для front string front-tls
docs_tls_secretname Имя секрета для docs string docs-tls
cluster_issuer_name Имя созданного ClusterIssuer с корневым CA сертификатом ACME string corp-acme
Скриншот

fronttls

Сохраните изменения.

Grafana

  • В ssc shturval-dashboards добавьте:
    • параметр cert-manager.io/cluster-issuer и укажите имя созданного ClusterIssuer;
    • параметр secretName и укажите имя Secret, в котором будет сохранен сертификат для Grafana.
Команда
kubectl edit ssc/shturval-dashboards
Изменения customvalues
ingress:
  annotations:
    cert-manager.io/cluster-issuer: <ваше значение параметра>
  enabled: true
  tls:
  - hosts:
    - <ваше значение параметра> 
    secretName: <ваше значение параметра>
Параметр Описание Тип данных Пример
annotations.cert-manager.io/cluster-issuer Аннотация с именем созданного ClusterIssuer string corp-acme
tls.hosts Список хостов, для которых устанавливается TLS-соединение array dashboards.apps.ip-10-11-11-13.shturval.link
tls.secretName Имя секрета для установления TLS-соединения, в котором будет сохранен сертификат для Grafana string dashboards-ingress-tls
Скриншот

frafana

OpenSearch

  • В ssc shturval-logs-operator добавьте:
    • блок getcert с параметром enable: false;
    • в ingress параметр cert-manager.io/cluster-issuer с именем созданного ClusterIssuer;
    • в параметрах secretName имена Secrets, в которых будут сохранены сертификаты для кластера и дашборда OpenSearch.
Команда
kubectl edit ssc/shturval-logs-operator
Пример customvalues
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:
        - <ваше значение параметра>  
Параметр Описание Тип данных Пример
cluster.annotations.cert-manager.io/cluster-issuer Аннотация с именем созданного ClusterIssuer для кластера Opensearch string corp-acme
dashboards.annotations.cert-manager.io/cluster-issuer Аннотация с именем созданного ClusterIssuer для дашборда OpenSearch string corp-acme
cluster.hosts Список хостов кластера Opensearch array logs.apps.ip-10-11-11-13.shturval.link
cluster.tls.hosts Список хостов, для которых используется секрет с TLS-сертификатом array logs.apps.ip-10-11-11-13.shturval.link
cluster.tls.secretName Имя секрета, в котором будет сохранен TLS-сертификат для кластера OpenSearch string logs-tls
dashboards.hosts Список хостов для доступа к дашбордам OpenSearch array logs-dashboards.apps.ip-10-11-11-13.shturval.link
dashboards.tls.secretName Имя секрета, в котором будет сохранен TLS-сертификат для дашборда OpenSearch string logs-dashboards-tls
dashboards.tls.hosts Список хостов, для которых используется секрет array logs-dashboards.apps.ip-10-11-11-13.shturval.link
Скриншот

opnsearchca

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

ArgoCD

  • В ssc shturval-cd добавьте параметр cert-manager.io/cluster-issuer и укажите название ClusterIssuer corp-acme.
Команда
kubectl edit ssc/shturval-cd
Пример customvalues
server:
  ingress:
    annotations:
      cert-manager.io/cluster-issuer: <ваше значение параметра>
    enabled: true
    hostname: <ваше значение параметра>
    path: /
    pathType: Prefix
    tls: true
Параметр Описание Тип данных Пример
ingress.annotations.cert-manager.io/cluster-issuer Аннотация с именем созданного ClusterIssuer для кластера Opensearch string corp-acme
ingress.hostname Имя хоста сервера Argo CD string argocd.apps.ip-10-11-11-13.shturval.link
Скриншот

argo

×