Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
Шрифт:
Любой из этих переключателей позволяет отобразить общие сведения о командах gsec, переключателях и синтаксисе.
Завершает интерактивную сессию.
Использование gsec из командной строки
Для использования gsec из командной строки преобразуйте каждую команду gsec в командный переключатель, добавив префикс в виде знака минус (-). Переключатели остаются теми же самыми.
Например, для добавления пользователя claudio и назначения ему пароля dbkeycop в командной строке введите следующее.
В Windows:
,.\BIN> gsec -add claudio -pw dbkeycop -user SYSDBA -password masterkey
В POSIX:
bin]$ ./gsec -add claudio -pw dbkeycop -user SYSDBA -password masterkey
Для отображения содержимого таблицы USERS введите: > gsec -display
Сообщения об ошибках gsec
В табл. 34.2 представлены сообщения об ошибках gsec.
Таблица 34.2. Сообщения об ошибках gsec
Сообщение | Причины и рекомендуемые действия |
Add record error (Ошибка добавления записи) | Неверный синтаксис или вы пытаетесь добавить пользователя, который уже существует, или вы не являетесь пользователем SYSDBA. Используйте modify, если пользователь уже существует |
<string> already specified (<строка> уже была задана) | Вы включили переключатель более одного раза в команду add или modify. Введите команду заново |
Error in switch specifications (Ошибка в задании переключателя) | Это сообщение сопровождает другие сообщения об ошибках и указывает на то, что был использован неверный синтаксис. В этом случае просмотрите другие сообщения об ошибках |
Find/delete record error (Ошибка поиска удаляемой записи) | Команда удаления не может найти указанного пользователя или вы не являетесь пользователем SYSDBA |
Find/display record error (Ошибка поиска отображаемой записи) | Команда модификации не может найти указанного пользователя или вы не являетесь пользователем SYSDBA |
Incompatible switches specified (Заданы несовместимые переключатели) | Например, вы ввели множество переключателей для команды удаления, которая требует только одного обязательного аргумента имя-пользователя. Скорректируйте синтаксис и выполните команду заново |
Invalid parameter, no switch defined (Неверный параметр, не задан переключатель) | Вы указали значение без аргумента |
Invalid switch specified (Задан неверный переключатель) | Вы задали нераспознанный переключатель. Исправьте и вновь выполните команду |
No user name specified (He задано имя пользователя) | Задавайте имя пользователя после команд или переключателей добавления, изменения или удаления |
Record not found for user: <string> (He найдена запись для пользователя: <строка>) | Запись указанного пользователя не найдена. Отобразите список пользователей и вновь введите команду |
Unable to open database (Невозможно открыть базу данных) | База данных безопасности не существует или не может быть локализована на сервере. Запустили ли вы gsec вне каталога Firebird? Пытаетесь ли вы получить доступ к удаленному серверу, который не был инсталлирован? |
Специальная тема: настройка безопасности пользователя
Идентификация пользователя Firebird довольно проблематична. Хорошая новость: все изменится к лучшему в Firebird 2. Плохая новость: нам придется с этим жить еще некоторое время. Ivan Prenosil- эксперт, в течение длительного времени занимающийся разработкой баз данных с использованием Firebird и его предшественников - создал несколько техник для настроек безопасности баз данных. Ivan согласился поделиться с вами своими советами и скриптами в данной специальной теме.
База данных безопасности
Когда пользователь соединяется с базой данных Firebird, его пароль сравнивается с зашифрованным паролем в базе данных безопасности. В версии 1.0.x имя базы данных isc4.gdb, в версии 1.5 - security.fdb.
CREATE TABLE USERS (
USER_NAME VARCHAR(128) ,
PASSWD VARCHAR(32) ); /* V
GRANT SELECT ON USERS TO PUBLIC;
Для проверки разрешений к этой таблице существует два очевидных препятствия. Одно - ни один пользователь не может прочесть полный список пользователей и зашифрованных паролей. Другое - только пользователь SYSDBA может изменять эту таблицу - пользователи не могут изменять их собственные пароли.
При этом, если вы пользователь SYSDBA, вы можете соединиться с базой данных безопасности, как и с любой другой базой данных, и изменять ее структуру. Это означает, что вы можете ее улучшать.
! ! !
ВНИМАНИЕ! Не забудьте сделать копию базы данных безопасности перед тем, как начнете ее изменять!
. ! .
При идентификации пользователей в Firebird 1.0.x сервер соединяется с базой данных безопасности, отыскивает необходимую информацию, а затем отсоединяется. Между соединениями у вас могут быть "не очень хорошие отношения" с isc4.gdb.
Однако в Firebird 1.5 соединение с базой данных безопасности сохраняется, пока пользователь соединен с любой базой данных на сервере. Поэтому в версии 1.5 вы должны выполнять все изменения с копией базы данных безопасности и позже ее инсталлировать. Нужно выполнить следующие шаги.
1. Сделайте оперативную копию security.fdb с использованием gbak.
2. Восстановите ее с другим именем.
3. Запустите скрипт для копии.
4. Закройте сервер.
5. Поменяйте местами старую и новую версии security.fdb и переименуйте.
6. Запустите заново сервер.
Предоставление пользователям возможности изменять свой собственный пароль
Самым простым и наиболее известным способом изменения является предоставление следующей привилегии изменения для пользователя, не являющегося SYSDBA, GRANT UPDATE ON USERS то PUBLIC и добавление триггера, предотвращающего изменение пользователем, не являющимся SYSDBA, пароля других пользователей.
Вот скрипт:
/* Copyright Ivan Prenosil 2002-2004 */
CONNECT 'C:\Program Files\Firebird\Firebird_1_5\security.fdb'
USER 'SYSDBA' PASSWORD 'masterkey';
CREATE EXCEPTION E_NO_RIGHT 'You have no rights to modify this user.';
/* Вы не имеете прав для изменения этого пользователя */
SET TERM !!;
CREATE TRIGGER user_name_bu FOR USERS BEFORE UPDATE
AS
BEGIN
IF (NOT (USER = 'SYSDBA' OR USER = OLD.USER_NAME)) THEN
EXCEPTION E_NO_RIGHT;
END ! !
SET TERM ;!!
/** Grants. **/
GRANT UPDATE (PASSWD, GROUP_NAME, UID, GID,
FIRST_NAME, MIDDLE_NAME, LAST_NAME)
ON USERS TO PUBLIC;
Довольно неуклюже предоставлять доступ ко всем столбцам, когда вам реально нужен доступ только к PASSWD. К сожалению, это необходимо, если ваше приложение собирается использовать gsec или сервис API.
Такая модификация не устраняет проблему видимости для PUBLIC полного списка пользователей и их зашифрованных паролей. Это позволяет пользователям очень просто получить список паролей других пользователей и постараться сломать их локально посредством грубой силы [136] .
136
Как уже говорилось ранее, шифрование пароля производится с потерей данных. Единственный способ, которым можно "взломать" пароль, - это перебор словаря, шифруемого тем же алгоритмом, что используется в Firebird. В данном случае время подбора существенно сокращается тем, что шифруемый пароль имеет длину не более 8 символов.
– Прим. науч. ред.
Как спрятать список пользователей/паролей
Если вы переименуете таблицу USERS и заново создадите USERS как просмотр переименованной таблицы, вы можете получить лучший из миров. У пользователей будет возможность изменять свои собственные пароли, а полный список пользователей и паролей будет спрятан для PUBLIC. Каждый пользователь, не являющийся SYSDBA, будет видеть только одну запись из security.fdb (или isc4.gdb, если у вас сервер версии 1.0.x). Новые структуры в security.fdb будут похожи на следующую схему: