태그로 함수 보안

태그로 함수 보안 (ABAC)

다음 단계는 ABAC를 사용해 함수에 대한 권한을 설정하는 한 가지 방법을 보여줘요. 이 예제 시나리오에서는 4개의 IAM 권한 정책을 만든 다음, 이 정책들을 새 IAM 역할에 연결해요. 마지막으로 IAM 사용자를 만들고 그 사용자에게 새 역할을 수임할 권한을 줍니다.

출처: AWS Lambda 개발자 안내서

본문

Topics(주제)

사전 요구 사항

Lambda 실행 역할이 있는지 확인하세요. IAM 권한을 부여할 때와 Lambda 함수를 만들 때 이 역할을 사용해요.

1단계: 새 함수에 태그 요구

Lambda에서 ABAC를 사용할 때 모든 함수에 태그가 있도록 요구하는 것이 모범 사례예요. 이렇게 하면 ABAC 권한 정책이 예상대로 작동하도록 보장할 수 있어요.

다음 예제와 유사한 IAM 정책을 만드세요. 이 정책은 aws:RequestTag/tag-key, aws:ResourceTag/tag-key, aws:TagKeys 조건 키를 사용해 새 함수와 함수를 만드는 IAM 보안 주체 모두 project 태그를 갖도록 요구해요. ForAllValues 수정자는 project가 유일하게 허용된 태그임을 보장해요. ForAllValues 수정자를 포함하지 않으면 사용자는 project도 전달하는 한 함수에 다른 태그를 추가할 수 있어요.

예제 – 새 함수에 태그 요구


{
    "Version":"2012-10-17",		 		 	
    "Statement": {
      "Effect": "Allow",
      "Action": [
        "lambda:CreateFunction",
        "lambda:TagResource"
      ],
      "Resource": "arn:aws:lambda:*:*:function:*",
      "Condition": {
        "StringEquals": {
          "aws:RequestTag/{{project}}": "${aws:PrincipalTag/{{project}}}",
          "aws:ResourceTag/{{project}}": "${aws:PrincipalTag/{{project}}}"
        },
        "ForAllValues:StringEquals": {
          "aws:TagKeys": "{{project}}"
        }
      }
    }
  }

2단계: Lambda 함수와 IAM 보안 주체에 연결된 태그를 기반으로 작업 허용

aws:ResourceTag/tag-key 조건 키를 사용하는 두 번째 IAM 정책을 만들어 보안 주체의 태그가 함수에 연결된 태그와 일치하도록 요구하세요. 다음 예제 정책은 project 태그가 있는 보안 주체가 project 태그가 있는 함수를 호출할 수 있게 해줘요. 함수에 다른 태그가 있으면 작업이 거부돼요.

예제 – 함수와 IAM 보안 주체에 일치하는 태그 요구


{
    "Version":"2012-10-17",		 		 	
    "Statement": [
      {
        "Effect": "Allow",
        "Action": [
          "lambda:InvokeFunction",
          "lambda:GetFunction"
        ],
        "Resource": "arn:aws:lambda:*:*:function:*",
        "Condition": {
          "StringEquals": {
            "aws:ResourceTag/{{project}}": "${aws:PrincipalTag/{{project}}}"
          }
        }
      }
    ]
  }

3단계: 목록 권한 부여

보안 주체가 Lambda 함수와 IAM 역할을 나열할 수 있게 하는 정책을 만드세요. 이렇게 하면 보안 주체가 콘솔과 API 작업 호출 시 모든 Lambda 함수와 IAM 역할을 볼 수 있어요.

예제 – Lambda 및 IAM 목록 권한 부여


{
    "Version":"2012-10-17",		 		 	
    "Statement": [
      {
        "Sid": "AllResourcesLambdaNoTags",
        "Effect": "Allow",
        "Action": [
          "lambda:GetAccountSettings",
          "lambda:ListFunctions",
          "iam:ListRoles"
        ],
        "Resource": "*"
      }
    ]
  }

4단계: IAM 권한 부여

iam:PassRole을 허용하는 정책을 만드세요. 이 권한은 함수에 실행 역할을 할당할 때 필요해요. 다음 예제 정책에서 예제 ARN을 여러분의 Lambda 실행 역할 ARN으로 바꾸세요.

참고
iam:PassRole 작업이 있는 정책에서 ResourceTag 조건 키를 사용하지 마세요. IAM 역할의 태그를 사용해 누가 그 역할을 전달할 수 있는지 제어할 수 없어요. 역할을 서비스에 전달하는 데 필요한 권한에 대한 자세한 내용은 사용자에게 역할을 AWS 서비스로 전달할 권한 부여를 참고하세요.

예제 – 실행 역할 전달 권한 부여


{
    "Version":"2012-10-17",		 		 	
    "Statement": [
      {
        "Sid": "VisualEditor0",
        "Effect": "Allow",
        "Action": [
          "iam:PassRole"
        ],
        "Resource": "{{arn:aws:iam::{{111122223333}}:role/lambda-ex}}"
      }
    ]
  }

5단계: IAM 역할 만들기

역할로 권한을 위임하는 것이 모범 사례예요. abac-project-role이라는 IAM 역할을 만드세요:

  • Step 1: Select trusted entity(신뢰할 엔터티 선택): AWS account를 선택한 다음 This account를 선택합니다.
  • Step 2: Add permissions(권한 추가): 이전 단계에서 만든 4개의 IAM 정책을 연결합니다.
  • Step 3: Name, review, and create(이름, 검토, 생성): Add tag를 선택합니다. Key에 project를 입력합니다. Value는 입력하지 않습니다.

6단계: IAM 사용자 만들기

abac-test-user라는 IAM 사용자를 만드세요. Set permissions(권한 설정) 섹션에서 Attach existing policies directly를 선택한 다음 Create policy를 선택합니다. 다음 정책 정의를 입력하세요. {{111122223333}}을 여러분의 AWS 계정 ID로 바꾸세요. 이 정책은 abac-test-user가 abac-project-role을 수임할 수 있게 해줘요.

예제 – IAM 사용자가 ABAC 역할을 수임하도록 허용


[ JSON ]


{
    "Version":"2012-10-17",		 		 	
    "Statement": {
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Resource": "arn:aws:iam::{{111122223333}}:role/{{abac-project-role}}"
    }
  }

7단계: 권한 테스트

  1. abac-test-user로 AWS 콘솔에 로그인합니다. 자세한 내용은 IAM 사용자로 로그인을 참고하세요.
  2. abac-project-role 역할로 전환합니다. 자세한 내용은 역할로 전환 (콘솔)을 참고하세요.
  3. Lambda 함수를 만듭니다:
    • Permissions 아래에서 Change default execution role을 선택한 다음 Execution role에 대해 Use an existing role을 선택합니다. 4단계: IAM 권한 부여에서 사용한 같은 실행 역할을 선택하세요.
    • Advanced settings 아래에서 Enable tags를 선택한 다음 Add new tag를 선택합니다. Key에 project를 입력합니다. Value는 입력하지 않습니다.
  4. 함수를 테스트합니다.
  5. 두 번째 Lambda 함수를 만들고 environment 같은 다른 태그를 추가합니다. 이 작업은 실패해야 해요. 1단계: 새 함수에 태그 요구에서 만든 ABAC 정책이 보안 주체가 project 태그로만 함수를 만들 수 있게 허용하기 때문이에요.
  6. 태그 없이 세 번째 함수를 만듭니다. 이 작업은 실패해야 해요. 1단계: 새 함수에 태그 요구에서 만든 ABAC 정책이 보안 주체가 태그 없이 함수를 만들 수 있게 허용하지 않기 때문이에요.

이 권한 부여 전략을 사용하면 새 사용자마다 새 정책을 만들지 않고도 접근을 제어할 수 있어요. 새 사용자에게 접근 권한을 주려면 할당된 프로젝트에 해당하는 역할을 수임할 권한만 부여하면 됩니다.

8단계: 리소스 정리

IAM 역할 삭제하기

  1. IAM 콘솔의 역할 페이지를 엽니다.
  2. 5단계에서 만든 역할을 선택합니다.
  3. Delete(삭제)를 선택합니다.
  4. 삭제를 확인하려면 텍스트 입력 필드에 역할 이름을 입력합니다.
  5. Delete(삭제)를 선택합니다.

IAM 사용자 삭제하기

  1. IAM 콘솔의 Users 페이지를 엽니다.
  2. 6단계에서 만든 IAM 사용자를 선택합니다.
  3. Delete(삭제)를 선택합니다.
  4. 삭제를 확인하려면 텍스트 입력 필드에 사용자 이름을 입력합니다.
  5. Delete user(사용자 삭제)를 선택합니다.

Lambda 함수 삭제하기

  1. Lambda 콘솔의 함수 페이지를 엽니다.
  2. 만든 함수를 선택합니다.
  3. Actions, Delete를 선택합니다.
  4. 텍스트 입력 필드에 confirm을 입력하고 Delete를 선택합니다.

더 알아보기 (Learn more)

  • 태그 기반 ABAC로 함수 권한을 제어하고, 새 함수 태그 요구, 함수·보안 주체 태그 일치, 역할·사용자·테스트·정리 단계를 익혀 보세요.