Okta登録内容のバックアップ
Oktaは標準でバックアップやエクスポートの機能がありません。OktaのHelp Centerにも問い合わせがいくつか上がっていますが、対応されていません。
User Data Backup
今後も作られない可能性は大きいのではないかと個人的には思っています。
サポートにはAPIで作成するように言われましたが、かなり時間が掛かりそうです。
そんな中TerrafromがOktaに対応していることを知りました。Terraformで初期から作っていればそれがバックアップとしても働きます。今から導入する組織はTerraformをお勧めします。ですが、既に導入済みで、ある程度使っている組織はTerraformにリバースするのは結構大変です。
さらに調べていくとTerraformerもOktaに対応しているということがわかり、これならバックアップに使えないかと考えました。余裕があればTerraform管理下にすることもできそうです。
実装
環境
- Ubuntu 22.0 (WSL)
- Terraform 0.13.0
- oktaプロバイダー 3.45.0
- Terraformer 0.8.24
- docker Engine 23.0.1
- dockerイメージ hashicorp/terraform 0.13.0
terraformerはterraform 0.13しかサポートしていません。その為、今(2023/11)のterraformの最新版よりはかなり古いバージョンになります。今の最新バージョンは以下になります。Oktaプロバイダーは最新バージョンだと動くには動きますが、エラーが出てしまうのでエラーが出ないようバージョンを下げています。
- terraform v1.6.4
- oktaプロバイダー 4.6.1
また、hashicorpからterraformのDockerイメージがリリースされているのでそれを使用します。
ディレクトリ構成
├── docker
│ ├── Dockerfile
│ ├── init.sh
│ └── provider.tf
├── docker-compose.yml
└── outputs
ソース
hashicorp社のTerraformのDockerイメージを使用します。Terraformerのインストールは公式のドキュメントの通りです。Oktaプロバイダーをインストールするため、provider.tfをコピーし、terraform init
を実行しています。
FROM hashicorp/terraform:0.13.0
USER root
RUN apk update --no-cache && \
apk add curl
ARG PROVIDER
RUN curl -LO "https://github.com/GoogleCloudPlatform/terraformer/releases/download/$(curl -s https://api.github.com/repos/GoogleCloudPlatform/terraformer/releases/latest | grep tag_name | cut -d '"' -f 4)/terraformer-${PROVIDER}-linux-amd64"
RUN chmod +x terraformer-${PROVIDER}-linux-amd64
RUN mv terraformer-${PROVIDER}-linux-amd64 /usr/local/bin/terraformer
WORKDIR /opt/terraformer
COPY ./init.sh .
RUN chmod +x ./init.sh
COPY ./provider.tf .
RUN terraform init
ENTRYPOINT [ "/bin/sh", "/opt/terraformer/init.sh" ]
OktaプロバイダーをインストールするためのHCLです。特に変わったことは書いていません。
terraform {
required_providers {
okta = {
source = "okta/okta"
version = "3.45.0"
}
}
}
インポートを行うシェルスクリプトです。これも特に変わったことは書いていません。
#!/bin/sh
cd /opt/terraformer
/usr/local/bin/terraformer import okta --path-output /tmp/outputs/ $1
commandに出力したいリソースを記述します。複数出力したい場合はカンマ区切り、全て出力したい場合はアスタリスクを指定できます。terraformerの出力ファイルは/tmp/outputs
に出力されるのでvolumes
に出力したいローカルパスを記述します。
version: "3"
services:
terraformer:
build:
context: ./docker
dockerfile: Dockerfile
args:
PROVIDER: "okta"
container_name: "okta-backup"
# ["--resources=okta_user"]
# ["--resources=okta_user,okta_app_saml"]
command: ["--resources=*"]
environment:
# 公式ドキュメントを参照(https://github.com/GoogleCloudPlatform/terraformer/blob/master/docs/okta.md)
OKTA_ORG_NAME: dev-99999999
OKTA_BASE_URL: okta.com
OKTA_API_TOKEN: 00di2-Me2hrqAuoNkpA7tyzoUKH5E7LDSAzaqPPCKg
volumes:
- ./outputs:/tmp/outputs
実行
プロジェクトのルートパスで実行します。
$ docker compose up
[+] Running 1/1
⠿ Container okta-backup Recreated 0.8s
Attaching to okta-backup
okta-backup | 2023/11/19 09:20:30 Attempting an import of ALL resources in okta
okta-backup | 2023/11/19 09:20:32 okta importing... okta_app_auto_login
...
okta-backup | 2023/11/19 09:23:58 okta save okta_policy_rule_password
okta-backup | 2023/11/19 09:23:58 okta save tfstate for okta_policy_rule_password
okta-backup exited with code 0
まとめ
これを定期実行すればバックアップとして使えそうではあります。ただTerraformとOktaプロバイダーのバージョンが古く、Terraformerもまだバージョン1になっていないのが実務で使うには少し懸念されます。バックアップがないよりはましくらいの考えでよいと思います。
追記
カタログのアプリはTerraformは対応していないようです。
また、バックアップ・リストアを行ってくれるSaaSで以下の2つが見つかりました。