Proxmox VEのREST APIにはTicket Cookieを使え!
2024-12-20
azblob://2024/12/20/eyecatch/2024-12-20-proxmox-api-use-ticket-000.jpg

本記事はFIXER Advent Calendar 2024( FIXER Advent Calendar 2024 ~tech編~ )12月20日の記事です。

はじめに

自分はProxmox VEという仮想マシンやLInuxコンテナを管理できるソフトウェアで検証したり遊んだりしているのですが、 詰まったところがあったので、その解決法を備忘録替わりに残しておきます。

前提条件

  • Proxmox VE 8.3

事象

Proxmox VE(以下Proxmox)はWebコンソールから操作するほかにREST APIも用意されており、こちらの方法でLinuxコンテナを作成する検証をしていました。

手順としては以下の通りです。

1. まず、あからさまにこれを使ってくださいと言わんばかりにあるAPIトークン欄から、適当なTokenIDでAPIトークンを発行します。
rootでAPIトークン発行
2.トークンが発行出来たらWikiの通りにヘッダーに乗せ、ドキュメントの通りにボディを含めて送信してみます。
必須パラメータのほかに、コンテナを配置するストレージとマウントオプションだけ指定しています。
Linuxコンテナ作成失敗
"403 permission check failed (mount point bind is only allowed for root@pam)"というエラーが帰ってきてしまいました。当然コンテナも作成されていません。


念のためAPIトークンが間違っていないことを確認するため別のAPI(今回はapi2/json/version)にリクエストを送ってみます。
APIトークンを使ってバージョン情報の取得は可能
こちらは200が帰ってきたので、APIトークンが間違ってるわけではなさそうです。

原因

ホストマシンとファイルの共有を行いたかったのでマウントのオプションを加えたのですが、どうやらホストマシンのマウントは"root@pam"しか受け入れてくれません。一方APIトークンは"root@pam!~"のようにエクスクラメーションマーク以降の部分があるので"root@pam"と一致せずに拒否されていたようです。

解決方法

WikiにAPIトークンではなくTicket Cookieというものを使う方法がありました。
これはユーザ名とパスワードから、2時間限定で使えるランダム文字列のチケットを発行し、それを認証に使う方法です。
これであれば、APIトークンのようにpamのうしろに余計な文字がつかず"root@pam"としてリクエストを送ることができます。

というわけで早速やってみましょう。
1. まずはroot@pamのユーザ名とパスワードを使ってチケットを発行します。
Ticket Cookieを発行
2. 取得したチケットと、POSTなのでWikiに従ってCSRFPreventionTokenもヘッダーに含めて再度コンテナ作成のリクエストを送ってみます。
コンテナ作成成功
3. Webコンソールからもコンテナが作成されていることを確認できました。 

コンテナが作成されていることをWebコンソールからも確認

終わりに

まさかrootのAPIトークンでできないことがあるとは思っていなかったのでこの結論にたどり着くまで1週間ぐらいかかりました。
やっぱり思い込みはよくないですね。ちゃんとWiki(ドキュメント)は読むようにしましょう。