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

Kiro CLIは初学者の育成におおいに役立つ!~初学者でも実現できたAWSのセキュリティ~

Avatar for pi_tanaka pi_tanaka
April 21, 2026
160

Kiro CLIは初学者の育成におおいに役立つ!~初学者でも実現できたAWSのセキュリティ~

Avatar for pi_tanaka

pi_tanaka

April 21, 2026

Transcript

  1. 3 自己紹介 氏名:田中緋奈乃 所属:株式会社エーピーコミュニケーションズ クラウド事業部 IaC技術推進部 Cloud Native Group (熊本在住のフルリモート)

    エンジニア歴:6年(うち1年は産休育休) 主にオンプレ・仮想基盤構築 AWSは机上での試験勉強のみ 登壇歴:今回が初めてです。。 趣味:ディズニー作品が幼少期から大好きで 一人ディズニーも心の底から楽しめます
  2. 6 Kiro CLI は、AWS が提供する AI アシスタント付きコマンドラインツール です。 ターミナル上で AI

    と対話しながら、AWS リソースの管理や コード作成などの作業を効率的に実行できます。 Kiro CLIとは
  3. 8 ▪話すこと ①Kiro CLIが初学者育成におすすめな理由 / Kiro CLIを活用するために一番大事なポイント ②【事例】Kiro CLIを利用して2カ月半で実現したセキュリティ ③初学者だからこそ、Kiro

    CLIを利用してAWSを学ぶ上での注意点 ▪話さないこと ・Kiro CLIの設定、機能について ・Kiro CLI以外の事例(KiroのIDE版はどうなのか等) 話すこと / 話さないこと
  4. 15 例:Webアプリケーション開発時 設計者:ひよこ 作業者:Kiro CLI Excelで設計して キャプチャ(.png)をわたす 画面レイアウト/画面遷移図 データのCRUD図/ER図 …

    Web画面やDynamoDBを Excelで設計した通りに AWSのベストプラクティスを踏まえて CDKソースコードに落とし込む 人間がやるべきことさえやっていれば、Kiro CLIはいかようにでも対応してくれる
  5. AWSで最初に知っておきたい3つのアクセス制御 1 2 AWS環境へのIAMによるアクセス制御 S3に保存されているデータへのアクセス制御 17 3 EC2に対するネットワークのアクセス制御 出典:【JAWS DAYS

    2026】C10 楽しく学ぼう!セキュリティ 入門 https://www.youtube.com/watch?v=iH83dOpPe8U AWS Security Hero 臼田 佳祐さんのお言葉 今回は初学者が この2つに関するセキュリティを ベストプラクティスに沿って実現
  6. 18 AWS Security Hero 臼田 佳祐さんのお言葉 AWSのセキュリティは IAMに始まりIAMに終わる 出典:【JAWS DAYS

    2026】C10 楽しく学ぼう!セキュリティ 入門 https://www.youtube.com/watch?v=iH83dOpPe8U
  7. 20 { "Version": "2012-10-17", "Statement": [ { "Sid": "EC2DescribeForSSM", "Effect":

    "Allow", "Action": [ "ec2:DescribeInstances", "ec2:DescribeInstanceStatus" ], "Resource": "*", "Condition": { "StringEquals": { "aws:RequestedRegion": "ap-northeast-1" } } }, { "Sid": "SSMPortForwardingSession", "Effect": "Allow", "Action": [ "ssm:StartSession" ], "Resource": [ "arn:aws:ec2:ap-northeast-1:*:instance/*", "arn:aws:ssm:ap-northeast-1:*:document/AWS-StartPortForwardingSession" ] }, { "Sid": "SSMMessaging", "Effect": "Allow", "Action": [ "ssmmessages:CreateControlChannel", "ssmmessages:CreateDataChannel", "ssmmessages:OpenControlChannel", "ssmmessages:OpenDataChannel" ], "Resource": "*" }, { "Sid": "SSMSessionManagement", "Effect": "Allow", "Action": [ "ssm:TerminateSession", "ssm:ResumeSession" ], "Resource": "arn:aws:ssm:ap-northeast-1:*:session/${aws:username}-*" }, { "Sid": "SSMDescribeForConsole", "Effect": "Allow", "Action": [ "ssm:DescribeSessions", "ssm:GetConnectionStatus", "ssm:DescribeInstanceProperties" ], "Resource": "*", "Condition": { "StringEquals": { "aws:RequestedRegion": "ap-northeast-1" } } }, { "Sid": "S3BucketList", "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": "arn:aws:s3:::xxxxxxxx" }, { "Sid": "S3ObjectAccess", "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject" ], "Resource": "arn:aws:s3:::xxxxxxxx/*" }, { "Sid": "AwsLoginAccess", "Effect": "Allow", "Action": [ "signin:AuthorizeOAuth2Access", "signin:CreateOAuth2Token" ], "Resource": "arn:aws:signin:*:*:oauth2/public-client/*" } ] } 【実現したベストプラクティス】 1. 最小権限の原則 - SSMに必要なDescribeのみ - ポートフォワーディング専用ドキュメントのみ許可 - 自分のセッションのみ操作可能 - 特定バケットの、必要なアクションのみ 2. リージョン制限の適切な適用 - EC2 Describe、SSM Describe系にリージョン条件を付与 - グローバルサービスではない操作に絞って適用 3. SSMによるSSH不要のアクセス - EC2への直接SSH(ポート22)を不要にする設計 - セキュリティグループでSSHポートを閉じられる - セッションログをCloudTrail/S3に記録可能な構成 4. S3のアクション分離 - ListBucketはバケットARN - GetObject/PutObjectはオブジェクトARN JSONファイル
  8. 21 { "Version": "2012-10-17", "Statement": [ { "Sid": "PowerUserAccess", "Effect":

    "Allow", "NotAction": [ "iam:*", "organizations:*", "account:*" ], "Resource": "*", "Condition": { "StringEquals": { "aws:RequestedRegion": "ap-northeast-1" } } }, { "Sid": "PowerUserAccessLimitedIAM", "Effect": "Allow", "Action": [ "account:GetAccountInformation", "account:GetPrimaryEmail", "account:ListRegions", "iam:CreateServiceLinkedRole", "iam:DeleteServiceLinkedRole", "iam:ListRoles", "organizations:DescribeEffectivePolicy", "organizations:DescribeOrganization" ], "Resource": "*" }, { "Sid": "IAMUserManagement", "Effect": "Allow", "Action": [ "iam:CreateUser", "iam:DeleteUser", "iam:GetUser", "iam:ListUsers", "iam:TagUser", "iam:UntagUser", "iam:ListUserTags", "iam:CreateLoginProfile", "iam:UpdateLoginProfile", "iam:DeleteLoginProfile", "iam:GetLoginProfile", "iam:ListAccessKeys", "iam:DeleteAccessKey", "iam:UpdateAccessKey", "iam:ListAttachedUserPolicies", "iam:ListUserPolicies", "iam:DeleteUserPolicy", "iam:ListGroupsForUser" ], "Resource": "*" }, { "Sid": "IAMGroupManagement", "Effect": "Allow", "Action": [ "iam:CreateGroup", "iam:DeleteGroup", "iam:GetGroup", "iam:ListGroups", "iam:AddUserToGroup", "iam:RemoveUserFromGroup", "iam:AttachGroupPolicy", "iam:DetachGroupPolicy", "iam:ListAttachedGroupPolicies", "iam:ListGroupPolicies" ], "Resource": "*" }, { "Sid": "ChangeOwnPassword", "Effect": "Allow", "Action": [ "iam:ChangePassword", "iam:GetUser" ], "Resource": "arn:aws:iam::*:user/${aws:username}" }, { "Sid": "SSMPassRole", "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::*:role/SSM-Automation-ExecutionRole" } ] } 【実現したベストプラクティス】 1. 最小権限の原則 - NotActionでIAM/Organizations/Accountの完全な権限を除外 - リージョン制限(ap-northeast-1のみ)を実装 - サービスリンクロールのみ作成可能に制限 2. リージョン制限の適切な適用 - aws:RequestedRegion条件で東京リージョンに限定 - コスト管理とコンプライアンス要件に対応 3. 自己パスワード変更の許可 - ${aws:username}変数で本人のみに制限 - セキュリティ運用の基本 JSONファイル
  9. 23 { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowSSMAutomationRoleWrite", "Effect":

    "Allow", "Principal": { "AWS": "arn:aws:iam::<ACCOUNT_ID>:role/<SSM_AUTOMATION_ROLE_NAME>" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::xxxxxxx/*" }, { "Sid": "DenyUnauthorizedRead", "Effect": "Deny", "Principal": "*", "Action": [ "s3:GetObject", "s3:ListBucket", "s3:GetBucketLocation" ], "Resource": [ "arn:aws:s3:::xxxxxxx", "arn:aws:s3:::xxxxxxx/*" ], "Condition": { "StringNotEqualsIfExists": { "aws:PrincipalTag/Role": [ "xxx", "xxx", "xxx" ] }, "ArnNotLike": { "aws:PrincipalArn": [ "arn:aws:iam::<ACCOUNT_ID>:role/<SSM_AUTOMATION_ROLE_NAME>", "arn:aws:iam::<ACCOUNT_ID>:root" ] }, "BoolIfExists": { "aws:PrincipalIsAWSService": "false" } } }, { "Sid": "DenyNonAES256Encryption", "Effect": "Deny", "Principal": "*", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::xxxxxxx/*", "Condition": { "StringNotEqualsIfExists": { "s3:x-amz-server-side-encryption": "AES256" } } }, { "Sid": "DenyNonTLSAccess", "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": [ "arn:aws:s3:::xxxxxxx", "arn:aws:s3:::xxxxxxx/*" ], "Condition": { "Bool": { "aws:SecureTransport": "false", "aws:PrincipalIsAWSService": "false" } } } ] } 【実現したベストプラクティス】 1. 転送中の暗号化強制(TLS必須) - AWS Security Best Practices: データ転送時の暗号化 - 中間者攻撃(MITM)の防止 - コンプライアンス要件(PCI-DSS、HIPAA等)への対応 2. 保存時の暗号化強制(SSE-S3必須) - AWS Well-Architected Framework: Security Pillar - データ漏洩時のリスク軽減 - 暗号化なしアップロードの完全ブロック 3. 最小権限の原則 - 書き込みは特定ロールのみ(単一責任) - 読み取りはタグベースのABAC(Attribute-Based Access Control) - 不要な権限を一切付与しない設計 4. 多層防御(Defense in Depth) - 単一の防御に依存しない各レイヤーで独立した保護のため、1つの制御が破られても他が機能 5. 明示的なDeny(Explicit Deny)の活用 - 他のポリシーでAllowされても確実にブロック - セキュリティ要件の強制に最適 6. タグベースのアクセス制御(ABAC) - AWS推奨のABAC(Attribute-Based Access Control) - ユーザー追加時にポリシー変更不要 - スケーラブルな権限管理 7. AWSサービスの除外 - S3レプリケーション、CloudTrail等のAWSサービスを阻害しない - サービス間連携の維持し、運用性とセキュリティのバランスの最適化を図る JSONファイル
  10. 24 { "Version": "2012-10-17", "Statement": [ { "Sid": "DenyInsecureTransport", "Effect":

    "Deny", "Principal": "*", "Action": "s3:*", "Resource": [ "arn:aws:s3:::xxxxxxxxx", "arn:aws:s3:::xxxxxxxxx/*" ], "Condition": { "Bool": { "aws:SecureTransport": "false" } } }, { "Sid": "EnforceSSES3Encryption", "Effect": "Deny", "Principal": "*", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::xxxxxxxxx/*", "Condition": { "StringNotEquals": { "s3:x-amz-server-side-encryption": "AES256" } } }, { "Sid": "DenyUnauthorizedRead", "Effect": "Deny", "Principal": "*", "Action": [ "s3:GetObject", "s3:GetObjectVersion", "s3:ListBucket", "s3:GetBucketLocation" ], "Resource": [ "arn:aws:s3:::xxxxxxxxx", "arn:aws:s3:::xxxxxxxxx/*" ], "Condition": { "StringNotEqualsIfExists": { "aws:PrincipalTag/Role": ["xxxxxxxxx", "xxxxxxxxx"] }, "ArnNotLike": { "aws:PrincipalArn": "arn:aws:iam::<アカウントID>:root" }, "BoolIfExists": { "aws:PrincipalIsAWSService": "false" } } }, { "Sid": "DenyUnauthorizedWrite", "Effect": "Deny", "Principal": "*", "Action": [ "s3:PutObject", "s3:DeleteObject", "s3:DeleteObjectVersion" ], "Resource": "arn:aws:s3:::xxxxxxxxx/*", "Condition": { "StringNotEqualsIfExists": { "aws:PrincipalTag/Role": ["xxxxxxxxx", "xxxxxxxxx"] } (どんなに小さくしても入らない ので省略) 【実現したベストプラクティス】 ※前ポリシーに追加 1. 読み書きの分離制御(ABAC) - 読み取りと書き込みを独立したStatementで制御 - DeleteObject/DeleteObjectVersionを明示的に制御 - GetObjectVersionも含めバージョニング対応 2. パスベースの細粒度アクセス制御 - NotResourceを使ったホワイトリスト型アクセス制御 - s3:prefix条件でListBucketの参照範囲を制限 - ロールベースの職責分離(Separation of Duties) 3. ネットワークレベルのアクセス制御 - VPCエンドポイント経由のアクセスを強制 - 許可IPアドレス(オンプレ/VPN等)を明示的に許可 - IfExists演算子でAWSサービスを阻害しない - AWS Well-Architected: ネットワーク保護レイヤーの実装 4. バージョニング設定の保護 - バージョニング設定の無効化を防止 - ランサムウェア対策(バージョン削除による身代金要求の防止) - データ保護・コンプライアンス要件への対応 JSONファイル
  11. 29 設計者:ひよこ 作業者:Kiro CLI 情報提供 公式ドキュメントより情報を提供。 しかしハルシネーションの可能性ももちろんあるし、 間違っていないとしても、適切だとは限らない (漏れやもっと良い方法があるかもしれない) ①Kiro

    CLIの回答が適切だと思ってしまう ・Kiro CLIのハルシネーションに気づけない ・視野がKiro CLIの回答の幅に限定され、 Kiro CLIが言わなかったことは 「存在しない」と思ってしまう
  12. 30 ①の対応策 初学者:ひよこ 有識者:人間 何度も何度も 会話を重ねて 漏れ / 誤りを無くしていく 一番の相談相手は人間の有識者であることを認識する

    AWSのベストプラクティスはKiro CLIが知っていても、 お客様のベストプラクティスは人間が知っている