OneLoginとSwitchロールでAWSにログインできるようにした

本記事は「[Opt Technologies Advent Calendar 2019](https://qiita.com/advent-calendar/2019/opt-technologies)」4日目の記事である。

# 1. 概要および制限事項

本記事では`AWSに対してOneLoginで認証する手順`については記載しない。  

OneLoginを利用してあるAWSアカウントにログインしたユーザがSwitch Roleで別のAWSアカウントに切り替えられる設定
およびOneLoginの認証情報をもとにSwitchRole可能なアカウントを制限する設定について記載する。
また`AWSコンソールの利用のみ対象`とし、IAMロールに紐づく一時アクセスキーの取得は対象外とする。

今回の手順では一部にAWS CLIを使用する。

```bash
$ aws --version
aws-cli/1.16.195 Python/2.7.16 Darwin/19.0.0 botocore/1.12.185
```

# 2. 手順内容

手順はおおよそ以下となる。

1. マスターアカウントにSAMLとIAMロールを設定
2. OneLoginにAWS用のコネクタを作成
3. メンバーアカウントにSwitchRoleのためのIAMロールを作成
4. ユーザにURLを共有

## 2-1. 構成

![SwitchRole.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262765/68f846b4-6b39-6c42-e31e-e21527c8d6bf.png)

上図のようにユーザはOneLoginでマスターアカウントにログインする。
各プロダクトが稼働するメンバーアカウントはSwitchRoleして利用することを考えた。  

## 2-2. OneLoginでマスターアカウントにログインする
[参考資料](#3-参考)をもとに設定をおこなう。

参考資料に加えて必要な手順として、今回の構成においてユーザにはメンバーアカウントへのSwitchRoleをさせるため
マスターアカウントに作成するIAMロールにはその権限を付与する。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "*"
        }
    ]
}
```

## 2-3. メンバーアカウントにSwitch Role用のIAMロールを作成

メンバーアカウントにてIAMロール作成する。以下はCloudFormationで作成するさいのサンプル。

```yaml:sample.yaml
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  MasterAccountId:
    Type: String
Resources:
  IAMRole:
    Type: 'AWS::IAM::Role'
    Properties:
      RoleName: 'PowerUserRole'
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Action: 'sts:AssumeRole'
            Effect: 'Allow'
            Principal:
              AWS: !Sub 'arn:aws:iam::${MasterAccountId}:root'
            Sid: ''
      ManagedPolicyArns:
      - 'arn:aws:iam::aws:policy/PowerUserAccess'
```

AssumeRolePolicyDocumentに`arn:aws:iam::(マスターアカウントのID):root`を設定することで、マスターアカウントからのSwitchRoleだけ許可する。

AWS CLIでは以下のようにデプロイする。
*注意：メンバーアカウントに対してデプロイするよう注意すること*

```bash
masterAccountId=hoge
productAccountProfile=huga

aws cloudformation deploy \
--template-file sample.yaml \
--stack-name switchrole-from-onelogin \
--parameter-overrides MasterAccountId=${masterAccountId} \
--capabilities CAPABILITY_NAMED_IAM \
--profile ${productAccountProfile}
```

## 2-4. 限られたユーザのSwitchRole

上記のIAMロールの設定ではマスターアカウントにログインしたユーザは全員SwitchRole可能となっている。
Administratorなど限られたユーザにのみSwitchRoleを許可したい場合、以下のように設定する。

```yaml:sample.yaml
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  MasterAccountId:
    Type: String
  MasterAccountRoleName:
    Type: String
Resources:
  IAMRole:
    Type: 'AWS::IAM::Role'
    Properties:
      RoleName: 'PowerUserRole'
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Action: 'sts:AssumeRole'
            Effect: Allow
            Principal:
              AWS:
                - !Sub 'arn:aws:sts::${MasterAccountId}:assumed-role/${MasterAccountRoleName}/erai@example.com'
                - !Sub 'arn:aws:sts::${MasterAccountId}:assumed-role/${MasterAccountRoleName}/kanrisha@example.com'
            Sid: ''
      ManagedPolicyArns:
      - 'arn:aws:iam::aws:policy/PowerUserAccess'
```
OneLogin経由でマスターアカウントにログインした状態では`<IAMロール名>/<メールアドレス>`で認証されているため
AssumeRolePolicyDocumentに`arn:aws:sts::(マスターアカウントID):assumed-role/(IAMロール)/(メールアドレス)`となる。

デプロイは[手順2-3](#2-3-メンバーアカウントにswitch-role用のiamロールを作成)と共通。

## 2-5. SwitchRole用のURLを共有

作成したIAMロールをAWSコンソールから確認すると、赤枠の`コンソールでロールを切り替えることができるユーザーに、このリンクを知らせます`が表示される。
![scsho.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262765/ded9d8ca-37ce-dbb7-e278-45a5412d603b.png)


このURLをユーザに共有する。  

ユーザがOneLogin経由でマスターアカウントにログインしている状態で上記リンクを踏むと以下の画面に遷移する。

![switchroleconfig.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262765/0ebdb83f-4b34-b719-ce41-9e0ed3dda1cd.png)


上記項目を設定するとSwitchRole設定が完了する。

# 3. 参考

OneLoginを利用してAWSにSAMLでログインする: Serverworks ENGINEER BLOG
http://blog.serverworks.co.jp/tech/2018/06/22/onelogin-aws-saml/