Настройка TLS
Корпоративные сертификаты
- Создайте сертификат:
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, с которым устанавливаете платформу.
- Создайте запрос на сертификат (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
- Отправьте созданный запрос на сертификат (CSR) на подпись у вашего удостоверяющего центра (Certificate Authority, CA). В результате вы должны получить подписанный сертификат в формате PEM, который необходимо переименовать в tls.crt.
Также для корректной работы всех компонентов кластера необходимо, чтобы этот сертификат содержал в себе всю цепочку сертификатов: ваш конечный сертификат -> промежуточные сертификаты CA -> корневой CA.
- Создайте секреты в Kubernetes с сертификатом и ключом в неймспейсе ingress:
kubectl -n ingress create secret tls corp-tls --key tls.key --cert tls.crt
- Внесите исправления в 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 контроллер был доступен из сети Интернет. Для реализации этого требования должно выполняться хотя бы одно из следующих условий:
- Внешний балансировщик должен иметь белый (публичный) IP адрес;
- Должен быть указан белый (публичный) IP адрес для IngressVIP.
Инструкция по созданию и установке сертификата с помощью Let’s Enсrypt
- Создайте 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
- Примените созданный манифест, выполнив команду:
kubectl apply -f acme-issuer.yaml
- Для присвоения секрета бэкенду, запустите команду на исполнение:
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
- Для присвоения секрета фронтенду, запустите команду на исполнение:
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
- Для подключения дашборда мониторинга со страницы кластера внесите изменения в 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