用户 postgres 和超级用户有什么区别?
What is the difference between user postgres and a superuser?
我创建了一个新的超级用户,以便该用户可以 运行 COPY 命令。
请注意,非超级用户不能 运行 复制命令。
由于备份应用程序,我需要此用户,并且该应用程序需要 运行 COPY 命令
但是我指定的所有限制都没有生效(见下文)。
用户 postgres 和超级用户有什么区别?
有没有更好的方法来实现我想要的?我研究了一个带有安全定义器的函数作为 postgres ...对于多个表来说似乎有很多工作。
DROP ROLE IF EXISTS mynewuser;
CREATE ROLE mynewuser PASSWORD 'somepassword' SUPERUSER NOCREATEDB NOCREATEROLE NOINHERIT LOGIN;
-- ISSUE: the user can still CREATEDB, CREATEROLE
REVOKE UPDATE,DELETE,TRUNCATE ON ALL TABLES IN SCHEMA public, schema1, schema2, schema3 FROM mynewuser;
-- ISSUE: the user can still UPDATE, DELETE, TRUNCATE
REVOKE CREATE ON DATABASE ip2_sync_master FROM mynewuser;
-- ISSUE: the user can still create table;
COPY
除了写入 STDOUT
和从 STDIN
读取之外的选项只允许数据库 superusers 角色因为它允许读取或写入服务器有权访问的任何文件。
\copy
是一个 psql 客户端命令,其功能与 COPY
相同,但不是服务器端的,因此只能处理本地文件 - 这意味着它调用 COPY
但是... FROM STDIN
/ ... TO STDOUT
, 所以服务器上的文件不是 "touched".
您不能撤销超级用户的特定权限。我在这方面引用文档:
Being a superuser means that you are not subject to access controls.
"superuser", who can override all access restrictions within the database. Superuser status is dangerous and should be used only when really needed.
您描述的情况是用户可以将文件写入运行数据库但不是超级用户的服务器。虽然不是不可能,但绝对是不正常的。我会非常有选择性地允许谁访问我的数据库服务器。
就是说,如果是这种情况,我会创建一个函数来加载 table(使用 copy
),由 postgres
用户拥有并授予用户执行功能的权利。您可以将文件名作为参数传递。
如果你想花哨一点,你可以创建一个 table 的用户和 table 来定义用户可以上传到哪些 table 并拥有 table 名称也作为参数。
这很不正常,但这是一个想法。
这是一个基本示例:
CREATE OR REPLACE FUNCTION load_table(TABLENAME text, FILENAME text)
RETURNS character varying AS
$BODY$
DECLARE
can_upload integer;
BEGIN
select count (*)
into can_upload
from upload_permissions p
where p.user_name = current_user and p.table_name = TABLENAME;
if can_upload = 0 then
return 'Permission denied';
end if;
execute 'copy ' || TABLENAME ||
' from ''' || FILENAME || '''' ||
' csv';
return '';
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
我创建了一个新的超级用户,以便该用户可以 运行 COPY 命令。 请注意,非超级用户不能 运行 复制命令。 由于备份应用程序,我需要此用户,并且该应用程序需要 运行 COPY 命令
但是我指定的所有限制都没有生效(见下文)。 用户 postgres 和超级用户有什么区别?
有没有更好的方法来实现我想要的?我研究了一个带有安全定义器的函数作为 postgres ...对于多个表来说似乎有很多工作。
DROP ROLE IF EXISTS mynewuser;
CREATE ROLE mynewuser PASSWORD 'somepassword' SUPERUSER NOCREATEDB NOCREATEROLE NOINHERIT LOGIN;
-- ISSUE: the user can still CREATEDB, CREATEROLE
REVOKE UPDATE,DELETE,TRUNCATE ON ALL TABLES IN SCHEMA public, schema1, schema2, schema3 FROM mynewuser;
-- ISSUE: the user can still UPDATE, DELETE, TRUNCATE
REVOKE CREATE ON DATABASE ip2_sync_master FROM mynewuser;
-- ISSUE: the user can still create table;
COPY
除了写入 STDOUT
和从 STDIN
读取之外的选项只允许数据库 superusers 角色因为它允许读取或写入服务器有权访问的任何文件。
\copy
是一个 psql 客户端命令,其功能与 COPY
相同,但不是服务器端的,因此只能处理本地文件 - 这意味着它调用 COPY
但是... FROM STDIN
/ ... TO STDOUT
, 所以服务器上的文件不是 "touched".
您不能撤销超级用户的特定权限。我在这方面引用文档:
Being a superuser means that you are not subject to access controls.
"superuser", who can override all access restrictions within the database. Superuser status is dangerous and should be used only when really needed.
您描述的情况是用户可以将文件写入运行数据库但不是超级用户的服务器。虽然不是不可能,但绝对是不正常的。我会非常有选择性地允许谁访问我的数据库服务器。
就是说,如果是这种情况,我会创建一个函数来加载 table(使用 copy
),由 postgres
用户拥有并授予用户执行功能的权利。您可以将文件名作为参数传递。
如果你想花哨一点,你可以创建一个 table 的用户和 table 来定义用户可以上传到哪些 table 并拥有 table 名称也作为参数。
这很不正常,但这是一个想法。
这是一个基本示例:
CREATE OR REPLACE FUNCTION load_table(TABLENAME text, FILENAME text)
RETURNS character varying AS
$BODY$
DECLARE
can_upload integer;
BEGIN
select count (*)
into can_upload
from upload_permissions p
where p.user_name = current_user and p.table_name = TABLENAME;
if can_upload = 0 then
return 'Permission denied';
end if;
execute 'copy ' || TABLENAME ||
' from ''' || FILENAME || '''' ||
' csv';
return '';
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;