Управление доступом к данным в PosgreSQL

Материал из Tech_support
Перейти к навигации Перейти к поиску

Условные обозначения, используемые при описания синтаксиса команд:

ТЕКСТ ПРОПИСНЫМИ БУКВАМИ - зарезервированные слова.

Тексткурсивом и строчными буквами - элементы, определяемые пользователем.

[текст в квадратных скобках] - необязательный элемент.

{текст в фигурных скобках} - элемент повторяющийся неопределенное количество раз, включая нулевое.

| - это разделитель «или» для выбора одного из нескольких элементов.


Введение

Управление доступом к данным в сервере PostgreSQL осуществляется с помощью нескольких механизмов. Таких как: Конфигурационные файлы: postgresql.conf и pghba.conf.

С помощью этих файлов настраивается подключение к серверу Postgres.

Управление пользователями и группами - регистрация пользователей и групп, определения права суперпользователя, права создания баз данных, права создания ролей, права наследования родительских прав для пользователей или групп.

Определение прав доступа к объектам баз данных для пользователей или групп с помощью SQL команд GRANT и REVOKE.


Конфигурационный файл pghba.conf

В конфигурационном файле сервера pghba.conf устанавливается доступ на уровне хоста. Этим файлом определяются все возможные подключения к серверу. А именно, какие пользователи, с каких компьютеров и к каким базам имеют доступ. Так же определяется каким образом осуществляется обмен данными для каждого подключения: используются ли пароли, используется ли шифрование данных.

Синтаксис файла pghba.config должен удовлетворять ряду правил. В каждой строке файла находится одна хостовая запись. Перенос записи на другую строку не разрешается. Каждая запись состоит из нескольких полей, разделенных пробелами или знаками табуляции. Количество полей определяется типом хостовой записи и способом задания адреса. Тип хостовой записи определяется первым ключевым словом и может быть 4 видов. Коментарии должны начинаться с символа #.

Формат строки файла pg_hba:

local database user auth-method [auth-option]
host database user CIDR-address auth-method [auth-option]
hostssl database user CIDR-address auth-method [auth-option]
hostnossl database user CIDR-address auth-method [auth-option]
host database user IP-address IP-mask auth-method [auth-option]
hostssl database user IP-address IP-mask auth-method [auth-option]
hostnossl database user IP-address IP-mask auth-method [auth-option]


1. Первое ключевое слово определяет тип подключения и соответственно тип хостовой записи:

local - для клиентских подключений с того же компьютера, на котором работает сервер

host - сетевое подключение

hostssl - для подключений локальных или удаленных хостов к серверу, с использованием ssl протокола, обеспечивающим шифрование всех взаимодействий с сервером.

Протокол ssl должен поддерживаться как клиентом, так и сервером.

2. Второй параметр database обозначает базы данных, к которым можно подключаться:

all - для разрешения подключения ко всем базам данных.

sameuser - для разрешения подключения только к базе данных имя которой совпадает с именем пользователя.

Имя базы данных или список баз данных, разделенный запятыми - для разрешения подключения к конкретной базе данных.

user - имена пользователей или групп, которым разрешается подключение с этого компьютера:

all - все пользователи

имя пользователя - имя конкретного пользователя +имя группы - имя группы

список пользователей и групп, разделенный запятыми

3. CIDR-address или IP адрес и IP маска - адрес хоста.

4. Тип аутентификации:

  • trust
  • reject
  • md5
  • crypt
  • password
  • krb5
  • ident
  • idap
  • pam

6. Опции, в зависимости от типа аутентификации.

Подробнее можно почитать в самом файле pg_hba или в документации к postgres [1] в разделе Server administration - Client authentication Пример:

host all «postgres» 127.0.0.1/32 md5

Данная запись разрешает подключение пользователю postgres ко всем базам данных, причем пользователь postgres может подключаться только с локального адреса (127.0.0.1). Метод md5 означает, что обязательно использование пароля при установлении подключения. Тоже самое можно было бы задать и с помощью такой строки в pg_hba.config: local all «postgres» md5


Регистрация пользователя на сервере

Подключиться к серверу может только пользователь, имеющий учетную запись на сервере. Учетная запись на сервере создается в результате создания пользователя. В процессе аутентификации сервер postgres проверяет был ли зарегистрирован пользователь на сервере и правильно ли введен пароль. Для регистрации пользователя используется команда CREATE USER [1]. Синтаксис команды

CREATE USER: CREATE USER name [[WITH] option [...]]

где option может быть:

SUPERUSER
| NOSUPERUSER
| CREATEDB
| NOCREATEDB
| CREATEROLE
| NOCREATEROLE
| CREATEUSER
| NOCREATEUSER
| INHERIT
| NOINHERIT
| LOGIN
| NOLOGIN
| CONNECTION LIMIT connlimit  [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'
| VALID UNTIL 'timestamp'
| IN ROLE rolename [, ...]
| IN GROUP rolename [, ...]
| ROLE rolename [, ...]
| ADMIN rolename [, ...]
| USER rolename [, ...]
| SYSID uid

Так же пользователь может быть создан с использованием сценария createuser [2]. Для этого нужно в командной строке запустить файл createuser.exe. Этот файл находится в директории Program

FilesPostgreSQL8.2bin. Команда createuser выполняется с аргументами. Если аргументы не заданы первоначально, то они будут запрошены самой командой в процессе выполнения.

Пользователи и группы существуют как глобальные объекты баз данных, а это значит, что они не связаны с какой-то конкретной базой данных [2].

Учетные записи пользователей определяют кому разрешено выполнение определенных действий в системе (а так же каких именно действий).

Группы существуют как вспомогательное средство, упрощающее представление этих прав.

Каждому пользователю postgres создается внутренний системный идентификатор sysid и пароль. Пароль не всегда обязателен - это настраивается в конфигурационном файле pg_hba.conf. Системный идентификатор связывает объекты базы данных с владельцем.

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

Суперпользователь - это пользователь, обладающий всеми правами во всех базах данных, включая право создания других пользователей. Глобальные права могут быть в любой момент изменены текущим суперпользователем.

В Postgres по умолчанию создается один суперпользователь postgres. Все остальные пользователи создаются этим пользователем или другими пользователями, созданными позже.

Вся информация о пользователях, включая пароли, находится в системной таблице pg_shadow. Выборку из этой таблицы может делать только супер пользователь.

Для обычных пользователей информация об учетных записях (без паролей) хранится в таблице pg_user.

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

Группы (роли) упрощают процедуру назначения прав пользователям. Так как достаточно дать необходимые права группе, а затем просто добавлять в нее пользователей.

Не допускается совпадение имен пользователей и групп (ролей).

Группу может создать пользователь у которого есть права на создание ролей (CREATEROLE).

Пользователь не может создать группу или пользователя, обладающими большими правами, чем он сам.

Для создания группы используется команда CREATE ROLE. Синтаксис команды:

CREATE ROLE name [ [ WITH ] option [ ... ] ]

где option может быть:

SUPERUSER
| NOSUPERUSER
| CREATEDB
| NOCREATEDB
| CREATEROLE
| NOCREATEROLE
| CREATEUSER
| NOCREATEUSER
| INHERIT | NOINHERIT
| LOGIN | NOLOGIN
| CONNECTION LIMIT connlimit
| [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'
| VALID UNTIL 'timestamp'
| IN ROLE rolename [, ...]
| IN GROUP rolename [, ...]
| ROLE rolename [, ...]
| ADMIN rolename [, ...]
| USER rolename [, ...]
| SYSID uid

Для добавления пользователя в группу используется команда ALTER GROUP. Синтаксис команды:

ALTER GROUP groupname ADD USER username [, ... ]

Для удаления пользователя из группы:

ALTER GROUP groupname DROP USER username [, ... ]

Для переименования группы: ALTER GROUP groupname RENAME TO newname


Предоставление привилегий

Хотя к базе данных может подключиться любой пользователь, зарегистрированный на сервере, при наличии соответствующих настроек в pg_hba.conf, для получения доступа к объектам базы данных необходимо обладать специальными привилегиями к этим объектам.

В postgres учет привилегий ведется при помощи списков управления доступом (ACL - Access Control List).

Информация, хранящаяся в списках, указывает каким пользователям разрешена выборка, обновления и другие способы модификации какого-либо объекта базы данных.

Таким образом для каждого объекта существует набор привилегий и ограничений доступа.

По умолчанию пользователь не имеет доступа к объектам, если они ему не принадлежат и если он не является суперпользователем.

Команда для установки привилегий - GRANT.

Команда для установки ограничений - REVOKE.

Привилегии для объектов:

  • SELECT - выборка данных
  • INSERT - добавление, удаление данных
  • UPDATE - модификация объекта
  • DELETE - удаление объекта
  • REFERENCES - ссылка на таблицу
  • TRIGGER - создание триггеров
  • ALL - включает в себя все выше перечисленные
  • WITH GRANT OPTION - опция, позволяющая пользователю наделять других пользователей привилегиями к этому объекту, но не более тех, которыми он обладает сам.

Привилегии для объектов устанавливают или изменяют суперпользователи, владельцы объектов или пользователи, которым выданы привилегии к объекту с опцией WITH GRANT OPTION.

Команда GRANT имеет 2 базовых варианта:

  • привилегии на объекты базы данных (таблицы, представления, последовательности, базу данных, функции, процедурные языки, схему, tablespace).

-привилегии на членство в группе (роли) - в этом варианте команда перенаправляет привилегии роли тому пользователю или группе, которые указаны в команде. Наделение такой привилегией аналогично добавлению пользователя или группы в группу.

Синтаксис команды GRANT для таблиц и представлений:

GRANT { { SELECT | INSERT | UPDATE | DELETE | REFERENCES | TRIGGER } [,...] | ALL [ PRIVILEGES ] } ON [ TABLE ] tablename [, ...] TO { username | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]

Команда REVOKE предназначена для отзыва привилегий, выданных ранее.

Синтаксис команды REVOKE для таблиц и представлений:

REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | DELETE | REFERENCES | TRIGGER } [,...] | ALL [ PRIVILEGES ] } ON [ TABLE ] tablename [, ...] FROM { username | GROUP groupname | PUBLIC } [,...] [ CASCADE | RESTRICT ]

Отзыв привилегий для PUBLIC влияет только на группу PUBLIC. Привилегии, выданные персонально (с указанием конкретных имен пользователей или групп) в этом случае остаются.

Сводка прав ACL просматривается в psql с помощью команды z. Для того, чтобы посмотреть сводку прав по какому-то конкретному объекту нужно указать его имя после команды z. Например:

сервер: ps-345=> пользователь: z fio
сервер: Привилегии доступа для базы данных «ps-3 4 5» сервер: Схема | Имя | Тип | Привилегии доступа
сервер: Public | fio | таблица | сервер: (1 запись)

Всех пользователей и группы можно посмотреть с помощью команды du


Про владельцев объектов

Владельцем объектов может быть пользователь или группа.

У каждого объекта базы данных может быть владелец, отличный от владельца базы данных.

Владельца объекта можно изменить после создания объекта. Это может сделать либо владелец объекта, либо суперпользователь.

Если у базы данных - один владелец, а у некоторого объекта этой базы данных другой, то владельца на этом объекте может сменить, только владелец объекта или суперпользователь и не может - владелец базы данных.

Владелец может раздавать привилегии на свой объект и изменять его.


Установка и настройка PostgreSQL

Устанавливаем мета-пакет postgresql, который подтянет все зависимости.

sudo apt-get install postgresql

Теперь нам надо получить доступ к нашему серверу.

sudo su - postgres
/usr/bin/psql -d template1
template1=# alter user postgres with password 'postgres';

Первой строчкой мы представляемся системе как пользователь postgres. Это необходимо для того, чтобы попасть в консоль postgre, т.к. по-умолчанию туда пускает только такого пользователя. Второй строчкой мы входим в эту консоль. И затем уже в ней выполняем команду (alter user postgres with password ‘postgres’;), которая устанавливает пароль ‘postgres’ для пользователя ‘postgres’.

Теперь необходимо сделать так, чтобы нас пускало в postgres по паролю, а не так, как мы ранее сюда вошли. Для надо отредактировать файлик /etc/postgresql/8.3/main/pg_hba.conf

sudo vim /etc/postgresql/8.3/main/pg_hba.conf 

Там в конце пара изменений:

1. комментим строчку «local all postgres ident sameuser» 2. и строчку «local all all ident sameuser» заменяем на «local all all md5″. Т.е. мы указали сделали так, чтобы авторизация была по паролю (md5).

Получилось что-то типа такого:

# Database administrative login by UNIX sockets
#local   all         postgres                          ident sameuser

# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD 

# "local" is for Unix domain socket connections only
#local   all         all                               ident sameuser
local   all         all                               md5
# IPv4 local connections:
host    all         all         127.0.0.1/32          md5
# IPv6 local connections:
host    all         all         ::1/128               md5

Теперь необходимо перезагрузить сервер:

sudo /etc/init.d/postgresql-8.3 restart

Всё, теперь можно пользоваться. Для входа в консоль postgresql:

psql -U postgres
phppgadmin (веб-морда)

Для postgresql есть аналог phpmyadmin под названием phppgadmin. Устанавливаем его:

sudo apt-get install phppgadmin

Доступен он будет по адресу http://localhost/phppgadmin/

Но сразу он вас туда под пользователем ‘postgres’ с паролем ‘postgres’ (что мы настроили ранее) не пустит. Исправим это. Отредактируем конфиг phppgadmin’а:

sudo vim /etc/phppgadmin/config.inc.php 

Находим в нём переменную «$conf['extra_login_security']» и устанавливаем её значение в false.

$conf['extra_login_security'] = false;

Теперь должно пустить.

tags: db, PostgreSQL
posted in PostgreSQL by yas375