Flatt Security Blog

株式会社Flatt Securityの公式ブログです。プロダクト開発やプロダクトセキュリティに関する技術的な知見・トレンドを伝える記事を発信しています。

株式会社Flatt Securityの公式ブログです。
プロダクト開発やプロダクトセキュリティに関する技術的な知見・トレンドを伝える記事を発信しています。

Web開発者はもっと「安全なウェブサイトの作り方」を読むべき

画像出典: https://www.ipa.go.jp/files/000017316.pdf

こんにちは。株式会社Flatt Security セキュリティエンジニアの奥山です。

本稿では、独立行政法人 情報処理推進機構(以下、IPA)が公開している資料「安全なウェブサイトの作り方」を紹介します。

「安全なウェブサイトの作り方」は、無料で公開されているにも関わらず、Webセキュリティを学ぶ上で非常に有用な資料です。これからWeb開発やセキュリティを勉強したいと考えている方はもちろん、まだ読んだことのない開発者の方々にも、ぜひ一度目を通していただけたらと思います。

一方、「安全なウェブサイトの作り方」では、一部にモダンなアプリケーションには最適化されていない情報や対象としていない範囲が存在します。それらについても本記事で一部、触れていきたいと考えていますので、資料を読む際の参考にしていただけたら幸いです。

「安全なウェブサイトの作り方」とは

「安全なウェブサイトの作り方」とは、IPAが届出件数の多い脆弱性を取り上げ、適切にセキュリティを考慮したWebサイトを作成できるように提供している資料です。IPAはインターネット利用者の被害予防を目的として、2014年から脆弱性関連情報の届出を受け付けています。届出情報の中から届出件数の多い脆弱性を取り上げ、脆弱性の説明や想定される被害や対策などを示しています。

2006年に初版が掲載されて以来、継続的に更新が行われています。現在公開されているものは、2015年に公開された第7版です。

以前はPDF版のみでしたが、2020年に代表的な脆弱性の解説と対策をまとめた第1章のHTML版が公開されました。HTML版は脆弱性ごとにリンクが分けられているため、PDF版と比べて手軽に参照することができます。

「安全なウェブサイトの作り方」はオススメなのにあまり読まれていない?

※Tweet投稿者の方の許可を得て掲載しています

「安全なウェブサイトの作り方」はとても有用性のある資料ですが、知名度が低く、あまり読まれていないように感じます。時折、「安全なウェブサイトの作り方」はもっと読まれてほしいといった呟きを見かけることもあり、私自身も十分に認知されていないと感じています。

しかし、「安全なウェブサイトの作り方」は、無料でWebセキュリティの基礎知識を習得することができ、かつ、公開元が公的機関であるため内容に信頼をおけます。特に、Webセキュリティの基礎知識については、普段Web診断をしていても、十分な認知が世間に広まっていないと感じる部分でもあります。

本稿を読んで、少しでも「安全なウェブサイトの作り方」やWebセキュリティの基礎知識が広く認知されればと思います。

フレームワークとWebセキュリティの関係

昨今のDjangoやRuby on RailsといったWebフレームワークでは、実装の不備で起こる基本的な脆弱性が組み込まれないよう、事前に対策を講じてくれていることがあります。「安全なウェブサイトの作り方」に取り上げられている内容は、頻出の脆弱性や基本的なものが多いです。そのため、フレームワークを使えばある程度の脆弱性は事前に防ぐことが可能です。

それなら今更安全なウェブサイトの作り方を読む必要はないじゃないか、と思う方もいらっしゃるかもしれません。しかし、フレームワークとて全ての脆弱性の発生を防ぐことはできません。

そして何より、普段フレームワークが補ってくれている部分だからこそ、読んでみることをお勧めします。フレームワークは心強いパートナーですが、万能ではなく、開発者が気をつけなければいけない点もあります。セキュリティをより意識した開発を行うためにも、普段フレームワークが担ってくれているセキュリティの基礎的な部分を理解してみることがセキュアな開発につながると思います。

弊社Flatt Securityは、攻撃を体験する「ハッキング演習」や脆弱なソースコードを修正する「堅牢化演習」を通してWebセキュリティを学習できるプラットフォーム「KENRO」を提供していますが、ウォンテッドリー株式会社様が「KENRO」を導入された理由も同様のものでした。

Ruby on Railsはよくできているフレームワークです。普通に使っているうちは脆弱性も生まれにくいでしょう。 しかし、だからこそフレームワークが担ってくれている基礎的な部分をエンジニアが学ぶ機会が少ないのです。そうなるとRailsの標準的な使い方から外れて行った時に、どのようにすればセキュアに開発できるかわからなくなってしまいます。 例えばフロントエンドのコードベースが別リポジトリに分かれたり、GraphQLのゲートウェイを挟んだり…といった場合ですね。

宣伝になりますが、無料・無期限のトライアルは下のバナーより登録できます。

「安全なウェブサイトの作り方」 2つの特徴

画像出典: https://www.ipa.go.jp/files/000017316.pdf

「安全なウェブサイトの作り方」の特徴を具体的に二つ紹介します。

一つ目は、IPAへの脆弱性届出情報をもとにしている点です。IPAに提出された届出数が多いものを取り上げており、その脆弱性が届出数全体の何割を占めるか、発見されたのはWebサイトかソフトウェアか、該当するJVN(Japan Vulnerability Notes)のリンク等が記載されています。

ただ、安全なウェブサイトの作り方に記載されている内容は2014年までの届出件数をもとに作成されていて、少し古い情報です。IPAが別に公開している「脆弱性関連情報の届出状況 」にて最新情報が掲載されているので、一緒に目を通してみると、世の中で脆弱性がどのくらい発見されているかを知ることができます。

二つ目は、脆弱性の根本的解決策だけでなく、保険的対策が記載されている点です。一般的な技術書等では、脆弱性を作らないようにする方法( = 根本的対策)だけが記載されていることが多いです。

もちろん、設計段階から根本的な対策の手法を採用して開発していくことができれば、それに越したことはありませんが、人はどうしても間違いを起こしてしまう生き物です。過去に作ったWebサイトに脆弱性が見つかってしまうこともあるでしょう。すぐに根本的な対策を取れるならばそれが一番ですが、仕様上どうしても対策に時間がかかってしまうこともあります。そのような場合の一時的な対策として保険的対策を講じることで被害を最小化することができます。

ただし、繰り返しになりますが、あくまでも保険的対策は一時的な被害を軽減する対策であり、脆弱性そのものをなくすことはできません。設計段階からセキュリティを意識した開発を行い、脆弱性が発見された場合には早急に根本的な対策を講じましょう。

読み方の手引き

「安全なウェブサイトの作り方」は全部で115ページあり、別冊の「安全なSQLの呼び出し方」、「ウェブ健康診断仕様」も合わせると180ページ越えのボリュームたっぷりなドキュメントとなっています。これら全てにしっかり目を通すのが理想的ですが、そんな時間はない、基本は知っているから大事なところだけ抑えておきたい、どこから読んでいいか分からない、という方向けに抑えておきたいポイントと読み方の一例を紹介します。

画像出典: https://www.ipa.go.jp/security/vuln/websecurity.html

まず、「安全なウェブサイトの作り方」の構成についてです。1章では基本的な脆弱性の説明と脅威、対策等を紹介しています。2章ではWebサイト全体の安全性を向上するための対策として、WebサーバやDNSにおける対策をまとめ、3章では脆弱性を作り込んでしまった失敗例を紹介しています。

2章や3章については運用面での対策やコードベースの脆弱性に触れているなど、上級者向けの内容となっているため、まずは1章の部分を読むことをおすすめします。その上で、よりくわしい対策や実装について知りたい方や開発者の方は2章3章と読み進めていき、別冊の「安全なSQLの呼び出し方」も読んでみると安全な実装に役立ちます。

一通り目を通した後は、別冊の「ウェブ健康診断仕様」を参考に自身のプロダクトに脆弱性がないかチェックしてみましょう。特に、Webサーバに攻撃者が直接攻撃するだけで成立する能動的な攻撃は優先的に確認してみるといいでしょう。「SQLインジェクション」や「OSコマンドインジェクション」などが能動的な攻撃に該当します。もし脆弱性が見つかってしまった場合には、「安全なウェブサイトの作り方」の1章に記載されている対策を参考に対処することで、安全性を向上させることができます。

画像出典: https://www.ipa.go.jp/files/000017319.pdf

診断行為を行うときの注意点

診断をする際は、自身の所有するプロダクト以外には絶対に無許可で行わないことに注意しましょう。他人のプロダクトに無断で診断行為を行った場合、不正アクセス禁止法により処罰の対象になる可能性があります。

診断行為を実践してみたいときには、世の中では「やられアプリ」と呼ばれるデモ環境が提供されているので、それらを使用しましょう。例えば、「OWASP WebGoat」などが有名です。

また、診断により意図せずデータベースが破壊されてしまう場合があるので、自身の所有するプロダクトであっても、本番環境に対する診断は避けましょう。他にも、ウェブ健康診断仕様の注意事項にも気を付けなければいけないことが記載されているので併せて確認しましょう。

ウェブ健康診断仕様に記載されている診断方法は基本的なものかつ、簡易的な診断になるので、全ての脆弱性を検査することはできません。個人で行う診断には限界があるため、より詳細な診断を行いたい場合は専門の診断会社に依頼をしましょう。

Flatt Securityもセキュリティ診断サービスを提供しています。  

「安全なウェブサイトの作り方」が対象としていない点

ここまで「安全なウェブサイトの作り方」をおすすめしてきましたが、一口にWebセキュリティと言っても広範なので資料が対象としていない部分もあります。それらをいくつか紹介します。

Webアプリケーション次第では、「安全なウェブサイトの作り方」で取り上げられている脆弱性以外にも注意しなければいけない場合があります。例えば、ユーザが画像をアップロード可能な機能を持ったWebアプリケーションなら、アップロードされた画像を正しく処理する必要があります。

また、Webアプリケーションの仕様によって起こる脆弱性についても記載がありません。仕様によって起きる脆弱性とは、例えば、「ログイン失敗時に登録済みメールアドレスと未登録のメールアドレスでレスポンスに差がある場合に、メールアドレスがデータベース上に存在していることが分かってしまう」のような脆弱性になります。

弊社ブログにて、「安全なウェブサイトの作り方」にて取り上げられていない脆弱性やWebアプリケーションへの攻撃に関して解説しています。あわせて読んでいただき、参考にしていただけると幸いです。

「Webサービスにおけるファイルアップロード機能の仕様パターンとセキュリティ観点」

「Webサービスにおけるログイン機能の仕様とセキュリティ観点」

また、現代はAWS・GCP・Azureといったクラウド環境を使用する場合がほとんどだと思います。この場合、クラウド環境特有の設定に気を付ける必要があります。クラウド環境におけるセキュリティでは自社でサーバを用意するオンプレミスとは異なる観点が必要になりますが、残念ながら「安全なウェブサイトの作り方」には記載がありません。

同様に、SPAやGraphQLのようなモダンなWeb技術については、一般的なWebアプリケーションとは異なるセキュリティ観点に気をつける必要がありますが、「安全なウェブサイトの作り方」では触れられていません。

クラウドのセキュリティに関しては、欧州ENISAのクラウドのセキュリティに関するガイドラインを翻訳したものをIPAが公開しています。(https://www.ipa.go.jp/security/publications/enisa/cloudsecurityguide.html)

終わりに

本稿では、IPAが公開している「安全なウェブサイトの作り方」を紹介しました。 セキュリティに携わる方や開発者の方には当たり前の内容になってしまったかもしれませんが、少しでもお役に立てたり、この記事を通して、「安全なウェブサイトの作り方」をより多くの方に読んでいただき、Webセキュリティ向上の一助となれば幸いです。

先述したように、Flatt Securityではセキュリティ診断サービスを提供しています。一般的なWebアプリケーションだけでなく、SPAやGraphQLのようなモダンなWeb技術、AWSのようなクラウドプラットフォーム、FirebaseのようなmBaaSまで幅広く専門家による調査を提供可能です。また、事後的な診断に限らず開発段階でのコンサルティングも対応可能です。

上記のデータが示すように、診断は幅広いご予算帯に応じて実施が可能です。ご興味のある方向けに下記バナーより料金に関する資料もダウンロード可能です。

また、Flatt Securityはセキュリティに関する様々な発信を行っています。 最新情報を見逃さないよう、公式Twitterのフォローをぜひお願いします!

twitter.com

ここまでお読みいただきありがとうございました。