Программирование баз данных в Delphi

Администрирование InterBase: безопасность БД

Показывать лекцию целиком

Под администрированием InterBase подразумеваются манипуляции с пользователями и ролями (добавление, удаление, предоставление и отъем прав и проч.), резервное копирование базы данных, ее восстановление и, возможно, ремонт. Тут следует сделать одно замечание: InterBase, входящий в дистрибутив Delphi, предназначен для разработки программ, а не для реальной серверной работы, поэтому он имеет ряд ограничений. Так, InterBase версии WI-V6.5.0.28, входящий в дистрибутив Delphi 7 использовался на четырех различных версиях Windows и дал одинаковый результат: создавать новых пользователей и роли можно, но войти в базу данных под другим, не SYSDBA пользователем, не получается. Поэтому если вы желаете не только изучить приемы администрирования сервера, но и опробовать все его возможности на практике, то рекомендую установить полную версию InterBase, желательно более свежую. Бесплатные пробные версии на 90 дней можно скачать отсюда: http://www.ibase.ru/interbase.htm

Впрочем, помимо приведенного выше ограничения, весь материал данного курса можно изучить и опробовать на том InterBase, который вы уже установили вместе с Delphi. Администрирование можно осуществлять разными способами: с помощью утилиты IBConsole или подобных утилит сторонних разработчиков. Но наиболее надежным и гибким способом является администрирование встроенными в InterBase утилитами командной строки, которые все равно неявно вызываются IBConsole и другими графическими утилитами, а также компонентами администрирования Delphi.

Примечание: платный сервер InterBase имеет бесплатных клонов: Firebird и Yaffil. Все, что мы изучали и продолжим изучать об InterBase, почти без изменений можно применить и к этим клонам, таким образом, вы изучаете не один, а сразу три сервера БД! Бесплатный - не значит плохой, эти клоны ничем не уступают своему предку, а в некоторых случаях даже превосходят его. Например, если в InterBase самый большой размер страницы 8192, то в Firebird можно установить страницу размером 16384 байт. Единственный минус: клоны InterBase не имеют графической утилиты вроде IBConsole. Но эта проблема легко решается: существует множество подобных утилит от сторонних разработчиков, гораздо более мощных и удобных, чем IBConsole. Особо можно порекомендовать графическую утилиту IBExpert. Эта утилита бесплатна для стран бывшего СССР, точнее, для русскоязычных пользователей - утилита определяет, что в операционной системе установлена поддержка кириллицы, и в этом случае работает без ограничений (спасибо разработчикам!). Кроме того, на сайте производителя, помимо последней версии утилиты, также можно скачать и довольно качественный русификатор. IBExpert поддерживает сервера InterBase, Firebird и Yaffil различных версий. Подробнее о клонах, утилитах, а также о пакетах компонентов для них можно узнать на сайте официального представителя этих СУБД в России http://www.ibase.ru/

Утилиты командной строки

Сейчас уже найдется не так много пользователей, которым доводилось работать с командной строкой. Большей частью пользователи привыкли к удобным графическим утилитам, с которыми можно работать при помощи одной только мыши. Утилиты командной строки представляют собой консольные приложения, в виде черного экрана с белым текстом на нем. Такие утилиты вызываются вместе с параметрами, и находятся в папке BIN сервера InterBase, по умолчанию:

C:\PROGRAM FILES\BORLAND\INTERBASE\BIN

Вызвать такую утилиту можно с помощью окна CMD (для WinNT, 2000, XP или выше) или COMMAND (для Win95/98/ME ). Так, чтобы узнать версию сервера, нажмите "Пуск -> Выполнить", а в окне введите cmd или command, в зависимости от вашей ОС. Кстати, в WinXP тоже есть команда command, однако она работает в режиме MS-DOS и не поддерживает длинных имен файлов и папок. Поэтому в XP (или выше) нужно использовать cmd.

Откроется черное окно, в конце последней строки будет мигать курсор, это и есть командная строка. Введите следующие команды (подразумевается адрес InterBase по умолчанию), после каждой из них нажимая < Enter >:

c:
cd program files\borland\interbase\bin
gpre -z

Сразу оговоримся, что текст в окне придется набирать вручную. Если скопировать текст, а затем выбрать в CMD контекстную команду "вставить", нет гарантии, что все символы скопируются правильно. В этом случае при выполнении команд вы получите ошибку. Зато в CMD имеется возможность повторить последнюю команду, не набирая ее. Достаточно нажать и удерживать клавишу "стрелка вправо", чтобы заново ввести текст последней команды. Это может быть полезным, когда приходится подряд набирать похожие команды: можно повторить, а затем отредактировать текст предыдущей команды.

В результате выполнения примера, вы получите следующее окно:

(рис 25.1 ) Утилита командной строки gpre.exe

Для тех, кто впервые использовал подобные команды, разберем их подробней. Команда

c:

делает текущим диск C: (на случай, если ранее был текущим другой диск).

Команда cd ( Change Directories ) меняет текущий каталог на указанный, то есть, командой

cd c:\program files\borland\interbase\bin

мы переходим в папку BIN сервера InterBase. Если у вас InterBase установлен по другому адресу, в этой команде следует сделать изменения. В конце мы даем команду

gpre -z

которая вызывает утилиту gpre.exe с параметром -z. Эта утилита является препроцессором языков C/C++ и предназначена для разработчиков, напрямую работающих с InterBase API. Не самая используемая утилита, но здесь для нас интересен параметр -z, который выводит информацию о версии InterBase и самой утилиты (этот же параметр есть и у остальных утилит, с которыми нам предстоит познакомиться).

Как видите, расширение *.exe при загрузке утилиты можно не указывать, а регистр букв не имеет значения. Закрыть данное окно можно командой exit. В дальнейшем для краткости изложения предполагается, что текущей папкой в этом окне является папка BIN сервера InterBase, где и хранятся все остальные утилиты.

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

В лекции № 14 мы уже рассматривали, как можно зарегистрировать нового пользователя с помощью утилиты IBConsole. Для регистрации пользователя, его удаления или смены пароля данный способ наиболее удобен, однако для порядка рассмотрим, как создать нового пользователя при помощи утилиты командной строки. В InterBase для этого существует утилита gsec .exe, подробные параметры которой можно вывести командой

gsec -help

Чтобы утилита позволила работать с данными пользователей, нужно указать, что мы имеем на это право. То есть, что мы - пользователь SYSDBA с паролем masterkey (если вы его не изменили). Так, для вывода информации об установленных пользователях имеется опция display, которая вызывается следующей командой (сервер InterBase должен быть запущен):

gsec -user sysdba -password masterkey -display

Добавить нового пользователя можно командой add:

gsec -user sysdba -password masterkey -add MISHA -pw qaz

мы добавили пользователя " MISHA " с паролем " qaz ". Изменить пароль этого пользователя на " qaz123 " можно командой modify:

gsec -user sysdba -password masterkey -modify MISHA -pw qaz123

Удалить пользователя MISHA можно командой delete:

gsec -user sysdba -password masterkey -delete MISHA

Утилита gsec позволяет работать и в интерактивном режиме. Чтобы войти в этот режим, нужно ввести команду:

gsec -user sysdba -password masterkey

После чего строка с курсором примет такой вид:

GSEC>_

Это означает, что мы находимся внутри утилиты. Далее имя и пароль администратора SYSDBA можно не указывать. Например, чтобы снова добавить пользователя MISHA, дадим команду:

add MISHA -pw qaz123

а для вывода списка пользователей укажем команду

display

Выйти из утилиты GSEC можно командой quit. Подобным же образом происходит работа и с другими утилитами командной строки.

Все пользователи и их параметры хранятся в специальной системной базе данных InterBase, которая устанавливается вместе с сервером:

C:\PROGRAM FILES\BORLAND\INTERBASE\isc4.gdb

При переустановке сервера этот файл по умолчанию не удаляется, а переходит "в наследство" следующей версии InterBase, поэтому пользователи и их пароли остаются неизменными. Таблица, содержащая информацию о пользователях, в этой БД называется USERS. На случай, если вы удалите нужного пользователя, или измените его пароль, который потом забудете, рекомендуется делать резервные копии этой БД. Есть и плохая новость. Поскольку все пользователи и их пароли хранятся в БД isc4.gdb, то имеется вероятность того, что рабочая база данных предприятия может быть скопирована, перенесена на другой ПК с установленным InterBase, после чего может быть открыта пользователем SYSDBA. Даже если на вашем сервере пароль SYSDBA изменен, на другом ПК этот пароль будет другим, так что базу данных можно будет открыть. Политика InterBase подразумевает, что серверный ПК должен быть:

  • Недоступен посторонним лицам.
  • Не должен иметь открытых для общего доступа ресурсов (дисков или папок с базами данных).
  • При соблюдении этих правил безопасность данных будет на высоком уровне.

    Права

    Добавление нового пользователя еще не означает, что он сможет работать с БД. Чтобы он мог с ней работать, ему необходимо также выделить какие то права. Права в InterBase раздаются пользователям и ролям (и даже хранимым процедурам и триггерам) на какие либо действия с отдельными объектами БД. Под объектами подразумеваются таблицы и их столбцы, просмотры и хранимые процедуры. Права могут быть такими:

  • Для таблиц и их полей команды SELECT, INSERT, UPDATE, DELETE и REFERENCES (право на создание ограничений внешнего ключа FOREIGN KEY для данной таблицы. Если таблица содержит внешний ключ, а пользователь должен иметь право на изменение таблицы, то это право ему необходимо также предоставить).
  • Для просмотров VIEW команды SELECT, INSERT, UPDATE и DELETE.
  • Для хранимых процедур команда EXECUTE.
  • Таким образом, пользователю можно предоставить, например, права на изменение каких то отдельных столбцов; на другие столбцы только просмотр; возможность добавлять новую запись, но без возможности ее удалить. Могут быть пользователи с правами только на просмотр определенных таблиц или, наоборот, с полными правами на все объекты БД. Раздаются права командой GRANT.

    Предоставлять пользователям права удобней утилитой IBConsole. Загрузите IBConsole, войдите в локальный сервер и базу данных First. Дадим пользователю PUPKIN (которого мы создали в лекции №14) права на просмотр таблицы Tovar. Откройте окно Interactive SQL и введите следующую команду:

    GRANT SELECT ON TOVAR TO PUPKIN;

    После нажатия кнопки Execute Query, пользователь PUPKIN получит права на просмотр этой таблицы. Убедиться в этом можно, выделив в IBConsole таблицу Tovar, щелкнув по ней правой кнопкой и выбрав команду Properties. Перейдем на вкладку Permission:

    (рис 25.2 ) Права на таблицу Tovar

    Как видим, пользователь SYSDBA имеет на таблицу все права, тогда как пользователь PUPKIN - только на чтение. И еще мы можем сделать вывод, что если пользователи и их пароли хранятся в системной БД InterBase, то их права на объекты рабочей БД хранятся в этой самой БД.

    Значок открытой руки в правах пользователя SYSDBA означает, что эти права могут передаваться другим пользователям. Дадим пользователю PUPKIN права на модификацию записей, с возможностью передачи этого права другим пользователям. Для этого существует дополнительный оператор WITH GRANT OPTION. Снова откроем Interactive SQL и введем следующую команду:

    GRANT UPDATE ON TOVAR TO PUPKIN WITH GRANT OPTION;

    Если мы снова откроем вкладку Permission таблицы Tovar, то убедимся, что PUPKIN теперь имеет право не только изменять записи таблицы, но и передавать это право другим пользователям. Причем каждый пользователь может передавать лишь те права или их часть, которые есть у него самого.

    Чтобы предоставить пользователю права на отдельные столбцы в таблице, их нужно перечислить в скобках:

    GRANT UPDATE (FNAME, FTYPE, FCENA) ON FOOD TO PUPKIN;

    Предоставление прав для списка столбцов может быть только на команды UPDATE и PREFERENCES, для других команд необходимо указывать всю таблицу. Если пользователю требуется предоставить сразу несколько различных прав на таблицу, эти права можно указать через запятую:

    GRANT SELECT, INSERT, UPDATE  ON  PRIM_1 TO PUPKIN;

    Через запятую можно указать и список пользователей:

    GRANT SELECT, INSERT ON DAYS TO PUPKIN, MISHA;

    Чтобы предоставить пользователю ВСЕ права на объект, можно использовать оператор ALL:

    GRANT ALL ON SKLAD TO PUPKIN;

    А чтобы предоставить какое то право ВСЕМ зарегистрированным пользователям, можно воспользоваться "виртуальным" пользователем PUBLIC:

    GRANT ALL ON SDELKI TO PUBLIC;

    Права можно не только дать, но и отнять. Делается это командой REVOKE, которая является копией GRANT, только с обратным действием (вместо TO <пользователь> синтаксис использует FROM <пользователь>). Например, снять все права у всех пользователей на таблицу Sdelki можно командой:

    REVOKE ALL ON SDELKI FROM PUBLIC;

    Пользователь SYSDBA при этом прав на таблицу не потеряет.

    Роли

    Когда в организации работает множество пользователей, они, как правило, разбиваются на группы. Например, несколько бухгалтеров с одинаковыми правами. Чтобы не терять время на создание одинаковых прав для нескольких пользователей, в InterBase имеется механизм ролей. При пользовании этим механизмом, существует четыре последовательности действий:

  • Создать роль.
  • Присвоить этой роли необходимые права.
  • Назначить нужным пользователям эту роль.
  • При соединении с БД указать не только имя пользователя и пароль, но и его роль.
  • Выполним эту последовательность в окне Interactive SQL:

    CREATE ROLE BUH; /*Создаем роль*/
    GRANT ALL ON SDELKI TO BUH; /*присваиваем ей права*/
    GRANT BUH TO PUPKIN; /*Предоставляем роль пользователю*/

    Теперь, если мы выделим в дереве серверов в нашей БД раздел Roles, то увидим новую роль BUH:

    (рис 25.3 ) Создание роли

    А если щелкнуть по BUH в правой части окна правой копкой и выбрать команду Properties, мы увидим, что на эту роль имеет право пользователь PUPKIN. Чтобы подключить пользователя PUPKIN к БД в контексте роли, а не как просто пользователя, в параметрах компонента IBDatabase нужно будет указать следующие параметры:

    user_name=pupkin
    password=qwerty
    sql_role_name=buh
    lc_ctype=WIN1251

    Это сработает только в том случае, если данному пользователю действительно присвоена эта роль. Таким образом, в клиентском приложении можно сделать гибкую систему подключений пользователя: как простого пользователя с одними правами, и как пользователя в контексте роли с другими правами.

    Если же мы подключаемся к БД другим образом, например, через SQL -скрипт, то параметры подключения могут выглядеть иначе:

    CONNECT C:\DATABASES\FIRST.GDB 
    USER PUPKIN
    ROLE BUH
    PASSWORD qwerty;

    Удаляется роль командой DROP, при этом все права роли на объекты утрачиваются:

    DROP ROLE BUH;
    Вернуться к учебному плану