PostgreSQL — это СУБД с открытым исходным кодом, которая, в свою очередь, использует SQL. Это очень мощный инструмент, который используется для управления приложениями и размещения веб-данных на VPS. В этом руководстве вы узнаете, как управлять правами доступа в PostgreSQL. Это поможет вам предоставить ролям вашего приложения необходимые разрешения. Мы выполним это руководство, используя PostgreSQL на Ubuntu 18.04 облачном сервере на CloudSigma.
Установка PostgreSQL
Чтобы загрузить и установить PostgreSQL, выполните следующие команды:
|
1 2 |
sudo apt-get update sudo apt-get install postgresql postgresql-contrib |
Установщик создаст пользователя по умолчанию – “Postgres” для работы. Мы будем использовать этого пользователя в большей части этого руководства. Вы можете войти под этим пользователем с помощью следующей команды:
|
1 |
sudo su - postgres |
Теперь, когда PostgreSQL установлен, вы узнаете, как он обрабатывает права доступа. Вы также можете ознакомиться с нашим руководством по настройке PostgreSQL на Ubuntu для получения подробного пошагового руководства по процессу установки.
Концепции прав доступа в PostgreSQL
Postgres управляет правами доступа с помощью концепции “ролей”. В случае ролей нет различий между пользователями и группами. Роли более гибки, чем традиционная система пользователей и групп в Unix. Например, роль может выступать в качестве члена другой роли, наследуя ее права доступа.
Просмотр ролей в PostgreSQL
Чтобы просмотреть роли в PostgreSQL, вам сначала нужно войти в командную строку с помощью следующей команды:
|
1 |
psql |
Затем выполните следующее, чтобы просмотреть роли:
|
1 |
\du |

На данный момент существует только одна роль по умолчанию со всеми привилегиями.
Как создавать роли в PostgreSQL
Вы можете создавать роли для Postgres либо из командной строки, либо из оболочки Postgres. Вы можете попробовать следующие два подхода, после чего вы увидите, как управлять правами доступа в PostgreSQL.
Как создавать роли изнутри PostgreSQL
Самый простой способ создать роли — из командной строки Postgres. Вы можете сделать это с помощью следующей команды:
|
1 |
CREATE ROLE demo_role; |
Чтобы проверить, создана ли она, выполните команду:
|
1 |
\du |

Она указывает, что у новой роли нет прав на вход. Вы узнаете, как это изменить, позже в этом руководстве.
Как создавать роли из командной строки
Альтернативой вышеописанному методу является создание пользователя из командной строки. Чтобы выйти из командной строки PostgreSQL, введите следующее:
|
1 |
\q |
Вы можете создать роль с именем “test” с помощью следующей команды:
|
1 |
createuser test |
После выполнения вышеуказанной команды войдите в psql и выведите список ролей с помощью следующих команд:
|
1 2 |
psql \du |

Вы можете заметить, что созданный таким образом пользователь не имеет тех же атрибутов.
How to Delete Roles In PostgreSQL
Вы можете легко удалять роли в PostgreSQL, используя следующий синтаксис:
|
1 |
DROP ROLE role_name; |
Вы можете удалить демонстрационную роль, которую мы создали ранее, с помощью команды:
|
1 |
DROP ROLE demo_role; |

Если мы попытаемся удалить несуществующую роль, это просто вызовет ошибку. Чтобы убедиться в этом, вы можете попробовать удалить ту же роль еще раз:
|
1 |
DROP ROLE demo_role; |

Если вы хотите, чтобы команда не выдавала ошибку, когда роль не существует, вы можете добавить ‘IF EXISTS’ в команду:
|
1 |
DROP ROLE IF EXISTS role_name; |
Вы можете повторить попытку удаления роли с помощью этой команды:
|
1 |
DROP ROLE IF EXISTS demo_role; |
Как определять привилегии при создании роли
На данный момент вы создавали и удаляли роли. В этом разделе вы будете создавать роли с измененными правами доступа. Вы можете сделать это, указав права доступа для роли с помощью команды создания:
|
1 |
CREATE ROLE role_name WITH optional_permissions; |
Чтобы увидеть доступные для этого параметры, вы можете открыть справку с помощью этой команды:
|
1 |
\h CREATE ROLE |

Если вы хотите создать роль с правами на вход, вы можете составить команду следующим образом:
|
1 |
CREATE ROLE demo_role WITH LOGIN; |

Как мы видели ранее, если вы хотите создать роли с разрешением на вход (login), вы также можете использовать следующую команду:
|
1 |
CREATE USER role_name; |
Единственная разница между этими двумя командами заключается в том, что ‘CREATE USER’ по умолчанию дает роли разрешение на вход.
Как изменить привилегии ролей в PostgreSQL
До сих пор вы пробовали давать разрешения при создании пользователя. В этом разделе вы измените разрешения уже созданных пользователей. Синтаксис команды alter следующий:
|
1 |
ALTER ROLE role_name WITH attribute_options; |
Например, при желании вы можете изменить разрешения на вход для demo_role на ‘log in’ с помощью этой команды:
|
1 |
ALTER ROLE demo_role WITH NOLOGIN; |

Чтобы снова разрешить пользователю вход, вы можете изменить разрешения с помощью следующей команды:
|
1 |
ALTER ROLE demo_role WITH LOGIN; |
Как войти в систему под другим пользователем в PostgreSQL
По умолчанию PostgreSQL позволяет входить в систему только локально, если ваше имя пользователя совпадает с системным именем пользователя. Чтобы обойти это, вы можете либо изменить тип входа, либо настроить PostgreSQL на использование сетевого интерфейса обратной связи (loopback). Этот интерфейс изменит тип подключения на удаленный, даже если подключение является локальным.
В этом разделе вы попробуете второй вариант. Для начала вы можете установить пароль пользователя, чтобы была возможна аутентификация.
Установите пароль для ‘demo_user’ с помощью следующей команды:
|
1 |
\password test |
При появлении запроса введите и подтвердите пароль. После этого вы можете выйти из интерфейса PostgreSQL и вернуться к обычному пользователю вашей машины:
|
1 2 |
\q exit |
PostgreSQL требует, чтобы вы входили в систему с именем пользователя, совпадающим с именем пользователя вашей операционной системы, а также подключались к базе данных под тем же именем. Поскольку в данном случае вы этого не делаете, вам придется явно указать параметры, которые вы хотите использовать. Вы можете использовать следующий синтаксис:
|
1 |
psql -U <span class="highlight">user</span> -d <span class="highlight">db</span> -h 127.0.0.1 -W |
user: Имя пользователя, под которым вы хотите подключиться
DB: Существующая база данных, к которой у вас есть доступ
-h 127.0.0.1: Указывает PostgreSQL, что вы будете подключаться через сетевой интерфейс к локальной машине. Этот параметр позволяет пройти аутентификацию, даже если имя пользователя не совпадает с системным именем пользователя.
-W: Указывает PostgreSQL, что вы будете вводить пароль
Чтобы войти под нашим “test_user,” мы можем выполнить следующую команду:
|
1 |
psql -U test -d postgres -h 127.0.0.1 -W |

После ввода пароля вы войдете в оболочку. В нашем примере мы используем базу данных ‘postgres’ — базу данных по умолчанию, которая автоматически создается при установке.
В этом сеансе, в зависимости от выбранного для входа пользователя, вы столкнетесь с проблемой отсутствия прав на выполнение различных действий. Причина проблемы в том, что вы еще не предоставили пользователю достаточных прав для администрирования.
В следующем разделе вы предоставите пользователям необходимые разрешения. Сначала вам нужно будет снова переключиться на административного пользователя:
|
1 2 3 |
\q sudo su - postgres psql |
Управление правами в PostgreSQL: Как предоставить права в PostgreSQL
В PostgreSQL, если база данных или таблица созданы определенной ролью, только эта роль имеет права на их изменение. Исключением являются роли с правами суперпользователя. В этом разделе вы предоставите права другим ролям. Вы можете предоставить права другим ролям с помощью оператора ‘GRANT’. Синтаксис следующий:
|
1 |
GRANT permission_type ON table_name TO role_name; |
Вы можете создать простую таблицу для выполнения команды:
|
1 2 3 4 |
CREATE TABLE demo ( name varchar(25), id serial, start_date date); |
Чтобы увидеть созданную таблицу, выполните команду:
|
1 |
\d |

Теперь, когда у вас есть таблица demo, вы можете предоставить привилегии для таблицы ‘demo’ роли ‘demo_role’. Вы можете дать роли привилегию ‘UPDATE’ с помощью этой команды:
|
1 |
GRANT UPDATE ON demo TO demo_role; |
Вы можете предоставить все права роли, указав разрешение как ‘ALL’:
|
1 |
GRANT ALL ON demo TO demo_role; |
Если вы хотите предоставить определенное разрешение всем ролям в системе, вы можете использовать ключевое слово ‘public’ вместо имени роли, как в следующей команде:
|
1 |
GRANT INSERT ON demo TO PUBLIC; |
Вы можете просмотреть все предоставленные разрешения с помощью следующей команды:
|
1 |
\z |
Управление правами в PostgreSQL: как удалить права в PostgreSQL
Вы можете легко удалить права роли с помощью команды ‘REVOKE’. Она очень похожа на команду предоставления прав (GRANT):
|
1 |
REVOKE permission_type ON table_name FROM user_name; |
Как и в случае с GRANT, мы можем использовать ключевые слова – ‘ALL’ и ‘PUBLIC’, чтобы предоставить все права или предоставить права всем ролям:
|
1 |
REVOKE INSERT ON demo FROM PUBLIC; |
Как использовать групповые роли в PostgreSQL
Для обеспечения широкого контроля прав роли достаточно гибки, чтобы позволить группировку с другими ролями. Например, вы можете создать роль – ‘temporary_role’, а затем добавить ‘demo_role’ и ‘test_user’ в эту роль:
|
1 2 3 |
CREATE ROLE temporary_role; GRANT temporary_role TO demo_role; GRANT temporary_role TO test_user; |
Теперь вы можете управлять правами этих двух ролей, просто управляя правами роли ‘temporary_role’. Это упрощает управление правами. Вы можете просмотреть информацию о членстве в ролях с помощью этой команды:
|
1 |
\du |

Любой член группы может действовать от имени группы, используя команду ‘set role’. Поскольку пользователь ‘postgres’ является суперпользователем, вы можете использовать ‘set role’, даже если вы не являетесь членом группы:
|
1 |
SET ROLE temporary_role; |
Все таблицы, которые вы создадите сейчас, будут принадлежать temporary_role:
|
1 2 3 4 |
CREATE TABLE hello ( name varchar(25), id serial, start_date date); |
To check the ownerships of the table, run the following command:
|
1 |
\d |

Вы можете видеть, что роль ‘temporary_role’ владеет новой таблицей и последовательностью, связанной с типом данных serial. Чтобы вернуться к исходным правам роли, выполните следующую команду:
|
1 |
RESET ROLE; |
Если вы хотите, чтобы роль обладала всеми привилегиями роли, к которой она принадлежит, вы можете указать свойство ‘inherit’ с помощью команды ‘alter role’:
|
1 |
ALTER ROLE test_user INHERIT; |
С помощью приведенной выше команды ‘test_user’ получает все привилегии ролей, к которым он принадлежит. Чтобы удалить роль, вы можете использовать команду ‘drop role’:
|
1 |
DROP ROLE temporary_users; |

Приведенная выше команда выдает ошибку, так как у нас есть объекты, такие как таблица ‘hello’, которые зависят от нее. Чтобы удалить ее, вы можете передать владение таблицей другой роли:
|
1 |
ALTER TABLE hello OWNER TO demo_role; |
Вы можете убедиться, что temporary_role теперь не владеет никакими таблицами, с помощью следующей команды:
|
1 |
\d |

Теперь вы можете удалить ‘temporary_role’, так как у нее больше нет зависимостей:
|
1 |
DROP ROLE temporary_users; |
Хотя приведенная выше команда удалит роль temporary_users, бывшие члены этой группы ролей не удаляются.
Заключение
Вы завершили руководство, и теперь вы знаете, как управлять правами доступа в PostgreSQL. Вы можете легко администрировать эти права. Понимание того, как управлять правами доступа, гарантирует, что ваши приложения будут иметь доступ к необходимым базам данных, не имея при этом доступа к любым другим базам данных, используемым другими приложениями.
Приятной работы!


Комментарии
Комментариев пока нет. Будьте первым.