powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Почему после revoke ALL on FUNCTION функция выполняется?
14 сообщений из 14, страница 1 из 1
Почему после revoke ALL on FUNCTION функция выполняется?
    #40038017
Guzya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени, Всем!

Разъясните, почему после отзыва прав на исполнение функции у пользователя, он все равно может ее выполнить?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
test_1=# revoke ALL on FUNCTION test_fun FROM test_1 ;
REVOKE
test_1=# \c - test_1 
psql (11.8 (Debian 11.8-1.pgdg100+1), сервер 11.7 (Debian 11.7-0+deb10u1))
Вы подключены к базе данных "test_1" как пользователь "test_1".
test_1=> select test_fun('11');
ИНФОРМАЦИЯ:  ТЕСТ 11
 test_fun 
----------
 t
(1 строка)
...
Рейтинг: 0 / 0
Почему после revoke ALL on FUNCTION функция выполняется?
    #40038020
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Guzya,

При создании любой функции, право на её выполнение выдается на public. Потому и может.
Сделайте:
Код: sql
1.
revoke ALL on FUNCTION test_fun FROM public ;
...
Рейтинг: 0 / 0
Почему после revoke ALL on FUNCTION функция выполняется?
    #40038042
Guzya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, делаю шаблон для бд с закрытием всех доступов и пропустил

Код: sql
1.
2.
3.
ALTER DEFAULT PRIVILEGES IN SCHEMA information_schema REVOKE ALL ON functions FROM PUBLIC ;
ALTER DEFAULT PRIVILEGES IN SCHEMA pg_catalog REVOKE ALL ON functions FROM PUBLIC ;
ALTER DEFAULT PRIVILEGES IN SCHEMA PUBLIC REVOKE ALL ON functions FROM PUBLIC ;
...
Рейтинг: 0 / 0
Почему после revoke ALL on FUNCTION функция выполняется?
    #40038055
Guzya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не пойму, в шаблоне выполнил

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
create database template_no_priv_log_ddl;

-- подключаемся к бд
\c template_no_priv_log_ddl

-- Отзываем привилегии на уже созданные объекты
REVOKE ALL ON ALL TABLES IN SCHEMA information_schema FROM PUBLIC ;
REVOKE ALL ON ALL TABLES IN SCHEMA pg_catalog FROM PUBLIC ;
REVOKE ALL ON ALL TABLES IN SCHEMA PUBLIC FROM PUBLIC ;

REVOKE ALL ON ALL FUNCTIONS IN SCHEMA information_schema FROM  PUBLIC;
REVOKE ALL ON ALL FUNCTIONS IN SCHEMA pg_catalog FROM  PUBLIC;
REVOKE ALL ON ALL FUNCTIONS IN SCHEMA PUBLIC FROM  PUBLIC;
------------------------------------------------------------------------
-- Отзываем привилегии на будущие объекты
ALTER DEFAULT PRIVILEGES IN SCHEMA information_schema REVOKE ALL ON TABLES FROM PUBLIC ;
ALTER DEFAULT PRIVILEGES IN SCHEMA pg_catalog REVOKE ALL ON TABLES FROM PUBLIC ;
ALTER DEFAULT PRIVILEGES IN SCHEMA PUBLIC REVOKE ALL ON TABLES FROM PUBLIC ;

ALTER DEFAULT PRIVILEGES IN SCHEMA information_schema REVOKE ALL ON functions FROM PUBLIC ;
ALTER DEFAULT PRIVILEGES IN SCHEMA pg_catalog REVOKE ALL ON functions FROM PUBLIC ;
ALTER DEFAULT PRIVILEGES IN SCHEMA PUBLIC REVOKE ALL ON functions FROM PUBLIC ;

-- делаем из бд шаблон
ALTER DATABASE template_no_priv_log_ddl IS_TEMPLATE on;



Почему в бд созданной из этого шаблона, на новую функцию появляется доступ?
...
Рейтинг: 0 / 0
Почему после revoke ALL on FUNCTION функция выполняется?
    #40038098
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Guzya,

1)для начала объясните чего вы хотите добиться через
REVOKE ALL ON ALL TABLES IN SCHEMA pg_catalog FROM PUBLIC ;
потому что это не работает и работать не может и не будет....
как база должна проверять права доступа если они в pg_catalog лежат
т.е. на RO pg_catalog всегда и всем будет доступен.

2)покажите что показывает
\df+ test_fun

особенно в части Owner и Access privileges

3)покажите как вы эту функцию создавали и от кого

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Почему после revoke ALL on FUNCTION функция выполняется?
    #40038331
Guzya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Идея в том, что бы запретить всем, кроме тех кому явно разрешено, любые действия в бд.
В том числе просмотр списка объектов бд.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
postgres=# create user test_1;
CREATE ROLE
postgres=# create user test_2;
CREATE ROLE
postgres=# create database test_1 template template_no_priv_log_ddl ;
CREATE DATABASE
postgres=# create database test_2;
CREATE DATABASE
postgres=# \c test_2 test_1
psql (11.8 (Debian 11.8-1.pgdg100+1), сервер 11.7 (Debian 11.7-0+deb10u1))
Вы подключены к базе данных "test_2" как пользователь "test_1".
test_2=> \d
Отношения не найдены.
test_2=> select relname from pg_class limit 1 \gx
-[ RECORD 1 ]---------
relname | pg_statistic
test_2=> 

test_2=> create table test_1 (id int);
CREATE TABLE
test_2=> select * from test_1 ;
 id 
----
(0 строк)

test_2=# \c test_2 test_2
psql (11.8 (Debian 11.8-1.pgdg100+1), сервер 11.7 (Debian 11.7-0+deb10u1))
Вы подключены к базе данных "test_2" как пользователь "test_2".
test_2=> \dt
           Список отношений
 Схема  |  Имя   |   Тип   | Владелец 
--------+--------+---------+----------
 public | test_1 | таблица | test_1
(1 строка)

test_2=> select * from test_1 ;
ОШИБКА:  нет доступа к таблице test_1
test_2=> 
test_2=> create table test_2(id int);
CREATE TABLE
test_2=> select * from test_2 ;
 id 
----
(0 строк)

test_2=> \c test_1 test_1
psql (11.8 (Debian 11.8-1.pgdg100+1), сервер 11.7 (Debian 11.7-0+deb10u1))
Вы подключены к базе данных "test_1" как пользователь "test_1".
test_1=> \l
ОШИБКА:  нет доступа к таблице pg_database
test_1=> \d
ОШИБКА:  нет доступа к таблице pg_class
test_1=> select relname from pg_class limit 1 \gx
ОШИБКА:  нет доступа к функции int8
test_1=> select pg_database_size('test_1');
ОШИБКА:  нет доступа к функции pg_database_size
test_1=> \c - test_2
psql (11.8 (Debian 11.8-1.pgdg100+1), сервер 11.7 (Debian 11.7-0+deb10u1))
Вы подключены к базе данных "test_1" как пользователь "test_2".
test_1=> \d
ОШИБКА:  нет доступа к таблице pg_class
test_1=> \l
ОШИБКА:  нет доступа к таблице pg_database
test_1=> select pg_database_size('test_1');
ОШИБКА:  нет доступа к функции pg_database_size
test_1=> select relname from pg_class limit 1 \gx
ОШИБКА:  нет доступа к функции int8

test_1=> \c - postgres
psql (11.8 (Debian 11.8-1.pgdg100+1), сервер 11.7 (Debian 11.7-0+deb10u1))
Вы подключены к базе данных "test_1" как пользователь "postgres".
test_1=# CREATE OR REPLACE FUNCTION grant_all(text) 
test_1-# RETURNS bool
test_1-# AS
test_1-# $$
test_1$# DECLARE
test_1$#    rolename ALIAS FOR $1;
test_1$# BEGIN
test_1$# 
test_1$# RAISE INFO 'Передана роль %', rolename;
test_1$# PERFORM 1 FROM pg_catalog.pg_user WHERE usename = rolename;
test_1$# 
test_1$# IF NOT FOUND THEN
test_1$#   RAISE EXCEPTION 'Роль % не найдена', rolename;
test_1$#   RETURN fals;
test_1$# END IF;
test_1$# 
test_1$# EXECUTE 'grant ALL ON ALL tables in schema information_schema TO '||rolename||';';
test_1$# EXECUTE 'grant all ON ALL sequences in schema information_schema TO '||rolename||';';
test_1$# EXECUTE 'grant EXECUTE ON ALL functions in schema information_schema TO '||rolename||';';
test_1$# 
test_1$# EXECUTE 'grant ALL ON ALL tables in schema pg_catalog TO '||rolename||';';
test_1$# EXECUTE 'grant all ON ALL sequences in schema pg_catalog TO '||rolename||';';
test_1$# EXECUTE 'grant EXECUTE ON ALL functions in schema pg_catalog TO '||rolename||';';
test_1$# 
test_1$# EXECUTE 'grant ALL ON ALL tables in schema PUBLIC TO '||rolename||';';
test_1$# EXECUTE 'grant all ON ALL sequences in schema PUBLIC TO '||rolename||';';
test_1$# EXECUTE 'grant EXECUTE ON ALL functions in schema PUBLIC TO '||rolename||';';
test_1$# 
test_1$# RETURN true;
test_1$# END;
test_1$# $$
test_1-# LANGUAGE plpgsql
test_1-# ;
CREATE FUNCTION
test_1=# 
test_1=# 
test_1=# select grant_all('test_1');
ИНФОРМАЦИЯ:  Передана роль test_1
 grant_all 
-----------
 t
(1 строка)

test_1=# \c - test_1
psql (11.8 (Debian 11.8-1.pgdg100+1), сервер 11.7 (Debian 11.7-0+deb10u1))
Вы подключены к базе данных "test_1" как пользователь "test_1".
test_1=> create table test_1(id int);
CREATE TABLE
test_1=> insert into test_1 values(1);
INSERT 0 1
test_1=> select * from test_1 ;
 id 
----
  1
(1 строка)

test_1=> select relname from pg_class limit 1 \gx
-[ RECORD 1 ]---
relname | test_1

test_1=> select pg_database_size('test_1');
 pg_database_size 
------------------
          9351839
(1 строка)

test_1=> 
test_1=> \c - test_2
psql (11.8 (Debian 11.8-1.pgdg100+1), сервер 11.7 (Debian 11.7-0+deb10u1))
Вы подключены к базе данных "test_1" как пользователь "test_2".
test_1=> \df+ grant_all 
ОШИБКА:  нет доступа к таблице pg_proc
test_1=> select pg_database_size('test_1');
ОШИБКА:  нет доступа к функции pg_database_size
test_1=> select pg_database_size('test_1');
ОШИБКА:  нет доступа к функции pg_database_size
test_1=> select * from test_1 ;
ОШИБКА:  нет доступа к таблице test_1
test_1=> \c - postgres
psql (11.8 (Debian 11.8-1.pgdg100+1), сервер 11.7 (Debian 11.7-0+deb10u1))
Вы подключены к базе данных "test_1" как пользователь "postgres".
test_1=# CREATE OR REPLACE FUNCTION test_p(text) 
RETURNS bool
AS
$$
DECLARE
   rolename ALIAS FOR $1;
BEGIN

RAISE INFO 'Передано сообщение: %', rolename;
RETURN true;
END;
$$
LANGUAGE plpgsql;

test_1=# \df+ test_p 
                                                                                                     Список функций
 Схема  |  Имя   | Тип данных результата | Типы данных аргументов |  Тип  | Изменчивость | Параллельность | Владелец | Безопасность | Права доступа |  Язык   |                 Исходный код                  | Описание 
--------+--------+-----------------------+------------------------+-------+--------------+----------------+----------+--------------+---------------+---------+-----------------------------------------------+----------
 public | test_p | boolean               | text                   | функ. | изменчивая   | небезопасная   | postgres | вызывающего  |               | plpgsql |                                              +| 
        |        |                       |                        |       |              |                |          |              |               |         | DECLARE                                      +| 
        |        |                       |                        |       |              |                |          |              |               |         |    rolename ALIAS FOR $1;                    +| 
        |        |                       |                        |       |              |                |          |              |               |         | BEGIN                                        +| 
        |        |                       |                        |       |              |                |          |              |               |         |                                              +| 
        |        |                       |                        |       |              |                |          |              |               |         | RAISE INFO 'Передано сообщение: %', rolename;+| 
        |        |                       |                        |       |              |                |          |              |               |         | RETURN true;                                 +| 
        |        |                       |                        |       |              |                |          |              |               |         | END;                                         +| 
        |        |                       |                        |       |              |                |          |              |               |         |                                               | 
(1 строка)

test_1=# \c - test_2
psql (11.8 (Debian 11.8-1.pgdg100+1), сервер 11.7 (Debian 11.7-0+deb10u1))
Вы подключены к базе данных "test_1" как пользователь "test_2".
test_1=> select test_p('11');
ИНФОРМАЦИЯ:  Передано сообщение: 11
 test_p 
--------
 t
(1 строка)

test_1=> CREATE OR REPLACE FUNCTION test_1(text) 
RETURNS bool
AS
$$
DECLARE
   rolename ALIAS FOR $1;
BEGIN

RAISE INFO 'Передано сообщение: %', rolename;
RETURN true;
END;
$$
LANGUAGE plpgsql;

test_1=> \df+ test_1
                                                                                                     Список функций
 Схема  |  Имя   | Тип данных результата | Типы данных аргументов |  Тип  | Изменчивость | Параллельность | Владелец | Безопасность | Права доступа |  Язык   |                 Исходный код                  | Описание 
--------+--------+-----------------------+------------------------+-------+--------------+----------------+----------+--------------+---------------+---------+-----------------------------------------------+----------
 public | test_1 | boolean               | text                   | функ. | изменчивая   | небезопасная   | test_1   | вызывающего  |               | plpgsql |                                              +| 
        |        |                       |                        |       |              |                |          |              |               |         | DECLARE                                      +| 
        |        |                       |                        |       |              |                |          |              |               |         |    rolename ALIAS FOR $1;                    +| 
        |        |                       |                        |       |              |                |          |              |               |         | BEGIN                                        +| 
        |        |                       |                        |       |              |                |          |              |               |         |                                              +| 
        |        |                       |                        |       |              |                |          |              |               |         | RAISE INFO 'Передано сообщение: %', rolename;+| 
        |        |                       |                        |       |              |                |          |              |               |         | RETURN true;                                 +| 
        |        |                       |                        |       |              |                |          |              |               |         | END;                                         +| 
        |        |                       |                        |       |              |                |          |              |               |         |                                               | 
(1 строка)


test_1=> \c - test_2
psql (11.8 (Debian 11.8-1.pgdg100+1), сервер 11.7 (Debian 11.7-0+deb10u1))
Вы подключены к базе данных "test_1" как пользователь "test_2".
test_1=> select test_1('22');
ИНФОРМАЦИЯ:  Передано сообщение: 22
 test_1 
--------
 t
(1 строка)
test_1=> \c - postgres 
psql (11.8 (Debian 11.8-1.pgdg100+1), сервер 11.7 (Debian 11.7-0+deb10u1))
Вы подключены к базе данных "test_1" как пользователь "postgres".
test_1=# REVOKE execute ON ALL FUNCTIONS IN SCHEMA PUBLIC FROM PUBLIC ;
REVOKE
test_1=# \df+ test_1
                                                                                                      Список функций
 Схема  |  Имя   | Тип данных результата | Типы данных аргументов |  Тип  | Изменчивость | Параллельность | Владелец | Безопасность |  Права доступа  |  Язык   |                 Исходный код                  | Описание 
--------+--------+-----------------------+------------------------+-------+--------------+----------------+----------+--------------+-----------------+---------+-----------------------------------------------+----------
 public | test_1 | boolean               | text                   | функ. | изменчивая   | небезопасная   | test_1   | вызывающего  | test_1=X/test_1 | plpgsql |                                              +| 
        |        |                       |                        |       |              |                |          |              |                 |         | DECLARE                                      +| 
        |        |                       |                        |       |              |                |          |              |                 |         |    rolename ALIAS FOR $1;                    +| 
        |        |                       |                        |       |              |                |          |              |                 |         | BEGIN                                        +| 
        |        |                       |                        |       |              |                |          |              |                 |         |                                              +| 
        |        |                       |                        |       |              |                |          |              |                 |         | RAISE INFO 'Передано сообщение: %', rolename;+| 
        |        |                       |                        |       |              |                |          |              |                 |         | RETURN true;                                 +| 
        |        |                       |                        |       |              |                |          |              |                 |         | END;                                         +| 
        |        |                       |                        |       |              |                |          |              |                 |         |                                               | 
(1 строка)

test_1=# \c - test_2
psql (11.8 (Debian 11.8-1.pgdg100+1), сервер 11.7 (Debian 11.7-0+deb10u1))
Вы подключены к базе данных "test_1" как пользователь "test_2".
test_1=> select test_1('22');
ОШИБКА:  нет доступа к функции test_1



Вопрос, почему для вновь создаваемых функций не отрабатывает политика по умолчанию?
ALTER DEFAULT PRIVILEGES IN SCHEMA PUBLIC REVOKE ALL ON functions FROM PUBLIC ;
...
Рейтинг: 0 / 0
Почему после revoke ALL on FUNCTION функция выполняется?
    #40038345
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GuzyaВопрос, почему для вновь создаваемых функций не отрабатывает политика по умолчанию?
ALTER DEFAULT PRIVILEGES IN SCHEMA PUBLIC REVOKE ALL ON functions FROM PUBLIC ;
Причина в указании конкретной схемы: IN SCHEMA PUBLIC. Посмотрите примеры в документации на ALTER DEFAULT PRIVILEGES :
Лишение роли public права на выполнение (EXECUTE), которое обычно даётся для функций (для всех функций, которые будут созданы ролью admin):

ALTER DEFAULT PRIVILEGES FOR ROLE admin REVOKE EXECUTE ON FUNCTIONS FROM PUBLIC;

Однако заметьте, что этого же эффекта нельзя добиться с помощью команды, ограниченной одной схемой . Эта команда будет действовать, только если ей предшествовала соответствующая команда GRANT:

ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE EXECUTE ON FUNCTIONS FROM PUBLIC;

Это объясняется тем, что на уровне схемы можно только назначить права по умолчанию, которые добавятся к назначенным глобально, но нельзя отозвать последние.

В вашем случае указание схемы PUBLIC нужно убрать, ведь если я правильно понял, для функций в других схемах должно действовать такое же ограничение. FOR ROLE тоже не указываем, чтобы функции любых пользователей не были доступны на исполнение для PUBLIC:
Код: sql
1.
ALTER DEFAULT PRIVILEGES REVOKE ALL ON functions FROM PUBLIC;


И не лишним будет сразу убедится, что привилегии по умолчанию записаны в системный каталог:
Код: sql
1.
2.
3.
4.
5.
\ddp
             Default access privileges
  Owner   | Schema |   Type   |  Access privileges  
----------+--------+----------+---------------------
 postgres |        | function | postgres=X/postgres
...
Рейтинг: 0 / 0
Почему после revoke ALL on FUNCTION функция выполняется?
    #40038354
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел ЛузановFOR ROLE тоже не указываем, чтобы функции любых пользователей не были доступны на исполнение для PUBLIC
Вот тут я ошибся, если FOR ROLE не указываем, то действие команды распространяется только на функции созданные текущим пользователем (у меня это был postgres).
Если предполагается, что функции могут создавать разные пользователи, то для каждого из них нужно выполнять вот такую ALTER DEFAULT PRIVILEGES.

В следующем примере три роли u1, u2, u3.
Для роли u1 выполнили ALTER DEFAULT PRIVILEGES, поэтому её функции роль u3 не может выполнять.
Для роли u2 привилегии по умолчанию не устанавливали, поэтому u3 спокойно выполняет функцию пользователя u2.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
db=# create role u1 login;
CREATE ROLE
db=# create role u2 login;
CREATE ROLE
db=# create role u3 login;
CREATE ROLE
db=# ALTER DEFAULT PRIVILEGES FOR ROLE u1 REVOKE ALL ON functions FROM PUBLIC;
ALTER DEFAULT PRIVILEGES
db=# \ddp
           Default access privileges
 Owner | Schema |   Type   | Access privileges 
-------+--------+----------+-------------------
 u1    |        | function | u1=X/u1
(1 row)

db=# \c - u1
You are now connected to database "db" as user "u1".
db=> create function f1() returns int AS 'select 1' language sql;
CREATE FUNCTION
db=> \c - u2
You are now connected to database "db" as user "u2".
db=> create function f2() returns int AS 'select 2' language sql;
CREATE FUNCTION
db=# \c - u3
You are now connected to database "db" as user "u3".
db=> select f1();
ERROR:  permission denied for function f1
db=> select f2();
 f2 
----
  2
...
Рейтинг: 0 / 0
Почему после revoke ALL on FUNCTION функция выполняется?
    #40038593
Guzya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть ли какие-нибудь методики\идеи на тему, есть один сервер на нем несколько бд, у каждой бд свой пользователь.
1. нужно ограничить возможность пользователей лазить не в своей бд.
2. иногда надо предоставлять доступ к чужой бд.
3. минимизировать количество "ручных" телодвижений(шагов), выполняемых каждый раз для достижения цели.
...
Рейтинг: 0 / 0
Почему после revoke ALL on FUNCTION функция выполняется?
    #40038598
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Guzya,

У псевдороли PUBLIC есть привилегия CONNECT на базу данных. Т.е. по умолчанию любой пользователь может подключаться к любой БД. Вот эту привилегию точно можно отобрать в шаблонной БД и потом с неё остальные клонировать.
Если кому-то потребуется доступ к чужой бд, то суперпользователь или владелец "чужой" бд могут выдать GRANT CONNECT ON DATABASE .. TO кому_надо.

Вроде это решает поставленную задачу.
...
Рейтинг: 0 / 0
Почему после revoke ALL on FUNCTION функция выполняется?
    #40038607
Guzya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А вот об этом я вообще не подумал.
Спасибо, сейчас буду проверять!
...
Рейтинг: 0 / 0
Почему после revoke ALL on FUNCTION функция выполняется?
    #40038613
Guzya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Оказалось нельзя отобрать connect на все бд, т.е. при вызове revoke надо указать конкретную бд.
Т.е. в шаблоне делаю

Код: sql
1.
2.
3.
4.
5.
6.
7.
template_no_priv_log_ddl=# revoke CONNECT ON DATABASE template_no_priv_log_ddl FROM PUBLIC ;
template_no_priv_log_ddl=# create database test_3 template template_no_priv_log_ddl ;
CREATE DATABASE
template_no_priv_log_ddl=# \c test_3 test_1
psql (11.8 (Debian 11.8-1.pgdg100+1), сервер 11.7 (Debian 11.7-0+deb10u1))
Вы подключены к базе данных "test_3" как пользователь "test_1".
test_3=> 
...
Рейтинг: 0 / 0
Почему после revoke ALL on FUNCTION функция выполняется?
    #40038650
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Guzya,

Действительно, привилегии доступа к бд не наследуются при клонировании. Значит нужно отбирать сразу после создания бд.
...
Рейтинг: 0 / 0
Почему после revoke ALL on FUNCTION функция выполняется?
    #40038662
Guzya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Павел Лузанов
Guzya,

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


Думал сделать процедуру или функцию, создает бд и настраивает права.
Оказалось create database нельзя выполнять из функции\процедуры.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Почему после revoke ALL on FUNCTION функция выполняется?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]