我有一个PostgreSQL的AWS
RDS实例,在该实例中,我需要SQL
使用dblink_connect(text)
并且dblink_exec(text)
以该postgres
角色(我创建的)登录时在函数内执行一条语句。
CREATE OR REPLACE FUNCTION application.create_tenant_schemas(first integer, last integer) RETURNS void AS
DECLARE
tenant VARCHAR;
sql VARCHAR;
BEGIN
FOR index IN first..last LOOP
tenant := 'tenant_' || to_char(index, 'FM00000');
sql := 'CREATE SCHEMA ' || quote_ident(tenant);
RAISE NOTICE '%', sql;
PERFORM dblink_connect('dbname=application user=postgres');
PERFORM dblink_exec(sql);
PERFORM dblink_disconnect();
END LOOP;
END;
$BODY$
LANGUAGE plpgsql;
的dblink_exec()
是生产以下错误消息:
[2F003] ERROR: password is required
Detail: Non-superusers must provide a password in the connection string.
Where: SQL statement "SELECT dblink_connect('dbname=application user=postgres')"
我找到了建议使用的答案dblink_connect_u(text)
。当我尝试这样做时,我收到以下错误消息:
[42501] ERROR: permission denied for function dblink_connect_u
Where: SQL statement "SELECT dblink_connect_u('dbname=application user=postgres')"
在AWS上,如何授予创建RDS实例的用户执行功能的权限dblink_connect_u()
?我尝试了以下操作,但未成功:
GRANT EXECUTE ON FUNCTION dblink_connect_u(text) TO postgres;
GRANT EXECUTE ON FUNCTION dblink_connect_u(text, text) TO postgres;
看来我的postgres
用户需要superuser
我显然无法在AWS上获得的权限。
我也曾使用%APPDATA%\postgresql\pgpass.conf
(在Windows上)提供密码,dblink_connect(text)
但dblink_connect(text)
显然忽略了该文件。
我能够使用硬编码的密码字符串来调用dblink_connect(text)
,如下所示:
PERFORM "pascal"."dblink_connect_u"('dbname=pascal user=postgres password=secret');
…最终,由于密码的硬编码,因此这不是可接受的解决方案。
有没有人对如何使RDS PostgreSQL使用密码文件或允许我提供建议,GRANT EXECUTE ON FUNCTION dblink_connect_u(text)
或者还有我没有遇到的另一种选择?
更新
链接到PostgreSQL文档,以尝试设置外部数据包装器/服务器,在其中存储正在执行的用户的密码 dblink_connect(text)
创建服务器
创建外部数据包装器
创建用户映射
结论
CREATE SERVER "password_server" FOREIGN DATA WRAPPER "dblink_fdw"
OPTIONS (dbname 'application');
CREATE USER MAPPING FOR "postgres"
SERVER "password_server"
OPTIONS (user 'postgres', password 'pa55VV0&d');
…不同的源文件…
CREATE OR REPLACE FUNCTION application.create_tenant_schemas(first integer, last integer) RETURNS VOID AS $$
DECLARE
tenant VARCHAR;
sql VARCHAR;
BEGIN
FOR index IN first..last LOOP
tenant := 'tenant_' || to_char(index, 'FM00000');
sql := 'CREATE SCHEMA ' || quote_ident(tenant);
RAISE NOTICE '%', sql;
PERFORM "dblink_connect"('password_server');
PERFORM "dblink_exec"(sql);
PERFORM "dblink_disconnect"();
END LOOP;
END;
$BODY$
LANGUAGE plpgsql;
您可以创建用户映射:
create server application_srv foreign data wrapper dblink_fdw OPTIONS (...
;create user mapping FOR app_user SERVER application_srv OPTIONS (user 'user_to_connect', password 'password goes here');
application_srv
在dblink连接中使用的名称:。
t# select * from dblink('application_srv','select max(t) from t') as t(m timestamp(0));
m
---------------------
2017-06-13 11:41:05
(1 row)
现在,密码将以纯文本形式显示pg_user_mappings
(pg_user_mapping
RDS中的任何人都不能选择该密码),但实际的通行证将仅显示给rds_superuser
问题内容: 问: 在SQL脚本或存储过程中,避免幻数或硬编码值还有哪些其他策略? 考虑一个存储过程,该存储过程的工作是根据其或某些其他FK查找表或值的范围来检查/更新记录的值。 考虑一个表,其中ID最重要,因为它是另一个表的FK: 应避免的SQL脚本 如下所示 : 这里的问题是,这不是可移植的,并且显式依赖于硬编码的值。在将其部署到另一个没有标识插入的环境时,存在细微的缺陷。 还尝试避免基于文本的
我正在尝试找到一种使用私钥加密字符串并使用公钥解密它的方法。我使用OpenSSL生成密钥,如下所述: http://www.akadia.com/services/ssh_test_certificate.html 这就是我目前拥有的 然而,在< code>ImportPublicKey方法上,我得到一个异常< code>ASN1损坏数据 传递给该方法的字符串具有以下格式: @“MIICXWIBA
问题内容: 我正在编程一个通用的缓存机制,我需要在结构中设置一些属性,这些结构只知道它们的reflect.Type,属性名称和reflect.Value可以在属性中设置,但我无法避免类型断言,这使得我的代码不是通用的… 前往Playground解决问题(通过硬编码类型断言工作)… 前往Playground解决问题(不适用于未知界面) 问题答案: 最终,我找到了一种方法。请遵循下面的Go Playg
目前,我们正在使用Checkmarx扫描应用程序代码。不确定Checkmarx是否检测/扫描源代码中的任何硬编码密码。是否需要在Checkmarx服务器上添加任何额外的配置来检测密码?
我应该如何用Spring Data REST自动编码我的实体的Subbmissibed纯密码字段? 在setter方法上使用@projection和SpEL是可能的吗?
Java为URL编码字符串提供了类。但是将密码存储为字符串被认为是不安全的。通过输出流通过POST发送密码的代码是否足够安全? 一方面,它在使用字符串。另一方面,这些字符串只有1个字符长,编码后在概念上是相同的。而且,在我看来,这可能会在多字节字符上失败。攻击者是否能够在内存中找到这些1-char字符串并重建原始密码?有没有更好的办法做到这一点?