Slide 1

Slide 1 text

AWS Codeシリーズで構築した Terraformパイプラインの ユーザー側IAM

Slide 2

Slide 2 text

プロフィール 名前:檜山 準(ひやま じゅん) 所属:I◯◯◯ お仕事:クラウドエンジニア(設計、構築、運用保守) https://twitter.com/hiyanger https://qiita.com/hiyanger https://zenn.dev/hiyanger 最近よく使う技術:AWS、IaC、CI/CD  出身:栃木県 よかったら フォローしてね! 趣味:弾き語り 好きなAWSサービス:CloudFormation https://speakerdeck.com/hiyanger

Slide 3

Slide 3 text

もくじ 全体構成 運用者/IAMポリシー 商用環境での管理者/IAMポリシー MFAポリシーとCodeCommit認証 検証環境での管理者/IAMポリシー 簡易設計

Slide 4

Slide 4 text

全体構成

Slide 5

Slide 5 text

全体構成 クロスアカウントにより、developブランチは検証、mainブランチは商用というリポジトリの一元管理を行っている。 developブランチは主に運用者、mainブランチは管理者で操作という大まかなイメージ。 ※黒線:パイプラインのメイン動作 緑線:アーティファクト系の動作 オレンジ線:Terraformのバックエンド動作

Slide 6

Slide 6 text

簡易設計

Slide 7

Slide 7 text

IAM 簡易設計 ■ 基本  ActionやResourceでアスタリスク(*)の使用でリスクを伴う場合は使用を避ける。  全アクションやリソースが許可されたりして、意図しない操作ができるようになってしまったりする。  (参考元をそのまま使うと*のままになってるパターンが多い) ■ 管理者/運用者 共通  ・リポジトリは削除できない  ・mainブランチにはpushできない  ・develop/mainブランチは削除できない ■ 運用者(検証環境のみ)  ・別のリポジトリは全アクションできない  ・developブランチにpushできない  ・mainブランチへのマージはできない  ・全設定変更できない 忙しさに負けてポリシーをゆるくしてし まいがちですが、最大限の努力をして最 小権限のポリシーを作り上げましょう!

Slide 8

Slide 8 text

運用者/IAMポリシー

Slide 9

Slide 9 text

運用者/IAMポリシー A/運用者はdevelopブランチまでの操作、 検証環境でのパイプライン操作が可能

Slide 10

Slide 10 text

運用者/IAMポリシー ※権限はホワイトリスト形式で作成 ■ CodeCommit  ・全般的なCodeCommit利用権限(*は使わずに)  ・developブランチやmainブランチにpushやdeleteをさせない  ・developブランチだけにマージができる ■ CodePipeline  ・全般的な閲覧とBuild間の承認が可能 ■ CodeBuild  ・CodePipeline動作時のログ確認が可能(logs権限も必要) { "Action": [ "codecommit:GitPush", "codecommit:DeleteBranch" ], "Condition": { "StringEqualsIfExists": { "codecommit:References": [ "refs/heads/develop", "refs/heads/main" ] }, "Null": { "codecommit:References": "false" } }, "Effect": "Deny", "Resource": "arn:aws:codecommit:ap-northeast-1:${account-id}:${env}-codecommit" }, ブランチの指定が可能 テストは大変です

Slide 11

Slide 11 text

管理者/IAMポリシー

Slide 12

Slide 12 text

【検証環境】管理者/IAMポリシー B/管理者は検証環境で全操作と商用環境での パイプライン承認が可能

Slide 13

Slide 13 text

【検証環境】管理者/IAMポリシー ※権限はブラックリスト形式で作成  (PowerUserあり) ■CodeCommit  ・リポジトリを削除させない  ・develop、mainブランチを削除させない  ・mainブランチにはpushできない { "Action": "codecommit:DeleteBranch", "Condition": { "StringEqualsIfExists": { "codecommit:References": [ "refs/heads/develop", "refs/heads/main" ] } }, "Effect": "Deny", "Resource": "arn:aws:codecommit:ap-northeast-1:${account-id}:*" }, pushじゃなければnullの 記述はなくてOK

Slide 14

Slide 14 text

【商用環境】管理者/IAMポリシー ※権限はホワイトリスト形式で作成 (ReadOnlyあり) ■CodePipeline  ・Build間のApprovalを承認できる { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "codepipeline:PutApprovalResult", "Resource": "arn:aws:codepipeline:ap-northeast-1:${account-id}:prd-codepipeline-terraform/Approval/plan-app roval" } ] }

Slide 15

Slide 15 text

MFAポリシーと CodeCommit認証

Slide 16

Slide 16 text

MFAポリシーとCodeCommit認証 MFAのポリシー利用が設定されてる場合は CodeCommitの許可設定が必要

Slide 17

Slide 17 text

MFAポリシーとCodeCommit認証 CodeCommitは認証時にhttpsを利用しているた め、MFAを設定(MFAを利用していない場合は 操作できない)していると、アクセスが拒否 される。 そのため、CodeCommitはMFA認証の対象から除 外する必要がある。 { "Sid": "DenyActionWithoutMFA", "Effect": "Deny", "NotAction": [ "codecommit:GitPull", "codecommit:GitPush", "kms:Encrypt", "kms:Decrypt", "kms:ReEncryptFrom", "kms:ReEncryptTo", "kms:GenerateDataKey", "kms:GenerateDataKeyWithoutPlaintext", "kms:DescribeKey" ], "Resource": "*", "Condition": { "BoolIfExists": { "aws:MultiFactorAuthPresent": "false" } } } { "Sid": "DenyKMSActionWithoutMFA", "Effect": "Deny", "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncryptFrom", "kms:ReEncryptTo", "kms:GenerateDataKey", "kms:GenerateDataKeyWithoutPlaintext", "kms:DescribeKey" ], "NotResource": "arn:aws:kms:ap-northeast-1:${account-id}:key/${aws-codecommit-k ey-id}", "Condition": { "BoolIfExists": { "aws:MultiFactorAuthPresent": "false" } } } ①CodeCommitとKMS関連しないMFAアクセスを拒否 (CodeCommitとKMSは許可) ②CodeCommitに関連しないKMSアクセスを拒否

Slide 18

Slide 18 text

Thanks!! ・構築中の忙しさに負けてポリシーをゆるくしていまわないよう、  最大限の努力をして最小権限のポリシーを作り上げましょう! ・権限の作り方によっては細かいテストが必要になります。  正常異常含め網羅性のあるテスト実施をしましょう。 ・IAMまわりは思ったより工数がかかるので、  事前に十分な工数確保しておきましょう。 本資料 https://speakerdeck.com/hiyanger/aws-codesirizudegou-zhu-sitaterraform paipurainnoyuzace-iam https://twitter.com/hiyanger https://qiita.com/hiyanger https://speakerdeck.com/hiyanger https://zenn.dev/hiyanger 過去のスライド Codeシリーズで作るTerraformのCICDパイプラインの概要 https://speakerdeck.com/hiyanger/codesirizudezuo-ruterraformnocicdpa ipurain AWS Codeシリーズを使った TerraformのCICDパイプラインの作り方 https://speakerdeck.com/hiyanger/aws-codesirizuwoshi-tuta-terraformn ocicdpaipurainnozuo-rifang