

# Lambda에서 속성 기반 액세스 제어 사용
<a name="attribute-based-access-control"></a>

[속성 기반 액세스 제어(ABAC)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction_attribute-based-access-control.html)를 사용하여 Lambda 리소스에 대한 액세스를 제어할 수 있습니다. 특정 Lambda 리소스에 태그를 연결하거나, 특정 API 요청에서 태그를 전달하거나, AWS Identity and Access Management(IAM) 위탁자에게 연결하여 요청할 수 있습니다. AWS 속성 기반 액세스를 부여하는 방법에 대한 자세한 내용은 *IAM 사용 설명서*에서 [태그를 사용하여 AWS 리소스에 대한 액세스 제어](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_tags.html)를 참조하세요.

IAM 정책에서 Amazon 리소스 이름(ARN) 또는 IAM 정책을 지정하지 않고 ABAC를 사용하여 [최소 권한 부여](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)할 수 있습니다. 대신 IAM 정책 [조건 요소](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)에서 태그를 지정하여 액세스를 제어할 수 있습니다. ABAC를 사용하면 새 리소스를 생성할 때 IAM 정책을 업데이트할 필요가 없으므로 확장이 더 쉬워집니다. 대신 새 리소스에 태그를 추가하여 액세스를 제어하세요.

Lambda에서 태그는 다음 리소스에 대해 작동합니다.
+ 함수 - 함수 태그 지정에 대한 자세한 내용은 [Lambda 함수에서 태그 사용](configuration-tags.md) 섹션을 참조하세요.
+ 코드 서명 구성 - 코드 서명 구성에 태그를 지정하는 방법에 대한 자세한 내용은 [코드 서명 구성에 태그 사용](tags-csc.md) 섹션을 참조하세요.
+ 이벤트 소스 매핑 - 이벤트 소스 매핑에 태그를 지정하는 방법에 대한 자세한 내용은 [이벤트 소스 매핑에 태그 사용](tags-esm.md) 섹션을 참조하세요.

계층에는 태그가 지원되지 않습니다.

다음 조건 키를 사용하면 태그 기반의 IAM 정책 규칙을 작성할 수 있습니다.
+ [aws:ResourceTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag): Lambda 리소스에 연결된 태그를 기반으로 액세스를 제어합니다.
+ [aws:RequestTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag): 새 함수를 만들 때와 같이 요청에 태그가 있어야 합니다.
+ [aws:PrincipalTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-principaltag): IAM 위탁자(요청을 하는 사람)이 자신의 IAM [사용자](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags_users.html) 또는 [역할](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags_roles.html)에 연결된 태그를 기반으로 수행할 수 있는 권한을 제어합니다.
+  [aws:TagKeys](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys): 요청에서 특정 키를 사용할 수 있는지 여부를 제어합니다.

 조건을 지원하는 작업에 대해서만 조건을 지정할 수 있습니다. 각 Lambda 작업에서 지원되는 조건 목록은 서비스 승인 참조의 [AWS Lambda의 작업, 리소스 및 조건 키](https://docs.aws.amazon.com//service-authorization/latest/reference/list_awslambda.html)를 참조하세요. **aws:ResourceTag/tag-key** 지원은 ‘AWS Lambda에서 정의한 리소스 유형’을 참조하세요. **aws:RequestTag/tag-key** 및 **aws:TagKeys** 지원은 ‘AWS Lambda에서 정의한 작업’을 참조하세요.

**Topics**
+ [태그로 함수 보안](attribute-based-access-control-example.md)

# 태그로 함수 보안
<a name="attribute-based-access-control-example"></a>

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

**Topics**
+ [사전 조건](#abac-prerequisites)
+ [1단계: 새 함수에 태그 필요](#require-tag-on-create)
+ [2단계: Lambda 함수 및 IAM 위탁자에 연결된 태그를 기반으로 작업 허용](#restrict-actions-function-tags)
+ [3단계: 목록 권한 부여](#abac-list-permissions)
+ [4단계: IAM 권한 부여](#abac-iam-permissions)
+ [5단계 - IAM 역할 생성](#abac-create-role)
+ [6단계: IAM 사용자 생성](#abac-create-user)
+ [7단계: 권한 테스트](#abac-test)
+ [8단계: 리소스 정리](#abac-clean-up)

## 사전 조건
<a name="abac-prerequisites"></a>

[Lambda 실행 역할](lambda-intro-execution-role.md)이 있는지 확인하십시오. IAM 권한을 부여할 떄와 Lambda 함수를 만들 때 이 역할을 사용합니다.

## 1단계: 새 함수에 태그 필요
<a name="require-tag-on-create"></a>

Lambda와 함께 ABAC를 사용하는 경우 모든 함수에 태그가 필요한 것이 모범 사례입니다. 이렇게 하면 ABAC 권한 정책이 예상대로 작동할 수 있습니다.

다음과 비슷한 [IAM 정책을 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html#access_policies_create-json-editor)합니다. 이 정책은 [aws:RequestTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag), [aws:ResourceTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag) 및 [aws:TagKeys](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys) 조건 키를 사용하여 새 함수와 해당 함수를 생성하는 IAM 위탁자가 모두 `project` 태그를 갖도록 요구합니다. `ForAllValues` 수정자는 `project` 태그만 허용되게 합니다. `ForAllValues` 수정자를 포함하지 않는 경우 사용자는 `project`울(를) 통과하는 한 함수에 다른 태그를 추가할 수 있습니다.

**Example - 새 함수에 태그 필요**    
****  

```
{
    "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 위탁자에 연결된 태그를 기반으로 작업 허용
<a name="restrict-actions-function-tags"></a>

[aws:ResourceTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag) 조건 키를 사용하여 위탁자의 태그가 함수에 연결된 태그와 일치할 것을 요구하는 두 번째 IAM 정책을 생성합니다.. 다음 예제 정책에서는 `project` 태그가 있는 위탁자가 `project` 태그가 있는 함수를 간접 호출하도록 허용합니다. 함수에 다른 태그가 있으면 작업이 거부됩니다.

**Example — 함수와 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단계: 목록 권한 부여
<a name="abac-list-permissions"></a>

위탁자가 Lambda 함수 및 IAM 역할을 나열할 수 있도록 허용하는 정책을 생성합니다. 이렇게 하면 위탁자가 콘솔에서 그리고 API 작업을 호출할 때 모든 Lambda 함수와 IAM 역할을 볼 수 있습니다.

**Example — Lambda 및 IAM 목록 권한 부여**    
****  

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

## 4단계: IAM 권한 부여
<a name="abac-iam-permissions"></a>

**iam:PassRole**을 허용하는 정책을 생성합니다. 이 권한은 함수에 실행 역할을 할당할 때 필요합니다. 다음 예제 정책에서는 예제 ARN을 Lambda 실행 역할의 ARN으로 바꿉니다.

**참고**  
`ResourceTag` 작업을 포함하는 정책에는 `iam:PassRole` 조건 키를 사용하지 마세요. IAM 역할에서는 태그를 사용하여 누가 해당 역할을 전달할 수 있는지 액세스 권한을 제어할 수 없습니다. 서비스에 역할을 전달할 수 있는 권한 부여에 대한 자세한 내용은 [사용자에게 AWS 서비스에 역할을 전달할 권한 부여](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_passrole.html)를 참조하세요.

**Example — 실행 역할을 전달할 수 있는 권한 부여**    
****  

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

## 5단계 - IAM 역할 생성
<a name="abac-create-role"></a>

[역할을 사용하여 권한을 위임](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#delegate-using-roles)하는 모범 사례입니다. `abac-project-role`이라고 하는 [IAM 역할 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html#roles-creatingrole-user-console):
+ **1단계: 신뢰할 수 있는 엔터티 선택**에서 **AWS 계정**을 선택한 다음 **이 계정**을 선택합니다.
+ **2단계: 권한 추가**에서는 이전 단계에서 생성한 네 가지 IAM 정책을 연결합니다.
+ **3단계: 이름, 검토 및 생성**에서는 **태그 추가**를 선택합니다. **키**에 `project`를 입력합니다. **값(Value)**을 입력하지 마십시오.

## 6단계: IAM 사용자 생성
<a name="abac-create-user"></a>

`abac-test-user`(이)라고 하는 [IAM 사용자를 생성합니다](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html#id_users_create_console). **권한 설정(Set permissions)** 섹션에서 **기존 정책 직접 연결(Attach existing policies directly)**을 선택한 후 **정책 생성(Create policy)**을 선택합니다. 다음 정책 정의를 입력합니다. *111122223333*을 [AWS 계정 ID](https://docs.aws.amazon.com/general/latest/gr/acct-identifiers.html#FindingYourAccountIdentifiers)로 바꿉니다. 이 정책은 `abac-test-user`이(가) `abac-project-role`을(를) 수임할 수 있게 허용합니다.

**Example — IAM 사용자가 ABAC 역할을 수임할 수 있게 허용**  

------
#### [ JSON ]

****  

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

------

## 7단계: 권한 테스트
<a name="abac-test"></a>

1. AWS 콘솔에 `abac-test-user`(으)로 로그인합니다. 자세한 정보는 [IAM 사용자로 로그인](https://docs.aws.amazon.com/IAM/latest/UserGuide/console.html#user-sign-in-page)을 참조하십시오.

1. `abac-project-role` 역할로 전환합니다. 자세한 내용은 [역할(콘솔) 전환](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-console.html)을 참조하십시오.

1. [Lambda 함수 생성](configuration-tags.md#using-tags-with-the-console):
   + **권한(Permissions)**에서 **기본 실행 역할 변경(Change default execution role)**을 선택하고 **실행 역할(Execution role)**을 선택한 후 **기존 역할 사용(Use an existing role)**을 선택합니다. [4단계: IAM 권한 부여](#abac-iam-permissions)에서 사용한 것과 동일한 실행 역할을 선택합니다.
   + **고급 설정(Advanced settings)**에서 **태그 사용(Enable tags)**를 선택한 다음 **새 태그 추가(Add new tag)**를 선택합니다. **키**에 `project`를 입력합니다. **값(Value)**을 입력하지 마십시오.

1. [함수를 테스트합니다](testing-functions.md).

1. 두 번째 Lambda 함수를 생성하고 다른 태그(예: `environment`)를 추가합니다. [1단계: 새 함수에 태그 필요](#require-tag-on-create)에서 만든 ABAC 정책은 위탁자가 `project` 태그를 사용하여 함수를 만들 수만 있도록 허용하기 때문에 이 작업이 실패합니다.

1. 태그 없이 세 번째 함수를 만듭니다. [1단계: 새 함수에 태그 필요](#require-tag-on-create)에서 만든 ABAC 정책은 위탁자가 태그 없이 함수를 만들 수만 있도록 허용하지 않기 때문에 이 작업이 실패합니다.

이 권한 부여 전략을 사용하면 각 새 사용자에 대해 새 정책을 만들지 않고도 액세스를 제어할 수 있습니다. 새 사용자에게 액세스 권한을 부여하려면 할당된 프로젝트에 해당하는 역할을 수임할 권한을 부여하기만 하면 됩니다.

## 8단계: 리소스 정리
<a name="abac-clean-up"></a>

**IAM 역할 삭제**

1. IAM 콘솔에서 [역할 페이지](https://console.aws.amazon.com/iam/home#/roles)를 엽니다.

1. [5단계](#abac-create-role)에서 생성한 역할을 선택합니다.

1. **삭제**를 선택합니다.

1. 삭제를 확인하려면 텍스트 입력 필드에 역할 이름을 입력합니다.

1. **삭제**를 선택합니다.

**IAM 사용자를 삭제하려면 다음을 수행하세요.**

1. IAM 콘솔의 [사용자 페이지](https://console.aws.amazon.com/iam/home#/users)를 엽니다.

1. [6단계](#abac-create-user)에서 생성한 IAM 사용자를 선택합니다.

1. **삭제**를 선택합니다.

1. 삭제를 확인하려면 텍스트 입력 필드에 사용자 이름을 입력합니다.

1. **Delete user(사용자 삭제)**를 선택합니다.

**Lambda 함수를 삭제하려면**

1. Lambda 콘솔의 [함수 페이지](https://console.aws.amazon.com/lambda/home#/functions)를 엽니다.

1. 생성한 함수를 선택합니다.

1. **작업**, **삭제**를 선택합니다.

1. 텍스트 입력 필드에 **confirm**를 입력하고 **Delete**(삭제)를 선택합니다.