Лабораторная работа №2 Администрирование СУБД Oracle. Часть II Введение. Данная лабораторная работа посвящена изучению механизмов ограничения системных ресурсов и усиления надежности аутентификации пользователей в СУБД Oracle. В СУБД Oracle администратор средствами команды create (alter) profile может задавать ограничения на использование системных ресурсов (и ограничения, связанные с использованием паролей пользователей). Создав профиль, администратор присваивает его определённому пользователю командой ALTER USER. Например, создавая профиль с именем profile_name по команде: CREATE PROFILE profile_name LIMIT SESSION_PER_USER 5 CPU_PER_CALL 2000 CONNECT_TIME 120; мы ограничим пользователя 5 одновременными сессиями, 2000 сотых долей секунды на выполнение транзакции в базе данных, соединением с базой в течение сессии не более 120 минут. Другими контролируемыми сервером ресурсами пользователя являются: COMPOSITE_LIMIT – ограничение по цене на совокупность используемых в сессии ресурсов. Цена вычисляется сервером по определенной формуле; CPU_PER_SESSION – время CPU на сессию, выраженное в сотых долях секунды; LOGICAL_READS_PER_SESSION – число блоков, которое может быть считано из оперативной памяти и диска за время сессии; LOGICAL_READS_PER_CALL – число блоков, которое может быть считано во время одного вызова для обработки SQL-предложения (в фазе parse, execute или fetch); IDLE_TIME – допустимое время простоя, выраженное в минутах; PRIVATE_SGA – при использовании сервера MTS ограничивает размер личной памяти для сессии в SGA. В СУБД Oracle существует возможность задания ограничения на использование пароля пользователя при помощи команды create (alter) profile. Создав профиль, администратор присваивает его определённому пользователю командой ALTER USER.Например, создавая профиль по команде: CREATE PROFILE profile LIMIT FAILED_LOGIN_ATTEMPS 3 PASSWORD_LOCK_TIME 4/12; мы заблокируем доступ пользователя к базе данных на 8 часов, если он с 3 раз не введет правильный пароль. Другие параметры на использование пароля пользователя: PASSWORD_LIFE_TIME – число дней использования пароля; PASSWORD_REUSE_TIME – число дней, после которых пароль можно снова устанавливать для использования; PASSWORD_REUSE_MAX – число произведенных замен пароля, прежде чем данный пароль можно снова установить для использования; PASSWORD_VERIFY_FUNCTION – проверки сложности пароля может производиться указанным PL/SQL скриптом; PASSWORD_GRACE_TIME – число дней, после которых начинает появляться предупреждение о том, что истекает срок действия пароля. В данной лабораторной работе студенты должны проверить возможность ограничения количества одновременно открытых сесссий, возможность ограничения суммарного времени одного сеанса, возможность ограничения времени CPU для одного сеанса, возможность ограничения числа неудачных попыток соединения с базой данных, возможность написания собственной функции проверки сложности пароля. По результатам работы студенты должны обосновать необходимость данных функциональных ограничений в СУБД Oracle, привести примеры ситуаций в которых данные ограничения необходимы. Задание №1. Настройка SQL*Plus. Необходимо включить режим ECHO и вывести протокол лаб. работы в файл <Фамилия студента>.txt. Этот файл является отчетом о проделанной лаб. работе. Пример: Следующий пример включает режим ECHO и ведет файл протокола spool.txt SQL> set echo on SQL> spool c:\ivanov.txt Задание №2. Установить соединение с базой данных под пользователем system/manager. Создать пользователя базы данных с именем user<Номер студента>, паролем user<Номер студента>, назначить ему табличное пространство SYSTEM и задать ему неограниченное место в этом табличном пространстве. Пример: SQL> connect system/manager@lab SQL> create user user1 identified by user1 default tablespace system quota unlimited on system; SQL> grant CONNECT to user1; Задание №3. Активировать использование ограничения системных ресурсов. Пример: SQL> alter system set resource_limit=TRUE; Задание №4. Создать профиль пользователя с именем profile_<фамилия>_4, позволяющий пользователю открыть одновременно не более одной сессии. Назначить пользователю user<Номер студента> этот профиль. Пример: SQL> create profile profile_ivanov_4 limit sessions_per_user 1; SQL> alter user user1 profile profile_ivanov_4; Задание №5. Установить 2 соединения с базой данных под пользователем user<Номер студента>, сделать выводы. Задание №6. Создать профиль пользователя с именем profile_<фамилия>_6, ограничивающий суммарное время одного сеанса до 1 минуты. Назначить пользователю user<Номер студента> этот профиль. Пример: SQL> create profile profile_ivanov_6 limit CONNECT_TIME 1; SQL> alter user user1 profile profile_ivanov_6; Задание №7. Установить соединение с базой данных под пользователем user<Номер студента>, не прерывать соединение более одной минуты. Затем выполнить любой SQL запрос. Сделать выводы. Задание №8. Создать профиль пользователя с именем profile_<фамилия>_8, ограничивающий время CPU для одного сеанса до 1 сотой доли секунды. Назначить пользователю user<Номер студента> этот профиль. Пример: SQL> create profile profile_ivanov_8 limit CPU_PER_SESSION 1; SQL> alter user user1 profile profile_ivanov_8; Задание №9. Установить соединение с базой данных под пользователем user<Номер студента>, выполнить ряд запросов к словарю данных (select * from user_users и т.д.). Сделать выводы. Задание №10. Создать профиль пользователя с именем profile_<фамилия>_10, ограничивающий число неудачных попыток соединения с базой данных до 3. Назначить пользователю user<Номер студента> этот профиль. Пример: SQL> CREATE PROFILE profile_ivanov_10 LIMIT FAILED_LOGIN_ATTEMPTS 3; SQL> alter user user1 profile profile_ivanov_10; Задание №10. Осуществить 3 неудачных попытки соединения с базой данных под пользователем user<Номер студента> (указать неверный пароль). Выполнить соединение при верном login/password. Сделать выводы. Разблокировать пользователя (alter user user1 account unlock). Задание №11. (optional) Написать функцию проверки сложности пароля. Пример: SQL> CREATE OR REPLACE FUNCTION test_verify_function (username varchar2, password varchar2, old_password varchar2) RETURN boolean IS n boolean; m integer; differ integer; isdigit boolean; ischar boolean; ispunct boolean; digitarray varchar2(20); punctarray varchar2(25); chararray varchar2(52); BEGIN digitarray:= '0123456789'; chararray:= 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; punctarray:='!"#$%&()``*+,-/:;<=>?_'; --Check if the password is same as the username IF password = username THEN raise_application_error(-20001, 'Password same as user'); END IF; --Check for the minimum length of the password IF length(password) < 4 THEN raise_application_error(-20002, 'Password length less than 4'); END IF; --Check if the password is too simple. A dictionary of words may be --maintained and a check may be made so as not to allow the words --that are too simple for the password. IF NLS_LOWER(password) IN ('welcome', 'database', 'account', 'user', 'password', 'oracle', 'computer', 'abcd') THEN raise_application_error(-20002, 'Password too simple'); END IF; --Check if the password contains at least one letter, one digit and one --punctuation mark. --1. Check for the digit --You may delete 1. and replace with 2. or 3. isdigit:=FALSE; m := length(password); FOR i IN 1..10 LOOP FOR j IN 1..m LOOP IF substr(password,j,1) = substr(digitarray,i,1) THEN isdigit:=TRUE; GOTO findchar; END IF; END LOOP; END LOOP; IF isdigit = FALSE THEN raise_application_error(-20003, 'Password should contain at least one digit, one character and one punctuation'); END IF; --2. Check for the character <<findchar>> ischar:=FALSE; FOR i IN 1..length(chararray) LOOP FOR j IN 1..m LOOP IF substr(password,j,1) = substr(chararray,i,1) THEN ischar:=TRUE; GOTO findpunct; END IF; END LOOP; END LOOP; IF ischar = FALSE THEN raise_application_error(-20003, 'Password should contain at least one digit, one character and one punctuation'); END IF; --3. Check for the punctuation <<findpunct>> ispunct:=FALSE; FOR i IN 1..length(punctarray) LOOP FOR j IN 1..m LOOP IF substr(password,j,1) = substr(punctarray,i,1) THEN ispunct:=TRUE; GOTO endsearch; END IF; END LOOP; END LOOP; IF ispunct = FALSE THEN raise_application_error(-20003, 'Password should contain at least one \ digit, one character and one punctuation'); END IF; <<endsearch>> --Check if the password differs from the previous password by at least 3 letters IF old_password = '' THEN raise_application_error(-20004, 'Old password is null'); END IF; --Everything is fine; return TRUE ; differ := length(old_password) - length(password); IF abs(differ) < 3 THEN IF length(password) < length(old_password) THEN m := length(password); ELSE m:= length(old_password); END IF; differ := abs(differ); FOR i IN 1..m LOOP IF substr(password,i,1) != substr(old_password,i,1) THEN differ := differ + 1; END IF; END LOOP; IF differ < 3 THEN raise_application_error(-20004, 'Password should differ by at \ least 3 characters'); END IF; END IF; --Everything is fine; return TRUE ; RETURN(TRUE); END; / Задание №12. (optional) Создать профиль пользователя с именем profile_<фамилия>_12, позволяющий проверять сложность введенного пароля. Назначить пользователю user<Номер студента> этот профиль. SQL> CREATE PROFILE profile_ivanov_12 LIMIT PASSWORD_VERIFY_FUNCTION test_verify_function; SQL> alter user user1 profile profile_ivanov_12; Задание №13. (optional) Осуществить попытки смены пароля для пользователя user<Номер студента>. (пароль меньше 3 символов, пароль совпадает с именем и т.д.). Сделать выводы. Задание №14. Удалить каскадно пользователя user<Номер студента>. Удалить профили profile_<фамилия>_4, profile_<фамилия>_6, profile_<фамилия>_8, profile_<фамилия>_10, profile_<фамилия>_12. Завершить протокол лаб. работы (команда spool off) и показать результаты преподавателю.