在KDC上创建kerberos实例
① 以root用户,输入kadmin.local进入kerberos命令行,在kerberos数据库中生成实例
addprinc -randkey hadoop/namenode@SILENCE.COM addprinc -randkey hadoop/datanode1@SILENCE.COM addprinc -randkey hadoop/datanode2@SILENCE.COM addprinc -randkey HTTP/namenode@SILENCE.COM addprinc -randkey HTTP/datanode1@SILENCE.COM addprinc -randkey HTTP/datanode2@SILENCE.COM
②退出kerberos命令行,以root用户,为各实例生成密钥
kadmin.local -q "xst -k hadoop.keytab hadoop/namenode@SILENCE.COM" kadmin.local -q "xst -k hadoop.keytab hadoop/datanode1@SILENCE.COM" kadmin.local -q "xst -k hadoop.keytab hadoop/datanode2@SILENCE.COM" kadmin.local -q "xst -k HTTP.keytab HTTP/namenode@SILENCE.COM" kadmin.local -q "xst -k HTTP.keytab HTTP/datanode1@SILENCE.COM" kadmin.local -q "xst -k HTTP.keytab HTTP/datanode2@SILENCE.COM" 此时,生成的keytab都在root根目录下。
③在root命令行,合并hadoop.keytab和HTTP.keytab为hdfs.keytab。
ktutil rkt hadoop.keytab rkt HTTP.keytab wkt hdfs.keytab
将hdfs.keytab文件复制到/home/hadoop/目录。并向hadoop各节点分发。
④注意
a. 主机名一定要小写,通过kinit申请TGT票据时kerberos会将无论大小写都视为小写,生成票据。而实例中如果是大写主机名,则会使得kerberos库中对应的实例无法产生票据。
b. hadoop/namenode,其中的namenode只是作为一个标志,代表这个hadoop用户与另一个hadoop用户属于不同的主机而已。所有,如果hostname为大写,那么此处仍必须以小写作为输入。
hdfs集成kerberos。(先停止集群)
①修改core_site.xml
<property> <name>hadoop.security.authentication</name> <value>kerberos</value> </property> <property> <name>hadoop.security.authorization</name> <value>true</value> </property>
以上配置,表示开启安全认证功能并且采用kerberos认证。
②修改hdfs-site.xml
<property> <name>dfs.block.access.token.enable</name> <value>true</value> </property> <property> <name>dfs.https.enable</name> <value>true</value> </property> <property> <name>dfs.https.policy</name> <value>HTTPS_ONLY</value> </property> <property> <name>dfs.namenode.https-address.pin-cluster1.namenode</name> <value>namenode:50470</value> </property> <property> <name>dfs.https.port</name> <value>50470</value> </property> <property> <name>dfs.namenode.keytab.file</name> <value>/home/hadoop/hdfs.keytab</value> </property> <property> <name>dfs.namenode.kerberos.principal</name> <value>hadoop/_HOST@SILENCE.COM</value> </property> <property> <name>dfs.namenode.kerberos.internal.spnego.principal</name> <value>HTTP/_HOST@SILENCE.COM</value> </property> <property> <name>dfs.datanode.data.dir.perm</name> <value>700</value> </property> <property> <name>dfs.datanode.address</name> <value>0.0.0.0:1004</value> </property> <property> <name>dfs.datanode.http.address</name> <value>0.0.0.0:1006</value> </property> <property> <name>dfs.datanode.keytab.file</name> <value>/home/hadoop/hdfs.keytab</value> </property> <property> <name>dfs.datanode.kerberos.principal</name> <value>hadoop/_HOST@SILENCE.COM</value> </property> <property> <name>dfs.journalnode.keytab.file</name> <value>/home/hadoop/hdfs.keytab</value> </property> <property> <name>dfs.journalnode.kerberos.principal</name> <value>hadoop/_HOST@SILENCE.COM</value> </property> <property> <name>dfs.journalnode.kerberos.internal.spnego.principal</name> <value>HTTP/_HOST@SILENCE.COM</value> </property> <property> <name>dfs.web.authentication.kerberos.principal</name> <value>HTTP/_HOST@SILENCE.COM</value> </property> <property> <name>dfs.web.authentication.kerberos.keytab</name> <value>/home/hadoop/hdfs.keytab</value> </property>
以上主要配置了kerberos实例,以及keytab的存放位置。
③修改yarn-site.xml
<property> <name>yarn.resourcemanager.keytab</name> <value>/home/hadoop/hdfs.keytab</value> </property> <property> <name>yarn.resourcemanager.principal</name> <value>hadoop/_HOST@SILENCE.COM</value> </property> <property> <name>yarn.nodemanager.keytab</name> <value>/home/hadoop/hdfs.keytab</value> </property> <property> <name>yarn.nodemanager.principal</name> <value>hadoop/_HOST@SILENCE.COM</value> </property> <property> <name>yarn.nodemanager.container-executor.class</name> <value>org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor</value> </property> <property> <name>yarn.nodemanager.linux-container-executor.group</name> <value>hadoop</value> </property> <property> <name>yarn.https.policy</name> <value>HTTPS_ONLY</value>
④修改mapred-site.xml
<property> <name>mapreduce.jobhistory.keytab</name> <value>/home/hadoop/hdfs.keytab</value> </property> <property> <name>mapreduce.jobhistory.principal</name> <value>hadoop/_HOST@SILENCE.COM</value> </property> <property> <name>mapreduce.jobhistory.http.policy</name> <value>HTTPS_ONLY</value> </property>
⑤在zookeeper的zoo.cfg文件中加入:
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider jaasLoginRenew=3600000
同时在zoo.cfg所在的文件目录下创建一个jaas.conf文件,加入:
Server { com.sun.security.auth.module.Krb5LoginModulerequired useKeyTab=true keyTab="/home/hadoop/hdfs.keytab" storeKey=true useTicketCache=false principal="hadoop/namenode@SILENCE.COM"; };
同时在zoo.cfg所在的文件目录下创建一个java.env文件,加入:
exportJVMFLAGS="-Djava.security.auth.login.config=$ZOOKEEPER_HOME/conf/jaas.conf"
注意:
a. 此zookeeper需要使用外部zookeeper,而不是hbase自带的。
b. jaas.conf中的principal应根据不同的主机进行相应的更改。
c. 以上所有文件的修改均需要同步到集群所有节点
⑥修改hadoop-env.sh
export HADOOP_SECURE_DN_USER=hadoop export HADOOP_SECURE_DN_PID_DIR=/home/hadoop/pids export HADOOP_SECURE_DN_LOG_DIR=/home/hadoop/logs export JSVC_HOME=/home/hadoop/commons-daemon-1.0.15-src/src/native/unix/
注意:jsvc需要另外安装,安装步骤如下:
a.下载commons-daemon-1.0.15-src.tar.gz
b. 解压后进入commons-daemon-1.0.15-src/src/native/unix
c. 在hadoop命令行输入:
sh support/buildconf.sh ./configure (这一步的执行需要配置好JAVA_HOME) make
命令行输入:
./jsvc -help,测试是否编译成功
d. 编译成功后当前目录下将出现一个jsvc文件,将此文件路径配置到hadoop-env.sh中
⑦修改container-executor.cfg
yarn.nodemanager.local-dirs=/home/hadoop/etc/hadoop/data yarn.nodemanager.log-dirs=/home/hadoop/etc/hadoop/logs, allowed.system.users=root,silence,hadoop yarn.nodemanager.linux-container-executor.group=hadoop # banned.users=hadoop min.user.id=1
注意:
yarn-nodemanager.local-dirs和yarn.nodemanager.log-dirs要和yarn-site.xml中配置一致。min.user.id也要注意,这里设定的是可以使用提交任务用户id的最小值,通过:id 用户名,可以查看用户id。默认是1000如果不配置的话,这样如果用户id小于1000,则提交任务报错。所以这里设定成了1.原本1000是为了防止其它的超级用户使用集群的。
⑧编译源码
因为container-executor(在 HADOOP_HOME/bin下)要求container-executor.cfg这个文件及其所有父目录都属于root用户,否则启动nodemanager会报错。配置文件container-executor.cfg默认的路径在HADOOP_HOME/etc/hadoop/container-executor.cfg。如果,按照默认的路径修改所有父目录都属于root,显然不可能。于是,把路径编译到/etc/container-executor.cfg中。
a. 下载hadoop-2,7,2-src源码包解压,进入src目录下,执行
mvn package -Pdist,native -DskipTests -Dtar -Dcontainer-executor.conf.dir=/etc
b. 进入hadoop-2.7.2/src/hadoop-dist/target下,用新生成的container-executor替换所有节点原来的container-executor,并且所有节点上均要将HADOOP_HOME/etc/hadoop下的container-executor.cfg文件复制到/etc 下,且设置权限为root:root。在bin文件夹下执行strings container-executor | grep etc如果结果是/etc而非../etc,则表示操作成功了。另外最重要的是将bin下的container-executor文件权限设定为root:hadoop和4750,如果权限不是4750,则启动nodemanager时会报错,报错是不能提供合理的container-executor.cfg文件。
⑨启动集群:
bin/zkServcer.sh start sbin/start-dfs.sh sbin/start-secure-dns.sh (以root执行) sbin/start-yarn.sh bin/start-hbase.sh
⑩验证kerberos服务
a. 尝试执行:
hadoop dfs -ls
b. hadoop用户下执行:
kinit -k -e /home/hadoop/hdfs.keytab hadoop/namenode@SILENCE.COM 此时hadoop用户将向KDC申请一张票据
c. 启动kerberos服务:
sudo krb5kdc sudo kerberos
d. 再次执行:
hadoop dfs -ls
HBase集成kerberos
①zookeeper配置
a. 修改jaas.conf文件
Server { com.sun.security.auth.module.Krb5LoginModulerequired useKeyTab=true keyTab="/home/hadoop/hdfs.keytab" storeKey=true useTicketCache=false principal="hadoop/namenode@SILENCE.COM"; };
b. 修改java.env文件
exportJVMFLAGS="-Djava.security.auth.login.config =$ZOOKEEPER_HOME/conf/jaas.conf" export JAVA_HOME="/home/hadoop/jdk8"
c. 修改zoo.cfg文件
tickTime=2000 initLimit=10 syncLimit=5 clientPort=2181 dataDir=/home/hadoop/zookeeper-3.4.6/data server.3 =namenode:2888:3888 server.1 =datanode1:2888:3888 server.2 =datanode2:2888:3888 skipACL=yes dataLogDir=/home/hadoop/zookeeper-3.4.6/logs authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider jaasLoginRenew=3600000
②HBase配置(先停止HBase集群)
a. 修改hbase-env.sh文件
export JAVA_HOME=/home/hadoop/jdk8 export HBASE_OPTS="-XX:+UseConcMarkSweepGC -Djava.security.auth.login.config =/home/hadoop/hbase/conf/zk-jaas.conf" export HBASE_MANAGES_ZK=false
b. 修改HBase-site.xml文件
<property> <name>hbase.rootdir</name> <value>hdfs://192.168.6.186:9000/hbase</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>namenode,datanode1,datanode2</value> </property> <property> <name>hbase.master</name> <value>namenode:60000</value> </property> <property> <name>hbase.zookeeper.property.clientPort</name> <value>2181</value> </property> <property> <name>dfs.support.append</name> <value>true</value> </property> <property> <name>zookeeper.znode.parent</name> <value>/hbase</value> </property> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/home/hadoop/hbase/zookeeper</value> </property> <property> <name>hbase.tmp.dir</name> <value>/tmp/hbase</value> </property> <property> <name>hbase.zookeeper.property.maxClientCnxns</name> <value>0</value> </property> <property> <name>zookeeper.session.timeout</name> <value>1200000</value> </property> <property> <name>hbase.rest.port</name> <value>60050</value> </property> <property> <name>hbase.replication</name> <value>1</value> </property> <property> <name>hbase.security.authorization</name> <value>true</value> </property> <property> <name>hbase.coprocessor.master.classes</name> <value>org.apache.hadoop.hbase.security.access.AccessController</value> </property> <property> <name>hbase.coprocessor.region.classes</name> <value>org.apache.hadoop.hbase.security.token.TokenProvider, org.apache.hadoop.hbase.security.access.AccessController</value> </property> <property> <name>hbase.security.authentication</name> <value>kerberos</value> </property> <property> <name>hbase.rpc.engine</name> <value>org.apache.hadoop.hbase.ipc.SecureRpcEngine</value> </property> <property> <name>hbase.regionserver.kerberos.principal</name> <value>hadoop/_HOST@SILENCE.COM</value> </property> <property> <name>hbase.regionserver.keytab.file</name> <value>/home/hadoop/hdfs.keytab</value> </property> <property> <name>hbase.master.kerberos.principal</name> <value>hadoop/_HOST@SILENCE.COM</value> </property> <property> <name>hbase.master.keytab.file</name> <value>/home/hadoop/hdfs.keytab</value> </property> <property> <name>hbase.master.maxclockskew</name> <value>1800000</value> <description>Time difference of regionserver from master</description> </property>
c. 修改hbase/conf下的jaas.conf文件
Client { com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true keyTab="/home/hadoop/hdfs.keytab" storeKey=true useTicketCache=false principal="hadoop/_HOST@SILENCE.COM"; };
d. 启动HBase
Hive集成kerberos
Hadoop_Kerberos配置过程记录
最新推荐文章于 2025-06-24 14:12:36 发布