Конфигурирование#

API security.synapse.sber#

Certificate#

Формирует: Администратор/ CD Инструменты

Потребляет: controller

Область видимости: namespace

Описание: ресурс представляет собой читаемое определение запроса на подпись сертификата. cert-manager использует эти входные данные для генерации закрытого ключа и ресурса CertificateRequest

Пример конфигурации:

Конфигурация пользовательского ресурса Certificate для генерации и последующей ротации серверного сертификата

apiVersion: security.synapse.sber/v1
kind: Certificate
metadata:
  name: server-cert
spec:
  privateKey:
    algorithm: RSA
    size: 4096
    encoding: PKCS1
  uris:
    - spiffe://cluster.local/ns/$APP_NS/sa/$APP_SA
  usages:
    - server auth
  dnsNames:
    - $APP_DNS
  duration: 48h
  commonName: $APP_CN
  issuerRef:
    kind: CusterIssuer
    name: ESBRootCa
  renewBefore: 24h
  secretName: ingress-tls

где:

  • $APP_NAME — имя разворачиваемого компонента;

  • $APP_DNS — доменное имя сервера компонента;

  • $APP_NS — название Kubernetes Namespace, в котором разворачивается компонент;

  • $APP_SA — название Kubernetes ServiceAccount, под которым запускается компонент;

  • $APP_CN — название SSL Certificate Common Name.

CertificateRequest#

Формирует: controller

Потребляет: controller

Область видимости: namespace

Описание: используется для запроса сертификатов X.509. Ресурс содержит строку в кодировке Base64 запроса на подпись сертификата(CSR) в кодировке PEM, которая отправляется указанному в спецификации Подписанту(Issuer или ClusterIssuer). В случае успешной выдачи будет возвращен подписанный сертификат на основе CSR. CertificateRequests обычно потребляются и управляются контроллерами или другими системами и не должны использоваться администраторами и CD инструментами.

Пример создаваемой CertificateRequest

apiVersion: security.synapse.sber/v1
kind: CertificateRequest
metadata:
  annotations:
    cert-manager.io/certificate-name: server-cert
    cert-manager.io/certificate-revision: '1'
    cert-manager.io/private-key-secret-name: server-cert-25mmm
  name: server-cert-1
  namespace: cert-manager-demo-client
  ownerReferences:
    - apiVersion: cert-manager.io/v1
      blockOwnerDeletion: true
      controller: true
      kind: Certificate
      name: server-cert
      uid: 6bf1cf34-79ba-4332-8f86-cbd1f39dc164
  labels:
    app.kubernetes.io/managed-by: Helm
spec:
  duration: 48h0m0s
  extra:
    authentication.kubernetes.io/pod-name:
      - cert-manager-66c4d59644-t8w65
    authentication.kubernetes.io/pod-uid:
      - 5fbcc3f0-7f1a-4f7b-985c-c286fd0d0738
  groups:
    - 'system:serviceaccounts'
    - 'system:serviceaccounts:cert-manager'
    - 'system:authenticated'
  issuerRef:
    kind: ClusterIssuer
    name: my-ca-issuer
  request: SOME_BASE64_CSR
  uid: a2b85f03-095d-46c8-a1a5-0beee65ed10f
  usages:
    - client auth
  username: 'system:serviceaccount:cert-manager:cert-manager'
status:
  ca: SOME_BASE64_CA_CERT
  certificate: SOME_BASE64_CERT

В поле spec описывается спецификация создаваемого сертификата, CSR в формате BASE64, метаинформация о создании сертификата, а так же информации о подписанте для сертификата.

В поле status, в случае успешной подписи сертификата, в поля certificate и CA подставляются сам сертификат и цепочка доверия для него соответственно. Информация в полях certificate и CA хранится в формате base64.

Issuer#

Формирует: Администратор/ CD Инструменты

Потребляет: controller

Область видимости: namespace

Описание: это кастомный ресурс Kubernetes, представляющий центр сертификации (ЦС), который может генерировать подписанные сертификаты, подписывая запросы на подпись сертификатов(CSR). Для всех сертификатов создаваемых через кастомный ресурс CertificateRequest требуется указанный Issuer, который готов попытаться выполнить запрос. Данный ресурс можно использовать только в рамках namespace в котором он был объявлен

Примеры:

Самоподписанный Issuer: Данная функциональность используется, когда необходим самоподписанный сертификат (то есть подписанный своим же приватным ключом).

apiVersion: security.synapse.sber/v1
kind: Issuer
metadata:
  name: selfsigned
  namespace: example1
spec:
  selfSigned: {}

для последующего использования в Certificate

apiVersion: security.synapse.sber/v1
kind: Certificate
metadata:
  name: exemple-certificate
  namespace: example1
spec:
  secretName: example-certificate
  dnsNames:
    - example.example1
  issuerRef:
    name: selfsigned

Подпись с помощью секрета: Изначально есть некая ключевая пара, хранящаяся в Secret ca-key-pair, которой необходимо подписывать сертификаты.

apiVersion: v1
kind: Secret
metadata:
  name: ca-key-pair
  namespace: example2
data:
  tls.crt: SOME_CERT==
  tls.key: SOME_KEY==

Создайте кастомный ресурс Issuer, который ссылается на данный секрет для дальнейшего его использования в обработке запросов на подпись сертификатов.

apiVersion: security.synapse.sber/v1
kind: Issuer
metadata:
  name: ca-issuer
  namespace: example2
spec:
  ca:
    secretName: ca-key-pair

ClusterIssuer#

Формирует: Администратор/ CD Инструменты

Потребляет: controller

Область видимости: Cluster

Описание: представляет собой версию пользовательского ресурса Issuer, которая не привязана к NS и которую можно использовать во всем кластере

Примеры:

Самоподписанный ClusterIssuer: по аналогии с самоподписанным Issuer

apiVersion: security.synapse.sber/v1
kind: ClusterIssuer
metadata:
  name: selfsigned
spec:
  selfSigned: {}
apiVersion: security.synapse.sber/v1
kind: Certificate
metadata:
  name: exemple-certificate
  namespace: example1
spec:
  secretName: example-certificate
  dnsNames:
    - example.example1
  issuerRef:
    kind: ClusterIssuer
    name: selfsigned

Подпись с помощью ca: подпись с помощью ключевой пары.

Внимание! Секрет с ключевой парой должен храниться в том же NS, что и компонент KACM

apiVersion: v1
kind: Secret
metadata:
  name: ca-key-pair
  namespace: kacm-cert-manager
data:
  tls.crt: SOME_CERT==
  tls.key: SOME_KEY==

Создайте кастомный ресурс Issuer, который ссылается на данный секрет, для дальнейшего его использования в обработке запросов на подпись сертификатов.

apiVersion: security.synapse.sber/v1
kind: ClusterIssuer
metadata:
  name: ca-issuer
spec:
  ca:
    secretName: ca-key-pair

Инъекция cabudle#

У компонента «Управление ключами и сертификатами» имеется функциональность, помогающая в конфигурировании полей cabunlde в ресурсах: Mutating Webhooks, Validating Webhooks Conversion Webhooks и API Services

В частности, компонент «Управление ключами и сертификатами» заполняет поле caBundle трех типов API: ValidatingWebhookConfiguration, MutatingWebhookConfiguration и APIService. Первые два типа ресурсов используются для настройки того, как сервер API Kubernetes подключается к webhook. Эти данные caBundle загружаются сервером API Kubernetes и используются для проверки сертификатов обслуживания webhook API. APIService используется для представления расширенного сервера API. CaBundle APIService может быть заполнено сертификатом CA, который можно использовать для проверки сертификата сервера API.

В дальнейшем эти три типа API будут упоминаться как «ресурсы для инъекций».

Ресурс для инъекции должен иметь одну из следующих аннотаций: security.synapse.sber/inject-ca-from или security.synapse.sber/inject-ca-from-secret в зависимости от источника инъекции. Подробные объяснения ниже.

Аннотация

Описание

Пример заполнения

security.synapse.sber/inject-ca-from

Инъекция cabundle для сертификата, сгенерированного с помощью пользовательского ресурса Certificate

security.synapse.sber/inject-ca-from: my-namespace/my-certificate

security.synapse.sber/inject-ca-from-secret

Инъекция сертификата поля «ca.crt» из указанного в аннотации Kubernetes Secret. Если источником является секрет Kubernetes, этот ресурс должен также иметь аннотацию security.synapse.sber/allow-direct-injection: «true»

security.synapse.sber/inject-ca-from: my-namespace/my-certificate