💰

OCI CLIが不意に操作されて課金されるのを未然に防ぐ

に公開

経緯

個人のアカウントで、oci cliをセットアップしてみたはいいものの、oci hogehoge だけで自分のアカウントに課金しまくれるのは怖すぎる。

内容

pass を利用すると、gpgの仕組みを使って安全にパスワードを管理できる。
ociのapi-keyにパスフレーズを設定し、ociコマンド実行時にpassを使って環境変数にパスフレーズを設定すれば、万が一の場合も認証を通さなければコマンド操作が出来なくなるはず。
いちいちパスフレーズを入力するのであれば、~/.oci/config 等にpass_phraseを記載しないだけでいいので、今回は指紋認証(touch id)を使って簡単に認証できるようにしたい。

手順

  1. passのインストール
brew install pass
# or
brew install gopass
  1. passのセットアップ
pass init "My private vault."
  1. pinentry-touchid のセットアップ
    ※詳しくはREADME参照
brew tap jorgelbg/tap
brew install pinentry-touchid pinentry-mac
# ... 以下手順にそってインストール
  1. ociのapi-keyを新規作成
# パスフレーズを設定しておく
openssl genrsa -out ./my_secure_api_key.pem -aes128 2048
openssl rsa -pubout -in ./my_secure_api_key.pem -out ./my_secure_api_key_pub.pem
  1. oci configに記載
    ※pass_phraseは記載しない
fingerprint=xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx
key_file=/path/to/my_secure_api_key.pem
  1. 先ほど作成した公開鍵(my_secure_api_key_pub.pem)をociのWeb UIから設定する
  2. pass にパスフレーズを記憶させる
pass insert oci/api-key # もちろん何でも良い
(先ほど設定したパスフレーズを入力)
  1. 確認
pass
# Password Store
# ├── oci
# │   └── api-key # <- 7 で作ったパスワードが表示されている
# ...
  1. pinentry-touchidの確認
pass oci/api-key
# touch idのダイアログが表示され、認証するとパスフレーズが表示されればOK
  1. ociコマンドのラッパーを作成
which oci # brew等でインストールした `oci` コマンドのパスを覚えておく。
# ここでは仮に `/opt/homebrew/bin/oci` とする
touch ~/.bin/oci # brew 等よりも先にパスが通ったディレクトリに oci 実行ファイルを作成
chmod u+x ~/.bin/oci # 実行権限を付与しておく

~/.bin/oci に以下のようなシェルスクリプトを書く

#!/bin/zsh
(
  OCI_CLI_PASSPHRASE="$(pass oci/apikey; osascript -e 'tell application "iTerm2" to activate')" /opt/homebrew/bin/oci "$@"
)
  • pass oci/apikey # ここでパスフレーズを取得
  • osascript -e 'tell application "iTerm2" to activate' # 指紋認証のダイアログを表示すると、ターミナルのフォーカスが外れて面倒くさいのでフォーカスを戻す。ここではiTerm2を利用していると仮定しているが、適宜書き換える。

以上

Discussion