はじめに
仕事でTerraform Cloudを触る機会が多くなって来たのですが、主にVScodeなどからHCP Terraformに接続して操作することが多いです。
https://www.hashicorp.com/ja/products/terraform
接続にはAPI tokenを利用していますが、セキュリティライフサイクル管理の観点からキーローテーションをしたほうがよいかと思ったので、自動でAPI tokenをローテーションする仕組みを作ってみました。
実行環境と必要なもの
- Linux(bash)
- 原田は
MacOS 15.6.1の環境を使ってます - シェルは
zshからbashに変更してます
- 原田は
- jq
- 既にHCP terraform tokenの作成しており、利用できる状態であること
- 鍵更新自体をAPI経由で処理しているので、最初のTokenは手動で発行・設定する必要があります
あーき図

Tokenの命名規則
- デフォルトでは接頭詞に
01_VScode_API_Tokenがついている - 全体のトークン名は
[接頭詞]_created_at_[YYYYMMDDHHmmss] - 接頭詞は必要に応じてカスタマイズしてください
- VScode以外でtokenを利用する場合
VScodeの箇所を利用するroleなどに変えてください
- VScode以外でtokenを利用する場合
複数端末で利用する場合
01_~
↓
02_~
Tokenの有効期限
- 発行から7日間
- ここはセキュリティ要件によって変えてOK
- 1日期限とかより厳しいポリシーもあるけど、まぁ利便性とのバランスを取って頂いて
- Rotateは1週間以内に実施
Rotateタイミング
- 3日間おき or 週2日くらいで
- Linuxならcron、MacならLaunchedを使って登録
(Windowsはタスクスケジューラだけど、Script使えないかもしれん) - 曜日はおまかせ。原田は火・金でやってる
(始業のタイミングで更新させるイメージ)
連休やPC更新のタイミングによってはうまく更新されないこともあります
成果物
HCP_token_rotate.sh
※拡張子はtxtファイル形式になってる
com.HCP.rotate_token_job.plist
利用方法
setup
- Token_Fileはデフォルトでhome directoryにある.terraform.d配下の
credentials.tfrc.jsonに記述されている - コンソール画面で新規tokenは発行されたことを確認(tokenを発行するとメール通知もされる)
https://app.terraform.io/app/settings/tokens
- メールの件名はこんなん
A User Token has been generated for your account
- VScodeから適当なワークスペースにアクセスして、planなどが通るか確認
terraform plan
- テスト実行して正常にtokenが更新されるか確認(標準出力なし)
HCP_token_rotate.shを編集し、Token_FileとToken_Nameを自環境に合わせて内容を修正する
Token_File=/Users/<your_username>/.terraform.d/credentials.tfrc.json
Token_Name="01_VScode_API_Token"
scheduling
launchd を利用して定期更新処理を実装する。
実行モードはdaemonではなくagentで登録
$HOME/Library/LaunchAgents/以下にcom.HCP.rotate_token_job.plistファイルを設置するcom.HCP.rotate_token_job.plistを編集し、自環境に合わせて内容を修正する
<array>
<string>/bin/bash</string>
<string><path_to_your_script_file>/HCP_token_rotate.sh</string>
</array>
<key>WorkingDirectory</key>
<string><path_to_your_script_file></string>
<key>UserName</key>
<string><your_username></string>- ターミナルを起動し、編集したplistファイルをloadする
launchctl load -w <path_to_your_plist_file>/com.HCP.rotate_token_job.plist- launchdサービスに
com.HCP_terraform.rotate_token_jobが登録されたことを確認
launchctl list |grep com.HCP_terraform.rotate_token_job
実行例
$ launchctl list |grep com.HCP_terraform.rotate_token_job
com.HCP_terraform.rotate_token_job
- 0 com.HCP_terraform.rotate_token_job- launchdサービスから登録解除したい場合は以下を実行
launchctl unload -w <path_to_your_plist_file>/com.HCP.rotate_token_job.plistトラブルシューティング
- /bin/bashでスクリプトを実行するとき
Operation not permittedになるときの対処- bashをFDA(フルディスクアクセス)に登録する
※macOS Mojave以降はセキュリティ強化されているのでFDA設定が必須
※launchctl listのステータスコードが126だったらこの可能性あり
- bashをFDA(フルディスクアクセス)に登録する
- 126 com.HCP_terraform.rotate_token_job- やりかた
- 設定 → セキュリティとプライバシー → フルディスクアクセスに
/bin/bashを入れる - 一旦フルディスクアクセスを開いた状態でFinderを別に開く
- 移動 → フォルダへ移動から/binで移動し/binを開く
bashをフルディスクアクセスにドラッグ&ドロップすれば追加できる
- launchctlが重複処理する(Tokenが2つ発行される)
- たぶんなんかの設定がおかしくて処理が2回動いちゃってる
- めんどくさくて調べてない、現在放置してるけど、気が向いたら治す。