現在のほとんどの Web アプリケーションには、少なくともいくつかの基本的なセキュリティ戦略が必要です。たとえば、パスワードで保護されたコンテンツを提供するサイト、管理者のバックエンドのみを備えたサイト、ブログや個人雑誌、電子商取引サイト、企業イントラネットなどです。
この種の Web アプリケーションを構築するための最も一般的な設計アプローチは、Web アプリケーションのビジネス ロジックにセキュリティ ポリシーを統合することです。このロジックでは、ユーザーがデータベース内の特定のデータにアクセスする権限を持っているかどうかをアプリケーションが判断します。このシナリオでは、データベースの役割は単にデータを保存し、要求に応じて提供することです。つまり、Web アプリケーションがデータベースに特定の情報を提供するよう命令すると、データベースはユーザーの権限を確認せずにそのコマンドを直接実行します。
この記事では、Oracle の組み込みセキュリティ機能を活用してデータベース レベルでアプリケーション セキュリティ ルールを強制し、アプリケーション全体のセキュリティを向上させる方法を説明します。副次的な利点として、データベース内で直接データ アクセスを保護すると、アプリケーションのセキュリティが向上するだけでなく、複雑さの軽減にも役立ちます。
Web アプリケーションからのデータ アクセスを制御するための
データベース側のセキュリティの必要性
についてはどうでしょうか?ほとんどの場合、問題はありません。特に、関連するデータがミッションクリティカルまたは極秘でない場合には、これは良い解決策です。この方法は、多くの書籍やオンライン リソースで使用されています。実際、ある人気のある PHP/MySQL の本では、「ユーザーを追加したり、複雑な権限を追加したりすると、続行する前にさらに多くの情報のチェックが必要になり、MySQL の実行速度が遅くなる可能性がある」ため、アプリケーションごとに複数のデータベース ユーザー アカウントを作成することを明示的に推奨していません。これは事実ですが、データベース ロジックにセキュリティを統合するという考えを諦める前に、考慮すべきことがいくつかあります。次の例を見てみましょう。
コンテンツ管理システム (CMS) を作成するとします。データベースは、Web サイトで公開されたコンテンツを保存するために使用されます。データのほとんどは公開されているため、匿名の Web ユーザーがデータを読み取ることができます。データを変更できるのは編集者だけです。単一のデータベース アカウントを使用してデータベース内のレコードにアクセスして変更し、管理者専用ページへのアクセスをパスワードで保護することで PHP コードでセキュリティを制御します。
Web アプリケーションのパブリック側が、パブリック検索フォーム (つまり、十分に厳密にコーディングされていないフォーム) への SQL インジェクションなどの攻撃を受けた場合、侵入者は、データベース オブジェクトに対して任意の SQL ステートメントを実行できる可能性があります。パブリックアカウントにはアクセス権があります。もちろん、この場合、データは公開されているため、SELECT ステートメントを実行しても大きな問題は発生しません。ただし、パブリック権限と管理者権限は同じデータベース アカウントを使用するため、侵入者は UPDATE ステートメントや DELETE ステートメントを実行したり、データベースからテーブルを削除したりすることもできます。
これを防ぐにはどうすればよいでしょうか?最も簡単な方法は、パブリック データベース アカウントのデータ変更権限を完全に制限することです。 Oracle がこの問題をどのように解決しているかを見てみましょう。
Oracle セキュリティの基本概要
Oracle Database は、表、ビュー、プロシージャなどの特定のデータベース・オブジェクトへのアクセスの管理から、個々の行または列のデータへのアクセスの制御に至るまで、データへのアクセスを制御するさまざまな方法を Web 開発者に提供します。明らかに、Oracle で利用できるすべてのセキュリティ機能やオプションについては、この記事の範囲を超えています。ここでは、あまり詳しく説明しませんが、Oracle データ アクセス セキュリティの最も基本的な側面、つまり
、認証とユーザー アカウント、権限、ロール
認証とユーザー アカウントについてのみ説明します。 他のデータベースと同様に、Oracle へのアクセスを要求する各ユーザー (データベース アカウント) は認証される必要があります。検証は、データベース、オペレーティング システム、またはネットワーク サービスによって実行できます。基本認証 (パスワード認証) に加えて、Oracle は Kerberos、CyberSafe、RADIUS などの強力な認証メカニズムもサポートしています。
役割。 Oracle ロールは、権限の名前付きセットです。ユーザー アカウントにアクセス許可を直接付与することもできますが、ロールを使用すると、特に多数のユーザーを管理する必要がある場合に、ユーザー管理が大幅に簡素化されます。小さくて管理しやすいロールを作成し、セキュリティ レベルに基づいてユーザーに 1 つ以上のロールを付与すると、非常に効率的です。アクセス許可の変更がいかに簡単であるかは言うまでもありません。各ユーザー アカウントを変更するのではなく、ロールが関連付けられているロールを変更するだけです。
新しいユーザーを作成する最初の作業を簡素化するために、Oracle には 3 つの事前定義ロールが付属しています。
· CONNECT ロール - このロールにより、ユーザーはデータベースに接続し、独自のテーブルの作成などの基本操作を実行できます。デフォルトでは、このロールは他のユーザーのテーブルにアクセスできません。
·RESOURCE ロール - RESOURCE ロールは CONNECT ロールに似ていますが、ユーザーはトリガーやストアド プロシージャの作成など、より多くのシステム権限を持つことができます。
·DBA ロール - ユーザーにすべてのシステム権限を付与します。
使用中の認可と権限
このセクションでは、Oracle の認可と権限を使用して、この記事の冒頭で説明した単純な CMS サンプルのセキュリティを向上させる方法について説明します。アプリケーションのユーザーに提供されるコンテンツは WEB_CONTENT テーブルに格納されていると想定されます。
まず、テーブルを作成します。 Oracle Database Special Editionを起動し、システム管理者としてログインします。サンプル HR ユーザーがまだリリースされていない場合は、リリースします。 Special Edition のインストールに含まれる『Getting Started Guide』の指示に従ってください。デフォルトでは、HR ユーザーには RESOURCE ロールが割り当てられることに注意してください。ここで、アカウントを CMS アプリケーションのデータベース側面の管理に使用できるように、ユーザーに DBA ロールを与えます。もちろん、HR ユーザー アカウントはオンライン アクセスには使用されず、データベース管理にのみ使用されます。
これで、オブジェクト ブラウザを使用するか、SQL コマンド ウィンドウを実行して、新しいテーブルを作成できるようになります。テーブルを作成するコードは次のとおりです:
CREATE TABLE WEB_CONTENT (
page_id NUMBER 主キー、
ページコンテンツ VARCHAR2(255)
);
テーブルは HR ユーザー アカウントを使用して作成されたため、テーブルは HR アカウントによって所有され、HR スキーマ内にあり、他のユーザーはテーブルへのアクセス許可が明示的に付与されるまでテーブルにアクセスできません。信じられない場合は、新しいユーザーを作成し、このユーザーを使用して WEB_CONTENT テーブルにアクセスしてみてください。
ここで、CMS_USER と CMS_EDITOR という 2 つの新しいユーザーを作成します。最後に、CMS_USER には WEB_CONTENT テーブルに対する読み取り専用権限が付与され、このユーザーは匿名 Web ユーザーとしてコンテンツを提供するデータベース アカウントとして使用されます。 CMS_EDITOR アカウントには、テーブルに対するより多くの権限が与えられ、CMS エディター アカウント (テーブル内のデータを変更および維持するために必要なアカウント) として使用されます。
新しいユーザーは、XE のグラフィカル インターフェイスを使用するか、次のコマンドを実行することによって作成できます。
CREATE USER cms_user IDENTIFIED BY cms_user;
ユーザー cms_editor を作成します。 cms_editor によって識別されます。
(簡単にするために、ここでのパスワードはユーザー名に対応します。)
両方のアカウントがデータベースにログインするには、それらに CONNECT ロールを与える必要があります。これを行うには、XE グラフィカル インターフェイスの [管理]/[データベース ユーザー] セクションの [ユーザー情報] で [接続] チェックボックスを選択するか、次のコマンドを実行します。
GRANT CONNECT to cms_user;
GRANT CONNECT to cms_editor;
ここで、ユーザー CMS_USER または CMS_EDITOR としてログインし、WEB_CONTENT テーブル (select * from hr.web_content;) からデータを読み取ろうとすると、次のエラーが発生します:
ORA-00942: table or view
存在しません
データにアクセスするか、単にテーブルを表示するには、CMS_USER アカウントと CMS_EDITOR アカウントに WEB_CONTENT テーブルに対する読み取り専用権限を付与する必要があります。
GRANT SELECT on hr.web_content to cms_user;
GRANT SELECT on hr.web_content to cms_editor;
上記のコードにより、これら 2 つのアカウントが WEB_CONTENT テーブルで SELECT ステートメントを実行できるようになります。他のステートメントを実行しようとすると、エラーが発生します。たとえば、
INSERT INTO hr.web_content (page_id,page_content) VALUES (1,'hello world');
という行を挿入すると、「ORA-01031:
CMS_EDITOR がこのテーブルの内容を変更できるようにするには
権限が不足しています」というエラー メッセージが表示されます
。次の権限を付与する必要があります:
hr.web_content に対する GRANT INSERT,UPDATE,DELETE to cms_editor;
これ以降、CMS_EDITOR アカウントは WEB_CONTENT テーブルで INSERT、UPDATE、および DELETE ステートメントを実行できるようになります。
いかに簡単か見てみましょう。ロールを通じて権限を管理する方がより効果的な方法であることがわかります。使用する Oracle データベースが XE ではない場合は、次の操作を実行できます。
ロールを作成します。
CREATE ROLE リーダー。
CREATE ROLE ライター;
ロール権限を付与します:
GRANT SELECT ON web_content TO リーダー;
web_content に対する GRANT INSERT,UPDATE,DELETE TO Writer;
ユーザー ロールを与える:
GRANT Reader TO cms_user;
cms_editor にリーダーを許可します (彼らも読み取る必要があります)。
GRANT Writer TO cms_editor;
READER ロールの定義を変更すると、その変更はそのロールを持つすべてのユーザー アカウントに影響することに注意してください。権限がユーザーに直接付与されている場合は、各ユーザー アカウントを個別に更新する必要があります。
上記の手順を完了すると、匿名 Web ユーザーによって要求されたすべてのデータベース接続に CMS_USER アカウントを使用し、パスワードで保護された管理ページによって開始された接続に CMS_EDITOR アカウントを使用するように PHP アプリケーションを構成できます。これで、たとえパブリック Web フォームが侵害されたとしても、CMS_USER アカウントには読み取り専用権限しかないため、データベースへの影響は最小限に抑えられます。
結論
この記事では、Oracle データ アクセス セキュリティの最も基本的な機能のいくつかを簡単に紹介しました。さらに、Oracle には、Virtual Private Database (VPD) やタグ セキュリティなど、Web アプリケーションのセキュリティを次のレベルに引き上げる機能が数多くあります。