Безопасность InterBase основана на концепции пользователя. Пользователь - это личность, против которой направлена вся защита БД. Авторизованные пользователи InterBase сохранены в БД безопасности, которая называется ISC4.GDB. Каждый сервер InterBase имеет свою собственную БД безопасности, следовательно определение пользователя ограничивается сервером на котором оно сохранено. Один и тот же пользователь может существовать на нескольких серверах, но он должен быть создан на всех серверах где это необходимо. В БД безопасности сохраняется также зашифрованный пароль для каждого пользователя. Пользователи в этой БД действительны для всех БД размещенных на этом сервере.
Имя пользователя может содержать максимум 31 символ. Имя пользователя НЕ зависит от регистра букв. Пароль может содержать до 8 символов. Пароль является регистро-чувствительным.
Типичная ошибка: Это общая ошибка многих новых пользователей InterBase. Они создают пользователя и пароль, но когда пытаются использовать его, получают сообщение об ошибке, что имя пользователя и пароля не верные. Следует убедиться, что указанный пароль ТОЧНО соответствует установленному.
Поле | Необходимо | Тип данных | Описание |
User Name | Да | Строка | Имя пользователя при подключении |
Password | Да | Строка | Пароль пользователя |
UID | Нет | Целое число | Необязательный UserID. На данный момент не используется InterBase |
GID | Нет | Целое число | Необязательный GroupID. На данный момент не используется InterBase |
Full Name | Нет | Строка | Настоящее имя пользователя |
Все версии InterBase используют БД безопасности для аутентификации пользователей. Некоторые версии InterBase предоставляют доступ на основе разрешений операционной системы. Все InterBase для Unix позволяют при подключении к серверу или БД использовать пользователей ОС или самого сервера. InterBase для Win95 или NT не могут использовать базу пользователей ОС и полагаются исключительно на свою БД.
InterBase трактует пользователя Unix также как пользователя из своей БД безопасности, пока сервер
воспринимает клиента как доверенный хост. Учетная запись пользователя должна существовать и на
клиенте и на сервере. Для установки доверительных отношений между клиентом и сервером запись должна
быть в файле сервера /etc/hosts.equiv или /etc/gds_hosts.equiv. Файл hosts.equiv
устанавливает доверительные отношения ОС, которые распространяются на другие сервисы (например,
rlogin, rsh, rcp). Файл gds_hosts.equiv устанавливает только доверительные отношения InterBase.
Формат записи следующий:
hostname [username]
Установить доверительные отношения между машинами Unix и Windows невозможно. Чтобы использовать
пользователей Unix, клиент и сервер должны быть Unix.
Пользователи Unix используются только,
если не определено имя пользователя в InterBase на момент подключения к БД.
После инсталляции InterBase существует только один пользователь - SYSDBA. SYSDBA - это специальный пользователь над ограничениями безопасности и имеет полный доступ ко всем БД на сервере. Пароль по умолчанию для SYSDBA - masterkey. Весьма рекомендуется изменить пароль SYSDBA, т.к. он одинаков для всех пакетов InterBase, и любой кто использовал InterBase легко может предположить воспользоваться этим паролем. Только SYSDBA может добавлять, изменять или удалять пользователей.
На системах Unix суперпользователь root может использоваться как SYSDBA. InterBase трактует имя пользователя root как SYSDBA. При использовании root вы имеете все привилегии на всех БД размещенных на сервере.
InterBase предоставляет для SYSDBA три интерфейса управления пользователями:
GSEC - это команднострочная утилита предоставляющая интерфейс к БД безопасности InterBase. Для использования GSEC необходимо быть SYSDBA или суперпользователем (под Unix). GSEC может использоваться интерактивно или из командной строки. В следующей таблице собраны команды GSEC.
Команда | Описание |
di[splay] | Показать всех пользователей в ISC4.GDB |
di[splay] name | Показать информацию для пользователя name |
a[dd] name -pw passwd [option argument option argument ...] | Добавить пользователя name с паролем passwd и необязательной информацией |
mo[dify] name [options] | Изменить атрибуты пользователя |
de[lete] name | Удалить пользователя name из ISC4.GDB |
h[elp] | Показать команды и синтаксис GSEC |
q[uit] | Выйти из консоли GSEC |
Команда DISPLAY показывает всех пользователей
GSEC display user name uid gid full name ------------------------------------------------------- SYSDBA 0 0 TEST 0 0 BBANDY 0 0 MKEMPER 0 0
Команда ADD используется для добавления новых пользователей в БД безопасности. В следующей таблице перечисляются все опции, которые могут быть указаны при добавлении или изменении пользователя.
Опция | Описание |
-pw | Пароль пользователя |
-u[id] | User ID |
-g[id] | Group ID |
-f[name] | User's first name |
-mn[ame] | User's middle name |
-l[name] | User's last name |
В данном примере добавляется пользователь BJONES с указанным паролем. Также сохраняется информация для полей first name и last name.
GSEC add BJONES -pw blah -fname Bobby -lname Jones GSEC display BJONES user name uid gid full name -------------------------------------------------------- BJONES 0 0 Bobby JonesКоманда MODIFY используется для изменения информации о существующем пользователе.
GSEC modify BJONES -uid 22 -fname Brad GSEC display BJONES user name uid gid full name -------------------------------------------------------- BJONES 22 0 Brad JonesВ следующем примере используется команда DELETE для удаления пользователя BJONES. Для проверки удаления используется команда DISPLAY чтобы показать всех пользователей.
GSEC delete BJONES GSEC display user name uid gid full name -------------------------------------------------------- SYSDBA 0 0 TEST 0 0 BBANDY 0 0 MKEMPER 0 0
InterBase Server Manager предоставляет графический интерфейс для множества общих административных операций. Server Manager имеется только для платформы Windows. Можно управлять сервером InterBase на любой платформе, но Server Manager должен запускаться под Windows. На машине, где используется Server Manager должен быть инсталлирован InterBase Client for Windows.
В числе многих решаемых им задач также и управление пользователями. Server Manager выполняет те же задачи управления пользователями, что и GSEC, но в графическом окружении. С того времени как каждый сервер InterBase имеет свою собственную БД безопасности, необходимо подключаться к серверу как SYSDBA чтобы управлять пользователями.
Диалог InterBase Security
Для управления пользователями существуют два главных окна. Первое, InterBase
Security, представляет список текущих пользователей в БД безопасности, аналогично
команде DISPLAY в GSEC. Данное окно имеет кнопки для добавления, изменения или
удаления пользователей.
Диалог User Configuration
Второе окно Server Manager это диалог User Configuration. Этот диалог показывается
когда выполняется "Add User" или "Modify User". Диалог группирует все необходимые
поля отдельно от необязательной информации. При добавлении нового пользователя в
диалоге User Configuration все поля пустые. Для нового пользователя необходимо
ввести имя пользователя и пароль. Дополнительная информация о пользователе может
быть введена таким же образом.
InterBase предоставляет собственный API (Application Programming Interface) для доступа к БД и выполнения администраторских функций. Приложения могут использовать эти API-функции для обеспечения связи с базами InterBase. Среди этих функций есть три, которые позволяют прикладному программисту управлять пользователями. В следующей таблице представлены эти три функции.
Функция API | Описание |
isc_add_user | Добавление нового пользователя в БД безопасности |
isc_modify_user | Изменение пользователей в БД безопасности |
isc_delete_user | Удаление пользователя из БД безопасности |
Для каждой из трех функций устанавливается структура USER_SEC_DATA. Эта структура определена в ibase.h следующим образом:
typedef struct { short sec_flags; /* какие поля заданы */ int uid; /* идентификатор пользователя */ int gid; /* идентификатор группы пользователя */ int protocol; /* протокол для подключения */ char ISC_FAR *server; /* сервер для администрирования */ char ISC_FAR *user_name; /* имя пользователя */ char ISC_FAR *password; /* пароль пользователя */ char ISC_FAR *group_name; /* имя группы */ char ISC_FAR *first_name; /* first name пользователя */ char ISC_FAR *middle_name; /* middle name пользователя */ char ISC_FAR *last_name; /* last name пользователя */ char ISC_FAR *dba_user_name; /* имя пользователя dba */ char ISC_FAR *dba_password; /* пароль dba */ }USER_SEC_DATA;В данной структуре имеются элементы для каждого пользовательского атрибута, который может быть сохранен в БД безопасности. Также присутствуют дополнительные элементы, которые необходимы серверу для определения, какая БД безопасности будет изменена, и какие поля в БД. Примеры использования структуры USER_SEC_DATA с тремя функциями API представлены ниже.
Для успешного выполнения функций управления пользователями должен быть задан пароль SYSDBA. Это можно сделать двумя различными способами. При заполнении структуры USER_SEC_DATA, можно использовать два поля для указания имени SYSDBA и пароля. Для установки имени SYSDBA и пароля используются поля:
Типичная ошибка: Не стоит жестко зашивать в код приложения пароль SYSDBA. Любой пользователь может получить статическую строку из двоичного кода при помощи специальной утилиты или hex-редактора.
Далее следуют несколько примеров использования API-функций управления пользователями. Примеры приведены для C и Delphi.
Добавление нового пользователя в C.
В данном примере добавляется пользователь BJONES с паролем bjones в БД безопасности.
Также сохраняются first name и last name пользователя.
File: adduser.c #include "ibase.h" #include <stdio.h> main() { ISC_STATUS isc_status[20]; USER_SEC_DATA user_data; user_data.user_name = "BJONES"; user_data.password = "bjones"; user_data.protocol = sec_protocol_local; user_data.dba_user_name = "SYSDBA"; user_data.dba_password = "masterkey"; /* Don't hardcode this */ user_data.first_name = "Bobby"; user_data.last_name = "Jones"; user_data.sec_flags = sec_password_spec | sec_dba_user_name_spec | sec_dba_password_spec | sec_first_name_spec | sec_last_name_spec; isc_add_user(isc_status, &user_data); if(isc_status[0] == 1 && isc_status[1]) { isc_print_status(isc_status); return; } printf("Successfully added user\n"); return; }
Добавление нового пользователя в Delphi.
В данном примере выполняются те же действия, что и в предыдущем, написанном на C.
File: Adduser.dpr program Adduser; uses ibase in 'ibase.pas', ib_externals in 'ib_externals.pas'; var userData: TUserSecData; userDataPtr: PUserSecData; status: array[0..19] of ISC_STATUS; isc_status: PISC_STATUS; begin { setup isc_status pointer } isc_status := @status; { setup user data pointer to point to user data structure } userDataPtr := @userData; { setup user data structure } userData.user_name := 'BJONES'; userData.password := 'bjones'; userData.protocol := sec_protocol_local; userData.dba_user_name := 'SYSDBA'; userData.dba_password := 'masterkey'; /* Don't hardcode this */ userData.first_name := 'Bobby'; userData.last_name := 'Jones'; userData.sec_flags := sec_password_spec or sec_dba_user_name_spec or sec_dba_password_spec or sec_first_name_spec or sec_last_name_spec; { add user to security database } isc_add_user(isc_status, userDataPtr); end.
Изменение пользователя в C
В данном примере изменяется пароль пользователя BJONES на bjones.
File: modifyuser.c #include "ibase.h" #include <stdio.h> main() { ISC_STATUS isc_status[20]; USER_SEC_DATA user_data; user_data.user_name = "BJONES"; user_data.password = "bjones"; user_data.protocol = sec_protocol_local; user_data.dba_user_name = "SYSDBA"; user_data.dba_password = "masterkey"; /* Don't hardcode this */ user_data.sec_flags = sec_password_spec | sec_dba_user_name_spec | sec_dba_password_spec; isc_modify_user(isc_status, &user_data); if(isc_status[0] == 1 && isc_status[1]) { isc_print_status(isc_status); return; } printf("Successfully modified user\n"); return; }
Изменение пользователя в Delphi
В данном примере изменяется пароль пользователя BJONES на newpass и UID на 22.
File: ModifyUser.dpr program ModifyUser; uses ib_externals in 'ib_externals.pas', ibase in 'ibase.pas'; var userData: TUserSecData; userDataPtr: PUserSecData; status: array[0..19] of ISC_STATUS; isc_status: PISC_STATUS; begin { setup isc_status pointer } isc_status := @status; { setup user data pointer to point to user data structure } userDataPtr := @userData; { setup user data structure } userData.user_name := 'BJONES'; userData.password := 'newpass'; userData.uid := 22; userData.protocol := sec_protocol_local; userData.dba_user_name := 'SYSDBA'; userData.dba_password := 'masterkey'; /* Don't hardcode this */ userData.sec_flags := sec_uid_spec or sec_password_spec or sec_dba_user_name_spec or sec_dba_password_spec; { add user to security database } isc_modify_user(isc_status, userDataPtr); end.
Удаление пользователя в C
В данном примере удаляется BJONES из БД безопасности. Как показано в примерах,
необходимые поля - только пользователь для удаления, пользователь и пароль SYSDBA.
File: deleteuser.c #include "ibase.h" #include <stdio.h> main() { ISC_STATUS isc_status[20]; USER_SEC_DATA user_data; user_data.user_name = "BJONES"; user_data.protocol = sec_protocol_local; user_data.dba_user_name = "SYSDBA"; user_data.dba_password = "masterkey"; /* Don't hardcode this */ user_data.sec_flags = sec_dba_user_name_spec | sec_dba_password_spec; isc_delete_user(isc_status, &user_data); if(isc_status[0] == 1 && isc_status[1]) { isc_print_status(isc_status); return; } printf("Successfully deleted user\n"); return; }
Удаление пользователя в Delphi
В данном примере удаляется пользователь BJONES из БД безопасности.
File: DeleteUser.dpr program DeleteUser; uses ibase in 'ibase.pas', ib_externals in 'ib_externals.pas'; var userData: TUserSecData; userDataPtr: PUserSecData; status: array[0..19] of ISC_STATUS; isc_status: PISC_STATUS; errorBuffer: array[0..256] of char; buffer: PChar; begin { setup isc_status pointer } isc_status := @status; { setup user data pointer to point to user data structure } userDataPtr := @userData; {setup pointer for error buffer } buffer := errorBuffer; { setup user data structure } userData.user_name := 'BJONES'; userData.protocol := sec_protocol_local; userData.dba_user_name := 'SYSDBA'; userData.dba_password := 'masterkey'; /* Don't hardcode this */ userData.sec_flags := sec_dba_user_name_spec and sec_dba_password_spec; { add user to security database } isc_delete_user(isc_status, userDataPtr); end.
Содержание | Привилегии SQL |