SASL

本文深入探讨了LDAPv3协议中使用SASL(可插拔认证)的支持,解释了如何配置客户端和服务器进行非标准和定制化的认证过程。重点介绍了几个SASL机制,如匿名、CRAM-MD5、Digest-MD5等,并详细说明了在不同环境下执行这些机制的方法。此外,文章还提供了如何在应用程序中指定认证机制、处理输入参数以及使用SASL机制的实例。

LDAP V3协议使用SASL的支持可插拔认证。这意味着LDAP客户端和服务器可以被配置在谈判和使用认证机制可能是非标准和/或定制,取决于客户端和服务器所需的保护水平 。不支持SASL的LDAP v2协议。

目前有几个SASL机制的定义:

LDAP服务器的支持SASL机制

前面的列表的机制,流行LDAP服务器(如OpenLDAP的,从甲骨文,和微软的)支持外部,DIGEST - MD5,并作为强制性LDAP的默认机制的Kerberos V5。RFC 2829建议使用DIGEST - MD5 v3服务器。

下面是一个简单的程序,找出LDAP服务器支持的SASL机制的列表。

/ /创建初始上下文
DirContext ctx =new InitialDirContext();

/ /读取从根DSE supportedSASLMechanisms
Attributes attrs = ctx.getAttributes(  
  
     "ldap://localhost:389", new String[]{"supportedSASLMechanisms"});

下面是在一个支持外部SASL机制的服务器上运行这个程序产生的输出。

  
{supportedsaslmechanisms=supportedSASLMechanisms: EXTERNAL, GSSAPI, DIGEST-MD5}

指定的认证机制

要使用特定的SASL机制,可以指定其互联网编号分配机构(IANA)注册机制的名称 Context.SECURITY_AUTHENTICATION环境属性。您也可以指定一个LDAP提供机制的清单尝试 。这是通过指定的空间分隔机制名称的有序列表 。LDAP提供程序将使用它找到一个实施的第一个机制。

下面是一个例子,要求LDAP提供商试图让DIGEST - MD5机制的执行情况,如果是这样的不可用,使用GSSAPI的一个。

  
env.put(Context.SECURITY_AUTHENTICATION, "DIGEST-MD5 GSSAPI");

从应用程序的用户,你可能会得到这样的认证机制,或者,您可能会通过调用类似前面显示的方法来要求LDAP服务器。LDAP提供者本身并不会咨询此服务器来获得相应的信息。它只是试图找到并使用指定的机制的实现。

在平台的LDAP提供内置,DIGEST - MD5的,和GSSAPI(Kerberos V5的)SASL机制的支持。您可以添加额外的机制的支持。

指定的认证机制的输入

一些机制,如外部不需要额外的输入-单机制的名称是足够的认证进行。外部的例子显示了如何使用外部的SASL机制 。

大多数其他机制需要一些额外的输入。根据这一机制,可能会有所不同类型的输入。以下是一些常见的输入机制。

  • 验证ID。执行身份验证的实体的身份。
  • 授权标识。访问控制检查如果认证成功,应作出实体的身份。
  • 认证证书。例如,密码或钥匙。

如果程序(如代理服务器)是代表另一个实体验证,身份验证和授权的ID可能会有所不同。验证ID指定使用的 Context.SECURITY_PRINCIPAL环境属性。它的类型java.lang.String 。

验证ID的密码/关键是指定使用的 Context.SECURITY_CREDENTIALS环境属性。它的类型是java.lang.String时char数组的(char[]),或字节数组(byte[] )。如果密码是一个字节数组,然后它转化成一个 char 数组使用UTF - 8编码。

如果已设置的“java.naming.security.sasl.authorizationId”属性,然后使用它的值作为授权ID。它的值的类型必须是java.lang.String的。默认情况下,空字符串使用的授权ID,指示服务器,来自客户端的身份验证凭据的授权ID 。

DIGEST - MD5的示例演示如何使用Context.SECURITY_PRINCIPALContext.SECURITY_CREDENTIALS DIGEST - MD5验证的属性 。

如果一个机制需要输入已经描述过的以外,然后你需要定义一个回调机制,使用对象,您可以检查出在回调例如 JNDI教程 。这节课的下一部分将讨论如何使用SASL DIGEST - MD5认证机制。 SASL的政策 , GSS API(Kerberos V5的) 和 CRAM - MD5 机制是覆盖在JNDI教程。









在 Apache ZooKeeper 中,SASL(Simple Authentication and Security Layer)用于实现客户端与服务器之间的身份验证和安全通信。通过 SASL,ZooKeeper 支持基于 Kerberos 的认证机制,例如 GSSAPI,从而满足企业级安全需求。 ### 配置 SASL 的基本步骤 1. **启用 SASL 认证** 在 `zoo.cfg` 配置文件中添加以下参数以启用 SASL: ```properties authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider requireClientAuthScheme=sasl ``` 这将强制客户端使用 SASL 身份验证来连接 ZooKeeper 服务 [^3]。 2. **配置 JAAS 文件** JAAS(Java Authentication and Authorization Service)配置文件定义了 Kerberos 主体和服务密钥表路径。例如,创建一个名为 `jaas.conf` 的文件,内容如下: ```java Server { com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true keyTab="/path/to/zookeeper.keytab" principal="zookeeper/hostname@REALM"; }; ``` 客户端也需要类似的 JAAS 配置,但主体名称应为客户端的 Kerberos 主体。 3. **设置 JVM 参数** 启动 ZooKeeper 时,需要指定 JAAS 配置文件的位置,示例命令如下: ```bash -Djava.security.auth.login.config=/path/to/jaas.conf ``` 4. **Kerberos 配置** 确保系统上的 `krb5.conf`(或 `krb5.ini`)文件正确配置,并且可以解析目标 KDC(Key Distribution Center)。 ### 常见问题及解决方法 - **客户端无法连接并报错 “No valid credentials provided”** 检查客户端的 JAAS 配置是否正确,确保使用的 Kerberos 主体已正确注册并在 KDC 中存在。此外,确认密钥表文件路径正确且具有读取权限 [^3]。 - **服务器启动失败,提示 “Cannot open channel to x at election address”** 可能是由于 SASL 配置错误导致节点之间无法正常通信。检查服务器之间的 JAAS 配置是否一致,并确保所有节点都能访问 KDC [^3]。 - **Session Expired 或 Connection Refused** 即使启用了 SASL,也需要注意会话超时机制。如果客户端因网络问题断开连接,并在 `sessionTimeout` 内未能恢复连接,则会话会被终止,临时节点会被清除 [^5]。 - **ACL 权限控制未生效** 如果启用了 `skipACL=yes`,则 ACL 检查将被跳过,任何用户都可以访问节点数据。确保此选项未启用,除非在测试环境中 [^3]。 ### 示例:使用 SASL 的 Java 客户端代码 ```java import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.WatchedEvent; public class SaslZooKeeperClient { public static void main(String[] args) throws Exception { System.setProperty("java.security.auth.login.config", "/path/to/client_jaas.conf"); Watcher watcher = new Watcher() { public void process(WatchedEvent event) { System.out.println("Received event: " + event); } }; String connectString = "zkhost:2181"; int sessionTimeout = 5000; ZooKeeper zk = new ZooKeeper(connectString, sessionTimeout, watcher); System.out.println("Connected to ZooKeeper with SASL authentication."); // Do something with the ZooKeeper instance zk.create("/test", "data".getBytes(), ZooDefs.Ids.CREATOR_ALL_ACL, CreateMode.PERSISTENT); } } ``` 上述代码展示了如何使用 SASL 认证连接到 ZooKeeper。请确保客户端 JAAS 配置正确,并且 Kerberos 票据有效。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值