PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Управление на роли и атрибути на роли в PostgreSQL


Въведение

PostgreSQL използва различни механизми за внедряване на удостоверяване, оторизация и собственост върху обекти в клъстерите на базата данни. Основното сред тях е концепцията за роли.

Ролите на PostgreSQL са комбинация от идеите на потребителите и групите в единна, гъвкава единица. Те са личността, която потребителят приема в системата на базата данни, са обектът, чрез който системата за удостоверяване приема или отказва връзки и предмет на правилата за управление на привилегиите от всички обхвати.

Това ръководство ще обхване какви са ролите и как да ги управлявате в клъстер от база данни на PostgreSQL. По-конкретно, това ръководство ще обхваща управлението на ролите, тъй като се отнася до атрибутите на ролите. За по-широк преглед на това как ролите се вписват в по-голямата картина, разгледайте въведението в ръководството за удостоверяване и оторизация. За да научите как да променяте привилегиите на роли върху конкретни обекти на база данни, вижте нашето ръководство за предоставяне на роли.



Какво представляват ролите?

В PostgreSQL ролята е групиране от специфичен набор от възможности, разрешения и „притежавани“ обекти. Вместо да има различни понятия за "потребители" и "групи", PostgreSQL използва роли, за да представи и двете идеи. Ролята може да съответства на отделен човек в реалния свят или може да работи като група с определен достъп, в който други роли могат да станат членове.

Ролите са опорната точка в PostgreSQL, която определя за кого се прилагат политиките за удостоверяване и оторизация. Всяка политика, която не се прилага универсално, изисква понятие за идентичност, за да определи кой да ограничи и кой да разреши. В PostgreSQL тази идентичност е представена от роли.

Системата за удостоверяване на PostgreSQL има редица различни компоненти, всеки от които е свързан с роли. За да бъдат използвани за първоначално свързване към клъстера на базата данни, ролите първо трябва да имат LOGIN набор от атрибути. Самите правила за удостоверяване са дефинирани в базирания на хост конфигурационен файл, наречен pg_hba.conf . Всяко правило дефинира методи за удостоверяване, които могат да бъдат обхванати за индивидуалната роля. За ролите, които са конфигурирани за удостоверяване с парола, трябва да има зададен атрибут за парола, така че системата да може да потвърди предоставената потребителска парола.

По отношение на оторизацията ролите се дефинират на ниво клъстер на базата данни, което в PostgreSQL означава, че те се споделят между бази данни. Тъй като ролите обхващат бази данни, системата за оторизация контролира нивото на достъп, което всяка роля има до всеки обект на базата данни. Тъй като ролите могат да представляват групи от хора, има голяма гъвкавост в начина, по който може да се конфигурира достъпът.

Ролите също са от съществено значение за концепцията за собственост на обекти в PostgreSQL. Всяка база данни и таблица, например, имат точно една роля, конфигурирана като собственик. Различни от superusers , ролята на собственик е единствената роля, която може да промени или изтрие действителния обект.

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



Атрибути на ролята

Атрибутите на ролята са флагове на самата роля, които определят някои от основните привилегии, които тя има на ниво клъстер на базата данни. Те могат да бъдат зададени при първоначалното създаване на ролята или променени по всяко време от която и да е роля със съответните атрибути (SUPERUSER или CREATEROLE в този случай).

Атрибутите, които могат да бъдат приложени към роля, включват:

  • LOGIN :Позволява на потребителите първоначално да се свързват с клъстера на базата данни, използвайки тази роля. CREATE USER команда автоматично добавя този атрибут, докато CREATE ROLE командата не.
  • SUPERUSER :Позволява на ролята да заобикаля всички проверки за разрешения с изключение на правото за влизане. Само други SUPERUSER roles могат да създават роли с този атрибут.
  • CREATEDB :Позволява на ролята да създава нови бази данни.
  • CREATEROLE :Позволява на ролята да създава, променя и изтрива други роли. Този атрибут също така позволява на ролята да присвоява или променя членството си. Изключение е тази роля с CREATEROLE атрибутът не може да променя SUPERUSER роли без също да имате SUPERUSER атрибут.
  • REPLICATION :Позволява на ролята да инициира поточно репликация. Ролите с този атрибут трябва също да имат LOGIN атрибут.
  • PASSWORD :Присвоява парола на ролята, която ще се използва с password или md5 механизми за удостоверяване. Този атрибут приема парола в кавички като аргумент непосредствено след ключовата дума на атрибута.
  • INHERIT :Определя дали ролята наследява привилегиите на ролите, на които е член. Без INHERIT , членовете трябва да използват SET ROLE да преминете в другата роля, за да получите достъп до тези изключителни привилегии. Този атрибут е зададен за нови роли по подразбиране.

Можете да научите повече за атрибутите на ролята, като разгледате документацията на PostgreSQL за атрибутите на ролята и CREATE ROLE команда.



Какво е superuser роля?

Както бе споменато накратко по-горе, специална привилегия, наречена superuser позволява неограничен административен достъп до клъстера на базата данни. Това е подобно на root акаунт в Linux и Unix-подобни операционни системи, но на ниво база данни.

Винаги трябва да има поне една роля с superuser привилегии във всеки клъстер на база данни. Първоначалният superuser акаунтът се създава по време на инсталационния процес. Името на първоначалния superuser акаунтът може да варира в зависимост от инсталационния процес, но най-често този акаунт се нарича postgres .

Не се препоръчва да вършите ежедневната си работа, като използвате акаунт с superuser привилегии, както поради потенциала си за разрушителни действия, така и за свеждане до минимум на вероятността от компрометиране на акаунт с широк достъп. Вместо това през повечето време потребителите трябва да използват акаунти, посветени на специфичните функции или обекти с данни, с които работят, като използват само superuser акаунти, когато е необходим по-мощен достъп.



Проверка на съществуващи атрибути на роли

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


Изброяване на всички роли в базата данни и техните атрибути

Има няколко различни начина за проверка на атрибутите, приложени към ролите в цялата система.

Ако използвате psql клиент на командния ред, можете да се възползвате от някои полезни метакоманди, които ви позволяват да получавате информация за атрибутите на ролята без заявка.

\du мета-командата показва всички роли и техните атрибути:

\du
                                   List of roles Role name |                         Attributes                         | Member of-----------+------------------------------------------------------------+----------- postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

В този случай postgres Ролята е ролята по подразбиране с superuser привилегии, конфигурирани за този клъстер от база данни.

Еквивалентният SQL за изброяване на роли (откриваем чрез подаване на -E или --echo-hidden флаг при стартиране на psql ) е:

SELECT r.rolname, r.rolsuper, r.rolinherit,  r.rolcreaterole, r.rolcreatedb, r.rolcanlogin,  r.rolconnlimit, r.rolvaliduntil,  ARRAY(SELECT b.rolname        FROM pg_catalog.pg_auth_members m        JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid)        WHERE m.member = r.oid) as memberof, r.rolreplication, r.rolbypassrlsFROM pg_catalog.pg_roles rWHERE r.rolname !~ '^pg_'ORDER BY 1;

По-долу е подобна заявка, която предоставя информация за атрибута на ролята (без компонента за членство в ролята). Използваме psql метакоманда \x on за да изведете резултатите вертикално за по-добра четливост тук:

-- turn on vertical display\x onSELECT * FROM pg_roles WHERE rolname !~ '^pg_';-- turn off vertical display\x off
-[ RECORD 1 ]--+---------rolname        | postgresrolsuper       | trolinherit     | trolcreaterole  | trolcreatedb    | trolcanlogin    | trolreplication | trolconnlimit   | -1rolpassword    | ********rolvaliduntil  | rolbypassrls   | trolconfig      | oid            | 10

Ако се интересувате само да видите кои роли имат superuser атрибут, можете да поискате списък изрично:

SELECT rolname FROM pg_roles WHERE rolsuper;
 rolname---------- postgres(1 row)

Като алтернатива можете да изброите всички потребители и техния superuser състояние за по-пълна картина:

SELECT usename,usesuper FROM pg_user;
 usename  | usesuper----------+---------- postgres | t user1    | f(2 rows)

Същата информация може да бъде извлечена с помощта на парадигмата "роля" на PostgreSQL вместо нейното (понякога двусмислено) наслагване на "потребител" с тази малко по-дълга заявка вместо това:

SELECT rolname,rolsuper FROM pg_roles WHERE rolname !~ '^pg_';
 rolname  | rolsuper----------+---------- postgres | t user1    | f(2 rows)


Изброяване на вашите собствени атрибути

Ако искате да намерите атрибутите на ролята, която използвате в момента, можете лесно да филтрирате изхода.

Когато използвате psql мета-команди, можете да използвате USER променлива, която ще бъде заменена с текущата свързана роля. psql използва двоеточие (: ) за интерполиране на променливи:

\du :USER
                                   List of roles Role name |                         Attributes                         | Member of-----------+------------------------------------------------------------+----------- postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

За да получите списък, показващ стойностите на всички възможни атрибути на ролята, можете да използвате заявка, сравняваща името на ролята със стойността, върната от CURRENT_ROLE PostgreSQL функция. Отново използваме вертикален изход за четливост:

-- First, turn on vertical output\x onSELECT * FROM pg_roles WHERE rolename = CURRENT_ROLE;-- Change back to normal output\x off
-[ RECORD 1 ]--+---------rolname        | postgresrolsuper       | trolinherit     | trolcreaterole  | trolcreatedb    | trolcanlogin    | trolreplication | trolconnlimit   | -1rolpassword    | ********rolvaliduntil  |rolbypassrls   | trolconfig      |oid            | 10

Просто за да проверите дали текущата ви роля има superuser привилегии, можете да въведете:

SHOW is_superuser;
 is_superuser-------------- on(1 row)


Проверете дали имате привилегии за управление на роли

За да създавате, променяте или изтривате роли, трябва или да имате superuser или CREATEROLE привилегии.

За да проверите кои роли в системата имат привилегии за управление на роли, въведете:

SELECT rolname as "Users who can manage roles" FROM pg_roles WHERE rolsuper OR rolcreaterole;
 Users who can manage roles---------------------------- postgres(1 rows)

Ако просто искате да знаете дали текущата ви роля има привилегии за управление на ролите, можете вместо това да използвате:

SELECT 'Yes' AS "Can I manage roles?" FROM pg_roles WHERE rolname = :'USER' AND (rolsuper OR rolcreaterole);
 Can I manage roles?--------------------- Yes(1 row)



Създаване на роли

След като потвърдите, че имате привилегии за управление на роли, можете да започнете да създавате, променяте или премахвате роли в PostgreSQL.

Една от опциите за задаване на атрибути на ролята е да ги декларирате в момента, в който създавате ролята. Това ви позволява да зададете първоначалните условия за ролята, но все пак можете да ги промените след това, ако искате да промените нивото на достъп на ролята. Можете да намерите повече информация за CREATE ROLE команда, която ще използваме, за да се запознаем с основния синтаксис.

Един от начините за създаване на роля е от командния ред. PostgreSQL включва createuser команда, която ще създаде роля в клъстера на базата данни с LOGIN привилегии.

Общият синтаксис е:

createuser <options> <rolename>

Например, за да създадете роля с име admin с superuser привилегии, докато подканвате за парола, можете да въведете:

createuser --superuser admin

След това ще можете да влезете с помощта на admin акаунт според методите за удостоверяване, описани в pg_hba.conf файл.

За създаване на роли с помощта на SQL , общият синтаксис изглежда така:

CREATE ROLE <role>;

Атрибутите могат да бъдат дефинирани, като ги посочите след името на ролята с помощта на WITH :

CREATE ROLE <role> WITH <options>;

Например, за да създадете роля с име user1 който може да влезе с паролата secretpassword , можете да въведете:

CREATE ROLE "user1" WITH LOGIN PASSWORD 'secretpassword';

Вместо това да създадете роля с superuser привилегии (трябва да сте и superuser за успешно изпълнение на тази команда), които не могат вход (потребителят трябва да използва SET ROLE за да промените тази роля), можете да въведете:

CREATE ROLE "user2" WITH SUPERUSER;


Промяна на съществуващи роли

За да промените атрибутите на съществуващи роли, можете да използвате ALTER ROLE вместо това команда. Както при създаването на роля, текущата ви роля трябва да има или superuser или CREATEROLE привилегии. Потребителите, които нямат тези привилегии, могат да използват само ALTER ROLE команда за промяна на собствената им парола.

Промяната на роли ви позволява да промените атрибутите, присвоени на роля след създаването. Същите атрибути, споменати в раздела за създаване на роля, могат да се използват с ALTER ROLE синтаксис. Една разлика е, че всеки тип атрибут може да бъде отменен чрез добавяне на NO префикс. Например, за да позволите на роля да влезе в клъстера на базата данни, можете да й дадете LOGIN атрибут. За да премахнете тази способност, трябва да промените ролята, като посочите NOLOGIN .

ALTER ROLE команда променя само атрибутите, които са изрично споменати. С други думи, ALTER ROLE команда определя промени към атрибути, а не пълен набор от нови атрибути.

За да разрешите user2 роля, за да влезете в клъстера на базата данни, можете да въведете:

ALTER ROLE "user2" WITH LOGIN;

Имайте предвид, че докато това позволява възможността за влизане, разрешените методи за удостоверяване все още се контролират от pg_hba.conf файл.

Ако искате user2 за да можете вместо това да влизате, създавате роли и създавате бази данни, можете да посочите тези три атрибута, разделени с интервали:

ALTER ROLE "user2" WITH LOGIN CREATEROLE CREATEDB;

За да отмените superuser състояние от роля (можете да изпълните тази команда само с друг superuser роля), тип:

ALTER ROLE "user2" WITH NOSUPERUSER;

За да промените паролата за роля, можете да въведете следното (всички роли трябва да могат да изпълняват тази команда в собствената си роля, независимо от CREATEROLE или superuser привилегии):

ALTER ROLE <role> WITH PASSWORD '<password>';

Въпреки че горната команда работи, ако е възможно, по-добре е да използвате psql мета-команда за промяна на паролите. psql командата автоматично подканва за парола и я криптира, преди да я изпрати на сървъра. Това помага да се избегне изтичане на чувствителни данни в регистрационни файлове.

Можете да промените паролата на роля с psql като напишете следното

-- To change your own password\password-- To change the password for another role\password <role>

Можете също да използвате ALTER ROLE команда за преименуване на роля:

ALTER ROLE <role> RENAME TO <newrole>

Имайте предвид, че не можете да преименувате текущата си роля в сесията.



Изтриване на роли

Изтриването на съществуваща роля следва подобен модел на предишните команди. Отново трябва да имате CREATEROLE или superuser привилегии за изпълнение на тези команди.

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

Подробно обяснение за това как правилно да преназначавате и отпадате привилегиите е предоставено от Erwin Brandstetter на сайта на Stack Exchange на администратори на база данни. Същият процес се използва по-долу.

Първо, можете да преназначите всички притежавани от ролята обекти, като използвате REASSIGNED OWNED команда. Например, ако се подготвяте да изтриете user2 роля, можете да присвоите неговите обекти на postgres роля, като напишете:

REASSIGN OWNED BY "user2" TO "postgres";

Сега обектите са собственост на postgres , можем да използваме DROP OWNED команда за отмяна на всички други привилегии, които сме получили за обекти. Тази команда също изтрива всички обекти, които притежаваме, но тъй като току-що ги прехвърлихме в postgres роля, user2 Ролята вече няма собствени обекти. Поради това командата ще отмени само всички допълнителни привилегии на ролята:

DROP OWNED BY "user2";

Без DROP OWNED пряк път по-горе, ще трябва да изпълните REVOKE ALL PRIVILEGES за всеки отделен обект или тип обект, върху който ролята има привилегии.

След като сте отменили всички свързани привилегии, можете да премахнете ролята, като напишете:

DROP ROLE "user2";


Влизане с помощта на psql

След като конфигурирате нова роля и сте конфигурирали подробности за удостоверяване с помощта на pg_hba.conf файл, можете да влезете в клъстера на базата данни, като използвате новата си роля. psql Клиентът на командния ред предоставя лесен начин да направите това.

По подразбиране psql предполага, че искате да се свържете с роля, която съответства на потребителското име на вашата операционна система. Така че, ако сте влезли в компютъра си като john , psql ще приеме, че искате да опитате да се свържете с базата данни с помощта на роля, която също се нарича john .

За да отмените това поведение, можете да подадете -U или --username= опция. Например, ако искате да влезете в роля, наречена kerry , можете да въведете:

psql -U kerry

Успехът на psql командата ще зависи от съществуването на kerry роля, достъпността на сървъра, с който се опитвате да се свържете, и правилата за удостоверяване, дефинирани на сървъра.



Промяна на различна роля по време на сесия

Понякога може да искате временно да приемете привилегиите и самоличността на друга роля, до която имате достъп. Например, това е необходимо, ако искате да получите привилегиите на роля, на която членувате, ако текущата ви роля няма INHERIT атрибут.

За да разберете как работи това, трябва да знаете терминологията, която PostgreSQL използва за категоризиране на активни роли:

  • Рол на сесия :Ролята на сесията е ролята, с която сте влезли по време на първоначалната си връзка с клъстера на базата данни PostgreSQL. Той задава вашите първоначални привилегии и определя вашия достъп до системата. Тази роля трябва да има LOGIN атрибут.
  • Текуща роля :За разлика от това, текущата роля е ролята, която изпълнявате в момента. Привилегиите, свързани с текущата роля, независимо дали са зададени директно или са наследени от други роли, определят действията, които имате право да извършвате, и обектите, до които имате достъп.

Можете да видите стойностите на сесията и текущите роли, като напишете:

SELECT SESSION_USER, CURRENT_USER;
 current_user | session_user--------------+-------------- postgres     | postgres(1 row)

Въпреки че единственият начин да промените ролята си на сесия е да започнете нова връзка с друга роля, можете да промените текущата си роля, като използвате SET ROLE команда. SET ROLE командата се използва, за да действа временно като различна роля. Командата също така по избор приема следните модификатори:

  • SESSION :Настройка по подразбиране. Това причинява SET ROLE команда, за да засегне цялата сесия на базата данни.
  • LOCAL :Този модификатор ще накара командата да промени ролята само за текущата транзакция.

За да промените текущата роля на user2 роля (за останалата част от сесията), въведете:

SET ROLE "user2";

Ако проверите стойностите на вашата сесия и текущи роли, ще видите, че текущата стойност на ролята се е променила:

SELECT SESSION_USER, CURRENT_USER;
 current_user | session_user--------------+-------------- user2        | postgres(1 row)

Всички ваши действия вече ще използват user2 роля като техен контекст.

За да се върнете към ролята на сесията, която сте използвали преди, можете да въведете:

SET ROLE NONE;

Алтернатива, която постига същия резултат е:

RESET ROLE;


Заключение

Системата от роли, атрибути на роли, разрешения и удостоверяване на PostgreSQL създава гъвкава система, която позволява на администраторите ефективно да управляват разрешенията и достъпа до базата данни. Това ръководство описва какво точно представляват ролите и как те обхващат широк спектър от случаи на използване. Той също така обхваща как да създавате, променяте и изтривате роли и да управлявате атрибутите на ролите, които определят техните глобални възможности. Разбирането как да управлявате тези самоличности е необходимо, за да защитите вашите бази данни и да предоставите използваем достъп на вашите легитимни потребители.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как мога да вмъкна JSON обект в Postgres с помощта на Java readyStatement?

  2. Инсталиране на PostgreSQL в Ubuntu за Ruby on Rails

  3. PostgreSQL заявка за изброяване на всички имена на таблици?

  4. Съхранявайте и извличайте изображения в Postgresql с помощта на Java

  5. Синтактична грешка при или близо до потребител при добавяне на ограничение Postgres