ぽらろいどの日記

新しい知見を得たり、得られた知見を記録したり共有したりする場を予定しています。

【本の感想】『セキュア・バイ・デザイン』セキュリティと少し親しくなれる本

読んだ本

内容

内容紹介より、目次(一部インデント追加)。

第1部: 導入編

 第1章: なぜ、設計がセキュリティにおいて重要なのか?

 第2章: ちょっと休憩: 『ハムレット』の悲劇

第2部: 基礎編

 第3章: ドメイン駆動設計の中核を成すコンセプト

 第4章: 安全性を確立する実装テクニック

 第5章: ドメイン・プリミティブ(domain primitive)

 第6章: 状態の完全性(integrity)の保証

 第7章: 状態の複雑さの軽減

 第8章: セキュリティを意識したデリバリ・パイプライン

 第9章: 安全性を考えた処理失敗時の対策

 第10章: クラウド的考え方によるメリット

 第11章: ちょっと休憩: 保険料の支払いなしに成立してしまった保険契約

第3部: 応用編

 第12章: レガシー・コードへの適用

 第13章: マイクロサービスでの指針

 第14章: 最後に:セキュリティを忘れるべからず!

まえがきでの説明(p.xii)。

本書の第一の目的となるのは、ソフトウェアの設計とセキュリティがどのように結びつくのかを探求していくことです。(…)本書では、なぜ、特定の設計を選択することがセキュリティにおいて重要となるのか、そして、どのような設計を行うことで安全なソフトウェアを構築できるのか、ということについて学んでいきます。

感想

総じて、以下の点が良かった。

  • セキュリティが、より身近に感じられる
  • 安全な設計への理解を深められる
    • DDDに関連して、ドメインを理解することの重要性、及びそれを通じた凝集度向上
    • 契約による設計、単体テスト、Result型など安全な設計への理解

特に「セキュリティが、より身近に感じられる」については、本書で以下のように述べられているが、今振り返ると、実際に筆者の言うとおりになったように感じる。

多くの開発者はソフトウェアの脆弱性を難解なものとして見ており、(…)そのため、自分自身をセキュリティ対策を行う人物としては捉えておらず、セキュリティ対策はそのことについて詳しい誰か別の人に任せてしまうことが最善だと考える傾向にあります。(…)

(筆者注:設計によって安全性を確立できることが分かれば)セキュリティはその専門家だけが扱うものではなく、ソフトウェアに関わるすべての人の心配事となり、興味の対象となります。(p.26)

自身は開発に関して初学者だと思うが、それでも上記の影響を受けたため、読んで良かったと思った。

詳述

セキュリティが、より身近に感じられる

本書では「設計に対して軽率な判断を下すと、どのようなセキュリティの問題が発生するか」を紹介していて、それによってセキュリティ及びその重要性が身近に感じられた。

例えば、本書では軽率な判断として以下のような例を挙げている。

  • XMLパーサの挙動(pp.30-42)
    • よく考慮せずエンティティの展開を許容することで、Billion Laughs攻撃につながる
  • 汎用的なデータ表現(pp.55-61)
    • 本の購入冊数を単なるintで表現してしまうと、カートにマイナスの冊数の本を含めることが可能になり、購入する本の総額を減らす悪用に繋がりかねない

以上のような例の解説を通じて、普段自分が行っている個々の設計判断が、どんなセキュリティ問題を生んでいるのかを理解できる。

セキュリティの例が決して難解で遠いものではなく、むしろ自分が普段行うコーディングに関わるものとして示されており、自分もセキュリティ問題に関わっているということが理解しやすい。

安全な設計への理解を深められる

加えて、上記の問題に対して、どのように対処するのかも本書では解説している。

例えばXMLパーサについては、XMLそのものの理解もさることながら、以下のような対処も挙げている。

  • 事前に受け取ったデータへの妥当性確認を行い、そこで排除する
  • XMLの解析を他のプロセスと切り離して行うバルクヘッド・パターンを採用する

これらの対処例もまた普段の設計に関するものが多く取り上げられており、「セキュリティ問題に取り組んでいかなければ」と思うようになったあとですぐに実践に移すことが出来ると感じた。

個人的には特に第5章のドメイン・プリミティブと第9章の例外処理がすぐに活用しやすいと思ったが、他にも変数の不変性や妥当性確認、Result型についても触れられており、これらへの理解を深められたのが良かった。

また、新規開発での活用だけでなく、第12章で「レガシー・コードへの適用」、第13章で「マイクロサービスでの指針」について説明しているので、既存のコード改善に適用するアイデアも豊富で、こちらも活用しやすいのではないかと感じた。

個人的な問題

個人的、かつ本書の部分的な問題としては、あまり関わっていない部分については理解が浅くなると感じた。クラウド関連やエンティティ関連はまだ経験が薄いところがあり、そのため実践に向けての理解を進めるのが難しかった。

内容も分厚く、最終章の終わりがp.530なので、全てを読もうとした場合はある程度時間を要することになると思われるが、この点についても上記と関連して半ば流し読みしてしまう点があり、理解が進められていないと感じた。

これらに関しては、後ほど関わりを得たときに都度詳細を読み返して、理解を広げていきたい。

まとめ

自分にとって本書の一番良かったところは、セキュリティへの関心が高められた点だと思う。

セキュリティが難解なものだという印象はあまり変化していないが、それが大きな一枚岩なのではなく幾つかの層から成っていて、自分でも取り組める箇所があるということが分かったのが非常に良かった。

その上で実践に結びつけられる設計パターンの紹介もあるため、すぐに知識を活用しやすいのがありがたかった。

「セキュリティは難しそう…」と思っているひとは、本書を読むことで「自分にもできることがあるかも!」と思えるのではないかと感じた。