トップページに載った鍵
学生がプロジェクトを公開リポジトリに上げました。最初のテストが動いたので、アクセスキーがファイルに入ったままです。
公開リポジトリを一日中読むプログラムが、数分でそれを見つけます。ファイルの中の鍵は誰でも使えます。ファイルを直しても、履歴には残ります。
このレッスンのゴール
メモ
秘密をOpenTofuのファイルの外に置き、それでも残る場所を言える。
重要な言葉
| ことば | いみ | れい |
|---|---|---|
| 秘密 | 他の人に見せない値。鍵など | |
| sensitive | 画面で値を隠すための印 | sensitive = true |
| 環境変数 | シェルがコマンドに渡す値 | TF_VAR_token |
| state | OpenTofuが作ったものを記録するファイル | |
| 除外ファイル | バージョン管理が無視するファイルの一覧 | .gitignore |
学生が入力するセルは、このプレビューでは空白です。
秘密はコミットするファイルに書かない
.tf ファイルに書いた値は、プロジェクトと一緒に保存され、すべてのクローンにコピーされ、履歴に残ります。だから秘密は、ファイルの外からOpenTofuに渡します。
よく使うのは環境変数です。token という変数は TF_VAR_token で設定します。変数に sensitive をつけると、画面では隠れます。
フォルダを作って入る
mkdir -p ~/iac-demo/vault && cd ~/iac-demo/vaultここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
秘密を受け取るプロジェクトを書く
printf '%s\n' 'variable "token" {' ' type = string' ' sensitive = true' '}' '' 'resource "terraform_data" "login" {' ' input = var.token' '}' '' 'output "shown" {' ' value = terraform_data.login.output' ' sensitive = true' '}' > main.tfここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
フォルダを準備する
tofu init -no-color | grep successfullyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
環境に秘密を置いてplanを出す
TF_VAR_token=moon42 tofu plan -no-color | grep -E "input|^Plan"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
applyする
TF_VAR_token=moon42 tofu apply -auto-approve -no-color | grep -E "Apply complete|shown"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
出力を一覧する
tofu outputここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
sensitiveは値を隠すだけ
sensitive が変えるのは表示だけです。state には、すべての値が平文のまま記録されます。OpenTofu が次回の比較に必要とするからです。
つまり state ファイルは、秘密と同じだけ秘密です。バージョン管理には入れず、本番では暗号化され、アクセスが限られた場所に置きます。
stateに値がある場所を数える
grep -c moon42 terraform.tfstateここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
出力をそのまま頼む
tofu output -raw shown; echoここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある間違い
注意
sensitive は値を暗号化する、と考える人が多くいます。暗号化はしません。planと出力で値を隠すだけです。state を読める人や tofu output -raw を実行できる人には、まだ見えます。state も守りましょう。
除外ファイルでstateを外す
.gitignore は、バージョン管理が追加しないファイルの一覧です。OpenTofu のプロジェクトは4行で足ります。state、そのバックアップ、.tfvars ファイル、.terraform フォルダです。
1行でも抜けると、秘密の入った state がアップロードされます。
除外ファイルを書く
printf '%s\n' 'terraform.tfstate' 'terraform.tfstate.backup' '*.tfvars' '.terraform/' > .gitignoreここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
秘密を埋めて探す
printf '%s\n' 'locals {' ' api_token = "moon42"' '}' > leak.tf; grep -nE '(token|secret|password|key)[a-z_]* *= *"' *.tf; rm leak.tfここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
秘密の検索をPythonで
# ファイルそのものに、秘密の値を書いている行を探します。
lines = [
'region = "eu-west-2"',
'api_token = "moon42"',
'api_token = var.api_token',
]
words = ["token", "secret", "password", "key"]
number = 0
for line in lines:
number = number + 1
name = line.split("=")[0].strip().lower()
value = line.split("=")[1].strip()
has_word = False
for word in words:
if word in name:
has_word = True
if has_word and value.startswith('"'):
print("行", number, "は", name, "に値を書いています")
# 3行目を引用符つきの値に変えて、もう一度見てみましょう。
さらに進む: 変数ファイル
secret.tfvars というファイルに token = "sun77" と書きます。tofu plan -no-color -var-file=secret.tfvars | grep -E "input|^Plan" を実行し、そのあとファイルを消します。
*.tfvars が除外ファイルにあるのはなぜですか。planは新しい値を表示しますか。