ゼロから使いこなす IAM(InterSystems API Manager)

この記事には、IAM の基本概念を学習するための、教材、例、演習が含まれます。
すべてのリソースはこちらの git から入手できます: https://github.com/grongierisc/iam-training
ソリューションは training ブランチにあります。
この記事では、次の点について説明します。
- 1. 入門
- 2. インストール
- 3. その 1: サービス/ルート
- 4. その 2: プラグインの使用
- 5. その 3: 独自認証の追加
- 6. 演習: レート制限
- 7. 開発者ポータル
- 8. 開発者ポータル(その 2): 認証
- 9. 安全な管理ポータル
- 10. プラグイン
- 11. CI/CD
1. 入門

1.1. IAM とは?
IAM は、InterSystems API Manager の略で、Kong Enterprise Edition が土台となっています。
このため、Kong Open Source エディションの他に、次の機能にアクセスすることができます。
- 管理者ポータル
- 開発者ポータル
- 高度プラグイン
- Oauth2
- キャッシング
- ...

1.2. API 管理とは?
API 管理は、Web アプリケーションプログラミングインターフェース(API)の作成と公開、その使用ポリシーの適用、アクセスの制御、サブスクライバーコミュニティの育成、使用統計の収集と分析、およびパフォーマンスのレポート作成を行うプロセスです。 API 管理コンポーネントは、開発者とサブスクライバーのコミュニティをサポートする仕組みとツールをもたらします。

1.3. IAM ポータル
Kong と IAM は第一に API として設計されています。つまり、Kong/IAM で行われることすべては Rest 呼び出しまたは管理者ポータルで行えるということです。
この記事の中では、すべての例や演習は次のようにして提示されています。
| IAM ポータル | Rest API |
|---|---|
![]() |
![]() |
1.4. このトレーニングの流れ
この記事では、IAM を IRIS Rest API のプロキシとして使用することを狙いとしています。
この Rest API の定義は、次の場所にあります。
http://localhost:52773/swagger-ui/index.html#/
または次の場所にあります。
https://github.com/grongierisc/iam-training/blob/training/misc/spec.yml
この記事は main ブランチから始めてください。
記事の最後に到達すると、training ブランチと同じ結果が得られるはずです。
2. インストール

2.1. インストールには何が必要?
- Git
- Docker(Windows をお使いの方は、Docker インストールで「Linux コンテナ」が使用されるように設定してください)。
- Docker Compose
- Visual Studio Code と InterSystems ObjectScript VSCode 拡張機能
- InterSystems IRIS IAM 対応のライセンスファイル
- IAM Docker イメージ
2.2. IAM と IRIS の連携の仕組み
Kong/IAM の起動時に、コンテナは curl 呼び出しによって、Kong/IAM のライセンスをチェックします。
この呼び出しのエンドポイントは、IRIS コンテナの Rest API です。
参考: Kong ライセンスは IRIS のライセンスに組み込まれています。

2.3. セットアップ
Git clone によって、次のリポジトリのクローンを作成します。
git clone https://github.com/grongierisc/iam-training
次のようにして、最初の Rest API を実行します。
docker-compose up
テストを行います。
http://localhost:52773/swagger-ui/index.html#/
ログイン/パスワード: SuperUser/SYS
2.4. IAM のインストール
2.4.1. Iris イメージ
まず、Community エディションをライセンスエディションに切り替える必要があります。
これを行うには、InterSystems Container Registry へのアクセスをセットアップして、アクセス制限付きの IRIS イメージをダウンロードする必要があります。
開発者コミュニティの「InterSystems Container Registry のご紹介」をご覧ください。
- WRC ログイン情報を使って https://containers.intersystems.com/ にログインし、トークンを取得します。
- コンピュータに Docker ログインをセットアップします。
docker login -u="user" -p="token" containers.intersystems.com
- InterSystems IRIS イメージを取得します。
docker pull containers.intersystems.com/intersystems/irishealth:2020.4.0.524.0
2.4.2. IAM イメージ
WRC Software Distribution を使用します。
- コンポーネント > ダウンロードに移動して IAM-1.5.0.9-4.tar.gz ファイルをダウンロードし、解凍(unzip & untar)してイメージを読み込みます。
docker load -i iam_image.tar
2.4.3. Docker ファイルを更新する
IRIS Community エディションをライセンスエディションに変更します。
- containers.intersystems.com/intersystems/irishealth:2020.4.0.524.0
- key フォルダにある iris.key を追加します。
dockerfile を編集して、その上に次の部分を追加します。
ARG IMAGE=containers.intersystems.com/intersystems/irishealth:2020.4.0.524.0
# 第 1 ステージ
FROM $IMAGE as iris-iam
COPY key/iris.key /usr/irissys/mgr/iris.key
COPY iris-iam.script /tmp/iris-iam.script
RUN iris start IRIS \
&& iris session IRIS < /tmp/iris-iam.script \
&& iris stop IRIS quietly
# 第 2 ステージ
FROM iris-iam
この部分では、マルチステージの dockerfile を作成します。
- 第 1 ステージでは、IRIS が IAM ライセンスを提供できるようにします。
- 第 2 ステージは、REST API ビルド用です。
新しい IRIS イメージを構築して IAM エンドポイントとユーザーを有効にする新しい iris-iam.script ファイルを作成します。
zn "%SYS"
write "Create web application ...",!
set webName = "/api/iam"
set webProperties("Enabled") = 1
set status = ##class(Security.Applications).Modify(webName, .webProperties)
write:'status $system.Status.DisplayError(status)
write "Web application "_webName_" was updated!",!
set userProperties("Enabled") = 1
set userName = "IAM"
Do ##class(Security.Users).Modify(userName,.userProperties)
write "User "_userName_" was updated!",!
halt
2.4.4. docker-compose を更新する
docker-compose ファイルを次のように更新します。
- db
- IAM の postgres データベース
- iam-migration
- データベースのブートストラップ
- iam
- 実際の IAM インスタンス
- 永続データ用のボリューム
次の部分を docker-compose ファイルの最後に追加します。
iam-migrations:
image: intersystems/iam:1.5.0.9-4
command: kong migrations bootstrap up
depends_on:
- db
environment:
KONG_DATABASE: postgres
KONG_PG_DATABASE: ${KONG_PG_DATABASE:-iam}
KONG_PG_HOST: db
KONG_PG_PASSWORD: ${KONG_PG_PASSWORD:-iam}
KONG_PG_USER: ${KONG_PG_USER:-iam}
KONG_CASSANDRA_CONTACT_POINTS: db
KONG_PLUGINS: bundled,jwt-crafter
ISC_IRIS_URL: IAM:${IRIS_PASSWORD}@iris:52773/api/iam/license
restart: on-failure
links:
- db:db
iam:
image: intersystems/iam:1.5.0.9-4
depends_on:
- db
environment:
KONG_ADMIN_ACCESS_LOG: /dev/stdout
KONG_ADMIN_ERROR_LOG: /dev/stderr
KONG_ADMIN_LISTEN: '0.0.0.0:8001'
KONG_ANONYMOUS_REPORTS: 'off'
KONG_CASSANDRA_CONTACT_POINTS: db
KONG_DATABASE: postgres
KONG_PG_DATABASE: ${KONG_PG_DATABASE:-iam}
KONG_PG_HOST: db
KONG_PG_PASSWORD: ${KONG_PG_PASSWORD:-iam}
KONG_PG_USER: ${KONG_PG_USER:-iam}
KONG_PROXY_ACCESS_LOG: /dev/stdout
KONG_PROXY_ERROR_LOG: /dev/stderr
KONG_PORTAL: 'on'
KONG_PORTAL_GUI_PROTOCOL: http
KONG_PORTAL_GUI_HOST: '127.0.0.1:8003'
KONG_ADMIN_GUI_URL: http://localhost:8002
KONG_PLUGINS: bundled
ISC_IRIS_URL: IAM:${IRIS_PASSWORD}@iris:52773/api/iam/license
volumes:
- ./iam:/iam
links:
- db:db
ports:
- target: 8000
published: 8000
protocol: tcp
- target: 8001
published: 8001
protocol: tcp
- target: 8002
published: 8002
protocol: tcp
- target: 8003
published: 8003
protocol: tcp
- target: 8004
published: 8004
protocol: tcp
- target: 8443
published: 8443
protocol: tcp
- target: 8444
published: 8444
protocol: tcp
- target: 8445
published: 8445
protocol: tcp
restart: on-failure
db:
image: postgres:9.6
environment:
POSTGRES_DB: ${KONG_PG_DATABASE:-iam}
POSTGRES_PASSWORD: ${KONG_PG_PASSWORD:-iam}
POSTGRES_USER: ${KONG_PG_USER:-iam}
volumes:
- 'pgdata:/var/lib/postgresql/data'
healthcheck:
test: ["CMD", "pg_isready", "-U", "${KONG_PG_USER:-iam}"]
interval: 30s
timeout: 30s
retries: 3
restart: on-failure
stdin_open: true
tty: true
volumes:
pgdata:
ルートフォルダに .env ファイルを追加します。
IRIS_PASSWORD=SYS
ちなみに、Kong ポートの定義は次のようになっています。
| ポート | プロトコル | 説明 |
|---|---|---|
| :8000 | HTTP | コンシューマからの HTTP 着信トラフィックを取り、上流のサービスに転送します。 |
| :8443 | HTTPS | コンシューマからの HTTPS 着信トラフィックを取り、上流のサービスに転送します。 |
| :8001 | HTTP | 管理 API。 HTTP によるコマンドラインからの呼び出しをリスンします。 |
| :8444 | HTTPS | 管理 API。 HTTPS によるコマンドラインからの呼び出しをリスンします。 |
| :8002 | HTTP | Kong Manager(GUI)。 HTTP トラフィックをリスンします。 |
| :8445 | HTTPS | Kong Manager(GUI)。 HTTPS トラフィックをリスンします。 |
| :8003 | HTTP | 開発者ポータル。 開発者ポータルが有効になっていることを前提に、HTTP トラフィックをリスンします。 |
| :8446 | HTTPS | 開発者ポータル。 開発者ポータルが有効になっていることを前提に、HTTPS トラフィックをリスンします。 |
| :8004 | HTTP | HTTP による開発者ポータルの /files トラフィック。開発者ポータルが有効になっていることが前提です。 |
| :8447 | HTTPS | HTTPS による開発者ポータルの /files トラフィック。開発者ポータルが有効になっていることが前提です。 |
2.4.5. オプション: .env として IRIS_PASSWORD を追加する
使いやすいよう(またセキュリティの理由により)、IRIS dockerfile の .env ファイルを使用できます。
使用するには、docker-compose の iris サービスの部分を次のように編集します。
build:
context: .
dockerfile: dockerfile
args:
- IRIS_PASSWORD=${IRIS_PASSWORD}
そして、dockerfile を編集します(ビルドの第 2 または第 1 ステージ)。
ARG IRIS_PASSWORD
RUN echo "${IRIS_PASSWORD}" > /tmp/password.txt && /usr/irissys/dev/Container/changePassword.sh /tmp/password.txt
2.4.6. テスト
docker-compose -f "docker-compose.yml" up -d --build
3. その 1: サービス/ルート

Kong/IAM の連携の仕組みを覚えていますか?

ここでは、次の項目を構築します。
- サービス
- crud API 用
- ルート
- このサービスにアクセスするためのルート
3.1. サービスを作成する
| IAM ポータル | Rest API | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|










































