サーバーのセキュリティは、主に、オブジェクトへのアクセス許可をどれだけ正しく構成できるかに依存します。ユーザーに過度の権限を与えると、多くの問題が発生する可能性があります。いいえ、ユーザーはエラーを使用しません。代わりに、ハッカーまたは私がこれを行います。この場合、データを含むテーブルやデータベース全体を忘れることができます。
何らかの理由で、データベースのセキュリティは、ハッカーなどの外部からの保護です。ただし、これはめったに発生しません。私は大企業のプログラマーであり、管理者はすべてが開いているサーバーポートを保護することさえ考えていません。単一のサーバー上に多数のデータベース、プログラム、さらにはFTPサーバーがあり、過去5年間にハッキングされたことはありません。幸い、私は管理者にWEBサーバーを別のハードウェアに展開するように説得しました。そうでなければ、誰かが私たちのメインサーバーのIPアドレスを知っていれば、どんな怠け者でもそれをハッキングすることができます。データベースもWindowsも数年間パッチが適用されていません。
ただし、セキュリティポリシーが正しくないため、内部の問題が毎日発生します。すべてのユーザーは管理者権限でログインし、必要なものを作成できます。過度の許可は怠け者が彼らの完全な非識字を示すことを可能にするので、これは本当の問題です。したがって、脅威がどこから来たのか(ハッカーから、またはユーザーから)に関係なく、セキュリティを検討します。
この記事では、ハッカーとユーザーの両方からのセキュリティ保護に必要なすべての基本事項について検討します。 MS SQL Serverを例として選択したのは、他のデータベース(Oracle、MySQLなど)で利用可能なすべてのものが含まれており、追加のセキュリティ管理機能があるためです。誰かがこれがMSをより急にすると思うかもしれません。ただし、追加機能が過剰になり、問題が発生する場合があります。
サーバーの役割
Windowsおよびその他のオペレーティングシステムには、アクセス許可を管理するためのグループとユーザーがあります。ユーザーを1つのグループにまとめて、一度にすべてのユーザーに権限を付与できます。これは、各ユーザーに個別に権限を割り当てるよりもはるかに簡単です。これらの目的のために、データベースには「役割」という概念があります。
100人のユーザーが特定のテーブルからデータを読み取るためのアクセス許可を持っていると想定します。各ユーザーにこの権限を与えるのは面倒です。読み取りが許可されているロールを作成してから、必要なすべてのユーザーをそのロールに追加する方がはるかに簡単です。結果はグループ化に似ています。
SQL Serverには、サーバーとデータベースの2種類の役割があります。サーバーの役割は事前定義されており、変更できません。
Enterprise Managerでセキュリティ/サーバーの役割ブランチを開き、ウィンドウの右側に使用可能な役割のリストが表示されるようにします。説明は、ユーザーが対応する役割で何ができるかを定義します。
MSSQLServerのサーバーの役割と役割マネージャーウィンドウ
既存のユーザーをロールに追加するには、ロールの行をダブルクリックします。表示されるウィンドウで、ユーザーをロールに追加したり、ユーザーを削除したりできます。 [権限]タブには、各ユーザーができることの詳細が記載されています。
ユーザー
ユーザーを管理するには、EnterpriseManagerでセキュリティ/ログインブランチを開きます。右側に、すべてのサーバーユーザーのリストが表示されます。デフォルトでは、アクセスはドメイン管理者とsaなどの組み込みのログインアカウントに付与されます。
新しいユーザーを追加するには、ウィンドウの右側の空の部分を右クリックして、表示されるメニューで[新規ログイン]を選択します。ウィンドウの最上部で、ユーザー名を選択します。既存のドメインまたはコンピューターユーザーを選択する必要がある場合は、入力フィールドの右側にある(…)ボタンをクリックすると、ドメイン内にユーザー検索ボックスが表示されます。
新しいユーザーの追加
以下で、認証のタイプ(WindowsまたはSQL Server)を選択できます。 Windowsを選択した場合、サーバーがパスワードをシステムから取得するため、パスワードを指定する必要はありません。ただし、アクセスの許可(アクセスの許可)またはアクセスの拒否(禁止)のいずれかを切り替えることができます。後者の場合、ユーザーはデータベースに登録されますが、接続することはできません。禁止されています。
SQL Server認証を選択した場合、パスワードを設定する必要があります。この場合、パスワードはデータベースサーバーのシステムテーブルに保存されるためです。サーバー設定でWindows認証のみが指定されている場合でも、SQLサーバーレコードを作成することはできますが、これらのレコードを使用してシステムにログインすることはできません。
[サーバーの役割]タブで、ユーザーに付与するサーバーの役割を指定できます。したがって、作成の段階でも、必要な役割にユーザーを追加できます。
データベースへのユーザーアクセス
[データベースアクセス]タブで、ユーザーが操作できるデータベースを指定します。ここでは、ウィンドウが2つの部分に分かれています。上半分では、アクセスを許可するデータベースを選択でき、下のリストでは、データベースの役割を選択できます。データベース内のこの役割は、ユーザー権限を定義します。 1人のユーザーに複数の役割を付与できます。
Northwindデータベースにアクセスできるアカウントqqを作成します。これは、サーバーの展開時に作成される標準のテストデータベースです。
変更を保存します。
次に、Databases / Northwind / Usersブランチを開き、選択したデータベースへのアクセスが許可されているユーザーのリストを確認します。ここにqqアカウントがあることに注意してください。新しいユーザーがデータベースにアクセスすることは禁止されているため、他のデータベースにはアカウントがありません。
データベースの役割
各データベースには、オブジェクトへのアクセス許可を定義する独自の役割を設定できます。多くの管理者は、これらの権限を気にすることを好みません。したがって、ほとんどすべてを許可する組み込みのデフォルトのパブリックをインストールします。パブリックロールの権限が不足している場合は、システム管理者サーバーロールにユーザーを追加するだけです。この場合、データベースは脆弱になります。
各ユーザーには、独自の必要な権限を付与する必要があります。許可されていないものは禁止されなければなりません。サーバーにすでに存在するロールは、すべてのユーザーにアクセス許可が公開されているため、使用しないでください。それらすべて、特に公開されているものも削除することをお勧めします。
役割の作成
新しいデータベースロールを作成するには、[データベース]/[データベース名]/[ロール]ブランチを右クリックします。表示されるメニューで、[新しいデータベースの役割]を選択します。 [データベースロールのプロパティ-新しいロール]ウィンドウが開きます。ウィンドウの上部に、役割名を入力します。
たとえば、会計士の役割を作成したいとします。これを行うには、[名前]フィールドに「Buh」と入力します。
データベースロールの作成
以下で、標準のデフォルトの役割タイプなどを選択します。ウィンドウの中央には、ロールに追加されるユーザーのリストがあります。これまでのところ、リストは空です。ただし、[追加]をクリックすると、たとえば、前に作成したqqアカウントにユーザーが追加されます。役割を作成する段階では、他に何もする必要はありません。 [OK]をクリックして変更を保存します。
アクセス許可
次に、権限を設定する方法を見ていきます。作成したBuhロールをダブルクリックして、編集用のウィンドウを開きます。現在、[許可]ボタンが使用可能になっていることに注意してください。ロールがデータベースに登録されている場合にのみ、その権限を変更できます。このボタンをクリックして、[データベースの役割のプロパティ]ウィンドウを開きます。
ロールのアクセス許可の設定
ウィンドウの上部には、データベースの役割のリストがあり、それらをすばやく切り替えることができます。これで、Buhロールが選択されました。ウィンドウの中央には、次の列を持つ大きなグリッドがあります。
- オブジェクト–オブジェクトの名前;
- 所有者–オブジェクトの所有者;
- SELECT –データを表示またはSELECTステートメントを実行するための権限。テーブルとビューでのみ使用できます。
- INSERT –データを追加したりINSERTステートメントを実行したりするための権限。テーブルとビューでのみ使用できます。
- UPDATE –データを変更またはUPDATEステートメントを実行するための権限。テーブルとビューでのみ使用できます。
- データを削除するか、DELETEステートメントを実行するためのDELETE権限。テーブルとビューでのみ使用できます。
- EXEC –ストアドプロシージャと関数を実行するための権限。ストアドプロシージャと関数でのみ使用できます。
- DRI(宣言型参照整合性)。テーブル、ビュー、関数でのみ使用できます。
新しい役割に対する権限はありません。カテゴリなどのテーブルを表示できるようにするには、[カテゴリ]行と[選択]列の交点にあるチェックボックスをオンにします。ボックスに緑色のチェックマークが表示されます。これは許可を意味します。 2回目のクリックで、目盛りが赤い十字マークに変わり、禁止を意味します。これは、ユーザーに権限を付与し、選択したアクションへのアクセスが許可されている別のロールにユーザーを追加する場合に必要になることがあります。 3回目のクリックでアクションの権限が削除され、ボックスは空のままになります。これは、アクセスがないことを意味します。ただし、ユーザーがオブジェクトに対する権限を持つ別の役割に追加されている場合、または権限が明示的に指定されている場合は、委任できます。
テーブルまたはビューのオブジェクトを含む行を選択すると、ウィンドウの下部にある[列]ボタンが使用可能になります。テーブルを選択してこのボタンをクリックしたとします。ウィンドウが開き、個々のテーブル列の権限を設定できます。
列の権限の設定
データベースの整合性に関与する一部の列は、ユーザーやハッカーが変更してはならないため、これは確かに大きな可能性です。これらの列のUPDATEまたはSELECT操作(可能な場合)を禁止することをお勧めします。
個人主義
ロールは、類似したユーザーを組み合わせる必要がある場合に便利です。たとえば、多くの会計士が財務表にアクセスする必要があります。各会計士に権限を付与するには時間がかかります。経理担当者の役割を作成し、それに権限を付与してから、すべての経理アカウントをこの役割に追加する方がはるかに簡単です。
ただし、権限がユーザーに対して一意である必要がある場合や、ロールによって付与される権限に加えて、追加の権限を付与する必要がある場合があります。たとえば、会計士の1人は、人事部門のテーブルにアクセスできる必要があります。この場合、新しい役割を作成するよりも、アカウント担当者に直接権限を追加することをお勧めします。
最初に役割を調べて、それらに慣れました。ほとんどの場合、アカウント担当者用の個別のアカウント、エコノミスト用の個別のアカウントなどがあります。この場合、ほとんどの人は1つのアカウントを使用してサーバーに接続します。したがって、誰が不可能なことをするかを制御すること。必要に応じて個別の権限を使用することをお勧めしますが、各ユーザーは独自のアカウントを持っている必要があります。
テーブルの権限
テーブルなどの特定のオブジェクトに権限を付与する方法を見てみましょう。
オブジェクトツリーでDatabases/Northwind/Tablesブランチを選択します。右側に、すべてのテーブルのリストが開きます。任意のテーブルを右クリックして、[すべてのタスク]/[権限の管理]を選択します。 [権限のプロパティ]ウィンドウが開きます。これは、オブジェクトのリストではなくユーザーのリストが表示される[データベースの役割のプロパティ]ウィンドウに似ています。オブジェクトはクリックしたテーブルであり、その名前がウィンドウのドロップダウンメニューに表示されます。次に、このオブジェクトにさまざまなユーザーの権限を設定する必要があります。
テーブルに権限を設定する
権限のリストは次のとおりです:表示、更新、追加、削除、実行、および管理。 [列]ボタンをクリックすると、ウィンドウが開き、特定のユーザーのテーブルフィールドのレベルでオブジェクトの権限を設定できます。
ビュー
2つのテーブルがあります。 1つは従業員のリストを格納し、もう1つのテーブルには1か月あたりの労働時間数と受け取った賃金(公式および非表示の賃金)に関する情報が含まれています。
税務当局があなたのところに来て、労働者の賃金を示すように頼んだと仮定します。さらに、彼らはあなたがすべての税金を支払ったかどうか尋ねます。自分の側でどのようなアクションを実行する必要がありますか?
最初の提案は3行目からのもので、従業員と給与のリストを含むテーブルを読むことを許可された新しいユーザーを作成することです。さらに、隠された賃金でコラムを閉じることを忘れないでください。実際、解決策は正しいですが、まったく効果がありません。
最良のオプションは、データを選択するSQLクエリであるビューを作成することです。データベースでは、テーブルのように見えます。クエリを使用してSQLデータを選択し、アクセス許可を付与できます。クエリはクエリに対して実行されることがわかりました。
ビューを作成するには、次のクエリを実行します。
CREATE VIEW salary AS SELECT fields for a tax official FROM Employees, Wages WHERE joins
これで、Databases / Northwind/Viewsブランチに新しいWageオブジェクトがあります。それを右クリックして[すべてのタスク]/[アクセス許可の管理]を選択すると、アクセス許可を付与するためのウィンドウが開きます。税務署の許可を設定して保存します。ビューのコンテンツを確認するには、クエリを実行します:
SELECT * FROM salary
ご覧のとおり、単純なテーブルへのアクセスがあります。税務当局も実際のデータを見ていると思います。ただし、実際には、このクエリには必要なデータのみが含まれます。
実生活では、税務署員は愚か者ではないので、それほど簡単にだまされることはありません。ただし、この例は、ビューが完全なセキュリティ方法になり得ることを示しています。ユーザーが必要とするデータだけを表示できます。同時に、テーブルのアクセス許可に影響を与えることなく、ビューのアクセス許可を管理するためのすべてのツールがあります。
したがって、同じテーブルに対する異なるビューは、異なるデータを表示する場合があります。追加の列を表示する場合は、クエリにビューを追加します。この場合、権限を変更する必要はありません。
システムビュー
各データベースには、サーバーによって自動的に作成されたシステムビューが存在する場合があります。ハッカーがアクセス許可を設定したり、単にデータを破棄したりするのに役立つ追加情報が表示される可能性があるため、アクセス許可を付与することはお勧めしません。システムビューはsysプレフィックスで始まり、システムはリストの[タイプ]列で指定されます。
手順と機能
最新のデータベースサーバーは、ストアドプロシージャと関数をサポートしています。これは、データベースサーバーで実行されるデータベースに応じて、PL/SQLまたはTransact-SQLコードです。これらの手順を使用して、サーバー上で任意の操作を実行したり、ビューのようにデータを選択したりできます。各手順に権限を設定できます。
ロールを確認するとき、権限を設定できるオブジェクトのリストにあるプロシージャをすでに確認しました。プロシージャは実行のみが可能であるため、これらの行ではEXEC列のみを使用できます。
ストアドプロシージャと関数は、特定のデータベースに格納されます。 Northwindデータベースのプロシージャを表示するには、Databases / Northwind /StoredProceduresブランチを選択します。多くのシステムプロシージャがあり、その名前はdt_プレフィックスで始まり、システムは[タイプ]列で指定されます。可能であれば、これらの手順へのアクセスを許可しないことをお勧めします。 Databases /Northwind/ユーザー定義関数ブランチで関数を確認できます。
プロシージャと機能の権限を変更するには、その名前を右クリックして、メニューの[すべてのタスク]/[権限の管理]を選択します。表示されるウィンドウでは、プロシージャのEXEC列と、関数のEXEC列およびDRI列のみを変更できます。
許可ポリシー
一部の管理者は、パブリックなどの既存の役割に基づいて権限を設定します。この役割には、ユーザーが必要としない権限が存在する可能性があるため、これは当てはまりません。したがって、まったく新しい許可を設定してみてください。
私の場合、私は常に新しい役割を作成し、最小限の権限を付与します。ユーザーがより多くの権限を要求し、それらが実際に必要な場合は、さらに権限を追加します。デフォルトですべてを許可した場合、将来的に不要で危険な権利が削除される保証はありません。
より少ない権限を設定するためのもう1つの問題は、習慣です。ユーザーは、多くの許可が与えられているという事実に慣れることができ、その後、禁止は重大なスキャンダルを引き起こします。自分の権利が侵害されたとき、誰も好きではありません。
テーブル/データベース
データベースは、設定と非表示のプロパティをシステムテーブルとデータベースに保存します。これらは他のデータベースオブジェクトと違いはなく、権限を設定できます。いかなる場合でも、特別な必要なしにユーザーがこれらのテーブルにアクセスすることを許可しないでください。
SQL Serverでは、重要なシステムデータはmasterデータベースとmsdbデータベースに保存されます。したがって、これらのデータベースは保護されます。 Oracleでは、各データベースは個別のオブジェクトとして存在し、システムテーブルはユーザーのテーブルと一緒に保存されます。
ほとんどすべてのデータベースサーバーは、システムの学習またはテストに使用できるテストデータベースのインストールを提供しています。それらがある場合は、削除します–これらのデータベースにはパブリックアクセスが設定されているためです。ハッカーがシステム内の既存のオブジェクトの名前やプロパティを知っている場合、ハッカーのタスクは大幅に簡素化されます。
テストデータベースに接続すると、サーバー上でいくつかのコマンドを実行し、OSまたは動作中のデータベースに損傷を与える可能性があります。システムに追加のものを含めることはできません。さらに、このようなテーブル/データベースには、ゲストに対しても非常に高い権限があります。
概要
例としてMSSQLServerを使用したにもかかわらず、アクセス許可、役割、および認証の概念はすべてのデータベースに存在します。
私たちが検討したすべてのルールを知っているので、必要なのは、データベースでのそれらの使用の特殊性を調査することだけです。