Что из себя представляет пользователь InterBase?

Безопасность InterBase основана на концепции пользователя. Пользователь - это личность, против которой направлена вся защита БД. Авторизованные пользователи InterBase сохранены в БД безопасности, которая называется ISC4.GDB. Каждый сервер InterBase имеет свою собственную БД безопасности, следовательно определение пользователя ограничивается сервером на котором оно сохранено. Один и тот же пользователь может существовать на нескольких серверах, но он должен быть создан на всех серверах где это необходимо. В БД безопасности сохраняется также зашифрованный пароль для каждого пользователя. Пользователи в этой БД действительны для всех БД размещенных на этом сервере.

Имя пользователя может содержать максимум 31 символ. Имя пользователя НЕ зависит от регистра букв. Пароль может содержать до 8 символов. Пароль является регистро-чувствительным.

Типичная ошибка: Это общая ошибка многих новых пользователей InterBase. Они создают пользователя и пароль, но когда пытаются использовать его, получают сообщение об ошибке, что имя пользователя и пароля не верные. Следует убедиться, что указанный пароль ТОЧНО соответствует установленному.

ПолеНеобходимоТип данныхОписание
User NameДаСтрокаИмя пользователя при подключении
PasswordДаСтрокаПароль пользователя
UIDНетЦелое число Необязательный UserID. На данный момент не используется InterBase
GIDНетЦелое число Необязательный GroupID. На данный момент не используется InterBase
Full NameНетСтрокаНастоящее имя пользователя

Расширение пользователей InterBase пользователями ОС

Все версии 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 на момент подключения к БД.

Пользователь SYSDBA

После инсталляции InterBase существует только один пользователь - SYSDBA. SYSDBA - это специальный пользователь над ограничениями безопасности и имеет полный доступ ко всем БД на сервере. Пароль по умолчанию для SYSDBA - masterkey. Весьма рекомендуется изменить пароль SYSDBA, т.к. он одинаков для всех пакетов InterBase, и любой кто использовал InterBase легко может предположить воспользоваться этим паролем. Только SYSDBA может добавлять, изменять или удалять пользователей.

На системах Unix суперпользователь root может использоваться как SYSDBA. InterBase трактует имя пользователя root как SYSDBA. При использовании root вы имеете все привилегии на всех БД размещенных на сервере.

Управление пользователями

InterBase предоставляет для SYSDBA три интерфейса управления пользователями:

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

Использование команднострочной утилиты безопасности InterBase GSEC

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 используется для изменения информации о существующем пользователе.
В примере обновляются UserID и lastname для пользователя BJONES.
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

Использование Server Manager для управления пользователями

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. Данное окно имеет кнопки для добавления, изменения или удаления пользователей.
Окно InterBase Security

Диалог User Configuration
Второе окно Server Manager это диалог User Configuration. Этот диалог показывается когда выполняется "Add User" или "Modify User". Диалог группирует все необходимые поля отдельно от необязательной информации. При добавлении нового пользователя в диалоге User Configuration все поля пустые. Для нового пользователя необходимо ввести имя пользователя и пароль. Дополнительная информация о пользователе может быть введена таким же образом.
Окно User Configuration

Использование InterBase API для управления пользователями

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 и пароля используются поля:

В поле dba_user_name должно быть значение SYSDBA, а в поле dba_password должен быть установлен пароль SYSDBA (по умолчанию для InterBase это masterkey).

Типичная ошибка: Не стоит жестко зашивать в код приложения пароль 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