我可以仅对 Kafka 中的 SSL 侦听器(不适用于 PLAINTEXT)使用 SSL 和 ACL authentication/authorization 吗?
Can I Use SSL and ACL authentication/authorization only for SSL listener (not for PLAINTEXT) in Kafka?
我想要 运行 一个有 2 个监听器的 Kafka 集群。一个 SSL 和一个 PLAINTEXT 侦听器。
SSL 侦听器应通过 SSL 和 ACL 受到 authentication/authorization 的保护。只允许已知用户访问它。
在 PLAINTEXT 端口上,任何用户或匿名用户都应具有完全访问权限。
如果我设置 属性
allow.everyone.if.no.acl.found=false
但是,匿名用户将无法再访问 PLAINTEXT 端口。有没有办法按照上面的方法配置系统?
我可以想到两种方法来实现它。根据您的具体配置,您可能更喜欢其中一种。
仅限 ACL
每个与 Kafka 的连接都与一个主体相关联。可以使用自定义 PrincipalBuilder
but the default implementation should build different principals for users connecting over SSL and PLAINTEXT. Via PLAINTEXT, all users should be ANONYMOUS
and via SSL they should get names based on these SSL mapping rules.
自定义委托人
因此,您应该能够添加一个 ACL,将所有内容授予委托人 User:ANONYMOUS
,并为 SSL 用户设置特定的 ACL。
自定义授权方
这有点复杂,但它应该会给你更多的自由。您可以实现一个简单的自定义 Authorizer,根据听众做出决定。
如果您已经有一个自定义授权者,您可以从 AuthorizableRequestContext.listenerName()
和 return 检索侦听器(如果它是 PLAINTEXT
侦听器)。
如果你使用的是Kafka自带的默认AclAuthorizer
,你可以扩展它来检查监听器名称:
public class AllowPlaintextAuthSslAuthorizer extends AclAuthorizer {
@Override
public List<AuthorizationResult> authorize(AuthorizableRequestContext requestContext, List<Action> actions) {
if ("PLAINTEXT".equals(requestContext.listenerName())) {
return actions.stream()
.map((Action a) -> AuthorizationResult.ALLOWED)
.collect(Collectors.toList());
} else {
return super.authorize(requestContext, actions);
}
}
}
然后在您的 server.properties
文件中,设置 authorizer.class.name
以使用您的自定义 class。
请注意 AclAuthorizer
不是 public API 的一部分,因此它可能会在未来发生变化。
我想要 运行 一个有 2 个监听器的 Kafka 集群。一个 SSL 和一个 PLAINTEXT 侦听器。 SSL 侦听器应通过 SSL 和 ACL 受到 authentication/authorization 的保护。只允许已知用户访问它。
在 PLAINTEXT 端口上,任何用户或匿名用户都应具有完全访问权限。
如果我设置 属性
allow.everyone.if.no.acl.found=false
但是,匿名用户将无法再访问 PLAINTEXT 端口。有没有办法按照上面的方法配置系统?
我可以想到两种方法来实现它。根据您的具体配置,您可能更喜欢其中一种。
仅限 ACL
每个与 Kafka 的连接都与一个主体相关联。可以使用自定义
自定义委托人PrincipalBuilder
but the default implementation should build different principals for users connecting over SSL and PLAINTEXT. Via PLAINTEXT, all users should beANONYMOUS
and via SSL they should get names based on these SSL mapping rules.因此,您应该能够添加一个 ACL,将所有内容授予委托人
User:ANONYMOUS
,并为 SSL 用户设置特定的 ACL。自定义授权方
这有点复杂,但它应该会给你更多的自由。您可以实现一个简单的自定义 Authorizer,根据听众做出决定。
如果您已经有一个自定义授权者,您可以从
AuthorizableRequestContext.listenerName()
和 return 检索侦听器(如果它是PLAINTEXT
侦听器)。如果你使用的是Kafka自带的默认
AclAuthorizer
,你可以扩展它来检查监听器名称:public class AllowPlaintextAuthSslAuthorizer extends AclAuthorizer { @Override public List<AuthorizationResult> authorize(AuthorizableRequestContext requestContext, List<Action> actions) { if ("PLAINTEXT".equals(requestContext.listenerName())) { return actions.stream() .map((Action a) -> AuthorizationResult.ALLOWED) .collect(Collectors.toList()); } else { return super.authorize(requestContext, actions); } } }
然后在您的
server.properties
文件中,设置authorizer.class.name
以使用您的自定义 class。请注意
AclAuthorizer
不是 public API 的一部分,因此它可能会在未来发生变化。