搭建Hadoop带Kerberos认证
HDFS 的搭建步骤
1. 基础环境准备
1.1 三台虚拟机(ARM架构)
虚拟机:10.211.55.5、10.211.55.6、10.211.55.7
JDK包:jdk-8u461-linux-aarch64.tar.gz
Hadoop包:hadoop-3.3.6-aarch64.tar.gz
1.2 创建用户组 和 用户,并设置hdfs用户的密码为hdfs
(注意需要在 root 用户下)
sudo groupadd hadoop
sudo useradd -g hadoop -m hdfs
sudo passwd hdfs
1.3 查看防火墙状态,如果开着测试环境建议关闭,关闭防火墙
(注意需要在 root 用户下)
sudo systemctl status firewalld
systemctl stop firewalld
systemctl disable firewalld
1.4 配置主机名
(注意需要在 root 用户下)
分别在三台机器上设置主机名(如:hadoop01、hadoop02、hadoop03)
hostnamectl set-hostname hadoop01 # 10.211.55.5
hostnamectl set-hostname hadoop02 # 10.211.55.6
hostnamectl set-hostname hadoop03 # 10.211.55.7
1.5 配置 /etc/hosts
(注意需要在 root 用户下)
在三台机器的 /etc/hosts 文件中添加如下内容:
10.211.55.5 hadoop01
10.211.55.6 hadoop02
10.211.55.7 hadoop03
1.4 三台机器上 JDK 和 Hadoop 安装后的路径(如:hadoop01、hadoop02、hadoop03)
(注意需要在 root 用户下)
JDK:/usr/local/jdk1.8.0_461
Hadoop:/usr/local/hadoop
2. SSH免密登录配置
(注意需要在 root 和 hdfs 用户下)
在 hadoop01 上执行以下命令,生成密钥并分发到其他节点:
ssh-keygen -t rsa # 一路回车
ssh-copy-id hadoop01
ssh-copy-id hadoop02
ssh-copy-id hadoop03
测试免密登录:
ssh hadoop02
ssh hadoop03
3. 环境变量配置
3.1 配置环境变量
(注意需要在 hdfs 用户下)
在三台机器的 ~/.bashrc 文件末尾添加:
hdfs用户:~/.bashrc
(注意需要在 root 用户下)
在三台机器的 /etc/profile 文件末尾添加:
root用户:/etc/profile
export JAVA_HOME=/usr/local/jdk1.8.0_461
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export JSVC_HOME=/usr/local/bin
hdfs用户执行:
source ~/.bashrc
root用户执行:
source /etc/profile
4. 在三台机器上 Hadoop 配置文件修改(如:hadoop01、hadoop02、hadoop03)
(注意需要在 root 用户下)
进入 /usr/local/hadoop/etc/hadoop 目录,主要修改以下文件:
4.1 core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop01:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
</property>
</configuration>
4.2 hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/usr/local/hadoop/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/usr/local/hadoop/dfs/data</value>
</property>
</configuration>
4.3 yarn-site.xml(可选,若需YARN)
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop01</value>
</property>
</configuration>
4.4 mapred-site.xml
复制模板并编辑:
cp mapred-site.xml.template mapred-site.xml
内容如下:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
4.5 在三台机器上workers(或slaves)(如:hadoop01、hadoop02、hadoop03)
编辑 /usr/local/hadoop/etc/hadoop/workers 文件,内容如下:
hadoop01
hadoop02
hadoop03
5. 格式化 HDFS
(注意需要在 root 用户下)
5.1 在三台机器上赋权限(如:hadoop01、hadoop02、hadoop03)
sudo chown -R hdfs:hadoop /usr/local/hadoop
用hdfs用户登录, 在 hadoop01(主节点)执行:
hdfs namenode -format
6. 启动 Hadoop 集群(注意:仅在 hadoop01 机器下)
(注意需要在 hdfs 用户下)
在 hadoop01 上执行:
start-dfs.sh # 启动hdfs
stop-dfs.sh # 停止hdfs
7. 验证集群状态
(注意需要在 hdfs 用户下)
查看进程:
jps
在 hadoop01 有3个进程
SecondaryNameNode
DataNode
NameNode
在 hadoop02 和 hadoop03 有1个进程
DataNode
说明成功搭建hdfs
在 HDFS 的基础上加上 Kerberos 的 SASL 方式认证(注意需要在 root 用户下)
1. 基础环境准备
1.1 三台虚拟机(ARM架构)
虚拟机:10.211.55.5、10.211.55.6、10.211.55.7
三台虚拟机‘时间’需同步
1.2 在三台机器上安装 Kerberos 服务端和客户端(如:hadoop01、hadoop02、hadoop03)
(注意需要在 root 用户下)
yum install -y krb5-server krb5-libs krb5-workstation
1.3 在三台机器上配置 Kerberos 服务的‘/etc/krb5.conf’配置如下,文件:/etc/krb5.conf(如:hadoop01、hadoop02、hadoop03)
(注意需要在 root 用户下)
includedir /etc/krb5.conf.d/
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
rdns = false
pkinit_anchors = FILE:/etc/pki/tls/certs/ca-bundle.crt
default_realm = EXAMPLE.COM
#default_ccache_name = KEYRING:persistent:%{uid}
[realms]
EXAMPLE.COM = {
kdc = hadoop01
admin_server = hadoop01
}
[domain_realm]
#.example.com = EXAMPLE.COM
#example.com = EXAMPLE.COM
1.4 在三台机器上配置 Kerberos 服务的‘/var/kerberos/krb5kdc/kdc.conf’配置如下,文件:/var/kerberos/krb5kdc/kdc.conf(如:hadoop01、hadoop02、hadoop03)
(注意需要在 root 用户下)
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
EXAMPLE.COM = {
des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
database_name = /var/kerberos/krb5kdc/principal
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
acl_file = /var/kerberos/krb5kdc/kadm5.acl
dict_file = /usr/share/dict/words
key_stash_file = /var/kerberos/krb5kdc/.k5.EXAMPLE.COM
kdc_ports = 88
kdc_tcp_ports = 88
max_life = 10h 0m 0s
max_renewable_life = 7d 0h 0m 0s
master_key_type = aes256-cts
supported_enctypes = aes256-cts:normal aes128-cts:normal
}
1.5 在三台机器上配置 Kerberos 服务的‘/var/kerberos/krb5kdc/kadm5.acl’配置如下,文件:/var/kerberos/krb5kdc/kadm5.acl(如:hadoop01、hadoop02、hadoop03)
(注意需要在 root 用户下)
*/admin@EXAMPLE.COM *
2. 初始化 Kerberos 数据库并启动服务(注意:仅在 hadoop01 机器下)
(注意需要在 root 用户下)
kdb5_util create -s
systemctl start krb5kdc
systemctl start kadmin
systemctl enable krb5kdc
systemctl enable kadmin
3. 创建 Hadoop 服务 Principal 并生成 Keytab(注意:仅在 hadoop01 机器下)
(注意需要在 root 用户下)
kadmin.local
# 创建管理员
addprinc root/admin
# 创建 Hadoop 服务 principal
addprinc -randkey hdfs/hadoop01@EXAMPLE.COM
addprinc -randkey hdfs/hadoop02@EXAMPLE.COM
addprinc -randkey hdfs/hadoop03@EXAMPLE.COM
addprinc -randkey HTTP/hadoop01@EXAMPLE.COM
addprinc -randkey HTTP/hadoop02@EXAMPLE.COM
addprinc -randkey HTTP/hadoop03@EXAMPLE.COM
# 生成 keytab 文件
xst -k /etc/security/keytabs/hdfs.service.keytab hdfs/hadoop01@EXAMPLE.COM hdfs/hadoop02@EXAMPLE.COM hdfs/hadoop03@EXAMPLE.COM
xst -k /etc/security/keytabs/spnego.service.keytab HTTP/hadoop01@EXAMPLE.COM HTTP/hadoop02@EXAMPLE.COM HTTP/hadoop03@EXAMPLE.COM
4. 分发 keytab 文件到各节点
(注意需要在 root 用户下)
scp /etc/security/keytabs/*.keytab hadoop02:/etc/security/keytabs/
scp /etc/security/keytabs/*.keytab hadoop03:/etc/security/keytabs/
chown hdfs:hadoop /etc/security/keytabs/*.keytab
chmod 400 /etc/security/keytabs/*.keytab
5. 生成自签名SSL证书
(注意需要在 root 用户下)
5.1 生成密钥库
keytool -genkeypair -alias hadoop -keyalg RSA -keysize 2048 \
-dname "CN=hadoop01, OU=Hadoop, O=Test, L=City, ST=State, C=US" \
-keypass hadoop123 -keystore /tmp/keystore.jks -storepass hadoop123 \
-validity 365
5.2 导出证书
keytool -export -alias hadoop -keystore /tmp/keystore.jks \
-rfc -file /tmp/hadoop.cert -storepass hadoop123
5.3 创建信任库
keytool -import -alias hadoop -file /tmp/hadoop.cert \
-keystore /tmp/truststore.jks -storepass hadoop123 -noprompt
5.4 分发到所有节点
for host in hadoop01 hadoop02 hadoop03; do
ssh $host "mkdir -p $HADOOP_HOME/etc/hadoop/ssl"
scp /tmp/keystore.jks $host:$HADOOP_HOME/etc/hadoop/ssl/
scp /tmp/truststore.jks $host:$HADOOP_HOME/etc/hadoop/ssl/
done
6. 在三台机子上 Hadoop 配置文件修改 (如:hadoop01、hadoop02、hadoop03)
(注意需要在 hdfs 用户下)
进入 /usr/local/hadoop/etc/hadoop 目录,主要修改以下文件:
6.1 core-site.xml(追加)(如:hadoop01、hadoop02、hadoop03)
<property>
<name>hadoop.security.authentication</name>
<value>kerberos</value>
</property>
<property>
<name>hadoop.security.authorization</name>
<value>true</value>
</property>
<property>
<name>hadoop.security.auth_to_local</name>
<value>
RULE:[1:$1@$0](.*@EXAMPLE.COM)s/@.*//
DEFAULT
</value>
</property>
6.2 hdfs-site.xml(追加)(如:hadoop01、hadoop02、hadoop03)
<!-- NameNode Kerberos配置 -->
<property>
<name>dfs.namenode.keytab.file</name>
<value>/etc/security/keytabs/hdfs.service.keytab</value>
</property>
<property>
<name>dfs.namenode.kerberos.principal</name>
<value>hdfs/_HOST@EXAMPLE.COM</value>
</property>
<!-- SecondaryNode Kerberos配置 -->
<property>
<name>dfs.secondary.namenode.kerberos.principal</name>
<value>hdfs/_HOST@EXAMPLE.COM</value>
</property>
<property>
<name>dfs.secondary.namenode.keytab.file</name>
<value>/etc/security/keytabs/hdfs.service.keytab</value>
</property>
<property>
<name>dfs.secondary.namenode.kerberos.internal.spnego.principal</name>
<value>HTTP/_HOST@EXAMPLE.COM</value>
</property>
<!-- DataNode Kerberos配置 -->
<property>
<name>dfs.datanode.keytab.file</name>
<value>/etc/security/keytabs/hdfs.service.keytab</value>
</property>
<property>
<name>dfs.datanode.kerberos.principal</name>
<value>hdfs/_HOST@EXAMPLE.COM</value>
</property>
<!-- Web UI认证(可选) -->
<property>
<name>dfs.web.authentication.kerberos.principal</name>
<value>HTTP/_HOST@EXAMPLE.COM</value>
</property>
<property>
<name>dfs.web.authentication.kerberos.keytab</name>
<value>/etc/security/keytabs/HTTP.service.keytab</value>
</property>
<!-- 安全相关 -->
<property>
<name>dfs.block.access.token.enable</name>
<value>true</value>
</property>
<property>
<name>dfs.datanode.data.dir.perm</name>
<value>700</value>
</property>
<!-- 使用SASL认证 -->
<property>
<name>dfs.data.transfer.protection</name>
<value>authentication</value>
</property>
<!-- 使用HTTPS(不是HTTP) -->
<property>
<name>dfs.http.policy</name>
<value>HTTPS_ONLY</value>
</property>
<!-- DataNode使用非特权端口(大于1024) -->
<property>
<name>dfs.datanode.address</name>
<value>0.0.0.0:9866</value>
</property>
<property>
<name>dfs.datanode.http.address</name>
<value>0.0.0.0:9864</value>
</property>
<!-- 设置DataNode IPC端口 -->
<property>
<name>dfs.datanode.ipc.address</name>
<value>0.0.0.0:9867</value>
</property>
6.3 ssl-server.xml(修改)(如:hadoop01、hadoop02、hadoop03)
<configuration>
<!-- 使用SSL -->
<property>
<name>ssl.server.keystore.location</name>
<value>/usr/local/hadoop/etc/hadoop/ssl/keystore.jks</value>
</property>
<property>
<name>ssl.server.keystore.password</name>
<value>hadoop123</value>
</property>
<property>
<name>ssl.server.keystore.keypassword</name>
<value>hadoop123</value>
</property>
<property>
<name>ssl.server.truststore.location</name>
<value>/usr/local/hadoop/etc/hadoop/ssl/truststore.jks</value>
</property>
<property>
<name>ssl.server.truststore.password</name>
<value>hadoop123</value>
</property>
</configuration>
6.4 重新赋权限(如:hadoop01、hadoop02、hadoop03)
sudo chown -R hdfs:hadoop /usr/local/hadoop
7. 启动 Hadoop 集群
(注意需要在 hdfs 用户下)
7.1 停止所有 Hadoop 服务(注意:仅在 hadoop01 机器下)
stop-dfs.sh # 停止hdfs
7.2 用 hdfs 用户启动集群(注意:仅在 hadoop01 机器下)
start-dfs.sh # 启动hdfs
8. 创建 Kerberos 用户
(注意需要在 root 用户下)
8.1 获取票据,看是否在有效期
kinit -kt /etc/security/keytabs/hdfs.service.keytab hdfs/hadoop01@EXAMPLE.COM
klist
8.2 创建 Kerberos 用户 (注意:仅在 hadoop01 机器下)
kadmin.local -q "addprinc -pw 123456 sun"
9. 访问 HDFS
(注意需要在 hdfs 用户下)
9.1 获取票据,输入密码 123456
kinit sun
123456
9.2 创建一个文件夹
hdfs dfs -mkdir /tmp
9.3 上传文件
hdfs dfs -put 1.txt /tmp
9.4 查看文件
hdfs dfs -ls /tmp
10. 搭建过程图片(仅供参考)













浙公网安备 33010602011771号