CDH是一个对Apache Hadoop的集成环境的封装,可以使用Cloudera Manager进行自动化安装。CDH有企业版和免费版,具体详情,可以参见文档 https://www.cloudera.com/documentation/enterprise/6/release-notes/topics/rg_release_notes.html 。下面我们以CDH 为例,介绍一下如何在CDH 配置 Kerberos, 前提条件是已经安装 KDC 并且熟悉 KDC 相关知识。
内容
- 1. 安装Cloudera Manager和CDH
- 2. 使用AES-256加密,安装JCE策略文件
- 3. 为Cloudera Manager Server获取或创建Kerberos主体
- 4. 导入KDC Account Manager 凭据
- 5. Cloudera Manager Admin Console中配置Kerberos Default Realm
- 6. 停止Hadoop所有服务
- 7. 启用Hadoop安全性
- 8. 等待Generate Credentials命令完成
- 9. 启用Hue以使用Hadoop Kerberos Security
- 10. 启动所有 Hadoop 服务
- 11. 部署客户端配置(Deploy Client Configurations)
- 12. 创建HDFS超级用户 Principal
- 13. 为每个用户准备Hadoop集群
- 14. 验证Kerberos安全性是否正常工作
1. 安装Cloudera Manager和CDH
CDH和Cloudera Manager中的用户帐户和组的安全性
在集群主机上安装CDH软件包和Cloudera Manager Agent时,Cloudera Manager会提供一些系统安全性的必要步骤,例如创建Unix帐户和设置目录权限,如下表所示, 这些Unix帐户和目录权限适用于Hadoop Kerberos安全要求。
hdfs用户是HDFS系统的超级用户(SuperUser),在服务器主机上安装Cloudera Manager Server时,会自动创建一个名为cloudera-scm的新的Unix用户帐户以支持安全性。 Cloudera Manager Server使用此帐户在群集上创建和部署主机的Principal和KeyTab。
如果我们同时安装了CDH和Cloudera Manager,则在集群主机上启动Cloudera Manager Agent时,每台主机上的Cloudera Manager Agent会自动配置下表中显示的目录所有者以支持合理的安全性。 如果目录所有者的配置如下表所示,Hadoop后台程序可以自动为下面显示的属性指定的每个目录设置权限,以确保这些目录的安全性,一旦设置这些权限, 请勿更改。
2. 使用AES-256加密,安装JCE策略文件
在操作系统CentOS或RHEL 5.5或更高版本上(默认情况下对票证Ticket使用AES-256加密),则必须在所有群集和Hadoop用户主机上安装Java Cryptography Extension(JCE)Unlimited Strength Jurisdiction Policy File。有两种方法安装JCE policy 文件:
? 在Cloudera Manager Admin Console中,导航到“Host”页面, “Add New Hosts to Cluster”向导和“Re-run Upgrade Wizard”可以选择让Cloudera Manager安装JCE的策略文件;
? 可以按照jce_policy-x.zip文件中包含的README.txt文件中的JCE策略文件安装说明进行操作;
如果不使用AES-256算法,可以通过从kdc.conf或krb5.conf文件的supported_enctypes字段中删除aes256-cts:normal来将Kerberos配置为不使用AES-256。注意,更改kdc.conf文件后,需要重新启动KDC和kadmin服务器才能使这些更改生效。可能还需要重新创建或更改相关Principal的密码,包括Ticket Granting Ticket的主体(例如,krbtgt / EXAMPLE.COM@EXAMPLE.COM)。如果在所有这些步骤之后AES-256仍然在使用,可能是因为创建Kerberos数据库时存在aes256-cts:normal设置,要解决此问题,可以创建新的Kerberos数据库,然后重新启动KDC和kadmin服务器。
要验证群集中使用的加密类型,可以执行以下操作:
在本地KDC主机上,在kadmin.local或kadmin shell中键入以下命令以创建 test principal:
kadmin:addprinc test
在群集主机上,键入以下命令:
$ kinit test
成功运行上一个命令后,键入以下命令以查看正在使用的加密类型:
$ klist -e
如果使用AES,则在键入klist命令后会显示如下所示的输出(请注意,输出中包含AES-256):
Ticket cache: FILE:/tmp/krb5cc_0 Default principal: test@EXAMPLE.COM Valid starting Expires Service principal 05/19/11 13:25:04 05/20/11 13:25:04 krbtgt/EXAMPLE.COM@EXAMPLE.COM Etype (skey, tkt): AES-256 CTS mode with 96-bit SHA-1 HMAC, AES-256 CTS mode
3. 为Cloudera Manager Server获取或创建Kerberos主体
为了在集群上创建和部署主机Principal和KeyTab,Cloudera Manager Server必须具有正确的Kerberos Principal, 具体而言,Cloudera Manager Server必须具有管理员权限的Kerberos Principal。 通常情况下,Principal名称中具有admin组件的Principal(例如,username/admin@EXAMPLE.COM)具有管理员权限。
要获取或创建Cloudera Manager Server的Kerberos主体,可以执行以下任一操作:
? 请求Kerberos管理员为Cloudera Manager Server创建Kerberos管理员主体;
? 使用以下步骤为Cloudera Manager Server创建Kerberos主体;
创建Cloudera Manager Principal
Active Directory
? 在AD中创建组织单位(OU),其中CDH集群中使用的所有主体都将驻留在该OU中;
? 添加新的AD用户,例如<username> @ EXAMPLE.COM。 此用户的密码应设置为永不过期;
? 使用AD的委派控制(Delegate Control)向导允许此新用户创建,删除和管理用户帐户;
MIT KDC
MIT Kerberos创建Cloudera Manager Server主体的示例如下:
在kadmin.local或kadmin shell中,键入以下命令以创建Cloudera Manager Server主体,将EXAMPLE.COM替换为相应的Realm的名称:
kadmin:addprinc -pw <password> cloudera-scm/admin@EXAMPLE.COM
4. 导入KDC Account Manager 凭据
? 在Cloudera Manager Admin Console中,选择“Administration”>“Security”;
? 转到Kerberos Credentials tab,然后单击“Import Kerberos Account Manager Credentials”;
? 在“Import Kerberos Account Manager Credentials”对话框中,输入可以在KDC中为CDH集群创建主体的用户的用户名和密码, 就是在本节中第3部分为Cloudera Manager Server获取或创建Kerberos主体时创建的Principal。 Cloudera Manager将用户名和密码加密到KeyTab中,并根据需要使用它来创建新的主体;
完成后单击“Close”。
5. Cloudera Manager Admin Console中配置Kerberos Default Realm
Kerberos的默认Realm在集群中每个主机上的/etc/krb5.conf文件的libdefaults属性中配置,如下所示:
[libdefaults] default_realm = EXAMPLE.COM
? 在Cloudera Manager Admin Console中,选择“Administration”>“Setttings”;
? 单击“Security”类别,然后在krb5.conf文件中配置的Kerberos Security Realm字段(例如,EXAMPLE.COM或HADOOP.EXAMPLE.COM)中输入集群的Kerberos Realm;
? 单击Save更改;
6. 停止Hadoop所有服务
在CDH中启用Kerberos安全性之前,必须停止集群中的所有Hadoop服务,然后更改配置属性,必须停止群集中的所有守护程序,因为重新启动一个Hadoop守护程序后,配置属性设置为启用Kerberos安全性后, 未启用安全性的守护进程将无法与该守护进程通信。
停止所有正在运行的Hadoop服务和Cloudera Management服务,如下所示:
停止Hadoop所有服务
? 在“Home>Status”选项卡上,单击群集名称右侧,然后选择“Stop”;
? 单击确认屏幕中的“Stop”, “Command Details”窗口显示停止服务的进度;
当出现所有服务成功停止时,任务完成,可以关闭“Command Details”窗口;
停止Cloudera管理服务
? 在Home>Status选项卡上,单击Cloudera Management Service右侧,然后选择Stop;
? 单击“Stop”以确认, “Command Details”窗口显示停止角色的进度;
? 当命令完成并显示n / n个成功的子命令时,任务完成。 单击关闭;
7. 启用Hadoop安全性
要为集群启用Hadoop安全性,可在HDFS服务上启用。 执行此操作后,Cloudera Manager Server会自动在与该HDFS服务关联的MapReduce和YARN服务上启用Hadoop安全性;
? 进入HDFS服务>配置选项卡;
? 在“搜索”字段中,键入Hadoop Secure以显示Hadoop安全属性(位于“Service-Wide”>“安全性”类别下);
? 单击Hadoop Secure Authentication属性,然后选择kerberos选项,以在HDFS服务上启用Hadoop Kerberos安全性;
? 单击Hadoop Secure Authorization属性,然后选中复选框以在所选HDFS服务上启用服务级别授权 (service-level authorization);
授权用户:以逗号分隔的授权使用Hadoop服务的用户列表;
授权组:以逗号分隔的授权使用Hadoop服务的组列表;
授权管理员用户:以逗号分隔的在Hadoop上执行管理操作的用户列表;
授权管理员组:授权在Hadoop上执行管理操作的以逗号分隔的组列表;
? 在“搜索”字段中,键入DataNode Transceiver来查找DataNode Transceiver Port属性;
? 单击DataNode Transceiver Port属性,并指定特权端口(Privileged Port)号(低于1024), Cloudera建议的端口号是1004;
? 在“搜索”字段中,键入DataNode HTTP以查找DataNode HTTP Web UI端口属性并指定特权端口号(低于1024), Cloudera建议的端口号是1006;
? 在“搜索”字段中,键入“Data Directory Permissions”以查找“DataNode Data Directory Permissions”属性;
? 如果尚未对DataNode数据目录权限属性的值设置默认值,则将其重置为默认值700;
? 确保已更改每个DataNode角色组的DataNode Transceiver Port,DataNode Data Directory Permissions和DataNode HTTP Web UI端口属性;
? 单击“保存更改”以保存配置设置;
如果要启用ZooKeeper Kerberos安全性,请参见下列步骤:
? 转至ZooKeeper服务>配置选项卡,然后单击查看和编辑;
? 单击“启用Kerberos身份验证”属性的值;
? 单击“保存更改”以保存配置设置;
8. 等待Generate Credentials命令完成
为Cloudera Manager中的Hadoop服务启用Kerberos安全性后,将触发名为Generate Credentials的命令。 可以在屏幕右上角查看显示正在运行的命令的命令进度。 等待此命令结束。
9. 启用Hue以使用Hadoop Kerberos Security
要使Hue与Cloudera Manager部署的Kerberos集群正常工作,需将Kerberos Ticket Renewer添加到Hue服务, 可以在Cloudera Manager中通过在具有Hue服务器角色(Hue Server role)的每台主机上添加Kerberos Ticket Renewer角色来执行此操作;
Hue Kerberos Ticket Renewer仅更新Hue Service Principal的 ticket,hue / <hostname> @ <YOUR-REALM.COM>。 Hue Principal模拟其他用户在Hue中的应用程序,如作业浏览器,文件浏览器等;
其他的核心Hadoop服务(如HDFS和MapReduce)不使用Hue Kerberos Ticket Renewer。 这些服务在启动时获取票据并使用这些票证来获取授权令牌以获得各种访问权限。 每个服务都根据需要处理自己的票据续订的事物;
在Cloudera Manager中添加Kerberos Ticket Renewer角色
? 导航到Hue服务;
? 单击Instances选项卡;
? 单击“添加角色实例”按钮;
? 将Kerberos Ticket Renewer角色实例分配给与Hue服务器相同的主机,状态为“完成”时,就完成了配置Kerberos Ticket Renewer角色实例;
? 对每个Hue Server重复这些步骤;
Kerberos Ticket Renewer故障排除
如果Hue Kerberos Ticket Renewer未启动,可以检查Kerberos密钥分发中心(KDC)的配置。 查看ticket属性maxrenewlife,以确保Principal hue / <hostname>和krbtgt可以被续订的。 如果这些Principal不可续订,在KDC上运行以下命令:
kadmin.local:modprinc -maxrenewlife 90day krbtgt / YOUR_REALM.COM kadmin.local:modprinc -maxrenewlife 90day + allow_renewable hue / <hostname> @ YOUR-REALM.COM
10. 启动所有 Hadoop 服务
启动集群上的所有Hadoop服务
? 在“主页>状态”选项卡上,单击集群名称右侧,然后选择“启动”;
? 单击下一个屏幕中显示的“开始”以确认,“命令详细信息”窗口显示启动服务的进度。当出现所有服务成功启动后,任务已完成,可以关闭“命令详细信息”窗口;
启动Cloudera管理服务
? 在主页>状态选项卡上,单击Cloudera Management Service右侧,然后选择“开始”;
? 单击“开始”, “命令详细信息”窗口显示启动角色的进度;
? 当命令完成并显示n / n个成功的子命令时,任务完成。 单击关闭;
11. 部署客户端配置(Deploy Client Configurations)
? 在“主页>状态”选项卡上,单击集群名称,然后选择“部署客户端配置”;
? 单击“部署客户端配置”;
12. 创建HDFS超级用户 Principal
为了能够为用户创建HDFS目录,需要访问HDFS超级用户(superuser)帐户, (在CDH安装期间,CDH会自动在每个集群主机上创建HDFS超级用户帐户)。当HDFS服务启用Kerberos后,使用sudo -u hdfs命令无法使HDFS用户还具有超级用户帐户而为用户创建HDFS目录。 Cloudera建议使用其他用户帐户作为超级用户,而不是默认的hdfs帐户。
指定非默认超级用户组
若要指定一组非默认的超级用户,而不是使用默认的hdfs帐户,按照下列步骤操作:
? 转到Cloudera Manager Admin Console并导航到HDFS服务;
? 单击“配置”选项卡;
? 选择Scope> HDFS(Service-Wide);
? 选择“类别>安全性”;
? 找到超级用户组属性,并将值更改为相应组名称。 例如,<superuser>;
? 单击“保存更改”以提交更改;
? 重启HDFS服务;
为了在启用Kerberos后启用对该超级用户帐户的访问,必须创建Kerberos Principal或<superuser>的Active Directory用户:
如果使用的是Active Directory
将新用户帐户添加到Active Directory,<superuser> @ YOUR-REALM.COM, 此帐户的密码应设置为永不过期;
如果使用的是MIT KDC
? 在kadmin.local或kadmin shell中,键入以下命令以创建名为<superuser>的Kerberos Principal:
kadmin:addprinc <superuser> @ YOUR-LOCAL-REALM.COM
此命令会提示为<superuser> Principal创建密码,妥善保存该密码,因为访问此Principal可以提供对HDFS中所有文件的访问权限;
? 要以HDFS超级用户身份运行命令,必须获取<superuser>主体的Kerberos凭据。 为此,运行以下命令,并在出现提示时提供相应的密码:
$ kinit <superuser> @ YOUR-LOCAL-REALM.COM
13. 为每个用户准备Hadoop集群
在其他用户可以访问Hadoop集群之前,必须执行一些任务来为每个用户做好准备。
? 确保集群中的所有主机都具有与该用户主体(Principal)名称同名的Unix用户帐户。 例如,如果用户的主体名称为joe@YOUR-REALM.COM,则每个集群主机上都应存在Unix帐户joe。 如果使用LDAP,则可以使用LDAP执行此步骤;
? 在HDFS上的/ user下为每个用户帐户创建一个子目录(例如,/ user / joe)。 将该目录的所有者和组更改为该用户;
$ hadoop fs -mkdir / user / joe $ hadoop fs -chown joe / user / joe
sudo -u hdfs不包含在上面的命令中,这是因为如果在群集上启用了Kerberos,则不需要使用该命令。但是 需要为HDFS超级用户提供Kerberos凭据才能成功运行这些命令。请详见本章的第12小节;
14. 验证Kerberos安全性是否正常工作
获得Kerberos凭据后,可以通过运行MapReduce作业来验证Kerberos安全性是否已经生效。 如运行Hadoop示例(/usr/lib/hadoop/hadoop-examples.jar)作业等。
验证Kerberos安全性是否正常工作
? 获取用户帐户的Kerberos凭据;
$ kinit USERNAME@YOUR-LOCAL-REALM.COM
? 出现提示时输入密码;
? 提交示例PI计算作为测试MapReduce作业, 使用以下命令:
$ hadoop jar /usr/lib/hadoop-0.20/hadoop-0.20.2*examples.jar pi 10 10000 Number of Maps = 10 Samples per Map = 10000 ... Job Finished in 38.572 seconds Estimated value of Pi is 3.14120000000000000000
通过上述步骤,已验证Kerberos安全生效。
如果票据缓存中没有有效的Kerberos票据,运行的MapReduce作业将失败。 可以通过运行klist命令来检查当前在凭证缓存中的Kerberos票证, 可以通过运行kinit命令并指定包含凭据的KeyTab文件或输入Principal密码来获取票据。 如果没有有效的票证,将收到如下错误:
11/01/04 12:08:12 WARN ipc.Client: Exception encountered while connecting to the server : javax.security.sasl.SaslException:GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)] Bad connection to FS. command aborted. exception: Call to nn-host/10.0.0.2:8020 failed on local exception: java.io.IOException:javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]