Connect Okta to the 1Password SCIM bridge -Oktaから1Passwordへのユーザーアカウントプロビジョニングを実現する-

俺です。

組織運営をしていると、チーム単位などでパスワード情報を管理したいということがあるとおもいます。
そんな時はスプレッドシートに書いて共有設定仕掛けて安全だぜ。
という付箋紙にパスワードを書いてデスクに貼っておくレベルのITでしか仕事できない俺たちのために[1Password](https://1password.com/)というパスワードマネージャサービスがあります

パスワードマネージャを導入する上で面倒なのがユーザープロビジョニングです。
入退社、異動や休職、復職に合わせてアカウントを管理するのは重要です。
退職したけどパスワード閲覧できてます。ああ声に出して読みたい。を防ぐため、
この1PasswordではSCIMを用いたプロビジョニングが提供されています。
ユーザープロビジョニングがあると組織で1Passwordを活用しやすくなりますね。
ってことで今回は1Password SCIM Bridge Okta Integrationを実現した記録を残します。

ただし、1PasswordがSAML対応してないのでログインパスワードやMFAの設定は利用者自身で設定しなければならないのが悲しいところです。



# 前提

- 環境構築前に1Passwordは組織アカウントを開設済みです。
- 14日無償利用期間中に環境構築を実施しました。

# official document


- [Automate provisioning in 1Password Business using SCIM](https://support.1password.com/scim)
- [Connect Okta to the 1Password SCIM bridge](https://support.1password.com/scim-okta)

# infrastructure code

terraform(EC2), docker-compose, k8sのサンプルが提供されています。
特にterraformは非常に読みやすくかかれており、学習素材としても活かせると思います。
今回の環境構築にはterraform exampleを使いました。

- [example](https://github.com/1Password/scim-examples)


# SCIM Bridgeの構築準備

## 1Passwordにプロビジョニング専用のアカウントを登録する

- プロビジョニング専用アカウントを1Passwordに登録します。
- Oktaに登録されていないユーザー名(メーリングリストなど)を登録します。

プロビジョニングアカウントのパラメータ
- プロビジョニング用ユーザー: admin-1password@domain
- プロビジョニンググループを作成する: Provision Managers

## dockerのインストール

- scimsessionファイルの生成にdockerが必要です
- 環境構築する端末にdockerをインストールします

## op-cliのインストール

- [op-cli](https://support.1password.com/command-line-getting-started/)をインストールします

## プロビジョニングユーザーでのサインイン

```
$ op signin oretachinoteam admin-1password@<domain> <1Password Secret Keyを指定>
Enter the password for admin-1password@<domain> at oretachinoteam.1password.com:
export OP_SESSION_oretachinoteam="<セッション情報>"
# This command is meant to be used with your shell's eval function.
# Run 'eval $(op signin oretachinoteam)' to sign into your 1Password account.
# If you wish to use the session token itself, pass the --output=raw flag value.
```

```
$ export OP_SESSION_oretachinoteam="<セッション情報>"
$ op edit group "provisioning" --addpermissions=ProvisionPeople
```

## sessionファイル生成スクリプトの作成

SCIM BridgeのIntegrationに必要なsessionファイルを生成します

```
$ cat >> create-session-file.sh << EOF
#!/bin/bash

mkdir session

docker run -it -v $PWD/session:'/op-scim/session' 1password/scim /op-scim/create-session-docker.sh

cp ./session/scimsession ./scimsession
rm -rf ./session
EOF
```

## sessionファイルの生成

- scimsessionファイルを生成します
- scimsessionファイル生成時に出力されるbearer tokenはOkta Integration設定画面で入力が必要になるので記録しておきます
- infraをgitで管理している場合は、このファイルをgitに含めないようにします

```
$ bash create-session-file.sh
Enter your sign-in address (example.1password.com): oretachinoteam.1password.com
Enter the email address for your provisioning account on oretachinoteam: admin-1password@<domain>
Enter the Secret Key for admin-1password@<domain> on oretachinoteam: <Secret Key>
Enter the password for admin-1password@<domain> at oretachinoteam.1password.com:
[LOG] [0.6.3] 2018/10/10 14:10:18 (INFO) generating scimsession file for admin-1password@<domain> at https://oretachinoteam.1password.com
[LOG] [0.6.3] 2018/10/10 14:10:18 (INFO) scimsession file was written to the current directory

[LOG] [0.6.3] 2018/10/10 14:10:18 (INFO) bearer token: <ベアラートークンが表示される> ( これは記録しておこと)
```

## SecretManagerへのアップロード

- Bridge用EC2はAutoScaling GroupからLaunchされます
- user-data内でSecretManagerからscimsessionファイルを取得する処理が実行されます
- そのためscimsessionファイルを予めSecretManagerへアップロードしておく必要があります

```
$ export AWS_PROFILE=scim
$ export AWS_DEFAULT_REGION=ap-northeast-1
$ aws secretsmanager create-secret --name oretachinoteam-op-scim/scimsession-20181010 --secret-binary file:///<path>/<to>/scimsession
{
    "ARN": "XXXXXXXXXXXXXXXXXXXXXXXX",
    "Name": "XXXXXXXXXXXXXXXXXXXXXXXX",
    "VersionId": "XXXXXXXXXXXXXXXXXXXXXXXX"
}
```

## SCIM Bridge用SSL証明書の作成

- terraformでALBにSSL証明書をプロビジョニングします
- 予めACMでSSL証明書を作成しておきます
- SSL証明書のドメイン名はSCIM Bridgeを構成するエンドポイント名にします(例えばscim.example.com)

## terraformのtfファイルを修正する


- [example_env](https://github.com/1Password/scim-examples/tree/master/aws-terraform/terraform/deploy/example_env)をリネームまたはコピーします
- [variables.tf](https://github.com/1Password/scim-examples/blob/master/aws-terraform/terraform/deploy/example_env/variables.tf)の `// CHANGE_IT` 行を自AWSアカウントの設定にあわせて修正します
- [provider.tf](https://github.com/1Password/scim-examples/blob/master/aws-terraform/terraform/deploy/example_env/providers.tf)を自環境に合わせて適切なS3 Backend設定に修正します

## SCIM Bridge環境構築

applyが通れば無事環境構築完了です。やったね

```
$ export AWS_PROFILE=scim
$ export AWS_DEFAULT_REGION=ap-northeast-1
$ terraform init
$ terraform plan
$ terraform apply -auto-approve
```

# Okta 1Password Integration設定

Okta Application管理画面から1Password Integration設定を行います.

## API Integration

ドキュメントの例では https://scim.example.com のような表記になってますが
正しくはパス`https://scim.example.com/scim`を指定する必要があります。
`/scim`を指定しないとTestが通りません。
クソハマったけどすぐ教えてくれた1Password Support愛してる

※Supportから丁寧な回答を頂いた。eigoがyomenai俺でも理解できて最高

```
Thank you for reaching out! I will try to help you getting your SCIM bridge set up and running.

Could you please try using following Base URL within Okta:

https://XXXXXX/scim

Please let me know if that worked for you.
```

- integration設定

![image.png](https://qiita-image-store.s3.amazonaws.com/0/42755/55ce1b7e-239f-3a97-059f-5eacda8d75f1.png)

## Provisioning Setting(To App)

- EditをクリックしてCreate Users, Update User Attributes, Deactive UsersをEnableにします

![image.png](https://qiita-image-store.s3.amazonaws.com/0/42755/aa0ffa2f-9f03-96cb-bc51-291035e2a20a.png)

後は同期を開始してOkta上のユーザーが1Passwordへ同期されたらOKです。
メンバーへメールが送信されています。
メンバーの初回ログイン完了には管理者による承認が必要です。

1PasswordがSAML未対応なのでSSOできないのが超絶辛いところですが、アカウントの制御はできるようになりました。やったね

おわり