1つのSQLビューからのみ選択できるSQL Server 2008 R2
で新しいDBユーザーを作成しようとしています。しかし、この新しいユーザーとしてログインするときに何を試しても、どのテーブルからでも選択できます。私はこのクエリを実行しました:
select princ.name
, princ.type_desc
, perm.permission_name
, perm.state_desc
, perm.class_desc
, object_name(perm.major_id)
from sys.database_principals princ
left join
sys.database_permissions perm
on perm.grantee_principal_id = princ.principal_id
WHERE princ.name = 'public'
AND object_name(perm.major_id) = 'User_Table'
そしてこれらの結果を得る:
name type_desc permission_name state_desc class_desc (No column name)
public DATABASE_ROLE DELETE GRANT OBJECT_OR_COLUMN User_Table
public DATABASE_ROLE INSERT GRANT OBJECT_OR_COLUMN User_Table
public DATABASE_ROLE REFERENCES GRANT OBJECT_OR_COLUMN User_Table
public DATABASE_ROLE SELECT GRANT OBJECT_OR_COLUMN User_Table
public DATABASE_ROLE UPDATE GRANT OBJECT_OR_COLUMN User_Table
これは、データベースにログインするユーザーが「パブリック」権限に基づいてフルアクセスできることを意味しますか?
これは、ユーザーがセキュリティ保護可能なセキュリティに明示的に設定されたアクセス許可を持っていなかった場合(または明示的に設定されたアクセス許可から継承された場合)、publicにアクセス許可がある場合、それらは適用されます。つまり、_User1
_で_User_Table
_に対するDELETE
権限が拒否されている場合、_User1
_はそのテーブルからデータを削除できません。
BOL's reference on Database-Level Roles を参照してください:
publicデータベースロール
すべてのデータベースユーザーはパブリックデータベースロールに属しています。ユーザーがセキュリティ保護可能なオブジェクトに対する特定のアクセス許可を付与または拒否されていない場合、ユーザーはそのオブジェクトに対してパブリックに付与されたアクセス許可を継承します。
例
_use TestDB;
go
create login Login1
with
password = 'password',
check_policy = off;
go
create user User1
for login Login1;
go
-- this will return 1 (meaning, yes it is a role member)
select is_rolemember('public', 'User1');
-- let's do a test to show the above theory
create table SomeTable
(
id int identity(1, 1) not null,
SomeText varchar(30) not null
default replicate('a', 30)
);
go
insert into SomeTable
values(default);
go 10
-- give the public role permissions to SELECT on SomeTable
grant select
on SomeTable
to public;
go
-- this will be successful, because User1 is part of public
execute as user = 'User1';
go
select *
from SomeTable;
revert;
go
-- create a new role to deny SELECT on SomeTable
exec sp_addrole 'Role1';
go
deny select
on SomeTable
to Role1;
go
-- add User1 to this new role
exec sp_addrolemember 'Role1', 'User1';
go
-- this will not be successful because User1 now has been denied SELECT on SomeTable
execute as user = 'User1';
go
select *
from SomeTable;
revert;
go
_