«Тонкий клиент или создаем PXE Boot из LTSP» и «Управление доступом к данным в PosgreSQL»: разница между страницами

Материал из support.qbpro.ru
(Различия между страницами)
imported>Vix
Нет описания правки
 
imported>Vix
(Новая страница: «'''Условные обозначения, используемые при описания синтаксиса команд:''' ТЕКСТ ПРОПИСНЫМ…»)
 
Строка 1: Строка 1:
'''ПОЭТАПНОЕ РУКОВОДСТВО ПО УСТАНОВКЕ И НАСТРОЙКЕ ТОНКОГО КЛИЕНТА НА ПЛАТФОРМЕ Linux Debian Squeeze '''
'''Условные обозначения, используемые при описания синтаксиса команд:'''


*И так, собрав в кучу все имеющееся руководство по настройке "тонкого" клиента и перебрав всевозможные
ТЕКСТ ПРОПИСНЫМИ БУКВАМИ - зарезервированные слова.
варианты и решения, рассмотрим задачу по созданию универсального образа или точнее платформы, на которой
можно создавать те или иные решения, с применением безопасных технологий.
*Применительно к ситуации, создадим "тонкого" клиента, с возможностью обслуживания разделов жесткого диска,
в частности с возможностью сохранения или восстановления образов партиций NTFS по сети.
*'''Далее по порядку''':
1. Устанавливаем необходимые пакеты:
apt-get install isc-dhcp-server tftpd-hpa ltsp-server nfs-common nfs-kernel-server


* рекомендуется после установки запустить программу aptitude и до установить требуемые пакеты, если есть такой запрос...
Тексткурсивом и строчными буквами - элементы, определяемые пользователем.
* при установке сервера tftpd-hpa он будет просить вас указать каталог где будет "платформа", согласитесь по умолчанию /srv/tftp или /opt/ltsp, все равно потом это будем менять..


2. '''Теперь настраиваем сервер DHCP''':
[текст в квадратных скобках] - необязательный элемент.
*предположим что наша сеть такая:
root@debvbox:~#cat /etc/network/interfaces


# The loopback network interface
{текст в фигурных скобках} - элемент повторяющийся неопределенное количество раз, включая нулевое.
auto lo
iface lo inet loopback
# The primary network interface
auto eth0
iface eth0 inet static
        address 10.10.5.1
        netmask 255.255.255.0
        network 10.10.5.0
        broadcast 10.10.5.255
        gateway 10.10.5.1
        dns-nameservers 10.10.5.1


*Исходя из этих данных настраиваем наш dhcp сервер:
| - это разделитель «или» для выбора одного из нескольких элементов.
root@debvbox:~# cat /etc/dhcp/dhcpd.conf


ddns-update-style none;
default-lease-time 259200;
max-lease-time 518400;
authoritative;
log-facility local7;
  #параметры настроек сети которые будет получать клиент..
shared-network debvbox {
    option nis-domain                  "debvbox";
    option domain-name                  "debvbox";
    option domain-name-servers          10.10.5.1;
   
    subnet 10.10.5.0 netmask 255.255.255.0 {
    #range 10.10.5.50 10.10.5.60;
    option routers                      10.10.5.1;
    option subnet-mask                  255.255.255.0;
    option broadcast-address            10.10.5.255;
    option time-offset                  -5;    # Eastern Standard Time
    }
########################MAC ADDDRESS ALL################# 
# здесь прописываем нашего будущего клиента, его мак адрес и.т.д.
    host vclient {
    option host-name "vclient";
    hardware ethernet 08:00:27:35:BA:D9;
    fixed-address 10.10.5.65;
# этот параметр говорит какой образ загрузчика брать.. об этом дальше..
    filename "pxelinux.0";
    }
* теперь прописываем какой интерфейс будет слушать сервер dhcp
root@debvbox:~# cat /etc/default/isc-dhcp-server


# Defaults for dhcp initscript
== Введение ==
# sourced by /etc/init.d/dhcp
Управление доступом к данным в сервере PostgreSQL осуществляется с помощью нескольких механизмов. Таких как:
# installed at /etc/default/isc-dhcp-server by the maintainer scripts
Конфигурационные файлы: postgresql.conf и pghba.conf.  
#
# This is a POSIX shell fragment
#
# On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
#      Separate multiple interfaces with spaces, e.g. "eth0 eth1".
INTERFACES="eth0"
* в данном случае как видно это интерфейс - eth0
* теперь перезапускаем сервер dhcp и на этом настройка первого этапа закончена.
root@debvbox:~# /etc/init.d/isc-dhcp-server restart
Stopping ISC DHCP server: dhcpd.
Starting ISC DHCP server: dhcpd.


3. '''Настройка сервера TFTP - HPA'''
С помощью этих файлов настраивается подключение к серверу Postgres.
* создаем каталог, где будет наша будущая система клиента в окружении chroot
root@debvbox:~#mkdir /ltsp


* прописываем для сервера tftp-hpa где будет наша "платформа"
Управление пользователями и группами - регистрация пользователей и групп, определения права суперпользователя, права создания баз данных, права создания ролей, права наследования родительских прав для пользователей или групп.
root@debvbox:~#cat /etc/default/tftpd-hpa


# /etc/default/tftpd-hpa
Определение прав доступа к объектам баз данных для пользователей или групп с помощью SQL команд GRANT и REVOKE.
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/ltsp/boot/"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure"
* перезапускаем сервер tftp-hpa
root@debvbox:/etc# /etc/init.d/tftpd-hpa restart


Restarting HPA's tftpd: in.tftpd.


Проверяем:
netstat -lnp | grep :69


udp        0      0 0.0.0.0:69              0.0.0.0:*                          16665/in.tftpd
== Конфигурационный файл pghba.conf ==


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


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


4. '''Настройка сервера LTSP'''
'''Формат строки файла pg_hba:'''
*Корневая файловая система, которую будут использовать клиенты, находится в каталоге /ltsp. Она должна быть доступна через NFS. Настраивается все это через конфиг /etc/exports
* прописываем настройки для сервера nfs-kernel, nfs-common
root@debvbox:/etc# cat /etc/exports


  # /etc/exports: the access control list for filesystems which may be exported
  local database user auth-method [auth-option]
  #              to NFS clients.  See exports(5).
  host database user CIDR-address auth-method [auth-option]
  #
  hostssl database user CIDR-address auth-method [auth-option]
  # Example for NFSv2 and NFSv3:
  hostnossl database user CIDR-address auth-method [auth-option]
  # /srv/homes      hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
  host database user IP-address IP-mask auth-method [auth-option]
  #
  hostssl database user IP-address IP-mask auth-method [auth-option]
# Example for NFSv4:
  hostnossl database user IP-address IP-mask auth-method [auth-option]
# /srv/nfs4        gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes  gss/krb5i(rw,sync,no_subtree_check)
## первый каталог - это система и он в режиме только чтение...
/ltsp/                  *(ro,no_root_squash,async,no_subtree_check)
## второй - это домашняя папка пользователя, и он доступен уже на запись...
  /ltsp/home/user/        *(rw,no_root_squash,async,no_subtree_check)


Проверяем:
showmount -e
Export list for  nzip:                                                                                                                                       
/home/ltsp/home/user/  *                                                                                                                                     
/home/ltsp/          *


* теперь создаем корневую систему для пользователя:
'''1. Первое ключевое слово определяет тип подключения и соответственно тип хостовой записи:'''
root@debvbox:~# cd /ltsp
root@debvbox:~# ltsp-build-client --arch i386 --dist squeeze --mirror http://ftp.ru.debian.org/debian/ squeeze main
.
.
invoke-rc.d nfs-kernel-server reload
info: LTSP client installation completed successfully


* заходим в режиме chroot в каталог /ltsp
'''local''' - для клиентских подключений с того же компьютера, на котором работает сервер
root@debvbox:~# chroot /ltsp
root@debvbox:~/#


* сразу добавляем пользователя который будет работать..
'''host''' - сетевое подключение
root@debvbox:~/# adduser user
.
.
successfully


* до устанавливаем необходимые пакеты для работы клиентов..
'''hostssl''' - для подключений локальных или удаленных хостов к серверу, с использованием ssl протокола, обеспечивающим шифрование всех взаимодействий с сервером.
root@debvbox:~/# apt-get install sudo ntfs-3g ntfsprogs


* выходим из режима chroot
Протокол ssl должен поддерживаться как клиентом, так и сервером.
exit
root@debvbox:~#


* прописываем права пользователя user в sudo и group в каталоге среды /ltsp/etc
'''2. Второй параметр database обозначает базы данных, к которым можно подключаться:'''
* теперь нам необходимо настроить загрузку нашего тонкого клиента, чтоб он мог по умолчанию через 15 секунд загружать систему с жесткого диска или выбрав нижнее меню, загрузить уже нашу среду и провести восстановление системы у себя с помощью ntfsclon


root@debvbox:/ltsp# cat /ltsp/boot/pxelinux.cfg/default
'''all''' - для разрешения подключения ко всем базам данных.


TIMEOUT 60
'''sameuser''' - для разрешения подключения только к базе данных имя которой совпадает с именем пользователя.
PROMPT 0
DEFAULT menu.c32
MENU TITLE BOOT_MENU
MENU COLOR unsel 37;40
MENU COLOR sel 30;47
MENU COLOR border 37;40
MENU COLOR title 37;40
MENU COLOR hotkey 36;40
MENU COLOR tabmsg 36;40
MENU TABMSG Brought to you by Blue Light.
MENU AUTOBOOT
#
#
label WINDOWS
localboot 0
#
label SYSTEM_RECOVERY
kernel vmlinuz
APPEND ro initrd=initrd.img quiet root=/dev/nfs ip=dhcp boot=nfs nfsroot=10.10.5.1:/ltsp/ ramdisk=8192


* для корректной работы загрузчика скопируем необходимую библиотеку..
Имя базы данных или список баз данных, разделенный запятыми - для разрешения подключения к конкретной базе данных.
cp /ltsp/usr/lib/syslinux/menu.c32 /ltsp/boot/menu.c32
* перезапускаем сервер tftp-hpa
root@debvbox:/etc# /etc/init.d/tftpd-hpa restart


Restarting HPA's tftpd: in.tftpd.
'''user''' - имена пользователей или групп, которым разрешается подключение с этого компьютера:
* пробуем загрузится "тонким" клиентом


* [https://habrahabr.ru/post/277783/ полезное...]
'''all''' - все пользователи
<hr>
 
* [https://habr.com/ru/company/serverclub/blog/250549/ Загрузочный сервер — как загрузочная флешка, только сервер и по сети]
имя пользователя - имя конкретного пользователя +имя группы - имя группы
 
список пользователей и групп, разделенный запятыми
 
'''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
 
 
== Про владельцев объектов ==
 
Владельцем объектов может быть пользователь или группа.
 
У каждого объекта базы данных может быть владелец, отличный от владельца базы данных.
 
Владельца объекта можно изменить после создания объекта. Это может сделать либо владелец объекта, либо суперпользователь.
 
Если у базы данных - один владелец, а у некоторого объекта этой базы данных другой, то владельца на этом объекте может сменить, только владелец объекта или суперпользователь и не может - владелец базы данных.
 
Владелец может раздавать привилегии на свой объект и изменять его.

Версия от 21:56, 26 августа 2013

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

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

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

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

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

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


Введение

Управление доступом к данным в сервере 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


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

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

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

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

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

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