Microsoft Access のセキュリティについての考察
Frank C. Rice
Microsoft Corporation
July 2002
適用対象
MicrosoftR Access 2002
要約 : この記事では、Microsoft Access 2002 データベースにさまざまなレベルの保護を実装するための方法について説明します。
目次
はじめに
重要なデータを保護するにあたって
Access のセキュリティの概要
Access のユーザー レベルのセキュリティについて
手動でデータベースのパスワードを設定する
プログラミングによってデータベースのパスワードを設定する
セキュリティ ウィザードを使って Access データベースのセキュリティを設定する
プログラミングによってユーザーとグループを追加および削除する
プログラミングによって権限を設定する
まとめ
はじめに
旧バージョンの Microsoft Access (Microsoft Access 2000 以前のバージョン) では、セキュリティは理解して使用するには難しすぎるものと思われていた傾向がありました。ユーザーが実行する必要のある手順が多く存在し、手順を忘れたり、順番を間違えたりすると、悲惨な結果を招く可能性がありました。Microsoft Access for Microsoft WindowsR 95 からセキュリティ ウィザードが導入されました。この機能は、Microsoft Access 2000 でさらに強化され、Access におけるセキュリティの実装は非常に簡単になりました。しかし、この補助機能が追加されていても、データベース内のデータやオブジェクトを保護するためのオプションと手順を理解しておくことは非常に重要です。これらのオプションや手順を正しく理解していないとデータの安全性が損なわれることがあり、最悪の場合は、データベースにアクセスできなくなってしまう危険性があります。
Access データベースとその中のオブジェクトを保護するには、いくつかの方法があります。この記事では、データベースを構成するオブジェクトを保護する方法について説明します。ここで言う "オブジェクト" には、知的財産としてのデータベースを構成するデータ、そのデータに含まれるフォームやレポートなどのオブジェクト、およびコードが含まれます。この記事で説明するテクニックは、Microsoft Access データベース ファイル (.mdb ファイル) のみを適用対象としています。
重要なデータを保護するにあたって
データベース パスワードを特定すること、およびワークグループ情報ファイル (詳細は後で説明します) からユーザー名とパスワードを特定することを目的としたツールやサードパーティ製のユーティリティが多数存在しています。許可されていないアクセスから保護しなければならない重要なデータが存在する場合、最も優れたセキュリティ オプションは、コンピュータのオペレーティング システムで提供されているファイル レベルおよびファイル共有のセキュリティを使用することです。ファイル レベルのセキュリティでは、データ ファイル自体に権限を設定する必要があります。ファイル共有のセキュリティには、データ ファイルが格納されている場所へのアクセスを制限する必要があります。たとえば、ファイル共有のセキュリティの場合、データ ファイルが格納されるローカル コンピュータまたはネットワーク サーバーのフォルダにユーザー権限と特権を設定します。そのためには、データを複数のファイルに分割し、各ファイルにユーザー権限を設定して、保護されたファイル共有に配置します。その後、セキュリティで保護された Access データベースからデータ ファイルへのリンクを確立します。
Access のセキュリティの概要
このセクションでは、Access データベースを保護するための各種方法について説明します。
データベースの暗号化または暗号解読
最も簡単な (しかし最も安全度が低い) 保護の方法は、データベースを暗号化することです。データベースを暗号化すると、データベース ファイルが最適化され、ワード プロセッサなどの一部のユーティリティ プログラムで解読することができなくなります。しかし、セキュリティで保護されていないデータベースを暗号化しても、誰でもデータベースを開いてすべてのオブジェクトフル アクセスできるので、データベースはセキュリティで保護されるわけではありません。データベースをセキュリティで保護する方法については、この記事の「セキュリティ ウィザードを使って Access データベースのセキュリティを設定する」を参照してください。
暗号化は、データベースを電子的に送信する際やフロッピー ディスク、テープ、または CD-ROM などに格納する際に、権限を持たないユーザーからデータベースの情報を保護する場合に使用できます。しかし、Jet (Access のデータベース エンジン) で使用されている暗号化メソッドは非常に脆弱であるため、重要なデータを保護する場合に使用すべきではありません。[暗号化/解読元データベース] コマンドは、[ツール] メニューの [セキュリティ] サブメニューからアクセスできます。データベースの解読は、暗号化を元に戻す機能です。
カスタム インターフェイスを使用する
実装が比較的簡単なもう 1 つの保護スキーマは、標準の Access インターフェイスの代わりにカスタム インターフェイスを使用する方法です。ただし、この方法も暗号化と同様に、データベース内のオブジェクトと重要なデータを安全に保護するものではありません。[ツール] メニューの [起動時の設定] を選択すると、独自の起動フォームやメニューをはじめ、独自のタイトルやアイコンを指定することができます。また、[データベース] ウィンドウを隠して、技術的知識を持たないユーザーに対してオブジェクトを非表示にすることもできます。[起動時の設定] ダイアログ ボックスの機能は、プログラミングによって使用することもできます。起動時のオプションを [起動時の設定] ダイアログ ボックスで設定する方法の詳細については、Access ヘルプの「スタートアップ オプションについて」を参照してください。プログラミングによって起動時のオプションを設定する方法の詳細については、(Access の) Microsoft Visual BasicR Editor のヘルプで「コードでのスタートアップ プロパティおよびオプションの設定」を参照してください。
データベースのパスワードを設定する
データベースにパスワードを設定することもできます。データベースにパスワードを設定すると、ユーザーがデータおよびデータベース オブジェクトにアクセスする際にパスワードの入力が要求されます。
注 : パスワードを使ってデータベースまたはデータベース内のオブジェクトをセキュリティで保護することは、共有レベルのセキュリティとも呼ばれます。
この方法では、ユーザーやグループに権限を割り当てることはできません。したがって、パスワードを知っているユーザーには、すべての Access データおよびデータベース オブジェクトに対する無制限のアクセスが許可されます。[データベース パスワードの設定] コマンドは、[ツール] メニューの [セキュリティ] サブメニューからアクセスできます。
ユーザー レベルのセキュリティ
共有レベルのセキュリティに加え、ユーザー レベルのセキュリティを使用すると、最も厳密にアクセスを制限して、データベースおよびデータベース内のオブジェクトを制御できるようになります。ユーザー レベルのセキュリティは推奨されるデータベース保護の方法の一部なので (オペレーティング システムのファイル レベル セキュリティおよび共有レベル セキュリティと組み合わせて使用した場合)、この方法については、この記事の後半で詳しく説明します。
同様に、データベースに含まれる Visual Basic for Applications (VBA) コードをセキュリティで保護するオプションについても後ほど説明します。
注 : ユーザー レベルのセキュリティを単独で使用すると、主にデータベース内のコードとオブジェクトが保護されるため、ユーザーが不用意にコードやオブジェクトを修正したり変更したりすることがなくなります。許可されていないユーザーからのフォーム、レポート、またはモジュール内のコードへのアクセスを拒否する場合は、.mdb ファイルを MDE ファイルに変換する必要があります (詳細については、この記事の後半で説明します)。ユーザーがデータベース内のクエリ、マクロ、またはデータ アクセス ページを修正できないようにする唯一の方法は、データベース ファイル (またはデータ アクセス ページ) を保護されたファイル共有に配置する方法です。また、Access には、テーブル内のデータを修正するユーザー権限を設定する方法はないので、この方法でテーブルのデザイン変更やテーブルの削除を制限することはできません。この機能を提供するには、Microsoft SQL Server などのサーバー ベースのデータベース製品を使用する必要があります。
モジュールのパスワードを設定する
すべての標準モジュールおよびクラス モジュール (フォームやレポートに含まれるコードなど) をパスワードで保護することにより、ユーザーが不用意に VBA コードを変更したり表示したりすることを防ぐことができます。パスワードを設定した後、Visual Basic Editor でコードを表示または修正するには、セッションごとにパスワードを 1 回入力する必要があります。パスワードの入力は、表示や編集だけでなく、モジュールの切り取り、コピー、貼り付け、エクスポート、または削除を行う場合も必要です。しかし、この方法でコードを保護しても、コードの実行を防止できるわけではありません。また、16 進エディタなどのサードパーティ製ユーティリティを使ってコードを表示できることも理解しておいてください。コードを完全に保護するには、.mdb ファイルを MDE ファイルに変換する必要があります。
プロジェクト内のモジュールにパスワードを設定するには
- Visual Basic Editor の [ツール] メニューで、プロジェクトの [プロパティ] を選択します。
- [プロジェクトのプロパティ] ダイアログ ボックスで、[保護] タブをクリックします。
- [プロジェクトを表示用にロックする] チェック ボックスをオンにしてパスワードを入力します。
- [パスワードの確認入力] ボックスにパスワードを再入力して、[OK] をクリックします。
MDE ファイルを使用する
データベース ファイルを MDE ファイルに変換すると、許可されていないアクセスから Access のコードを完全に保護することができます。.mdb ファイルを MDE ファイルに変換すると、Access はすべてのモジュールをコンパイルして、編集可能なすべてのソース コードを削除し、変換先のデータベースをコンパクトにします。オリジナルの .mdb ファイルは変更されません。新しいデータベースの VBA コードは継続して実行されますが、表示や編集はできません。しかし、Access データベースは正常に機能するため、データの更新およびレポートの実行を行うことができます。Access データベースを MDE ファイルとして保存した場合に具体的に防止できる操作は次のとおりです。
- [デザイン] ビューでのフォーム、レポート、またはモジュールの表示、修正、または作成。
- オブジェクト ライブラリやデータベースへの参照の追加、削除、または変更。
- Access または VBA オブジェクト モデルのプロパティまたはメソッドを使用したコードの変更 (MDE ファイルには編集可能なコードは含まれません)。
- フォーム、レポート、またはモジュールのインポートおよびエクスポート。ただし、テーブル、クエリ、データ アクセス ページ、およびマクロは、MDE 以外のデータベースに対してインポートまたはエクスポートできます。
.mdb ファイルを MDE ファイルに変換するには
データベースを閉じます。
[ツール] メニューの [データベース ユーティリティ] をクリックします。
[MDE ファイルの作成] をクリックします。
[MDE ファイルの作成元データベース] ダイアログ ボックスで .mdb ファイルを指定し、[MDE ファイル作成] をクリックします。
注 : Access 2002 で作成されたデータベースは、既定の Access 2000 ファイル形式を使用しています。Access 2000 ファイル形式のデータベースを MDE ファイルに変換するには、Access 2000 を使用する必要があります。既定の Access 2000 形式で作成された .mdb ファイルを Access 2002 で MDE ファイルに変換するには、あらかじめ Access 2002 ファイル形式に変換しておく必要があります。このためには、最初にデータベースを排他的に開きます (データベースを排他的に開くには、この記事の「手動でデータベースのパスワード設定する」を参照してください)。次に、[ツール] メニューの [データベース ユーティリティ] をポイントし、[データベースを変換] から [Access 2002 ファイル形式] をクリックします。これでデータベースを MDE ファイルに変換することができます。
.mdb を MDE ファイルに変換する際の要件については、Access ヘルプで「Access データベースの Visual Basic for Applications のコードの保護について」を参照してください。
次に、ユーザー レベルのセキュリティについて、もう少し詳しく説明します。
Access のユーザー レベルのセキュリティについて
Access では、データベースに対するオブジェクトの格納および取得に Microsoft Jet データベース エンジンを使用します。Jet データベース エンジンは、ワークグループ ベースのセキュリティ モデル (ユーザー レベルのセキュリティとも呼ばれます) を使用して、データベースを開く権限を持つユーザーを特定し、データベースに含まれるオブジェクトをセキュリティで保護します。データベースが明示的にセキュリティ設定されているかどうかにかかわらず、ユーザー レベルのセキュリティは、Access データベースで常に有効化されています。ここでは、ユーザーおよびグループ アカウントの権限とメンバシップを操作して、Access の既定のセキュリティ レベルを変更する方法について説明します。
Access の起動時、Jet データベース エンジンがワークグループ情報ファイルを検索します (既定では、system.mdw という名前が付いていますが、.mdw の拡張子を付けた別の名前に変更することもできます)。ワークグループ情報ファイルにはパスワードなどのグループ情報およびユーザー情報が格納されています。これらの情報に基づいて、データベースを開く権限を持つユーザー、およびデータベース内のオブジェクトに対するユーザーの権限が特定されます。個々のオブジェクトに対する権限は、データベースに保存されます。したがって、あるユーザー グループに特定のテーブルに限定した権限を与えるといったことが可能になります。また、レポートの表示のみを許可し、デザインの変更は許可しないという権限を与えることもできます。
ワークグループ情報ファイルには、ビルトイン グループ (管理者グループおよびユーザー グループ) と、データベースおよびデータベース内のオブジェクトに対する管理者 (無制限) 権限が割り当てられた汎用ユーザー アカウント (管理者) が含まれています。メニュー コマンド ([ツール] メニューの [セキュリティ] サブメニュー) または VBA コードを使用して、新規グループおよびユーザーを追加することもできます。
注 : Access のインストール時に、指定したユーザー名と組織情報に関連付けられたワークグループ情報ファイルがセットアップ プログラムによって自動的に作成されます。ユーザー名と組織情報は特定しやすい傾向があるので、許可されていないユーザーがワークグループ情報ファイルのコピーを作成し、ワークグループ情報ファイルで定義されているワークグループの管理者アカウント (管理者グループのメンバ) の変更不能な権限を推測する可能性があります。これを防ぐには、新しいワークグループ情報ファイルを作成して、固有のワークグループ ID (WID) を指定します。こうすれば、WID を知っているユーザーしかワークグループ情報ファイルのコピーを作成できなくなります。セキュリティ ウィザードを使った新規ワークグループ情報ファイルの作成については、後で説明します。
管理者グループは削除できません。また、このグループのメンバには、無効にすることができない管理者権限が与えられます。管理者グループの権限は、メニューまたはコードを使って削除できます。ただし、管理者グループのメンバは、削除された権限を再び追加することができます。また、管理者グループには、データベースを管理するために最低 1 人のメンバが常時割り当てられている必要があります。セキュリティで保護されていないデータベースの場合、管理者グループには必ず既定の管理者アカウントが含まれます。既定では、すべてのユーザーはこのアカウントにログオンします。
他のグループに属している場合でも、すべてのユーザーは既定のユーザー グループに属している必要があります。管理者グループに新しいユーザー アカウントを追加しなくても、VBA にユーザー アカウントを作成することができます。ただし、データベースを管理するために Access 内部で使用されているテーブルの多くがユーザー グループの権限にマッピングされているため、VBA に作成したユーザー アカウントを管理者グループに追加しない限り、そのユーザーは Access を正常に起動できません。
Access データベースをセキュリティで保護するには
- 管理者グループに新しいユーザー アカウントを追加します。このユーザーには、データベース内のオブジェクトに対する管理者権限が与えられます。
- 管理者グループから既定の管理者アカウントを削除します。
- ユーザー グループおよび管理者から権限を削除します。
- 作成したカスタム グループに権限を割り当てます。
既定の管理者アカウントにパスワードを設定すると、ログオン ダイアログ ボックスが有効になり、ユーザーには Access を起動するたびに、ユーザー名とパスワードの入力が要求されます。管理者アカウントにパスワードを設定しない場合は、ログオン ダイアログ ボックスが表示されず、ユーザーはパスワードを入力することなく管理者として自動的にログオンします。
データベース内のオブジェクトに対する権限は、ユーザー アカウントに直接割り当てて明示的に指定することも、ユーザーが属するグループから暗黙的に指定することもできます。その両方を組み合わせて指定することも可能です。Access では、ユーザー権限が明示的および暗黙的な権限の組み合わせによって構成されている場合、権限に対して "最小限の制限" 規則が適用されます。たとえば、ユーザー A のアカウントに制限付きの権限が設定されているときに、ユーザー A が制限付きの権限を持つグループと管理者権限 (すべての権限) を持つ別のグループに属している場合、ユーザー A は管理者権限を持つことになります。この理由から、ユーザー アカウントに明示的な権限を割り当てることは、一般にお勧めできません。権限ごとにグループを作成し、ユーザーを適切な権限を持つグループに割り当てれば、データベースの管理で頭を悩ませることも少なくなります。
次のセクションでは、ユーザー インターフェイスとプログラミングを使用して、データベースおよびデータベース内のオブジェクトを保護する方法について説明します。最初に、データベースのパスワードを設定する 2 通りの方法について説明します。
手動でデータベースのパスワードを設定する
データベースにパスワードを設定して、ユーザーがデータベースにアクセスする際にパスワードの入力を要求することができます。しかし、一度ログインすると、ユーザーはデータベース内のデータとオブジェクトに無制限にアクセスできます。
注 : データベースのパスワードを設定する前に、データベースのバックアップを作成し、安全な場所に保存しておくことをお勧めします。
データベースのパスワードを設定するには、データベースを排他的に開いておく必要があります。
データベースを排他的に開くには
- データベースが既に開いている場合は、データベースを閉じます。
- [ファイル] メニューの [開く] をクリックして、データベースを再び開きます。
- [ファイルを開く] ダイアログ ボックスでデータベースを選択し、[開く] ボタンの横にある矢印をクリックして、[排他モードで開く] をクリックします。
手動でデータベースのパスワードを設定するには
[ツール] メニューの [セキュリティ] をポイントし、[データベース パスワードの設定] をクリックします。
[パスワード] ボックスにパスワードを入力します。
注 : パスワードでは大文字と小文字が区別されます。
[確認] ボックスに同じパスワードをもう一度入力してパスワードを確認し、[OK] をクリックします。
これでデータベースのパスワードが設定されます。この後、ユーザーがデータベースを開こうとすると、パスワードの入力を要求するダイアログ ボックスが表示されます。次に、プログラミングによってデータベースのパスワードを設定する方法について説明します。
プログラミングによってデータベースのパスワードを設定する
データベースのパスワードは、次の構文で ALTER DATABASE キーワードを使用することによって、設定、変更、または削除できます。
ALTER DATABASE PASSWORD NewPassword OldPassword
このステートメントでは、パスワードは角かっこ ([ ]) で区切られた String 値として表されます。ただし、以下の例外があります。
初めてデータベースのパスワードを設定する場合は、NULL キーワードを OldPassword パラメータとして ALTER DATABASE ステートメントに使用します。データベースのパスワードを削除する場合は、NULL キーワードを NewPassword パラメータとして ALTER DATABASE ステートメントに使用します。いずれの場合も NULL キーワードには角かっこを付けないでください。
Microsoft ADO Ext 2.5 for DDL and Security ライブラリへの参照が設定されていない場合、次のプロシージャを実行する前に、これを設定する必要があります。
- Visual Basic Editor で、[ツール] メニューの [参照設定] をクリックします。[参照設定] ダイアログ ボックスが表示されます。
- [Microsoft ADO Ext 2.5 for DDL and Security] チェック ボックスをオンにします。
初めてパスワードを設定する場合は、以下のコードを参照してください。
Private Function CreateDBPassword(ByVal Password As String, _
ByVal Path As String) As Boolean
Dim objConn as ADODB.Connection
Dim strAlterPassword as String
On Error GoTo CreateDBPassword_Err
' データベースのパスワードを初期化する SQL 文字列を作成します。
strAlterPassword = "ALTER DATABASE PASSWORD [Password] NULL;"
' セキュリティで保護されていないデータベースを開きます。
Set objConn = New ADODB.Connection
With objConn
.Mode = adModeShareExclusive
.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data " & _
"Source=Path;"
' SQL ステートメントを実行してデータベースを保護します。
.Execute (strAlterPassword)
End With
' オブジェクトをクリーンアップします。
objConn.Close
Set objConn = Nothing
' 成功した場合は True を返します。
CreateDBPassword = True
CreateDBPassword_Err:
Msgbox Err.Number & ":" & Err.Description
CreateDBPassword = False
End Function
このプロシージャによって、ユーザーのパスワードおよび .mdb ファイルのパスが認識されます。まず最初に、セキュリティ設定されていないデータベースへの接続を表す変数および String 変数を宣言して、パスワードの変更に使用する SQL ステートメントを追加します。次に、ALTER DATABASE PASSWORD キーワードを使用する Jet SQL ステートメントに strAlterPassword を設定します。ここでは、パスワードを置き換えないので、2 番目の引数が NULL に設定されていることに注意してください。次に、データベースへの接続を開きます。パスワードを設定するにはデータベースを排他的に開く必要があるため、Mode プロパティを設定します。その後、SQL ステートメントを実行します。セキュリティで保護されていない別のデータベースにパスワードを設定する場合は、通常、1 つのデータベースからこのプロシージャを実行します。すべて成功した場合は、関数から True が返されます。
ここでは、既にセキュリティで保護されているデータベースのパスワードを変更する場合について説明します。変更を行うには、最初に古いパスワードを使ってデータベースにログオンする必要があります。以下のプロシージャは、このテクニックを示しています。
Microsoft ADO Ext 2.5 for DDL and Security ライブラリへの参照が設定されていない場合、次のプロシージャを実行する前に、これを設定する必要があります。
- Visual Basic Editor で、[ツール] メニューの [参照設定] をクリックします。[参照設定] ダイアログ ボックスが表示されます。
- [Microsoft ADO Ext 2.5 for DDL and Security] チェック ボックスをオンにします。
プロシージャは次のようになります。
Private Function ChangeDBPassword(ByVal OldPassword As String, _
ByVal NewPassword As String, ByVal Path As String) As Boolean
Dim objConn as ADODB.Connection
Dim strAlterPassword as String
On Error GoTo ChangeDBPassword_Err
' データベースのパスワードを変更する SQL 文字列を作成します。
strAlterPassword = "ALTER DATABASE PASSWORD [NewPassword] [OldPassword];"
' セキュリティで保護されているデータベースを開きます。
Set objConn = New ADODB.Connection
With objConn
.Mode = adModeShareExclusive
.Provider = "Microsoft.Jet.OLEDB.4.0"
.Properties("Jet OLEDB:Database Password") = "OldPassword"
.Open "Data Source=Path;"
' SQL ステートメントを実行してパスワードを変更します。
.Execute (strAlterPassword)
End With
' オブジェクトをクリーンアップします。
objConn.Close
Set objConn = Nothing
ChangeDBPassword = True
ChangeDBPassword_Err:
Msgbox Err.Number & ":" & Err.Description
ChangeDBPassword = False
End Function
このプロシージャは、パスワードを変更する前にセキュリティで保護されているデータベースに古いパスワードでログオンしなければならないことを除けば、前のサブルーチンとほとんど同じです。これには、変更するデータベースの Connection オブジェクトの Database Password 属性を設定します。これは、Connection オブジェクトの拡張プロパティの 1 つなので、上で説明した特殊な構文を使用します。セキュリティで保護されているデータベースのパスワードを削除する場合も、このプロシージャを使用できます。その場合は、ALTER DATABASE ステートメントの最初の引数に NULL キーワードを代入します。
後半では、データベースにパスワードを設定する方法よりも堅牢な保護の実装方法について説明します。
セキュリティ ウィザードを使って Access データベースのセキュリティを設定する
セキュリティ ウィザードを使ってデータベースのセキュリティを設定するには、以下の手順を実行します。
セキュリティで保護するデータベースを開きます。
[ツール] メニューの [セキュリティ] をポイントして、[セキュリティ ウィザード] をクリックします。[セキュリティ ウィザード] ダイアログ ボックスが表示されます。
ここでは新しいワークグループ情報ファイルを作成します。該当するオプションが選択されていることを確認し、[次へ] をクリックします。
[セキュリティ ウィザード] ダイアログ ボックスの 2 番目の画面 (図 1) で、ワークグループ情報に新しい名前を入力するか、既定の名前を受け入れます。ワークグループ ID (WID) を入力します。WID は、このワークグループ ファイルの固有の管理者グループを識別します。次に、該当するテキスト ボックスにユーザー名と会社名を入力します。これらのエントリはオプションですが、ワークグループ情報ファイルのコピーを作成できるのはこの情報を知っているユーザーだけなので、どちらも入力しておくことをお勧めします。
図 1. [セキュリティ ウィザード] ダイアログ ボックスの 2 番目の画面
このワークグループ情報ファイルをすべてのデータベースの既定ファイルとして使用するか、またはこのデータベース専用の既定ファイルとして使用するかを選択することもできます。[セキュリティ設定されたデータベースへのショートカットを作成する] オプションをクリックし、[OK] をクリックします。
次の画面 (図 2) では、ウィザードでセキュリティ設定するオブジェクトを選択できます。既定では、すべての既存のオブジェクト、および作成したすべての新規オブジェクトがセキュリティで保護されます。[次へ] をクリックします。
図 2. [セキュリティ ウィザード] ダイアログ ボックスの 3 番目の画面
次の画面 (図 3) では、特定の権限が割り当てられたオプションのセキュリティ グループを選択できます。ユーザーのアクセス権限を管理するには、個々のユーザーに特定の権限を与えるのではなく、グループを使用することを強くお勧めします。追加のグループ アカウントを選択して、[次へ] をクリックします。
図 3. [セキュリティ ウィザード] ダイアログ ボックスの 4 番目の画面
この画面 (図 4) では、ユーザー グループに特定の権限を設定できます。すべてのユーザーは自動的にユーザー グループのメンバとなるため、ここで選択する権限はすべてのユーザーに適用されます。したがって、このグループの権限を制限するか、権限なしの既定設定を受け入れることをお勧めします。[次へ] をクリックします。
図 4. [セキュリティ ウィザード] ダイアログ ボックスの 5 番目の画面
次の画面 (図 5) では、ユーザーをワークグループ情報ファイルに追加できます。各ユーザーにパスワードおよびパーソナル ID (PID) を指定することもできます。Access では、アカウント名と PID の組み合わせによって、ワークグループの個々のユーザーが識別されます。ユーザーを追加し、[次へ] をクリックします。
注 : パーソナル ID (PID) はパスワードではありません。PID はユーザー名と共に暗号化されて、ユーザーを識別する固有のシステム識別子 (SID) を形成します。
図 5. [セキュリティ ウィザード] ダイアログ ボックスの 6 番目の画面
この画面 (図 6) では、ユーザーをワークグループ ファイル内のグループに追加します。必要な選択を行い、[次へ] をクリックします。
図 6. [セキュリティ ウィザード] ダイアログ ボックスの 7 番目の画面
最後の画面では、セキュリティで保護されていないデータベースのバックアップ コピーの名前を指定します。セキュリティによる保護設定を行ったデータベースが消失または破損した場合に備え、オリジナル データベースのコピーを安全な場所に保管しておくことをお勧めします。[完了] をクリックします。オリジナルのデータベースが .bak の拡張子で保存されます。
注 : ワークグループ情報ファイルの作成時に、このファイルを再作成する際に必要となるすべての情報が含まれたレポートが作成されます。オリジナルのワークグループ情報ファイルが消失または破損した場合に再びファイルを作成できるよう、この情報を安全な場所に保管しておいてください。
[完了] をクリックすると、データベースが暗号化され、このセキュリティ保護設定がされたデータベースを新しいワークグループ情報ファイルを使って再び開くよう要求されます。
次に、プログラミングによってユーザーとグループを操作する方法について説明します。
プログラミングによってユーザーとグループを追加および削除する
データベースをセキュリティで保護すると、ユーザーやグループを操作する必要性が生じる場合があります。以下のセクションでは、これらのテクニックについて説明します。
Microsoft ADO Ext 2.5 for DDL and Security ライブラリへの参照が設定されていない場合、次のセクションのプロシージャを実行する前に、これを設定する必要があります。
- Visual Basic Editor で、[ツール] メニューの [参照設定] をクリックします。[参照設定] ダイアログ ボックスが表示されます。
- [Microsoft ADO Ext 2.5 for DDL and Security] チェック ボックスをオンにします。
ユーザーを追加および削除する
以下のプロシージャでは、新しいユーザー アカウントを作成し、現在のデータベースで使用されているワークグループ情報ファイルの既定のユーザー グループに追加します。
注 : この例は、Access で管理者グループのメンバとしてログオンしてデータベースを開いていること前提としています。以下のプロシージャでは、strUser で指定された名前のユーザーがワークグループ情報ファイルに含まれていないことを確認してください。この確認は、DeleteUser サブルーチンなどを最初に呼び出して行うことができます。
コードは次のようになります。
Private Function AddUser(ByVal strUser As String, _
ByVal strPID As String, _
Optional ByVal strPwd As String) As Boolean
Dim catDB As ADOX.Catalog
On Error GoTo AddUser_Err
' Catalog オブジェクトをインスタンス化します。
Set catDB = New ADOX.Catalog
With catDB
' 現在のデータベースへの接続を使用して、Catalog オブジェクトを
' 開きます。
.ActiveConnection = CurrentProject.Connection
' 新しいユーザー アカウントを作成します。
.Users.Append strUser, strPwd, strPID
' 新しいユーザー アカウントを既定のユーザー グループに追加します。
.Groups("Users").Users.Append strUser
End With
' Catalog オブジェクトを閉じます。
Set catDB = Nothing
AddUser = True
AddUser_Err:
Msgbox Err.Number & ":" & Err.Description
AddUser = False
End Function
このプロシージャは、最初に Catalog オブジェクトの変数を宣言し、その後でオブジェクトをインスタンス化しています。
注 : Catalog オブジェクトは、Access データベース ファイルのすべてのオブジェクトのコンテナです。
次に、プロシージャは現在のデータベースへの接続を開き、呼び出し元のプロシージャの引数を使って、新しいユーザー アカウントを Catalog オブジェクトの Users コレクションに追加しています。その後、新しいユーザーは、既定のユーザー グループに追加されます。Users コレクションには、ワークグループ情報ファイルで定義されているデータベースのすべてのユーザーが含まれます。
既存のユーザーを削除するには、以下のプロシージャを使用できます。
Private Function DeleteUser(ByVal strUser As String) As Boolean
Dim catDB As ADOX.Catalog
On Error GoTo DeleteUser
' Catalog オブジェクトをインスタンス化します。
Set catDB = New ADOX.Catalog
With catDB
' 現在のデータベースの Catalog オブジェクトを開きます。
.ActiveConnection = CurrentProject.Connection
' strUser を削除します。
.Users.Delete strUser
End With
' Catalog オブジェクトを閉じます。
Set catDB = Nothing
DeleteUser = True
DeleteUser_Err:
Msgbox Err.Number & ":" & Err.Description
DeleteUser = False
End Function
このプロシージャは、strUser String 引数で指定されているユーザーを削除するために Catalog オブジェクトの Delete メソッドを使用していることを除けば、前のプロシージャとほとんど同じです。
グループを追加および削除する
グループを追加するプロシージャは、ユーザーを追加するプロシージャとほとんど同じです。
Private Function AddGroup(ByVal strGroup As String, _
ByVal strPID As String) As Boolean
Dim catDB As ADOX.Catalog
On Error GoTo AddGroup_Err
Set catDB = New ADOX.Catalog
With catDB
' 現在のデータベースの Catalog オブジェクトを開きます。
.ActiveConnection = CurrentProject.Connection
' 新しいグループを作成します。
.Groups.Append strGroup, strPID
End With
' Catalog オブジェクトを閉じます。
Set catDB = Nothing
AddGroup = True
AddGroup_Err:
Msgbox Err.Number & ":" & Err.Description
AddGroup = False
End Function
このプロシージャは、Catalog オブジェクトをインスタンス化してから、現在のデータベースへの接続を開いています。次に、呼び出し元のプロシージャの引数を使用して、新しいグループを Catalog オブジェクトの Groups コレクションに追加しています。
既存のグループを削除するには、以下のプロシージャを使用できます。
Private Function DeleteGroup(ByVal strGroup As String) As Boolean
Dim catDB As ADOX.Catalog
On Error GoTo DeleteGroup_Err
Set catDB = New ADOX.Catalog
With catDB
' 現在のデータベースの Catalog オブジェクトを開きます。
.ActiveConnection = CurrentProject.Connection
' strGroup を削除します。
.Groups.Delete strGroup
End With
' Catalog オブジェクトを閉じます。
Set catDB = Nothing
DeleteGroup = True
DeleteGroup_Err:
Msgbox Err.Number & ":" & Err.Description
DeleteGroup = False
End Function
このプロシージャは、strGroup String 引数で指定されているグループを削除するために Catalog オブジェクトの Delete メソッドを使用していることを除けば、前のプロシージャとほとんど同じです。
次のセクションでは、プログラミングによってデータベース オブジェクトに権限を設定する方法について説明します。
プログラミングによって権限を設定する
データベース内のさまざまなオブジェクトに権限を設定するには、Group または User オブジェクトの SetPermissions メソッドを使用できます。次のプロシージャでは、最初にグループのすべての権限を無効にし、その後、グループ固有の権限を設定しています。この方法により、必要な権限だけがグループに割り当てられるようになります。
Private Function SetGroupPermissions(ByVal strGroup As String, _
ByVal strTable As String, ByVal strObjectType As String, _
ByVal strAction As String, _
ByVal strRevokeEnum As String) As Boolean
Dim catDB As ADOX.Catalog
On Error GoTo SetGroupPermissions_Err
Set catDB = New ADOX.Catalog
With catDB
' 現在のデータベースの Catalog オブジェクトを開きます。
.ActiveConnection = CurrentProject.Connection
' グループのすべての権限を無効にします。
.Groups(strGroup).SetPermissions tblTable, _
strObjectType, strAction, strRevokeEnum
' グループに対して特定の権限を設定します。
.Groups(strGroup).SetPermissions tblTable, _
strObjectType, strAction, _
adRightRead Or adRightInsert Or adRightUpdate
End With
' Catalog オブジェクトを閉じます。
Set catDB = Nothing
SetGroupPermissions = True
SetGroupPermissions_Err:
Msgbox Err.Number & ":" & Err.Description
SetGroupPermissions = False
End Function
このプロシージャでは、現在のデータベースの Catalog オブジェクトを開いた後、Groups コレクションの SetPermissions メソッドを使用して Employees テーブルのグループのすべての権限を無効にしています。最初の引数はテーブル名を指定し、2 番目の引数はオブジェクトの種類 (この例ではテーブル) を指定します。3 番目の引数は、権限を設定するときに実行する操作の種類を指定し、4 番目の引数はグループに何も権限を割り当てないことを示す単一権限の定数を指定します。これで、Employees テーブルのグループのすべての権限が無効化されたので、必要な権限だけを設定することができます。
次のステートメントの最初の 3 つの引数には、前のステートメントと同じものが入っています。4 番目の引数は、異なる権限の定数の組み合わせを Or 演算子で結合して作成された値です。この例では、テーブルに対する読み取り、挿入、および更新の権限を設定します。
上の例のテーブルのように、指定した種類のすべての新しいオブジェクトに権限を設定するには、権限の取得に使用したステートメントの最初の引数を NULL キーワードに変更します。次に例を示します。
...
catDB.Groups(strGroup).SetPermissions NULL, adPermObjTable
...
まとめ
この記事では、Access データベースにさまざまなレベルの保護を実装するための各種の方法について説明しました。最初に、共有レベルとユーザー レベルの 2 つのセキュリティについて説明しました。その後、Access のセキュリティ ウィザードを使ってセキュリティを実装する方法、およびプログラミングによってセキュリティを実装する方法について説明しました。