ホーム>source

ユーザーがすべてのec2アクションを実行できるようにするポリシーを作成しましたが、ユーザーをruninstancesおよびcreatevolumesに制限し、明示的な拒否で指定されたタグのキーと値のペアを渡す場合のみインスタンスを終了します。

  1. ec2フルパーミッションポリシー

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "VisualEditor0",
                "Effect": "Allow",
                "Action": "ec2:*",
                "Resource": "*"
            }
        ]
    }
    
    
  2. ec2インスタンスを実行し、条件付きで明示的に拒否するボリュームを作成します。

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "VisualEditor0",
                "Effect": "Deny",
                "Action": [
                    "ec2:RunInstances",
                    "ec2:CreateVolume"
                ],
                "Resource": [
                    "arn:aws:ec2:*:*:instance/*",
                    "arn:aws:ec2:*:*:volume/*"
                ],
                "Condition": {
                    "ForAllValues:StringNotEquals": {
                        "aws:TagKeys": "Name",
                        "aws:RequestTag/Name": "${aws:username}"
                    }
                }
            },
            {
                "Sid": "VisualEditor1",
                "Effect": "Deny",
                "Action": "ec2:CreateTags",
                "Resource": [
                    "arn:aws:ec2:*:*:instance/*",
                    "arn:aws:ec2:*:*:volume/*"
                ],
                "Condition": {
                    "ForAllValues:StringNotEquals": {
                        "aws:RequestTag/Name": "${aws:username}"
                    },
                    "StringNotEquals": {
                        "ec2:CreateAction": "RunInstances",
                        "aws:TagKeys": "Name"
                    }
                }
            },
            {
                "Sid": "VisualEditor2",
                "Effect": "Deny",
                "Action": [
                    "ec2:DeleteVolume",
                    "ec2:TerminateInstances"
                ],
                "Resource": [
                    "arn:aws:ec2:*:*:instance/*",
                    "arn:aws:ec2:*:*:volume/*"
                ],
                "Condition": {
                    "ForAllValues:StringNotEquals": {
                        "ec2:ResourceTag/Name": "${aws:username}"
                    }
                }
            }
        ]
    }
    
    

私の要件は、ユーザーを制限してすべてのec2アクセス許可を付与し、タグキー「名前」とタグ値を「theaws awsユーザー名」として渡す場合のみruninstancesに制限することです。 しかし、このポリシーがユーザーに適用されると、タグキー「Name」を渡すときにのみ実行するように制限されますが、タグ値「theaws aws user name ${aws:username}」では制限されません。 しかし、ユーザーがインスタンスを終了しようとするとき、同じ制限が適切に機能しています。つまり、ユーザーはタグキー「名前」とタグ値「their aws user name ${aws:username}」でインスタンスを終了できません

ポリシーのエラーの可能性があります。これは、ユーザーがtagkey "Name"およびtagValueの値を持つインスタンスを実行できるようにすることです。nullでも許可されます。

あなたの答え
  • 解決した方法 # 1

    以下のIAMポリシーを使用して、好みに応じて編集できます。私は本番環境でこれを使用し、問題なく動作します。リストに存在する値でタグ付けされている場合にのみインスタンスを起動します。

    ここで、キー= Environment 、値= mentioned below

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "TheseActionsDontSupportResourceLevelPermissions",
                "Effect": "Allow",
                "Action": [
                    "ec2:Describe*"
                ],
                "Resource": "*"
            },
            {
                "Sid": "VisualEditor0",
                "Effect": "Allow",
                "Action": "ec2:RunInstances",
                "Resource": [
                    "arn:aws:ec2:*::image/ami-*",
                    "arn:aws:ec2:*:ACCOUNT_ID:volume/*",
                    "arn:aws:ec2:*:ACCOUNT_ID:subnet/*",
                    "arn:aws:ec2:*:ACCOUNT_ID:network-interface/*",
                    "arn:aws:ec2:*:ACCOUNT_ID:security-group/*",
                    "arn:aws:ec2:*:ACCOUNT_ID:key-pair/*"
                ]
            },
            {
                "Sid": "VisualEditor1",
                "Effect": "Deny",
                "Action": "ec2:RunInstances",
                "Resource": "arn:aws:ec2:*:ACCOUNT_ID:instance/*",
                "Condition": {
                    "StringNotLike": {
                        "aws:RequestTag/Environment": [
                            "Testing",
                            "Staging",
                            "Production",
                            "Nightly",
                            "Sandbox",
                            "LoadTesting"
                        ]
                    }
                }
            }
        ]
    }
    
    

  • 解決した方法 # 2

    次のブロックが論理ORを実装しているため、機能していません。そのため、いずれかの条件が満たされると、インスタンスが起動されます。ここで説明したように、条件キーを2つの異なるブロックに分けることにより、論理ANDを作成する必要があります。

    "Condition": {
                "ForAllValues:StringNotEquals": {
                    "aws:TagKeys": "Name",
                    "aws:RequestTag/Name": "${aws:username}"
                }
            }
    
    

関連記事

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ angular - forループで配列の長さを表示する方法は?