Spring 5でできることは?4からの変更点や互換性について解説
- 1.Spring Securityとは
- 2.Webアプリケーションに対するサイバー攻撃
- 3.Spring Securityの機能
- 4.Spring Securityの仕組み
- 5.Spring Frameworkを利用する際に必要なスキル
1.Spring Securityとは
Sprint SecurityはSpring Frameworkを構成するプロジェクトの一つで、Springベースのアプリケーションに対して、セキュリティ強化を実現するためのライブラリです。BASIC認証yやOpenID認証などの認証タイプ、認可の設定などを選ぶことができ、サイバー攻撃に対するセキュリティ保護も付与することが可能です。
Spring SecurityはSpringプロジェクトの標準認証ライブラリとして、最低限の基本機能を簡単に実装できます。各々のプロジェクトに合わせたカスタマイズまでできるので、長年多くの現場で使用されています。実績のあるOSSライブラリを使用することは、自作の認証・認可システムを維持・アップデートすることに比べて、セキュリティの観点からもリスクが低くなります。
内部リンク:Spring Frameworkとは
2.Webアプリケーションに対するサイバー攻撃
近年、個人情報漏洩のニュースが頻発しているように、Webアプリケーションを狙ったサイバー攻撃は増加傾向にあります。IPA(独立行政法人 情報処理推進機構)が発表した調査データによると、2020年におけるWebサイトの脆弱性の届け出件数は755件で、2018年の238件から3倍以上に増加しています。
(参考)
ソフトウェア等の脆弱性関連情報に関する届出情報
https://www.ipa.go.jp/files/000088181.pdf
システムの脆弱性を悪用したサイバー攻撃にも様々な手法があり、その攻撃の手口を理解することは、セキュリティ対策を考える上で重要です。以下に5つの代表的なサイバー攻撃の手段を紹介します。
2-1.セッションハイジャック
近年の様々なWebサービスはIDやパスワードを入力してログインし、セッションを持つことでログイン状態を維持します。セッションハイジャックはインターネット通信におけるこのセッションを乗っ取る攻撃手法です。
推測されやすいセッションIDを設定していたり、セッション管理機構に不備があったりといった脆弱性があると、悪意のある第三者が別のユーザーアカウントを乗っ取り、サービス上で意図しない操作を実施できてしまう危険性があります。
2-2.CSRF(クロスサイト・リクエスト・フォージェリ)
シーサーフとも呼ばれ、Webアプリケーション利用者自身が意図しない処理を、実行されてしまう脆弱性または攻撃手法です。攻撃者は罠となるサイトを用意し、ユーザーが罠にかかるのを待つかリンクやメールなどで利用者を罠サイトへ誘導します。
ユーザーが罠サイトに引っかかってしまい、かつターゲットとなるWebサイトへログイン状態になっていると、ターゲットのWebサイトへ意図しないリクエストが送信・実行されてしまいます。
2-3.ディレクトリトラバーサル
ディレクトリトラバーサルとは、Webサーバー上で非公開としているファイルやディレクトリに対して、不正にアクセスを試みる攻撃手法です。相対パスの表記法を絶対パスにする「正規化」の仕組みを悪用した攻撃で、情報漏洩・Webデータ改ざん・アカウントなりすまし等様々なリスクが高まります。
2-4.HTTPレスポンス分割攻撃
HTTPレスポンスヘッダに不正なデータを混ぜて実行させることで、攻撃者と同じプロキシサーバを利用しているユーザーに対して、偽のWebコンテンツを表示させる攻撃手法です。
利用者が偽ページにアクセスしてしまうことにより、Webブラウザ上で悪意のあるプログラムが実行され個人情報が漏洩したり、フィッシング・詐欺サイト等に誘導させられたりするリスクがあります。
2-5.ブルートフォース攻撃
特定のIDに使用されているパスワードに対して、文字列を組み合わせて総当たり的にログインを試みる攻撃手法で、「総当たり攻撃」とも呼ばれます。逆に多くのユーザーが使っているパスワード(1234等)に狙いを定めて、IDの方を総当たりで変化させながらログイン試行する攻撃はリバースブルートフォース攻撃と呼ばれています。
サイバー攻撃者はパスワードの組み合わせを機械的に試してログイン認証を突破しようと試みますが、PCの処理能力は人間が手で行うスピードと比べて遥かに早いので、パスワードの入力ミスによるログイン試行の回数制限などがない場合、この攻撃により認証を突破されてしまう可能性があります。
3.Spring Securityの機能
Spring Securityの機能について、具体的に解説していきます 。
3-1.認証機能
認証機能とはWebアプリケーションを利用するユーザー、つまりアプリケーション側からすると通信相手が、正しいユーザーかどうかを判別する機能です。Spring SecurityではDB認証、LDAP認証、OAuth 2.0 等々複数の認証方法をサポートしています。
3-2.認可機能
認可機能とは、ユーザーのWebアプリケーションやデータベースが持つリソースに対する、アクセス権限を制限・管理する機能です。
Spring Securityでの対象リソースとは、主にリクエストURL・画面要素・メソッドで、設定ファイルやアノテーションでアクセス認可情報を記述し、この機能を実現しています。
3-3.セッション管理機能
セッション管理とは、ユーザーとアプリケーション間での複数のリクエストやアクセスを一つとして管理することで、それらの連続した処理を一人のユーザーの操作として成立させる機能です。
Spring Securityでは、ログイン時にセッション IDという証明書のようなものが発行されます。これをAuthentication インターフェースというサーバー側の機能と、ブラウザ側の両方が持つことでセッションの整合性を保ちます。
3-4.CSRF対策機能
上述のサイバー攻撃で紹介したCSRFですが、サーバー側ではページに秘密情報(トークン)の埋め込みやパスワードの再入力、Refererのチェック等を実装することでWebサイトを保護することができます。
Spring SecurityにはCSRFを防ぐための機能も提供されており、この機能はver4.0 以降では、デフォルトでオンになっています。
3-5.セキュリティヘッダ出力機能
Spring SecurityはChromeやFirefox等の主要なWebブラウザに搭載されているセキュリティ対策機能を利用することで、ブラウザを悪用したサーバー攻撃からユーザーを守る機能も備えています。
Cache-ControlヘッダやX-XSS-Protectionヘッダ等、セキュリティ関連のレスポンスヘッダをサーバーサイドから出力することにより、Webブラウザのセキリュティ機能と連携して脆弱性対策の仕組みを作動させます。
3-6.パスワードの暗号化・ハッシュ化
パスワードをデータベースに管理する場合は、そのままの文字列で保存することはせず、複合化して元に戻せる暗号化、もしくは不可逆的で元に戻せないハッシュ化を施すことが一般的です。
Spring Securityにも、認証機能と連動して、これらを提供するクラスが用意されています。ただし、Spring Securityがサポートしていない暗号化方式もあるので、必要に応じて個別に実装する必要があります。
4.Spring Securityの仕組み
Spring Securityはサーブレットフィルターの仕組みを利用して以下の図のような流れで動いています。このアーキテクチャを支える主要な機能であるFilterChainProxy・SecurityFilterChain・HTTPFirewallの三つについて解説します。
【Spring Securityの処理の流れ】
(1)ユーザーからWebアプリケーションに対してリクエストを送られる。
(2)Spring SecurityのFilterChainProxyクラスがHttpFirewallインターフェースを呼び出して、 ファイアウォール機能を組み込む。
(3)FilterChainProxyクラスが、SecurityFilterChainに処理を委譲する。
(4)複数のSecurity Filterクラス(サーブレットフィルター)の処理が順番に実行される。
(5)SecurityFilterChainが正常に終了した場合、Webアプリケーションへアクセスする。
(6)FilterChainProxyクラスはがWebアプリケーションのリソースをレスポンスする。
(出典)
TERASOLUNA Server Framework for Java (5.x) Development Guideline 5.1.0.RELEASE documentation
https://terasolunaorg.github.io/guideline/5.1.0.RELEASE/ja/Security/SpringSecurity.html
4-1.FilterChainProxy
FilterChainProxyはユーザーからのリクエストを最初に受け取るクラスであり、Webアプリケーションとユーザーとの処理の全体を制御しています。
Proxy(代理)という名前が付いているとおり、このクラス自身は具体的なセキュリティ機能を提供していませんが、上述流れに深く関わっておりSpring Security処理全体の動きをコントロールしています。
4-2.SecurityFilterChain
SecurityFilterChainは、Spring Securityが持つ複数のSecurityFilter(サーブレットフィルター)を管理するためのインターフェース。これらのSecurityFilterを順番に実行することで、リクエスト毎に異なるセキュリティ機能を適用することが可能となります。
FilterChainProxyがSecurityFilterChainインターフェースを保持しており、処理を委譲することSecurityFilterChainが機能します。なお、最初にmatchしたSecurityFilterChainに処理を委譲していくため、設定する順番が重要になってきます。
4-3.HttpFirewall
HttpFirewallは処理にファイアウォール機能を組み込むためのインターフェースです。
FilterChainProxyクラスが、このHttpFirewallインターフェースを呼び出すことで、「;」や「\」などプログラム的に特別な意味を持つ記号を含んだ、悪意のあるアクセスの可能性があるURLを弾いてくれます。この機能を用いることで、上述のディレクトリトラバーサル攻撃やHTTPレスポンス分割攻撃に対するセキュリティを実現しています。
5.Spring Frameworkを利用する際に必要なスキル
これまでSpring Securityの機能・仕組みやセキュリティに関して紹介してきましたが、実際にWebアプリケーション等の開発を行う際には、Spring SecurityやSpring Framework等フレームワーク以外のスキルや知識も必要となります。チームでの開発では役割分担もあり全てを知っている必要は無いのですが、最低限抑えておきたいものを以下紹介します。
Java
Spring Framworkはプログラミング言語にJavaが使用されています。基本的な変数の扱いやループ文等基礎的な構文から複雑なアルゴリズムやロジックを記載するまで、プログラミングを読み書きして、状況に応じたカスタマイズを行えることが、Spring開発においてはじめに必要となるスキルでしょう。
Webサーバー・DBの知識
Webアプリケーションは多くの場合、アプリケーション単体で機能しません。ウェブブラウザに対して、HTMLや等の表示を提供するWebサーバーや、アプリに関連するデータを保存したり高速で検索したりできるようにするデータベースも関わってきます。
これらのミドルウェアとSpring Flameworkのアプリケーションを連携させる設定や仕組みについても、ある程度通ずることが必要になってきます。
バージョン管理ツール
Gitが圧倒的に有名ですがSubversionやMercurial等、ソースコードの変更履歴を記録してバージョンを管理するためのツールが開発では使用されます。もしこれらを使わないまま、複数のメンバーが無秩序にソースコードやファイルに対して変更を行っていくと、誰がいつ何の変更を行なったか、どのデータが最新なのかといった混乱が即座に発生するでしょう。
バージョン管理ツールを使用することで、変更履歴をすべて記録できる・以前の状態に戻せる・デグレードの発生を防止するという近年では必要不可欠な恩恵を享受できます。開発現場では絶対と言っていいほど使用されていますので、最低限の使い方は学んでおくと良いでしょう。