web-dev-qa-db-ja.com

これは、「パブリック」に完全な選択、挿入、更新、削除のアクセス権があることを意味しますか?

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

これは、データベースにログインするユーザーが「パブリック」権限に基づいてフルアクセスできることを意味しますか?

3

これは、ユーザーがセキュリティ保護可能なセキュリティに明示的に設定されたアクセス許可を持っていなかった場合(または明示的に設定されたアクセス許可から継承された場合)、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
_
6
Thomas Stringer