さくらのクラウド「サービスプリンシパルキー」外部利用の手順|アクセストークン取得とAPI操作
こんにちは、UOZUです。
さくらのクラウドでは、これまでもWorkflowsなどで利用するためのサービスプリンシパル機能が提供されていましたが、今回「その他の環境から使う場合」というセクションがマニュアルに追加され、クラウド外のサーバーやスクリプトからも安全にAPI操作が可能になりました。
APIキーを直接使うよりもセキュアで柔軟なサービスプリンシパル、早速確認してみましょう!
サービスプリンシパルキー用の公開鍵を作成
まずは、認証に必要となる鍵ペアを用意します。PEM形式のRSA 4096ビットで秘密鍵と公開鍵をssh-keygenコマンドで発行しておきます。
秘密鍵と公開鍵の生成
$ ssh-keygen -t rsa -b 4096 -f uozu -m PEM
$ cat uozu
-----BEGIN RSA PRIVATE KEY-----
MIIJKAIBAAKCAgEAzQkQuq/39NUvXtRpbKVWJpu1lzUwIYLIOjvfxfdz1SavkxpE
fBzxFBka0p5ytikrGmBXHb0wi9GinSOITMk70gpMROWx5dOSYKByHS2BWbDGGW/p
82UbM+wFH1tPUAWe5+e+5mi5bm+RAZ/jSRY3drycZSYvWLc1q6hGfNr48UIXFX5f
9pOByNEnynJit8ziKk7CK+501VDn4EJ/lVOLzY6KiVRAGpmfrb2em9ZTfGuj/IwB
98bB2Fy2zIuG8xE0Dn1uaGosfE5enGczftrkXGsDVvJfeBYxp4Y+AlVQ37DAj+pY
z66kyDxfbe8P58J+GOEz6TKRgAthsCXfUlSUpH06mBxJe+mvzWFUkrxtZrGsa6se
~略
R05oGDQ7WI/mFzMYRK24dUAPZHUhUT+vjDuj4Yzy3XLbIIuXdBFcY6Ck++PWWwhB
87ztRVjZSnEZiigPL5feXqRPvHIAP1Z7fn2xFciYybMjyfbkMNw+I+Q8KzTb7ePp
QkCroQz8XXgP5+hY8f85hNO325THUQ0Xt7/vatJ/V5vrteAHwMSkb0YvuSQtlNDK
0uJ1kQeLjldtzwz+CxXpChNciKqcI4dUHqfMnloHHTiSPNQa0faUoYacZYI=
-----END RSA PRIVATE KEY-----
$ cat uozu.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDNCRC6r/f01S9e1GlspVYmm7WXNTAhgsg6O9/F93PVJq+TGkR8HPEUGRrSnnK2KSsaYFcdvTCL0aKdI4hMyTvSCkxE5bHl05JgoHIdLYFZsMYZb+nzZRsz7AUfW09QBZ7n577maLlub5EBn+NJFjd2vJxlJi9YtzWrqEZ8
~略
v2s3A1mmsqdmzSFwCFEANyh527OrNxmHvAr1xhr+BI+zmPZDKIUiuNMkxKkfm4oW3tj8FjUNbJJrLFRksAP4niOzaGZVTIpzgnHDgeigT9K3xemfHkDb0f3rbzSC9w== uozu@xxx
生成された公開鍵をPEM形式に変換
この時点は公開鍵がSSH用になっているので、PEM形式に変換します
$ ssh-keygen -f uozu.pub -e -m PEM > uozu.pem
$ cat uozu.pem
-----BEGIN RSA PUBLIC KEY-----
MIICCgKCAgEAzQkQuq/39NUvXtRpbKVWJpu1lzUwIYLIOjvfxfdz1SavkxpEfBzx
FBka0p5ytikrGmBXHb0wi9GinSOITMk70gpMROWx5dOSYKByHS2BWbDGGW/p82Ub
M+wFH1tPUAWe5+e+5mi5bm+RAZ/jSRY3drycZSYvWLc1q6hGfNr48UIXFX5f9pOB
yNEnynJit8ziKk7CK+501VDn4EJ/lVOLzY6KiVRAGpmfrb2em9ZTfGuj/IwB98bB
~略
6cjqfAfhwCNgVVqnezahej3fbvN8/ezb8aqU2yf42Vqhuoy9E9LT8/JZL79rNwNZ
prKnZs0hcAhRADcoeduzqzcZh7wK9cYa/gSPs5j2QyiFIrjTJMSpH5uKFt7Y/BY1
DWySayxUZLAD+J4js2hmVUyKc4Jxw4HooE/St8Xpnx5A29H96280gvcCAwEAAQ==
-----END RSA PUBLIC KEY-----
このPEM形式の公開鍵を、さくらのクラウドのコントロールパネルからサービスプリンシパルキーを発行する際に登録しておきましょう。
スクリプトでのアクセストークン取得とAPI操作
サービスプリンシパルキーを利用した認証フローは、秘密鍵でJWT(JSON Web Token)に署名し、それを認証エンドポイントに投げることで一時的なアクセストークンを取得する仕組みです。
サービスプリンシパルキー
│
│ (秘密鍵でJWT署名)
▼
JWT生成
│
│ POST
▼
https://secure.sakura.ad.jp/cloud/api/iam/1.0/service-principals/oauth2/token
│
▼
アクセストークンの取得
具体的な署名方法までは書かれていませんでしたが、最終的に以下の様なスクリプトでアクセストークンの取得までが可能でした。(有効期限は10分で設定しています。)
#!/bin/bash
# ===== 設定 =====
SP_ID="サービスプリンシパルのリソースID"
KID="サービスプリンシパルキーKID"
PRIVATE_KEY="秘密鍵のファイル名"
TOKEN_ENDPOINT="https://secure.sakura.ad.jp/cloud/api/iam/1.0/service-principals/oauth2/token"
# ===== 時刻 =====
NOW=$(date +%s)
EXP=$((NOW + 600))
# ===== header =====
HEADER=$(printf '{"alg":"RS256","kid":"%s","typ":"JWT"}' "$KID")
# ===== payload =====
PAYLOAD=$(printf '{"iss":"%s","sub":"%s","aud":"%s","iat":%d,"exp":%d}' \
"$SP_ID" "$SP_ID" "$TOKEN_ENDPOINT" "$NOW" "$EXP")
# ===== base64url function =====
base64url () {
openssl base64 -e -A | tr '+/' '-_' | tr -d '='
}
HEADER_B64=$(echo -n "$HEADER" | base64url)
PAYLOAD_B64=$(echo -n "$PAYLOAD" | base64url)
DATA="$HEADER_B64.$PAYLOAD_B64"
# ===== JWT署名 =====
SIGNATURE=$(echo -n "$DATA" | \
openssl dgst -sha256 -sign "$PRIVATE_KEY" | base64url)
JWT="$DATA.$SIGNATURE"
# ===== POST =====
curl -s -X POST "$TOKEN_ENDPOINT" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer" \
-d "assertion=$JWT"
$ bash api.sh
{"access_token":"NGU2NzA4NGQ0ZDk2NDE2OGFmZDI0YTY5NGE3OGIzN2E6K1NkRVlzVElXdi4xc3h2SzV4QklGZGlnb3I5Yy4tZ2JvbH5ISHg1Kys0T0VmelNic2g3RXd2Mk05N1YwMS1YazBmUy8tdi1laC1xenZuZ08zd3JCMm9ncU1jbnp5bzNtRGQtV2ZHREh5eWxoVjIuT2d4WmUwbWpCSXJ0U2NWQWYuSjBwfitLSzZyblBmeHNtbnlyYmhXU3BiLUowTzZ6Z1YuRjFVdU1uNUFveEllb2xUcGx2KzMuUHJHNDZQRVYxa1RVaDYufjIvcTNOLXRoeHMta0t3YktidUQzYmpacVgyQSsreXhpOGlqVXhLaDhzYzJ6VzVNV2RBZFVUUmRhVHpIUlJhaXk4SX5lfnRLSitjMjdSQUVkSVUuM3JZakYuSmd1LWVYNzB2SzhrV242ZkorbzF2UGNjUWxER0JJMG9aeF9jREtwUGhBZm9iNWxPdTJ1VVBPOXBKbzJKZjg1blhiOVZuUmNFRTFXNXFMV29xRWhtbUY0MHB3MH5rQnJ+L0lWZUFXbHdrY2t~略
ktfMGtnMVBadi9BZWRTYlRTRTZldllRVXZITHJ1d2pTY0M4Rk43S1VacTZMY2p3VTVKamlBU0dLSEk5MnI3RnZUVTcrVWFMfnkzcDFoVVYrMFp1NlNwMHRnZDdtK000anlrbWMudU4zbkE4YjcwcU5KV0tfV25wdkU3UmE1bW5XYTl2RXgueUEtQV9GdlBtN3dUckl4OXNuMUhLQTNKZHBVWVFqMnJyNmtUdmdsfnVoY3UtMzZhcGpXRU1VT2ZGcXlkUmM3QlhYM0svRkgzQTB+YXk2TEIrclNSQ1d4blNrZzhBZWxIbmtvWURrYU9QSklhZEl5TEtFQlhER1M0S3g2dDNBWg==","token_type":"Bearer","token_expired_at":"2026-03-05T11:54:19.517540+00:00","expires_in":3600}
Bearer のトークンに指定する事で、マニュアル通りにリソース一覧も呼び出せそうです
$ TOKEN=$(bash api.sh | jq -r ".access_token")
$ curl -s -H "Authorization: Bearer $TOKEN" -H "X-Requested-With: XMLHttpRequest" https://secure.sakura.ad.jp/cloud/zone/is1a/api/cloud/1.1/server|jq
~略
{
"Index": 14,
"ID": "yyyyyyyyyy",
"Name": "xxxxx-xxxxx",
"HostName": "xxxxx-xxxxx",
"Description": "",
"Availability": "available",
"ServiceClass": "cloud/plan/1core-2gb-g2",
"InterfaceDriver": "virtio",
"CreatedAt": "2026-02-26T14:16:35+09:00",
"ModifiedAt": "2026-02-26T14:21:21+09:00",
"Icon": null,
"ServerPlan": {
"ID": zzzzzzzzzz,
"Name": "プラン/1Core-2GB",
"CPUModel": "uncategorized",
"CPU": 1,
"MemoryMB": 2048,
"GPUModel": "none",
"GPU": 0,
"ConfidentialVM": false,
"Commitment": "standard",
"Generation": 200,
"ServiceClass": "cloud/plan/1core-2gb-g2"
},
~略
他のさくらのクラウドAPIも利用可能ですね!
$ curl -s -H "Authorization: Bearer $TOKEN" -H "X-Requested-With: XMLHttpRequest" https://secure.sakura.ad.jp/cloud/zone/is1a/api/cloud/1.1/region|jq
{
"From": 0,
"Count": 3,
"Total": 3,
"Regions": [
{
"Index": 0,
"ID": 210,
"Name": "東京",
"Description": "東京",
"NameServers": [
"210.188.224.10",
"210.188.224.11"
]
},
{
"Index": 1,
"ID": 290,
"Name": "Sandbox",
"Description": "Sandbox",
"NameServers": [
"133.242.0.3",
"133.242.0.4"
]
},
{
"Index": 2,
"ID": 310,
"Name": "石狩",
"Description": "石狩",
"NameServers": [
"133.242.0.3",
"133.242.0.4"
]
}
],
"is_ok": true
}
以前お話ししたパケットフィルタの設定と同様に、適切な権限管理を行いながら、このように外部からAPIを叩けるのは非常に強力ですね。
最後に
これまでは「APIキー」を発行してリソースを操作するのが一般的でしたが、今回登場した「サービスプリンシパルキー」は、署名や有効期限を利用することで、よりセキュアな運用を可能にしています。
また、単独のサービスプリンシパルに対して複数のキーを発行できる柔軟性は、チーム開発や複数の自動化ツールを運用する際に活きてきそうです。サーバー単独に権限を絞る「シングルサーバAPIキー」など、さくらのクラウドが提供する多様な認証手段をうまく使い分けていきたいところですね。
最後までお読みいただき、ありがとうございます!



