powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вопросы о системе безопасности Firebird
25 сообщений из 27, страница 1 из 2
Вопросы о системе безопасности Firebird
    #39596496
bastibubu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте! В интернете нашел бухгалтерскую программу AZMicro2, написанную Архангельским (автор книг про Delphi), БД Firebird 2.0 и собираюсь разобраться в созданной автором системе безопасности.

https://drive.google.com/open?id=1IkPyUEmN0hD_QD33rjhFuYWNITZ9MCnY

Отривок из файла:
Система безопасности
Несмотря на то, что СУБД поддерживает таблицу пользователей, но в данном случае она не поможет......
Итак, строим таблицу Users:
Users
Таблица Users описывает как пользователей, так и их права для доступа к другим таблицам. Таким образом права устанавливает Администратор системы и пользователь может не задумываться о том с какими правами ему нужно входить. Если он вошел в систему, то она покажет ему только то, что разрешено.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Create table USERS
      (USERID       AZMID NOT NULL PRIMARY KEY,
       USERNAME     AZNAMES  NOT NULL UNIQUE, -- Login из fbsecurity.fb (ISC4.gdb)
       USRSYSNAME   AZNAMES, -- из fbsecurity.fb (ISC4.gdb)
       USRDOMAIN    AZNAMES, -- из fbsecurity.fb (ISC4.gdb)
       USRNames     AZLNAME, -- Фамилия, Имя, Отчество
       USRNPost     AZLNAME, -- Должность
/* ************************************************************************************* */
       USRGroup     CHAR(1) character set win1251, -- Текущая группа доступа
       USRLevel     AZInt32,                       -- Текущий уровень доступа
       USRRole      CHAR(2) character set Win1251, -- Допустимая группа  и 
                                                                уровень доступа
/*Блок контроля - начало*/
       DtCreate     AZTStamp,
       UsrCreate    AZMID0,                        /*references USERS on UPDATE cascade*/
       DtModify     AZTStamp,
       UsrModify    AZMID0);                       /*references USERS on UPDATE cascade*/
/*Блок контроля - конец*/
Commit;


Основные поля этой таблицы — USERID и USERNAME. Первое используется как первичный ключ и используется во всех связях, а второе уникальное имя пользователя, которое определено в БД fbsecurity.fb, и вводится пользователем в качестве Login при входе в систему.
Поля USRSYSNAME, USRDOMAIN, USRNames, USRNPost — это описательные поля, которые являются справочником для администратора.
Для определения прав доступа используются поля USRGroup, USRLevel, USRRole, которые определяются из таблицы "Система безопасности".
И, наконец, блок контроля, который имеется во всех таблицах. Для каждой строки определяются КТО и КОГДА создал запись, а также КТО и КОГДА изменил запись. Если возникнет задача репликации, т.е. перенос части этой БД в другую, то всегда можно определить новые и измененные записи.
Но кроме определения таблицы нужно заполнить ее хотя бы одной записью и наложить ограничения на структуру и другие действия.
Первая запись определяет USERID, который вводится во все таблицы по умолчанию:
Insert into Users(UserID,UserName,USRNames,USRRole)
values(0,'SYSDBA','Создатель БД','A1');
Commit;
Далее наложить ограничения, что в поля USRCreate и USRModify можно вводить только значения из самой таблицы Users.
Код: pascal
1.
2.
3.
ALTER TABLE USERS add foreign key (USRCreate) references USERS  on update cascade;
ALTER TABLE USERS add foreign key (USRModify) references USERS  on update cascade;
Commit;



Для заполнения первичного ключа нужно использовать генератор и соответствующий триггер.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE GENERATOR USERS_GEN;
   SET GENERATOR USERS_GEN TO 0;
Commit;
SET TERM ^ ;
CREATE TRIGGER USERS_INSGEN FOR USERS
ACTIVE BEFORE INSERT POSITION 0
AS BEGIN
    NEW.USERID = GEN_ID(USERS_GEN,1);
END ^
SET TERM ; ^
Commit;


После всего этого нужно наложить правила, по которым можно заполнять и изменять информацию в этой таблице.
Во-первых, нужно определить какие действия являются ошибочными. В языке SQL они называются Exception (исключениями). Они не только прерывают выполнение операции, но и сообщают пользователю о его ошибке.

— нужно ограничить создание определенных ролей. Ну, не должно быть двух Директоров или Главных бухгалтеров.
— нужно запретить удаления из этой таблицы или неправомерное изменение уровня доступа.
Во-вторых, нужно создать триггеры, которые определяют эти правила:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
SET TERM ^ ;
CREATE TRIGGER USERS_INSERT FOR USERS
ACTIVE BEFORE INSERT POSITION 1 AS
DECLARE VARIABLE USR SmallInt;
DECLARE VARIABLE Cnt SmallInt;
DECLARE VARIABLE Lev SmallInt;
DECLARE VARIABLE Rls Char(2) character set win1251;
BEGIN
Select USERID, USRRole,USRLevel from USERS where USERNAME=USER into :USR,:Rls,:Lev;
new.USRRole = new.USRGroup||Cast(new.USRLevel as Char(1)); 
new.UsrCreate = USR;
new.USRModify  = USR;
IF (Lev>2) then Exception NoRoleInsert;
If ((Rls='F2') and (new.USRGroup<>'F')) then Exception NoRoleInsert;
If ((Rls='T2') and (new.USRGroup<>'T')) then Exception NoRoleInsert;
If ((Rls='S2') and (new.USRGroup<>'S')) then Exception NoRoleInsert;
If ((Rls='P2') and (new.USRGroup<>'P')) then Exception NoRoleInsert;
IF (new.USRRole='A0') then begin
    Select count(*) from USERS where USRRole='A0' into :Cnt;
    If (Cnt>0) then Exception A0Exists;
    end
IF (new.USRRole='D0') then begin
    Select count(*) from USERS where USRRole='D0' into :Cnt;
    If (Cnt>0) then Exception D0Exists;
    end
IF (new.USRRole='A1') then begin
    Select count(*) from USERS where USRRole='A1' into :Cnt;
    If (Cnt>0) then Exception RoleDisable;
    end
IF (new.USRRole='F1') then begin
    Select count(*) from USERS where USRRole='F1' into :Cnt;
    If (Cnt>0) then Exception F1Exists;
    end
IF (new.USRRole='F2') then begin
    Select count(*) from USERS where USRRole='F2' into :Cnt;
    If (Cnt>0) then Exception F2Exists;
    end

    и т.д.  ..................
END ^
SET TERM ; ^
Commit;



Обяснение триггера:
Сначала определяем КТО пытается создать новую запись и какими правами он обладает и отмечаем это в полях new.UsrCreate и new.UsrModify.
Select USERID, USRRole,USRLevel from USERS where USERNAME=USER into :USR,:Rls,:Lev;
new.USRRole = new.USRGroup||Cast(new.USRLevel as Char(1));
new.UsrCreate = USR;
new.USRModify = USR;
Потом отсекаем тех, кто не может создавать записи в этой таблице — это пользователи с уровнем доступа более 2. Т.е. новые записи могут создавать только начальники подразделений.
IF (Lev>2) then Exception NoRoleInsert;
Далее определяем, что начальник подразделения может создавать записи только своего подразделения (FinDirector может создавать любые записи).
If ((Rls='F2') and (new.USRGroup<>'F')) then Exception NoRoleInsert;
И, наконец, определяем наличие ключевых должностей в таблице и если они уже есть, то вызываем исключение.


У меня возник 2 вопроса и прошу вашей помощи:
1) Если автор не использует встроенную систему безопасности сервера (в файле security3.fdb не создаёт пользователей), а создаёт свою систему безопасности тогда откуда получает в запросе внутри триггера значение переменной USER (текущий пользователь)? Тогда разве в файле безопасности не будет только суперпользователь SYSDBA?
А если использует встроенную систему безопасности сервера и создаёт там пользователей тогда как они окажутся и в таблице users?
2) Как видите в create table users в комментариях автор пишет:

Код: sql
1.
2.
3.
 USERNAME     AZNAMES  NOT NULL UNIQUE, -- Login из fbsecurity.fb
       USRSYSNAME   AZNAMES, -- из fbsecurity.fb 
       USRDOMAIN    AZNAMES, -- из fbsecurity.fb


т.е. пока создаётся пользователь в security3.fdb и сразу в таблице users?
например так, с помощью компонента FDScript?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
Begin
//вставка в security3.fdb
 if FUsersInsertEditMode=mInsert then begin
   if length(editNewPassw.text)=0 then editNewPassw.SetFocus
   else
   begin
    with Fmain.FDScript1 do begin
      SQLScripts.Clear;
      SQLScripts.Add;
      with SQLScripts[0].SQL do begin
    Add('create user '+editUserName.Text);
      end;
      ValidateAll;
      ExecuteAll;
    end;
 end;

//вставка в users
Fmain.Qusers.Open;
 if FUsersInsertEditMode=mInsert then begin
  if (EditNewPassw.Text='') then
   begin
    Application.MessageBox('Password is empty!','',MB_ICONERROR);
    exit;
   end
   else begin
    Fmain.Qusers.insert;
    Fmain.QusersUsername.AsString:=Editusername.Text;
    Fmain.Qusersuserpassw.AsString:=MD5DigestToStr(MD5String(Ansiuppercase(EditRepeatNewPassw.Text)));
    Fmain.Qusers.ApplyUpdates;
    close;
   end;
End;



Или что-то неправильно понял?
...
Рейтинг: 0 / 0
Вопросы о системе безопасности Firebird
    #39596516
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bastibubu
У меня возник 2 вопроса и прошу вашей помощи:
1) Если автор не использует встроенную систему безопасности сервера (в файле security3.fdb не создаёт пользователей), а создаёт свою систему безопасности тогда откуда получает в запросе внутри триггера значение переменной USER (текущий пользователь)? Тогда разве в файле безопасности не будет только суперпользователь SYSDBA?
А если использует встроенную систему безопасности сервера и создаёт там пользователей тогда как они окажутся и в таблице users?



Автор использует встроенную в сервер систему безопасности.
Но в ней нет функций того что называется ROW LEVEL SECURITY, и вот эту функциональность автор обеспечивает описываемой системой.

Пользователи в базе в таблице USERS и пользователи в security3.fdb имеют не так много общего :)
В данном случае да, если пользователя нет в системной базе - то залогиниться под ним не получится. Что нисколько не мешает раздаче ему прав в базе в таблице USERS, под то что потом этот юзер будет создан и в системной базе.

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

1. Что бы залогиниться в базу - нужен пользователь в security3.fdb
2. Что бы работать с бизнес-логикой базы - нужно что бы этому пользователю были дадены права в этой базе, в данном случае посредством таблицы USERS
3. Пункт 2 не отменяет необходимости назначения пользователю нужных прав на объекты БД.

Каким образом пользователи USERS попадают в security3.fdb, или наоборот - это не принципиально.
...
Рейтинг: 0 / 0
Вопросы о системе безопасности Firebird
    #39596648
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bastibubu,

1. поскольку автор программы уже 7 лет не с нами, он вряд-ли адаптирует свое решение к Firebird 3.0. Так что, могут быть подводные камни.
2. как тут верно сказали, row level security нет, она организуется программно.
Я тоже как-то такую фигню делал
http://www.ibase.ru/treedb2/

Но, ошибкой будет оставлять базовый логин SYSDBA. Это относится и к веб-приложениям тоже.
Тут надо создать отдельного пользователя, создать роль, дать роли нужные права, включить этого пользователя в роль, и уже приложения должны соединяться с базой используя этот самый отдельный логин, не SYSDBA.
Потому что использование SYSDBA для всех и каждого впоследствии доставит массу проблем.

bastibubuLogin из fbsecurity.fb
нет такой базы. есть security2.fdb, security3.fdb.
bastibubuТогда разве в файле безопасности не будет только суперпользователь SYSDBA?
то, что есть в ФБ для управления пользователями - нельзя отрубить. Только embedded пофиг логин и пароль.
Так что пока SYSDBA должен быть, независимо от всего остального.
...
Рейтинг: 0 / 0
Вопросы о системе безопасности Firebird
    #39596814
bastibubu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fraksВ данном случае да, если пользователя нет в системной базе - то залогиниться под ним не получится. Что нисколько не мешает раздаче ему прав в базе в таблице USERS, под то что потом этот юзер будет создан и в системной базе.
fraks , то есть получается, что системная база данных-security3.fdb всегда должен содержать все записи таблицы users, правильно я понял?

авторКаким образом пользователи USERS попадают в security3.fdb, или наоборот - это не принципиально.

Если например:
1) при вставке в users заработал триггер: create user user1 password 'xxx' ?
2) или с помощью компонента FDScript на клиенте при добавлении пользователя в users?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
Begin
//вставка в security3.fdb
 if FUsersInsertEditMode=mInsert then begin
   if length(editNewPassw.text)=0 then editNewPassw.SetFocus
   else
   begin
    with Fmain.FDScript1 do begin
      SQLScripts.Clear;
      SQLScripts.Add;
      with SQLScripts[0].SQL do begin
    Add('create user '+editUserName.Text);
    Add('grant Role R1 to'+editUserName.Text);
      end;
      ValidateAll;
      ExecuteAll;
    end;
 end;

//вставка в users
Fmain.Qusers.Open;
 if FUsersInsertEditMode=mInsert then begin
  if (EditNewPassw.Text='') then
   begin
    Application.MessageBox('Password is empty!','',MB_ICONERROR);
    exit;
   end
   else begin
    Fmain.Qusers.insert;
    Fmain.QusersUsername.AsString:=Editusername.Text;
    Fmain.Qusersuserpassw.AsString:=MD5DigestToStr(MD5String(Ansiuppercase(EditRepeatNewPassw.Text)));
    Fmain.Qusers.ApplyUpdates;
    close;
   end;
End;



KDVНо, ошибкой будет оставлять базовый логин SYSDBA.
Тут надо создать отдельного пользователя, создать роль, дать роли нужные права, включить этого пользователя в роль, и уже приложения должны соединяться с базой используя этот самый отдельный логин, не SYSDBA.
KDV , немного растерялся. Как из ответа fraks-а я понял, в security3.fdb надо создать не только одного отдельного пользователя, а столько же сколько их в таблице users, или неправильно я понял?



KDVПотому что использование SYSDBA для всех и каждого впоследствии доставит массу проблем.
KDV ,
В чем разница- если SYSDBA даёт права другому пользователю чем он менее безопасен чем SYSDBA? Какими, например правами не должен обладать пользователь у которого роль 'Администратор'?
...
Рейтинг: 0 / 0
Вопросы о системе безопасности Firebird
    #39596839
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bastibubu,

потому что SYSDBA это суперпользователь неограниченный ни чем сразу во всех БД. Помимо SYSDBA есть и другие пользователи обладающие правами администратора, но только в текущей базе данных. Например владелец БД или пользователь с ролью RDB$ADMIN (начиная с 2.5).
...
Рейтинг: 0 / 0
Вопросы о системе безопасности Firebird
    #39597087
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bastibubuто есть получается, что системная база данных-security3.fdb всегда должен содержать все записи таблицы users, правильно я понял?
нет, все неправильно.

security3.fdb - это база пользователей Firebird. С помощью этих пользователей производится логин, и осуществление разных прав на таблицы и прочие объекты ЦЕЛИКОМ.
Например, юзер VASYA залогинился, имеет право читать таблицу DOCS, а юзер PETYA после логина может не только читать, но именять таблицу DOCS.

Пример Архангельского, который вы цитируете, осуществляет контроль прав на уровне ЗАПИСЕЙ, а не таблиц целиком. Такой функционал в SQL отсутствует, и реализуется программно.
Для этого аутентификация пользователей производится через специальную таблицу пользователей, которая создается вручную в БД, и содержит там данные пользователей, в конкретной реализации (у Архангельского так, у меня сяк, у Пети эдак, и т.п.).
То есть, логин производится следующим образом
1. программа логинится к базе, используя или SYSDBA с фиксированным паролем, или юзера SPECIAL (например) тоже с фиксированным паролем. Человек, использующий эту программу, не знает ни имени SYSDBA или SPECIAL, ни их паролей.
2. программа запрашивает у человека логин и пароль. Он должен ввести то, что находится в специальной таблице USERS, заранее созданной в пользовательской БД, и так далее.
3. программа получив идентификатор такого пользователя, использует его при любых операциях с данными.
4. аминь.
bastibubu в security3.fdb надо создать не только одного отдельного пользователя, а столько же сколько их в таблице users, или неправильно я понял?
это ужасная ахинея, потому что security3.fdb невозможно связать с "пользовательской таблицей users". Никак. Сервер для аутентификации пользуется только security3.fdb, или ее содержимым в любой другой БД. Любые созданные вами таблицы сервер как "аутентифицирующие пользователей" сервер рассматривать не будет.
К примеру, в БД есть таблица RDB$RELATIONS, в которой сервер хранит все созданные по CREATE TABLE таблицы. И серверу плевать, если вы создадите свою таблицу RELATIONS, и тоже там будете хранить имена "своих таблиц" или типа того.
Вот с юзерами ситуация абсолютно аналогичная.
bastibubuВ чем разница- если SYSDBA даёт права другому пользователю чем он менее безопасен чем SYSDBA?
SYSDBA жестко прописан в коде Firebird. Это как root в Линуксе. Например, если сделать базе shutdown, то на SYSDBA это не влияет.
Тут не о безопасности речь, а об администрировании.
bastibubuКакими, например правами не должен обладать пользователь у которого роль 'Администратор'?
понятия не имею. Главное что этот пользователь - не SYSDBA, в смысле вот этих самых 6-ти букв.
Код: pascal
1.
2.
3.
4.
if user <> 'SYSDBA' then 
  CheckUserRights
else
  DoAnything


типа того.
...
Рейтинг: 0 / 0
Вопросы о системе безопасности Firebird
    #39597090
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bastibubu1) при вставке в users заработал триггер: create user user1 password 'xxx' ?
это вообще какой-то ужасный ужас.
Вот смотрите. У вас система типа клиент-сервер. Можно сделать так
1. Приложение для всех юзеров логинится как SYSDBA. Плевать на права к таблицам, процедурам, и прочему, нас это не парит.

а можно сделать так

2. приложение коннектится под конкретным юзером, созданным как Create user, юзеру даются права на таблицы, или юзер включается в роль, и т.д.

а можно и так

3. совсем без аутентификации не хочется (пункт 1 слишком безалаберный), а аутентификация типа пункта 2 че-то излишня.
Создаем свою таблицу юзеров в базе, и делаем в приложении самостоятельную аутентификацию.

Классическим примером, когда п3 выгоден, я уже сказал - является трехзвенка или веб. Веб юзер <> юзер БД. Заводить веб-юзера как юзера базы бессмысленно - юзеров веб-сайта может быть миллионы, и некий юзер может зайти всего на 5 секунд.
Поэтому делается ОДИН спец-юзер БД. Веб-сервер логинится к базе через него. А веб-юзеры, регистрируясь на веб-сайте, получают логин в той самой пресловутой "юзерской таблице, созданной в нашей БД". И это не какая-то специальная "юзерская таблица" для Firebird, а таблица с данными, на содержимое которой Firebird-у пофиг, юзеры это или адреса публичных домов, или перечень хлама на мусорной свалке. Но которая используется для аутентификации юзеров на веб-сервере.
...
Рейтинг: 0 / 0
Вопросы о системе безопасности Firebird
    #39597091
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvНо которая используется для аутентификации юзеров на веб-сервере
посредством кода, который вы напишете самостоятельно - на java, php или другом языке. И о котором Firebird-у не будет ничего известно (и не нужно знать).
...
Рейтинг: 0 / 0
Вопросы о системе безопасности Firebird
    #39597117
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvпрограмма логинится к базе, используя или SYSDBA с фиксированным паролемАццкий АдЪ.
kdvэто ужасная ахинея, потому что security3.fdb невозможно связать с "пользовательской таблицей users". Никак.SEC$USERS для слабаков?

Дим ты много полезного изложил, но несколько фраз зело портят общую картину.

Как вариант, можно и не перелогинивать принудительно, пусть юзер совпадает, только для работы своей приклады еще дополнительно подсовывать роль, чтобы даже зная логин и что такое ибэксперт было хлопотно что-то сделать мимо приклады и его "огораживания".
...
Рейтинг: 0 / 0
Вопросы о системе безопасности Firebird
    #39597139
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_PisarevskySEC$USERS для слабаков?
гм. это да, но смысл?
Собственно, никто не мешает пойти дальше, и через databases.conf указать конкретной базе на саму себя в качестве security database. И поиметь юзеров прям в этой же БД, если уж совсем приспичило.
Но центральный вопрос в том, кто делает аутентификацию, и зачем.

Как я понял, автор этой темы
а) не в курсе как идет базовая аутентификация в ФБ
б) не понял зачем Архангельский сделал ту штуку в своей программе.
То есть, наложились два непонимания, из которых в результате получилась полная каша.
Ivan_PisarevskyДим ты много полезного изложил, но несколько фраз зело портят общую картину.
тут я не мог и не собирался изложить всё, что можно придумать на эту тему, особенно с учетом ФБ 3.
Ivan_Pisarevskyчтобы даже зная логин и что такое ибэксперт было хлопотно что-то сделать мимо приклады и его "огораживания".
видишь, ты пошел еще дальше, и изложил совсем запредельную для автора топика идею, о которой, мне кажется, он вообще не подозревал.

Если уж объяснять эту тему, правильно, то надо все излагать последовательно - что за система с security3.fdb, нафига security в databases.conf, какие тут могут быть дыры, дальше уже как организуется аутентификация для веб и трехзвенки, что такое row-level-security, какое оно бывает и как реализуется, и т.д.
У меня пока задачи описать вот это все - нет :-)
...
Рейтинг: 0 / 0
Вопросы о системе безопасности Firebird
    #39597154
bastibubu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KDV , благодарю вас за суперподробное объяснение. После вашего ответа прочитал несколько источников об аутентификации и системе безопасности и стало более-менее ясно.
Одного не могу все таки понять- в Create table USERS он почему пишет в комментарии "из fbsecurity.fb"? (т.е.security3.fdb):

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Create table USERS
      (USERID       AZMID NOT NULL PRIMARY KEY,
       USERNAME     AZNAMES  NOT NULL UNIQUE, -- Login из fbsecurity.fb (ISC4.gdb)
       USRSYSNAME   AZNAMES, -- из fbsecurity.fb (ISC4.gdb)
       USRDOMAIN    AZNAMES, -- из fbsecurity.fb (ISC4.gdb)
       USRNames     AZLNAME, -- Фамилия, Имя, Отчество
       USRNPost     AZLNAME, -- Должность
/* ************************************************************************************* */
       USRGroup     CHAR(1) character set win1251, -- Текущая группа доступа
       USRLevel     AZInt32,                       -- Текущий уровень доступа
       USRRole      CHAR(2) character set Win1251, -- Допустимая группа  и 
                                                                уровень доступа
/*Блок контроля - начало*/
       DtCreate     AZTStamp,
       UsrCreate    AZMID0,                        /*references USERS on UPDATE cascade*/
       DtModify     AZTStamp,
       UsrModify    AZMID0);                       /*references USERS on UPDATE cascade*/
/*Блок контроля - конец*/
Commit;



Я создам нового пользователя, создам роли, дам роли права, потом включу этого пользователя в роли и всё. Зачем мне USERNAME и USRSYSNAME из security3.fdb в своем таблице users? Какая связь между ними?

и последный вопрос c вашего разрешения: в Sec$users находятся все пользователи которые создаю в security3.fdb. Нельзя эту таблицу связывать к таблице users связью 1:1?
...
Рейтинг: 0 / 0
Вопросы о системе безопасности Firebird
    #39597214
Любезный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эта прога тов. Архангельского была написана под FB2.0. В 3.0 концепция безопасности имеет ряд отличий, и он уже точно ничего не переделает и не напишет. Ну и вообще, книжки Архангельского плохо подходят для изучения Delphi, учитывая явные косяки в терминологии.
...
Рейтинг: 0 / 0
Вопросы о системе безопасности Firebird
    #39597287
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bastibubuв Sec$users находятся все пользователи которые создаю в security3.fdb. Нельзя эту таблицу связывать к таблице users связью 1:1?это псевдотаблица, сисдба увидит в ней одну картинку, простой смертный другую. лучше почитать доку по этому поводу и самому попробовать заглянуть в табличку из-под разных юзеров.
...
Рейтинг: 0 / 0
Вопросы о системе безопасности Firebird
    #39597434
bastibubu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЛюбезныйЭта прога тов. Архангельского была написана под FB2.0. В 3.0 концепция безопасности имеет ряд отличий, и он уже точно ничего не переделает и не напишет. Ну и вообще, книжки Архангельского плохо подходят для изучения Delphi, учитывая явные косяки в терминологии.
Любезный , Я не собираюсь переписать эту программу. Как пример как строится система безопасности, как она работает и для сравнения с другими решениями вполне устраивает.

bastibubu в Sec$users находятся все пользователи которые создаю в security3.fdb. Нельзя эту таблицу связывать к таблице users связью 1:1?
Ivan_pisarevskyэто псевдотаблица, сисдба увидит в ней одну картинку, простой смертный другую. лучше почитать доку по этому поводу и самому попробовать заглянуть в табличку из-под разных юзеров.
Ivan_Pisarevsky ,Вы правы, картина разная в зависимости от юзера, показывает только текущего юзера но если залогинится как SYSDBA или другой юзер с правами All тогда всех юзеров вместе увидим.
...
Рейтинг: 0 / 0
Вопросы о системе безопасности Firebird
    #39598501
bastibubu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
То есть, фактически получается что аутентификацию проходит и залогиниться единственный спец-пользователь, который находиться в security3.fdb, только разными ролями.
...
Рейтинг: 0 / 0
Вопросы о системе безопасности Firebird
    #39598576
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bastibubu,

"находится". А с разными ролями - зачем? Если этот юзер выполняет одну функцию, так можно либо ему дать все права, либо роли, а юзера включить в роль.
Вообще ваши фразы опять приводят в смятение. Залогиниться к базе может только тот юзер, который находится в security3.fdb, тут без вопросов.
...
Рейтинг: 0 / 0
Вопросы о системе безопасности Firebird
    #39598623
bastibubu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
KDV , вот польный код подключения к бд с комментариями автора:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
procedure TfmConnect.btnOKClick(Sender: TObject);
Var
  sDBCharSet,sDBPath : String;
begin
  inherited;
{$IFDEF AZDEBUG} MainForm.WriteReprtText('TfmUsrConnect.DialogButtonsClickOk');         {$ENDIF}
 
// Для начала как всегда отключимся от базы данных, если такое подключение было, и получим из 
// ini-файла путь к базы данных и набор символов для подключения:
  If MainForm.DB.Connected then MainForm.DB.Connected := False;
   sDBPath := AZIniFile.ReadString('ConnectToDB','DatabaseName','');
   sDBCharSet := AZIniFile.ReadString('ConnectToDB','CharSet','WIN1251');
  
// Дальше получив из формы значения "Пользователь", "Пароль" пытаемся подключится к базе данных, 
//используя только эти данные. 
 MainForm.DB.DatabaseName := sDBPath;
   MainForm.DB.Params.Clear;
   MainForm.DB.Params.Add('user_name='+edLogin.Text);
   MainForm.DB.Params.Add('password='+edPassword.Text);
   MainForm.DB.Params.Add('lc_ctype='+sDBCharSet);
   if MainForm.DB.DatabaseName='' then ShowMessage('Путь к БД не указан')
      else MainForm.DB.Connected := True;

// Если подключение удалось, то получаем информацию о пользователе, который пытается подключится к базе данных:  
  MainForm.dstRO.Close;
   MainForm.dstRO.SelectSQL.Clear;
   MainForm.dstRO.SelectSQL.Add('Select UserID,UserName,USRGroup,USRLevel,USRRole from Users');
   MainForm.dstRO.SelectSQL.Add(' where UserName='''+edLogin.Text+'''');
   MainForm.dstRO.Open;

   Try
// Если запрос не возвращает значений, то такого пользователя в данной базе данных нет, о чем и извещаем пользователя. 
//А если пользователь найден, то определяются его права доступа и формируются базовые глобальные переменные: 
   If MainForm.dstRO.IsEmpty then ShowMessage('Нет такого пользователя в БД')
      else begin
         AZUserID := MainForm.dstRO.FieldValues['UserID'];
         AZRls    := MainForm.dstRO.FieldValues['USRRole'];

         If AZRls='A0' then AZRole := 'Administrator';
         If AZRls='D0' then AZRole := 'Director';
         If AZRls='A1' then AZRole := 'Developer';

         If AZRls='F1' then AZRole := 'FinDirector';
         If AZRls='F2' then AZRole := 'ChifAccountant';
         If AZRls='F3' then AZRole := 'Accountant';
         If AZRls='F4' then AZRole := 'AccAssistant';
        
         If AZRls='G6' then AZRole := 'GuestDB'; и т.д.

      
 //После получения прав доступа для пользователя отключаемся от БД и подключаемся снова, но уже указывая роль,
 //предоставленную пользователю администратором БД и полученную из запроса: 
         MainForm.DB.Connected := False;;
         MainForm.DB.DatabaseName := sDBPath;
         MainForm.DB.Params.Clear;
         MainForm.DB.Params.Add('user_name='+edLogin.Text);
         MainForm.DB.Params.Add('password='+edPassword.Text);
         MainForm.DB.Params.Add('lc_ctype='+sDBCharSet);
         MainForm.DB.Params.Add('sql_role_name='+AZRole);
         MainForm.DB.Connected := True;
      end;
   Finally
      Screen.Cursor := SvCursor;
   end;
   fmConnect.Close;
end;



допустим в системной базе security3.fdb SYSDBA добавил спец-пользователя SPECIAL, создал роль, дал роли нужные права, включил SUPER в роль. тогда системная база security3.fdb будет иметь вид:
Sec$user_name 1SYSDBA 2 SPECIAL

а таблица users текущей бд выглядит примерно так:
user_idusernameusrgroup usrlevel usrrole1SYSDBA 1A0 2 SPECIAL 1A0

Вы пишите:
авторТо есть, логин производится следующим образом
1. программа логинится к базе, используя или SYSDBA с фиксированным паролем, или юзера SPECIAL (например) тоже с фиксированным паролем. Человек, использующий эту программу, не знает ни имени SYSDBA или SPECIAL, ни их паролей.
2. программа запрашивает у человека логин и пароль. Он должен ввести то, что находится в специальной таблице USERS, заранее созданной в пользовательской БД, и так далее.
3. программа получив идентификатор такого пользователя, использует его при любых операциях с данными.
4. аминь.
допустим приняли на работу человека и создаём пользователя user1, пароль '12345'.
программа запрашивает логин и пароль а в security3.fdb же нет такого пользователя, есть только запись в пользователской бд, в таблице users. Если ввожу users1 и пароль получу ощибку типа "username and password are not defined".

Автор делает логин так:
1. В форме вводим "Пользователь" и "Пароль" и подключаемся к базе данных(Его слова).
Вы пишите что логинится SYSDBA или SPECIAL т.е. в edituser и в editPassword вводим SYSDBA(или SPECIAL):
Код: pascal
1.
2.
MainForm.DB.Params.Add('user_name='SYSDBA');
MainForm.DB.Params.Add('password='*****');


а он пишет
Код: pascal
1.
2.
MainForm.DB.Params.Add('user_name='+edLogin.Text);
MainForm.DB.Params.Add('password='+edPassword.Text);


т.е. "user1","12345".
2. Если подключение удалось, то получаем информацию о пользователе, который пытается подключится к базе данных:
Код: sql
1.
Select UserID,UserName,USRGroup,USRLevel,USRRole from Users where UserName='''+edLogin.Text+''''


3. получаем прав доступа для пользователя, отключаемся от БД и подключаемся снова, но уже указывая роль. (т.е. он вводим "users1","12345" и например "F2")

т.е. user1 должен быть и в системной базе(security3.fdb) и в таблице users не так ли? Если юзера users1 нету в системной базе тогда как он сможет залогиниться? а если его записи нет в таблице users как тогда определить его роль?
...
Рейтинг: 0 / 0
Вопросы о системе безопасности Firebird
    #39598630
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bastibubu,

в данном куске кода я не вижу вообще никакой альтернативной аутентификации, кроме штатной.
таблица USERS здесь
1. дублирует security3.fdb
2. содержит список разрешенных ролей (тоже дублирует rdb$roles в конкретной базе).

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

Никакой схемы с логином через "секретного" юзера тут нет, и это ясно видно из приведенного кода.

То есть, КАЖДЫЙ человек, работающий с этой БД, должен иметь отдельный логин в security3.fdb. И логинов будет столько, сколько людей.
...
Рейтинг: 0 / 0
Вопросы о системе безопасности Firebird
    #39598631
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bastibubuВы пишите что логинится SYSDBA или SPECIAL
"пишете". Я предполагал, что сделано так, но нет, я был неправ.
В системе создается юзер AAA, например, и этот же юзер "делается" какими-то средствами в таблице USERS.
bastibubu Если юзера users1 нету в системной базе тогда как он сможет залогиниться?
никак. Это следует из приведенного кода, который достаточно прозрачен. Не вполне ясно, откуда у вас тогда взялись самые первые вопросы (с чего начался топик).

p.s. я не очень понял, зачем автор программы накрутил именно так. Я бы сделал через "спец-пользователя", чтобы не иметь гемора с заведением пользователей в security3.fdb.
...
Рейтинг: 0 / 0
Вопросы о системе безопасности Firebird
    #39598638
bastibubu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторТо есть, КАЖДЫЙ человек, работающий с этой БД, должен иметь отдельный логин в security3.fdb. И логинов будет столько, сколько людей.
Да. И это очень плохо.


kdvНе вполне ясно, откуда у вас тогда взялись самые первые вопросы (с чего начался топик).
KDV, Сначала сомневался что он использует системную базу security3.fdb и поэтому спрашивал:
"Если автор не использует встроенную систему безопасности сервера (в файле security3.fdb не создаёт пользователей), а создаёт свою систему безопасности тогда откуда получает в запросе внутри триггера значение переменной USER (текущий пользователь)? Тогда разве в файле безопасности не будет только суперпользователь SYSDBA?
А если использует встроенную систему безопасности сервера и создаёт там пользователей тогда как они окажутся и в таблице users?"

kdvp.s. я не очень понял, зачем автор программы накрутил именно так. Я бы сделал через "спец-пользователя", чтобы не иметь гемора с заведением пользователей в security3.fdb.
KDV,
вы имеете в виду так?:
1. Логиниться к базе, используя SYSDBA или SPECIAL
2. ввести логин и пароль который находится в USERS, заранее созданный в пользовательской БД.
3. Логиниться к базе но уже ролем.
Но и в этом случае пользователь должен существовать и в security3.fdb?
...
Рейтинг: 0 / 0
Вопросы о системе безопасности Firebird
    #39598646
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bastibubuСначала сомневался что он использует системную базу security3.fdb и поэтому спрашивал:
без нее нельзя залогиниться к БД. Или в фразе "сомневался что он использует" есть какой-то другой смысл?
bastibubu1. Логиниться к базе, используя SYSDBA или SPECIAL
2. ввести логин и пароль который находится в USERS, заранее созданный в пользовательской БД.
3. Логиниться к базе но уже ролем.
Но и в этом случае пользователь должен существовать и в security3.fdb?
я уже устал, честное слово.
1 - да. Логинится к базе в данном случае не юзер, а приложение. Юзер не знает имя данного логина и его пароль.
2 - да
3 - нихрена не получится. К "виртуальному пользователю" нельзя прицепить роли в смысле роли Firebird. Пользователи и их роли тут будут только виртуальные, т.е. используемые приложением, а не Firebird. Поэтому логин под "спец-пользователем" Firebird производится ОДИН раз, в самом начале, и приложением, а не юзером. Дальше приложение или дает "пользователю" работать с БД, или нет.
Поэтому ТАК я бы НЕ делал и не пытался. Мне кажется, вы никак не можете отделить систему аутентификации Firebird, и тот кусок кода, который автор программы добавил для разграничения прав на уровне записей.
...
Рейтинг: 0 / 0
Вопросы о системе безопасности Firebird
    #39598647
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvПоэтому ТАК
так как вы предлагаете (или спрашиваете) в пунктах 1, 2 и 3. Пункт 3 в моем варианте не нужен.
...
Рейтинг: 0 / 0
Вопросы о системе безопасности Firebird
    #39598784
AlexeyM123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bastibubu

извините за офф-топ,

есть ли у вас что еще почитать по AZMICRO2 ?
сайт az-design.ru не доступен
в wayback machine почти ничего нет
...
Рейтинг: 0 / 0
Вопросы о системе безопасности Firebird
    #39598800
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexeyM123,

я думаю, вряд-ли где найдете описание больше. Никто ж не будет писать описание по чужой программе, кроме автора.
...
Рейтинг: 0 / 0
Вопросы о системе безопасности Firebird
    #39598943
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bastibubuавторТо есть, КАЖДЫЙ человек, работающий с этой БД, должен иметь отдельный логин в security3.fdb. И логинов будет столько, сколько людей.
Да. И это очень плохо. А почему плохо? тем более "очень"?
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вопросы о системе безопасности Firebird
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]