kafka的ACL配置的sasl.kerberos.principal.to.local.rules配置解释

news/2025/2/26 6:24:35

kafka配置acl认证的用户名转换规则

  • 1、Kerberos中的介绍
  • 2、自定义sasl user name
  • 3、自定义ssl 的用户名
  • 4、关于kafka配置kerberos以及开启acl的实践

1、Kerberos中的介绍

Kerberos 关于此配置项的解释
https://web.mit.edu/Kerberos/krb5-latest/doc/admin/conf_files/krb5_conf.html 中的 auth_to_local

2、自定义sasl user name

https://kafka.apache.org/documentation/#security_authz

规则模板:

RULE:[n:string](regexp)s/pattern/replacement/g/L

官网规则示例:

sasl.kerberos.principal.to.local.rules=RULE:[1:$1@$0](.*@MYDOMAIN.COM)s/@.*//,DEFAULT

详见kafka的源码 org.apache.kafka.common.security.kerberos.KerberosRule#apply

String apply(String[] params) throws IOException {
    String result = null;
    if (isDefault) {
        if (defaultRealm.equals(params[0])) {
            result = params[1];
        }
    } else if (params.length - 1 == numOfComponents) {
        String base = replaceParameters(format, params);
        if (match == null || match.matcher(base).matches()) {
            if (fromPattern == null) {
                result = base;
            } else {
                result = replaceSubstitution(base, fromPattern, toPattern,  repeat);
            }
        }
    }
    if (result != null && NON_SIMPLE_PATTERN.matcher(result).find()) {
        throw new NoMatchingRule("Non-simple name " + result + " after auth_to_local rule " + this);
    }
    if (toLowerCase && result != null) {
        result = result.toLowerCase(Locale.ENGLISH);
    } else if (toUpperCase && result != null) {
        result = result.toUpperCase(Locale.ENGLISH);
    }

    return result;
}

传入参数为:

if (kerberosName.hostName() == null) {
    // if it is already simple, just return it
    if (kerberosName.realm() == null)
        return kerberosName.serviceName();
    params = new String[]{kerberosName.realm(), kerberosName.serviceName()};
} else {
    params = new String[]{kerberosName.realm(), kerberosName.serviceName(), kerberosName.hostName()};
}

其中realm为域名,serviceName为用户名,hostName为主机名
通过源码可以看到其中的$0 $1 $2 并不是后面regexp正则匹配后的反引用,而是配置的 Kerberos 主体(principal)
整个规则理解为将 Kerberos 主体(principal)映射到本地用户名(local principal)的转换规则
其中解释顺序为:

  1. 组装string
  2. 验证组装的string是否匹配regexp
  3. 将组装的string进行正则替换,将pattern替换为replacement,根据是否配置/g确定是替换1次还是替换所有
  4. 将最终结果转换为大写或者小写

综上,regexp仅用于了开始组装结果的校验,并没有进行值的提取(建立引用)

示例结果

servicename=tkgup
realm=qq.com

经过RULE:[1:$1@$0](.*@qq.com)s/@.*//后,得到string为tkgup@qq.com,验证符合regexp,再经过后面正则查找替换得到:tkgup

3、自定义ssl 的用户名

规则模板:

RULE:pattern/replacement/[LU]

规则示例:

RULE:^.*[Cc][Nn]=([a-zA-Z0-9.]*).*$/$1/L,DEFAULT

具体解析见:
org.apache.kafka.common.security.ssl.SslPrincipalMapper.Rule#apply
解释顺序为:

  1. 将distinguishedName:principal.getName()正则pattern替换为replacement,会解析反引用,如$1、$2
  2. 将最终结果转换为大写或者小写

在此规则下:
tkgup.cn=tkgup666@qq.com => tkgup666

kafkakerberosacl_104">4、关于kafka配置kerberos以及开启acl的实践

参考:Kafka配置Kerberos安全认证及与Java程序集成
参考:kafka 配置kerberos校验以及开启acl实践 https://cloud.tencent.com/developer/article/1593946
参考:Kafka配置kerberos安全认证


http://www.niftyadmin.cn/n/5868195.html

相关文章

学习Flask:Day 1:基础搭建

学习目标&#xff1a;完成第一个Flask应用 # app.py from flask import Flask app Flask(__name__)app.route(/) def home():return <h1>Hello Flask!</h1>app.route(/api/greet/<name>) def greet(name):return {message: fHello {name}!}if __name__ __…

STM32——HAL库开发笔记24(定时器5—超声波测距)(参考来源:b站铁头山羊)

一、原理 本次实验采用HC-SR04超声波传感器&#xff0c;结构及功能如下图 超声波传感器可以用来测距。距离 声速&#xff08;340m/s) *传播时间 / 2。 这个传感器有四个引脚&#xff0c;其中VCC接电源正极&#xff0c;GND接电源负极 &#xff0c; Trig : 用来启动测量 &…

最小化重投影误差求解PnP

问题描述 已知n个空间点 P i [ x i , y i , z i ] T P_i[x_i,y_i,z_i]^T Pi​[xi​,yi​,zi​]T&#xff0c;其投影的像素坐标 p i [ u i , v i ] T p_i[u_i,v_i]^T pi​[ui​,vi​]T求相机的位姿R&#xff0c;T。 问题分析 根据相机模型&#xff0c;像素点和空间点的位置…

BigDecimal线上异常解决方案:避免科学计数法输出的坑

文章目录 问题背景为什么BigDecimal会输出科学计数法&#xff1f;线上异常场景场景1&#xff1a;数据传递异常场景2&#xff1a;日志记录异常场景3&#xff1a;数据存储异常 解决方案1. 使用toPlainString()方法2. 设置格式化输出3. 自定义工具类 代码示例总结 在Java开发中&am…

BIO系统调用strace查看IO阻塞

BIO服务端例子 服务端监听8090端口&#xff0c;每一个客户端用一个线程处理&#xff0c;不断的获取客户端的输入数据并打印 import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.…

Kubernetes 1.29升级至1.31版本笔记

一、概述 之前安装了kubernetes 1.29&#xff08;参见&#x1f449;&#xff1a;使用kubeadm安装Kubernetes1.29&#xff09;。 本次计划将该集群升级为&#x1f449;1.31版本。 Kubernetes版本表示方式&#xff1a; Kubernetes版本表示为x.y.z&#xff0c;其中x是主版本&…

Django 视图函数中的 `response` 对象及类型扩写

Django 视图函数中的 response 对象及类型扩写 在 Django 中&#xff0c;视图函数不仅负责处理请求&#xff0c;还负责生成响应。响应可以是以多种格式返回给客户端的数据&#xff0c;包括 HTML 页面、重定向、JSON 数据、文件等。以下是关于 Django 中几种常见响应类型的详细…

那些排序算法和初始序列的状态有关

那些排序算法对序列的初始状态有关 比如&#xff0c;冒泡排序和插入排序&#xff0c;在最好情况下&#xff0c;也就是序列已经排好序的时候&#xff0c;时间复杂度是O(n)&#xff0c;而最坏情况下是O(n)。这说明它们的性能确实和初始状态有关。快速排序的话&#xff0c;如果每次…