
# 准备Kafka应用安全认证
#### 前提条件
MRS服务集群开启了Kerberos认证，没有开启Kerberos认证的集群忽略该步骤。
#### 准备认证机制代码
在开启Kerberos认证的环境下，各个组件之间的相互通信不能够简单地互通，而需要在通信之前进行相互认证，以确保通信的安全性。Kafka应用开发需要进行Kafka、ZooKeeper、Kerberos的安全认证，这些安全认证只需要生成一个jaas文件并设置相关环境变量即可。提供了LoginUtil相关接口来完成这些配置，如下样例代码中只需要配置用户自己申请的账号名称和对应的keytab文件名称即可，由于人机账号的keytab会随用户密码过期而失效，故建议使用机机账号进行配置。
认证样例代码：
设置keytab认证文件模块
```
/**
     * 用户自己申请的账号keytab文件名称
     */
    private static final String USER_KEYTAB_FILE = "用户自己申请的账号keytab文件名称";
    
    /**
    * 用户自己申请的账号名称
    */
    private static final String USER_PRINCIPAL = "用户自己申请的账号名称";
```
MRS服务Kerberos认证模块，如果服务没有开启kerberos认证，这块逻辑不执行
```
public static void securityPrepare() throws IOException
    {
        String filePath = System.getProperty("user.dir") + File.separator + "conf" + File.separator;       
        String krbFile = filePath + "krb5.conf";
        String userKeyTableFile = filePath + USER_KEYTAB_FILE;
        
        //windows路径下分隔符替换
        userKeyTableFile = userKeyTableFile.replace("\\", "\\\\");
        krbFile = krbFile.replace("\\", "\\\\");
        
        LoginUtil.setKrb5Config(krbFile);
        LoginUtil.setZookeeperServerPrincipal("zookeeper/hadoop.hadoop.com");
        LoginUtil.setJaasFile(USER_PRINCIPAL, userKeyTableFile);
    }
```
![](https://support.huaweicloud.com/devg-mrs/public_sys-resources/note_3.0-zh-cn.png)
如果修改了集群kerberos域名，需要在代码中增加kerberos.domain.name的配置，并按照hadoop.expr=toLowerCase(%{default_realm}%{KerberosServer})规则配置正确的域名信息。例如：修改域名为HUAWEI.COM，则配置为hadoop.huawei.com。
#### keytab文件获取方式
1. 访问开启Kerberos的MRS Manager。
2. 进入"系统设置 \> 用户管理"，在指定的用户所在行单击"更多 \>下载认证凭据"。
3. 将下载获取到的zip文件解压缩，获取krb5.conf和该用户的keytab文件。
4. 将krb5.conf和该用户的keytab文件拷贝到样例工程的conf目录中。
 
