クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

秘密をコードの外に置く

このレッスンのあとで: 秘密をOpenTofuのファイルの外に置き、それでも残る場所を言える。

60分のレッスンコマンド10件OpenTofu のラボ:プラン、apply、ステートで学ぶ Infrastructure as Code を1台の VM で

トップページに載った鍵

学生がプロジェクトを公開リポジトリに上げました。最初のテストが動いたので、アクセスキーがファイルに入ったままです。

公開リポジトリを一日中読むプログラムが、数分でそれを見つけます。ファイルの中の鍵は誰でも使えます。ファイルを直しても、履歴には残ります。

このレッスンのゴール

メモ

秘密をOpenTofuのファイルの外に置き、それでも残る場所を言える。

重要な言葉

ことばいみれい
秘密他の人に見せない値。鍵など
sensitive画面で値を隠すための印sensitive = true
環境変数シェルがコマンドに渡す値TF_VAR_token
stateOpenTofuが作ったものを記録するファイル
除外ファイルバージョン管理が無視するファイルの一覧.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で

コード: 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は新しい値を表示しますか。

このラボとソースについて: OpenTofu のラボ:プラン、apply、ステートで学ぶ Infrastructure as Code を1台の VM で

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。