Самоучитель по SQL-сервер в Linux

         

Управление пользователями

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

Каждому пользователю PostgreSQL назначается внутренний системный идентификатор (sysid) и пароль, хотя пароль не всегда обязателен для подключения (это зависит от файла конфигурации pg_hba.conf, о котором говорилось в главе 8). Системный идентификатор связывает объекты базы данных с владельцем (так называется пользователь, которому разрешено предоставлять и отзывать права доступа к объекту).

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



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

Просмотр списка пользователей

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

Таблица 10.1. Структура таблицы pg_shadow

Поле

Тип

usename

name

usesysid

integer

usecreatedb

boolean

usetrace

boolean

usesuper

boolean

usecatupd

boolean

passwd

text

valuntil

abstime

Основное различие между данными, содержащимися в таблицах pg_user и pg_shadow, заключается в том, что в pg_user отсутствует значение в поле passwd (оно заменяется несколькими звездочками). Эта мера безопасности гарантирует, что обычный пользователь не сможет получить несанкционированный доступ к чужим паролям.

В поле usename хранится имя системного пользователя, которое представляет собой уникальную строку. Существование одноименных пользователей не допускается, потому что пользователи являются глобальными объектами базы данных. В поле usesysid хранится уникальный целый идентификатор, связанный с пользователем. Поля usecreatedb и usesuper содержат информацию о привилегиях, которые могут присваиваться пользователю при создании (см. следующий подраздел).

Создание пользователей

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

Первый способ основан па выполнении команды SQL CREATE USER в клиенте PostgreSQL (например, psql) после прохождения аутентификации. Второй способ, основанный на использовании программы createuser, более удобен для системного администратора, поскольку все действия выполняются одной командой без взаимодействия с клиентом PostgreSQL.

Создание пользователей командой SQL CREATE USER

Команда CREATE USER имеет всего один обязательный параметр — имя нового пользователя. Ей также можно передать множество других параметров, в том числе пароль, системный идентификатор, группу и права, назначаемые новому пользователю. Полный синтаксис команды CREATE USER выглядит так:

CREATE USER пользователь [ WITH [ SYSID aid ]

[ PASSWORD 'пароль' ] ]

[ CREATEDB | NOCREATEDB ]

[ CREATEUSER | NOCREATEUSER ]

[ IN GROUP группа [. ...] ]

[ VALID UNTIL 'срок' ]

Имя создаваемого пользователя определяется параметром пользователь. В системе не допускается присутствие двух пользователей с одинаковыми именами. За ключевым словом WITH следуют секции SYSID и/или PASSWORD.

Все остальные необязательные секции могут следовать в произвольном порядке (ключевое слово WITH для них не обязательно). Ниже перечислены все необязательные ключевые слова.

  • SYSID uid. Пользователю назначается системный идентификатор aid. Если значение не указано, выбирается некоторое уникальное число.
  • PASSWORD ' пароль'. Новому пользователю назначается заданный пароль. Если значение не указано, по умолчанию используется пароль NULL.
  • CREATEDB | NOCREATEDB. Ключевое слово CREATEDB предоставляет новому пользователю право создания баз данных, а также право уничтожения принадлежащих ему баз данных. Ключевое слово NOCREATEDB явно указывает на отсутствие такого права (используется по умолчанию).
  • CREATEUSER | NOCREATEUSER. Ключевое слово CREATEUSER предоставляет пользователю право создания пользователей, наделяя его тем самым правами суперпользователя. Пользователь с правом создания других пользователей обладает всеми правами во всех базах данных (включая право создания баз данных, даже если было указано ключевое слово NOCREATEDB). Ключевое слово NOCREATEUSER явно указывает на отсутствие права создания новых пользователей.
  • IN GROUP группа [. ... ]. Новый пользователь включается в группу с заданным именем. Допускается перечисление нескольких групп через запятую. Чтобы создание пользователя прошло успешно, перечисленные группы должны существовать.
  • VALID UNTIL 'срок'. Пароль пользователя становится недействительным в указанный момент, который задается в одном из поддерживаемых форматов времени. По истечении срока действия пароль необходимо сменить.
  • VALID UNTIL 'infinity'. Срок действия пароля не ограничивается.

При отсутствии ключевых слов CREATEDB и CREATEUSER создается «обычный» пользователь, не обладающий особыми привилегиями. Он не может ни создавать, ни уничтожать базы данных и других пользователей. Обычные пользователи могут подключаться к базам данных PostgreSQL, но при этом они могут выполнять лишь те команды, выполнение которых им было разрешено (см. раздел «Предоставление привилегий» этой главы).

В листинге 10.1 создается обычный пользователь с именем salesuser и паролем N0rm4!, заданным в секции WITH PASSWORD. Секция VALID UNTIL отсутствует, поэтому пароль остается действительным в течение неограниченного времени.

Листинг 10.1. Создание обычного пользователя

tempiatel=# CREATE USER dbuser CREATEDB

tempiatel-# WITH PASSWORD 'DbuSSr'

tempiatel-# VALID UNTIL '2002-11-11';

CREATE USER

Сообщение CREATE USER, выданное сервером, означает, что пользователь был создан успешно. Также возможны сообщения об ошибках.

  • ERROR: CREATEUSER: permission denied. Сообщение выводится в том случае, если команда CREATE USER не была введена суперпользователем. Только суперпользователь имеет право создавать новых пользователей.
  • ERROR: CREATE USER: user name "salesuser" already exists. Пользователь с указанным именем уже существует.

Если в PostgreSQL требуется создать пользователя, которому разрешено создавать базы данных, но запрещено создавать и уничтожать пользователей PostgreSQL, укажите ключевое слово CREATEDB вместо CREATEUSER. Пользователь сможет создавать базы данных, а также уничтожать базы данных, принадлежащие ему. Операции создания и удаления баз данных рассматривались в главе 9.

В листинге 10.2 создается пользователь dbuser, которому разрешено создавать новые базы данных. Для этого после имени пользователя указывается ключевое слово CREATEDB. Также обратите внимание на секции WITH PASSWORD и VALID UNTIL -пользователю dbuser назначается пароль DbuS3r, действующий до 11 ноября 2002 года.

Листинг 10.2. Создание пользователя с правом CREATEDB

tempiatel=# CREATE USER dbuser CREATEDB

tempiatel-# WITH PASSWORD 'DbuS3r'

tempiatel-f VALID UNTIL '2002-11-11';

CREATE USER

Замена пароля с истекшим сроком действия не изменяет значения, указанного в секции VALUD UNTIL. Чтобы заново активизировать пользователя с истекшим сроком действия пароля, следует выполнить команду ALTER USER с секциями WITH PASSWORD и VALID UNTIL. Дополнительная информация о команде ALTER USER приведена в подразделе «Модификация пользователей» этого раздела.

ВНИМАНИЕ

Секция VALID UNTIL не относится к доверенным хостам, для которых пароль не нужен. Аутентификация хостов рассматривалась в главе 8.

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

Листинг 10.3. Создание суперпользователя

tempiatel=# CREATE USER manager CREATEUSER;

CREATE USER

Создание пользователей при помощи сценария createuser

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

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

Синтаксис командной строки приложения createuser:

createuser [ параметры ] [ пользователь ]

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

  • - d, -- createdb. Аналог ключевого слова CREATEDB в команде SQL CREATE USER. Разрешает новому пользователю создавать базы данных.
  • -D, - -nocreatedb. Аналог ключевого слова NOCREATEDB в команде SQL CREATE USER. Запрещает новому пользователю создавать базы данных (используется по умолчанию).
  • - а, - - adduser. Аналог ключевого слова CREATEUSER в команде SQL CREATE USER. Разрешает новому пользователю создавать других пользователей и поднимает его статус до суперпользователя (с предоставлением всех прав в PostgreSQL).
  • -А, - -no- adduser. Аналог ключевого слова NOCREATEUSER в команде SQL CREATE USER. Указывает на то, что новый пользователь не является суперпользователем (используется по умолчанию).
  • -i sysid, -sys1d=sz/5zW. Новому пользователю присваивается системный идентификатор sysid.
  • -Р, --pwprompt. Пароль нового пользователя вводится в специальном приглашении.
  • - h хост, -- host=xocm. Хост, с которым устанавливается связь для создания базы данных. По умолчанию используется хост local host или значение переменной среды PGHOST.
  • -р порт, --port=nopm. Порт, по которому должно производиться подключение к серверу, вместо порта по умолчанию (обычно 5432).
  • -U пользователь, полъзователъ. Имя пользователя, с которым производится подключение к PostgreSQL. По умолчанию используется имя системного пользователя, запустившего программу (createuser).
  • -W, --password. У подключающегося пользователя запрашивается пароль. Это происходит автоматически, если в файле pg_hba.conf хост, от которого поступил запрос, не объявлен доверенным.
  • - е, - - echo. Команда CREATE USER, передаваемая PostgreSQL, выводится на экран в момент ее выполнения программой createuser.
  • -q, - -quiet. Ключ передается без параметров и запрещает вывод данных в поток stdout (хотя ошибки по-прежнему направляются в поток stderr).

Если ключи -d, -D, -а, -А или имя пользователя отсутствуют, программа createuser запрашивает все недостающие данные. Это связано с тем, что PostgreSQL не строит никаких предположений относительно прав нового пользователя или его имени. В листинге 10.4 создается пользователь newuser, которому запрещено создавать новые базы данных и новых пользователей.

Листинг 10.4. Создание пользователя сценарием createuser

[jworsley@booktown -]$ createuser -U manager -D -A newuser

CREATE USER

Обратите внимание на ключ -U manager, переданный сценарию createuser. Он указывает на то, что к PostgreSQL подключается пользователь manager, а не jworsl ey, как предположил бы сценарий по имени системной учетной записи, вызвавшей сценарий.

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

В листинге 10.5 приведен пример использования сценария createuser в интерактивном режиме. При этом выполняются те же действия, как при однострочном вызове в листинге 10.4.

Листинг 10.5. Интерактивное создание пользователя сценарием createuser

[jworsley@booktown -]$ createuser

Enter name of user to add: newuser

Shall the new user be allowed to create databases? (y/n) n

Shall the new user be allowed to create more new users? (y/n) n

CREATE USER

Модификация пользователей

Существующие учетные записи пользователей могут изменяться только суперпользователями PostgreSQL. При этом допускается изменение всех параметров, указываемых при создании пользователя (пароль, срок действия, глобальные права), кроме системного идентификатора. Модификация существующих пользователей производится командой SQL ALTER USER. Синтаксис команды ALTER USER:

ALTER USER пользователь

[ WITH PASSWORD 'пароль' ]

[ CREATEDB NOCREATEDB ]

[ CREATEUSER NOCREATEUSER ]

[ VALID UNTIL 'срок' ]

Обязательный аргумент пользователь определяет пользователя, параметры которого требуется изменить. Ниже перечислены необязательные параметры команды.

  • WITH PASSWORD 'пароль'. Пользователю назначается заданный пароль.
  • CREATEDB [ NOCREATEDB. Пользователю разрешается или запрещается создавать новые базы данных.
  • CREATEUSER | NOCREATEUSER. Пользователю предоставляется статус суперпользователя (или он лишается этого статуса), при котором он обладает всеми правами в PostgreSQL, в том числе правом создания и уничтожения пользователей и суперпользователей.
  • VALID UNTIL 'срок'. Пароль пользователя становится недействительным в указанный момент, который задается в одном из поддерживаемых форматов времени. Значение действует только для систем, требующих парольной аутентификации, и в остальных случаях игнорируется (например, для доверенных хостов).

Команда ALTER USER часто используется для изменения пароля и/или срока действия пароля. Если срок действия пароля, заданного при создании пользователя, истек, а пользователь требует парольной аутентификации, суперпользователю придется изменить пароль и срок его действия, чтобы пользователь смог снова подключиться к базе. Если срок действия пароля не ограничивается, воспользуйтесь специальным значением infinity. .

В листинге 10.6 изменяются параметры пользователя salesuser. Секция WITH PASSWORD назначает пароль n3Wp4s4, а секция VALID UNTIL указывает, что этот пароль действует до 1 января 2003 года.

Листинг 10.6. Изменение пароля

tempiatel=# ALTER USER salesuser

tempiatel-# WITH PASSWORD 'n3WP4s4'

tempiatel-# VALID UNTIL '2003-01-01':

ALTER USER

Иногда пользователю требуется предоставить дополнительные права помимо тех, которые предоставлены ему при создании. Ключевое слово CREATEUSER в листинге 10.7 изменяет права пользователя sal esuser и превращает его в суперпользователя. При этом отдельное назначение права CREATEDB становится излишним, поскольку это право предоставляется суперпользователям автоматически.

Листинг 10.7. Предоставление прав суперпользователя

tempiatel=# ALTER USER salesuser

tempiatel-# CREATEUSER;

ALTER USER

Возможна и обратная ситуация — когда требуется отобрать у пользователя права, предоставленные ему в прошлом. Задача легко решается суперпользователем при помощи ключевых слов NOCREATEDB или NOCREATEUSER (листинг 10.8).

Листинг 10.8. Отзыв прав суперпользователя

tempiatel=# ALTER USER salesuser

tempiatel-# NOCREATEDB NOCREATEUSER;

ALTER USER

ВНИМАНИЕ

Суперпользователи могут лишать прав других суперпользователей и даже удалять их, поэтому предоставление права CREATEUSER требует чрезвычайной осторожности.

Удаление пользователей

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

Задача удаления пользователей PostgreSQL, как и их создание, решается двумя способами. Вы можете воспользоваться командой SQL DROP USER и приложением командной строки dropuser.

Удаление пользователей командой SQL DROP USER

Чтобы удалить пользователя PostgreSQL, суперпользователь может ввести команду DROP USER в любом клиенте. Чаще всего для этого применяется клиент psql.

Синтаксис команды DROP USER:

DROP USER пользователь

Параметр пользователь определяет имя пользователя, удаляемого из системы. В листинге 10.9 клиент psql подключается к PostgreSQL с именем пользователя manager и удаляет пользователя salesuser.

Листинг 10.9. Удаление пользователя командой DROP USER

[jworsley@booktown -]$ psql -U manager

template! Welcome to psql. the PostgreSQL interactive terminal.

Type: \copyright for distribution terms

\h for help with SQL commands

\? for help on internal slash commands

\g or terminate with semicolon to execute query

\q to quit

tempiatel=# DROP USER salesuser:

DROP USER

Сообщение DROP USER, выданное сервером, означает, что пользователь был успешно удален из системы. Также возможны сообщения об ошибках.

  • ERROR: DROPUSER: permission denied. Команда удаления введена пользователем, не обладающим правом удаления других пользователей. Только суперпользователь может удалять других пользователей.
  • ERROR: DROP USER: user "salesuser" does not exist. Пользователь с указанным именем не существует.

Удаление пользователей при помощи сценария dropuser

Сценарий dropuser имеет много общего со сценарием createuser. Он поддерживает те же параметры подключения, что позволяет запускать его как в локальном, так и в удаленном режиме. Единственным обязательным аргументом является имя пользователя, удаляемого из системы.

Синтаксис командной строки приложения dropuser:

dropuser [ параметры ] [ пользователь ]

Ключи, входящие в строку параметров, были описаны в пункте «Создание пользователей при помощи сценария createuser» подраздела «Создание пользователей» этого раздела. В листинге 10.10 приложение dropuser выполняет ту же операцию, которая выполнялась командой SQL из листинга 10.9, — пользователь manager удаляет из системы пользователя salesuser.

Листинг 10.10. Удаление пользователя приложением dropuser

[jworsley@booktown -]$ dropuser -U manager salesuser

DROP USER

Приложение dropuser выводит те же сообщения, что и команда SQL DROP USER. Если при выполнении сценария dropuser в командной строке отсутствует имя удаляемого пользователя, оно запрашивается в интерактивном режиме.



Содержание раздела