暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

DNS Gotchas与CockroachDB和GSS-API

原创 eternity 2022-08-12
1025

我们刚刚推出了CockroachDB的新版本,Postgres最近也发布了一个影响GSS的漏洞。我想这是一个很好的时机,可以用最新版本的Postgres和Cockroach更新我的回购协议,从而测试一切是否正常。我发现了一个很容易修复的问题,但它改变了cockroach和psql客户端的行为。

高级步骤

1.使用GSSAPI在Docker中启动一个三节点蟑螂数据库集群。

2.演示问题场景。

3.验证

逐步说明

启动群集

本教程没有什么比我以前的教程更特别的了。您可以随意设置一个独立的环境来跟进或使用我的docker compose环境。

演示问题场景

使用psql客户端,我们应该能够毫不费事地连接到CockroachDB。

 psql "postgresql://lb:26257/defaultdb?sslmode=verify-full&sslrootcert=/certs/ca.crt" -U testerpsql (14.1, server 13.0.0)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_128_GCM_SHA256, bits: 128, compression: off)
Type "help" for help.

defaultdb=> 

我们通过传递参数来完成同样的事情。

 psql "host=lb port=26257 dbname=defaultdb user=tester"

如果我们尝试使用本地CockroachDB 客户端连接到CockroachDB数据库,我们现在会收到一个错误:

cockroach sql \
 --certs-dir=/certs --url  "postgresql://tester:nopassword@lb:26257/defaultdb?sslmode=verify-full&sslrootcert=/certs/ca.crt
#
# Welcome to the CockroachDB SQL shell.
# All statements must be terminated by a semicolon.
# To exit, type: \q.
#
ERROR: pq: failed to get Kerberos ticket: "lookup lb: DNS response contained records which contain invalid names"
Failed running "sql"

在进行了各种搜索之后,有人建议开始研究DNS。我使用PGHOST和PGHOSTADDR环境变量禁用DNS查找,后者会破坏蟑螂客户端。在所有失败的尝试之后,我决定从hosts文件中删除lb的/etc/hosts条目。

验证

更新主机文件后:

[root@client cockroach]# cockroach sql  --certs-dir=/certs --url  "postgresql://tester:nopassword@lb:26257/defaultdb?sslmode=verify-full&sslrootcert=/certs/ca.crt"
#
# Welcome to the CockroachDB SQL shell.
# All statements must be terminated by a semicolon.
# To exit, type: \q.
#
# Server version: CockroachDB CCL v21.2.0 (x86_64-unknown-linux-gnu, built 2021/11/15 13:58:04, go1.16.6) (same version as client)
# Cluster ID: 52be92b5-8fdf-41d9-889c-004b87e82a4e
# Organization: Cockroach Labs - Production Testing
#
# Enter \? for a brief introduction.
#
tester@lb:26257/defaultdb> 

我们还可以使用该命令的简化版本。

cockroach sql --certs-dir=/certs --host=lb --user=tester

现在让我们看看psql的相反效果。

[root@client cockroach]# psql "host=lb port=26257 dbname=defaultdb user=tester"psql: error: connection to server at "lb" (172.28.0.6), port 26257 failed: connection to server at "lb" (172.28.0.6), port 26257 failed: GSSAPI continuation error: Unspecified GSS failure.  Minor code may provide more information: Server krbtgt/COCKROACH-GSSAPI-MULTINODE_ROACHNET@EXAMPLE.COM not found in Kerberos database

顺便说一下,psql希望主机文件中有一个条目用于DNS查找。CockroachDB还要求主机名可以通过DNS或/etc/hosts解析。

使用主机名时,请确保正确解析(例如,通过DNS或/etc/hosts)。特别是,在未指定播发地址时,请注意通过–advision addr或通过–listen addr播发给其他节点的值。

在当前情况下,用户必须决定是否要继续使用psql,在这种情况下,他们必须在主机文件中为服务主体保留一个条目,或者在没有关联主机条目的情况下使用蟑螂客户端。

更新:我进一步研究了这一点,当我们的一位杰出工程师提示lb主机名是否为有效主机名时,我开始进一步试验。

我安装了bind-utils并查看了dig-lb的输出:

; <<>> DiG 9.11.26-RedHat-9.11.26-6.el8 <<>> lb
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24522
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;lb.                            IN      A

;; ANSWER SECTION:
lb.                     600     IN      A       172.28.0.6

;; Query time: 0 msec
;; SERVER: 127.0.0.11#53(127.0.0.11)
;; WHEN: Wed Nov 24 16:41:04 UTC 2021
;; MSG SIZE  rcvd: 38

这看起来像胡言乱语,我有点难以理解,所以我采取了不同的方法。

查看原始错误消息(错误:pq:无法获取Kerberos票证:“lookup lb:DNS响应包含包含无效名称的记录”),我在Go repo中找到了代码。

//errMalformednsrecordsdetail是解析程序.Lookup…//方法接收到包含无效DNS名称的DNS记录时返回的DNSError详细信息。这可能会与//结果一起返回,这些结果过滤掉了格式错误的记录。

关于错误主机名的直觉仍然成立。我决定在提到的每个名称实例中将lb hostname更改为lb.local,我很高兴地报告,在不更改/etc/hosts和从文件中删除条目的情况下,它仍然适用于两个客户端。

psql "host=lb.local port=26257 dbname=defaultdb user=tester"
psql (14.1, server 13.0.0)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_128_GCM_SHA256, bits: 128, compression: off)
Type "help" for help.

defaultdb=> 
psql "postgresql://lb.local:26257/defaultdb?sslmode=verify-full&sslrootcert=/certs/ca.crt" -U tester
psql (14.1, server 13.0.0)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_128_GCM_SHA256, bits: 128, compression: off)
Type "help" for help.

defaultdb=> 
cockroach sql --host=lb.local --certs-dir=/certs --user tester
#
# Welcome to the CockroachDB SQL shell.
# All statements must be terminated by a semicolon.
# To exit, type: \q.
#
# Server version: CockroachDB CCL v21.2.0 (x86_64-unknown-linux-gnu, built 2021/11/15 13:58:04, go1.16.6) (same version as client)
# Cluster ID: f721b8dc-66a5-4909-82b4-a8c18738a21d
# Organization: Cockroach Labs - Production Testing
#
# Enter \? for a brief introduction.
#
tester@lb.local:26257/defaultdb> 
cockroach sql \
>  --certs-dir=/certs --url  "postgresql://tester:nopassword@lb.local:26257/defaultdb?sslmode=verify-full&sslrootcert=/certs/ca.crt&krbsrvname=customspn"
#
# Welcome to the CockroachDB SQL shell.
# All statements must be terminated by a semicolon.
# To exit, type: \q.
#
# Server version: CockroachDB CCL v21.2.0 (x86_64-unknown-linux-gnu, built 2021/11/15 13:58:04, go1.16.6) (same version as client)
# Cluster ID: f721b8dc-66a5-4909-82b4-a8c18738a21d
# Organization: Cockroach Labs - Production Testing
#
# Enter \? for a brief introduction.
#
tester@lb.local:26257/defaultdb> 

最后,让我困惑的是,我仍然可以做到以下几点:

psql "host=lb port=26257 dbname=defaultdb user=tester"psql (14.1, server 13.0.0)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_128_GCM_SHA256, bits: 128, compression: off)
Type "help" for help.

defaultdb=> 

注意host=lb,但我不能这样做:

psql "postgresql://lb:26257/defaultdb?sslmode=verify-full&sslrootcert=/certs/ca.crt" -U tester
psql: error: connection to server at "lb" (172.28.0.6), port 26257 failed: connection to server at "lb" (172.28.0.6), port 26257 failed: server certificate for "roach-0" (and 1 other name) does not match host name "lb"

有关CockroachDB和Kerberos的文章

我发现Kerberos的主题非常有趣,我的同事通常会向我求助于这个复杂的主题。我决不是Kerberos方面的专家,但我对它非常熟悉,因此非常危险。也就是说,我已经写了多篇关于这个主题的文章,你可以在我的个人资料中找到。

原文标题:DNS Gotchas With CockroachDB and GSS-API
原文作者:Artem Ervits
原文链接:https://dzone.com/articles/dns-gotchas-with-cockroachdb-and-gssapi

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论