

# タグによる関数の保護
<a name="attribute-based-access-control-example"></a>

次の手順は、ABAC を使用して関数のアクセス許可を設定する方法の一例です。この例のシナリオでは、IAM アクセス許可ポリシーを 4 つ作成しています。その後、これらのポリシーを新しい 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) 条件キーを使用して 2 番目の 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 ロールのリスト作成を許可するポリシーを作成します。これによりプリンシパルは、すべての Lambda 関数と IAM ロールをコンソールに表示でき、API アクション呼び出時に認識できるようになります。

**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 に置き換えます。

**注記**  
`iam:PassRole` アクションでポリシーの `ResourceTag` 条件キーを使用しないでください。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 アカウント]**、**[このアカウント]** の順に選択します。
+ **[Step 2: Add permissions]** (ステップ 2: アクセス許可を追加する) で、前のステップで作成した 4 つの IAM ポリシーをアタッチします。
+ **[Step 3: Name, review, and create]** (ステップ 3: 名前、確認、および作成) で、**[Add tag]** (タグを追加) を選択します。**[Key]** (キー) に「`project`」と入力します。ここでは、**値**は入力しません。

## ステップ 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-project-role` を引き受けることを `abac-test-user` に対し許可します。

**Example – ABAC ロールを引き受けることを、IAM ユーザーに対し許可する**  

------
#### [ 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]** (新しいタグを追加) を選択します。**[Key]** (キー) に「`project`」と入力します。ここでは、**値**は入力しません。

1. [関数をテストします](testing-functions.md)。

1. 2 つ目の Lambda 関数を作成し、異なるタグ (例: `environment`) を追加します。通常、この操作は失敗します。[ステップ 1: 新しい関数のタグを要求する](#require-tag-on-create) で作成した ABAC ポリシーでは、`project` タグが付いた関数を作成することのみをプリンシパルに許可しているためです。

1. タグを付けずに 3 つ目の関数を作成します。通常、この操作も失敗します。[ステップ 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. [**ユーザーの削除**] を選択します。

**Lambda 関数を削除するには**

1. Lambda コンソールの [[関数]](https://console.aws.amazon.com/lambda/home#/functions) ページを開きます。

1. 作成した関数を選択します。

1. **[アクション]** で、**[削除]** を選択します。

1. テキスト入力フィールドに **confirm** と入力し、**[Delete]** (削除) を選択します。