Kerberos概述
Kerberos术语
KDC:密钥分发中心,负责存储用户信息,管理发放票据
Realm:Kerberos所管理的一个领域或范围,称之为一个Realm
Principal:Kerberos所管理的一个用户或者一个服务,可以理解为Kerberos中保存的一个账号,格式为:primary/instance@realm
Keytab:Kerberos中的用户认证,可通过密码或者密钥文件证明身份,keytab指密钥文件
Kerberos部署
安装Kerberos相关服务
选择集群中的一台主机作为Kerberos服务端,安装KDC。其他主机都需要部署Kerberos客户端
# 服务端主机执行以下安装命令
yum install -y krb5-server
# 客户端主机执行以下安装命令
yum install -y krb5-workstation krb5-libs
修改配置文件
服务端主机:修改/var/kerberos/krb5kdc/kdc.conf
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
EXAMPLE.COM = {
#master_key_type = aes256-cts
acl_file = /var/kerberos/krb5kdc/kadm5.acl
dict_file = /usr/share/dict/words
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
}
客户端主机(所有主机):修改/etc/krb5.conf
初始化KDC数据库
在服务端主机执行以下命令,并根据提示输入密码
kdb5_util create -s
修改管理员权限配置文件
在服务端主机修改/var/kerberos/krb5kdc/kadm5.acl
*/admin@EXAMPLE.COM *
启动Kerberos相关服务
在主节点启动KDC,并配置开机自启
systemctl start krb5kdc
systemctl enable krb5kdc
在主节点启动Kadmin,该服务为KDC数据库访问入口
systemctl start kadmin
systemctl enable kadmin
创建Kerberos管理员用户
在KDC所在主机执行,并按提示输入密码
kadmin.local -q "addprinc admin/admin"
Kerberos基本使用
Kerberos数据库操作
登录数据库
本地登录(无需认证)
kadmin.local
远程登录(需要进行主体认证)
kadmin
退出数据库
q
创建Kerberos主体
登录数据库并执行,按提示输入密码
addprinc test
也可以通过shell命令直接创建主体
kadmin.local -q"addprinc test"
修改主体密码
cpw test
查看所有主体
list_principals
Kerberos认证操作
密码认证
使用kinit进行主体认证,并按提示输入密码
kinit test
查看认证凭证
klist
密钥文件认证
生成主体test的keytab文件到指定目录/root/test/test.keytab
# -norandkey的作用是声明不随机生成密码,若不加该参数,会导致之前的密码失效
kadmin.local -q "xst -norandkey -k /root/test.keytab test@EXAMPLE.COM"
使用keytab进行认证
kinit -kt /root/test.keytab test
销毁凭证
kdestroy
Kerberos生成Keytab
执行创建主体的语句,需要登录Kerberos数据客户端,登录之前需要先使用Kerberos的管理员用户进行认证,执行如下代码并按提示输入密码
kinit admin/admin
登录数据库客户端
kadmin
执行创建主体的语句
# addprinc创建主体
# -randkey:密码随机,因hadoop各服务均通过keytab文件认证,故密码可随机生成
# test/test:新增的主体
addprinc -randkey test/test
# 将主体的密钥写入keytab文件
# -k 指明keytab文件路径和文件名
# test/test:主体
xst -norandkey -k /etc/security/keytab/test.keytab test/test
上述认证、登录、执行三步骤创建主体,可以在shell用如下快捷创建
# -p 主体
# -w 密码
# -q 执行语句
kadmin -padmin/admin -wadmin -q"addprinc -randkey test/test"
kadmin -padmin/admin -wadmin -q"xst -norandkey -k /etc/security/keytab/test.keytab test/test"
其他操作可查询官网
Hadoop Kerberos配置
创建Hadoop系统用户
为Hadoop开启Kerberos,需为不同服务准备不同的用户,启动服务时需要使用相应的用户。须在所有节点创建以下用户和用户组
User:Group | Daemons |
---|
hdfs:hadoop | NameNode, Secondary NameNode, JournalNode, DataNode | yarn:hadoop | ResourceManager, NodeManager | mapred:hadoop | MapReduce JobHistory Server |
创建hadoop组
集群中都要创建
groupadd hadoop
创建各个用户并设置密码
集群中都要创建
useradd hdfs -g hadoop
echo hdfs | passwd --stdin hdfs
useradd yarn -g hadoop
echo yarn | passwd --stdin yarn
useradd mapred -g hadoop
echo mapred | passwd --stdin mapred
为Hadoop各服务创建Kerberos主体
主体格式为serviceName/hostName@REALM 如:datanode/bigdata100@EXAMPLE.COM
环境:3台节点,主机分别为bigdata100、bigdata102、bigdata104
服务 | 所在主机 | 主体 |
---|
NameNode | bigdata100 | nn/bigdata100 | DataNode | bigdata100、bigdata102、bigdata104 | dn/bigdata100、dn/bigdata102、dn/bigdata104 | Secondary NameNode | bigdata104 | sn/bigdata104 | ResourceManager | bigdata102 | rm/bigdata102 | NodeManager | bigdata100、bigdata102、bigdata104 | nm/bigdata100、nm/bigdata102、nm/bigdata104 | JobHistory Server | bigdata100 | jhs/bigdata100 | Web UI | bigdata100、bigdata102、bigdata104 | HTTP/bigdata100、HTTP/bigdata102、HTTP/bigdata104 |
创建keytab存放位置
为服务创建的主体,需要通过密钥文件keytab文件进行认证,故需要准备一个安全的路径来存放keytab文件,在所有集群中创建keytab文件目录
mkdir /etc/security/keytab/
chown -R root:hadoop /etc/security/keytab/
chmod 770 /etc/security/keytab/
创建主体
NameNode:bigdata100执行
kadmin -padmin/admin -wadmin -q"addprinc -randkey nn/bigdata100"
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/nn.service.keytab nn/bigdata100"
DataNode:bigdata100、bigdata102、bigdata104执行
kadmin -padmin/admin -wadmin -q"addprinc -randkey dn/bigdata100"
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/dn.service.keytab dn/bigdata100"
kadmin -padmin/admin -wadmin -q"addprinc -randkey dn/bigdata102"
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/dn.service.keytab dn/bigdata102"
kadmin -padmin/admin -wadmin -q"addprinc -randkey dn/bigdata104"
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/dn.service.keytab dn/bigdata104"
Secondary NameNode:bigdata104执行
kadmin -padmin/admin -wadmin -q"addprinc -randkey sn/bigdata104"
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/sn.service.keytab sn/bigdata104"
ResourceManager:bigdata102执行
kadmin -padmin/admin -wadmin -q"addprinc -randkey rm/bigdata102"
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/rm.service.keytab rm/bigdata102"
NodeManager:bigdata100、bigdata102、bigdata104执行
kadmin -padmin/admin -wadmin -q"addprinc -randkey nm/bigdata100"
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/nm.service.keytab nm/bigdata100"
kadmin -padmin/admin -wadmin -q"addprinc -randkey nm/bigdata102"
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/nm.service.keytab nm/bigdata102"
kadmin -padmin/admin -wadmin -q"addprinc -randkey nm/bigdata104"
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/nm.service.keytab nm/bigdata104"
JobHistory Server:bigdata100执行
kadmin -padmin/admin -wadmin -q"addprinc -randkey jhs/bigdata100"
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/jhs.service.keytab jhs/bigdata100"
Web UI:bigdata100、bigdata102、bigdata104执行
kadmin -padmin/admin -wadmin -q"addprinc -randkey HTTP/bigdata100"
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/spnego.service.keytab HTTP/bigdata100"
kadmin -padmin/admin -wadmin -q"addprinc -randkey HTTP/bigdata102"
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/spnego.service.keytab HTTP/bigdata102"
kadmin -padmin/admin -wadmin -q"addprinc -randkey HTTP/bigdata104"
kadmin -padmin/admin -wadmin -q"xst -k /etc/security/keytab/spnego.service.keytab HTTP/bigdata104"
修改所有集群中keytab文件的所有者和访问权限
chown -R root:hadoop /etc/security/keytab/
chmod 660 /etc/security/keytab/*
修改Hadoop配置文件
各文件新增如下内容,并且分发到集群中
core-site.xml
<property>
<name>hadoop.security.auth_to_local.mechanism</name>
<value>MIT</value>
</property>
<property>
<name>hadoop.security.auth_to_local</name>
<value>
RULE:[2:$1/$2@$0]([ndj]n\/.*@EXAMPLE\.COM)s/.*/hdfs/
RULE:[2:$1/$2@$0]([rn]m\/.*@EXAMPLE\.COM)s/.*/yarn/
RULE:[2:$1/$2@$0](jhs\/.*@EXAMPLE\.COM)s/.*/mapred/
DEFAULT
</value>
</property>
<property>
<name>hadoop.security.authentication</name>
<value>kerberos</value>
</property>
<property>
<name>hadoop.security.authorization</name>
<value>true</value>
</property>
<property>
<name>hadoop.rpc.protection</name>
<value>authentication</value>
</property>
hdfs-site.xml
<property>
<name>dfs.block.access.token.enable</name>
<value>true</value>
</property>
<property>
<name>dfs.namenode.kerberos.principal</name>
<value>nn/_HOST@EXAMPLE.COM</value>
</property>
<property>
<name>dfs.namenode.keytab.file</name>
<value>/etc/security/keytab/nn.service.keytab</value>
</property>
<property>
<name>dfs.secondary.namenode.keytab.file</name>
<value>/etc/security/keytab/sn.service.keytab</value>
</property>
<property>
<name>dfs.secondary.namenode.kerberos.principal</name>
<value>sn/_HOST@EXAMPLE.COM</value>
</property>
<property>
<name>dfs.namenode.kerberos.internal.spnego.principal</name>
<value>HTTP/_HOST@EXAMPLE.COM</value>
</property>
<property>
<name>dfs.web.authentication.kerberos.principal</name>
<value>HTTP/_HOST@EXAMPLE.COM</value>
</property>
<property>
<name>dfs.secondary.namenode.kerberos.internal.spnego.principal</name>
<value>HTTP/_HOST@EXAMPLE.COM</value>
</property>
<property>
<name>dfs.web.authentication.kerberos.keytab</name>
<value>/etc/security/keytab/spnego.service.keytab</value>
</property>
<property>
<name>dfs.datanode.kerberos.principal</name>
<value>dn/_HOST@EXAMPLE.COM</value>
</property>
<property>
<name>dfs.datanode.keytab.file</name>
<value>/etc/security/keytab/dn.service.keytab</value>
</property>
<property>
<name>dfs.http.policy</name>
<value>HTTPS_ONLY</value>
</property>
<property>
<name>dfs.data.transfer.protection</name>
<value>authentication</value>
</property>
yarn-site.xml
<property>
<name>yarn.resourcemanager.principal</name>
<value>rm/_HOST@EXAMPLE.COM</value>
</property>
<property>
<name>yarn.resourcemanager.keytab</name>
<value>/etc/security/keytab/rm.service.keytab</value>
</property>
<property>
<name>yarn.nodemanager.principal</name>
<value>nm/_HOST@EXAMPLE.COM</value>
</property>
<property>
<name>yarn.nodemanager.keytab</name>
<value>/etc/security/keytab/nm.service.keytab</value>
</property>
mapred-site.xml
<property>
<name>mapreduce.jobhistory.keytab</name>
<value>/etc/security/keytab/jhs.service.keytab</value>
</property>
<property>
<name>mapreduce.jobhistory.principal</name>
<value>jhs/_HOST@EXAMPLE.COM</value>
</property>
配置HDFS使用HTTPS安全传输协议
生成密钥对
Keytool是java数据证书的管理工具,使用户能够管理自己的公/私钥对及相关证书
-keystore:指定密钥库的名称及位置(产生的各类信息将存在.keystore文件中)
-genkey(或者-genkeypair):生成密钥对
-alias:为生成的密钥对指定别名,如果没有默认是mykey
-keyalg:指定密钥的算法RSA/DSA 默认是DSA
生成keystore的密码及相应信息的密钥库
keytool -keystore /etc/security/keytab/keystore -alias jetty -genkey -keyalg RSA
修改keystore文件的所有者和访问权限
chown -R root:hadoop /etc/security/keytab/keystore
chmod 660 /etc/security/keytab/keystore
密钥库的密码至少6个字符,可以是纯数字或者字母或者数字和字母的组合等等
确保hdfs用户(HDFS的启动用户)具有对所生成keystore文件的读权限
将该证书分发到集群中的每台节点相同路径
xsync /etc/security/keytab/keystore
修改hadoop配置文件ssl-server.xml
该文件位于$HADOOP_HOME/etc/hadoop下
mv $HADOOP_HOME/etc/hadoop/ssl-server.xml.example $HADOOP_HOME/etc/hadoop/ssl-server.xml
<property>
<name>ssl.server.keystore.location</name>
<value>/etc/security/keytab/keystore</value>
</property>
<property>
<name>ssl.server.keystore.password</name>
<value>123456</value>
</property>
<property>
<name>ssl.server.truststore.location</name>
<value>/etc/security/keytab/keystore</value>
</property>
<property>
<name>ssl.server.keystore.keypassword</name>
<value>123456</value>
</property>
<property>
<name>ssl.server.truststore.password</name>
<value>123456</value>
</property>
分发ssl-server.xml
xsync $HADOOP_HOME/etc/hadoop/ssl-server.xml
配置Yarn使用LinuxContainerExecutor
修改所有节点的container-executor所有者和权限,要求其所有者为root,所有组为hadoop(启动NodeManger的yarn用户的所属组),权限为6050。其默认路径为$HADOOP_HOME/bin,所有集群中都要执行
chown root:hadoop /opt/module/hadoop-3.1.3/bin/container-executor
chmod 6050 /opt/module/hadoop-3.1.3/bin/container-executor
修改所有节点的container-executor.cfg文件的所有者和权限,要求该文件及其所有的上级目录的所有者均为root,所有组为hadoop(启动NodeManger的yarn用户的所属组),权限为400。其默认路径为$HADOOP_HOME/etc/hadoop
chown root:hadoop /opt/module/hadoop-3.1.3/etc/hadoop/container-executor.cfg
chown root:hadoop /opt/module/hadoop-3.1.3/etc/hadoop
chown root:hadoop /opt/module/hadoop-3.1.3/etc
chown root:hadoop /opt/module/hadoop-3.1.3
chown root:hadoop /opt/module
chmod 400 /opt/module/hadoop-3.1.3/etc/hadoop/container-executor.cfg
修改container-executor.cfg和yarn-site.xml
文件位于$HADOOP_HOME/etc/hadoop下
yarn.nodemanager.linux-container-executor.group=hadoop
banned.users=hdfs,yarn,mapred
min.user.id=1000
allowed.system.users=
feature.tc.enabled=false
<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.nodemanager.linux-container-executor.path</name>
<value>/opt/module/hadoop-3.1.3/bin/container-executor</value>
</property>
分发container-executor.cfg和yarn-site.xml文件
xsync container-executor.cfg
xsync yarn-site.xml
安全模式下启动Hadoop集群
修改特定本地路径权限
Location | Args | User:Group | rwx |
---|
lcocal | $HADOOP_LOG_DIR | hdfs:hadoop | drwxrwxr-x | lcocal | dfs.namenode.name.dir | hdfs:hadoop | drwx------ | lcocal | dfs.namenode.data.dir | hdfs:hadoop | drwx------ | lcocal | dfs.namenode.checkpoint.dir | hdfs:hadoop | drwx------ | lcocal | yarn.nodemanager.local-dirs | yarn:hadoop | drwxrwxr-x | lcocal | yarn.nodemanager.log-dirs | yarn:hadoop | drwxrwxr-x |
$HADOOP_LOG_DIR所有节点:bigdata100、bigdata102、bigdata104
该变量位于hadoop-env.sh文件,默认值为 ${HADOOP_HOME}/logs
chown hdfs:hadoop /opt/module/hadoop-3.1.3/logs/
chmod 775 /opt/module/hadoop-3.1.3/logs/
dfs.namenode.name.dir(NameNode节点):bigdata100
该参数位于hdfs-site.xml文件,默认值为file://${hadoop.tmp.dir}/dfs/name
chown -R hdfs:hadoop /opt/module/hadoop-3.1.3/data/dfs/name/
chmod 700 /opt/module/hadoop-3.1.3/data/dfs/name/
dfs.datanode.data.dir(DataNode节点):bigdata100、bigdata102、bigdata104
该参数为于hdfs-site.xml文件,默认值为file://${hadoop.tmp.dir}/dfs/data
chown -R hdfs:hadoop /opt/module/hadoop-3.1.3/data/dfs/data/
chmod 700 /opt/module/hadoop-3.1.3/data/dfs/data/
dfs.namenode.checkpoint.dir(SecondaryNameNode节点):bigdata104
该参数位于hdfs-site.xml文件,默认值为file://${hadoop.tmp.dir}/dfs/namesecondary
chown -R hdfs:hadoop /opt/module/hadoop-3.1.3/data/dfs/namesecondary/
chmod 700 /opt/module/hadoop-3.1.3/data/dfs/namesecondary/
yarn.nodemanager.local-dirs(NodeManager节点):bigdata100、bigdata102、bigdata104
该参数位于yarn-site.xml文件,默认值为file://${hadoop.tmp.dir}/nm-local-dir
chown -R yarn:hadoop /opt/module/hadoop-3.1.3/data/nm-local-dir/
chmod -R 775 /opt/module/hadoop-3.1.3/data/nm-local-dir/
yarn.nodemanager.log-dirs(NodeManager节点):bigdata100、bigdata102、bigdata104
该参数位于yarn-site.xml文件,默认值为$HADOOP_LOG_DIR/userlogs
chown yarn:hadoop /opt/module/hadoop-3.1.3/logs/userlogs/
chmod 775 /opt/module/hadoop-3.1.3/logs/userlogs/
启动HDFS
启动不同服务时需要使用对应的用户
单点启动
启动NameNode:bigdata100
# -i:重新加载环境变量
# -u:以特定用户的身份执行后续命令
sudo -i -u hdfs hdfs --daemon start namenode
启动DataNode,所有集群都要执行bigdata100、bigdata102、bigdata104
# -i:重新加载环境变量
# -u:以特定用户的身份执行后续命令
sudo -i -u hdfs hdfs --daemon start datanode
启动SecondaryNameNode,bigdata104
# -i:重新加载环境变量
# -u:以特定用户的身份执行后续命令
sudo -i -u hdfs hdfs --daemon start secondarynamenode
群起
在主节点bigdata100配置hdfs用户到所有节点的免密登录
# 切换到hdfs用户
su hdfs
# 生成公钥私钥
ssh-keygen -t rsa
# 拷贝到集群上
ssh-copy-id bigdata100
ssh-copy-id bigdata102
ssh-copy-id bigdata104
修改主节点bigdata100节点的$HADOOP_HOME/sbin/start-dfs.sh脚本,在顶部增加以下环境变量
HDFS_DATANODE_USER=hdfs
HDFS_NAMENODE_USER=hdfs
HDFS_SECONDARYNAMENODE_USER=hdfs
$HADOOP_HOME/sbin/stop-dfs.sh也需在顶部增加上述环境变量才可使用
HDFS_DATANODE_USER=hdfs
HDFS_NAMENODE_USER=hdfs
HDFS_SECONDARYNAMENODE_USER=hdfs
启动Yarn
单点启动
启动Resource Manager:bigdata103
sudo -i -u yarn yarn --daemon start resourcemanager
启动Node Manager:bigdata100、bigdata102、bigdata104
sudo -i -u yarn yarn --daemon start nodemanager
群起
在Yarn主节点(bigdata102)配置yarn用户到所有节点的免密登录
# 切换到hdfs用户
su hdfs
# 生成公钥私钥
ssh-keygen -t rsa
# 拷贝到集群上
ssh-copy-id bigdata100
ssh-copy-id bigdata102
ssh-copy-id bigdata104
修改主节点(bigdata102)的$HADOOP_HOME/sbin/start-yarn.sh,在顶部增加以下环境变量
YARN_RESOURCEMANAGER_USER=yarn
YARN_NODEMANAGER_USER=yarn
stop-yarn.sh也需在顶部增加上述环境变量才可使用
sbin/start-yarn.sh
启动HistoryServer
启动历史服务器:bigdata100
sudo -i -u mapred mapred --daemon start historyserver
Hive Kerberos配置
后续开发中更新…
|