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

Alternative GitHub Secret Manager

Alternative GitHub Secret Manager

2024/10/11に開催された、Alternative Architecture DOJO SPでの登壇資料です。
GitHub Acitonsで、サードパーティ製シークレットストアを使う場合の注意点についてまとめました。

https://alterbooth.connpass.com/event/320858/

Ken'ichirou Kimura

October 15, 2024
Tweet

More Decks by Ken'ichirou Kimura

Other Decks in Technology

Transcript

  1. Alternative GitHub Secret Manager 2024/10/11 Alternative Architecture DOJO SP ~Decade

    of Alternative Spirits~ 木村健一郎 Copyright © Alterbooth Inc. All Rights Reserved. 1
  2. 自己紹介 株式会社オルターブース クラウドソリューション部 副部長 木村 健一郎(Kenichiro KIMURA) 大学院在籍中に未踏ソフトウェア創造事業に 採択され、その成果を元に設立したスタート アップに20年在籍。

    2014年頃からクラウドの世界に触れる中で サーバレスとIoTに魅せられ、JAWS-UG福岡 やSORACOM UG九州のコアメンバーとして コミュニティ活動を行っている。 2020年にオルターブースにジョイン。テッ クリードとしてお客様の支援やプロダクトの 開発に従事している。 家に帰ると7歳の娘と戯れる日々。 AWS Samurai2019受賞 AWS APJ Community Award 2023受賞 SORACOM MVC2020/2023受賞 Copyright © Alterbooth Inc. All Rights Reserved. 2
  3. • GitHub Actionsで機密情報を扱うときにはシークレット機能を使う • 暗号強度などが要件に合わない場合は他のシークレットストアも利用可能 • Azure Key Vault •

    AWS Secrets Manager • Hashicorp Vault • 1password • サードパーティのシークレットストアを使うときはactionの実装方法と利用方 法に注意する • 環境変数は後続の全てのステップで共有される • シークレットのマスクはあくまでも「Actionsのログ出力時」のみ • 迷ったときはビルトインのシークレット機能を使う 本日のまとめ Copyright © Alterbooth Inc. All Rights Reserved. 3
  4. • GitHub Actionsでシークレット(機密情報)を取り扱うケース • Ex) デプロイのためのAPIキー • シークレットの漏洩に備える • ワークフローファイルに直接記載は当然NG

    • 環境変数で渡してもActionsのログから漏洩する • GitHubのビルトインのシークレット機能 • libsodiumによる暗号化 • Organization/Repository/Environmentの3レベルでの設定 • Actionsからは、明示的にアクセスしたものだけ取得可能 • シークレットに登録された文字列はログの出力ではマスクされる • 機械的にその「値」が「***」に置換されるので、出力の他の部分に同じ文字があっても置き換わってしまう • 暗号化が不要な値も登録可能 GitHubのシークレットとは Copyright © Alterbooth Inc. All Rights Reserved. 4
  5. ワークフロー内での利用方法 ワークフローファイル - name: Get secrets by name and by

    ARN uses: aws-actions/aws-secretsmanager-get-secrets@v2 with: secret-ids: | ${{ secrets.SSM_ARN }} testplainkey parse-json-secrets: true 利用したいstepなどで ${{ secrets.名前 }} でアクセスする Copyright © Alterbooth Inc. All Rights Reserved. 5
  6. • 暗号化方法が選べない • 暗号化キーの取り扱いや暗号強度などが運用上指定されてる場合は使えない可能性がある • ビルトインでローテーションの機能が無い • シークレットを払い出すようなサービスではない • REST

    APIで実装は可能 • 登録した内容を表示できないのでデバッグが辛い • 基本的に上書きでの再登録しかできない • 当然ログに出力できない • 値を外部のサービスに送信すれば見えるが・・ • 普段利用しているシークレットサービスや、デプロイ先のパブリッククラウド のサービスを使うのもよい手段 • cliなどで独自にstep内で取得 • 公開されているaction(できれば公式のもの)を使う GitHubのシークレットの課題 Copyright © Alterbooth Inc. All Rights Reserved. 7
  7. マーケットプレイスで「azure keyvault」で検索すると5つある(2024/10現在) のでそれを利用する • theotow/keyvault-secret-azure • cjlapao/get-azure-keyvault-secrets • copdips/get-azure-keyvault-secrets-action •

    Andrews-McMeel-Universal/get-envs • vinayaja/keyvault-secrets 個人的にはcjlapao/get-azure-keyvault-secretsがお勧め(理由は後述) Azure Key Vaultを使う Copyright © Alterbooth Inc. All Rights Reserved. 8
  8. JavaScript actionの概要 JavaScript action ・・・ // シークレットを取得 let secretValue =

    getSecret(secretName) // 値がシークレットであるとマークする core.setSecret(secret) // 環境変数に追加する core. setVariables(name,secretValue) // 出力に追加する core.setOutput(name,secretValue) ・・・ • 取得した値をsetSecretでシークレットであるとマークし、環境変数または actionの出力に追加する • GitHub Actionsはログの出力時に、setSecretでマークされた文字列を機械的 に「***」に置き換える Copyright © Alterbooth Inc. All Rights Reserved. 12
  9. 1.setSecretしているか? 動かしてみるかソースを見る以外に確かめようがない 例: Andrews-McMeel-Universal/get-envs • 名前にSECRET、TOKEN、KEY、PASS、CONNECTION_STRINGが含まれていたら setSecret(このアクションはcompositeなので実際はadd-mask)する つまり、上記が含まれた名前の変数以外はログで見えてしまう。 また、「Key Vaultから取得した設定を.envファイルに出力する」というaction

    なので、後続のステップに「.envファイルを外部に送る」とか「コードの変更を commitしてpush」というような処理があると漏洩するので後続の処理内容と変 数名に注意する。 シークレットを取得するアクションでの注意点 Copyright © Alterbooth Inc. All Rights Reserved. 13
  10. Copyright © Alterbooth Inc. All Rights Reserved. configure-aws-credentialsアクションで setVariablesしたもの configure-aws-credentialsアクションで

    setSecretしてsetVariablesしたもの aws-secretsmanager-get-secretsアクションで setSecretしてsetVariablesしたもの
  11. outputが使える例 - name: Load secrets from 1password id: op-load-secret uses:

    1password/load-secrets-action@v2 with: export-env: false env: SECRET_NAME: op://xxxx/xxxx/SECRET_NAME - name: next action uses: xxxxxxxxxxx with: secret-name: ${{ steps.op-load- secret.outputs.SECRET_NAME }} 左は1passwordの例。 明示的にoutputを渡す記述を したステップでのみそのシー クレットが利用できる。 Copyright © Alterbooth Inc. All Rights Reserved. 17
  12. • GitHub Actionsで機密情報を扱うときにはシークレット機能を使う • 暗号強度などが要件に合わない場合は他のシークレットストアも利用可能 • Azure Key Vault •

    AWS Secrets Manager • Hashicorp Vault • 1password • サードパーティのシークレットストアを使うときはactionの実装方法と利用方 法に注意する • 環境変数は後続の全てのステップで共有される • シークレットのマスクはあくまでも「Actionsのログ出力時」のみ • 迷ったときはビルトインのシークレット機能を使う 本日のまとめ Copyright © Alterbooth Inc. All Rights Reserved. 19
  13. • GitHub Acitonsのセキュリティ https://docs.github.com/ja/actions/security-for-github-actions/ • アクションの作成 https://docs.github.com/ja/actions/sharing-automations/creating- actions • GitHub

    Acitonsのワークフローコマンド https://docs.github.com/ja/actions/writing-workflows/choosing-what- your-workflow-does/workflow-commands-for-github-actions • 1password Service Accountsを使ってGitHub Actionsのシークレットを管 理する https://aadojo.alterbooth.com/entry/2024/08/11/134016 参考文献 Copyright © Alterbooth Inc. All Rights Reserved. 20