Как предоставить разрешения разработчикам для предоставления разрешений пользователям? - PullRequest
1 голос
/ 23 апреля 2009

Могу ли я дать разработчикам разрешение на предоставление пользователям разрешений на объекты, не предоставляя им возможность создавать пользователей или функции?

Я пытаюсь ограничить права разработчиков, недавно я обнаружил, что у разработчиков есть права db_owner в средах dev и prod! Поэтому я делаю все возможное, чтобы остановить это безумие.

Любая хорошая статья по этому вопросу?

Ответы [ 7 ]

3 голосов
/ 23 апреля 2009

Вы можете сделать их членами роли базы данных "db_securityadmin"

2 голосов
/ 23 апреля 2009

Как уже говорилось, если кто-то может раздавать разрешения, он может раздавать разрешения себе (или фиктивной учетной записи). Я не уверен, что в SQL Server есть хитрость, которая заключается в том, чтобы «предоставлять пользователям меньше прав, чем мне».

Я бы сделал это с помощью хранимых процедур.

Создайте хранимую процедуру, которая дает указанному пользователю определенное право или набор прав (эти права - те, которые разрешено иметь обычным пользователям). Затем предоставьте разработчикам доступ к этой хранимой процедуре. По сути, вы используете хранимые процедуры для создания ограниченной версии GRANT, сохраняя полную команду GRANT при себе.

1 голос
/ 23 апреля 2009

Владельцы объектов могут предоставлять разрешения для этих объектов. При условии, что вашим разработчикам не нужно предоставлять такие вещи, как права CREATE TABLE, вы можете предоставить им право собственности на объекты, разрешение которых вы хотите им предоставить.

1 голос
/ 23 апреля 2009

Если кто-то может дать кому-то еще разрешения, он также может дать себе разрешение делать то, что он хочет. Так для чего это хорошо? Возможно, я не понимаю вашу ситуацию.

0 голосов
/ 02 марта 2016

Я обнаружил, что наиболее опасным аспектом роли db_owner является то, что если вы откажете в разрешении, то члены роли могут предоставить его обратно себе. Я только начал читать об этом, и я проверяю это

Create role db_ControlDatabase

grant control to db_ControlDatabase

deny backup database to db_ControleDatabase

alter role db_ControlDatabase add member TestUser

До сих пор я обнаружил, что субъект TestUser имеет разрешения, не имея возможности добавлять или удалять членов фиксированных ролей базы данных. На этом этапе вы сможете отрицать все, что вам нужно, например, сертификат резервного копирования, главный ключ резервного копирования и т. Д.

Здесь - список разрешений, которые могут быть отклонены или предоставлены:

0 голосов
/ 23 июня 2012

Настройка разрешения для объектов, таких как хранимые процедуры, может быть выполнена с помощью «GRANT EXECUTE ON. To;

Однако вы также можете предоставить права безопасности как на уровне входа, так и на уровне пользователя. Вы захотите определить и предоставить ТОЛЬКО необходимые права для объектов, которым требуется доступ (например, выполнение). Рассмотрите возможность использования функции «EXECUTE AS», которая позволяет выдавать себя за другого пользователя для проверки прав доступа, необходимых для выполнения кода, БЕЗ необходимости предоставлять все необходимые права всем базовым объектам (например, таблицам). EXECUTE AS можно добавить к хранимым процессам, функциям, триггерам и т. Д.

Добавьте к коду, как показано ниже, прямо в хранимой процедуре: CREATE PROCEDURE dbo.MyProcedure WITH EXECUTE AS OWNER

В этом случае вы выдаете себя за владельца вызываемого модуля. Вы также можете выдавать себя за SELF, ИЛИ за пользователя, создающего или изменяющего модуль, ИЛИ ... выдавать за вызов CALLER, что позволит модулю принимать на себя права текущего пользователя, ИЛИ ... выдавать себя за СОБСТВЕННИКА, который получит разрешение от владелец процедуры, которая называется OR ... олицетворяет 'user_name', которая будет выдавать себя за конкретного пользователя, OR ... олицетворяет 'login_name', будет олицетворять конкретный вход в систему.

В большинстве случаев вам нужно будет только предоставить права EXECUTE для хранимых процедур, а затем права будут предоставлены всем объектам, на которые есть ссылки в хранимой процедуре.

Таким образом, вам НЕ НУЖНО давать неявные права (пример: обновлять данные или вызывать дополнительные процедуры). Владение цепочкой обрабатывает это для вас. Это особенно полезно для динамического SQL или если вам нужно создать задачи повышенной безопасности, такие как CREATE TABLE. EXECUTE AS - удобный инструмент для рассмотрения.

Этот пример может помочь прояснить все это:

Создание пользователя с именем NoPrivUser с открытым доступом к базе данных (например, dbadb)

ИСПОЛЬЗОВАТЬ [master] GO СОЗДАТЬ ВХОД [NoPrivUser] С ПАРОЛЕ = N'ABC5% ', DEFAULT_DATABASE = [dbadb], CHECK_EXPIRATION = ON, CHECK_POLICY = ON GO USE [DBAdb] GO СОЗДАТЬ ПОЛЬЗОВАТЕЛЯ [NoPrivser пользователя [NoPrivser] ] GO

ПРИМЕЧАНИЕ. СОЗДАТЕЛЬ ИЛИ ВЛАДЕЛЕЦ ЭТОЙ ПРОЦЕДУРЫ ТРЕБУЕТ СОЗДАТЬ ПРАВА ТАБЛИЦЫ в целевой базе данных.

использовать DBAdb go CREATE PROCEDURE dbo.MyProcedure С ВЫПОЛНИТЬ В КАЧЕСТВЕ ВЛАДЕЛЬЦА, ЕСЛИ НЕ СУЩЕСТВУЕТ (ВЫБЕРИТЕ * ОТ sys.objects WHERE object_id = OBJECT_ID (N '[dbo] .MyTable') И введите (N'U ')) CREATE TABLE MyTable (PKid int, column1 char (10)) Вставить в MyTable VALUES (1, 'ABCDEF')

GO

GRANT EXEC ON dbo.MyProcedure для NoPrivUser; GO

- Теперь войдите на сервер базы данных как NoPrivUser и выполните следующее.

использовать dbadb go

EXEC dbo.MyProcedure

(затронут 1 ряд)

Теперь попробуйте выбрать из новой таблицы, войдя в систему как NoPrivuser.

Вы получите следующее:

выберите * из MyTable go

Сообщение 229, Уровень 14, Состояние 5, Строка 1 Отказано в разрешении SELECT для объекта «MyTable», базы данных «DBAdb», схемы «dbo».

Это ожидаемо, поскольку вы выполняли процедуру только в контексте безопасности Owner, когда вошли в систему как NoPrivUser. NoPrivUser, поскольку нет прав на фактическое чтение таблицы. Просто выполнить процедуру, которая создает и вставляет строки.

С предложением EXECUTE AS хранимая процедура запускается в контексте владельца объекта. Этот код успешно создает dbo.MyTable, и строки успешно вставляются. В этом примере пользователь NoPrivUser не имеет абсолютно никаких предоставленных прав на изменение таблицы или чтение или изменение любых данных в этой таблице. Он берет только те права, которые необходимы для выполнения этой конкретной задачи, закодированной в контексте этой процедуры.

Этот метод создания хранимых процедур, которые могут выполнять задачи, требующие повышенных прав безопасности, без постоянного назначения этих прав, очень полезен.

0 голосов
/ 23 апреля 2009

Как сказал Стефан, предоставление им разрешений на получение грантов фактически даст им все разрешения, поскольку, если они хотят что-то делать, все, что им нужно, - это предоставить себе разрешения на это.

Вместо того, чтобы считать разработчиков врагом, вы, возможно, захотите предоставить разработчикам вторую учетную запись пользователя, которая используется для администрирования базы данных. Весьма распространено не давать разработчикам НИКАКИХ разрешений на производство, по крайней мере, для их учетной записи разработчика.

...