Настройка TLS

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

  1. Создайте сертификат:
cat > openssl-san.cnf <<EOF
[req]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn

[ dn ]
C=RU
ST=Moscow
L=Moscow
O=My Company
OU=Department
emailAddress=admin@example.com
CN = example.com

[ req_ext ]
subjectAltName = @alt_names

[ alt_names ]
DNS.1 = *.apps.corp.domain

[ v3_ext ]
authorityKeyIdentifier=keyid,issuer:always
basicConstraints=CA:FALSE
keyUsage=keyEncipherment,dataEncipherment
extendedKeyUsage=serverAuth,clientAuth
subjectAltName=@alt_names
EOF

где corp.domain - Ingress, с которым устанавливаете платформу.

  1. Создайте запрос на сертификат (CSR) с использованием файла конфигурации openssl-san.cnf:
openssl req -newkey rsa:2048 -sha256 -days 365 -nodes -keyout tls.key -out tls.csr -extensions req_ext -config openssl-san.cnf
  1. Отправьте созданный запрос на сертификат (CSR) на подпись у вашего удостоверяющего центра (Certificate Authority, CA). В результате вы должны получить подписанный сертификат в формате PEM, который необходимо переименовать в tls.crt.

Также для корректной работы всех компонентов кластера необходимо, чтобы этот сертификат содержал в себе всю цепочку сертификатов: ваш конечный сертификат -> промежуточные сертификаты CA -> корневой CA.

  1. Создайте секреты в Kubernetes с сертификатом и ключом в неймспейсе ingress:
kubectl -n ingress create secret tls corp-tls --key tls.key --cert tls.crt
  1. Внесите исправления в SSC shturval-ingress-controller:
controller:
  extraArgs:
    default-ssl-certificate: "ingress/corp-tls"

При установке платформы в закрытом контуре при использовании корпоративного зеркала корневой сертификат зеркала должен быть прописан в доверенные на все ВМ и шаблоны.

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

Если у вас есть промежуточный сертификат центра сертификации (Intermediate CA), подписаный вашим корпоративным центром сертификации (Certificate Authority, CA), то его можно использовать для автоматической выдачи сертификатов с помощью Cert-manager.

Для этого вам необходимо создать секрет содержащий цепочку сертификатов и приватный ключ:

kubectl -n cert-manager create secret tls corp-intermediate-ca --cert=./tls.crt --key=./tls.key

Здесь tls.crt это цепочка сертификатов (ваш промежуточный сертификат -> сертификат корпоративного центра сертификации) в формате PEM, tls.key - это приватный ключ от вашего промежуточного сертификата.

Далее изменить ClusterIssuers:

kubectl edit clusterissuers oauth-ca-issuer

где в Spec необходимо изменить SelfSigned на CA следующим образом:

Значения до изменений:

spec:
  selfSigned: {}

Значения после изменений:

spec:
  ca:
    secretName: corp-intermediate-ca

Сертификаты Let’s Enсrypt

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

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

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

  1. Создайте YAML-файл acme-issuer.yaml с манифестом объекта ClusterIssuer:
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt
  namespace: cert-manager
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: <ваш email>
    privateKeySecretRef:
      name: letsencrypt
    solvers:
    - http01:
        ingress:
          class: nginx
  1. Примените созданный манифест, выполнив команду:
kubectl apply -f acme-issuer.yaml
  1. Для присвоения секрета бэкенду, запустите команду на исполнение:
kubectl edit ssc/shturval-backend

В spec.customvalues пропишите наименования созданных секретов для backend и auth.

Например:

tls:
  enabled: true
  backend_tls_secretname: back-tls
  auth_tls_secretname: auth-tls
  cluster_issuer_name: letsencrypt
  1. Для присвоения секрета фронтенду, запустите команду на исполнение:
kubectl edit ssc/shturval-frontend

В spec.customvalues пропишите наименования созданных секретов для frontend. Например:

tls:
  enabled: true
  front_tls_secretname: front-tls
  docs_tls_secretname: docs-tls
  cluster_issuer_name: letsencrypt
  1. Для подключения дашборда мониторинга со страницы кластера внесите изменения в SSC shturval-dashboards:
kubectl edit ssc/shturval-dashboards

В spec.customvalues пропишите:

grafana.ini:
  security:
    cookie_secure: true
  auth.generic_oauth:
    tls_skip_verify_insecure: true
ingress:
  annotations:
    cert-manager.io/cluster-issuer: "letsencrypt"
  tls:
  - hosts:
    - dashboards.<ingress>  ### значение customvalues.ingress.hosts
    secretName: dashboards-ingress-tls