С учетом результатов данной статьи становится понятно, что в системах с повышенными требованиями к безопасности для обеспечения надежной аутентификации следует использовать более сильные средства, чем парольная защита СУБД Oracle. Рекомендации естественно вытекают из описанных выше уязвимостей.
- Придерживаться принципа минимума привилегий при назначении ролей и выдаче привилегий.
- Усилить политику безопасности при выборе паролей, ограничив снизу минимальную длину пароля 10-12 знаками. Эти действия реализуются путем настройки профиля и выполнения скрипта utlpwdmg.sql. Скрипт utlpwdmg.sql рекомендуется изменить, с тем, чтобы применять в нем свои технологии генерации паролей.
- Запретить удаленное подключение как DBA (файл init.ora, spfile.ora).
remote_os_authentication=FALSE
- Несмотря на наличие бреши, связанной с sys.user$, установить аудит SELECT-выражений выполняемых над таблицами, содержащими столбец PASSWORD:
audit select on sys.link$;
audit select on sys.user_history$;
audit select on sys.dba_users;
audit select on sys.KU$_ROLE_VIEW;
audit select on sys.KU$_DBLINK_VIEW;
audit select on sys.KU$_10_1_dblink_view;
audit select on sys.KU$_USER_VIEW;
audit select on sys.exu8phs;
audit select on sys.user_db_links;
audit select on sys.exu8rol;
audit select on sys.KU$_psw_hist_list_view;
- Настройка IP-адресов, с которых возможно подключение к БД (файлы sqlnet.ora, protocol.ora):
tcp.validnode_checking = YES
tcp.excluded_nodes = {list of IP addresses} - список запрещенных IP-адресов
tcp.invited_nodes = {list of IP addresses} - список разрешенных IP-адресов
- Настроить шифрование TNS-трафика. Использовать создание защищенного канала при установке соединения, например, алгоритм Диффи-Хеллмана.
- В ОС Unix настроить список IP-адресов, с которых возможно подключение к серверу:
файлы hosts.allow, hosts.deny
- Обеспечить подключение к серверу только по SSH.
- Максимально ограничить доступ потенциального злоумышленника к хешам паролей.
Настроить права на файл паролей pwSID.ora и файл system.dbf так, чтобы исключить доступ всех пользователей, кроме владельца софта (обычно это учетная запись oracle в ОС). Т.е. члены группы dba не смогут просмотреть этот файл.
- Настройка аудита в ОС.
- В системах с повышенными требованиями к безопасности следует обратить внимание на привилегии пользователей, которые имеют доступ к БД через Интернет и не использовать привилегированных пользователей для web-приложений.
- Не забывать про важность организационных мер (ограничение круга лиц, которые имеют доступ к серверу и ОС, к root, к бэкапам, подписка о неразглашении, меры наказания), которые являются не менее серьезным барьером, чем парольная защита.
Управление устареванием1 паролей в СУБД Oracle реализуется через использование profile с помощью операторов create profile и alter profile. Они обеспечивают возможность проверки качества (сложность) пароля и настройку политики устаревания паролей. Администраторы могут использовать для этой цели profile пользователя в БД и встроить в него свою функцию проверки качества пароля, чтобы заставить пользователей принимать более сильные пароли.
Приемлемая длина пароля зависит от количества вычислительных ресурсов, доступных злоумышленнику и длительности его сеанса связи. Предполагая, что злоумышленник обладает современным аппаратным взломщиком DES, организации требуется не менее 12 знаков пароля, чтобы обеспечить срок его устаревания в 60 дней при проведении злоумышленником силовой атаки. В приложении 3 излагается математический аппарат, позволяющий оценить вероятность взлома Вашей парольной защиты.
Процедура проверки качества пароля - это функция на PL/SQL в схеме SYS, принимающая на входе логин пользователя, старый пароль и новый пароль, и возвращающая TRUE, в зависимости от качества выбранного пользователем пароля. Простейший пример такой функции
SQL> CONNECT / AS SYSDBA;
Connected.
SQL> CREATE OR REPLACE FUNCTION sys.password_verify
2 (username varchar2, password varchar2, old_password varchar2)
3 RETURN boolean IS
4 BEGIN
5 IF length(password) < 12 THEN
6 raise_application_error(-20000, 'Password less than 12 characters');
7 END IF;
8 RETURN(TRUE);
9 END;
10 /
Эта функция выдает ошибку, если длина нового пароля менее 12 знаков. Эта функция не выполняет никаких других проверок пароля. Реальная функция проверки пароля должна быть, конечно, гораздо сложнее.
После создания такой функции ее необходимо ассоциировать с профилем. По умолчанию, в СУБД Oracle всегда существует профиль DEFAULT. С ним и будем ассоциировать:
SQL> ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION password_verify;
SQL> connect scott/tiger
Connected.
SQL> ALTER USER scott IDENTIFIED BY "scott" REPLACE "tiger";
ALTER USER scott IDENTIFIED BY " scott " REPLACE "tiger"
*
ERROR at line 1:
ORA-28003: password verification for the specified password failed
ORA-20000: Password less than 12 characters
SQL> ALTER USER scott IDENTIFIED BY "abcdefghijkl" REPLACE "tiger";
User altered.
Всем пользователям присваивается профиль с ограниченным сроком действия пароля. Если пароль не меняется, то дается ограниченный период, в течение которого будут выдаваться предупредительные сообщения. Если пароль не меняется в течение дополнительного периода, то логин будет заблокирован. Разблокировать пароль сможет только член группы ДБА командой
alter user account unlock;
Это средство также полезно, когда нужно заставить всех пользователей поменять их пароли.
Управление историей хранения паролей реализуется с помощью параметров password_reuse_max и password_reuse_time. Эти параметры не позволяют пользователю завести для себя два пароля и менять их поочередно. Бывают пользователи, которые, только что сменив пароль на какой-нибудь новый, тут же повторно меняют его на старый. Эти параметры запрещают пользователю вернуться к одному из старых паролей, пока не пройдет определенный период времени. Один из параметров определяет, сколько дней должно пройти прежде, чем пароль можно будет использовать повторно, а другой определяет сколько раз нужно сменить пароль, прежде, чем его можно будет использовать повторно. СУБД запоминает все введенные пароли (точнее, их хеши) и сравнивает их.
С точки зрения СУБД Oracle это взаимоисключающие параметры, т.е. когда одному присваивается какое-либо числовое значение, то второй должен принимать значение UNLIMITED. Оба параметра не могут принимать числовые значения, но могут принимать значения UNLIMITED. Установка обоих параметров в UNLIMITED разрешает немедленное повторное использование паролей.
Один из способов управления паролями заключается в редактировании и выполнении скрипта, предназначенного для настройки политики парольной защиты - $ORACLE_HOME/rdbms/utlpwdmg.sql. Этот скрипт имеет ряд предварительно установленных параметров, поэтому в большинстве случаев администратор может просто выполнить его.
Скрипт utlpwdmg.sql присваивает параметру password_reuse_time=1800, а password_reuse_max=UNLIMITED. Методологически целесообразнее присваивать значение параметру password_reuse_time, а не password_reuse_max, потому что настойчивый пользователь может обойти ограничение password_reuse_max, поменяв пароль password_reuse_max+1 раз.
История паролей хранится в таблице sys.user_history$.
SYS @ orcl >select * from user_history$;
USER# PASSWORD PASSWORD_DATE
---------- ------------------------------ ---------
79 8006C2C56E61DB9D 24-APR-06
66 8F4F9102D7864F47 23-MAY-06
66 87A9B0BB9A8B9FCD 06-JUN-06
5 8D2FA9B19EBC52C4 06-JUN-06
66 992FD456594C1A6E 06-JUN-06
66 11F1EC5B54F7D35B 06-JUN-06
66 BD8F1C27CA78D7D1 06-JUN-06
При создании БД автоматически создается профиль DEFAULT. Он содержит в числе прочих настроек еще и политику устаревания паролей.
Вот параметры до изменения
PROFILE | RESOURCE_NAME | RESOURCE_TYPE | LIMIT |
DEFAULT | FAILED_LOGIN_ATTEMPTS | PASSWORD | 10 |
DEFAULT | PASSWORD_LIFE_TIME | PASSWORD | UNLIMITED |
DEFAULT | PASSWORD_REUSE_TIME | PASSWORD | UNLIMITED |
DEFAULT | PASSWORD_REUSE_MAX | PASSWORD | UNLIMITED |
DEFAULT | PASSWORD_LOCK_TIME | PASSWORD | UNLIMITED |
DEFAULT | PASSWORD_GRACE_TIME | PASSWORD | UNLIMITED |
DEFAULT | PASSWORD_VERIFY_FUNCTION | PASSWORD | NULL |
Название RESOURCE_NAME | Смысл RESOURCE_NAME |
FAILED_LOGIN_ATTEMPTS | Допустимое количество неуспешных попыток регистрации до блокировки учетной записи |
PASSWORD_LIFE_TIME | Время жизни пароля |
PASSWORD_REUSE_TIME | Число дней, в течение которых пароль нельзя использовать повторно. |
PASSWORD_REUSE_MAX | Необходимое число изменений пароля, прежде чем им можно будет воспользоваться повторно. |
PASSWORD_VERIFY_FUNCTION | Скрипт проверки стойкости пароля. Допускается создавать собственные функции проверки пароля. |
PASSWORD_LOCK_TIME | Длительность блокировки в днях. Сколько времени будет заблокирована учетная запись после блокировки |
PASSWORD_GRACE_TIME | Продолжительность дополнительного периода в днях. В течение этого времени разрешается подключение к БД, но выводится предупреждение о смене пароля. |
PROFILE | RESOURCE_NAME | RESOURCE_TYPE | LIMIT |
DEFAULT | FAILED_LOGIN_ATTEMPTS | PASSWORD | 3 |
DEFAULT | PASSWORD_LIFE_TIME | PASSWORD | 60 |
DEFAULT | PASSWORD_REUSE_TIME | PASSWORD | 1800 |
DEFAULT | PASSWORD_REUSE_MAX | PASSWORD | UNLIMITED |
DEFAULT | PASSWORD_LOCK_TIME | PASSWORD | .0006 |
DEFAULT | PASSWORD_GRACE_TIME | PASSWORD | 10 |
DEFAULT | PASSWORD_VERIFY_FUNCTION | PASSWORD | VERIFY_FUNCTION |
После применения скрипта utlpwdmg.sql поведение базы данных изменится. При вводе нового/изменении старого пароля СУБД будет выполнять следующие проверки:
- Проверка, что пароль такой же, как логин
- Проверка, что пароль длиннее 4-х знаков
- Проверка, что пароль не 'welcome', 'database', 'account', 'user', 'password', 'oracle', 'computer', 'abcd'
- Проверка того, что пароль содержит не менее 1 буквы & 1 цифру & один знак пунктуации.
- Проверка, что пароль отличается от предыдущего пароля не менее чем в 3-х знаках в соответствующих позициях.
Администратор может самостоятельно изменить параметры профиля примерно так:
SQL >ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION null;
Profile altered.
Полный синтаксис этой команды:
ALTER PROFILE DEFAULT LIMIT
FAILED_LOGIN_ATTEMPTS 3
PASSWORD_LIFE_TIME 60
PASSWORD_REUSE_TIME 1800
PASSWORD_REUSE_MAX UNLIMITED
PASSWORD_LOCK_TIME 1/1440
PASSWORD_GRACE_TIME 10
PASSWORD_VERIFY_FUNCTION verify_function;
Руководствуясь параметром failed_login_attempts, сервер автоматически блокирует учетную запись после заданного числа неуспешных попыток регистрации в системе.
Поскольку эта особенность может быть использована злоумышленником для блокировки работающих учетных записей, то средства блокировки можно настроить так, чтобы учетная запись разблокировалась автоматически через время password_lock_time (в днях). Если password_lock_time устанавливается в UNLIMITED, то автоматической разблокировки не происходит. Разблокировать учетную запись может только член группы ДБА.
Параметр password_lock_time=0.0006 указывается в сутках, величина 1/1440 означает задержку в 51,84 секунды.
Если попытки подключения прекратились, не достигнув значения failed_login_attempts, то по истечении времени password_lock_time счетчик блокировки будет сброшен в 0.
Для отмены политики управления паролями можно несколько раз выполнить команду
Alter profile default limit, установив изменяемый параметр в unlimited, чтобы сбросить настроенные параметры к их значению по умолчанию:
alter profile default limit
FAILED_LOGIN_ATTEMPTS unlimited
PASSWORD_LIFE_TIME unlimited
PASSWORD_REUSE_TIME unlimited
PASSWORD_REUSE_MAX unlimited
PASSWORD_LOCK_TIME unlimited
PASSWORD_GRACE_TIME unlimited
PASSWORD_VERIFY_FUNCTION null;
1.обратно | Joshua Wright, Carlos Cid (18. Oct. 2005) An Assessment of the Oracle Password Hashing Algorithm |
2.обратно | Брюс Шнайер, Прикладная криптография, Издательство «Триумф» 2003 г. |
3.обратно | R. Morris, K. Thompson "Password security: A case history", Communications of ACM, v.22, n. 11, Nov. 1979., pp. 594-597. |
4.обратно | Л. Дж. Хоффман "Современные методы защиты информации"(М.: Сов. радио, 1980). |
5.обратно | Марлен Терьо, Аарон Ньюмен «Oracle. Руководство по безопасности», Издательство Лори, 2004 г. |
6.обратно | Bob Baldwin. (1993, July 9). "Oracle Password Encryption Algorithm?", Usenet Newsgroup comp.databases.oracle |
7.обратно | Журналы «Конфидент» № 6/97, 3/98. |
1(обратно к тексту) | Системы защиты обычно имеют недружественный характер, поэтому здесь следует соблюдать компромисс между строгостью системы и удобством пользователей. Если например, повысить минимальную длину пароля до 20 знаков, следует ожидать, то мониторы пользователей будут увешаны списками паролей, а техподдержка будет перегружена звонками типа "не могу войти в …". В результате, в серьезной и строгой системе информационной безопасности самым слабым звеном окажется человеческий фактор. |