SDN
← 概念一覧へ
セキュリティ

セキュリティの基礎

Security Basics

システム設計で最低限押さえるべきセキュリティの基礎4点。通信と保存の暗号化、入力のサニタイズ、パラメータ化クエリ、最小権限の原則。

キーポイント
  • 転送時・保存時の暗号化(Encrypt in transit and at rest): 通信路と保存データの両方を暗号化する。
  • 全ユーザー入力のサニタイズ: XSS(悪意あるスクリプト注入)やSQLインジェクションを防ぐ。
  • パラメータ化クエリ: SQLインジェクションを防ぐ、安全なクエリの書き方。
  • 最小権限の原則(principle of least privilege): 各人・各サービスに必要最小限の権限だけを与える。
  • 参考: API security checklist、OWASP Top Ten。
トレードオフ

暗号化や入力検証はわずかな性能コストを伴うが、セキュリティ確保のため必須。セキュリティは奥が深い分野で、本格的には専門家の領域だが、設計者が最低限この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対策など)はより深い学習が必要。

📊 図解

入力が処理に届くまでの多層防御(フローチャート)

サニタイズ・パラメータ化・最小権限が、それぞれ別レイヤーで守ります。

図を描画中...

関連する概念

この概念で腕試し

関連する 47 問のクイズに挑戦できます。

クイズを解く