情報セキュリティの中で、最も注視される領域がインターネットを使うWebシステムのセキュリティです。拡大しているECサイトやWebサービスでは、誰でも使える「インターネット」を介してアクセスされます。顧客を獲得する機会が多いメリットの反面、悪意を持った人たちからのアクセスも許してしまうリスクがあります。これを抑止するためにWebセキュリティが必要とされます。
■ Webシステムとは
コンピュータの画面であるGUI(Graphical User Interface)をHTML(HyperText Markup Language)によって文字で記述できるようにし、この技術を使った構築したクライアント・サーバ型のシステムのことです。
クライアントは、HTMLを解釈してGUIを表示するブラウザと、サーバは、ブラウザから要求されたHTMLを返却するWebサーバで構成されます。
ブラウザとWebサーバとの間は、HTTP(HyperText Transfer Protocol)によって通信されます。手順は、URL(Uniform Resource Locator)によって取得したいHTMLファイルを指定し、Webサーバは、指定されたHTMLファイルを転送します。この手順で使われるのがインターネットプロトコルと呼ばれるTCP/IPです。
Webサーバの基本機能は、HTMLファイルを管理し、それをHTTPによって転送するだけです。その他、Webサーバ内で、プログラムを実行した結果をHTMLファイルに変換して転送する機能があります。このようなプログラムをCGI(Common Gateway Interface)と呼ばれます。
コンパイルが不要なPHP、Ruby、VB、C#、Pythonなどのスクリプト言語によってプログラム(CGI)を容易に記述できる環境を実装したWebサーバをWebアプリケーションサーバと呼びます。スクリプト言語からはRDBMS(リレーショナルデータベース)やOSが提供する機能へのアクセス、メールサーバを介したメール送受信も可能です。
たとえば、オープンソースのApache、マイクロソフト社のIIS(Internet Information Services)などもWebアプリケーションサーバです。
このWebアプリケーションサーバを使ったWebシステムは以下のようになります。
■ Webシステムのセキュリティ上の弱点
インターネットによって不特定多数からアクセスされるWebシステムは、そのような状況自体が脅威そのものになります。Webシステムのセキュリティ上の弱点を以下に列挙します。
・サーバへのアクセス
サーバは、不特定多数のクライアントからアクセスされます。想定された範囲でのアクセス数であれば、支障ありませんが、サーバのパフォーマンスを超えたアクセスが発生すると、レスポンスの低下、サーバの停止など、深刻な影響を与えます。
・ブラウザ上でのスクリプト実行
ブラウザは、画面表示のためのHTMLだけではなく、JavaScriptというスクリプト言語によって記述されたスクリプトと呼ばれるプログラムを実行することができます。仮に、不正に作成・改ざんされたスクリプトが実行されると、ブラウザが起動されているクライアント(スマホやPCなど)の情報が盗まれる可能性があります。
・インターネットでのデータ通信
インターネットは、通信する相手だけしか存在しない世界ではありません。誰でもアクセスすることができるからこそ、利便性が高いのです。その反面、通信しているデータが盗聴される可能性があります。
・サーバでのプログラム実行
サーバには、Webアプリケーションサーバだけではなく、その背後には、RDBMSやOSが動作しています。RDBMSを操作するにはSQL言語を使います。OSを操作するには、コマンドを使います。
これらは、汎用的であり、誰もがその仕様を知ることができます。そのため、これらを悪用したRDBMSやOSへの不正なアクセスが発生する可能性があります。
■ Webシステムへの攻撃と意図
上記の弱点を利用した攻撃には、以下のようなものがあます。これらは、Webシステムにとって、いやらしく、迷惑な行為であり、意図があります。
・なりすまし
通常、Webシステムにはログイン機能があります。ログインには、ユーザIDとパスワードが必要となります。これらが他人に知られると、本人に代わって、サービスを利用されることができます。
意図は、個人の情報の搾取と、勝手に購入や発注などが行われることなどによる金銭の搾取です。
・ネットワークの盗聴
クライアントとサーバ間でやりとりされるHTTPプロトコルのパケットは、原則、文字列です。したがって、パケットをモニタすることさえできれば、誰にも知られず、容易にデータを盗み取ることができます。
意図は、データの搾取です。
・DoS/DDoS攻撃
クライアントからサーバに不要なアクセスを大量に送りつけ、サーバを運用不可の状態とするものです。不要なアクセスとは、WebアプリケーションサーバのHTTPリクエストや、サーバへのTCP/IPの接続に使われるSYNパケットの送信、ネットワーク上のサーバへの接続が可能を事前に確認するためのICMPのエコーパケットの送信などがあります。
意図は、迷惑行為(嫌がらせ、憂さ晴らしなど)、金銭要求です。
・SQLインジェクション
RDBMSは、Webアプリケーションサーバで動作するプログラムからSQL言語を使ってアクセスされます。その経路は、ブラウザ上のHTMLの画面から入力されたデータがインターネットを経由して、Webアプリケーションサーバに送られ、プログラムがそのデータを使ってRDBMSにアクセスするという手順となります。
もし、HTMLの画面からSQL言語で記載されたデータを入力された場合、Webアプリケーションサーバのプログラムが、そのデータをそのまま使ってRDBMSにアクセスしているとRDBMSを制御できてしまいます。その結果、RDBMSに蓄積されたデータが引き出されてしまいます。さらに、意図しないデータに更新されたり、データが削除されたりなど、大切なデータが破壊されてしまうこともあり得ます。特に、RDBMSを使ってログインアカウントの管理をしていると、ユーザIDとパスワードも不正に入手されてしまいます。
意図は、データの搾取です。
・XSS(クロスサイトスクリプティング)
Webアプリケーションによっては、結果として、ブラウザのHTMLの画面から入力されたデータを含んだHTMLがそのままブラウザに返されることがあります。もし、JavaScriptで記載されたスクリプトをデータとして入力すると、クライアントのブラウザ上で動作することになります。その結果、不正なサイトへのリンクなどを画面に表示することで、ユーザを誘導することができるようになります。誘導した後、本来のサーバにログインしたセッション情報をCookieと呼ばれるブラウザが保持する領域から取得し、不正なサイトへと転送します。その結果、搾取したセッション情報を使った不正アクセスが可能となります。(セッションハイジャック)
また、偽のログイン画面やクレジットカード入力画面などを表示することで、機密情報を搾取することも考えられます。
意図は、ユーザIDやパスワードが変換されたセッション情報の搾取、機密情報の搾取、詐欺などです。
・OSコマンドインジェクション
WebアプリケーションプログラムでOSのコマンドを実行する処理があり、OSコマンドの引数を、ブラウザから入力されたデータから引き渡すようなプログラムがあるとします。この際、不正なコマンドを実行するようにデータを入力すると、サーバ側で不正なコマンドが実行され、IPアドレス、ログイン情報(ユーザID、パスワード)、ディレクトリ構成などのサーバの内部情報を取得されたり、変更されたりします。特に、不正アクセスのためのアカウントが登録されたり、不正なプログラムに管理者権限を与えられたりすることなどによって、サーバ内で不正アクセスをしやすい環境が作られてしまいます。
意図は、データの搾取、不正アクセスです。
・ディレクトリトラバーサル攻撃
Webサーバは、HTMLファイルやCGIを置くディレクトリが決まっています。Webサーバで参照許可を設定すると、このディレクトリ配下のファイルやディレクトリを参照することができます。さらに、このディレクトリより上位のディレクトリに参照許可があれば、パスの指定によって、他のディレクトリを参照することもできます。当然、書込許可があれば、不正なファイルをブラウザ経由で書き込むこともできます。そうなると、不正なプログラム(ポッドと呼ばれる)がサーバ上に転送されて実行されてしまうと、そこから外部の第三者のサーバへと接続され、サーバが乗っ取られてしまいます。
意図は、データの搾取、不正アクセスです。
■ Webセキュリティ
Webシステムのセキュリティ上の弱点を防御するための技術的対策には、以下のようなものがあります。
・多要素認証
パスワード認証は、本人だけしか知らない知識要素に頼った認証です。パスワードがばれてしまったらどうしようもありません。そこで、所持要素と生体要素を組み合わせます。
所持要素とは、本人しか所持していないもの、たとえば、クレジットカード、社員証、マイナンバーカードなどを使うことです。ログイン時に、カードリーダなどで、それらを読み込み、認証します。
生体要素とは、本人しかない生物的な特徴、たとえば、指紋、虹彩(目の膜)、声紋、静脈などを使うことです。ログイン時に、これらを専用デバイスで認識し、認証します。
・暗号化
ネットワークを流れるデータを暗号化します。インターネットプロトコルのTCP/IPにはSSL/TLSという暗号化機能があり、この機能を使ってHTTP通信を暗号化します。鍵データを知らない限り、暗号データを復号化することはできません。
SSL/TLSでは、公開鍵暗号化方式(RSA)と共通鍵暗号化方式という二つの暗号技術を使っています。
公開鍵暗号化方式では、公開してもいい公開鍵と秘密にしなければいけない秘密鍵の2つの鍵(鍵ペア)を使って、暗号化と復号化を行いいます。ただし、計算量が大きく、処理時間がかかります。一方、共通鍵暗号化方式は、秘密鍵だけを使って、暗号化と復号化を行い、処理も高速です。
SSL/TLSでは、公開鍵暗号化方式で、共通鍵暗号化方式で使う秘密鍵を配送するために使い、実際の通信データは共通鍵暗号化方式で暗号化・復号化することで処理を高速化します。
Webサーバには、公開鍵暗号化方式の鍵ペアの内、秘密鍵を保存しておき、ブラウザでは公開鍵を保持するように準備しておきます。HTTPによる通信を行う際、SSL/TLSを使います。まず、ブラウザは、Webサーバで公開鍵暗号化方式の秘密鍵を使って暗号化された”共通鍵暗号化方式の秘密鍵”をWebサーバから取得し、公開鍵で復号化します。その後、共通鍵暗号化方式の秘密鍵を使って、お互いに通信データを暗号化・復号化します。
・セキュリティプログラミング
DoS/DDoS攻撃、SQLインジェクション、XSS、OSコマンドインジェクション、ディレクトリトラバーサル攻撃は、Webアプリケーションのプログラミングによって防ぐことができるケースもあります。
DoS/DDoS攻撃による不正なレングスのデータ送信によるサーバクラッシュを防ぐため、処理を実行する前に、ブラウザから受信したデータのレングスの最大長を必ずチェックしてエラーとするようなプログラミングとします。
SQLインジェクションを防ぐため、SQL文に直接、ブラウザから引き渡されたデータを指定するのではなく、SQL言語のバインド機能(プリペア文)を使い、プログラミングすることで、データをSQL文の一部とはみなさないようにします。
XSSは、ブラウザから引き渡されたデータをJavaScriptのエスケープ文字に変換するようにプログラミングする(サニタイジング)ことで、JavaScriptのプログラムは、ただの表示文字列としてブラウザに認識させます。
同じように、OSコマンドインジェクションも、OSコマンドがブラウザから引き渡されたデータに含まれていれば、エラーとするか、二重引用符(””)で囲んで、OSが文字列としてみなすようにプログラミングすることで、防御できます。
・WAF(Webアプリケーションファイアウォール)
Webアプリケーションにおいて、セキュリティ対策の必要性が顕在化するのは運用が開始され、攻撃を受けた段階です。したがって、開発段階において、セキュリティ対策は軽視されるか、無視されることが多く、セキュリティプログラミングをしようとして実際、困難です。そこで登場するのが、WAFです。
DoS/DDoS攻撃、SQLインジェクション、XSS、OSコマンドインジェクション、ディレクトリトラバーサル攻撃は、Webサーバへのアクセス手順や送信されるデータのパターンがあります。これらのパターンは、過去の攻撃の実例から明確であり、少なくとも同じような攻撃を検知することが可能です。
これらのパターンをデータベース化し、Webサーバへのリクエストをリアルタイムの解析し、攻撃を検知できるアプリケーションがWAFです。
クライアントのブラウザとWebサーバのHTTP通信をすべてWAFを経由させることで、異常を検知し、必要であれば、不信なクライアントのIPアドレスからのアクセスを拒否します。異常パターンの検出をAIを使って実施するWAFもあります。これにより、過去のパターンに100%合致しなくても、類似の異常パターンを予測し、検出することができます。
課題は、WAFの誤検知とWebサービスのレスポンスの低下です。前者は、運用に合わせて検出レベルを改善していく必要があります。後者は、WAFの性能見積もりと検証が必要となります。
■ まとめ
Webシステムのセキュリティ対策は、体系的に整理された方策ではなく、実際に発生したインシデント(セキュリティ侵害による事件)をもとに、ボトムアップで積み上げられてきたものです。
したがって、それぞれの対策だけでは十分とは言えず、パズルのように組み合わせて対策を実施することになります。ただし、すべての対策を実施したからといって、100%、セキュリティ攻撃を防げるという保証があるわけではありません。なぜならば、将来的に、どのような攻撃を考えてくるのかは予測ができず、いわゆる、イタチごっこを繰り返していくしかないという実情があるためです。
また、セキュリティ対策には、労力とコストがかかります。一方で、セキュリティ対策が後手にまわると、訴訟や営業停止など想定を超える事態につながってしまうリスクがあります。
セキュリティ対策に完璧はなく、効果とコストのバランスを考えて、優先すべき必要な対策を実施し、継続的な監視と見直しを行うことになります。
ソフトウェア開発・システム開発業務/セキュリティ関連業務/ネットワーク関連業務/最新技術に関する業務など、「学習力×発想力×達成力×熱意」で技術開発の実現をサポート。お気軽にお問合せ下さい