Slide 1

Slide 1 text

Copyright ©NIFTY Corporation All Rights Reserved. ニフティ開発インターンで使う AWS環境を できるだけ楽に構築した話 会員システムグループ 第二開発チーム 上原 直希

Slide 2

Slide 2 text

ニフティで開発インターンシップを開催 ● 8月に開発インターンを開催 ● 学生はチームに分かれ、3日間チーム開発 ● スクラムの原則に則って活動してもらう

Slide 3

Slide 3 text

インターン中の学生の開発の流れ ● 学生のPCでソースコードを追加・修正 ● IAMユーザーを使ってAWS CodeCommitにpushしPR作成 ● チームメンバーおよびメンター社員がPRをレビュー ● 大丈夫そうであればマージ、デプロイ ● 上の繰り返し

Slide 4

Slide 4 text

運営としてインフラを色々いじっていた ● インターンの運営として関わる ● インフラ構築が大変そうだったので、 いい感じにできないか? ● 一ヶ月くらいTerraformをゴニョゴニョいじっていく

Slide 5

Slide 5 text

紹介したいところ 1. 学生に払い出すIAMユーザーのパスワードをボタンぽちぽちせずに 払い出したい 2. 開催時間以外は学生がリソースにアクセスできないようにしたい 3. AWS CodeCommitのmasterブランチに直pushできないようにしたい 4. AWS CodeCommitでPRは必ず社員の承認を得てからマージできるよ うにしたい

Slide 6

Slide 6 text

IAMユーザーのパスワード払い出し

Slide 7

Slide 7 text

ポチポチして30人分のパスワードを発行する... 面倒

Slide 8

Slide 8 text

コンソールログイン用のパスワード払い出し aws_iam_user_login_profile resource "aws_iam_user" "example" { name = "example" path = "/" for ce_destroy = true } resource "aws_iam_user_login_profile" "example" { user = aws_iam_user.example.name pgp_key = "keybase:some_person_that_exists" } IAMユーザー作成 コンソールログイン 用のパスワード払い 出し

Slide 9

Slide 9 text

.encrypted_passwordで 生成したパスワードを参照可能 aws_iam_user_login_profile resource "aws_iam_user_login_profile" "example" { user = aws_iam_user.example.name pgp_key = "keybase:some_person_that_exists" } パスワード払い出し (暗号化キーも指定) output "password" { value = aws_iam_user_login_profile.example.encrypted_password } 暗号化されたパスワード を参照可能

Slide 10

Slide 10 text

Gitクライアント用の認証情報の払い出し aws_iam_service_specific_credential resource "aws_iam_service_specific_credenBal" "example" { service_name = "codecommit.amazonaws.com" user_name = aws_iam_user.example.name } output "codecommit_user_name" { value = aws_iam_service_specific_credential.example.service_user_name } output "codecommit_password" { value = aws_iam_service_specific_credential.example.service_user_password } Git用認証情報 Git認証用の ID/パスワード

Slide 11

Slide 11 text

Terraform便利! コンソールに入らずにパスワードを払い出せるので便利!

Slide 12

Slide 12 text

アクセス可能時間を制御したい!

Slide 13

Slide 13 text

IAMユーザーのアクセス可能時間制御 ● インターン時間外にはコンソールやAWS CodeCommitにアクセスして 欲しくない ● 開始時間になったらアクセスできるようIAMポリシーを付ける、 終わったら外す ○ 手動でやるの面倒

Slide 14

Slide 14 text

IAMユーザーのアクセス可能時間制御 ● IAMポリシーにConditionがあ る ● Conditionに時間制限をかけら れる { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "*" ], "Resource": "*", "Condition": { "DateGreaterThan": { "aws:CurrentTime": "${start}" }, "DateLessThan": { "aws:CurrentTime": "${end}" } } } ] }

Slide 15

Slide 15 text

IAMユーザーのアクセス可能時間制御 ● 現在時刻が開始時間から終了時間の間までポリシーが適用される "CondiBon": { "DateGreaterThan": { "aws:CurrentTime": "開始時間" }, "DateLessThan": { "aws:CurrentTime": "終了時間" } }

Slide 16

Slide 16 text

IAMユーザーのアクセス可能時間制御 { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "AcKon": [ "codecommit:GitPush" ], "Resource": "arn:aws:codecommit:us-east-2:111111111111:MyDemoRepo", "CondiKon": { "DateGreaterThan": { "aws:CurrentTime": "2024-09-21T09:00:00+09:00" }, "DateLessThan": { "aws:CurrentTime": "2024-09-21T17:00:00+09:00" } } } ] } 学生が使うIAMユーザーは 9/21の9:00-17:00で MyDemoRepoに pushのみ 可能

Slide 17

Slide 17 text

masterにpushして欲しくない

Slide 18

Slide 18 text

AWS CodeCommitのmasterに直push禁止 GitHub ブランチ保護ルールを使う =レポジトリに設定 AWS CodeCommit IAMポリシーでIAMユーザーの 権限を制限 =ユーザー単位の制限 (=レポジトリに設定できない)

Slide 19

Slide 19 text

AWS CodeCommitのmasterに直push禁止 masterに対してpush禁止を 示すIAMポリシーを作成 →ユーザーにアサインすれば、 そのユーザーはpushできない { "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "AcKon": ["codecommit:GitPush"], "Resource": "*", "CondiKon": { "StringEqualsIfExists": { "codecommit:References": ["refs/heads/master"] }, "Null": { "codecommit:References": false } } } ] } https://docs.aws.amazon.com/ja_jp/service-authorization/latest/reference/list_awscodecommit.html

Slide 20

Slide 20 text

社員が承認してからマージしたい

Slide 21

Slide 21 text

GitHub ブランチ保護ルール AWS CodeCommitでは承認ルールを使う AWS CodeCommit 承認ルール

Slide 22

Slide 22 text

承認ルールの面倒なところ 承認ルールはPRごとに設定しないといけないので、面倒 → 承認ルールテンプレートを使えば自動的に設定してくれる

Slide 23

Slide 23 text

承認ルールテンプレートはこんな感じ 何人承認必要か 誰からの承認が 必要か マージ先のブランチ (master, mainの 指定が多い)

Slide 24

Slide 24 text

レビュアーにはロール名/スイッチ元ユーザ ー名で指定する https://dev.classmethod.jp/articles/codecommit-approval-rule-tips/

Slide 25

Slide 25 text

社員からの承認を必須にするには 社員はAdministratorロールが取れるので、 承認プールにはAdministrator/*と指定 →学生のIAMユーザーはApproveしても 条件を満たさないためマージできない

Slide 26

Slide 26 text

Terraformで承認ルールテンプレートを作る時 ハマりポイント resource "aws_codecommit_approval_rule_template" "approval_rule" { name = "approval-rule" description = "承認テンプレート" content = <

Slide 27

Slide 27 text

紹介したこと ● 学生に払い出すIAMユーザーの認証情報をぽちぽちせずに払い出し たい ● 指定時間以外は学生がAWS CodeCommitにアクセスできないように したい ● AWS CodeCommitのmasterブランチに直pushできないようにしたい ● AWS CodeCommitでPRは必ず社員の承認を得てからマージできるよ うにしたい

Slide 28

Slide 28 text

まとめ ● Terraformを使って簡単にパスワードを払い出せる ○ IaC最高 ● IAMポリシーのConditionで時間帯によるアクセス制御ができる ● AWS CodeCommitに制限をかける時はIAMや承認ルールテンプレー トを駆使していきましょう