Пользователь с ограниченными или ограниченными правами на базу данных SQL - PullRequest
0 голосов
/ 25 апреля 2018

Я снова и снова скрываюсь в Интернете, пытаясь найти решение для моей проблемы:

У меня есть SQL DB на Azure SQL Server. В дополнение к этому есть приложение, говорящее с этим сервером и БД в частности.

На данный момент я использую учетные данные моего основного пользователя. Теперь я хотел бы создать «автономного» (моей цели) пользователя или просто пользователя с ограниченными правами («Обновить», «Выбрать», «Удалить», «Вставить») только для моей текущей базы данных SQL.

Я выполнил приведенные ниже строки кода, чтобы создать пользователя только с правами чтения / записи.

CREATE USER AppUser WITH PASSWORD='123abc';
ALTER ROLE db_datareader ADD MEMBER AppUser;
ALTER ROLE db_datawriter ADD MEMBER AppUser;

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

Я уверен, что что-то упустил, но я не знаю, что это такое.

Последние несколько дней я провел на веб-сайте Microsoft Docs, читая эту тему, но, похоже, не нашел решения.

EDIT:

Я читал такие статьи: https://docs.microsoft.com/en-us/sql/relational-databases/databases/contained-databases?view=sql-server-2017

https://docs.microsoft.com/en-us/sql/relational-databases/security/contained-database-users-making-your-database-portable?view=sql-server-2017

https://social.msdn.microsoft.com/Forums/en-US/7bea6830-5ce9-4f00-ab1e-355b1476494d/login-failed-contained-database-contained-user?forum=sql14tools

В приведенной выше статье было предложение, чтобы я "установил опцию уровня экземпляра", выполнив:

exec sp_configure 'contained database authentication', 1;
go;
reconfigure;
go;

Я не знаком с этими командами, и они не выполняются в SQL SM Studio. Я определенно делаю что-то не так здесь.

Вот сообщение об ошибке:

Msg 2812, Level 16, State 62, Line 1
Could not find stored procedure 'sp_configure'.

То же предложение было найдено по адресу:

https://www.sqlshack.com/contained-databases-in-sql-server/

Но снова я не смог выполнить предоставленный код.

Я знаю, что моя БД не содержится:

select containment,name from sys.databases where name='my_DB';

название содержания 0 my_DB

Опять, то же предложение было найдено на этом сайте:

https://www.sqlrx.com/contained-databases-pros-and-cons/

И снова я почему-то не смог выполнить код.

При попытке войти в SQL Studio с созданным пользователем, я получаю это сообщение об ошибке:

===================================

Не удается подключиться к my_DB.

===================================

Ошибка входа пользователя 'AppUser'. (Поставщик данных .Net SqlClient)


Для получения справки нажмите: http://go.microsoft.com/fwlink?ProdName=Microsoft%20SQL%20Server&EvtSrc=MSSQLServer&EvtID=18456&LinkId=20476


Имя сервера: my_DB Номер ошибки: 18456 Серьезность: 14 Состояние: 1 Номер строки: 65536

вот строка подключения в моем приложении C #:

SqlConnection connection = new 
SqlConnection("Server=tcp:my_DB_Server,1433; " +
" Database=my_DB;Persist Security Info=False; " +
" User ID=AppUser;Password=123abc; " + 
" MultipleActiveResultSets=False;Encrypt=True; " + 
" TrustServerCertificate=False;Connection Timeout=30;");

Что тоже не получается.

РЕДАКТИРОВАТЬ II:

Полагаю, мне нужно сначала выяснить, как сделать my_DB содержавшимся. А затем попробуйте использовать Contained user для входа в него.

РЕДАКТИРОВАТЬ III:

Создан, содержащийся Используется в моей базе данных. Я вижу это на вкладках Безопасность / Пользователи.

Но его нет на вкладке Сервер / Безопасность / Логины.

Нужно ли предоставлять информацию о пользователях, содержащихся на сервере? Документы выше говорят: нет, я не обязан. Документы говорят, что аутентификация происходит на уровне БД, а не на сервере (если я прав)

Спасибо!

РЕДАКТИРОВАТЬ III:

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

1-й - я должен был убедиться, что моя БД установлена ​​в смешанный режим.

SELECT SERVERPROPERTY('IsIntegratedSecurityOnly')

вот несколько статей, которые были полезны в моем поиске: https://stackoverflow.com/a/1601275/9698341 https://stackoverflow.com/a/1134357

0 - смешанный режим, 1 - режим аутентификации Windows

2-й - мне пришлось создать логин перед созданием пользователя.

CREATE LOGIN AppUserLogin WITH PASSWORD=N'1234abcd'; <-- On master database

(И я думаю, на данный момент я не уверен, относится ли это к ограниченным пользователям или нет, но это следует делать, если вы хотите создать пользователя с несколькими привилегиями, а не с полным доступом к БД или Серверу .)

Подключитесь к вашей БД, в данном случае это my_DB и строка запуска ниже.

USE my_DB;

Над строкой кода выбирает целевую базу данных для создания пользователя (если я прав)

3-й - Создание пользователя сверху Логин

CREATE USER AppUser FROM LOGIN AppUserLogin;

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

Полезные ссылки: https://docs.microsoft.com/en-us/sql/t-sql/statements/create-user-transact-sql?view=sql-server-2017

https://docs.microsoft.com/en-us/sql/relational-databases/security/authentication-access/create-a-database-user?view=sql-server-2017

4-й - Предоставить права чтения / записи для AppUser

ALTER ROLE db_datareader ADD MEMBER AppUser;
ALTER ROLE db_datawriter ADD MEMBER AppUser; 

и еще один: https://stackoverflow.com/a/3998649/9698341

В этот момент я смог войти в свой SQL Server и DB через SQL SMStudio, но не через строку подключения C #:

    SqlConnection connection = new SqlConnection("Server=tcp:my_Server,1433; " +
        " Database=my_DB;Persist Security Info=False; " +
        " User ID=AppUserLogin;Password=1234abcd " +
        " ultipleActiveResultSets=False;Encrypt=True; " + TrustServerCertificate=False;Connection Timeout=30;");

После работы с приложением C # я обнаружил, что некоторые поля зашифрованы. Я мог бы делать это задом наперед, но я сравнивал пароль с полем пароля в одной таблице. И я обнаружил, что возвращаемый результат был замаскирован так: 'xxxx'

эта строка кода решает разоблачение:

GRANT UNMASK TO AppUser;

Это означает, что созданные логин и пользователь работают.

Другая ошибка, которую я обнаружил, заключается в этой строке кода:

User ID=AppUserLogin;Password=1234abcd

Вместо

AppUserLogin

У меня изначально было

AppUser

Теперь у меня есть доступ к моей БД с вновь созданным пользователем, который имеет ограниченные привилегии. База данных не содержит ни пользователя (пожалуйста, исправьте меня, если я ошибаюсь ", но пока подойдет.

Если я попаду my_DB в камеру содержания, я вернусь к вам.

1 Ответ

0 голосов
/ 26 апреля 2018

1-й - я должен был убедиться, что моя БД установлена ​​в смешанный режим.

SELECT SERVERPROPERTY('IsIntegratedSecurityOnly')

вот несколько статей, которые были полезны в моем поиске: https://stackoverflow.com/a/1601275/9698341 https://stackoverflow.com/a/1134357

0 - смешанный режим, 1 - режим аутентификации Windows

2-й - мне пришлось создать логин перед созданием пользователя.

CREATE LOGIN AppUserLogin WITH PASSWORD=N'1234abcd'; <-- On master database

(И я думаю, на данный момент я не уверен, относится ли это к ограниченным пользователям или нет, но это следует делать, если вы хотите создать пользователя с несколькими привилегиями, а не с полным доступом к БД или Серверу .)

Подключитесь к вашей БД, в данном случае это my_DB и строка запуска ниже.

USE my_DB;

Над строкой кода выбирает целевую базу данных для создания пользователя (если я прав)

3-й - Создание пользователя сверху Логин

CREATE USER AppUser FROM LOGIN AppUserLogin;

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

Полезные ссылки: https://docs.microsoft.com/en-us/sql/t-sql/statements/create-user-transact-sql?view=sql-server-2017

https://docs.microsoft.com/en-us/sql/relational-databases/security/authentication-access/create-a-database-user?view=sql-server-2017

4-й - Предоставить права чтения / записи для AppUser

ALTER ROLE db_datareader ADD MEMBER AppUser;
ALTER ROLE db_datawriter ADD MEMBER AppUser;

и еще один: https://stackoverflow.com/a/3998649/9698341

В этот момент я смог войти в свой SQL Server и DB через SQL SMStudio, но не через строку подключения C #:

SqlConnection connection = new SqlConnection("Server=tcp:my_Server,1433; " +
    " Database=my_DB;Persist Security Info=False; " +
    " User ID=AppUserLogin;Password=1234abcd " +
    " ultipleActiveResultSets=False;Encrypt=True; " + TrustServerCertificate=False;Connection Timeout=30;");

После работы с приложением C # я обнаружил, что некоторые поля зашифрованы. Я мог бы делать это задом наперед, но я сравнивал пароль с полем пароля в одной таблице. И я обнаружил, что возвращаемый результат был замаскирован так: 'xxxx'

эта строка кода решает разоблачение:

GRANT UNMASK для AppUser; Это означает, что созданные логин и пользователь работают.

Другая ошибка, которую я нашел, заключается в этой строке кода:

User ID=AppUserLogin;Password=1234abcd

вместо

AppUserLogin

у меня изначально было

AppUser

Итак, поехали. Пользователь с ограниченными правами создан и работает. Кроме того, я могу получить доступ к своей БД через C # с вновь созданным пользователем.

Ура!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...