Sealed Secrets Web: веб-интерфейс для Kubernetes

Sealed Secrets Web — веб-интерфейс для Sealed Secrets от Bitnami.

Логотип Sealed Secrets Web
Скриншот главного экрана интерфейса
Скриншот дополнительного экрана интерфейса

Sealed Secrets Web — веб-интерфейс для Sealed Secrets от Bitnami. Он позволяет кодировать и декодировать ключи в поле data секрета, загружать существующие Sealed Secrets и создавать новые. Под капотом инструмент использует API сервиса Sealed Secrets для шифрования секретов. Веб-интерфейс устанавливается прямо в кластер Kubernetes, чтобы разработчикам не требовался прямой доступ к кластеру через kubectl.

  • Encode (кодирование): кодирует в Base64 каждый ключ из поля stringData секрета.

  • Decode (декодирование): декодирует из Base64 каждый ключ из поля data секрета.

  • Secrets (секреты): возвращает список всех Sealed Secrets во всех пространствах имён. По клику на Sealed Secret загружается расшифрованный секрет Kubernetes.

  • Seal (запечатать): шифрует секрет Kubernetes и создаёт соответствующий Sealed Secret.

  • Validate (проверить): проверяет корректность Sealed Secret.

Установка

sealed-secrets-web устанавливается через Helm-чарт:

helm repo add bakito https://charts.bakito.net
helm repo update

helm upgrade --install sealed-secrets-web bakito/sealed-secrets-web

Параметры Sealed Secrets можно изменить, передав нужные аргументы через флаг --set. Например, задать другое имя controller-name при установке можно следующей командой:

helm upgrade --install sealed-secrets-web bakito/sealed-secrets-web \
  --set sealedSecrets.namespace=sealed-secrets \
  --set sealedSecrets.serviceName=sealed-secrets

Если нужно отключить возможность загружать существующие секреты и использовать инструмент исключительно для запечатывания новых, используйте:

helm upgrade --install sealed-secrets-web bakito/sealed-secrets-web \
  --set disableLoadSecrets=true

Чтобы отрендерить шаблоны локально:

cd chart
helm template . -f values.yaml

Все доступные значения Helm можно посмотреть по адресу https://github.com/bakito/sealed-secrets-web/blob/main/chart/values.yaml, а параметры приложения — по адресу https://github.com/bakito/sealed-secrets-web/blob/main/pkg/config/types.go#L14-L22.

Использование API

Получение текущего сертификата

curl --request GET 'https://<SEALED_SECRETS_WEB_BASE_URL>/api/certificate'

Запечатывание секрета с помощью серверного сертификата

Вывод запечатанного секрета в формате YAML

curl --request POST 'https://<SEALED_SECRETS_WEB_BASE_URL>/api/kubeseal' \
  --header 'Accept: application/yaml' \
  --data-binary '@stringData.yaml'

Вывод запечатанного секрета в формате JSON

curl --request POST 'https://<SEALED_SECRETS_WEB_BASE_URL>/api/kubeseal' \
  --header 'Accept: application/json' \
  --data-binary '@stringData.yaml'

Запечатывание одного значения со стандартной областью видимости (scope)

curl -request POST 'https://<SEALED_SECRETS_WEB_BASE_URL>/api/raw' \
     --header 'Content-Type: application/json' \
     --data '{ "name": "mysecretname", "namespace": "mysecretnamespace", "value": "value to seal" }'

Проверка запечатанного секрета

Примечание
Проверка (Validate) доступна только при использовании внутреннего API кластера (то есть когда certURL не задан) — см. bitnami-labs/sealed-secrets.
curl --request POST 'https://<SEALED_SECRETS_WEB_BASE_URL>/api/validate' \
  --header 'Accept: application/yaml' \
  --data-binary '@stringData.yaml'

Разработка

Для локальной разработки используется кластер Kubernetes, поднятый с помощью kind. После создания кластера Sealed Secrets устанавливается через Helm:

./run_local.sh

Интерфейс будет доступен по адресу http://localhost/ssw.

Traefik

Этот раздел посвящён использованию sealed-secrets-web совместно с Ingress-контроллером Traefik.

По умолчанию Traefik не удаляет префикс пути при проксировании запросов к приложению. Если задан путь localhost/seal, Traefik передаст запрос приложению как /seal, а не /.

Чтобы настроить Traefik правильно, примените следующий ресурс:

$ cat << EOF > traefik-strip-prefix-middleware.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: strip-prefix
  namespace: kube-system # может быть любым, но требует аннотации ingress.metadata.annotations spec: traefik.ingress.kubernetes.io/router.middlewares: namespace-strip-prefix@kubernetescrd
spec:
  stripPrefixRegex:
    regex:
    - ^/[^/]+
EOF

$ kubectl apply -f traefik-strip-prefix-middleware.yaml

Затем в файле values.yaml адаптируйте следующие параметры под свой хост:

ingress:
  enabled: true
  className: traefik
  hosts:
  - host: your.host
    paths:
    - path: /seal
      pathType: ImplementationSpecific
  annotations:
    traefik.ingress.kubernetes.io/router.middlewares: kube-system-strip-prefix@kubernetescrd

sealedSecrets:
  certURL: https://your.host/v1/cert.pem

webLogs: true
webContext: /seal
© 2026 meganuke