Kerberos安装及与Hadoop搭配提高安全性

介绍了Kerberos的搭建方法,以及在普通Hadoop环境中、CDH环境中与Hadoop对接设置的步骤
本文转载自:http://blog.csdn.net/xiao_jun_0820/article/details/39375819

环境:

假设我们有5个机器,分别是hadoop1~hadoop5。选择hadoop1,hadoop2,hadoop3组成分布式的KDC。hadoop1作为Master机器。

  1. 安装:

通过yum安装即可,组成KDC。

  1. 配置:

Kerberos的配置文件只有两个。在Hadoop1中创建以下两个文件,并同步/etc/krb5.conf到所有机器。

/var/kerberos/krb5kdc/kdc.conf:包括KDC的配置信息。
默认放在 /usr/local/var/krb5kdc
或者通过覆盖KRB5_KDC_PROFILE环境变量修改配置文件位置。

配置示例:

说明:

HADOOP.COM:是设定的realms。名字随意。Kerberos可以支持多个realms,会增加复杂度。本文不探讨。大小写敏感,一般为了识别使用全部大写。这个realms跟机器的host没有大关系。max_renewable_life = 7d 涉及到是否能进行ticket的renwe必须配置

master_key_type:和supported_enctypes默认使用aes256-cts。由于,JAVA使用aes256-cts验证方式需要安装额外的jar包。推荐不使用。acl_file:标注了admin的用户权限,需要用户自己创建。文件格式是Kerberos_principal permissions [target_principal] [restrictions] 支持通配符等。最简单的写法是 */[email protected] *代表名称匹配*/[email protected] 都认为是admin,权限是 *,代表全部权限。

admin_keytab:KDC进行校验的keytab。后文会提及如何创建。supported_enctypes:支持的校验方式。注意把aes256-cts去掉。

/etc/krb5.conf:包含Kerberos的配置信息。

例如:

  • KDC的位置
  • Kerberos的admin的realms

需要所有使用的Kerberos的机器上的配置文件都同步。这里仅列举需要的基本配置。详细介绍参考:krb5conf

配置示例:

说明:

[logging]:表示server端的日志的打印位置

[libdefaults]:每种连接的默认配置,需要注意以下几个关键的小配置default_realm = HADOOP.COM 默认的realm,必须跟要配置的realm的名称一致。

udp_preference_limit = 1 禁止使用udp可以防止一个Hadoop中的错误

[realms]:列举使用的realm。

kdc:代表要kdc的位置。格式是 机器:端口

admin_server:代表admin的位置。格式是 机器:端口

default_domain:代表默认的域名

[appdefaults]:可以设定一些针对特定应用的配置,覆盖默认配置。

客户端机器只需要此文件

初始化并启动:

完成上面两个配置文件后,就可以进行初始化并启动了。

  1. 初始化数据库:在hadoop1上运行命令。其中-r指定对应realm。
    kdb5_util create -r HADOOP.COM -s
    如果遇到数据库已经存在的提示,可以把/var/kerberos/krb5kdc/目录下的principal的相关文件都删除掉。默认的数据库名字都是principal。可以使用-d指定数据库名字。(尚未测试多数据库的情况)。

  2. 启动kerberos。如果想开机自启动,需要stash文件。

    /usr/local/sbin/krb5kdc 
    /usr/local/sbin/kadmind

至此kerberos,搭建完毕。

搭建Slave KDCs

为了在生产环境中获得高可用的KDC。还需要搭建Slave KDCs

TODO 
经过各种努力还是不能成功同步,先放下。

测试kerberos

搭建完毕后,进行以下步骤测试Kerberos是否可用。

  1. 进入kadmin在kadmin上添加一个超级管理员账户,需要为其设置passwd

    kadmin.local
    进入界面

    输入addprinc [email protected]

  2. 在其它机器尝试通过kadmin连接,需要输入密码

如果没有报错提示(可能也没有其他回显)则代表成功

kerberos日常操作

管理员操作

  • 登录到管理员账户: 如果在本机上,可以通过kadmin.local直接登录。
  • 其它机器的,先使用kinit进行验证。

  • 增删改查账户:在管理员的状态下使用addprinc,delprinc,modprinc,listprincs命令。使用?可以列出所有的命令。

  • 生成keytab:使用xst命令或者ktadd命令

用户操作

  • 查看当前的认证用户:klist

  • 认证用户:kinit -kt /xx/xx/kerberos.keytab hdfs/hadoop1

  • 删除当前的认证的缓存: kdestroy

在CM上使用Kerberos认证

在CM上使用Kerberos认证,它会帮我们创建所有的需要的Kerberos账户,并且在启动的时候自动生成keytab存放到对应的启动目录,在配置文件中添加对应的keytab文件配置和用户名。
所以,只需要给CM创建一个拥有管理员权限的账户。CM就能够完成大部分的初始化工作。

初始化部署

  1. 为CM添加一个账户,并生成keytab文件

  2. 将上文产生的keytab文件移到cloudera-scm的配置目录,添加cmf.principal文件并写入账户的名称,最后修改文件权限。

    默认配置目录在/etc/cloudera-scm-server/,但是我们修改为/home/cloudera-manager/cm-4.6.3/etc/cloudera-scm-server/

  3. 设置CM的default Realm :在界面上顶部的Administrator-setting-security-Kerberos Security Realm 填入 HADOOP.COM

  4. 针对所有服务开启security选项

    • Zookeeper:

    • HDFS:

      • sequence
        勾选 HDFS Service->Configuration->Authentication
      • sequence
        勾选 HDFS Service->Configuration->Authorization
      • 修改Datanode Transceiver Port 到1004

      • 修改Datanode HTTP Web UI Port 到1006

    • HBASE:

      • sequence
        勾选HBase Service->Configuration->Authentication
      • sequence
        勾选HBase Service->Configuration->Authorization
  5. 启动即可

    重大的bug:

    当我在测试机上成功跑通之后,重新删除了kerberos的数据库后。关闭掉所有服务的安全选项。重新启动后,Generate Credentials不能成功创建账户。而且也连接不到已经存在的账户的内容。第二天回来,发现创建了少量的账户YARN和mapred的账户。但是其它的账户都没有。猜测:可能是因为增加了两个账户分别是

    1. krbtgt/[email protected]
    2. krbtgt/[email protected]

    根据数据库的结构分析,怀疑cloudera manager把keytab都保存了。
    所以,不再重新产生keytab。 
    keytab不能重新生成是一个大问题。

    非CM下的keytab配置

    检查:

    如果JAVA的版本在1.6.21或以前的,会遇到客户端需要renew ticket,才能通过认证。而renwe ticket必须保证kdc的配置文件包含max_renewable_life = 7d项。

    1. 创建账户

      创建所有账户,生成keytab

      我们使用hadoop账户启动所有的服务,所以,只生成hadoop和HTTP账户就足够了

      生成hadoop1-hadoop5机器的hadoop用户

      生成hadoop1-hadoop5机器的HTTP用户

      将hadoop1-hadoop5的hadoop用户和HTTP用户保存为keytab文件

      说明:

      一共添加了10个账户分别是hadoop的hadoop1到hadoop5的账户和HTTP的hadoop1到hadoop5的账户。
      导出账户的时候,把hadoop1机器的hadoop账户和HTTP账户导入到同一个keytab文件中。

      在标准的情况中,依据不同服务的启动者的不同,会创建不同的账户,导出不同的keytab文件。由于我们使用的是hadoop用户启动所有服务的状况,所以一个hadoop.keytab就足够使用了。
      如果像ClouderaManager那样的一个用户启动一种服务,就要创建不同的用户,导出不同的keytab。

      例如:

      hadoop1的zookeeper配置文件中需要zookeeper.keytab,当中含有zookeeper/hadoop1这个账户

      下文提到的配置文件中添加keytab文件,都要求不同机器含有对应的机器名和启动用户的keytab文件。要测试这个机器的keytab文件是否可用,可使用以下命令进行测试:

    2. 为ZK添加认证

      修改zoo.cfg添加配置:

      在配置目录中添加对应账户的keytab文件且创建jaas.conf配置文件,内容如下:

      其中keytab填写真实的keytab的绝对路径,principal填写对应的认证的用户和机器名称。

      在配置目录中添加java.env的配置文件,内容如下:

      每个zookeeper的机器都进行以上的修改

      启动方式和平常无异,如成功使用安全方式启动,日志中看到如下日志:

    3. 为HDFS添加认证

      增加基本配置包括各种的princal和keytab文件的配置。

      生成的hdfs的keytab和HTTP的keytab最好放一起,容易配置。下面的配置中keytab文件使用绝对路径,principal使用_HOST,Hadoop会自动替换为对应的域名。


      core-site.xml:

      hdfs-site.xml:

      请尤其注意dfs.web.authentication.kerberos.principal这个配置项,我在转载这篇的时候看到很多朋友忘记写了,没有这一项的话会在日志里看到Principal not defined in configuration错误

      hadoop-env.sh:

      如果root下没有JAVA_HOME配置,则需要指定JAVA_HOME

    4. 启动:

      设置了Security后,NameNode,QJM,ZKFC可以通过start-dfs.sh启动。DataNode需要使用root权限启动。设置了HADOOP_SECURE_DN_USER的环境变量后,start-dfs.sh的启动脚本将会自动跳过DATANODE的启动。所以,整个启动过程分为以下两步:

      1. 启动NameNode,QJM,ZKFC

        说明:

        查看QJM的日志和ZKFC的日志。检查有无exception。QJM的报错不会有明显的提示。
        如果启动不成功检查以下几点是否做好:

        • QJM和NameNode对应的keytab文件是否包含hadoop账户和HTTP账户对应该机器的kerberos账户。

        • keytab使用绝对路径,可以避免一些问题。

        疑惑:ZKFC中有日志,但是工作正常,大胆预测连接zookeeper不需要强制通过jaas验证。

        TODO:验证此猜想。

      2. 启动DataNode:

        配置JSVC:

        DataNode需要JSVC启动。首先安装JSVC,然后配置的hadoop-env.shJSVC_HOME变量。
        JSVC运行还需要一个commons-daemon-xxx.jar包。从commons/daemon下载一个最新版本的jar包。
        当前,JSVC启动的时候遇到一个奇怪的bug,就是JSVC的classpath不支持*匹配。

        详细修改如下:

        mv问题:由于权限问题,在移动日志文件启动的时候,会询问是否覆盖只读的日志文件。这个会导致使用start-secure-dns.sh启动的时候不顺畅。推荐修改hadoop-daemon.sh74行:

        修改为

      3. 启动:

        • 切换到root用户,需要配置这个root用户免密码登陆到其它的机器。

        • 否则,需要单独登陆到所有机器启动datanode。

    5. 测试:使用任意用户通过keytab文件进行认证,运行hdfs相关命令。

      为YARN添加认证配置

    6. 添加配置

      • yarn.xml:

      • mapred.xml:

    7. 修改container-executor.conf.dir,重新编译container-executor

      • 说明:为什么要编译container-executor?

        答:因为container-executor要求container-executor.cfg这个文件及其所有父目录都属于root用户,且权限小于755。配置文件container-executor.cfg默认的路径在../etc/hadoop/container-executor.cfg。如果,按照默认的路径修改所有父目录都属于root,显然不现实。于是,把路径编译到/etc/container-executor.cfg中。

    8. 创建/etc/container-executor.cfg文件,文件内容如下:

    9. 启动,使用hadoop用户直接启动即可

    10. 检查Nodemanager和Resourcemanager的日志是否有异常。

      一般异常都是因为container-executor.cfg的权限和container-executor的权限问题。请仔细核对:

    11. 测试:使用任意用户通过keytab文件进行认证,运行yarn相关命令。

    为hbase添加认证

    1. 添加配置:

      • hbase-site.xml:

        以下添加到client和server端

你可能感兴趣的:(hadoop)