E-MapReduce(简称EMR)集群中的Kerberos服务端除了支持第一种兼容MIT Kerberos的使用方式,也支持Kerberos客户端使用RAM用户作为身份信息进行身份认证。

RAM身份认证

RAM产品可以创建或管理RAM用户,通过RAM用户实现对云上各个资源的访问控制。

阿里云账号的管理员可以在RAM的用户管理界面创建一个RAM用户(RAM用户名称必须符合linux用户的规范),然后将RAM用户的AccessKey下载下来提供给该RAM用户对应的开发人员,后续开发人员可以配置AccessKey,从而通过Kerberos认证访问集群服务。

下面以已经创建的RAM用户test在Gateway访问为例:
  • EMR集群添加test账号。

    EMR的安全集群的Yarn使用了LinuxContainerExecutor,如果需要在集群上运行Yarn作业,则需要在集群所有节点上添加运行作业的用户账号,LinuxContainerExecutor执行程序过程中会根据用户账号进行相关的权限校验。

    EMR集群管理员在EMR集群的Master节点上执行如下命令。
    sudo su hadoop
    sh adduser.sh test 1 2
    附:adduser.sh代码。
    #添加的账户名称。
     user_name=$1
     #集群Master节点个数,例如HA集群有2个Master节点。
     master_cnt=$2
     #集群Worker节点个数。
     worker_cnt=$3
     for((i=1;i<=$master_cnt;i++))
     do
       ssh -o StrictHostKeyChecking=no emr-header-$i sudo useradd $user_name
     done
     for((i=1;i<=$worker_cnt;i++))
     do
       ssh -o StrictHostKeyChecking=no emr-worker-$i sudo useradd $user_name
    done
  • 在Gateway机器上添加test用户。
    useradd test
  • 配置Kerberos基础环境。
    sudo su root
    sh config_gateway_kerberos.sh 10.27.230.10 /pathto/emrheader1_pwd_file
     #确保Gateway上面/etc/ecm/hadoop-conf/core-site.xml中值为true
     <property>
        <name>hadoop.security.authentication.use.has</name>
        <value>true</value>
     </property>
    附: config_gateway_kerberos.sh脚本代码。
    #EMR集群的emr-header-1的IP。
     masterip=$1
     #保存了masterip对应的root登录密码文件。
     masterpwdfile=$2
     if ! type sshpass >/dev/null 2>&1; then
        yum install -y sshpass
    fi
      ## Kerberos conf
     sshpass -f $masterpwdfile scp root@$masterip:/etc/krb5.conf /etc/
     mkdir /etc/has
     sshpass -f $masterpwdfile scp root@$masterip:/etc/has/has-client.conf /etc/has
     sshpass -f $masterpwdfile scp root@$masterip:/etc/has/truststore /etc/has/
     sshpass -f $masterpwdfile scp root@$masterip:/etc/has/ssl-client.conf /etc/has/
     #修改Kerberos客户端配置,将默认的auth_type从EMR改为RAM。
     #也可以手工修改该文件。
     sed -i 's/EMR/RAM/g' /etc/has/has-client.conf
  • 使用test用户登录Gateway,配置AccessKey。
     #登录Gateway的test账号。
     sh add_accesskey.sh test
    附: add_accesskey.sh脚本(修改AccessKey)。
    user=$1
     if [[ `cat /home/$user/.bashrc | grep 'export AccessKey'` == "" ]];then
     echo "
     #修改为test用户的AccessKeyId/AccessKeySecret
     export AccessKeyId=YOUR_AccessKeyId
     export AccessKeySecret=YOUR_AccessKeySecret
     " >>~/.bashrc
     else
        echo $user AccessKey has been added to .bashrc
     fi
  • 使用test用户,执行如下命令。
    1. 执行HDFS命令。
      hadoop fs -ls /
      返回信息如下:
      17/11/19 12:32:15 INFO client.HasClient: The plugin type is: RAM
      Found 4 items
      drwxr-x---   - has    hadoop          0 2017-11-18 21:12 /apps
      drwxrwxrwt   - hadoop hadoop          0 2017-11-19 12:32 /spark-history
      drwxrwxrwt   - hadoop hadoop          0 2017-11-18 21:16 /tmp
      drwxrwxrwt   - hadoop hadoop          0 2017-11-18 21:16 /user
    2. 运行Hadoop作业。
      hadoop jar /usr/lib/hadoop-current/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar pi 10 1
    3. 运行Spark作业。
      spark-submit --conf spark.ui.view.acls=* --class org.apache.spark.examples.SparkPi --master yarn-client --driver-memory 512m --num-executors 1 --executor-memory 1g --executor-cores 2 /usr/lib/spark-current/examples/jars/spark-examples_2.11-2.1.1.jar 10