Secrets 一元管理チャート secret-manager v0.1.0 を実装
Helm Chart Release / release-chart (push) Successful in 6s

クラスター横断で使う認証情報を1チャートで管理し、複数ネームスペースへ
同一 Secret として配布する仕組みを実装。

- distribution: namespaces への複製 / kubernetes-reflector 自動同期 /
  stakater-Reloader 連携を選択可能
- common: namePrefix・共通ラベル/アノテーション・immutable
- mail.providers: SMTP/IMAP/POP3 のサーバ情報 + パスワードを一元管理。
  source 可能な smtp.env と任意の msmtprc スニペットを Secret に同梱
- api.credentials: 任意のキー/値集合を Opaque Secret 化(envFrom 向け)
- generic.secrets: 任意 type(dockerconfigjson / tls / basic-auth 等)
- values.schema.json による厳格バリデーション
- examples/(Gmail・M365・SendGrid・SES・Mailgun・reflector)
- .gitea/workflows/helm-release.yaml で Package Registry へ自動発行
- README.md にセキュリティモデル・values リファレンス・参照方法を記載
- 平文資格情報の混入防止に .gitignore を整備
This commit is contained in:
2026-08-31 09:41:41 +09:00
parent 507fd48d11
commit f374cd2e49
16 changed files with 1329 additions and 1 deletions
+63
View File
@@ -0,0 +1,63 @@
{{- /*
外部メール接続情報 Secret
mail.providers.<name> ごとに 1 つの Secret を生成し、配布先ネームスペースへ複製する。
*/ -}}
{{- range $name, $p := .Values.mail.providers }}
{{- if $p.enabled }}
{{- if not $p.smtp }}
{{- fail (printf "mail.providers.%s: smtp セクションは必須です" $name) }}
{{- end }}
{{- $smtp := $p.smtp }}
{{- if not $smtp.host }}{{- fail (printf "mail.providers.%s.smtp.host は必須です" $name) }}{{- end }}
{{- $security := $smtp.security | default "starttls" }}
{{- $username := $smtp.username | default "" }}
{{- $password := $smtp.password | default "" }}
{{- $from := $smtp.from | default $username }}
{{- $sd := dict }}
{{- $_ := set $sd "SMTP_HOST" (printf "%v" $smtp.host) }}
{{- $_ := set $sd "SMTP_PORT" (printf "%v" ($smtp.port | default 587)) }}
{{- $_ := set $sd "SMTP_SECURITY" (printf "%v" $security) }}
{{- $_ := set $sd "SMTP_USERNAME" (printf "%v" $username) }}
{{- $_ := set $sd "SMTP_PASSWORD" (printf "%v" $password) }}
{{- $_ := set $sd "SMTP_FROM" (printf "%v" $from) }}
{{- $_ := set $sd "SMTP_FROM_NAME" (printf "%v" ($smtp.fromName | default "")) }}
{{- $_ := set $sd "SMTP_REPLY_TO" (printf "%v" ($smtp.replyTo | default "")) }}
{{- $_ := set $sd "SMTP_AUTH_METHOD" (printf "%v" ($smtp.authMethod | default "plain")) }}
{{- /* IMAP(任意) */ -}}
{{- if and $p.imap $p.imap.host }}
{{- $imap := $p.imap }}
{{- $_ := set $sd "IMAP_HOST" (printf "%v" $imap.host) }}
{{- $_ := set $sd "IMAP_PORT" (printf "%v" ($imap.port | default 993)) }}
{{- $_ := set $sd "IMAP_SECURITY" (printf "%v" ($imap.security | default "tls")) }}
{{- $_ := set $sd "IMAP_USERNAME" (printf "%v" ($imap.username | default $username)) }}
{{- $_ := set $sd "IMAP_PASSWORD" (printf "%v" ($imap.password | default $password)) }}
{{- end }}
{{- /* POP3(任意) */ -}}
{{- if and $p.pop3 $p.pop3.host }}
{{- $pop3 := $p.pop3 }}
{{- $_ := set $sd "POP3_HOST" (printf "%v" $pop3.host) }}
{{- $_ := set $sd "POP3_PORT" (printf "%v" ($pop3.port | default 995)) }}
{{- $_ := set $sd "POP3_SECURITY" (printf "%v" ($pop3.security | default "tls")) }}
{{- $_ := set $sd "POP3_USERNAME" (printf "%v" ($pop3.username | default $username)) }}
{{- $_ := set $sd "POP3_PASSWORD" (printf "%v" ($pop3.password | default $password)) }}
{{- end }}
{{- /* source 可能な env ファイル */ -}}
{{- $lines := list }}
{{- range $k, $v := $sd }}
{{- $lines = append $lines (printf "export %s=%s" $k (quote $v)) }}
{{- end }}
{{- $_ := set $sd "smtp.env" (printf "%s\n" (join "\n" (sortAlpha $lines))) }}
{{- /* msmtprc スニペット(任意) */ -}}
{{- if $p.renderMsmtprc }}
{{- $tls := "tls on" }}
{{- $starttls := "tls_starttls on" }}
{{- if eq $security "tls" }}{{- $starttls = "tls_starttls off" }}{{- end }}
{{- if eq $security "none" }}{{- $tls = "tls off" }}{{- $starttls = "tls_starttls off" }}{{- end }}
{{- $auth := "auth off" }}
{{- if $username }}{{- $auth = printf "auth on\nuser %s\npassword %s" $username $password }}{{- end }}
{{- $msmtprc := printf "# secret-manager が生成 (%s)\ndefaults\n%s\n%s\ntls_trust_file /etc/ssl/certs/ca-certificates.crt\nlogfile -\naccount default\nhost %s\nport %v\nfrom %s\n%s\n" $name $tls $starttls $smtp.host ($smtp.port | default 587) $from $auth }}
{{- $_ := set $sd "msmtprc" $msmtprc }}
{{- end }}
{{- include "secret-manager.secret" (dict "ctx" $ "name" $name "stringData" $sd "type" "Opaque" "annotations" ($p.annotations | default dict) "namespacesOverride" ($p.namespacesOverride | default list)) }}
{{- end }}
{{- end }}