セキュリティの基礎
Security Basics
システム設計で最低限押さえるべきセキュリティの基礎4点。通信と保存の暗号化、入力のサニタイズ、パラメータ化クエリ、最小権限の原則。
設計者が最低限守る4つの基礎
セキュリティは非常に広い分野ですが、System Design Primerは『専門職でなければ、まず基礎を押さえれば十分』としています。その基礎が次の4点です。
図を描画中...
① 転送時・保存時の暗号化
- 転送時(in transit): 通信を盗み見られないようHTTPS等で暗号化。郵便でいえば、中身が見えない封筒に入れて送るイメージ。
- 保存時(at rest): DBやディスクに保存するデータも暗号化。万一ストレージを盗まれても中身が読めない。
両方やって初めて『通信中も保管中も安全』になります。
② 全ユーザー入力のサニタイズ
ユーザーが入力する値はすべて疑う。悪意ある入力(スクリプトやSQL文)が紛れ込むと、XSS(他人のブラウザで悪意あるスクリプトを実行させる攻撃)やSQLインジェクションを許してしまいます。入力を無害化(サニタイズ)してから扱います。
例: 名前欄に
<script>悪意あるコード</script>を入れられても、そのまま画面に出さない。
③ パラメータ化クエリ
SQLインジェクション対策の王道。ユーザー入力をSQL文に直接連結しないで、プレースホルダ経由で渡します。
// 危険(文字列連結): 入力に ' OR '1'='1 を入れられると突破される
"SELECT * FROM users WHERE name = '" + input + "'"
// 安全(パラメータ化): 入力は『データ』として扱われSQLとして解釈されない
"SELECT * FROM users WHERE name = ?", [input]
パラメータ化すると、入力がどんなに悪意あるSQL文に見えても『ただのデータ』として扱われ、攻撃が成立しません。
④ 最小権限の原則
各ユーザー・各サービスに、仕事に必要な最小限の権限だけを与えます。全員に管理者権限を渡すのは、全部屋のマスターキーを全社員に配るようなもの。1人のアカウントが乗っ取られても被害を最小化できます。
つまずきポイント
- サニタイズとパラメータ化クエリは『どちらか』ではなく『両方』。XSSは出力時のエスケープ、SQLインジェクションはパラメータ化、と対策レイヤーが違う。
- 『暗号化』は転送時だけで満足しがちだが、保存時も忘れない。両方そろって初めて意味がある。
- このセクションはあくまで基礎。本格的なセキュリティ(認証認可の詳細、OWASP Top Ten対策など)はより深い学習が必要。
📊 図解
入力が処理に届くまでの多層防御(フローチャート)
サニタイズ・パラメータ化・最小権限が、それぞれ別レイヤーで守ります。
図を描画中...