SQLにおけるユーザーとロールのアクセス制御

セキュリティは、権限のない外部者や内部者が権限を超えようとしていることから、重要なビジネスデータをギガバイト単位で保護しようとするデータベース管理者にとって最重要です。 すべてのリレーショナルデータベース管理システムは、これらの脅威を最小限に抑えるように設計された何らかの本質的なセキュリティメカニズムを提供します。 Microsoft Accessが提供する簡単なパスワード保護から、OracleやMicrosoft SQL Serverなどの高度なリレーショナルデータベースでサポートされている複雑なユーザー/ロール構造までさまざまです。 この記事では、 Structured Query Language (またはSQL )を実装するすべてのデータベースに共通のセキュリティメカニズムに焦点を当てます 。 一緒に、私たちは、データアクセスコントロールを強化し、データの安全を確保するプロセスを歩みます。

ユーザー

サーバーベースのデータベースはすべて、コンピューターのオペレーティングシステムで使用されているのと同様のユーザーコンセプトをサポートしています。 Microsoft Windows NTおよびWindows 2000のユーザー/グループ階層に精通している場合は、SQL ServerおよびOracleでサポートされているユーザー/ロールのグループが非常に似ていることがわかります。

データベースにアクセスするユーザーごとに個別のデータベースユーザーアカウントを作成することを強くお勧めします。 技術的には、ユーザー間でアカウントを共有したり、データベースにアクセスする必要があるユーザーの種類ごとに1つのユーザーアカウントを使用することは可能ですが、この方法は2つの理由から強く推奨していません。 まず、個々のアカウンタビリティを排除します。ユーザーがデータベースを変更した場合(5,000ドルの引き上げをしたとします)、監査ログを使用して特定の人に戻すことはできません。 さらに、特定のユーザーがあなたの組織を離脱し、そのユーザーのデータベースからのアクセスを削除したい場合は、すべてのユーザーが依存するパスワードを変更する必要があります。

ユーザーアカウントを作成する方法はプラットフォームによって異なります。正確な手順については、DBMS固有のドキュメントを参照する必要があります。 Microsoft SQL Serverユーザーは、sp_adduserストアドプロシージャの使用方法を調べる必要があります。 Oracleデータベース管理者は、CREATE USERコマンドが役立つことがわかります。 また、代替認証スキームを調査することもできます。 たとえば、Microsoft SQL ServerはWindows NT統合セキュリティの使用をサポートしています。 このスキームでは、ユーザーはWindows NTユーザーアカウントによってデータベースに識別され、データベースにアクセスするために追加のユーザーIDとパスワードを入力する必要はありません。 このアプローチは、アカウント管理の負担をネットワーク管理スタッフに移し、エンドユーザーにシングルサインオンを容易にするため、データベース管理者にとって非常に一般的です。

ロール

ユーザー数が少ない環境にいる場合は、ユーザーアカウントを作成してそのアカウントに直接アクセス許可を割り当てるだけで十分です。 ただし、多数のユーザーがいる場合は、アカウントと適切なアクセス許可を維持する負担に圧倒されます。 この負担を軽減するために、リレーショナル・データベースは役割の概念をサポートしています。 データベースロールは、Windows NTグループと同様に機能します。 ユーザーアカウントは役割に割り当てられ、権限は個々のユーザーアカウントではなく役割全体に割り当てられます。 たとえば、DBAロールを作成し、管理スタッフのユーザーアカウントをこのロールに追加することができます。 これをやり終えたら、ロールに権限を割り当てるだけで、現在の(そして将来の)管理者全員に特定の権限を割り当てることができます。 ここでも、ロールを作成する手順はプラットフォームによって異なります。 MS SQL Server管理者はsp_addroleストアド・プロシージャを調査し、Oracle DBAはCREATE ROLE構文を使用する必要があります。

権限を与える

ユーザーをデータベースに追加したので、権限を追加してセキュリティを強化しましょう。 私たちの最初のステップは、ユーザーに適切なデータベース権限を与えることです。 これを行うには、SQL GRANTステートメントを使用します。

文の構文は次のとおりです。

GRANT <許可>
[ON

]
TO
[付与されたオプション]

さて、このステートメントを行ごとに見てみましょう。 最初の行、GRANT は、私たちが許可している特定のテーブルパーミッションを指定することを可能にします。 これらは、テーブルレベルの権限(SELECT、INSERT、UPDATE、DELETEなど)またはデータベース権限(CREATE TABLE、ALTER DATABASE、GRANTなど)のいずれかになります。 1つのGRANTステートメントで複数の権限を付与できますが、テーブルレベルの権限とデータベースレベルの権限を1つのステートメントにまとめることはできません。

2行目のON

は、テーブルレベルのアクセス許可に影響を受けるテーブルを指定するために使用されます。 この行は、データベースレベルのアクセス権を付与する場合は省略されます。 3行目は、アクセス権が付与されているユーザーまたはロールを指定します。

最後に、4行目のWITH GRANT OPTIONはオプションです。 この行がステートメントに含まれている場合、影響を受けるユーザーはこれらの権限を他のユーザーに付与することもできます。 ロールに権限が割り当てられている場合は、WITH GRANT OPTIONは指定できません。

いくつかの例を見てみましょう。 私たちの最初のシナリオでは、最近、顧客レコードを追加および維持する42のデータ入力事業者のグループを採用しました。 Customersテーブルの情報にアクセスし、この情報を変更して新しいレコードをテーブルに追加できるようにする必要があります。 データベースからレコードを完全に削除すべきではありません。 まず、各オペレータのユーザーアカウントを作成し、それらをすべて新しいロールDataEntryに追加する必要があります。 次に、次のSQL文を使用して適切な権限を付与する必要があります。

補助金の選択、挿入、更新
顧客について
TO DataEntry

そして、それはすべてです! 次に、データベースレベルのアクセス権を割り当てる場合を調べてみましょう。 DBAロールのメンバーが新しいテーブルをデータベースに追加できるようにします。 さらに、他のユーザーにも同様の操作を許可することができます。 ここにSQL文があります:

GRANT CREATE TABLE
TO DBA
付与オプション付き

WITH GRANT OPTION行を追加して、DBAがこの権限を他のユーザーに割り当てることができることを確認してください。

権限の削除

権限を与えたら、後で取り消す必要があることがよく分かります。 幸いにも、SQLは、以前に付与された権限を削除するREVOKEコマンドを提供しています。 構文は次のとおりです。

REVOKE [GRANT OPTION FOR] <権限>
ON <テーブル>
FROM

このコマンドの構文はGRANTコマンドの構文に似ていることに気付くでしょう。 唯一の違いは、WITH GRANT OPTIONがコマンドの最後ではなくREVOKEコマンドラインで指定されていることです。 たとえば、以前に許可されたMaryのレコードをCustomersデータベースから削除する権限を取り消したいとします。 次のコマンドを使用します。

削除を取り消す
顧客について
メアリーから

そして、それはすべてです! DENYコマンドに言及する価値のあるMicrosoft SQL Serverでサポートされている追加のメカニズムが1つあります。 このコマンドを使用すると、現在または将来のロールメンバシップを介してユーザーが持つ可能性のある権限を明示的に拒否できます。 構文は次のとおりです。

DENY <アクセス許可>
ON <テーブル>
TO <ユーザー/ロール

前の例に戻って、MaryはCustomersテーブルにもアクセスできるManagersロールのメンバーであったとします。 前のREVOKEステートメントは、テーブルへのアクセスを拒否するのに十分ではありません。 彼女のユーザーアカウントを対象としたGRANTステートメントによって彼女に付与された権限が削除されますが、Managersロールのメンバーシップによって得られた権限には影響しません。 ただし、DENYステートメントを使用すると、彼女は権限の継承をブロックします。 コマンドは次のとおりです。

デニー削除
顧客について
メアリーへ

DENYコマンドは、基本的にデータベースアクセスコントロールに「否定的なアクセス許可」を作成します。 後でMaryがCustomersテーブルから行を削除する権限を与えることにした場合、単にGRANTコマンドを使用することはできません。 そのコマンドは、既存のDENYによって直ちに無効にされます。 代わりに、最初にREVOKEコマンドを使用して、次のように否定的な許可エントリを削除します。

削除を取り消す
顧客について
メアリーから

このコマンドは、肯定的なアクセス許可を削除するコマンドとまったく同じであることがわかります。 DENYコマンドとGRANTコマンドはどちらも同じように動作することを覚えておいてください。どちらも、データベースアクセス制御メカニズムで権限(肯定または否定)を作成します。 REVOKEコマンドは、指定されたユーザーのすべての肯定および否定のアクセス許可を削除します。 このコマンドが発行されると、Maryがその権限を所有する役割のメンバーである場合、テーブルから行を削除することができます。 あるいは、自分のアカウントに直接DELETE権限を与えるGRANTコマンドを発行することもできます。

この記事では、標準クエリ言語でサポートされているアクセス制御メカニズムについてよく学びました。 この入門書は、あなたには良い出発点を提供するはずですが、あなたのシステムでサポートされている強化されたセキュリティ対策については、DBMSのドキュメントを参照することをお勧めします。 多くのデータベースでは 、特定の列に対する権限の付与など、より高度なアクセス制御メカニズムがサポートされています。