Upgrade to Pro — share decks privately, control downloads, hide ads and more …

さくらのクラウドでのシークレット管理を考える/tamachi.sre#2

 さくらのクラウドでのシークレット管理を考える/tamachi.sre#2

Tamachi.SRE 2026.01.16
藤原俊一郎 @fujiwara
https://tamachi-sre.connpass.com/event/376298/

Avatar for FUJIWARA Shunichiro

FUJIWARA Shunichiro

January 16, 2026
Tweet

More Decks by FUJIWARA Shunichiro

Other Decks in Technology

Transcript

  1. 自己紹介 @fujiwara (X, GitHub, Bluesky) @sfujiwara (hatena, mixi2) 2011〜2024 面白法人カヤック

    2025-02〜 さくらインターネット ISUCON 優勝4回 / 運営(出題)4回 github.com/kayac/ecspresso github.com/fujiwara/lambroll
  2. AWSでの自分のやり方 1. SOPS + AWS KMSで暗号化したファイルをGit管理 2. Terraform で Secrets

    Manager / SSM に登録 + マネージドサービス設定 3. アプリは起動時に Secrets Manager / SSM から取得 ECS: タスク定義で secrets 指定 Lambda: Secrets Lambda Extension EC2など: ssmwrap (後述) で環境変数注入 AWS SOPS 暗号化 SOPS 復号 ECS Lambda ssmwrap secrets.yml 平⽂ secrets.sops.yml 暗号化済 Terraform sops provider Secrets Manager SSM Parameter Store マネージドサービス アプリ
  3. SOPS github.com/getsops/sops YAML/JSON の構造を保ったまま値だけ暗号化/復号できるCLI データキーの暗号化に各種KMS(AWS, GCP, Azure, Vault) / PGP

    / Age 等を利用 CNCFのsandboxプロジェクト www.cncf.io/projects/sops/ # 暗号化後 password: ENC[AES256_GCM,data:xxxxx,...] sops: # SOPSが管理するメタデータ kms: - arn:aws:kms:... enc: ... KMSへのアクセス権がなければ復号不可 = リポジトリで管理できる ファイル丸ごとではなく値だけ暗号化 = 差分が見やすい
  4. AWS Secrets Manager / SSM Parameter Store AWSのマネージドシークレット管理サービス TerraformでSOPSの復号結果を設定する例 //

    https://registry.terraform.io/providers/carlpett/sops // sops provider で SOPS ファイルを読み込み ephemeral "sops_file" "secrets" { source_file = "secrets.sops.yml" } // Secrets Manager に登録 resource "aws_secretsmanager_secret_version" "example" { secret_id = aws_secretsmanager_secret.example.id secret_string_wo = ephemeral.sops_file.secrets.data["password"] } 【注意】(リソースが対応しているなら)ephemeralやwrite-onlyを使う 使わない場合はtfstateに平文が残るのでstateも同じKMSで暗号化すること
  5. ECS / Lambda への注入はマネージドで ECS: タスク定義で secrets 指定する Lambda: Secrets

    Lambda Extension を利用する ssmwrap github.com/handlename/ssmwrap それ以外の環境(EC2など)ではこれを使うと便利 (前職の同僚が開発したOSS) 1. SSM Parameter Store から値を取得 2. 指定したパラメータを環境変数/ファイルに注入して起動するラッパー ssmwrap \ -env 'path=/production/*' \ -file 'path=/production/ssl_cert,to=/etc/ssl/cert.pem,mode=0600' \ -- app
  6. さくらのクラウドでは? 役割 AWS さくら 鍵管理 KMS KMS (2025/09 GA) シークレット保存

    Secrets Manager SSM Parameter Store シークレットマネージャ (2025/09 GA) SOPS連携 標準対応 ない アプリケーション への注入 ECS, Lambda, ssmwrap ない → 足りないものは作ろう
  7. さくらでのワークフロー 足りないものを作って補完した sops-sakura-kms SOPSでさくらのKMSを使うラッパー sakura-secrets-cli シークレットマネージャ操作CLI + exec wrapper さくらのクラウド

    sops-sakura-kms 暗号化 sops-sakura-kms 復号 sops-sakura-kms 復号 sakura-secrets-cli secrets.yml 平⽂ secrets.sops.yml 暗号化済 Terraform sops provider Ansible community.sops シークレットマネージャ KMS で暗号化保存 仮想サーバー マネージドサービス アプリ
  8. sops-sakura-kms github.com/fujiwara/sops-sakura-kms さくらの KMS を SOPS のバックエンドにする暗号化・復号のラッパー SOPSにメジャーではないKMSを機能追加するPRは受け入れられていない HashiCorp VaultのAPIを提供するproxyとして動作することで実現

    # 暗号化 SAKURA_KMS_KEY_ID=123... sops-sakura-kms -e secrets.yml # 復号 sops-sakura-kms -d secrets.sops.yml 【参考】SOPSで「さくらのクラウドKMS」を使う sops-sakura-kms を作りました https://sfujiwara.hatenablog.com/entry/sops-sakura-kms
  9. さくら: Terraform での利用 さくらのクラウドにも公式Terraformプロバイダがあります!! terraform-provider-sakura(v3), terraform-provider-sakuracloud (v2 legacy) 実は sops-sakura-kms

    は任意のコマンドをwrapして起動できるので… # terraform を wrap して実行 SSK_COMMAND=terraform sops-sakura-kms plan // sops providerはsops-sakura-kmsが起動したAPI経由で復号する data "sops_file" "secrets" { source_file = "secrets.sops.yml" } // あとは普通に使うだけ **(write-onlyは鋭意開発中)** resource "sakura_container_registry" "example" { user = [{ password = data.sops_file.secrets.data["password"] }] }
  10. さくら: シークレットマネージャへ登録 resource "sakura_secret_manager" "default" { name = "default" kms_key_id

    = sakura_kms.default.id } // 単一値の登録 resource "sakura_secret_manager_secret" "password" { name = "app" vault_id = sakura_secret_manager.default.id value = data.sops_file.secrets.data["password"] } // 複数の値をJSONでまとめて登録(レートリミット対策) resource "sakura_secret_manager_secret" "app" { name = "app" vault_id = sakura_secret_manager.default.id value = jsonencode({ for k, v in data.sops_file.secrets.data : k => v if startswith(k, "app.") }) }
  11. sakura-secrets-cli github.com/fujiwara/sakura-secrets-cli secret manager 操作のためのCLI(公式にはまだないので書いた) ssmwrap 相当の exec wrapper 機能付き

    # exec wrapper として sakura-secrets-cli secret export \ --name app::json \ # JSONでまとめて登録された値を個別に環境変数に注入 -- /path/to/myapp // Go ライブラリとしても使える envs, _ := sscli.ExportEnvs(ctx, vaultID, []string{"app::json"}) Goの場合はライブラリとして使うと環境変数に生の値が露出しないので より安全(プロセスのメモリ上だけで扱う)
  12. さくら: Ansible でも SOPS を使う まだ IaaS を使わざるを得ない場面も多いので... Ansible: community.sops

    (https://github.com/ansible-collections/community.sops) が使えます # ansible.cfg [defaults] vars_plugins_enabled = host_group_vars,community.sops.sops [community.sops] binary = /usr/local/bin/sops-sakura-kms # SOPSバイナリとしてsops-sakura-kmsを指定する group_vars などでSOPS暗号化したYAML ( .sops.yml ) をそのまま利用可能
  13. AWS vs さくら ワークフロー比較 (2026年1月時点) 役割 AWS さくら KMS AWS

    KMS さくら KMS SOPS連携 標準対応 sops-sakura-kms シークレット保存 Secrets Manager シークレットマネージャ アプリ注入 ECS, Lambda, ssmwrap sakura-secrets-cli Terraform sops provider sops-sakura-kms + sops provider 足りないパーツが埋まって、ほぼ同じワークフローが実現可能に
  14. AWS SOPS 暗号化 SOPS 復号 ECS Lambda ssmwrap secrets.yml 平⽂

    secrets.sops.yml 暗号化済 Terraform sops provider Secrets Manager SSM Parameter Store マネージドサービス アプリ さくらのクラウド sops-sakura-kms 暗号化 sops-sakura-kms 復号 sops-sakura-kms 復号 sakura-secrets-cli secrets.yml 平⽂ secrets.sops.yml 暗号化済 Terraform sops provider Ansible community.sops シークレットマネージャ KMS で暗号化保存 仮想サーバー マネージドサービス アプリ
  15. 課題と今後 ワークフローが fujiwara-ware 依存 仕事で使いたかったけどなかったので作ってしまった さくら公式CLI usacloud に統合できるように動いてます Terraform 実行が

    wrapper 経由で煩雑 公式プロバイダに SOPS data source 対応を入れる方向にしたい さくらの AppRun (コンテナ実行マネージドサービス) 対応 シークレットマネージャからの設定はロードマップにある KMSへの認証が固定APIキー/シークレットのみ OIDCやIAMロールのような連携はこれから…