|   |   | 
| 
 | как в 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) блин, вчера работало, сегодня нет....
 сегодня временная таблица удаляется при завершении ХП, а вчера не удалялась... | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |