エンターテイメント!!

遊戯王好きのJavaエンジニアのブログ。バーニングソウルを会得する特訓中。

【翻訳+意訳・要約】コードを強化する方法 開発者にとって不可欠な安全設計の原則

原文

How to Strengthen Your Code: Essential Secure Design Principles for Developers

意訳+要約

Saltzer と Schroeder が概説した 8 つの基本原則と 2 つの追加原則が紹介されています。

重要で安全な設計原則

  1. 効率的なメカニズム
  2. 不要なアクセス パスを最小限に抑え、設計をシンプルかつコンパクトに保つ​​
  3. シンプル化のメリット
    • 脆弱性の検査が容易
    • 攻撃対象領域が減る
    • 悪用される機会が減る
  4. 簡潔なハック的な記述は、時として混乱を招く可能性がある
  5. 簡潔さよりもクリーンなコードが優先
  6. フェイルセーフのデフォルト
  7. アクセスの決定は、除外ではなく許可に基づいて行う
  8. 許可ベースなら、ミスが起きても情報は守れる可能性が高い
  9. 除外ベースだと、エラーにより不正アクセスが発生する可能性がある
  10. 完全な調停
  11. データへのアクセスは、必ず権限チェックを受ける
  12. 権限に関する変更は即座に反映させる必要がある
  13. オープン設計の原則
  14. 暗号化システムのセキュリティはキーの秘密性のみに依存し、アルゴリズム自体は公開されるべき
  15. 効果的なセキュリティ設計は、実装をひどくすることはNG
  16. 隠蔽による安全性の確保は、根本的に間違い
    • リバース エンジニアリングのリスク
    • 設計文書が入手されるリスク
    • セキュリティ監査とレビューの複雑化
  17. 権限の分離
  18. 複数の保護層
    • 異なるメカニズムを使用する必要が
  19. すべてにアクセスできるスーパーユーザーに依存するのではなく、特殊な役割と権限を持つユーザーを作成する必要がある
  20. 最小権限
  21. 必要最小限の権限のみを与え、攻撃の影響を減らす
  22. デフォルトですべての権限を拒否し、必要に応じて段階的に権限を付与する
  23. 最も一般的でないメカニズム
  24. ユーザー間で共有されるメカニズムは最小限に抑える
  25. コンポーネント間の依存関係は、1 つが侵害されると広範囲に影響を受ける
  26. 共通変数を含むコンポーネントは、セキュリティ リスクを生み出す可能性が高い
  27. 心理的受容性
  28. 使いやすいUIを提供し、ユーザーが回避策を模索しないようにする
  29. セキュリティとユーザビリティは、トレードオフの関係にあるので、妥協点を探してバランスを取る
  30. 作業要因
  31. 攻撃者の動機と資産の価値を考慮して、セキュリティ対策を行う
  32. 過度なコストをかけすぎない
  33. 侵害の記録
  34. 効果的なログ記録と証拠収集
  35. 攻撃に気付かなければ、結果は深刻になる可能性がある
  36. 侵害を検出することは、損害を最小限に抑え、インシデント対応を促進するために必要

関連リンク

セキュア・プログラミング講座 IPA

コンピューターセキュリティにおける基本原則:Saltzer & Schroederの8原則 | emgr

感想+雑記

内容は一読して要約したつもりだけど、ちゃんと理解できているかは怪しいな。。。
特に、オープン設計の原則。言わんとしてることは分かるんだけど、秘匿の方が安全では?って思ってしまう。

普段心がけているクリーンコードが、最終的にセキュリティも高めてる認識でいる。
結局、シンプルかつ無駄のない実装が、影響範囲を局所化したり、無駄な脆弱スポットの作成を防止してくれるのだと思ってる。
効率的なメカニズムで言われているハック的な記述は、たまにしてしまうことがあるので、注意したい。アレを書くと、なんか自分がすごいヤツっぽく感じてしまうんだよねぇ。。。
三者視点がないと、陥りがちな気がする。

あと、だいたい言っていることがISMSに似てるなぁ~とは感じた。