SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

SQL Database のセキュリティ設定の基本パターンのメモ

leave a comment

現状、SQL Database の設定管理は T-SQL で実施することになります。
どんなオブジェクトが作成されているかは GUI から確認できますが、細かな設定に関しては SQL で設定 / 取得する必要があります。

セキュリティ関連の設定について、どのように設定するかの基本パターンをメモとして。

ログインとユーザーの情報については
SQL Azure におけるデータベースとログインの管理
Windows Azure SQL データベースにおけるデータベースとログインの管理

■ログインとユーザー


SQL Database のユーザー管理は、

  • ログイン
  • ユーザー

の 2 種類になります。

ログインはサーバーにログインするためのオブジェクトとなりサーバーの操作として何ができるかを設定するためのオブジェクトとなります。
サーバーにアクセスするための権限についてはログインで管理することになります。
SQL Database の場合は、

  • loginmanager
  • dbmanager
  • ロールを付与しない

のどれかを選ぶことになるかと思います。

ユーザーは操作するためのオブジェクトを制御するための設定となり、ログイン後にデータベースのオブジェクトに対してどのような操作ができるかを制御するためのオブジェクトとなります。
一般的にはログイン名と同様のユーザーを使用することになると思いますが、テーブルの SELECT の権限などはユーザーに対して付与をします。

固定データベースロールもいくつか用意されていますが、個別に権限を設定することで細かなアクセス制御をすることができます。

image

権限系に関しては以下のシステムビューから確認をすることができます。

  • sys.database_principals
  • sys.database_permissions
  • sys.database_role_members

■master データベースにログインとユーザーを作成


サーバーに接続するためにはログインが必要ですが、初回のログイン時は master データベースに接続されますので、master にもユーザーを作成しておきます。
# ユーザーデータベースを直接指定した場合は不要になりますが、SSMS 等でデータベースを指定しないで接続をした場合は master に接続されますので。

-- ログインの作成 (master)
CREATE LOGIN user01
WITH PASSWORD = '<パスワード>'
GO
CREATE LOGIN user02
WITH PASSWORD = '<パスワード>'
GO
-- ユーザーの作成 (master)
CREATE USER user01
FOR LOGIN user01
GO
CREATE USER user02
FOR LOGIN user02
GO

 

これで、作成したログインで SQL Database にログインすることができるようになります。

 

■スキーマとデータベースユーザーを使用した参照権限の設定


スキーマに関してはデフォルトの [dbo] を使用することもできますが、今回は違うパターンを載せておきたいと思います。

以下のように、各ユーザー用のスキーマを用意し、ビュー経由でテーブルを参照する構成を設定してみたいと思います。

# 参照テーブルは直接 SELECT ができないセキュリティ設定となります。

 

image

まずはユーザーデータベースにユーザーを作成します。

この際にユーザーの規定のスキーマは各ユーザー用のスキーマにしています。

-- ユーザーの作成 (ユーザーデータベース)
CREATE USER user01
FOR LOGIN user01
WITH DEFAULT_SCHEMA = user01
GO
CREATE USER user02
FOR LOGIN user02
WITH DEFAULT_SCHEMA = user02
GO

 

次にスキーマを作成します。

スキーマの所有者は dbo を設定し、各ユーザーにはこのスキーマの SELECT 権限を付与しています。

-- スキーマの作成
CREATE SCHEMA user01
AUTHORIZATION dbo
GRANT SELECT ON SCHEMA::user01 TO user01
GO
CREATE SCHEMA user02
AUTHORIZATION dbo
GRANT SELECT ON SCHEMA::user02 TO user02
GO

 

これで基本的な環境が作成できましたので次にテーブルを作成します。

このテーブルは dbo のスキーマ配下にあるテーブルですので、user01 / user02 は直接参照することはできません。

image

-- テーブルの作成
IF OBJECT_ID('dbo.BaseTable') IS NOT NULL
  DROP TABLE dbo.BaseTable
GO
CREATE TABLE dbo.BaseTable
(
	Col1 int NOT NULL,
	Col2 nvarchar(50) NOT NULL,
    CONSTRAINT PK_BaseTable PRIMARY KEY (Col1)
)
GO
CREATE INDEX IX_BaseTable_Col2
ON dbo.BaseTable
(
	Col2
)
GO
-- 初期データの投入
INSERT INTO BaseTable VALUES (1, N'user01')
INSERT INTO BaseTable VALUES (2, N'user02')
INSERT INTO BaseTable VALUES (3, N'user01')
INSERT INTO BaseTable VALUES (4, N'user02')
INSERT INTO BaseTable VALUES (5, N'user01')
INSERT INTO BaseTable VALUES (6, N'user02')

 

参照元のテーブルが作成できたら各ユーザーのビューを作成します。

ビューでは各ユーザーのデータのみを表示するように制限をしています。

-- ビューの作成
IF object_id(N'user01.RefView', 'V') IS NOT NULL
	DROP VIEW user01.RefView
GO
CREATE VIEW user01.RefView AS
SELECT * FROM dbo.BaseTable
WHERE Col2 = USER_NAME()
GO
IF object_id(N'user02.RefView', 'V') IS NOT NULL
	DROP VIEW user02.RefView
GO
CREATE VIEW user02.RefView AS
SELECT * FROM dbo.BaseTable
WHERE Col2 = USER_NAME()
GO

 

今回は画面キャプチャ用に EXECUTE AS で実行していますが、同じクエリを実行してもユーザーによって異なるデータを返すせってとなっています。

# デフォルトのスキーマを利用した参照オブジェクトの変更を利用したものです。

image

ビューからのみデータを参照するための設定としてはこれで実現できるかと思います。

私の場合、テーブルの設計等から入ることは珍しいためセキュリティの設定は都度思い出さないとなかなか理解が追い付かないですね…。

Share

Written by Masayuki.Ozawa

9月 8th, 2013 at 3:26 pm

Leave a Reply