Terraform CloudのAPI tokenの自動ローテーションの仕組みを作ってみた

· 3 min read
Terraform CloudのAPI tokenの自動ローテーションの仕組みを作ってみた

はじめに

仕事で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などに変えてください

複数端末で利用する場合

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
  1. Token_Fileはデフォルトでhome directoryにある.terraform.d配下のcredentials.tfrc.jsonに記述されている
  2. コンソール画面で新規tokenは発行されたことを確認(tokenを発行するとメール通知もされる)
    https://app.terraform.io/app/settings/tokens
    • メールの件名はこんなん
      A User Token has been generated for your account
  1. VScodeから適当なワークスペースにアクセスして、planなどが通るか確認
terraform plan
  1. テスト実行して正常にtokenが更新されるか確認(標準出力なし)
  2. HCP_token_rotate.shを編集し、Token_FileToken_Nameを自環境に合わせて内容を修正する
Token_File=/Users/<your_username>/.terraform.d/credentials.tfrc.json
Token_Name="01_VScode_API_Token"
scheduling

launchd を利用して定期更新処理を実装する。
実行モードはdaemonではなくagentで登録

  1. $HOME/Library/LaunchAgents/以下に com.HCP.rotate_token_job.plist ファイルを設置する
  2. 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>
  1. ターミナルを起動し、編集したplistファイルをloadする
launchctl load -w <path_to_your_plist_file>/com.HCP.rotate_token_job.plist
  1. 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だったらこの可能性あり
-	126	com.HCP_terraform.rotate_token_job
    • やりかた
      1. 設定 → セキュリティとプライバシー → フルディスクアクセスに/bin/bashを入れる
      2. 一旦フルディスクアクセスを開いた状態でFinderを別に開く
      3. 移動 → フォルダへ移動から/binで移動し/binを開く
      4. bashをフルディスクアクセスにドラッグ&ドロップすれば追加できる
  • launchctlが重複処理する(Tokenが2つ発行される)
    • たぶんなんかの設定がおかしくて処理が2回動いちゃってる
    • めんどくさくて調べてない、現在放置してるけど、気が向いたら治す。