Lab_OR2

advertisement
Лабораторная работа №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) и показать результаты преподавателю.
Download