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

無料レッスン

パスワードやAPIキーの置き場所を正す

このレッスンのあとで: 置き場所を間違えた秘密を見つけ、どこに置くべきかを言える。

55分のレッスンコマンド3件WrongSecrets のラボ:埋め込まれた秘密情報を見つけ、保管の正しい場所を学ぶ

去年のファイルにあるパスワード

新人の開発者が、テストのために、決済サービスのパスワードをファイルに書きました。そのファイルをコミットしました。翌朝、その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 = "..." のような行には、値が入っています。

スキャナーは、コードと履歴からこうした形を探します。多くは見つかりますが、全部ではありません。見つかったら、取り替えるきっかけにします。

小さなスキャナー

コード: python
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)

このラボとソースについて: WrongSecrets のラボ:埋め込まれた秘密情報を見つけ、保管の正しい場所を学ぶ

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