suzuki-shunsuke / issue

MIT License
4 stars 0 forks source link

.terraform.lock.hcl の自動 update について検討する #97

Open suzuki-shunsuke opened 2 years ago

suzuki-shunsuke commented 2 years ago

Renovate による provider の自動アップデート

Renovate では required_providers の provider のバージョン制約で、 provider の version を固定することを強制し、 そのバージョン制約のバージョンを update するということをする。

.terraform.lock.hcl を更新せずにバージョン制約だけ上げると terraform init は失敗する。

現状

https://github.com/suzuki-shunsuke/github-action-terraform-init/tree/v0.1.4 では terraform init に失敗したら terraform init -upgrade を実行し、 .terraform.lock.hcl を更新し、自動でコミットするようになっている。

以前自分が shell script で同様の処理を実装していた際は、 PR Author が Renovate の場合のみ同様の処理を行っていたが、 https://github.com/suzuki-shunsuke/github-action-terraform-init/tree/v0.1.4 では PR Author をチェックしなくなってしまっている

.terraform.lock.hcl の自動 update の必要性

まず Renovate で provider を自動 update するには .terraform.lock.hcl の自動 update が不可欠。 加えて、 terraform に詳しくない人が使う前提で考えると、ローカルで .terraform.lock.hcl を更新してもらうのはハードルが高い。 CI で丁寧なガイド(脳死でコマンド実行すれば OK) をコメントできれば改善するかもしれないが、それでも結構ハードルがある。 特に組織の規模が大きいと厳しい(小さければ教育すればよいし、コミュニケーションも取りやすい)

provider を working directory で管理せず、中央集権的に管理するという選択肢

これは mercari が採用している方法。 working directory ごとに update する必要がないし、使用する provider を中央集権的に管理することでサプライチェーン攻撃にも対応できる。 やるとしたら

自動で .terraform.lock.hcl を更新するリスク

バージョンをコードで管理し、再現性を保証するという意味では自動 update でも問題ない。 ただし、 .terraform.lock.hcl にはサプライチェーン攻撃を防ぐという機能もあり、自動 update してしまうとその効果を損なう可能性がある気がしている。 .terraform.lock.hcl には download された provider の checksum が記録されており、 terraform init で download された provider の checksum が .terraform.lock.hcl に記録された checksum と異なる場合、 terraform init が失敗し、改ざんを検知することができる。 しかし、自動で terraform init -upgrade を実行するということは、それを無視して .terraform.lock.hcl を改ざんされた provider の checksum で書き換えてしまうことになるのではないかと思われる。

.terraform.lock.hcl を更新するケース

Provider の信頼性をどう検証するのか

However, there are other mechanism in place that complement the lock file:

Terraform verifies the certificate of the remote registry against your system’s trusted certificate store, preventing certain kinds of misdirection or man-in-the-middle attacks. If you’re using the default direct installation method then Terraform checks the downloaded package against a set of approved checksums signed using a signature selected by the registry, so an attacker would need to compromise the checksums, the signature, and the package. If you’re running terraform validate in an isolated environment without access to any credentials then you might conclude also that the risk of executing arbitrary untrusted code is relatively low in this case.

registry にある provider は署名されているので、それも含めて侵害する必要がある。 ただ CI で署名をしてて GitHub Account を乗っ取られたりすると署名では防げない。

terraform validate って credential なしでも実行できるのか。 provider さえダウンロードされていればできるってことかな

suzuki-shunsuke commented 2 years ago
$ terraform init -upgrade

だとすべての provider を upgrade することになるし、 terraform init が失敗したらだと、 checksum が変わっていても検知できない。 Renovate で update された特定の provider だけ更新するみたいなことができると便利

suzuki-shunsuke commented 2 years ago

https://www.terraform.io/cli/commands/providers/lock

引数で provider 指定すれば特定の provider だけ update できる

suzuki-shunsuke commented 2 years ago

やりたいこと