Slide 1

Slide 1 text

Alternative GitHub Secret Manager 2024/10/11 Alternative Architecture DOJO SP ~Decade of Alternative Spirits~ 木村健一郎 Copyright © Alterbooth Inc. All Rights Reserved. 1

Slide 2

Slide 2 text

自己紹介 株式会社オルターブース クラウドソリューション部 副部長 木村 健一郎(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

Slide 3

Slide 3 text

• GitHub Actionsで機密情報を扱うときにはシークレット機能を使う • 暗号強度などが要件に合わない場合は他のシークレットストアも利用可能 • Azure Key Vault • AWS Secrets Manager • Hashicorp Vault • 1password • サードパーティのシークレットストアを使うときはactionの実装方法と利用方 法に注意する • 環境変数は後続の全てのステップで共有される • シークレットのマスクはあくまでも「Actionsのログ出力時」のみ • 迷ったときはビルトインのシークレット機能を使う 本日のまとめ Copyright © Alterbooth Inc. All Rights Reserved. 3

Slide 4

Slide 4 text

• GitHub Actionsでシークレット(機密情報)を取り扱うケース • Ex) デプロイのためのAPIキー • シークレットの漏洩に備える • ワークフローファイルに直接記載は当然NG • 環境変数で渡してもActionsのログから漏洩する • GitHubのビルトインのシークレット機能 • libsodiumによる暗号化 • Organization/Repository/Environmentの3レベルでの設定 • Actionsからは、明示的にアクセスしたものだけ取得可能 • シークレットに登録された文字列はログの出力ではマスクされる • 機械的にその「値」が「***」に置換されるので、出力の他の部分に同じ文字があっても置き換わってしまう • 暗号化が不要な値も登録可能 GitHubのシークレットとは Copyright © Alterbooth Inc. All Rights Reserved. 4

Slide 5

Slide 5 text

ワークフロー内での利用方法 ワークフローファイル - 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

Slide 6

Slide 6 text

Copyright © Alterbooth Inc. All Rights Reserved. 6 ログ上ではシークレットで渡した「secret-ids」の値がマスクされている

Slide 7

Slide 7 text

• 暗号化方法が選べない • 暗号化キーの取り扱いや暗号強度などが運用上指定されてる場合は使えない可能性がある • ビルトインでローテーションの機能が無い • シークレットを払い出すようなサービスではない • REST APIで実装は可能 • 登録した内容を表示できないのでデバッグが辛い • 基本的に上書きでの再登録しかできない • 当然ログに出力できない • 値を外部のサービスに送信すれば見えるが・・ • 普段利用しているシークレットサービスや、デプロイ先のパブリッククラウド のサービスを使うのもよい手段 • cliなどで独自にstep内で取得 • 公開されているaction(できれば公式のもの)を使う GitHubのシークレットの課題 Copyright © Alterbooth Inc. All Rights Reserved. 7

Slide 8

Slide 8 text

マーケットプレイスで「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

Slide 9

Slide 9 text

マーケットプレイスで検索するといくつか出てくるが、公式のActionがあり、公 式ドキュメントも存在するのでそれを利用する https://docs.aws.amazon.com/ja_jp/secretsmanager/latest/userguide/re trieving-secrets_github.html 以下の2つのactionを組み合わせて利用する • aws-actions/configure-aws-credentials • aws-actions/aws-secretsmanager-get-secrets 公式ではあるが、利用上注意すべき点あり(注意する点は後述) AWS Secrets Managerを使う Copyright © Alterbooth Inc. All Rights Reserved. 9

Slide 10

Slide 10 text

マーケットプレイスで検索するといくつか出てくるが、公式のActionがあり、公 式ドキュメントも存在するのでそれを利用する https://developer.hashicorp.com/vault/docs/platform/github-actions • hashicorp/vault-action 1点だけ注意すれば安全に利用できる(注意する点は後述) Hashicorp Vaultを使う Copyright © Alterbooth Inc. All Rights Reserved. 10

Slide 11

Slide 11 text

マーケットプレイスで検索するといくつか出てくるが、公式のActionがあり、公 式ドキュメントも存在するのでそれを利用する https://developer.1password.com/docs/ci-cd/github-actions/ • 1Password/load-secrets-action 1点だけ注意すれば安全に利用できる(注意する点は後述) 1passwordを使う Copyright © Alterbooth Inc. All Rights Reserved. 11

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

Copyright © Alterbooth Inc. All Rights Reserved. 名前に「SECRET」があるので マスクされている 名前に特定の文字が含まれていないので マスクされていない

Slide 15

Slide 15 text

2.環境変数ではなくoutputが使えるか? • 環境変数は同じジョブ内の、後続の全てのステップで共有されている • outputは利用するステップで明示的に取り出したものだけが共有される • setSecretでマスクされるのは「Actionsのログ出力時」だけ つまり、後続のステップに「デバッグのために環境変数を全て外部のサーバに送 る」といった処理があれば漏洩する。 もちろん、そういった処理が無いことが保証されているのであれば問題ない。 シークレットを取得するアクションでの注意点 Copyright © Alterbooth Inc. All Rights Reserved. 15

Slide 16

Slide 16 text

Copyright © Alterbooth Inc. All Rights Reserved. configure-aws-credentialsアクションで setVariablesしたもの configure-aws-credentialsアクションで setSecretしてsetVariablesしたもの aws-secretsmanager-get-secretsアクションで setSecretしてsetVariablesしたもの

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

3.環境変数への出力はデフォルトの動作か? outputが使えても、環境変数への出力が抑制できない、または抑制するために は追加の設定が必要な場合がある。 hashicorp/vaultと1Password/load-secrets-actionは、環境変数への出力を抑 止する設定を明記する必要がある。 シークレットを取得するアクションでの注意点 Copyright © Alterbooth Inc. All Rights Reserved. 18 action 環境変数への出力抑制 デフォルト値 cjlapao/get-azure-keyvault-secrets export_env = falseで抑制可 false hashicorp/vault exportEnv = falseで抑制可 true 1Password/load-secrets-action export-env = falseで抑制可 true

Slide 19

Slide 19 text

• GitHub Actionsで機密情報を扱うときにはシークレット機能を使う • 暗号強度などが要件に合わない場合は他のシークレットストアも利用可能 • Azure Key Vault • AWS Secrets Manager • Hashicorp Vault • 1password • サードパーティのシークレットストアを使うときはactionの実装方法と利用方 法に注意する • 環境変数は後続の全てのステップで共有される • シークレットのマスクはあくまでも「Actionsのログ出力時」のみ • 迷ったときはビルトインのシークレット機能を使う 本日のまとめ Copyright © Alterbooth Inc. All Rights Reserved. 19

Slide 20

Slide 20 text

• 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