✌️

SORACOM cliで多要素認証を使う

2023/09/14に公開

この記事は

soracom cliで多要素認証を使う方法をまとめました。また、cliで多要素認証をより便利に使うための機能を実装したことについてお話します。

多要素認証とは

SORACOMコンソールへのログインには、メールアドレスとパスワード(SAMユーザーの場合はオペレーターIDとユーザー名とパスワード)に加えて、多要素認証を使うことができます。
多要素認証を使うことで、万一パスワードが漏洩した場合のリスクを軽減することができます。

SORACOMでの多要素認証については、以下の公式ドキュメントをご覧ください。

https://users.soracom.io/ja-jp/docs/mfa/

cliでの多要素認証

では、cliではどうなっているのでしょうか。
SORACOM cliのドキュメントによると、「SORACOM cliは多要素認証には対応していない」ということになっています。

これは、正確に言うと以下のような意味になります。

  • ルートユーザーの多要素認証を有効にしていると、cliではルートユーザーのメールアドレスとパスワードを用いた認証を利用できない(認証エラーになる)
  • SAMユーザーの多要素認証を有効にしていると、SAMユーザーの認証情報を用いた認証を利用できない(認証エラーになる)
  • ルートユーザーまたはSAMユーザーの認証キーを用いた認証にはそもそも多要素認証が利用できない

では、cliでは多要素認証を使った認証はできないか・・・というと、実は、authコマンドを使うことで多要素認証を有効にした認証情報で認証し、それ以降のcliの操作を行うことができます。

authコマンドを使う

SORACOM cliのドキュメントで、「APIキーとAPIトークンの発行頻度を減らす」というページがあります。
こちらではauthコマンドを実行して入手したAPIキーとAPIトークンを用いて、それ以降のcliの操作を行う方法が書いてあります。

例として、以下のようにauthコマンドを実行します。

$ soracom auth --auth-key-id xxxxxxxxxxxxxxxxxxxx --auth-key xxxxxxxxxxxxxxxxxx
{
	"apiKey": "api-xxxxxxxxxxxx",
	"operatorId": "OPxxxxxxxxxxx",
	"token": "xxxxxxxxxxxxxxxxxxxxxxx",
	"userName": "xxxx"
}
$ soracom soralets list --api-key api-xxxxxxxxxx --api-token xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[
	{
...
]

--auth-key-id--auth-keyで認証キーを指定してauthコマンドを実行すると、apiKeyとtokenが取得できます。これをcliの--api-key--api-tokenに渡すことで、それ以降の認証をできます。

authコマンドを実行する際は上記のように認証キーを用いるか、--email--passwordでメールアドレスとパスワードを渡して認証する必要があり、このときにプロファイル(並びにプロファイルコマンド)を使った認証は利用できません。

そして、authコマンドを実行する際には、実は--mfa-otpcodeで多要素認証のトークンを渡すことができます。これを使うことで、多要素認証を使った認証をcliで行うことができます。

$ soracom auth --auth-key-id xxxxxxxxxxxxxxxxxxxx --auth-key xxxxxxxxxxxxxxxxxx --mfa-otpcode xxxxxx
{
	"apiKey": "api-xxxxxxxxxxxx",
	"operatorId": "OPxxxxxxxxxxx",
	"token": "xxxxxxxxxxxxxxxxxxxxxxx",
	"userName": "xxxx"
}
$ soracom soralets list --api-key api-xxxxxxxxxx --api-token xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[
	{
...
]

なお、--mfa-otpcodeオプションはauthコマンド専用のオプションで、他のコマンドでは使えません。以下のようなことはできず、authコマンドで取得したapiキーとトークンを使う以外の方法はありません。

$ soracom soralets list --mfa-otpcode xxxxxx
$ soracom soralets list --mfa-otpcode xxxxxx --auth-key-id xxxxxxxxxxxxxxxxxxxx --auth-key xxxxxxxxxxxxxxxxxx 

プロファイルコマンドを利用する

authコマンドを使えば多要素認証を有効にしたアカウントでcliを使うことができました。しかし、ちょっとこれは常用するには不便です。ラッパーとなるシェルスクリプトなどを使えばもう少し使いやすくなりますが、やはりここは普段のプロファイルを用いた認証を使いたいところです。
そこで、プロファイルコマンドを使って、多要素認証を有効にしたアカウントでの認証をより便利に行えるようにしました。

プロファイルコマンドとは

SORACOM CLIの認証情報を安全に保管するで紹介していますが、SORACOM cliにはプロファイル情報(通常は~/.soracom/xxx.jsonファイルに保存する)を外部コマンドから取得するという機能があります。
ここに例えば1password cliを使うと、安全に認証情報を取得してcliの認証に使うことができます。

そして、1passwordにはTOTPベースの多要素認証のトークンを発行する機能があります。つまり、プロファイルコマンドで1password cliを使うと、認証情報とともに多要素認証のトークンも取得できるわけです。あとはSORACOM cliがここで取得した多要素認証のトークンを認証時に使うようにしてやれば良さそうだということになります。

やってみた

前回プロファイルコマンド機能を実装したときの経験を元に、多要素認証のトークンを取得する機能を実装していきます。とはいえ、プロファイルで取得するJSONの形式(ならびにそれを受け取る内部のデータ構造)にmfaotpcodeに関するエントリを追加するだけです。

実装してビルドしたら、実際にやってみます。
適当なSAMユーザを作って多要素認証を有効にし、認証情報と多要素認証トークンいずれも1passwordに登録しておきます。
プロファイルコマンドの設定はこんな感じです。

 cat ~/.soracom/sam.json 
{"profileCommand":"/bin/sh -c \"op item get soracom-power-sam-user --format json | jq '{username:.fields[1].value,password:.fields[0].value,operatorId:.fields[4].value,mfaOTPCode:.fields[3].totp}'\""}

mfaOTPCodeというエントリを追加し、そこに入れる値は1password cli(opコマンド)で取得したJSONの.fields[3].totpで取得しています。

ではまず、改修前のコマンドで実行してみましょう。

$ soracom --profile sam soralets list 
Error: {"code":"AUM0063","message":"MFA OTPコードが必要です。"}

多要素認証のトークンが必要と言われます。では、改修後のコマンド(ビルドすると、soracom/dist/${VERSION}/soracom_${VERSION}_${ARCH}というファイルができます)で実行してみましょう。

$ ./soracom/dist/1.2.3/soracom_1.2.3_linux_amd64 --profile sam soralets list
[
	{
...
]

無事に動きました!
結果のコピペだけではなく、実際のスクリーンキャプチャは以下のとおりです。

実際に動作している様子

これで、プロファイルコマンドを使って多要素認証のトークンを取得して、cliの認証に使うことができるようになりました。

まとめ

SORACOMの認証は、多要素認証を使うことでより安全に行うことができます。しかし、これまではcliで多要素認証を使うにはやや不便なところがありました。

今回の改修により、プロファイルコマンドを使って多要素認証のトークンを取得して、cliの認証に使うことができるようになりました。これで、より安全にcliを使うことができるようになりました。スイッチユーザー機能も組み合わせると、更に安全になります。

本機能はプルリクエストを送ったところすぐにマージしていただけましたので、2023年9月14日現在masterブランチに含まれています。
ただし、まだバイナリはリリースされてませんので、すぐに試してみたい方はぜひSORACOM cliのソースコードをcloneしてビルドしてみてください。

皆様のお役に立てば幸いです。

GitHubで編集を提案

Discussion