OpenTofuを使ってみる

OpenTofuを使ってみる

HashiCorp, Inc.のIBMによる買収が発表されたため,OpenTofuに移行することを決めた.オフィシャルドキュメントを見れば導入において基本的に困ることはないのだが,インストーラスクリプトを軽く読んだりしたので,そこで得た知見や考えたことなどを記録しておく.

Tags: opentofu iac
Takafumi Asano · 17 minute read

導入

HashiCorp,Inc.が自社製品をオープンソースライセンスからビジネスソースライセンスに変更するという衝撃のアナウンスがされた2023年の8月,衝撃は受けたものの,その選択自体は理解できるものであった.

私自身はオープンソース原理主義者ではないし,利用者としての立場においては特段困ることはないだろうと思えた.

しかし,このライセンス変更は透明性の低下やコミュニティの反発をもたらし,結果としてLinux FoundationによってOpenTofuが設立されることになった.

選択肢が増えることは喜ばしいことであり,それがオープンソースライセンスであるならば尚の事喜ばしい.

とはいえ,私には喫緊,TerraformをOpenTofuに置き換えるモチベーションはなかった.

IBMによる買収が発表されるまでは.

HashiCorp, Inc.の決断自体には何も思うところがない.素晴らしい製品を世に送り出してくれた非常に革新的な会社である.

しかしながら,買収したのがIBMなのが非常に好ましくない.

IBMが買ったソフトウェア企業でまともに息をしているのはRedHatくらいしかないのではないだろうか.大体,IBMの製品ポーフォリオに組み込まれる形で消えている.

Terraformが今後どんな形になるにせよ,あまりIBMの直接影響下にあるソフトウェア製品を使いたくはない1ので,急遽OpenTofuに移行するモチベーションが生まれてしまった.

OpenTofuをインストールしてみる

OpenTofu自体はBSL適用前のTerraformをForkして開発されているので,当然Goで書かれている.

Goといえば,クロスコンパイル可能でシングルバイナリという非常にポータビリティの高い言語なので,何も考えずGitHubのリリースページから自分のCPUアーキテクチャにあった任意のアーカイブでダウンロードすれば良いのだが,インストーラスクリプトも提供されているので,これを使うのが一番楽だ.アーカイブのSHA256のチェックサム検証と,チェックサム自体のGPG/Cosing検証を自動でやってくれる

Linux Foundationのプロジェクトらしく,sigstore cosignが入っていればそれを使ってくれるので,cosingをインストールした上で,トラストアンカーとなるべきOIDC Token Issuerの信頼性が確認できていれば,これが最も安全かつ簡単であろう.

Rekorで署名エントリ自体のチェックもするとより完璧なのだろうが,このインストーラスクリプトではそこまではやっていないようだった.

さて,この記事を書いている時点でインストーラスクリプトを読むと,OIDC Token Issuerはhttps://token.actions.githubusercontent.comとなっており,これはGitHub ActionsのOIDCプロバイダURLであることが確認できている

早速インストールしてみよう.

$ curl --proto '=https' --tlsv1.2 -fsSL https://get.opentofu.org/install-opentofu.sh | bash -s -- --install-method standalone --install-path ~/.local/bin/ --symlink-path -
OpenTofu Installer

Installing OpenTofu using the standalone installation method...
Determining latest OpenTofu version...
Downloading OpenTofu version 1.7.1...
Performing checksum verification...
Checksum for tofu_1.7.1_linux_amd64.zip is 6567b49c43edd2e2670896bb6788b582e7a30fa6c9ee9fa07b9e613cfb219874, as expected.
Performing signature verification...
Verified OK
Verification successful.
Unpacking OpenTofu...
Archive:  /tmp/tmp.K3EiQjgPJf/tofu_1.7.1_linux_amd64.zip
  inflating: /tmp/tmp.HIGtr5HgVq/CHANGELOG.md
  inflating: /tmp/tmp.HIGtr5HgVq/LICENSE
  inflating: /tmp/tmp.HIGtr5HgVq/README.md
  inflating: /tmp/tmp.HIGtr5HgVq/tofu
Moving OpenTofu installation to /home/claude/.local/bin/...
Checking if OpenTofu is installed correctly...
OpenTofu v1.7.1
on linux_amd64
Installation complete.

さて,公式のインストールマニュアルでは,スクリプトをダウンロードして,実行して,最後に削除しているが,私は面倒なのでパイプで渡して実行した.

私はNixOSを使用しているので,以下のオプションを追加している.

  • --install-method standalone: パッケージを利用せずスタンドアロンバイナリとしてインストールする
  • --install-path ~/.local/bin/: デフォルトでは/opt/opentofuにインストールされるのだが,私は普段スタンドアロンバイナリを~/.local/binに配備しており,すでにPATHが通っているため,バイナリのインストール先として指定
  • --symlink-path -: デフォルトでは/usr/local/binにバイナリのシンボリックリンクを配備する.先のオプションでPATHが通っている場所にバイナリを配備しているので不要のため-で無効化した

早速試してみよう.

$ tofu -v
OpenTofu v1.7.1
on linux_amd6

機能しているようだ.

基本的な使い方はterraformと変わらないはずなので,しばらくこれを使ってみることにする.

Appendix

正直,インストールスクリプトで十分なのだが,仮にこのスクリプトが改ざんされた場合,それに気づけず,署名検証による恩恵が受けられない気がするので,GPGキーのインポートとトラストを実行した上で,手動でのスタンドアロンバイナリインストールも試してみた.

と言っても,結局現時点で公開されているキーを一旦信用しておくというだけの手続きなので,キーが変わったときに気づけるくらいの意味しかない.keybase.ioとかにGPG公開鍵をおいてくれると非常によいのだが.閑話休題.

GPG公開鍵のインポートとトラスト

GPGの鍵情報は個別に公開されていないようなので,インストールスクリプトを読んで必要な情報を確認する.

GPG Public Key

キーのURLが分かったので,インポートする.

$ curl -fsLS https://get.opentofu.org/opentofu.gpg | gpg --import
gpg: key 0C0AF313E5FD9F80: public key "OpenTofu (This key is used to sign opentofu providers) <[email protected]>" imported
gpg: Total number processed: 1
gpg:               imported: 1

無事インポートできたら,フィンガープリントを確認しておく.

gpg --list-keys OpenTofu                                             nix-shell-env 
pub   rsa4096 2023-11-15 [SC]
      E3E6 E43D 84CB 852E ADB0  051D 0C0A F313 E5FD 9F80
uid           [ unknown] OpenTofu (This key is used to sign opentofu providers) <[email protected]>
sub   rsa4096 2023-11-15 [E]

フィンガープリントが一致していることが確認できたら,トラストしておく.

$ gpg --edit-key OpenTofu                                              nix-shell-env 

pub  rsa4096/0C0AF313E5FD9F80
     created: 2023-11-15  expires: never       usage: SC  
     trust: unknown       validity: unknown
sub  rsa4096/534F621E47855EB6
     created: 2023-11-15  expires: never       usage: E   
[ unknown] (1). OpenTofu (This key is used to sign opentofu providers) <[email protected]>

gpg> trust
pub  rsa4096/0C0AF313E5FD9F80
     created: 2023-11-15  expires: never       usage: SC  
     trust: unknown       validity: unknown
sub  rsa4096/534F621E47855EB6
     created: 2023-11-15  expires: never       usage: E   
[ unknown] (1). OpenTofu (This key is used to sign opentofu providers) <[email protected]>

Please decide how far you trust this user to correctly verify other users' keys
(by looking at passports, checking fingerprints from different sources, etc.)

  1 = I don't know or won't say
  2 = I do NOT trust
  3 = I trust marginally
  4 = I trust fully
  5 = I trust ultimately
  m = back to the main menu

Your decision? 2

pub  rsa4096/0C0AF313E5FD9F80
     created: 2023-11-15  expires: never       usage: SC  
     trust: never         validity: unknown
sub  rsa4096/534F621E47855EB6
     created: 2023-11-15  expires: never       usage: E   
[ unknown] (1). OpenTofu (This key is used to sign opentofu providers) <[email protected]>
Please note that the shown key validity is not necessarily correct
unless you restart the program.

gpg> quit

私はトラストレベルをmarginallyに設定した.

OpenTofuをインストールする

GitHubのリリースページから最新のファイルダウンロードする.

$ curl -LO https://github.com/opentofu/opentofu/releases/download/v1.7.1/tofu_1.7.1_linux_amd64.zip
$ curl -LO https://github.com/opentofu/opentofu/releases/download/v1.7.1/tofu_1.7.1_linux_amd64.zip.gpgsig

COSINGでの署名検証のために.sig.pemファイルも公開されているが,前述の通り私はgpgを使うので.gpgsigファイルを併せてダウンロードする.

また,SHA256SUMもダウンロードしておく.

$ curl -LO https://github.com/opentofu/opentofu/releases/download/v1.7.1/tofu_1.7.1_SHA256SUMS
$ curl -LO https://github.com/opentofu/opentofu/releases/download/v1.7.1/tofu_1.7.1_SHA256SUMS.gpgsig

署名を検証する.

$ gpg --verify tofu_1.7.1_SHA256SUMS.gpgsig tofu_1.7.1_SHA256SUMS
gpg: Signature made Thu 09 May 2024 12:51:39 AM JST
gpg:                using RSA key E3E6E43D84CB852EADB0051D0C0AF313E5FD9F80
gpg: checking the trustdb
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: depth: 0  valid:   2  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 2u
gpg: Good signature from "OpenTofu (This key is used to sign opentofu providers) <[email protected]>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: E3E6 E43D 84CB 852E ADB0  051D 0C0A F313 E5FD 9F80

Good signature from "OpenTofu (This key is used to sign opentofu providers) <[email protected]>" [unknown]が出ていれば問題ないと考えて良いだろう.

WARNINGについては書かれている通りなので気にしても仕方がない.

SHA256ファイルの署名検証ができたら,次にバイナリチェックサムを確認する.

$ grep -q "$(sha256sum tofu_1.7.1_linux_amd64.zip | awk 'NR==1 {print $1}')" tofu_1.7.1_SHA256SUMS && echo "OK" || echo "NG"
OK

問題なさそうだ.

折角なのでアーカイブの署名も検証しておく.

$ gpg --verify tofu_1.7.1_linux_amd64.zip.gpgsig tofu_1.7.1_linux_amd64.zip
gpg: Signature made Thu 09 May 2024 12:51:37 AM JST
gpg:                using RSA key E3E6E43D84CB852EADB0051D0C0AF313E5FD9F80
gpg: Good signature from "OpenTofu (This key is used to sign opentofu providers) <[email protected]>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: E3E6 E43D 84CB 852E ADB0  051D 0C0A F313 E5FD 9F80

よし.

では,アーカイブを展開する.

$ unzip tofu_1.7.1_linux_amd64.zip
Archive:  tofu_1.7.1_linux_amd64.zip
  inflating: CHANGELOG.md
  inflating: LICENSE
  inflating: README.md
  inflating: tofu

見ての通り,バイナリの他にCHANGELOG.mdやLICENSE,README.mdが同梱されている.あとはPATHが通っている任意の場所にtofuバイナリを配備すればよいし,そのまま実行してもよい.

 ./tofu -v
OpenTofu v1.7.1
on linux_amd64

Footnotes

  1. IBMのハードウェアは好きであった.サーバはThinkPad, System x, NeXtScaleなどを散々購入したし,日本IBMのハードウェア保守には大変お世話になった.まぁ,今では全てLenovoになってしまったのだが