本記事の目的と前提条件
Webアプリケーションを公開する場合、セキュリティ対策をしないとハッカーから容易に攻撃されてしまい、情報漏洩やWebページ改ざんなどをされてしまう可能性があります。
しかし、世の中には様々な脅威があり、全ての脅威に対してセキュリティ対策を行おうとすると、時間も費用も無限掛かってしまいます。
Webアプリケーションの公開時の対策のみだけを考えても様々な脅威とそれに対する対策が考えられます。
そのため、本記事では、以下の前提条件でのセキュリティ対策を記載します。
- 外部(インターネット側)の攻撃者から防御することを前提にしています。
- クラウド環境はIaaSを想定していますので、物理セキュリティは考慮していません。
- IaaSの管理画面へのアクセス制御方法は考慮していません。
- 適切なアクセス権を保持したユーザによる内部不正の対策は含まれていません。
- 内部のPCなどが感染して公開サーバに不正アクセスする二次感染は考慮しません。
- セキュリティ対策費用と効果のバランスを考慮して対策を記載しています。
- ゼロディ攻撃など全ての攻撃を防御はできません。
Webアプリケーションの動作環境
Webアプリケーションの動作環境は以下の表のように、それぞれレイヤ(層)に分けることができます。
動作するレイヤ | 概要 |
---|---|
アプリケーション層 | PHPやRubyなどのプログラミング言語のソースコードです。 |
フレームワーク層 | WordPressやEC-CUBEなどのフレームワークです。 フレームワークを使用せずにWebアプリケーションを作成する場合もあります。 |
ミドルウェア層 | Apacheやnginxなどのミドルウェアです。 |
OS層 | WindowsやLinuxなどのOSです。 |
ネットワーク層 | IPやTCPやUDPなどの通信ポートです。 |
ネットワーク層でのセキュリティ対策
ネットワーク層では、「サーバから応答がある通信ポートの制御」と「通信の暗号化」の対策をすることが重要です。
具体的には、以下のような対策をすることを推奨します。
(1) サーバから応答がある通信ポートの制御
サーバに不要なサービスが起動しており、公開されていた場合、そのサービスを悪用されて情報漏洩などが起こる可能性があります。
そのため、「ファイアウォールによる制御」や「不要なサービスの停止」することで、不要な通信ポートから応答がないようにします。
原則、http(80/tcp)とhttps(443/tcp)からの応答のみにします。
運用上、ssh(22/tcp)やftp(20/tcp、21/tcp)を公開する必要がある場合、
送信元IPアドレスを制限するなど別途セキュリティ対策を検討します。
「ファイアウォールによる制御」をする場合は、サーバ上のファイアウォール(RedHat OSのiptablesやfirewalld、Windows OSのWindowsファイアウォール等)でアクセス制御するか、外部のファイアウォール(セキュリティグループ等)でアクセス制御するかどちらかの方法でアクセス制御します。
「不要なサービスの停止」をする場合は、以下のようなコマンドを実行して、起動しているサービス一覧を出力します。
【RedHat OSの7と8の場合】
# systemctl -t service --state=active
⇒現在実行中のサービス一覧を出力
# systemctl list-unit-files -t service
⇒OS起動後に自動起動するサービス一覧を出力
【Windows OSの場合】
sc queryex type= service
⇒現在実行中のサービス一覧を出力
上記の設定した後に、ポートスキャンツールを用いて応答がある通信ポートを確認することを推奨します。
設定変更したサーバ以外の機器にポートスキャンツール(nmap)をインストールして、以下のコマンドを実行すると応答がある通信ポート一覧が出力されます。
(ポートスキャンを実行する場合、サーバ上のサービスが停止してしまう可能性がありますので、ご注意ください。)
【Ubuntu 20.04.1 LTSの場合】
$ sudo apt -y install nmap
⇒ポートスキャンツール(nmap)のインストール
$ sudo nmap -sS -sU -Pn -p 1-65535 【通信ポートの応答有無を確認するサーバのIPアドレス/FQDN】
⇒全てのTCPとUDPの応答有無を確認
(2) 通信の暗号化
利用者がフリーWi-Fi等信頼されていない環境に接続してWebアクセスして、個人情報や認証情報を送ると、通信が盗聴されて重要な情報が漏洩してしまう可能性があります。
そのため、全ての通信は原則「httpsを用いて通信の暗号化」をすることが重要です。
ご参考までに、以下のようなイメージで盗聴される可能性があります。
OS層でのセキュリティ対策
OS層では、「ユーザ権限の最小化」と「ディレクトリ構成」と「ウイルス侵入対策」の対策をすることが重要です。
具体的には、以下のような対策をすることを推奨します。
(1) ユーザ権限の最小化
OSコマンドインジェクションの脆弱性などを悪用されると、adduserコマンドにて任意のユーザが作成されたり、systemctlコマンドでサービスを起動されるなどバックドアを作成されてしまう可能性があります。
そのため、影響を最小限にするために、「ユーザの権限を最小限」にします。
特にapacheユーザ等Webアプリケーションを実行しているユーザの権限は必ず最小限にします。
(2) ディレクトリ構成
重要な情報が記載されたファイルがapacheやnginxなどWebアプリケーション公開範囲に格納されていた場合、利用者に閲覧されてしまう可能性があります。
そのため、「Webアプリケーションの公開されているディレクトリには重要なファイルや不要なファイルを格納しない」ようにします。
(3) ウイルス侵入対策
OSコマンドインジェクションの脆弱性などを悪用されると、curlコマンドなどでウイルスが侵入されてしまい、感染する可能性があります。
また、Webアプリケーションでファイルをアップロードする機能がある場合は、その機能を悪用されてウイルスをアップロードされてしまう可能性があります。
そのため、必要に応じて「アンチウイルスソフトの導入」することで、ウイルス感染時に駆除することを推奨します。
OSとミドルウェアとフレームワーク層でのセキュリティ対策
OSとミドルウェアとフレームワーク層では、「脆弱性(CVE番号)の対策」の対策をすることが重要です。
具体的には、以下のような対策をすることを推奨します。
(1) 脆弱性(CVE番号)の対策
古いバージョンのOSやミドルウェアを使用していた場合、そのバージョンの脆弱性を悪用される可能性があります。
また、ミドルウェアの場合、設定内容によって脆弱性が残ってしまう可能性があります。
その脆弱性を悪用されて情報漏洩などが起こる可能性があります。
そのため、「最新のパッチの適用又はIDS/IPSの導入」や「ミドルウェアの設定内容の確認」することで、脆弱性を減らすことが重要です。
最後にリリース前に「第三者によるプラットフォーム診断」や「Web脆弱性診断ツールであるNikto」で脆弱性の有無を確認することを推奨します。
Niktoを使用する場合、以下のコマンドを実行します。
【Ubuntu 20.04.1 LTSの場合】
$ sudo apt -y install nikto
$ nikto -h [診断対象のサーバのIPアドレス/FQDN]
アプリケーション層でのセキュリティ対策
ソースコードの記載方法によって脆弱性のあるプログラムを作成してしまう可能性があります。
その脆弱性を悪用されて情報漏洩などが起こる可能性があります。
そのため、アプリケーション層では、「プログラムの開発規定の作成」や「Webアプリケーション脆弱性診断」や「WAFの導入」することで、脆弱性を減らすことが重要です。
具体的には、以下のような対策をすることを推奨します。
(1) プログラムの開発規定の作成
脆弱性のあるプログラムを作成しないために、一定のセキュリティ対策をするルールとして、プログラムの開発規定を作成することが重要です。
IPAの以下のサイトにプログラム作成する際の注意事項をプログラム開発規定に記載することを推奨します。
タイトル : 安全なウェブサイトの作り方
URL : https://www.ipa.go.jp/security/vuln/websecurity.html
また、おすすめの書籍としては「体系的に学ぶ 安全なWebアプリケーションの作り方 第2版)」がWebアプリケーションセキュリティの対策が体系的に記載されていますので、参考になると思います。
(2) Webアプリケーション脆弱性診断
システムに脆弱性があるか確認するために、自動診断ツールと手動診断の両方を用いて、Webアプリケーションの脆弱性を診断します。
第三者によるWebアプリケーション診断は一般的に費用が高いため、重要情報にアクセスする可能性あるWebサーバかどうかで実施を検討することを推奨します。
もし第三者によるWebアプリケーション診断ではなく、自身でセキュリティ診断をする場合は、OWASP ZAP等Webアプリケーション脆弱性診断ツールを使用します。
OWASP ZAPのインストール方法については、「OWASP ZAPをWindows 10にインストールしてみた」をご確認ください。
(3) WAFの導入
プログラム開発規定を作成したり、Webアプリケーション診断をしたとしても人的ミスなどにより、脆弱性が発見されず残ってしまう可能性があります。
そのため、もし脆弱性が残っていた場合の対処方法として、必要に応じてWAFを導入することを検討します。