Використання ролей і управління доступом в postgresql

Розміщення серверів в надійних дата-центрах Європи. Відкрийте хмарний VPS / VDS сервер на швидких SSD за 1 хвилину!

Кращий хостинг:
- захистить дані від несанкціонованого доступу в охоронюваному європейському ЦОДі
- прийме оплату хоч в bitcoin.
- дозволить поставити свій дистрибутив

- захист від DDos-атак
- безкоштовний backup
- Uptime 99,9999%
- ЦОД - TIER III
- провайдер - TIER I

Підтримаємо російською мовою 24/7/365 Працюємо з юрособами і фізособами. Вам прямо зараз потрібно 24 ядра і 72 Gb RAM. Будь ласка!

Наші вигідні тарифи доведуть, що дешевий хостинг ви ще не знали!

Хвилинна справа: виберіть конфігурацію, оплатіть і CMS на VPS готова.
Money Back - 30 днів!

Банківськими картами, електронною валютою, через термінали Qiwi, Webmoney, PayPal, Новоплат і ін.

Задайте питання в службу підтримки 24/7/365

Знайдіть відповіді в нашій базі і познайомтеся з рекомендаціями

PostgreSQL - це відкрита система управління базами даних (СКБД), заснована на мові запитів SQL. PostgreSQL - дуже продуктивний інструмент, призначений для систематизації та зберігання даних програми.

Даний посібник навчить вас управляти правами доступу PostgreSQL.

Примітка. Керівництво виконано на хмарному сервері Ubuntu 12.04, однак все інструкції, крім розділу по установці, можна застосувати і в інших сучасних дистрибутивах Linux.

установка PostgreSQL

Якщо СУБД PostgreSQL не був встановлений раніше, встановіть її зараз. Для цього використовуйте команди:

sudo apt-get update
sudo apt-get install postgresql postgresql-contrib

Під час установки PostgreSQL створює стандартного користувача для роботи. Перейдіть в сесію цього користувача.

sudo su - postgres

Права доступу PostgreSQL

PostgreSQL управляє доступом за допомогою так званих ролей.

Ролі схожі на звичайні системні права доступу Unix, проте, на відміну від Unix, вони не діляться на користувачів і групи.

Ролі можуть бути членами інших ролей, що дозволяє їм наслідувати параметри привілеїв певних раніше ролей.

а потім ввести команду:

Як бачите, після установки в PostgreSQL існує всього одна роль, яка володіє широкими правами доступу.

Створення ролей PostgreSQL

Існує два базових способу створення ролей: в командному рядку PostgreSQL і в командному рядку системи.

Створення ролі в PostgreSQL

Найпростіше створювати нові ролі в командному рядку PostgreSQL.

Для цього використовується наступний синтаксис:

CREATE ROLE new_role_name;

Спробуйте створити нову роль (в керівництві вона умовно називається demo_role):

CREATE ROLE demo_role;
CREATE ROLE

Перевірте список існуючих ролей:

\ du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------+-----------
demo_role | Can not login | <>
postgres | Superuser, Create role, Create DB, Replication | <>

Як бачите, в списку з'явилася нова роль. Зверніть увагу: на даний момент у неї немає привілеїв входу.

Створення ролі в командному рядку системи

Також можна створити роль за допомогою команди createuser.

Закрийте командний рядок PostgreSQL:

Щоб створити роль в командному рядку системи, введіть наступну команду (в керівництві ця роль буде умовно називатися test_user):

createuser test_user
Shall the new role be a superuser? (Y / n) n
Shall the new role be allowed to create databases? (Y / n) n
Shall the new role be allowed to create more new roles? (Y / n) n

Команда поставить низку питань, які визначать початкові привілеї даної ролі.

Знову відкрийте командний рядок Postgres і запросіть список існуючих ролей:

psql
\ du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------+-----------
demo_role | Can not login | <>
postgres | Superuser, Create role, Create DB, Replication | <>
test_user | | <>

Як бачите, ролі, створені різними методами, не ідентичні. Роль, створена в командному рядку системи, має привілеї входу.

Видалення ролей PostgreSQL

Тепер спробуйте вирівняти привілеї ролей demo_role і test_user. Це можна зробити під час створення ролі (тобто потрібно видалити і заново створити demo_role). Також можна просто відредагувати привілеї існуючої ролі.

Але перш ніж приступити до управління привілеями PostgreSQL, потрібно навчитися видаляти ролі.

Для цього використовується наступний синтаксис:

DROP ROLE role_name;
Delete the "demo_role" role by typing:
DROP ROLE demo_role;
DROP ROLE

Якщо заданої в команді ролі не існує, команда поверне помилку:

DROP ROLE demo_role;
ERROR: role "demo_role" does not exist

Оператор IF EXISTS дозволяє уникнути цієї помилки; команда з таким оператором видалить роль, якщо вона існує. Якщо зазначеної ролі немає, команда не поверне помилку.

DROP ROLE IF EXISTS role_name;

Тобто, в будь-якому випадку команда буде виконана успішно і не поверне помилку.

DROP ROLE IF EXISTS demo_role;
NOTICE: role "demo_role" does not exist, skipping
DROP ROLE

Визначення привілеїв під час створення ролі

Тепер спробуйте знову створити роль demo_role, заздалегідь встановивши її права доступу. Права ролі можна вказати відразу після головного оператора create.

Синтаксис виглядає так:

CREATE ROLE role_name WITH optional_permissions;

Щоб у користувача, пов'язаного з цією роллю, були привілеї входу, введіть:

CREATE ROLE demo_role WITH LOGIN;
CREATE ROLE

Перевірте список існуючих ролей і зверніть увагу на те, що тепер обидві ролі мають однакові привілеї:

Щоб роль мала права входу без аргументу login, використовуйте замість CREATE ROLE таку команду:

CREATE USER role_name;

Команда CREATE USER відрізняється тільки тим, що автоматично дає ролі привілеї входу.

Управління правами ролі PostgreSQL

Щоб змінити права доступу вже існуючої ролі, використовуйте команду ALTER ROLE.

Її базовий синтаксис:

ALTER ROLE role_name WITH attribute_options;

Для прикладу спробуйте повернути ролі demo_role її вихідні привілеї:

ALTER ROLE demo_role WITH NOLOGIN;
ALTER ROLE

\ du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------+-----------
demo_role | Can not login | <>
postgres | Superuser, Create role, Create DB, Replication | <>
test_user | | <>

Тепер у ролі demo_role немає привілеїв входу.

Повернути привілеї входу можна за допомогою команди:

ALTER ROLE demo_role WITH LOGIN;

Зміна користувача PostgreSQL

За замовчуванням користувачі можуть входити тільки локально, якщо ім'я системного користувача збігається з ім'ям ролі PostgreSQL.

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

Розглянемо другий варіант.

Для початку потрібно встановити пароль для користувача, в сесію якого потрібно перейти.

Встановіть пароль для test_user:

Команда запропонує ввести і підтвердити пароль. Потім закрийте інтерфейс PostgreSQL і поверніться в сесію системного користувача.

За замовчуванням PostgreSQL має на увазі, що для входу буде використовуватися роль, однойменна системному користувачу, і що така роль буде підключатися до однойменної базі даних.

Але в даному випадку це не так, тому потрібно явно вказати опції. Для цього використовуйте синтаксис:

psql -U user_name -d database_name -h 127.0.0.1 -W

Примітка. Замість user_name вкажіть ім'я користувача, за допомогою якого потрібно встановити з'єднання; замість database_name вкажіть ім'я БД, до якої потрібно підключитися.

Оператор -h 127.0.0.1 вказує, що потрібно підключитися до локальної машині по мережному інтерфейсі. Це дозволить проходити аутентифікацію, навіть якщо ім'я користувача та ім'я ролі не збігаються. Прапор -W значить, що при вході в PostgreSQL потрібно ввести пароль.

Щоб відкрити сесію користувача test_user, введіть:

psql -U test_user -d postgres -h 127.0.0.1 -W
Password for user test_user:

Програма запросить встановлений раніше пароль.

Примітка. Дана команда підключить користувача до БД postgres, стандартної БД, створеної під час установки.

Спробуйте попрацювати в цій сесії; як бачите, даний користувач має досить вузькі привілеї.

Поверніться в сесію адміністратора:

\ q
sudo su - postgres
psql

Управління привілеями PostgreSQL

Як передати привілеї

Як правило, при створенні БД або таблиці права доступу до неї є тільки у створила її ролі. Але така поведінка можна змінити.

Передавати права доступу іншим ролям можна за допомогою команди GRANT; її базовий синтаксис:

GRANT permission_type ON table_name TO role_name;

Для прикладу створіть таблицю:

CREATE TABLE demo (
name varchar (25),
id serial,
start_date date);
NOTICE: CREATE TABLE will create implicit sequence "demo_id_seq" for serial column "demo.id"
CREATE TABLE

\ d
List of relations
Schema | Name | Type | Owner
--------+-------------+----------+----------
public | demo | table | postgres
public | demo_id_seq | sequence | postgres
(2 rows)

Тепер спробуйте передати деякі права доступу до таблиці demo ролі demo_role (нехай це буде право на оновлення, UPDATE).

GRANT UPDATE ON demo TO demo_role;

Щоб передати повні права на таблицю, використовуйте оператор ALL:

GRANT ALL ON demo TO test_user;

Щоб передати права доступу всім користувачам системи, замість імені користувача вкажіть PUBLIC:

GRANT INSERT ON demo TO PUBLIC;

\ z
Access privileges
Schema | Name | Type | Access privileges | Column access privileges
--------+-------------+----------+----------------------------+--------------------------
public | demo | table | postgres = arwdDxt / postgres + |
| | | demo_role = w / postgres + |
| | | test_user = arwdDxt / postgres + |
| | | = A / postgres |
public | demo_id_seq | sequence | |
(2 rows)

Як відняти привілеї

Команда REVOKE забирає привілеї.

REVOKE permission_type ON table_name FROM user_name;

Дана команда теж може використовувати оператори all і public.

REVOKE INSERT ON demo FROM PUBLIC;

Групові ролі PostgreSQL

PostgreSQL дозволяє групувати ролі, завдяки чому ролі можуть успадковувати заздалегідь встановлені права доступу.

Для прикладу можна створити роль temporary_users і додати в неї ролі demo_role і test_user:

CREATE ROLE temporary_users;
GRANT temporary_users TO demo_role;
GRANT temporary_users TO test_user;

Тепер групова роль temporary_users керуючи привілеями ролей demo_role і test_user.

Команда set role дозволяє вибрати групову роль, права якої потрібно використовувати.

Наприклад, поточний користувач postgres має права суперкористувача. Навіть незважаючи на те, що цей користувач не є членом ролі temporary_users, він може використовувати її права:

SET ROLE temporary_users;

Тепер будь-яка створена таблиця буде належати груповий ролі temporary_users.

CREATE TABLE hello (
name varchar (25),
id serial,
start_date date);

\ d
List of relations
Schema | Name | Type | Owner
--------+--------------+----------+-----------------
public | demo | table | postgres
public | demo_id_seq | sequence | postgres
public | hello | table | temporary_users
public | hello_id_seq | sequence | temporary_users
(4 rows)

Як бачите, нова таблиця належить ролі temporary_users.

Щоб повернути оригінальні права поточної ролі, введіть:

Щоб передати користувачеві привілеї всіх ролей, членом яких він є, використовуйте команду:

ALTER ROLE test_user INHERIT;

Щоб видалити групову роль (або будь-яку роль), використовуйте:

DROP ROLE temporary_users;
ERROR: role "temporary_users" can not be dropped because some objects depend on it
DETAIL: owner of table hello
owner of sequence hello_id_seq

Ця команда поверне помилку, тому що ролі temporary_users належить таблиця. Спочатку потрібно передати права на таблицю іншій ролі:

ALTER TABLE hello OWNER TO demo_role;

Тепер роль таблиця належить ролі demo_role.

\ d
List of relations
Schema | Name | Type | Owner
--------+--------------+----------+-----------
public | demo | table | postgres
public | demo_id_seq | sequence | postgres
public | hello | table | demo_role
public | hello_id_seq | sequence | demo_role
(4 rows)

Після цього роль temporary_users можна видалити:

DROP ROLE temporary_users;

Це видалить роль temporary_users; члени цієї групової ролі не будуть видалені.

висновок

Тепер у вас є базові навички роботи з привілеями PostgreSQL. Управління правами доступу - дуже важливий аспект роботи з даними; це дозволяє кожному додатку використовувати тільки необхідні йому дані, не втручаючись в роботу інших додатків.

Схожі статті