Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
GitHub Actionsに「強い」AWSの権限を渡したい / AWS credentia...
Search
FUJIWARA Shunichiro
May 14, 2021
Technology
15k
8
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
GitHub Actionsに「強い」AWSの権限を渡したい / AWS credentials on Actions
FUJIWARA Shunichiro
May 14, 2021
More Decks by FUJIWARA Shunichiro
See All by FUJIWARA Shunichiro
多摩川(.dev)ランニング入門 / Tamagawa.dev#3
fujiwara3
3
530
クラウドを使う側から、作る側へ / 大吉祥寺.pm 2026前夜祭
fujiwara3
8
2.1k
作るべきものと向き合う - ecspresso 8年間の開発史から学ぶ技術選定 / 技術選定con findy 2026
fujiwara3
9
6.1k
さくらのクラウドでのシークレット管理を考える/tamachi.sre#2
fujiwara3
2
400
Amazon ECS デプロイツール ecspresso の開発を支える「正しい抽象化」の探求 / YAPC::Fukuoka 2025
fujiwara3
13
14k
パフォーマンスチューニングのために普段からできること/Performance Tuning: Daily Practices
fujiwara3
9
6.9k
alecthomas/kong はいいぞ
fujiwara3
7
2.6k
ecspressoの設計思想に至る道 / sekkeinight2025
fujiwara3
12
3.8k
さくらのIaaS基盤のモニタリングとOpenTelemetry/OSC Hokkaido 2025
fujiwara3
4
5.6k
Other Decks in Technology
See All in Technology
技術的負債から考える、AI時代のエンジニアリング投資 — ビズリーチの技術的負債と向き合った経験から、変更し続けられるソフトウェアを考える/ technical-debt-con2026
visional_engineering_and_design
4
3.1k
AI de Idea
kawaguti
PRO
2
120
2026-09-18 gotanda.sre Terraformで複数環境作ったり、複数Stateに分割したりそれとTerragrunt / Terraform multi envs and multi states
masasuzu
2
460
AIに任せた品質は、誰が見立てるのか - AI時代のテストマネジメント
nakanao
3
2k
あるけみー式LTスライド作成術
alchemy1115
2
220
AIで社員の自主発信に広報目線を組み込む
_mossann_t
0
110
HHKBエバンジェリストになる方法
941
0
110
おい、エージェントを使って終わらせろ
nwiizo
1
610
DEFCON34-Write-up_HYCu-MYCu
daikiokazaki
0
160
開発投資の期待値を上げるプロダクトロードマップづくり ~プロダクトエンジニアが越境して事業を伸ばす~
kekekenta
1
190
生成AIエージェントを用いた、 手動テスト手順書から自動テストへの 変換手法の検討
magicpod
0
160
AIによるクリエイティブ生成を行う上での試行錯誤
plaidtech
PRO
0
160
Featured
See All Featured
Designing Experiences People Love
moore
143
24k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.9k
Believing is Seeing
oripsolob
1
220
Deep Space Network (abreviated)
tonyrice
0
310
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
940
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.4k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
280
A Soul's Torment
seathinner
8
3.6k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
320
Rails Girls Zürich Keynote
gr2m
96
14k
Transcript
GitHub Actionsに「強い」AWSの権限を渡したい 2021.05.14 ⾯⽩法⼈カヤック 藤原俊⼀郎 @fujiwara
@fujiwara SREチーム所属 2011年〜カヤック(10年!) ISUCON 1,2,5優勝、ISUCON 3,8出題 github.com/kayac/ecspresso Amazon ECS デプロイツール
github.com/fujiwara/lambroll AWS Lambda デプロイツール
最近の仕事 ぼくらの甲⼦園ポケット ECS 移⾏ 2014年リリースの⻑寿ゲーム before: EC2 (ondemand & spot)
after: ECS (Fargate & EC2 spot 100%) Perl5.16→5.30 ログ処理をKinesis+Lambdaに API に CloudFront 導⼊ EC2 & Chef 全廃
最近の悩み AWSのリソースの管理は基本 Terraform で⾏っている (アプリケーションだけ ecspresso / lambroll) terraform plan
とその通知は tfnotify github.com/mercari/tfnotify を使って GitHub Actions / CircleCI で実⾏している 現状 terraform apply は各⾃の⼿元(⼀部は専⽤EC2)で実⾏している apply も CI/CD 環境で実⾏したい!
現状、terraform apply を CI/CD 環境で実⾏していない理由 実⾏に「強い」権限が必要 (⼤抵 Administrator 権限と同等) 強すぎる
IAM User のアクセスキーを外部に預けたくない アクセスキーは環境変数に設定される リポジトリへの書き込み権限を取得されると、奪取される可能性がある Classi の事故 corp.classi.jp/news/2416/ フィッシングからGitHubアクセス キーをコードに書いていなくても、CIをいじって実⾏されたらキーは抜かれる GitHubで全員にMFA強制はなかなか難しい (外部の⼈も全員強制になる)
でも本当はやりたい 開発者、運⽤者の⼿元が安全とは限らない ⼈に依存しない環境で実⾏できるようにしておきたい 条件 権限は安全に保ちたい GitHubリポジトリの書き込み権が奪われてもAWSの権限は渡したくない うっかり誤クリックや誤mergeでは発動したくない 狙ったタイミングで、特定の⼈だけが発動したい
作戦1 - AssumeRole with MFA MFA を使って assume role して「強い」権限を得る作戦
作戦1 - AssumeRole with MFA IAM Userを作ってアクセスキーを発⾏する sts:AssumeRole だけを付与する MFAを必須にする(QRコードは控えておく)
ユーザーのIAM Policy { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::123456789012:role/TerraformApply", "Condition": { "BoolIfExists": { "aws:MultiFactorAuthPresent": "true" } } }
作戦1 - AssumeRole with MFA terraform apply ⽤の「強い」 IAM Role
を作る 作った IAM User を信頼する assume role policy { "Effect": "Allow", "Action": "sts:AssumeRole", "Principal": { "AWS": "arn:aws:iam::123456789012:user/GitHubActions" }, "Condition": { "BoolIfExists": { "aws:MultiFactorAuthPresent": "true" } } }
作戦1 - AssumeRole with MFA GitHub Actionsで、 . IAM User
のアクセスキーを secrets に設定 このキーが取られてもMFAがないとなにもできない . manual trigger のジョブを作る MFA token⼊⼒欄も定義する name: apply on: workflow_dispatch: inputs: token-code: description: 'mfa code' required: true github.blog/changelog/2020-07-06-github-actions-manual-triggers-with- workflow_dispatch/
作戦1 - AssumeRole with MFA
作戦1 - AssumeRole with MFA . secrets のアクセスキーを設定 . aws
sts assume-role をマニュアル⼊⼒した MFA token で実⾏ . 「強い」Roleの権限を取得できる! jobs: manual: runs-on: ubuntu-latest steps: - name: Configure AWS Credentials uses: aws-actions/configure-aws-credentials@v1 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws-region: ap-northeast-1 - name: aws sts AssumeRole with MFA run: | OUTPUT=`aws sts assume-role \ --role-arn arn:aws:iam::123456789012:role/TerraformApply \ --role-session-name github-actions \ --duration-seconds 900 \ --serial-number arn:aws:iam::123456789012:mfa/GithubActions \ --token-code ${{ github.event.inputs.token-code }}` echo AWS_ACCESS_KEY_ID=`echo $OUTPUT | jq -r .Credentials.AccessKeyId` >> $GITHUB_ENV echo AWS_SECRET_ACCESS_KEY=`echo $OUTPUT | jq -r .Credentials.SecretAccessKey` >> $GITHUB_ENV echo AWS_SESSION_TOKEN=`echo $OUTPUT | jq -r .Credentials.SessionToken` >> $GITHUB_ENV shell: bash
作戦1 - AssumeRole with MFA いいところ Actionsに設定されているアクセスキー単体では何もできないので漏洩が怖くない 実⾏時に⼈が MFA token
を⼊⼒するのでうっかり誤発動しない 再実⾏しても token が有効期限切れになっているので動かない いまいちなところ MFAの設定を複数⼈で共有する必要がある (QRコード) IAM User の MFA はひとつしか作れないため MFA token の取得から実⾏までに時間が掛かると有効期限が切れる Actionsの環境起動に10〜20秒かかるので、残り時間を⾒極めて投⼊が必要
作戦2 - CloudShell exports credentials AWS CloudShellが持っている権限を頂いてしまおう作戦
作戦2 - CloudShell exports credentials AWS CloudShell マネージメントコンソールを開いている⼈の権限が設定されている 外部へのネットワークアクセスが可能
作戦2 - CloudShell exports credentials CloudShell で設定されている AWS_ の環境変数 $
env | grep AWS_ |sort AWS_CONTAINER_AUTHORIZATION_TOKEN=******* AWS_CONTAINER_CREDENTIALS_FULL_URI=http://localhost:1338/latest/meta-data/container/security-credentials AWS_DEFAULT_REGION=ap-northeast-1 AWS_EXECUTION_ENV=CloudShell AWS_REGION=ap-northeast-1 これでアクセスキーが取得できる $ curl -H"Authorization: $AWS_CONTAINER_AUTHORIZATION_TOKEN" \ $AWS_CONTAINER_CREDENTIALS_FULL_URI { "LastUpdated": "1970-01-01T00:00:00Z", "Type": "", "AccessKeyId": "ASIAUSOAHXO5WFCZF5GW", "SecretAccessKey": "xxxxxxxxxx", "Token": "xxxxxxxxxxxx" "Expiration": "2021-05-13T06:09:04Z", "Code": "Success" }
作戦2 - CloudShell exports credentials AWS_CONTAINER_CREDENTIALS_FULL_URI http://localhost:1338/latest/meta-data/container/security-credentials つまり CloudShell の
localhost:1338 に外部から繋げれば CloudShell が持っているアクセスキーを取得できるのでは…?
作戦2 - CloudShell exports credentials cloudflared - Argo Tunnel client
github.com/cloudflare/cloudflared ngrok みたいなやつ by Cloudflare CloudShell にインストールして起動。バイナリを置くだけ $ curl -sL https://bin.equinox.io/c/VdrWdbjqyF/cloudflared-stable-linux-amd64.tgz | tar zxvf - cloudflared $ ./cloudflared tunnel --url localhost:1338 ( 略) 2021-05-13T06:00:37Z INF +-----------------------------------------------------------+ 2021-05-13T06:00:37Z INF | Your free tunnel has started! Visit it: | 2021-05-13T06:00:37Z INF | https://hardcover-mixing-bs-madness.trycloudflare.com | 2021-05-13T06:00:37Z INF +-----------------------------------------------------------+ 表⽰されるURL(毎回異なる)にアクセスするとCloudShellのlocalhost:1338に繋がる
作戦2 - CloudShell exports credentials これでどこからでも ($AWS_CONTAINER_AUTHORIZATION_TOKENがあれば) HTTPSで取得できる $ curl
-H"Authorization: $AWS_CONTAINER_AUTHORIZATION_TOKEN" \ https://hardcover-mixing-bs-madness.trycloudflare.com/latest/meta-data/container/security-credentials { "LastUpdated": "1970-01-01T00:00:00Z", "Type": "", "AccessKeyId": "ASIAUSOAHXO54XC5257P", ...
作戦2 - CloudShell exports credentials まとめ . 「強い」権限を持っている⼈が CloudShell を起動
. CloudShell で cloudflared を起動して外部に localhost:1338 を公開する . $AWS_CONTAINER_AUTHORIZATION_TOKEN と公開URLをActionsに⼊⼒ . Actions からURLにアクセスしてアクセスキーを取得
作戦2 - CloudShell exports credentials いいところ 強い権限を持った⼈間 (マネージメントコンソールにログインできている) がいるときだ け、その⼈の権限をその場で渡せる
cloudflared を停⽌したり CloudShell を閉じればアクセスできなくなる 閉じてしまえばうっかり再実⾏しても権限は取れない 渡したアクセスキー⾃体にも有効期限がある CloudShellは無操作だと20〜30分で停⽌される いまいちなところ cloudflared の中をアクセスキーが通過するのをどう考えるか Cloudflareがここで変なことはしないと信頼するかどうかによる AWSが同様のサービスを出してくれたら万事解決では…?
まとめ AWS外に強すぎる権限のアクセスキーを保管しないために、いろいろ考えてみました . AssumeRole with MFA 作戦 実はMFAなしでも簡易的な対策になる キーだけでは sts:AssumeRole
しかできない とはいえassume roleの⼿順は .github/workflows に書いてあるのでちゃんと読まれ たら危ない . CloudShell exports credentials 作戦 没案: Self Hosted Runner EC2でActionsの実⾏環境を⽤意して強い権限を設定しておけば…? workflowをいじられたら強い権限でなんでもできてしまう うっかり再実⾏を防げない