Имя: Пароль:
1C
 
как в SQL сделать авторизацию тысячи пользователей? (и ограничить права)
0 vde69
 
27.03.17
14:39
есть SQL база, с ней будет работать небольшое число потребителей (апач, 1с и т.д.), но с каждым потребителем работают сотни конечных пользователей.

Как правильно разграничить доступ этих конечных пользователей на SQL сервере?

разумеется сразу отказываемся от доступа к таблицам и переходим на ХП, а вот как в рамках хранимок это сделать?

сразу на ум приходит несколько способов
1. в каждую хранимку добавляем 2 параметра ID_User и Pass_User, и в хранимке проверяем
2. при первом входе выдаем юзеру уникальный ID который действует в рамках сеанса или еще чего-то, и далее этот параметр передаем в хранимку
3. наверно есть более правильные способы?
1 Garykom
 
гуру
27.03.17
14:41
(0) найти и нанять спеца по конкретным SQL базам не?
2 Господин ПЖ
 
27.03.17
14:41
зачем на sql должны ходить непосредственно конечные юзеры?
3 Garykom
 
гуру
27.03.17
14:42
(1) + в смысле по серверам бд
4 Ufo_Attack
 
27.03.17
14:43
(0) зачем хочешь ограничить конечных пользователей? Если они все равно будут работать через апач, 1С? Какая конечная цель?
5 vde69
 
27.03.17
15:00
представим интернет магазин

в базе лежат данные предназначенные индивидуально для каждого юзера, юзеру нужен доступ только к своим данным....
6 Ufo_Attack
 
27.03.17
15:03
(5) В этом случае у тебя есть приложение которое отдает данные согласно настроенными/сделанным правам доступа. Конечные пользователи не работают с БД.
7 vde69
 
27.03.17
15:06
(6) ну не совсем так, дело в том, что промежуточного звена может и не быть.

Пример:

есть терминал, на нем работают 10 филиалов, каждый в своем узле РИБ 1с, эти узлы конектятся к SQL по АДО
8 Вафель
 
27.03.17
15:07
(7) Делай вебсервис и пусть коннектятся к sql через вебсервис
9 1dvd
 
27.03.17
15:08
10 vde69
 
27.03.17
15:09
(8) и что это поменяет? как веб сервис поможет решить проблему доступа?
11 Вафель
 
27.03.17
15:10
(10) с авторизацией потому что
12 vde69
 
27.03.17
15:10
(9) не пойдет...

мне нужно реализовать аналог RLS но в хранимке SQL
13 1dvd
 
27.03.17
15:11
(12) ну, так и проверяй доступ в своей хранимке
14 Вафель
 
27.03.17
15:11
на 2016 есть рлс
15 vde69
 
27.03.17
15:12
(11) я не собираюсь на SQL заводить тысячи акаунтов и рулить политиками SQL....

мне нужно что бы у меня в базе была табличка юзеров с правами, и хранимки умели по ней проверять кто именно ее вызвал
16 Вафель
 
27.03.17
15:14
(15) так у тебя получается безопасность через незнание чужого ID.
В целом это не совсем безопасность
17 1dvd
 
27.03.17
15:14
(15) не понял. А как же авторизация? как ты определишь, что подключился именно Вася Пупкин с максимальными правами, а не гость какой-нибудь?
18 Вафель
 
27.03.17
15:15
(15) в 11 я говорил не про sql а про веб сервис с авторизацией
19 vde69
 
27.03.17
15:15
(17) в этом и есть вопрос
20 1dvd
 
27.03.17
15:16
(19) тогда тебе придется и пароли хранить и в каждую ХП передавать и юзера и пароль и прочие параметры
21 b_ru
 
27.03.17
15:16
Двухзвенка? Серьезно? В 2017?
22 Вафель
 
27.03.17
15:18
в любом случае нужен сервис авторизации.
Он же может быть и проксей к sql.
получаем классический сервер приложений
23 vde69
 
27.03.17
15:25
(20) это я и описал под п.1 в (0) но мне это не очень нравится...
24 Dotoshin
 
27.03.17
15:44
(15) А зачем заводить тысячу аккаунтов? В некой табличке лежат данные пользователя, каждая запись имеет ИД пользователя. Имена и ИД пользователя хранятся в отдельной табличке. Веб сервис по имени пользователя (или еще как) определяет его ИД и возвращает из первой таблички данные с этим ИД. Не?
25 Salimbek
 
27.03.17
15:51
(16) Точно. Но это можно обойти, например:
1) Устанавливается сеанс связи с БД, для этого Клиент кидает запрос к хранимке со своим ИД - она ему возвращает произвольный длинный ключ.
2) Клиент сливает этот ключ со своим ИД, полученное прогоняет через МД-5 и все запросы кидает с указанием этого МД-5 хеша
3) Сервер при выдаче ключа у себя тоже генерирует аналогичный хеш и сопоставляет его с указанным ИД, далее возвращает записи для этого ИД-шника.
26 vde69
 
27.03.17
16:29
(25) не много не правильно

1. Устанавливается сеанс связи, сеанс имеет ИД, ИД сеанса возвращается клиенту.
2. Клиент берет свой логин+пароль+ИДСеанса и шифрует их ИДсеанса+ХешПароля шлет на сервер вместе с открытым логином
3. Сервер расшифровывает это (на сервере есть логин, пароль, ИД), и сравнивает, Если все ок отправляет уникальный гуид который будет сеансовым ключем для всех дальнейших вызовов

разумеется все это при условии включённого шифрования трафика
27 vde69
 
27.03.17
16:39
(26) +

а теперь вопрос - можно ли доверять ID сеансу связи?
28 Вафель
 
27.03.17
16:54
А сервер  - это какой сервер?
29 Oftan_Idy
 
27.03.17
17:01
Если двузвенка то в любом случае разруливать доступ придется логикой приложения.
Или делать каждого юзера в sql  с правами на таблицы.

Если ты не доверяешь управлять правами приложению, ты ты не можешь и доверять переденным данным от приложения
30 vde69
 
27.03.17
17:13
(28) SQL
(29) я не имею права доверять клиенту
31 Вафель
 
27.03.17
17:17
(30) сам себе жизнь усложняешь
32 Вафель
 
27.03.17
17:17
на ноде ту же прослойку написать пару часо работы
33 Господин ПЖ
 
27.03.17
17:35
прослойка какая-нибудь нужна по любому...

нормальный одмин за скуль выставленный наружу - оторвет руки
34 Господин ПЖ
 
27.03.17
17:36
его (скуль) сразу ломать начнут
35 vde69
 
27.03.17
17:37
(32) еще раз спрашиваю - что дает прослойка? что она должна делать? по какому алгоритму она определяет и самое главное передает в SQL разрешенный уровень доступа для конкретной ХП
36 Вафель
 
27.03.17
17:38
(35) прослойка занимается авторизацией.
То бишь не нужно будет эиту автоиризацию изобретать, а просто взять готовые библиотеки
37 Вафель
 
27.03.17
17:39
между прослойкой и sql полное доверие. прослойка видит все
38 vde69
 
27.03.17
17:48
(36) авторизация какая?

доменная? точно не наш случай !!!

прослойка нужна для защиты от ДДОС и фильтрации IP по регионам, но слово "авторизация" мне не понятно...


для примера возьмем веб сервис 1с - где происходит авторизация? она происходит на сервере 1с а на апаче она опциональна и в дубль... [внезапно правда?]
39 Господин ПЖ
 
27.03.17
17:52
> где происходит авторизация? она происходит на сервере 1с а на апаче она опциональна и в дубль

и что?

это же не значит что на sql есть 150 логинов
40 Вафель
 
27.03.17
17:54
(38) ты мыслишь методами 90х годов
41 Ufo_Attack
 
27.03.17
19:12
(35) Прослойка даст авторизацию (будет смотреть твою табличку с логинами/паролями и выдачу данных нужных данных.
О какой именно SQL идет речь?

(38) Если берем 1С Веб (Файл БД - модуль 1с для апач - апач), то авторизация в модуле 1с для апач, где модуль смотрит таблицу БД с логинами/паролями. Это как раз пример прослойки.
42 mistеr
 
27.03.17
19:39
(0) Для Оракла я бы тебе подсказал, а как этот механизм называется в скуле, я не знаю. Нужно рыть носом BOL, что лень, честно говоря.
43 etc
 
27.03.17
19:46
select SYSTEM_USER, не?
44 mistеr
 
27.03.17
20:14
(0) Кажется Application Roles это оно.

Проверяешь логин/пароль по табличке, если OK, дергаешь sp_setapprole и все, до конца сеанса юзер имеет права роли и только их.

https://docs.microsoft.com/en-us/sql/relational-databases/security/authentication-access/application-roles

http://sqlmag.com/business-intelligence/mastering-application-roles
45 vde69
 
27.03.17
20:16
(44) вот это похоже то, что нужно !!!
46 etc
 
27.03.17
20:43
(44) Интересно. Но я так понял логин/пароль открытым текстом пойдут.
47 vde69
 
27.03.17
22:44
(46) нет, там третий параметр есть

(45) похоже это не совсем то, что нужно... хотя определенные мысли как это можно использовать - есть
48 vde69
 
29.03.17
11:49
короче сделал через временную таблицу, подскажите, такое использование параметров безопасно с точки зрения SQL инъекции ?


ALTER PROCEDURE [dbo].[Authorization]  
    @KeySource char(200), -- Имя узла обмена
    @PassSource char(200) -- Пароль узла обмена
WITH EXECUTE AS CALLER
AS
BEGIN
    DECLARE @EmpIDVariable int;
    SELECT @EmpIDVariable = ID FROM Sources WHERE Sources.KeySource = @KeySource AND Sources.Pass = @PassSource
    CREATE TABLE #TempSource (id_Source INT);
    INSERT INTO #TempSource ("id_Source") VALUES (@EmpIDVariable);
    SELECT id_Source FROM #TempSource;
END
49 mistеr
 
29.03.17
12:07
(48) С параметрами OK. А зачем этот онанизм с INSERT-SELECT?
50 vde69
 
29.03.17
12:54
(49) ступил, селект не нужен...

а как запретить текущему пользователю менять/удалять эту временную таблицу?
51 mistеr
 
29.03.17
13:33
(50) insert тоже, create as select

А зачем запрещать?
52 vde69
 
29.03.17
14:21
(51) вкратце суть такая

при авторизации я пишу в эту таблицу ИД
далее все остальные ХП делают джойн к этой ВТ

получается что-то вроде RLS ... соответственно нужен запрет на подмену...

сейчас я сделал просто -  завел юзера и дал к текущей базе всего 2 правила - соединение и выполнение, вроде поведение какое мне нужно, включая ВТ
53 mistеr
 
29.03.17
14:31
(52) Джойни с табличной функцией.
54 vde69
 
30.03.17
11:12
(48) блин, вчера работало, сегодня нет....

сегодня временная таблица удаляется при завершении ХП, а вчера не удалялась...