在KDC上创建kerberos实例
① 以root用户,输入kadmin.local进入kerberos命令行,在kerberos数据库中生成实例
addprinc -randkey hadoop/[email protected]
addprinc -randkey hadoop/[email protected]
addprinc -randkey hadoop/[email protected]
addprinc -randkey HTTP/[email protected]
addprinc -randkey HTTP/[email protected]
addprinc -randkey HTTP/[email protected]
②退出kerberos命令行,以root用户,为各实例生成密钥
kadmin.local -q "xst -k hadoop.keytab hadoop/[email protected]"
kadmin.local -q "xst -k hadoop.keytab hadoop/[email protected]"
kadmin.local -q "xst -k hadoop.keytab hadoop/[email protected]"
kadmin.local -q "xst -k HTTP.keytab HTTP/[email protected]"
kadmin.local -q "xst -k HTTP.keytab HTTP/[email protected]"
kadmin.local -q "xst -k HTTP.keytab HTTP/[email protected]"
此时,生成的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
hadoop.security.authentication
kerberos
hadoop.security.authorization
true
以上配置,表示开启安全认证功能并且采用kerberos认证。
②修改hdfs-site.xml
dfs.block.access.token.enable
true
dfs.https.enable
true
dfs.https.policy
HTTPS_ONLY
dfs.namenode.https-address.pin-cluster1.namenode
namenode:50470
dfs.https.port
50470
dfs.namenode.keytab.file
/home/hadoop/hdfs.keytab
dfs.namenode.kerberos.principal
hadoop/[email protected]
dfs.namenode.kerberos.internal.spnego.principal
HTTP/[email protected]
dfs.datanode.data.dir.perm
700
dfs.datanode.address
0.0.0.0:1004
dfs.datanode.http.address
0.0.0.0:1006
dfs.datanode.keytab.file
/home/hadoop/hdfs.keytab
dfs.datanode.kerberos.principal
hadoop/[email protected]
dfs.journalnode.keytab.file
/home/hadoop/hdfs.keytab
dfs.journalnode.kerberos.principal
hadoop/[email protected]
dfs.journalnode.kerberos.internal.spnego.principal
HTTP/[email protected]
dfs.web.authentication.kerberos.principal
HTTP/[email protected]
dfs.web.authentication.kerberos.keytab
/home/hadoop/hdfs.keytab
以上主要配置了kerberos实例,以及keytab的存放位置。
③修改yarn-site.xml
yarn.resourcemanager.keytab
/home/hadoop/hdfs.keytab
yarn.resourcemanager.principal
hadoop/[email protected]
yarn.nodemanager.keytab
/home/hadoop/hdfs.keytab
yarn.nodemanager.principal
hadoop/[email protected]
yarn.nodemanager.container-executor.class
org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor
yarn.nodemanager.linux-container-executor.group
hadoop
yarn.https.policy
HTTPS_ONLY
④修改mapred-site.xml
mapreduce.jobhistory.keytab
/home/hadoop/hdfs.keytab
mapreduce.jobhistory.principal
hadoop/[email protected]
mapreduce.jobhistory.http.policy
HTTPS_ONLY
⑤在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/[email protected]";
};
同时在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/[email protected]
此时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/[email protected]";
};
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文件
hbase.rootdir
hdfs://192.168.6.186:9000/hbase
hbase.zookeeper.quorum
namenode,datanode1,datanode2
hbase.master
namenode:60000
hbase.zookeeper.property.clientPort
2181
dfs.support.append
true
zookeeper.znode.parent
/hbase
hbase.zookeeper.property.dataDir
/home/hadoop/hbase/zookeeper
hbase.tmp.dir
/tmp/hbase
hbase.zookeeper.property.maxClientCnxns
0
zookeeper.session.timeout
1200000
hbase.rest.port
60050
hbase.replication
1
hbase.security.authorization
true
hbase.coprocessor.master.classes
org.apache.hadoop.hbase.security.access.AccessController
hbase.coprocessor.region.classes
org.apache.hadoop.hbase.security.token.TokenProvider,
org.apache.hadoop.hbase.security.access.AccessController
hbase.security.authentication
kerberos
hbase.rpc.engine
org.apache.hadoop.hbase.ipc.SecureRpcEngine
hbase.regionserver.kerberos.principal
hadoop/[email protected]
hbase.regionserver.keytab.file
/home/hadoop/hdfs.keytab
hbase.master.kerberos.principal
hadoop/[email protected]
hbase.master.keytab.file
/home/hadoop/hdfs.keytab
hbase.master.maxclockskew
1800000
Time difference of regionserver from master
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/[email protected]";
};
d. 启动HBase
Hive集成kerberos