mirror of https://github.com/citusdata/citus.git
Allow providing "host" parameter via citus.node_conninfo (#7541)
And when that is the case, directly use it as "host" parameter for the
connections between nodes and use the "hostname" provided in
pg_dist_node / pg_dist_poolinfo as "hostaddr" to avoid host name lookup.
This is to avoid allowing dns resolution (and / or setting up DNS names
for each host in the cluster). This already works currently when using
IPs in the hostname. The only use of setting host is that you can then
use sslmode=verify-full and it will validate that the hostname matches
the certificate provided by the node you're connecting too.
It would be more flexible to make this a per-node setting, but that
requires SQL changes. And we'd like to backport this change, and
backporting such a sql change would be quite hard while backporting this
change would be very easy. And in many setups, a different hostname for
TLS validation is actually not needed. The reason for that is
query-from-any node: With query-from-any-node all nodes usually have a
certificate that is valid for the same "cluster hostname", either using
a wildcard cert or a Subject Alternative Name (SAN). Because if you load
balance across nodes you don't know which node you're connecting to, but
you still want TLS validation to do it's job. So with this change you
can use this same "cluster hostname" for TLS validation within the
cluster. Obviously this means you don't validate that you're connecting
to a particular node, just that you're connecting to one of the nodes in
the cluster, but that should be fine from a security perspective (in
most cases).
Note to self: This change requires updating
https://docs.citusdata.com/en/latest/develop/api_guc.html#citus-node-conninfo-text.
DESCRIPTION: Allows overwriting host name for all inter-node connections
by supporting "host" parameter in citus.node_conninfo
(cherry picked from commit 3586aab17a
)
pull/7588/head
parent
9b06d02c43
commit
452564c19b
|
@ -267,9 +267,24 @@ GetConnParams(ConnectionHashKey *key, char ***keywords, char ***values,
|
|||
* We allocate everything in the provided context so as to facilitate using
|
||||
* pfree on all runtime parameters when connections using these entries are
|
||||
* invalidated during config reloads.
|
||||
*
|
||||
* Also, when "host" is already provided in global parameters, we use hostname
|
||||
* from the key as "hostaddr" instead of "host" to avoid host name lookup. In
|
||||
* that case, the value for "host" becomes useful only if the authentication
|
||||
* method requires it.
|
||||
*/
|
||||
bool gotHostParamFromGlobalParams = false;
|
||||
for (Size paramIndex = 0; paramIndex < ConnParams.size; paramIndex++)
|
||||
{
|
||||
if (strcmp(ConnParams.keywords[paramIndex], "host") == 0)
|
||||
{
|
||||
gotHostParamFromGlobalParams = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
const char *runtimeKeywords[] = {
|
||||
"host",
|
||||
gotHostParamFromGlobalParams ? "hostaddr" : "host",
|
||||
"port",
|
||||
"dbname",
|
||||
"user",
|
||||
|
|
|
@ -2892,6 +2892,7 @@ NodeConninfoGucCheckHook(char **newval, void **extra, GucSource source)
|
|||
#if defined(ENABLE_GSS) && defined(ENABLE_SSPI)
|
||||
"gsslib",
|
||||
#endif
|
||||
"host",
|
||||
"keepalives",
|
||||
"keepalives_count",
|
||||
"keepalives_idle",
|
||||
|
|
|
@ -520,5 +520,61 @@ show citus.node_conninfo;
|
|||
|
||||
-- Should work again
|
||||
ALTER TABLE test ADD COLUMN e INT;
|
||||
-- show that we allow providing "host" param via citus.node_conninfo
|
||||
ALTER SYSTEM SET citus.node_conninfo = 'sslmode=require host=nosuchhost';
|
||||
SELECT pg_reload_conf();
|
||||
pg_reload_conf
|
||||
---------------------------------------------------------------------
|
||||
t
|
||||
(1 row)
|
||||
|
||||
SELECT pg_sleep(0.1);
|
||||
pg_sleep
|
||||
---------------------------------------------------------------------
|
||||
|
||||
(1 row)
|
||||
|
||||
-- fails due to invalid host
|
||||
SELECT COUNT(*)>=0 FROM test;
|
||||
WARNING: connection to the remote node postgres@localhost:xxxxx failed with the following error: could not parse network address "localhost": Name or service not known
|
||||
ERROR: connection to the remote node postgres@localhost:xxxxx failed with the following error: could not parse network address "localhost": Name or service not known
|
||||
SELECT array_agg(nodeid) as updated_nodeids from pg_dist_node WHERE nodename = 'localhost' \gset
|
||||
UPDATE pg_dist_node SET nodename = '127.0.0.1' WHERE nodeid = ANY(:'updated_nodeids'::int[]);
|
||||
ALTER SYSTEM SET citus.node_conninfo = 'sslmode=require host=localhost';
|
||||
SELECT pg_reload_conf();
|
||||
pg_reload_conf
|
||||
---------------------------------------------------------------------
|
||||
t
|
||||
(1 row)
|
||||
|
||||
SELECT pg_sleep(0.1);
|
||||
pg_sleep
|
||||
---------------------------------------------------------------------
|
||||
|
||||
(1 row)
|
||||
|
||||
-- works when hostaddr is specified in pg_dist_node after providing host in citus.node_conninfo
|
||||
SELECT COUNT(*)>=0 FROM test;
|
||||
?column?
|
||||
---------------------------------------------------------------------
|
||||
t
|
||||
(1 row)
|
||||
|
||||
-- restore original nodenames into pg_dist_node
|
||||
UPDATE pg_dist_node SET nodename = 'localhost' WHERE nodeid = ANY(:'updated_nodeids'::int[]);
|
||||
-- reset it
|
||||
ALTER SYSTEM RESET citus.node_conninfo;
|
||||
select pg_reload_conf();
|
||||
pg_reload_conf
|
||||
---------------------------------------------------------------------
|
||||
t
|
||||
(1 row)
|
||||
|
||||
select pg_sleep(0.1); -- wait for config reload to apply
|
||||
pg_sleep
|
||||
---------------------------------------------------------------------
|
||||
|
||||
(1 row)
|
||||
|
||||
DROP SCHEMA node_conninfo_reload CASCADE;
|
||||
NOTICE: drop cascades to table test
|
||||
|
|
|
@ -205,4 +205,30 @@ show citus.node_conninfo;
|
|||
-- Should work again
|
||||
ALTER TABLE test ADD COLUMN e INT;
|
||||
|
||||
-- show that we allow providing "host" param via citus.node_conninfo
|
||||
ALTER SYSTEM SET citus.node_conninfo = 'sslmode=require host=nosuchhost';
|
||||
SELECT pg_reload_conf();
|
||||
SELECT pg_sleep(0.1);
|
||||
|
||||
-- fails due to invalid host
|
||||
SELECT COUNT(*)>=0 FROM test;
|
||||
|
||||
SELECT array_agg(nodeid) as updated_nodeids from pg_dist_node WHERE nodename = 'localhost' \gset
|
||||
UPDATE pg_dist_node SET nodename = '127.0.0.1' WHERE nodeid = ANY(:'updated_nodeids'::int[]);
|
||||
|
||||
ALTER SYSTEM SET citus.node_conninfo = 'sslmode=require host=localhost';
|
||||
SELECT pg_reload_conf();
|
||||
SELECT pg_sleep(0.1);
|
||||
|
||||
-- works when hostaddr is specified in pg_dist_node after providing host in citus.node_conninfo
|
||||
SELECT COUNT(*)>=0 FROM test;
|
||||
|
||||
-- restore original nodenames into pg_dist_node
|
||||
UPDATE pg_dist_node SET nodename = 'localhost' WHERE nodeid = ANY(:'updated_nodeids'::int[]);
|
||||
|
||||
-- reset it
|
||||
ALTER SYSTEM RESET citus.node_conninfo;
|
||||
select pg_reload_conf();
|
||||
select pg_sleep(0.1); -- wait for config reload to apply
|
||||
|
||||
DROP SCHEMA node_conninfo_reload CASCADE;
|
||||
|
|
Loading…
Reference in New Issue