while(1) work();
반응형

serverless framework가 사용하는 AWS 사용자에게 IAM 최소 권한만을 부여하고 싶었다.

그러나 많은 자료들을 찾아보았지만, 최소 권한만 부여하는 IAM policy에 대한 정보는 찾기 어려웠다.

심지어 공식 Documentation에서도 최소 권한이 아닌 불필요하게 많은 권한을 부여하는 policy를 가이드로 제공하고 있었다. (개발의 편의를 위해서겠지..)

 

하지만 serverless framework를 위해 생성한 계정이 모든 lambda함수들의 리스트를 조회한다거나 하는 것을 원치 않았고, 많은 자료들을 짜집기해서 최소 권한만을 부여하는 policy를 작성하였다.

 

그러나 API Gateway의 ARN을 api-id가 아닌 이름으로 지정하는 법을 찾지 못해 해당 부분을 보완하여야 한다.

일단 api-id로 지정한 policy는 아래와 같다.

 

({PROJECT_NAME}, {APIGW_ID} 라고 된 부분을 프로젝트에 맞게 수정해야 한다)

 

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "apigateway:*"
            ],
            "Resource": [
                "arn:aws:apigateway:ap-northeast-2::/tags/arn:aws:apigateway:ap-northeast-2::/apis/{APIGW_ID}"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "cloudformation:Get*",
                "cloudformation:List*",
                "cloudformation:CreateStack",
                "cloudformation:CreateUploadBucket",
                "cloudformation:DeleteStack",
                "cloudformation:Describe*",
                "cloudformation:UpdateStack",
                "cloudformation:DescribeChangeSet",
                "cloudformation:DeleteChangeSet",
                "cloudformation:CreateChangeSet",
                "cloudformation:ExecuteChangeSet"
            ],
            "Resource": [
                "arn:aws:cloudformation:ap-northeast-2:*:stack/{PROJECT_NAME}-*/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "events:Put*",
                "events:Remove*",
                "events:Delete*"
            ],
            "Resource": [
                "arn:aws:events:ap-northeast-2::event-source/*",
                "arn:aws:events:ap-northeast-2:*:rule/{PROJECT_NAME}-*",
                "arn:aws:events:ap-northeast-2:*:event-bus/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "events:DescribeRule"
            ],
            "Resource": [
                "arn:aws:events:ap-northeast-2:*:rule/{PROJECT_NAME}-*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "lambda:CreateFunction",
                "cloudformation:ValidateTemplate"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "lambda:AddPermission",
                "lambda:CreateAlias",
                "lambda:DeleteFunction",
                "lambda:InvokeFunction",
                "lambda:PublishVersion",
                "lambda:RemovePermission",
                "lambda:Update*",
                "lambda:PutFunctionEventInvokeConfig",
                "lambda:DeleteFunctionEventInvokeConfig",
                "lambda:Get*",
                "lambda:Tag*",
                "lambda:List*"
            ],
            "Resource": [
                "arn:aws:lambda:ap-northeast-2:*:function:{PROJECT_NAME}-*",
                "arn:aws:lambda:ap-northeast-2:*:event-source-mapping:*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:AttachRolePolicy",
                "iam:GetRole",
                "iam:CreateRole",
                "iam:PutRolePolicy",
                "iam:DeleteRolePolicy",
                "iam:DetachRolePolicy",
                "iam:DeleteRole",
                "iam:PassRole"
            ],
            "Resource": [
                "arn:aws:iam::*:role/{PROJECT_NAME}-*-ap-northeast-2-lambdaRole"
            ]
        },
        {
            "Action": [
                "logs:DeleteLogGroup"
            ],
            "Resource": [
                "arn:aws:logs:ap-northeast-2:*:log-group:/aws/lambda/{PROJECT_NAME}-*:*"
            ],
            "Effect": "Allow"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:DescribeLogGroups",
                "logs:DescribeLogStreams",
                "logs:PutRetentionPolicy"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:CreateBucket",
                "s3:DeleteBucket",
                "s3:ListBucket",
                "s3:ListBucketVersions",
                "s3:PutBucketAcl",
                "s3:PutAccelerateConfiguration",
                "s3:GetEncryptionConfiguration",
                "s3:PutEncryptionConfiguration",
                "s3:GetBucketPolicy",
                "s3:PutBucketPolicy",
                "s3:DeleteBucketPolicy",
                "s3:PutBucketPublicAccessBlock"
            ],
            "Resource": [
                "arn:aws:s3:::{PROJECT_NAME}-*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::{PROJECT_NAME}-*/*"
            ]
        }
    ]
}

 

 

 

 dynamodb를 사용한다면 해당 정책을 추가로 부여해야 한다.

 

반응형
profile

while(1) work();

@유호건

❤️댓글은 언제나 힘이 됩니다❤️ 궁금한 점이나 잘못된 내용이 있다면 댓글로 남겨주세요.

검색 태그