入門

パート 10

秘密情報、セッション、信頼:すべての値をスクリプトに入れない

便利な値をすべて単なる文字列として扱うと、自動化は危険になります。パスワード、秘密鍵、Cookie、認証状態は、パスや画像サイズ、テーブル名とは異なる扱いが必要です。

自動化する前に値を分類する

パス、アーカイブ名、画像幅は通常の設定値です。パスワード、秘密鍵、セッショントークン、データベース認証情報はアクセス権につながります。両方を同じ再利用スクリプトへ入れると、そのスクリプト自体が秘密情報になります。

値を保存する前に二つ問いかけます。この値は何かを認可できるか。このファイルを別プロジェクトへコピーしたり確認のため共有したりしても平気か。答えが「いいえ」なら、秘密情報は手順の外に置きます。

環境情報は確認に使うもので、秘密情報の保管庫ではない

env は機密情報らしい名前の値を意図的にマスクします。これは表示上の安全策であり、すべての環境変数が安全だとか、予想外の名前に秘密情報がないことを保証するものではありません。

必要な名前空間や値だけを確認します。環境全体の出力をスクリーンショットやエクスポートに残さず、値がマスクされているからといって実際のサーバー設定を公開しないでください。

env
env server
env request

セッションとCookieはアプリケーション状態であり、メモ帳ではない

ses は階層的な PHP セッションデータを示し、coo は Cookie を別の領域として扱います。保護された認証 Cookie やセッション Cookie は、通常のエクスポートや上書き操作から除外されます。

セッションデータには識別情報、認可、一時的なアプリケーション状態が含まれ得るため、この境界は重要です。狭く確認し、自分が所有する名前空間だけを変更し、長期秘密情報の隠し場所としてセッション保存領域を使わないようにします。

ses -l
coo
coo -a

ハッシュは同一性を確認できても、元データを隠せない

hash はダイジェストとHMACを計算します。ダイジェストは「このバイトは変わったか」を答えたり、アーカイブやリリース成果物の識別情報を記録したりするのに向いています。

ハッシュ化は暗号化ではありません。元の値が小さく推測しやすい集合から来るなら、ハッシュだけで機密性は得られません。真正性を秘密鍵に結び付ける必要があるときは HMAC、内容自体を読めなくする必要があるときは暗号化を使います。

hash -s "hello terminal"
hash

暗号化が内容を守れるのは、鍵も守られている間だけ

enc は認証付き暗号方式、非表示パスワード入力欄、固定キーモードを使います。まず enc でサーバーが対応する方式を確認します。通常のパスワード入力欄ならパスワードは表示中コマンド履歴に残りません。

暗号化済みファイルと露出した鍵を同じ場所に置いても十分な保護にはなりません。可能なら鍵と暗号化済みデータを異なる信頼境界に置き、復旧方法を理解し、平文の元データを削除する前に実際に復号できることを確認します。

enc

ファイルシステム権限はアクセスを減らすが、暗号技術の代わりではない

0600 のようなモードは、通常の読み書きを現在のファイルシステム所有者だけに限定する意図を示します。ホスティングファイルシステムがUNIX のアクセスモードを尊重する環境では、ローカルの鍵ファイルや非公開エクスポートに有用です。

権限はホスティングアカウント所有者、バックアップ、侵害されたPHP プロセスからデータを守れません。mod の後は stat で実際に何が変わったか確認し、権限を適切な保存領域モデルや暗号化と組み合わせます。

cd lil-playground
md trust
echo "example private note" > trust/note.txt -r
mod trust/note.txt -0600
stat trust/note.txt
hash trust/note.txt

片付け、アンインストール、完全削除を区別する

clear は表示中の履歴だけを消します。uninstall <module> は拡張モジュールを外します。kill -include は任意のインターフェース層、kill -install は拡張層を取り除き、オプションなしの kill はターミナル全体を削除する最後の境界です。

これらを同じ手癖にしないでください。破壊的な操作の前に、どの層を消すのか、どのファイルは残るべきかを言葉にします。安全な操作とは、実行する前に復旧手順を説明できる操作です。

表示だけを消すclear表示履歴だけ。ファイルとモジュールは残る
モジュールを削除uninstall <module>拡張モジュール一つ。依存関係の規則が適用される
インターフェースをリセットkill -include永続/セッション CSS・JavaScript 層
拡張をリセットkill -installインストール済み拡張層。Coreは残る
完全削除killlil-terminal のインストールそのもの

スクリプトとして残す

これを trust-checkpoint.lil として保存します。練習用データだけを作り、厳しいファイルモードを適用し、メタデータとダイジェストを記録します。意図的に自動化しないものにも注目してください。パスワード入力と復号鍵はスクリプトの外に残します。

#lil
@install md echo mod stat hash
cd lil-playground
md trust
echo "example private note" > trust/note.txt -r
mod trust/note.txt -0600
stat trust/note.txt
hash trust/note.txt > trust/note.sha256 -r
stat trust/note.sha256