AWS Sagemakerでセキュリティに強い機械学習環境を構築する ③

## はじめに
本連載の最終回として、特にセキュリティと運用上の信頼性に留意し、構成を再考、IAM設定を見直すことでセキュリティに強い機械学習環境の作成まで行います。


## ゴール
前回、最小権限の原則に触れました。

![16.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/5dc9f760-37f3-1ada-2c22-7492d374bba9.jpeg)

Notebook上の操作でうっかりローデータを消してしまっては大変なので、推論結果の保存先とローデータの保存先を分けます。それらに紐づける形で、Notebookインスタンス、IAMエンティティを作成します。

この際、セキュリティ担保のために最低限必要な項目である、MFA認証についてもポリシーで固めておきます。

このような条件を満たす環境の構築をゴールとします。


## 手順
### 1. IAMポリシー
- 管理者 Notebook
- 機械学習技術者 Notebook
- 管理者 グループ
- 機械学習技術者 グループ

これら4つの要素にアクセス権限を付与するため、
以下の3点を明示したポリシーを作成します。

- S3バケットに対するアクセス
- インスタンスに対するアクセス
- 各ユーザーのMFA認証必須

内容は下記の通り。

```js:管理者Notebook用ポリシー:
// for_notebook-for-administrator
{
    "Version": "2012-10-17",
    "Statement": {
        "Sid": "RawDataAccessAll",
        "Effect": "Allow",
        "Action": "*",
        "Resource": "arn:aws:s3:::sagemaker-rawdata/*"
    }
}
```


```js:機械学習技術者Notebook用ポリシー
// for_notebook-for-engineer
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "RawDataAccessGetList",
            "Effect": "Allow",
            "Action": [
                "s3:Get*",
                "s3:List*"
                ],
            "Resource": "arn:aws:s3:::sagemaker-rawdata/*"
        },
        {
            "Sid": "SageMakerResultAllAccess",
            "Effect": "Allow",
            "Action": "*",
            "Resource": "arn:aws:s3:::sagemaker-result/*"
        }
    ]
}
```


```js:管理者グループ用ポリシー
// for_SageMakerAdministrator_Group
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "MFA",
            "Effect": "Deny",
            "Action": "*",
            "Resource":"*",
            "Condition": {
                "Null": {"aws:MultiFactorAuthAge": true }
            }
        },
        {
            "Sid": "AdministratorAccess",
            "Effect": "Allow",
            "Action": "*",
            "Resource":"arn:aws:sagemaker:::notebook-instance/notebook-for-administrator/*"
        }
    ]
}
```


```js:機械学習技術者グループ用ポリシー
// for_SageMakerEngineer_Group
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "MFA",
            "Effect": "Deny",
            "Action": "*",
            "Resource":"*",
            "Condition": {
                "Null": { "aws:MultiFactorAuthAge": true }
            }
        },
        {
            "Sid": "EngineerAccess",
            "Effect": "Allow",
            "Action": "*",
            "Resource":"arn:aws:sagemaker:::notebook-instance/notebook-for-engineer/*"            
        }
    ]
}
```

### 2. IAMロール
先ほどのIAMポリシーをNotebookインスタンスに紐づけるためのIAMロールを作成します。

コンソールからIAMを選択。ロールを選択し、ロールの作成をクリック
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/abb582fa-d288-5e12-0583-6ea19c5f528c.png)
AWSサービスのS3を選択。ユースケースの選択でS3を選択、次のステップに進みます。
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/4895aad5-e7a9-bd0b-5a2b-047446dc1690.png)
先ほど作成したポリシーを選択し、
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/4741d235-66dd-f7a4-7bf2-6c3e61336f93.png)
タグの選択をクリック
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/7b38f9be-227b-ac02-42d2-49187d8ced65.png)
付与したポリシーが分かるように、ロールの名称をいれ、作成まで進みます。
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/47ce93cf-6473-8c57-1965-843e9e249ed0.png)


### 3. S3バケット
コンソールでS3を選択、バケットを作成するをクリック
![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/5486bf9d-3806-c60f-0a52-14136b1cf636.png)

バケット名を入力し、左下の作成をクリック
![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/db2e4482-7abe-b983-215b-f997b192d881.png)


### 4. Notebookインスタンス
コンソールからノートブックインスタンスを選択
![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/aedc0109-54e4-7af8-7cd4-e9df16d128e3.png)

新しいNotebookインスタンスを作成
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/5bda87f9-0b4e-7cb2-ddbf-dcde9b1b4c6b.png)

名称を入れ、先ほど作成したIAMロールのARNを入力します。
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/174733ac-fcb7-b569-631c-e383a47d88fa.png)

ARNはIAMロールのコンソールから確認できます。あとはチェックを飛ばし、作成してOK。
![2019-06-05_15h45_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/2dde2d37-b01d-803d-7234-e55317e24cf5.png)


### 5. IAMグループ/ユーザー
またまたIAMのコンソールで、グループを選び、新しいグループを作成。
![2019-06-05_15h49_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/942d8fe4-a9c7-8bd6-cda7-a019b289243d.png)

グループ名を入力。
![2019-06-05_15h50_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/5048cebe-7bd3-3b2b-8205-8cc54272b0b7.png)

作成したポリシーをアタッチ。そのまま進み、作成をクリック。
![2019-06-05_15h51_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/98b60136-38af-35d7-b02b-61b7fc61bf77.png)

ユーザーに移り、追加をクリック。
![2019-06-05_15h52_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/c323b68b-6d8e-82fe-8f41-6762cb630428.png)

これらの箇所にチェックを入れて
![2019-06-05_15h53_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/4b7f5dfb-2eb7-00b9-c952-633431427543.png)

グループに所属。そのまま進み作成をクリック。
![2019-06-05_15h53_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/7a46b2dc-9a97-c895-cb88-f5a1bbf95bf0.png)


## Trusted Advisor 再確認
Trusted Advisorを見てみましょう。確認できる範囲ではオールグリーンになってますね。
![2019-06-05_16h03_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/f8353ac7-731c-5031-099e-52d70fe866eb.png)



## まとめ
このように必要なセキュリティ要件や課題点からシステムを設計し、IAMロールで設定した後に各要素を追加していくと手戻りが少ないです(自戒)。さくっと環境構築をすまして、じっくり分析して、おもしろい結果を出しましょう。


## 参考リンク (AWSオフィシャル)
[Identity and Access Management](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_policies.html)
[バケットポリシーの例](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/example-bucket-policies.html)