去年のファイルにあるパスワード
新人の開発者が、テストのために、決済サービスのパスワードをファイルに書きました。そのファイルをコミットしました。翌朝、その1行を消して、もう一度コミットしました。
これで消えたと、みんな思っていました。1年後、見知らぬ人が、ファイルの古い版を読みました。パスワードは、まだ使えました。
たった1つのルール
注意
探してよいのは、自分専用のラボのコピーだけです。このラボは、偽の秘密をわざと隠したアプリで、インターネットにはつながっていません。他人のサイトやコード置き場で秘密を探したり使ったりすると、不正アクセス禁止法に触れる犯罪になります。
このレッスンのゴール
メモ
置き場所を間違えた秘密を見つけ、どこに置くべきかを言える。
今日のキーワード
| ことば | いみ | れい |
|---|---|---|
| 秘密 | 人に知られてはいけない、パスワードや鍵やトークンです。 | |
| 環境変数 | プログラムの起動時に渡す、名前つきの設定です。 | DB_PASSWORD |
| シークレット管理 | 許された人やプログラムにだけ、秘密を渡す鍵つきの置き場です。 | |
| コミット履歴 | コード置き場にある、すべてのファイルの過去の版です。 | |
| ローテーション | 秘密を新しいものに取り替えることです。 | |
| コンテナイメージ | プログラムと必要なファイルを、まとめて詰めたものです。 |
学生が入力するセルは、このプレビューでは空白です。
秘密はいろいろな所から漏れる
秘密は、渡すつもりのない人が、そのコピーを読める所なら、どこからでも漏れます。コードは、その1つにすぎません。
ソースのファイル、古いコミット、コンテナイメージ。設定ファイル、ログ、そして利用者全員のブラウザに送るスクリプトにも残ります。ブラウザが必要とする秘密は、全員が持つ秘密です。
例: コピーがある場所
| 場所 | 読める人 | よい方法 |
|---|---|---|
| ソースのファイル | コードを持つ全員 | 環境から読む |
| 古いコミット | 履歴のコピーを持つ全員 | 取り替えてから、履歴を消す |
| コンテナイメージ | イメージを取れる全員 | ビルド時でなく、実行時に渡す |
| ブラウザに送るスクリプト | 訪れた全員 | サーバーの中に置く |
| ログのファイル | ログを読める全員 | 秘密を書き出さない |
学生が入力するセルは、このプレビューでは空白です。
ラボのアプリを見る
ラボでは WrongSecrets が動いています。起動して、次の3つを実行しましょう。どれも見るだけです。
1つ目は、アプリが元気かを尋ねます。2つ目は、誰にでも見せている管理用のページを尋ねます。3つ目は、全員に送るスクリプトの先頭を表示します。
アプリは元気か
curl -s -w "\n" http://wrongsecrets:8080/actuator/healthここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
管理用のページの一覧
curl -s http://wrongsecrets:8080/actuator | grep -o 'actuator/[a-z]*' | sort -uここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
全員に送るスクリプトの先頭
curl -s http://wrongsecrets:8080/js/index.js | head -n 1 | cut -c 1-120ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
3つの答えを読む
1つ目は、"status":"UP" で終わる短い行を表示します。2つ目は、auditevents、health、info の3つの名前です。見知らぬ人に読ませたくないのは、どれでしょうか。
3つ目は、崩れて見えるコードです。崩してあるだけで、鍵はかかっていません。ブラウザが全部を読んで動かすので、あなたにも読めます。
よくある間違い
注意
「ファイルから消せば、秘密は消える」と考える人がいます。それは違います。古い版は履歴に残り、すべてのコピーと、前に作ったイメージにも残ります。一度でも外に出た秘密は、使い終わったものと考えます。先に取り替えます。片づけは、そのあとです。
秘密は専用の置き場に
プログラムは、起動のときに秘密を求めます。シークレット管理が、誰が求めているかを確かめて、渡します。コードにもイメージにも、何も書きません。
プログラムごとに、必要な秘密だけを渡します。計画を立てて取り替えれば、漏れても使える時間が短くなります。
秘密には見つけやすい形がある
秘密の多くは、似た形をしています。クラウドの鍵は AKIA で始まり、20文字の英数字です。秘密鍵のファイルは、ハイフンの行と BEGIN で始まります。password = "..." のような行には、値が入っています。
スキャナーは、コードと履歴からこうした形を探します。多くは見つかりますが、全部ではありません。見つかったら、取り替えるきっかけにします。
小さなスキャナー
lines = [
"name = shop",
"key = AKIAABCDEFGHIJKLMNOP",
"password = hunter22",
]
# 秘密の形を持つ4行目を足して、実行します。
number = 0
for line in lines:
number = number + 1
if "AKIA" in line or "password" in line:
print("確認する行:", number)