夏椰の東屋

- お遊び記録 -

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  108  : 記事  1  : コメント  3974  : トラックバック  30

ニュース


落書きしてね♪

IAM
僕がとった写真です。
ご自由にお使いください。

フィードメーター - 夏椰の東屋 track feed
広告


記事カテゴリ

書庫

日記カテゴリ

Other Site From Kaya

(前回→http://blogs.wankuma.com/kaya/archive/2007/01/03/54520.aspx )

さて、スキーマを分けたところで 終わりました。

trnスキーマはプログラムなどから自由に読み書きできるスキーマと考えることも出来るのですが、

mstスキーマに対しては、個人情報漏洩などの観点から、簡単に何でも出来ちゃ困りますよね?

なので、この回ではアクセス権限の設定をします。

まずは、trnuserに対してmstスキーマの全権限を拒否します。


DENY ALTER ON SCHEMA::[mst] TO [trnuser]
GO
DENY CONTROL ON SCHEMA::[mst] TO [trnuser]
GO
DENY DELETE ON SCHEMA::[mst] TO [trnuser]
GO
DENY EXECUTE ON SCHEMA::[mst] TO [trnuser]
GO
DENY INSERT ON SCHEMA::[mst] TO [trnuser]
GO
DENY REFERENCES ON SCHEMA::[mst] TO [trnuser]
GO
DENY SELECT ON SCHEMA::[mst] TO [trnuser]
GO
DENY TAKE OWNERSHIP ON SCHEMA::[mst] TO [trnuser]
GO
DENY UPDATE ON SCHEMA::[mst] TO [trnuser]
GO
DENY VIEW DEFINITION ON SCHEMA::[mst] TO [trnuser]
GO

この状態でtrnuserで接続し、SELECT * FROM MST.USERINFOを発行すると以下のエラーになります。

メッセージ 229、レベル 14、状態 5、行 1
SELECT 権限がオブジェクト 'userinfo'、データベース 'データベース名'、スキーマ 'mst' で拒否されました。

これで見れなくなりましたね。

って、さて困りました。

trnスキーマにあるユーザ購入情報(親)・(子)テーブルには

mstスキーマにあるユーザ情報、商品情報を参照するためのキーを持っています。

だからtrnuserにとってmstスキーマの情報がまったく見れないのは困るんです。

 

仕方がないので、trnuserには参照するだけの権限を与えてあげましょう。


GRANT CONTROL ON SCHEMA::[mst] TO [trnuser] AS [mstuser]
GO
GRANT SELECT ON SCHEMA::[mst] TO [trnuser] AS [mstuser]
GO
GRANT REFERENCES ON SCHEMA::[mst] TO [trnuser] AS [mstuser]
GO

SELECT文発行

select * from mst.userinfo;

ID LN FN POST ADDRESS
100 NULL 今川 1234567 神奈川県
110 NULL 大木 7654321 東京都
120 NULL 9873216 千葉県

※ 参照するだけなんですが、この3種類の権限を与えてあげなければいけません。

 

さて、見えるようになりましたね。

でも、この状態ではユーザ情報(userinfo)に格納されている住所などの個人情報もみえてしまいます。

なので、ユーザ情報のある特定列だけ参照を許すようにしてあげましょう。


GRANT REFERENCES ON [mst].[userinfo] ([id]) TO [trnuser] AS [mstuser]
GO
GRANT SELECT ON [mst].[userinfo] ([id]) TO [trnuser] AS [mstuser]
GO
GRANT REFERENCES ON [mst].[userinfo] ([fn]) TO [trnuser] AS [mstuser]
GO
GRANT SELECT ON [mst].[userinfo] ([fn]) TO [trnuser] AS [mstuser]
GO
GRANT REFERENCES ON [mst].[userinfo] ([ln]) TO [trnuser] AS [mstuser]
GO
GRANT SELECT ON [mst].[userinfo] ([ln]) TO [trnuser] AS [mstuser]
GO
DENY REFERENCES ON [mst].[userinfo] ([post]) TO [trnuser]
GO
DENY SELECT ON [mst].[userinfo] ([post]) TO [trnuser]
GO
DENY REFERENCES ON [mst].[userinfo] ([address]) TO [trnuser]
GO
DENY SELECT ON [mst].[userinfo] ([address]) TO [trnuser]
GO

ここで 参照を許可してあげたのは ID, FN, LNの3つ

参照を拒否したままなのはPOST、ADDRESSの2つの列です。

※ ここではSELECTとREFERENCESの許可を設定しています。

 

この状態で2種類のSQLを発行しましょう。

(1) SELECT * FROM MST.USERINFO ;

(2) SELECT ID, FN, LN FROM MST.USERINFO ;

 

これで(1)を実行すると

メッセージ 229、レベル 14、状態 5、行 1
SELECT 権限がオブジェクト 'userinfo'、データベース 'データベース名'、スキーマ 'mst' で拒否されました。

が表示されます。

(2)を実行すると以下の結果が取得されます。

ID FN LN
100 NULL 今川
110 NULL 大木
120 NULL

と結果が取れるようになりました。

これでtrnuserには大切な情報の住所を見せずに、ユーザ情報を参照させることが出来ますね。

 

さて、使い勝手のことを考えたりすると、いちいち列名指定するの面倒だったりもしますよね。

なので、ここでViewをmstスキーマに作成します。


create view [mst].[iteminfov] as 
 ( select itemid, price, itemname from mst.iteminfo) ;
create view [mst].[userinfov] as 
 ( select id , fn, ln from mst.userinfo ) ;

で trnuserから見た使用を考えると FROM句にいちいち mst.iteminfov とか書くの面倒ですよね。

 

なので、次の手!

シノニムをtrnスキーマに作成します。


CREATE SYNONYM [trn].[iteminfos] FOR [sec].[mst].[iteminfov];
GO
CREATE SYNONYM [trn].[userinfos] FOR [sec].[mst].[userinfov];
GO

SQLをシノニムに対して発行します!

SELECT * FROM iteminfos ;

ID FN LN
100 NULL 今川
110 NULL 大木
120 NULL

 

これでtrnuserに対してmstスキーマにあるデータへのアクセスを意識しなくても出来る状態になりました。

 

最後に全テーブルJOINします♪

#あくまで使用例としてね~


select 
 userinfos.ln,
 buyinfoP.buydate,
 iteminfos.itemname,
 buyinfoC.num ,
 iteminfos.price ,
 buyinfoC.num * iteminfos.price as totalSub 
from 
 buyinfoP 
 join userinfos 
 on buyinfoP.id = userinfos.id 
  join buyinfoC 
  on buyinfoP.id = buyinfoC.id 
  and buyinfoP.buydate = buyinfoC.buydate 
   join iteminfos 
   on buyinfoC.itemid = iteminfos.itemid ;
LN BUYDATE ITEMNAME NUM PRICE TOTALSUB
今川 2007-01-01 00:00:00.000 ラケット 2 30000 60000
今川 2007-01-01 00:00:00.000 ボール(1ダース) 1 3000 3000
今川 2007-01-02 00:00:00.000 シューズ 1 15000 15000
今川 2007-01-02 00:00:00.000 ソックス 1 1000 1000
大木 2007-01-02 00:00:00.000 ボール(2個入り) 2 300 600
大木 2007-01-02 00:00:00.000 ソックス 3 1000 3000
2007-01-03 00:00:00.000 シューズ 2 15000 30000
2007-01-03 00:00:00.000 ソックス 2 1000 2000

 

いかがでしょうか?

 

こんな感じでテーブルをスキーマ分けし、アクセス権限を設定することで

データの保護をしたり出来ます。

またスキーマを分けたことによるめんどくささもViewやシノニムを用いて解消することが出来るんです。

うまく活用してデータの運用にも着目した設計に役立てたら幸いです。

 

#っと、こんな感じでよろしいでしょうか?>依頼者様

#結構 いっぱいいっぱいですよぉ(w

投稿日時 : 2007年1月3日 20:12

コメント

# re: スキーマわけによるセキュリティ対策 その2 2007/01/04 8:36 まさぶん
正月早々いい仕事?しますね、
二日酔いで頭がついていきません。


# re: スキーマわけによるセキュリティ対策 その2 2007/01/04 11:21 夏椰
あけましておめでとうございます♪

すみません 新年早々ながーいネタで(^-^;

この休み期間ぢゃないと書けない内容だったんですわ。
#書くための時間がなかった(つд`)

# re: スキーマわけによるセキュリティ対策 その2 2007/01/10 16:43 backdoor
夏椰先生、質問です。

「特定列だけ参照を許す」って一般的な設計ですか?
メインフレーム上のRDBしか知らないので違和感を感じます。
あっちではView(仮想表)を定義してViewにアクセス権限設定する方法が普通でしたけど・・・。

# re: スキーマわけによるセキュリティ対策 その2 2007/01/10 23:57 夏椰
一般的か・・・自分には判断できません。
自分の知識が一般的であると言い切れる根拠を持たないので。(^^;

で、SQLServer2005では
対象テーブルに権限を持たなくてもViewに対して権限を設定したら取得は出来ました。
なので、見せたくないテーブルには参照権限をはずしてかまわないと思います。
#以前、Viewの参照テーブルにも権限持たないとView自体がエラーになるDBMSもいたので
#念のため、SQLServerで調べちゃいました(w


アクセス権限の設定も多様な手法があるので
何かがベスト!ではなく、
その時々で状況にあわせたものを選択したほうが言いかと思っています。


なので、backdoorさんがあげたViewも手段として有効だと思います。

# re: スキーマわけによるセキュリティ対策 その2 2007/01/11 17:21 backdoor
質問への回答ありがとうございました。
わざわざ調査にお手数をかけて頂き恐縮です。

開発メンバが多目のプロジェクトでは「マスタ参照はView使え」なら結構楽ですが、「参照権があるのはATableのX列とY列」なんて一々やってられないんで安心しました。

インフラ屋が開発PJに関わるケースは最悪一歩前の状況だったりしますが。

# re: スキーマわけによるセキュリティ対策 その2 2007/01/11 19:57 夏椰
うーん………


ごめんなさい
"楽"って観点はいけないと思います。

だって 大切なデータを預かっているんですもの。
権限設定は一度スクリプトつくれば
何度でも実行できます。

スクリプト作る作業を楽して
データを漏洩させるなら
苦労してスクリプト作り
きちんとセキュリティ強化したいと思います。

# re: スキーマわけによるセキュリティ対策 その2 2007/01/12 9:17 backdoor
>"楽"って観点はいけないと思います。

表現が適切でなかったようで、申し訳ないです。
PJ内の開発標準をまとめる際に「容易に解り易くできる」と言う意味で“楽”と表現しました。
夏椰さん提示の方法だと(多分)外部モジュールか関数になると思われますが、その仕様書と使用例を作る方が大変という意味合いでした。

セキュリティに関しては、感覚的には「多少の処理効率低下より安全性・確実性を重視する」傾向が強いですのでご安心を。


Post Feedback

タイトル
名前
Url:
コメント