要实现Hadoop的Kerberos认证,需遵循KDC部署→主体创建→配置同步→集群重启→验证测试的完整流程,以下是详细步骤(基于主流Hadoop版本及Kerberos最佳实践):
一、前置准备
- 环境要求
- 所有节点(Master、Slave)安装Kerberos客户端(如krb5-user或krb5-workstation);
- 时间同步(Kerberos对时间差敏感,需通过NTP确保所有节点时间一致);
- 网络连通(KDC服务器与Hadoop集群节点间可互相访问)。
2. KDC部署
- 选择独立节点(如kdc-server)安装Kerberos服务端(如krb5-server);
- 配置KDC核心文件:
- /etc/krb5.conf(客户端及服务端均需配置,定义KDC地址、领域、加密类型等): [libdefaults] default_realm = EXAMPLE.COM # Kerberos领域名称(需大写) dns_lookup_realm = false dns_lookup_kdc = false ticket_lifetime = 24h # 票据有效期 renew_lifetime = 7d # 票据可续期时长 default_tkt_enctypes = aes256-cts-hmac-sha1-96 # 加密类型(需与Hadoop兼容) default_tgs_enctypes = aes256-cts-hmac-sha1-96 [realms] EXAMPLE.COM = { # 领域配置 kdc = kdc-server # KDC服务器地址 admin_server = kdc-server # 管理服务器地址 } [domain_realm] .example.com = EXAMPLE.COM # 域名与领域映射 example.com = EXAMPLE.COM
- /var/kerberos/krb5kdc/kdc.conf(KDC服务端专属,定义数据库及策略): [kdcdefaults] kdc_ports = 88 # KDC服务端口 kdc_tcp_ports = 88 [realms] EXAMPLE.COM = { database_name = /var/kerberos/krb5kdc/principal # 主体数据库路径 admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab # 管理员keytab acl_file = /var/kerberos/krb5kdc/kadm5.acl # 管理员权限策略 supported_enctypes = aes256-cts:normal aes128-cts:normal # 支持的加密类型 }
- 初始化Kerberos数据库(首次部署时执行): kdb5_util create -r EXAMPLE.COM -s # -s表示生成stash文件(存储master key)
- 启动KDC服务: systemctl start krb5kdc # 启动KDC服务 systemctl enable krb5kdc # 设置开机自启 systemctl start kadmin # 启动Kerberos管理工具 systemctl enable kadmin # 设置开机自启
二、创建Kerberos主体
Kerberos主体(Principal)格式为:ServiceName/HostName@REALM(如hdfs/hadoop01@EXAMPLE.COM),需为Hadoop各组件创建对应主体:
- 登录Kerberos管理控制台 使用Kerberos管理员账号(如admin/admin@EXAMPLE.COM)登录: kadmin.local -q "addprinc admin/admin@EXAMPLE.COM" # 创建管理员主体(首次需设置密码) kadmin.local -q "addprinc cloudera-scm/admin@EXAMPLE.COM" # Cloudera Manager管理员主体(可选)
- 为Hadoop组件创建主体 根据Hadoop组件(NameNode、DataNode、ResourceManager等)所在主机,创建对应主体:
- NameNode(hadoop01节点): kadmin.local -q "addprinc -randkey nn/hadoop01@EXAMPLE.COM" # -randkey表示随机生成密钥
- DataNode(hadoop02、hadoop03节点): kadmin.local -q "addprinc -randkey dn/hadoop02@EXAMPLE.COM" kadmin.local -q "addprinc -randkey dn/hadoop03@EXAMPLE.COM"
- ResourceManager(hadoop02节点): kadmin.local -q "addprinc -randkey rm/hadoop02@EXAMPLE.COM"
- NodeManager(hadoop01、hadoop02、hadoop03节点): kadmin.local -q "addprinc -randkey nm/hadoop01@EXAMPLE.COM" kadmin.local -q "addprinc -randkey nm/hadoop02@EXAMPLE.COM" kadmin.local -q "addprinc -randkey nm/hadoop03@EXAMPLE.COM"
- Web UI(所有节点,用于HTTP认证): kadmin.local -q "addprinc -randkey HTTP/hadoop01@EXAMPLE.COM" kadmin.local -q "addprinc -randkey HTTP/hadoop02@EXAMPLE.COM" kadmin.local -q "addprinc -randkey HTTP/hadoop03@EXAMPLE.COM"
3. 生成Keytab文件 Keytab文件存储主体密钥,用于服务无交互认证(避免每次启动输入密码)。将生成的Keytab文件复制到对应服务的配置目录(如/etc/security/keytab/),并设置权限: # 为NameNode生成Keytab(hadoop01节点) kadmin.local -q "xst -k /etc/security/keytab/nn.service.keytab nn/hadoop01@EXAMPLE.COM" # 为DataNode生成Keytab(hadoop02节点) kadmin.local -q "xst -k /etc/security/keytab/dn.service.keytab dn/hadoop02@EXAMPLE.COM" # 复制Keytab到所有节点(如通过scp) scp /etc/security/keytab/nn.service.keytab hadoop02:/etc/security/keytab/ scp /etc/security/keytab/nn.service.keytab hadoop03:/etc/security/keytab/ # 设置Keytab权限(仅允许服务用户读取) chmod 400 /etc/security/keytab/*.keytab chown hdfs:hadoop /etc/security/keytab/nn.service.keytab # NameNode Keytab属主为hdfs chown yarn:hadoop /etc/security/keytab/dn.service.keytab # DataNode Keytab属主为yarn
三、配置Hadoop使用Kerberos
修改Hadoop核心配置文件,启用Kerberos认证并关联Kerberos主体:
- 修改core-site.xml(所有节点) 启用Kerberos认证、授权及RPC保护: <configuration> <!-- 启用Kerberos认证 --> <property> <name>hadoop.security.authentication</name> <value>kerberos</value> </property> <!-- 启用权限检查 --> <property> <name>hadoop.security.authorization</name> <value>true</value> </property> <!-- RPC通讯仅认证模式(可选:authentication/privacy) --> <property> <name>hadoop.rpc.protection</name> <value>authentication</value> </property> <!-- Kerberos主体到系统用户的映射(如nn/hadoop01@EXAMPLE.COM → hdfs用户) --> <property> <name>hadoop.security.auth_to_local</name> <value> RULE:[2:$1/$2@$0]([nd]n\/.*@EXAMPLE\.COM)s/.*/hdfs/ RULE:[2:$1/$2@$0]([rn]m\/.*@EXAMPLE\.COM)s/.*/yarn/ DEFAULT </value> </property> </configuration>
- 修改hdfs-site.xml(所有节点) 配置NameNode、DataNode的Kerberos主体及Keytab路径: <configuration> <!-- NameNode的Kerberos主体 --> <property> <name>dfs.namenode.kerberos.principal</name> <value>nn/hadoop01@EXAMPLE.COM</value> </property> <!-- NameNode的Keytab路径 --> <property> <name>dfs.namenode.keytab.file</name> <value>/etc/security/keytab/nn.service.keytab</value> </property> <!-- DataNode的Kerberos主体 --> <property> <name>dfs.datanode.kerberos.principal</name> <value>dn/hadoop02@EXAMPLE.COM</value> </property> <!-- DataNode的Keytab路径 --> <property> <name>dfs.datanode.keytab.file</name> <value>/etc/security/keytab/dn.service.keytab</value> </property> <!-- Web UI的Kerberos主体(HTTP认证) --> <property> <name>dfs.web.authentication.kerberos.principal</name> <value>HTTP/hadoop01@EXAMPLE.COM</value> </property> <!-- Web UI的Keytab路径 --> <property> <name>dfs.web.authentication.kerberos.keytab</name> <value>/etc/security/keytab/nn.service.keytab</value> </property> </configuration>
- 修改yarn-site.xml(所有节点) 配置ResourceManager、NodeManager的Kerberos主体及Keytab路径: <configuration> <!-- ResourceManager的Kerberos主体 --> <property> <name>yarn.resourcemanager.kerberos.principal</name> <value>rm/hadoop02@EXAMPLE.COM</value> </property> <!-- ResourceManager的Keytab路径 --> <property> <name>yarn.resourcemanager.keytab.file</name> <value>/etc/security/keytab/rm.service.keytab</value> </property> <!-- NodeManager的Kerberos主体 --> <property> <name>yarn.nodemanager.kerberos.principal</name> <value>nm/hadoop03@EXAMPLE.COM</value> </property> <!-- NodeManager的Keytab路径 --> <property> <name>yarn.nodemanager.keytab.file</name> <value>/etc/security/keytab/nm.service.keytab</value> </property> <!-- Web UI的Kerberos主体(HTTP认证) --> <property> <name>yarn.resourcemanager.webapp.delegation-token-auth-filter.enabled</name> <value>true</value> </property> </configuration>
四、分发配置与重启集群
- 分发配置文件 将修改后的core-site.xml、hdfs-site.xml、yarn-site.xml同步到所有Hadoop节点(如通过scp或Ansible)。
- 重启Hadoop集群 按照NameNode→DataNode→ResourceManager→NodeManager的顺序重启集群(或使用集群管理工具如Cloudera Manager一键重启): # 停止HDFS stop-dfs.sh # 启动HDFS start-dfs.sh # 停止YARN stop-yarn.sh # 启动YARN start-yarn.sh
五、验证Kerberos认证
- 用户登录测试 使用kinit命令获取Kerberos票据(需输入用户密码): kinit tenantA@EXAMPLE.COM # 租户A用户登录 klist # 查看票据是否有效(应显示tenantA@EXAMPLE.COM的票据)
- HDFS操作测试 使用认证后的用户访问HDFS,验证认证是否生效: hdfs dfs -ls / # 应返回根目录列表(若未认证则会提示权限不足) hdfs dfs -mkdir /tenantA # 创建租户A目录 hdfs dfs -put test.txt /tenantA # 上传文件到租户A目录
- YARN作业测试 提交一个MapReduce作业,验证YARN认证是否生效: hadoop jar hadoop-mapreduce-examples-3.1.3.jar pi 2 4 # 计算π值(应正常启动作业)