1. はじめに
APIやibmcloud CLIを利用する際には、まず最初に認証を行う必要があります。IBM Cloudでは今まで、大きく分けてID/Password方式とAPI Keyによる認証方式を提供していました。これらの方法は一般的な方法ですが、一方で
- どのようにパスワードやAPI Keyをローテーションさせるか?(パスワードやAPI Keyの数だけ、定期的な変更およびパスワードファイルやAPI Keyファイルへの反映が必要になり、そのための手段を検討する必要がある)
- どうやって保護するか?(パスワードやAPI Keyをファイルに保管する場合は、運用スクリプトなどから読み出せるように適切な権限設定が必要)
- どうやって流出時の影響を避けるか?(パスワードやAPI Key情報が万が一流出したら、任意の環境からアクセス可能になってしまうため、それを防ぐ仕組みが必要)
といった事項を別途考慮する必要があります。こうした従来の方法は、パスワードやAPI Keyを利用者で保管・管理しなければいけないために避けれない問題です。
IBM Cloudでは新たにTrusted Profileを使った認証が可能になりました。Trusted Profileを使えば、例えばVPC上の特定のサーバーに特定のサーバーからのみパスワードやAPI KeyなしでIAM Tokenを取得し、APIやCLIを実行可能になります。VPC以外でも、IBM Kubernetes ServiceやRed Hat OpenShift on IBM Cloudの特定のService AccountからもTrusted Profile経由でAPI KeyなしにIBM CloudのIAM Tokenなどが取得可能になります。本稿ではVSI for VPCを利用した構成手順とテストを紹介します。
https://cloud.ibm.com/docs/cli?topic=cli-vsi-cri-login&locale=en
https://www.ibm.com/cloud/blog/introducing-trusted-profiles-for-vpc-virtual-server-instances
2. 設定方法
2-1. Trusted Profileの作成
- Manage -> Access(IAM)を選択。Createを押下。
- 作成するTrusted Profileの名前や記述を記入
- あとで設定するため、ここでは
Decide later
を選択。
- このTrusted Profileを利用した際に割り当てる権限を選択。
以下のようにリソースグループ単位やサブネット単位などより広範囲のリソースに許可を与えることも可能ですが、Trusted Profileが利用可能なリソースは最小限に絞ることが望ましいでしょう。
2-2. VSIを新規に注文してデフォルトのTrusted Profileを設定する場合
- VSI注文時のオプションでメタデータサービスを有効化する。また、
select a trusted profile
から、今回作成したTrusted Profileを選択する。この設定をすることで、このVSIにとってのデフォルトのTrusted Profileが構成される。
- プロビジョニング後、メタデータサービスとDefault Trusted Profileが構成されていることを確認。
- VSIの作成が完了すると、以下のようにこのTrusted Profileへの利用が可能なCompute resourcesが追加されており、このサーバーからTrusted Profileにアクセスできるように構成されていることを確認できる。
VSI注文時にしかDefault Trusted Profileは構成できませんし、後から変更することもできません。
Default Trusted Profileが構成されていれば、APIやCLI呼び出しのタイミングでTrusted Profileを指定しなくても、このデフォルトのTrusted Profileが利用されます。
Default Trusted Profileが構成されていない場合は、必ずAPIやCLI呼び出しのタイミングでTrusted Profileを指定する必要があります。
2-3. 注文時にTrusted Profileを指定していないVSIに対して構成する場合
なお、サーバーによっては以下のようにリンクローカルアドレスが設定されて、メタデータサービスのアドレスである169.254.169.254に繋がらない(ホストへの経路がありません
というエラーになる)場合がある。この場合は、/etc/sysconfig/network
でNOZEROCONF=yes
を構成することでリンクローカルアドレスを削除すると良い。参考
$ ip r
default via 10.0.0.1 dev eth0
10.0.0.0/24 dev eth0 proto kernel scope link src 10.0.0.4
169.254.0.0/16 dev eth0 scope link metric 1002
$ ip r
default via 10.0.0.1 dev eth0
10.0.0.0/24 dev eth0 proto kernel scope link src 10.0.0.4
先述の通り、後からDefault Trusted Profileは構成できません。この方法でTrusted Profileの設定をしたVSIからは、APIやCLI呼び出しのタイミングでTrusted Profileを指定する必要があります。
3. 実行方法(API)
以下では、IAM Tokenを取得するためにPublic Networkを経由していないことに注意。
https://cloud.ibm.com/apidocs/vpc-metadata
3-1. Instance Identity Tokenを取得
$ instance_identity_token=`curl -sX PUT "http://169.254.169.254/instance_identity/v1/token?version=2022-03-31" -H "Metadata-Flavor: ibm" -d '{ "expires_in": 600}' | jq -r '(.access_token)'`
3-2. IAM Tokenを取得
$ iam_token=`curl -sX POST "http://169.254.169.254/instance_identity/v1/iam_token?version=2022-03-31" -H "Authorization: Bearer ${instance_identity_token}" | jq -r '(.access_token)'`
$ iam_token=`curl -sX POST "http://169.254.169.254/instance_identity/v1/iam_token?version=2022-03-31" -H "Authorization: Bearer ${instance_identity_token}" -d '{"trusted_profile": {"id": "Profile-c7737399-ea96-4878-acf0-5a2690fd3493"}}'| jq -r '(.access_token)'`
3-3. IAM Tokenを使って任意のAPIを呼び出す。
例えば、以下は東京リージョンにおけるVSI一覧の取得するAPI。東京リージョンのVPC用Endpointは以下から参照可能
https://cloud.ibm.com/docs/vpc?topic=vpc-service-endpoints-for-vpc
$ curl -sX GET "https://jp-tok.private.iaas.cloud.ibm.com/v1/instances?version=2022-03-31&generation=2" -H "Authorization: Bearer ${iam_token}"| jq
4. 実行方法(CLI)
4-1. Trusted Profileを指定して、Public経由でログインする場合
$ ibmcloud login -a cloud.ibm.com --vpc-cri --profile Profile-c7737399-ea96-4878-acf0-5a2690fd3493 -r jp-tok
API endpoint: https://cloud.ibm.com
Authenticating...
OK
Targeted profile syasuda-trusted-profile (Profile-c7737399-ea96-4878-acf0-5a2690fd3493)
Targeted region jp-tok
API endpoint: https://cloud.ibm.com
Region: jp-tok
Compute Resource: crn:v1:bluemix:public:is:jp-tok-1:a/039dbe6794084c7cb514a276dd2345da::instance:02e7_fe6b34c2-7609-47b6-8f62-b7aa0207ec8b
Profile: syasuda-trusted-profile (Profile-c7737399-ea96-4878-acf0-5a2690fd3493)
xxx (xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)
Resource group: No resource group targeted, use 'ibmcloud target -g RESOURCE_GROUP'
CF API endpoint:
Org:
Space:
4-2. Trusted Profileを指定して、Private経由でログインする場合(CSEを利用)
us-south(Dallas)やus-east(WDC)でのみ利用可能です。Tokyo/Osakaリージョンでは使えません。
CLIがバグっているのか、CSE経由でアクセスすると、ICOSのprivate endpoint(Classic InfrastructureのService Network)にアクセスして更新チェックをしようとしてしまいます。そのため、バージョンチェック機能は無効にした方が良いでしょう。もしバージョンの更新をしたいときは、その時だけ以下のコマンドを実行することでICOSへのアクセスをDirect接続にすることで更新可能です。
$ ibmcloud api private.cloud.ibm.com --vpc && ibmcloud update
$ export IBMCLOUD_VERSION_CHECK=false
$ ibmcloud login -a private.cloud.ibm.com --vpc-cri --profile Profile-c7737399-ea96-4878-acf0-5a2690fd3493 -r us-south
API endpoint: https://private.cloud.ibm.com
Targeted region us-south
Authenticating...
OK
Targeted profile syasuda-trusted-profile (Profile-c7737399-ea96-4878-acf0-5a2690fd3493)
API endpoint: https://private.cloud.ibm.com
Region: us-south
Compute Resource: crn:v1:bluemix:public:is:jp-tok-1:a/039dbe6794084c7cb514a276dd2345da::instance:02e7_c6ecde2d-0dba-4fdb-ba5b-07aec7fd0bb5
Profile: syasuda-trusted-profile (Profile-c7737399-ea96-4878-acf0-5a2690fd3493)
Account: IBM (039dbe6794084c7cb514a276dd2345da)
Resource group: No resource group targeted, use 'ibmcloud target -g RESOURCE_GROUP'
CF API endpoint:
Org:
Space:
4-3. Trusted Profileを指定して、Private経由でログインする場合(VPEを利用)
- VPEを利用する時には、ibmcloud login時に
--vpc
オプションを利用します。
$ ibmcloud login -a private.cloud.ibm.com --vpc-cri --profile Profile-c7737399-ea96-4878-acf0-5a2690fd3493 --vpc -r us-south
- VPEで以下を有効にする必要があります。https://cloud.ibm.com/docs/cli?topic=cli-service-connection#cli-private-vpc
- Account Management
- Global Catalog
- Global Search
- Global Tagging
- Usage Metering
- Enterprise Management
- Resource Controller
- User Management
上記のVPEが利用可能なのは、us-south(Dallas)やus-east(WDC)のみであり、なおかつVPEには現時点でTransit Gateway経由でアクセスできないため、やはり東京リージョンや大阪リージョンからは利用できません。