原文地址:CockroachDB With MIT Kerberos Using a Native Clien
原文作者 阿尔乔姆·埃尔维茨
CockroachDB 与 MIT Kerberos 使用本机客户端
在 20.2 版本中,我们的工程已经将 GSSAPI 支持直接构建到 Cockroach 二进制文件中,这就是我今天要演示的内容。
涵盖 CockroachDB 和 Kerberos 的文章
我发现 Kerberos 的主题非常有趣,我的同事通常会向我寻求有关这个复杂主题的帮助。我绝不是 Kerberos 方面的专家,但我对它足够熟悉以至于很危险。也就是说,我已经写了多篇关于这个主题的文章,你可以在下面找到:
在 20.1 版本之前,CockroachDB 缺少一个本地 GSSAPI 客户端来与启用 Kerberos 的集群进行交互。用户被迫使用psql连接等工具。从 20.2 版本开始,我们的工程已经将 GSSAPI 支持直接构建到cockroach二进制文件中,这就是我今天要演示的内容。这里的直接好处是我们可以保持我们的表面积小和“内部”。用户不再需要安装任何第三方客户端即可将 Kerberos 与 CockroachDB 结合使用。
对于今天的设置,我有一个多节点 CockroachDB 集群、一个负载均衡器、Keberos 分发中心和一个客户端容器,它运行与我的 CockroachDB 容器相同的软件以及krb5-user使 Kerberos 成为可能的软件包。
- CockroachDB With MIT Kerberos
- CockroachDB With Active Directory
- CockroachDB With MIT Kerberos and Docker Compose
- Executing CockroachDB table import via GSSAPI
- CockroachDB With SQLAlchemy and MIT Kerberos
- CockroachDB With MIT Kerberos Cert User Authentication
- CockroachDB with Django and MIT Kerberos
- CockroachDB With Kerberos and Custom Service Principal Name (SPN)
- Simplifying CockroachDB Kerberos Architecture With a Load Balancer
在 20.1 版本之前,CockroachDB 缺少一个本地 GSSAPI 客户端来与启用 Kerberos 的集群进行交互。用户被迫使用psql连接等工具。从 20.2 版本开始,我们的工程已经将 GSSAPI 支持直接构建到cockroach二进制文件中,这就是我今天要演示的内容。这里的直接好处是我们可以保持我们的表面积小和“内部”。用户不再需要安装任何第三方客户端即可将 Kerberos 与 CockroachDB 结合使用。
对于今天的设置,我有一个多节点 CockroachDB 集群、一个负载均衡器、Keberos 分发中心和一个客户端容器,它运行与我的 CockroachDB 容器相同的软件以及krb5-user使 Kerberos 成为可能的软件包。
克隆回购
git clone https://github.com/dbist/cockroach-docker
cd cockroach-docker/cockroach-gssapi-multinode
启动应用程序
./up.shYou s您应该会看到与此类似的输出:
Creating roach-cert ... done
Creating kdc ... done
Creating roach-0 ... done
Creating roach-1 ... done
Creating roach-2 ... done
Creating lb ... done
Creating client ... done
Cluster successfully initialized
CREATE ROLE
Time: 0.006s
GRANT
Time: 0.031s
SET CLUSTER SETTING
Time: 0.009s
SET CLUSTER SETTING
Time: 0.012s
SET CLUSTER SETTING
Time: 0.017s
SET CLUSTER SETTING
Time: 0.009sCheck检查应用程序的状态
docker-compose ps Name Command State Ports
----------------------------------------------------------------------------------------------------------------------------------------
client /start.sh Up 26257/tcp, 8080/tcp
kdc /start.sh Up
lb /docker-entrypoint.sh hapr ... Up 0.0.0.0:26257->26257/tcp, 5432/tcp, 0.0.0.0:8080->8080/tcp, 0.0.0.0:8081->8081/tcp
roach-0 /cockroach/cockroach.sh st ... Up 26257/tcp, 8080/tcp
roach-1 /cockroach/cockroach.sh st ... Up 26257/tcp, 8080/tcp
roach-2 /cockroach/cockroach.sh st ... Up 26257/tcp, 8080/tcp
roach-cert /bin/sh -c tail -f /dev/null Up连接到客户端
作为第一步,让我们确认我们的 Kerberos 票证缓存是空的,如果不是,则将其清空:
docker exec -it client bashroot@client:/cockroach# kdestroy
root@client:/cockroach# klist
klist: No credentials cache found (filename: /tmp/krb5cc_0)现在使用 Kerberos 中的有效用户tester,让我们连接到 cockroach 客户端:
cockroach sql --certs-dir=/certs --host=lb --user=tester#
# Welcome to the CockroachDB SQL shell.
# All statements must be terminated by a semicolon.
# To exit, type: \q.
#
ERROR: pq: kerberos error: open /tmp/krb5cc_0: no such file or directory
Failed running "sql"让我们以测试人员的身份启动并重试:
root@client:/cockroach# kinit tester
Password for tester@EXAMPLE.COM:#
# Welcome to the CockroachDB SQL shell.
# All statements must be terminated by a semicolon.
# To exit, type: \q.
#
# Server version: CockroachDB CCL v20.2.0-beta.3 (x86_64-unknown-linux-gnu, built 2020/09/30 15:28:26, go1.13.14) (same version as client)
# Cluster ID: 5a82619c-de6e-41ec-981d-fee49ccbb817
# Organization: Cockroach Labs - Production Testing
#
# Enter \? for a brief introduction.
#
tester@lb:26257/defaultdb>事实上,让我们跟踪 Kerberos 连接,注意,它会提示输入密码:
docker exec -it client bash
KRB5_TRACE=/dev/stdout kinit -VUsing principal: tester@EXAMPLE.COM
[383] 1601565470.993071: Getting initial credentials for tester@EXAMPLE.COM
[383] 1601565470.993228: Sending request (191 bytes) to EXAMPLE.COM
[383] 1601565470.993279: Resolving hostname kdc
[383] 1601565470.994352: Sending initial UDP request to dgram 172.28.1.3:88
[383] 1601565470.995122: Received answer (749 bytes) from dgram 172.28.1.3:88
[383] 1601565470.995167: Response was not from master KDC
[383] 1601565470.995229: Processing preauth types: 19
[383] 1601565470.995266: Selected etype info: etype aes256-cts, salt "EXAMPLE.COMtester", params ""
[383] 1601565470.995273: Produced preauth for next request: (empty)
[383] 1601565470.995277: Getting AS key, salt "EXAMPLE.COMtester", params ""
Password for tester@EXAMPLE.COM:
[383] 1601565574.73615: AS key obtained from gak_fct: aes256-cts/CD86
[383] 1601565574.73704: Decrypted AS reply; session key is: aes256-cts/459F
[383] 1601565574.73739: FAST negotiation: available
[383] 1601565574.73757: Initializing FILE:/tmp/krb5cc_0 with default princ tester@EXAMPLE.COM
[383] 1601565574.73928: Storing tester@EXAMPLE.COM -> krbtgt/EXAMPLE.COM@EXAMPLE.COM in FILE:/tmp/krb5cc_0
[383] 1601565574.74026: Storing config in FILE:/tmp/krb5cc_0 for krbtgt/EXAMPLE.COM@EXAMPLE.COM: fast_avail: yes
[383] 1601565574.74097: Storing tester@EXAMPLE.COM -> krb5_ccache_conf_data/fast_avail/krbtgt\/EXAMPLE.COM\@EXAMPLE.COM@X-CACHECONF: in FILE:/tmp/krb5cc_0
Authenticated to Kerberos v5这基本上告诉我们使用 KDC 的 Kerberos 身份验证有效,但它不能确认 CockroachDB 的身份验证确实有效。20.1 引入Authentication Logs,通过启用该属性,我们可以诊断 CockroachDB 级别的身份验证。
让我们以 root 身份连接,因为此属性需要管理员权限,我没有创建tester管理员用户,并且 root 是我在数据库中唯一的其他用户。
cockroach sql --certs-dir=/certs --host=lbSET CLUSTER SETTING server.auth_log.sql_connections.enabled = true;
SET CLUSTER SETTING server.auth_log.sql_sessions.enabled = true;SET CLUSTER SETTING
Time: 0.025s total (exec 97.1% / net 2.2% / other 0.7%)现在我们可以导航到节点的日志目录之一并检查cockroach-auth日志文件。
grep tester /cockroach/cockroach-data/logs/cockroach-auth.logI201001 15:38:25.393199 113334 sql/pgwire/auth.go:335 ⋮ [n1,client=‹172.28.1.7:36718›,hostssl,user=‹tester›] 5 connection matches HBA rule: ‹host all all all gss include_realm=0›
I201001 15:38:25.399242 113334 sql/pgwire/auth.go:335 ⋮ [n1,client=‹172.28.1.7:36718›,hostssl,user=‹tester›] 6 authentication succeeded
I201001 15:39:30.301827 113333 sql/pgwire/conn.go:229 ⋮ [n1,client=‹172.28.1.7:36718›,hostssl,user=‹tester›] 7 session terminated; duration: 1m4.911381401s
如果您没有看到该消息,请尝试tester再次使用该用户登录 Cockroach。
使用 --url 标志连接到客户端
如果您的组织策略要求 SPN 不默认为postgres,CockroachDB 支持krbsrvname在 Postgresql 中以相同场景建模的参数。不幸的是,不使用--url标志就无法传递参数。
假设您退出了容器,使用--url参数进行连接的命令将如下所示:
docker exec -it client cockroach sql \
--certs-dir=/certs --host=lb --url "postgresql://tester:nopassword@lb:26257/defaultdb?sslmode=verify-full&sslrootcert=/certs/ca.crt"在单独的窗口中,检查roach-0日志以确保身份验证仍然成功:
I201001 15:51:16.036170 139125 sql/pgwire/auth.go:335 ⋮ [n1,client=‹172.28.1.7:41378›,hostssl,user=‹tester›] 10 connection matches HBA rule: ‹host all all all gss include_realm=0›
I201001 15:51:16.042798 139125 sql/pgwire/auth.go:335 ⋮ [n1,client=‹172.28.1.7:41378›,hostssl,user=‹tester›] 11 authentication succeeded现在让我们修改命令以包含krbsrvname参数:
cockroach sql \
--certs-dir=/certs --url "postgresql://tester:nopassword@lb:26257/defaultdb?sslmode=verify-full&sslrootcert=/certs/ca.crt&krbsrvname=customspn"
在身份验证日志中添加了krbsrvname.
为了确认krbsrvname参数生效,让我们传递一个虚拟值:
cockroach sql \
--certs-dir=/certs --url "postgresql://tester:nopassword@lb:26257/defaultdb?sslmode=verify-full&sslrootcert=/certs/ca.crt&krbsrvname=dummy"Flag --insecure has been deprecated, it will be removed in a subsequent release.
For details, see: https://go.crdb.dev/issue-v/53404/v20.2
#
# 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: "kerberos error (InitSecContext): [Root cause: KDC_Error] KDC_Error: TGS Exchange Error: kerberos error response from KDC when requesting for dummy/lb: KRB Error: (7) KDC_ERR_S_PRINCIPAL_UNKNOWN Server not found in Kerberos database - LOOKING_UP_SERVER"
Failed running "sql"
返回身份验证日志:
I201001 15:54:48.026974 146168 sql/pgwire/auth.go:335 ⋮ [n1,client=‹172.28.1.7:42662›,hostssl,user=‹tester›] 15 connection matches HBA rule: ‹host all all all gss include_realm=0›
I201001 15:54:48.032162 146168 sql/pgwire/auth.go:335 ⋮ [n1,client=‹172.28.1.7:42662›,hostssl,user=‹tester›] 16 authentication failed: client didn't send required auth data
I201001 15:54:48.033291 146167 sql/pgwire/conn.go:229 ⋮ [n1,client=‹172.28.1.7:42662›,hostssl,user=‹tester›] 17 session terminated; duration: 9.444174ms
这是 CockroachDB 中新的 authN 功能的简短概述。在这一点上,我们可以放弃我们信任psql的客户端并使用本机二进制文件。这可以减少攻击面并降低部署的运营成本。20.2 的一般版本即将发布!
如果您觉得本教程有用,请给我留言或在评论中给我反馈。




