本記事は、ConoHa Advent Calendar 2025 16日目の記事です。
はじめに
今年もやってきました、ConoHa Advent Calendarの季節です。
(てきとーに16日とってしまったのですが、去年は私15日にやってましたね、確認すればよかった...)
皆さんは美雲このは公式YouTubeチャンネルのメンバーシップには加入しましたか?私は即加入しました。
メンバーシップ特典の壁紙が最高すぎます。本当にありがとうございます。
今年もConoHaを使ってみようのコーナーです。
ConoHaは日々進化しているのですが、その中でも個人的に割とうれしい機能であるConoHa APIのサブユーザ・ロール機能を使ってみます。
(リリースノート とか見てみるといろいろ進化してるのを感じます)
概要
ConoHaのAPIは今まで単一ユーザが全権限を持っている状態でしか利用できませんでした。
そのため、APIで特定の操作を自動化したい場合でも全権限を与えている状態であり、個人的に少し運用が怖いという印象がありました。
しかし、このロール機能の実装によって特定の権限を与えることができるようになりそんな不安からもおさらばすることができます!
....といろいろ書きましたがロール機能、そのまんまの意味です。
以前からあったかがわからないのでアレですが、サブユーザの機能も追加されました。
ここで注意点!
ロール関連およびオブジェクトストレージとDNSのAPIはサブユーザでは利用できません。
よく見るとドキュメントに記載があります。
また、本末転倒ではありますがConoHaはドキュメントが充実していて、めちゃわかりやすいのでドキュメント見たほうがいいかもしれません()
今回やることとほぼ同じことが書かれているドキュメントのリンクを置いておきます。
使ってみる
では、実際に使ってみます。
API利用の事前準備
まずはAPIを利用するための事前準備を行います。
(画像は加工しているものですので実際の表示とは異なります。)
APIを利用するために必要な情報を取得します。
まずは、ConoHaのコントロールパネルにアクセスし、APIタブに移動します。
管理画面のAPIに必要な情報があります。
APIユーザー欄にある「ユーザーID」と「パスワード」が必要です。
また、テナント情報欄にある「テナントID」も必要です。
確か統一されているはずですが、念のためエンドポイントURLも入手しておきましょう。
一番上の「Identity Service」のURLを入手しておきます。
これでAPIを利用するための事前準備は完了です。
認証トークンを生成する
では、実際にAPIを利用してみます。
今回はcurlを用いてAPIを利用してみます。
まずは、認証トークンを生成します。
認証トークンを生成するには、以下のようなリクエストを送信します。
curl -i -X POST \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{"auth": {"identity": {"methods": ["password"],"password": {"user": {"id": "APIユーザーID","password": "パスワード"}}},"scope": {"project": {"id": "テナントID"}}}}' \
https://identity.c3j1.conoha.io/v3/auth/tokens
APIユーザーID、パスワード、テナントIDを先ほどコピーしたものに置き換えます。
このリクエストを送信すると、レスポンスヘッダーに認証トークンが含まれています。
レスポンスヘッダーの「x-subject-token」フィールドに認証トークンが含まれています。
この認証トークンは後で使用するので、控えておきます。
サブユーザの一覧を取得する
次に、サブユーザの一覧を取得してみます。
まだ作成していないので誰もいないはずです。
以下のコマンドを用います。
curl -X GET \
-H "Accept: application/json" \
-H "X-Auth-Token: トークン" \
https://identity.c3j1.conoha.io/v3/sub-users
トークンは先ほど取得した認証トークンに置き換えてください。
リクエストを送ると...
{"users":[]}
と、空の配列が返ってきます。よかった、サブユーザはいませんでした。
ロールの一覧を取得する
それではさっそくサブユーザの作成...と行きたいところですが、先にロールの一覧を取得してみます。
以下のコマンドを用います。
curl -X GET \
-H "Accept: application/json" \
-H "X-Auth-Token: トークン" \
https://identity.c3j1.conoha.io/v3/sub-users/roles
トークンは先ほど取得した認証トークンに置き換えてください。
リクエストを送ると...
{
"roles": [
{
"id": "*************",
"name": "gmo-loadbalancer",
"visibility": "public"
},
{
"id": "*************",
"name": "gmo-compute",
"visibility": "public"
},
{
"id": "*************",
"name": "gmo-identity",
"visibility": "public"
},
{
"id": "*************",
"name": "gmo-image",
"visibility": "public"
},
{
"id": "*************",
"name": "gmo-network",
"visibility": "public"
},
{
"id": "*************",
"name": "gmo-volume",
"visibility": "public"
}
]
}
と、ロールの一覧が返ってきます。(一部を加工しています。)
今表示されているのはデフォルトで用意されているロールです。
わざわざロールを作らなくてもいいようにデフォルトでいくつかのロールを用意してくれているというわけです。ありがたい。
デフォルトロールの説明は省きます。詳しくはドキュメントを参照してください。
パーミッションの一覧を取得
今回は、あえてロールの作成もしてみます。
そこで、ロールの作成に必要な情報としてパーミッションがあります。
そのため、パーミッションの一覧を取得してみます。
以下のコマンドを用います。
curl -X GET \
-H "Accept: application/json" \
-H "X-Auth-Token: トークン" \
https://identity.c3j1.conoha.io/v3/permissions
トークンは先ほど取得した認証トークンに置き換えてください。
リクエストを送ると...
{
"permissions": [
{
"name": "post-token",
"description": "\u30c8\u30fc\u30af\u30f3\u767a\u884c"
},
{
"name": "post-server-remote-console",
"description": "\u30b3\u30f3\u30bd\u30fc\u30ebURL\u767a\u884c"
},
{
"name": "get-server-list",
"description": "\u30b5\u30fc\u30d0\u30fc\u4e00\u89a7\u53d6\u5f97"
},
{
"name": "get-server",
"description": "\u30b5\u30fc\u30d0\u30fc\u8a73\u7d30\u53d6\u5f97"
}
]
}
と、パーミッションの一覧が返ってきます。(一部を加工しています。)
ほんとはもっとあります。今回は使うものだけ持ってきました。
今回使うパーミッションは次の4つです。
- post-token (トークン発行)
- post-server-remote-console (コンソールURL発行)
- get-server-list (サーバー一覧取得)
- get-server (サーバー詳細取得)
詳しいことはドキュメントを参照してください。
ロールを作成する
では、実際にロールを作成してみます。
以下のコマンドを用います。
curl -X POST \
-H "Accept: application/json" \
-H "X-Auth-Token: トークン" \
-d '{"role": {"name": "ロール名","permissions": ["パーミッション名","パーミッション名"]}}' \
https://identity.c3j1.conoha.io/v3/sub-users/roles
ロール名はロールにつけたい名前を、パーミッション名は先ほど取得した名前に、トークンは先ほど取得した認証トークンに置き換えてください。
例えば今回は上の4つのパーミッションを与えたいので次のようなコマンドになります。
curl -X POST \
-H "Accept: application/json" \
-H "X-Auth-Token: トークン" \
-d '{"role": {"name": "For_Qiita","permissions": ["post-token","post-server-remote-console","get-server-list","get-server"]}}' \
https://identity.c3j1.conoha.io/v3/sub-users/roles
リクエストを送ると...
{
"role": {
"id": "*************",
"name": "For_Qiita",
"visibility": "private",
"permissions": [
"get-server",
"get-server-list",
"post-server-remote-console",
"post-token"
]
}
}
このような感じでロールの詳細が返ってきます。
無事にロールの作成ができました!
ロール一覧を取得してロールがあるかを念のため確認してみます。
{
"roles": [
{
"id": "*************",
"name": "For_Qiita",
"visibility": "private"
}
]
}
無事にできていました!(結果は不要なものを削除しています。)
サブユーザを作成する
それではついにサブユーザを作成してみます。
以下のコマンドを用います。
curl -X POST \
-H "Accept: application/json" \
-H "X-Auth-Token: トークン" \
-d '{"user": {"password": "パスワード","roles": ["ロールIDまたはロール名"]}}' \
https://identity.c3j1.conoha.io/v3/sub-users
パスワードはサブユーザに設定したいパスワードを、ロールIDまたはロール名は先ほど作成したロールのIDか名前に、トークンは先ほど取得した認証トークンに置き換えてください。
なお、ロールは複数割り当てが可能です。
例えば今回は次のようなコマンドになります。
curl -X POST \
-H "Accept: application/json" \
-H "X-Auth-Token: トークン" \
-d '{"user": {"password": "*************","roles": ["For_Qiita"]}}' \
https://identity.c3j1.conoha.io/v3/sub-users
リクエストを送ると...
{
"user": {
"id": "*************",
"name": "*************",
"roles": [
{
"id": "*************",
"name": "For_Qiita"
}
]
}
}
このように、ユーザの情報が返ってきます。(結果は一部加工しています。)
無事にサブユーザの作成もできました!
サブユーザ一覧を取得してサブユーザがあるかを念のため確認してみます。
{
"users": [
{
"id": "*************",
"name": "*************",
"roles": [
{
"id": "*************",
"name": "For_Qiita"
}
]
}
]
}
大丈夫そうですね!(結果は一部加工しています。)
サブユーザでAPIを利用してみる
それでは、さっそく先ほど作成したサブユーザでAPIを利用してみます。
サブユーザのユーザIDとパスワードを利用して認証トークンを取得しておいてください。(やり方は同じなので割愛します。)
では、サブユーザでサーバー一覧を取得してみます。
以下のコマンドを用います。
curl -X GET \
-H "Accept: application/json" \
-H "X-Auth-Token: トークン" \
https://compute.c3j1.conoha.io/v2.1/servers
トークンはサブユーザで取得した認証トークンに置き換えてください。
リクエストを送ると...
{
"servers": [
{
"id": "*************",
"name": "*************",
"links": [
{
"rel": "self",
"href": "https://*************"
},
{
"rel": "bookmark",
"href": "https://*************"
}
]
}
]
}
無事にサーバー一覧が取得できました!(結果は一部加工しています。)
パーミッションのない操作をしてみる
では、サブユーザに与えていないパーミッションの操作をしてみます。
例えば、バックアップデータの一覧を取得してみます。
以下のコマンドを用います。
curl -X GET \
-H "Accept: application/json" \
-H "X-Auth-Token: トークン" \
https://block-storage.c3j1.conoha.io/v3/テナントID/backups
テナントIDは最初にコピーしたものに、トークンはサブユーザで取得した認証トークンに置き換えてください。
リクエストを送ると...
{
"code": 403,
"error": "this operation is not allowed for current user"
}
無事に拒否されました。(結果は一部加工しています。)
このように指定したパーミッション以外の操作はできないようになっています。(当たり前)
サブユーザ・ロールの削除
一通り遊んだのでサブユーザを削除しておきます。
以下のコマンドを用います。
curl -X DELETE \
-H "Accept: application/json" \
-H "X-Auth-Token: トークン" \
https://identity.c3j1.conoha.io/v3/sub-users/サブユーザーID
レスポンスは特にありません。
同様にロールも削除しておきます。
以下のコマンドを用います。
curl -X DELETE \
-H "Accept: application/json" \
-H "X-Auth-Token: トークン" \
https://identity.c3j1.conoha.io/v3/sub-users/roles/ロールID
こちらもレスポンスは特にありません。
念のためサブユーザ・ロールの一覧を取得して削除されたか確認しておいてください。
おしまい!
おわりに
ConoHa APIのサブユーザ・ロール機能を使ってみました。
この機能を使うことで、APIの利用におけるセキュリティを向上させることができます。
個人的にはオブジェクトストレージをよく使うので、オブジェクトストレージのパーミッションがあればうれしかったのですがまぁ仕方ないですね。
(ちゃんとわかっていないのですが、おそらくOpenStack側が対応してないのだと思います)
ぜひ皆さんも使ってみてください!
それでは!よいConoHaライフを!


