Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Кудравцев Создание баз данных 2010

.pdf
Скачиваний:
83
Добавлен:
16.08.2013
Размер:
2.65 Mб
Скачать

данных. Права, указанные в таблице user, относятся ко всем базам данных сервера и перекрывают права из таблицы db. Поэтому если в таблице user поле Select_priv равно Y, то значение поля Select_priv из таблицы db не имеет значения. Если же в таблице user поле Select_priv равно N, то производится дальнейшая проверка прав доступа в таблицах db, host и т.д.

Считается целесообразным создание в таблице user записей для пользователей, в которых не даны никакие права, т.е. пользователь может лишь подключиться к серверу. Все остальные права регули-

руются через таблицы db, host, tables_priv, columns_priv.

Пустое поле Host в таблице db заставляет MySQL найти запись, соответствующую имени узла пользователя, в таблице host, структура которой представлена в табл. 4.4.

 

 

 

Таблица 4.4

 

Структура таблицы host

 

 

 

 

 

 

 

Field

 

Type

 

Default

Host

 

char(60)

 

 

Db

 

char(32)

 

 

Select_priv

 

enum('N','Y')

 

N

Insert_priv

 

enum('N','Y')

 

N

Update_priv

 

enum('N','Y')

 

N

---

 

---

 

---

Alter_priv

 

enum('N','Y')

 

N

Если соответствие не найдено, то MySQL отказывает в доступе. Если найдено, то права определяются как пересечение прав из таб-

лиц db и host.

Общее право доступа может быть записано так:

 

P

P

P

P

,

 

 

user

db

host

 

где P

, P , P

— права доступа (например, Select_priv) из таб-

user

db host

 

 

 

 

лиц user, db и host соответственно.

Таблицы tables_priv и columns_priv позволяют более тонко настроить права доступа на уровне отдельных таблиц и полей. Структура таблицы tables_priv представлена в табл. 4.5.

101

Таблица 4.5

 

Структура таблицы tables_priv

 

 

Field

Type

Host

char(60)

Db

char(60)

User

char(16)

Table_name

char(60)

Grantor

char(77)

Timestamp

timestamp(14)

Table_priv

set(‗Select‘, ‗Insert‘, ‗Update‘, ‗Delete‘, ‗Create‘,

 

‗Drop‘, ‗Grant‘, ‗References‘, ‗Index‘, ‗Alter‘)

Column_priv

set(‗Select‘, ‗Insert‘, ‗Update‘, ‗References‘)

Поля Host, Db и User имеют тот же смысл, что и в таблицах user, db, host. Назначение полей Table_name, Grantor и Timestamp понят-

но из их названия. Поля Table_priv и Column_priv имеют тип set (набор) и могут содержать любое количество предварительно заданных значений. В данном случае список значений представляет набор символьных строк определяющих право на выборку (Select), вставку (Insert) и т.д. В одном наборе может быть до 64 элементов и длина поля колеблется от 1 до 8 байт.

Таблица columns_priv имеет структуру, похожую на tables_priv (табл. 4.6).

Таким образом, контроль доступа можно представить в виде нескольких этапов:

1. Подключение к серверу MySQL.

При подключении проверяется соответствующая запись в таблице user. Если такая запись найдена и поле пароля непустое, то производится проверка введенного пользователем пароля. При неверно заданном пароле подключение не производится.

2. Проверка SQL запроса.

Сделанные запросы сопоставляются с правами пользователя пославшего запрос. Поиск соответствующих прав выполняется в следующих таблицах в указанном порядке:

db (host);

tables_priv;

columns_priv.

102

Таблица 4.6

 

Структура таблицы columns_priv

 

 

Field

Type

Host

char(60)

Db

char(60)

User

char(16)

Table_name

char(60)

Column_name

char(59)

Timestamp

timestamp(14)

Column_priv

set(‗Select‘, ‗Insert‘, ‗Update‘, ‗References‘)

При первом найденном соответствии поиск прекращается и запрос немедленно выполняется. Так, например, если у пользователя отсутствует право Insert_priv для заданной базы данных (т.е. в таблице db значение поля Insert_priv равно N), то MySQL продолжит поиск прав доступа в tables_priv и, возможно, даже в columns_priv.

Все вышесказанное позволяет строить очень гибкую систему безопасности, предоставляя пользователям права в зависимости от их статуса.

СУБД PostgreSQL

История объектно-реляционной СУБД PostgreSQL [6] начинается с 1977 г., с разработки в Калифорнийском университете Беркли базы данных Ingres. В 1996-м был открыт исходный код PostgreSQL для программистов, и началось ее развитие под девизом Open Source. Дистрибутив СУБД PostgreSQL можно абсолютно бесплатно скачать с сайта www.postgresql.org. Проект разрабатывался применительно к операционной системе Unix, тем не менее в настоящее время имеются дистрибутивы и для ОС MS Windows. В дальнейшем будут рассматриваться примеры применительно к ОС

Unix.

103

Запуск и работа с PostgreSQL

Работа с СУБД PostgreSQL мало чем отличается от работы с СУБД MySQL. Прежде чем запустить сервер PostgreSQL необходимо выполнить ряд шагов:

1.Создать пользователя с именем postgres, useradd postgres

2.Создать каталог расположения базы данных, mkdir /usr/local/pgsql/data

3.Назначить пользователя postgres владельцем данного каталога chown postrges /usr/local/pgsql/data

4.Зарегистрироваться как пользователь postrges

su – postgres

5. Инициализировать базу данных с помощью утилиты initdb /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data

где в качестве параметра -D указывается каталог расположения базы данных.

Для запуска сервера необходимо от имени пользователя postrges выполнить команду

/usr/local/mysql/bin/postmaster –D /usr/local/pgsql/data &

Сервер postmaster запускается в фоновом режиме, о чем свидетельствует знак амперсанда «&». Кроме того, для управления серверным процессом имеется утилита pg_ctl, позволяющая запускать, останавливать и просматривать состояние процесса.

Клиентское приложение устанавливает соединение с сервером базы данных (виртуальный канал) по протоколу TCP/IP (порт 5432). Существует большое количество разнообразных клиентов, в том числе графических. В стандартный комплект входит простейший клиент, работающий в режиме командной строки. Для его запуска надо ввести команду

/usr/local/mysql/bin/psql.exe -h 192.168.0.1 -U postgres -d template1

здесь

-h 192.168.0.1 – IP-адрес сервера базы данных; -U postgres – имя пользователя;

104

-d template1 — имя базы данных (сразу после установки имеется только одна база данных — template1).

Регистрация нового пользователя, назначение пароля и прав доступа к конкретной базе данных будут рассмотрены ниже, в разделе, посвященном системе безопасности PostgreSQL.

При успешном установлении соединения, клиент psql будет готов получать команды от пользователя и выдавать результаты обработки запросов. Пример работы клиента, после установления соединения представлен на рис. 4.2

Рис. 4.2. Пример работы клиента psql

Структура хранения данных в PostgreSQL

СУБД PostgreSQL содержит очень большое количество служебных системных таблиц [6], в которых хранится самая разнообразная информация о базах данных, таблицах, полях таблиц, индексах, представлениях и других объектах. Каждый объект имеет уникаль-

ный идентификатор Object IDentifier (OID).

Для хранения всех баз данных отводится специальный каталог

/usr/local/psql/data/base

Для каждой базы данных в указанном каталоге создается свой подкаталог, причем его имя является некоторым числом, например 17458. Это число идентификатор объекта – OID, назначенный Post-

105

greSQL для созданной базы данных. Соответствие между OID и символьным именем базы данных хранится в системной таблице pg_database. Если выполнить SQL-запрос

SELECT datname, oid FROM pg_database;

то будет выдана информация об именах баз данных и их OID.

В этот подкаталог (в указанном примере — 17458) копируются системные таблицы (а также помещаются таблицы, созданные пользователем при проектировании базы данных), причем имена файлов также являются числами, соответствующими идентификаторам объектов (OID). Соответствие между логическими именами и OID находится в системной таблице pg_class.

Если выполнить SQL-запрос

SELECT relfilenode, relname FROM pg_class;

то будет выдана информация о логических именах таблиц и именах файлов (OID), в которых хранятся данные из этих таблиц.

Система безопасности PostgreSQL

Механизм аутентификации пользователей сервера PostgreSQL регулируется с помощью простого текстового конфигурационного файла pg_hba.conf, который находится в каталоге

/usr/local/psql/data/

Каждая строка этого файла является записью и определяет права доступа к той или иной базе данных. Записи могут быть следующего формата:

local DATABASE USER METHOD [OPTION]

host DATABASE USER CIDR-ADDRESS METHOD [OPTION] hostssl DATABASE USER CIDR-ADDRESS METHOD [OPTION] hostnossl DATABASE USER CIDR-ADDRESS METHOD

[OPTION]

Первое поле {local, host, hostssl, hostnossl} определяет, с помо-

щью какого метода (протокола) разрешается подключаться к базе данных.

Второе поле DATABASE задает имя базы данных. Кроме того, вместо конкретного имени можно указать слова ―all‖, ―sameuser‖,

106

―samegroup‖ или имя текстового файла с префиксом ―@‖ (например, @filedb), в котором содержатся имена баз данных.

Второе поле USER задает имя пользователя, которому разрешается подключаться к указанной базе данных. Кроме того, вместо конкретного имени можно указать слова ―all‖, а также имя группы перед которой ставится знак ―+‖. Как и для поля DATABASE, разрешается указывать имя текстового файла с префиксом ―@‖ (например, @userdb), в котором содержатся имена пользователей. Допускается указывать список (элементы которого разделяются запятыми), состоящий из имен пользователей, имен групп (с префиксом ―+‖), имен файлов (с префиксом ―@‖).

Третье поле CIDR-ADDRESS определяет диапазон IP-адресов (указывается IP-адрес и маска), с которых разрешается подключаться к базе данных.

Четвертое поле METHOD определяет способ проверки подлинности пользователя и может принимать значения trust, reject, md5, crypt, password, krb4, krb5, ident, pam. Как видно, данные ключевые слова обозначают способ шифрования пароля, безоговорочное доверие (trust) или недоверие (reject) пользователю.

Например, в самом простейшем случае запись host all all 127.0.0.1/32 md5

означает, что всем пользователям, для подключения к любой базе данных с локального хоста (т.е. с того же хоста, на котором запущен сервер PostgreSQL) требуется указать пароль, зашифрованный методом md5.

Имена пользователей и групп хранятся в специальных системных таблицах pg_shadow (pg_user) и pg_group. Для добавления информации в эти таблицы используются SQL (DDL) команды

CREATE USER username

WITH PASSWORD ‗password‘ IN GROUP group;

CREATE GROUP group

WITH USER username;

Например, зарегистрируем пользователей peter и demetr:

CREATE USER peter WITH PASSWORD ‗qwerty‘; CREATE USER demetr WITH PASSWORD ‗asdfgh‘;

107

а затем создадим группу admins и поместим туда пользователей peter и demetr

CREATE GROUP group

WITH USER peter, demetr;

Более подробная информация по командам создания пользователей имеется в [6], а также в online документации PostgreSQL.

Программный интерфейс для работы с сервером БД

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

1)осуществить соединение с БД;

2)выбрать заданную БД;

3)послать SQL-запрос;

4)получить строку ответа;

5)выбрать требуемую информацию;

6)закрыть соединение.

API для MySQL

Ниже приведен пример простейшей программы, выполняющей указанные действия с СУБД MySQL [5] (жирным шрифтом выделены наиболее значимые строки):

#include <sys/time.h> #include <stdio.h>

#include <mysql.h>

int main (char**args)

 

{

 

MYSQL_RES

*result ;

MYSQL_ROW

row;

MYSQL

*connection, mysql ;

// Инициализация структуры MYSQL

108

mysql_init(mysql) ;

// Установка соединения (ноль при неудачном соединении) connection=mysql_real_connect(&mysql,

“beta.myhost.ru” /*host*/,

―user1‖ /*user*/, ―mypass‖ /*password*/,

―db_test‖ /*database*/, 0 /*port*/,

―‖ /*Unix socket*/, 0 /*flags*/) ;

// Выполнение запроса на выборку mysql_query(connection, ―SELECT id, val FROM table1‖);

//Чтение всего результата запроса и сохранение в структуре result result=mysql_store_result(connection);

//Выборка записей из набора в массив символьных строк row while (( row=mysql_fetch_row(result) != NULL)

{

printf(―id: %s, значение: %s\n‖,

(row[0] ? row[0] : ―NULL‖), (row[1] ? row[1] : ―NULL‖)

);

}

//Освобождение ресурсов, закрытие соединеня

mysql_free_result(result) ; mysql_close(connection);

}

Как видно, структура данной программы очень проста и основана на использовании специальных функций, описанных в заголовочном файле mysql.h. В примере, для упрощения, не производится проверка результатов выполнения запросов к серверу базы данных. В реальных приложениях данная проверка обязательна, так как, например, при неудачной установке соединения (в этом случае функция возвращает ноль) все последующие действия теряют смысл.

109

API для PostgreSQL

Для PostgreSQL используются очень похожие функции [6]. Ниже приведена программа, которая просто устанавливает соединение с сервером PostgreSQL и при удачном результате распечатывает параметры соединения: имя пользователя, хост, порт и т.д. Параметры соединения задаются в текстовой строке conninfo в виде пар значений: dbname=db_test, user=peter и т.д. Работа программы основана на использовании библиотеки libpq-fe.

#include <stdlib.h>

#include <libpq-fe.h>

int main(int argc, char** argv)

{

//строка conninfo состоит из разделенных пробелами параметров

//вида <par>=<val>

//Параметры: dbname, user, password, host, hostaddr (IP), port

char *conninfo="dbname=db_test" ;

PGconn *myconnection=PQconnectdb(conninfo);

if ( PQstatus(myconnection) == CONNECTION_OK )

{

printf ("Connection made: DB=%s User=%s Pass=%s Host=%s Port=%s Options=%s \n",

PQdb(myconnection), PQuser(myconnection), PQpass(myconnection), PQhost(myconnection), PQport(myconnection), PQoptions(myconnection) ) ;

}

else

{

printf ("Connection failed: %s",QerrorMessage(myconnection));

}

PQfinish(myconnection); // освобождение ресурсов return EXIT_SUCCESS;

}

110