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

【译】CockroachDB 与 MIT Kerberos 使用本机客户端

原创 Ellison 2022-06-02
800

原文地址: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 成为可能的软件包。

  1. CockroachDB With MIT Kerberos
  2. CockroachDB With Active Directory
  3. CockroachDB With MIT Kerberos and Docker Compose
  4. Executing CockroachDB table import via GSSAPI
  5. CockroachDB With SQLAlchemy and MIT Kerberos
  6. CockroachDB With MIT Kerberos Cert User Authentication
  7. CockroachDB with Django and MIT Kerberos
  8. CockroachDB With Kerberos and Custom Service Principal Name (SPN)
  9. 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.sh


You 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.009s


Check检查应用程序的状态


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 bash



root@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 -V



Using 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=lb



SET 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.log



I201001 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 的一般版本即将发布!

如果您觉得本教程有用,请给我留言或在评论中给我反馈。

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

评论