Hadoop安全实现服务端到客户端的双向认证,核心依赖Kerberos协议(默认且主流方案),辅以SSL/TLS双向认证(补充场景,如Web UI)。两者均通过“票据/证书交换+相互验证”机制,确保服务端与客户端的身份真实性,以下是详细实现逻辑与步骤:
一、核心机制:Kerberos协议实现双向认证
Kerberos是Hadoop生态的标准认证协议,通过“票据授予票据(TGT)+服务票据(ST)”的交换,实现客户端与服务端的双向身份验证,彻底杜绝明文密码传输,是Hadoop安全的基础。
1. Kerberos双向认证的核心流程
Kerberos的认证过程涉及客户端(Client)、认证服务器(AS)、票据授权服务器(TGS)三方,流程如下(以客户端访问HDFS NameNode为例):
步骤1:客户端获取TGT(初始认证) 客户端向AS发送KRB_AS_REQ请求(包含预认证数据,如时间戳),AS验证客户端身份(如密码)后,返回TGT(加密,仅KDC可解密)和Session Key(用于后续通信)。
步骤2:客户端获取ST(服务票据) 客户端用TGT向TGS发送KRB_TGS_REQ请求(包含目标服务名称,如hdfs/namenode@EXAMPLE.COM),TGS验证TGT有效性后,返回ST(加密,仅目标服务可解密)和Service Session Key(用于客户端与服务端通信)。
步骤3:客户端访问服务(双向验证) 客户端携带ST向目标服务(如NameNode)发送KRB_AP_REQ请求,服务端用自身密钥解密ST,验证客户端身份;随后,服务端返回响应票据(用Service Session Key加密),客户端解密后确认服务端身份。至此,客户端与服务端完成双向认证。
2. Hadoop中Kerberos的配置步骤
要在Hadoop中启用Kerberos双向认证,需完成以下配置:
(1)部署KDC(Key Distribution Center) 在独立节点安装Kerberos服务(如MIT Kerberos),配置krb5.conf(定义KDC地址、Realm、加密类型)和kdc.conf(定义KDC数据库路径、加密策略)。
(2)创建Kerberos主体(Principal) 为Hadoop组件(如NameNode、DataNode、ResourceManager)创建服务主体,格式为服务名/主机名@REALM(如hdfs/hadoop01@EXAMPLE.COM),并生成Keytab文件(存储主体密钥,用于自动认证)。 示例命令: kadmin.local -q "addprinc -randkey hdfs/hadoop01@EXAMPLE.COM" # 创建主体 kadmin.local -q "xst -k /etc/security/keytab/hdfs.service.keytab hdfs/hadoop01@EXAMPLE.COM" # 生成Keytab
(3)配置Hadoop启用Kerberos 修改Hadoop核心配置文件,关联Kerberos主体与Keytab:
- core-site.xml(全局启用Kerberos): <configuration> <property> <name>hadoop.security.authentication</name> <value>kerberos</value> <!-- 启用Kerberos认证 --> </property> <property> <name>hadoop.security.authorization</name> <value>true</value> <!-- 启用授权 --> </property> </configuration>
- hdfs-site.xml(HDFS组件配置): <configuration> <property> <name>dfs.namenode.kerberos.principal</name> <value>hdfs/_HOST@EXAMPLE.COM</value> <!-- NameNode服务主体 --> </property> <property> <name>dfs.namenode.keytab.file</name> <value>/etc/security/keytab/hdfs.service.keytab</value> <!-- Keytab路径 --> </property> <property> <name>dfs.datanode.kerberos.principal</name> <value>dn/_HOST@EXAMPLE.COM</value> <!-- DataNode服务主体 --> </property> <property> <name>dfs.datanode.keytab.file</name> <value>/etc/security/keytab/dn.service.keytab</value> <!-- DataNode Keytab路径 --> </property> </configuration>
(4)分发Keytab与重启集群 将Keytab文件分发至各节点(如通过scp),设置权限(仅服务用户可读取),然后重启Hadoop集群(如start-dfs.sh、start-yarn.sh)。
3. Kerberos双向认证的优势
- 防身份伪造:票据由KDC加密,服务端无法伪造客户端身份,客户端也无法伪造服务端身份。
- 无明文传输:密码不通过网络传输,避免密码泄露。
- 单点登录(SSO):用户获取TGT后,可访问多个服务(如HDFS、YARN)无需重复认证。
二、补充机制:SSL/TLS双向认证(Web UI场景)
SSL/TLS双向认证主要用于Web UI(如NameNode的50070端口、ResourceManager的8088端口),确保客户端与Web服务之间的双向身份验证,防止非法用户访问Web界面。
1. SSL/TLS双向认证的核心流程
步骤1:客户端验证服务端证书 客户端向服务端发送连接请求,服务端返回数字证书(包含公钥、域名等信息),客户端验证证书的有效性(如是否由信任的CA颁发、域名是否匹配)。
步骤2:服务端验证客户端证书 服务端要求客户端提供数字证书(客户端需提前从CA获取),服务端验证客户端证书的有效性(如是否由信任的CA颁发、是否在允许的列表中)。
步骤3:建立加密通道 双方验证通过后,使用对方的公钥加密会话密钥,建立SSL/TLS加密通道,后续通信均通过该通道传输。
2. Hadoop中SSL/TLS双向认证的配置步骤
要在Hadoop中启用SSL/TLS双向认证,需完成以下配置:
(1)生成证书与私钥 使用OpenSSL生成服务端证书(如server.crt)和私钥(如server.key),并为每个客户端生成证书(如client.crt)和私钥(如client.key)。 示例命令(服务端): openssl req -x509 -newkey rsa:2048 -keyout server.key -out server.crt -days 365 -nodes # 生成服务端证书 openssl req -x509 -newkey rsa:2048 -keyout client.key -out client.crt -days 365 -nodes # 生成客户端证书
(2)配置Hadoop SSL 修改Hadoop的SSL配置文件(如ssl-server.xml、ssl-client.xml),指定证书与私钥路径:
- ssl-server.xml(服务端配置): <configuration> <property> <name>ssl.server.keystore.location</name> <value>/etc/hadoop/ssl/server.jks</value> <!-- 服务端密钥库(包含服务端证书) --> </property> <property> <name>ssl.server.keystore.password</name> <value>server_keystore_password</value> <!-- 密钥库密码 --> </property> <property> <name>ssl.server.truststore.location</name> <value>/etc/hadoop/ssl/truststore.jks</value> <!-- 服务端信任库(包含客户端CA证书) --> </property> <property> <name>ssl.server.truststore.password</name> <value>truststore_password</value> <!-- 信任库密码 --> </property> <property> <name>ssl.client.auth</name> <value>true</value> <!-- 启用客户端证书验证(双向认证) --> </property> </configuration>
- ssl-client.xml(客户端配置): <configuration> <property> <name>ssl.client.keystore.location</name> <value>/etc/hadoop/ssl/client.jks</value> <!-- 客户端密钥库(包含客户端证书) --> </property> <property> <name>ssl.client.keystore.password</name> <value>client_keystore_password</value> <!-- 密钥库密码 --> </property> <property> <name>ssl.client.truststore.location</name> <value>/etc/hadoop/ssl/truststore.jks</value> <!-- 客户端信任库(包含服务端CA证书) --> </property> <property> <name>ssl.client.truststore.password</name> <value>truststore_password</value> <!-- 信任库密码 --> </property> </configuration>
(3)启用SSL并重启集群 在core-site.xml中启用SSL: <configuration> <property> <name>hadoop.ssl.enabled</name> <value>true</value> <!-- 启用SSL --> </property> <property> <name>hadoop.ssl.server.conf</name> <value>/etc/hadoop/ssl/ssl-server.xml</value> <!-- 服务端SSL配置文件 --> </property> <property> <name>hadoop.ssl.client.conf</name> <value>/etc/hadoop/ssl/ssl-client.xml</value> <!-- 客户端SSL配置文件 --> </property> 重启Hadoop集群,使配置生效。
3. SSL/TLS双向认证的应用场景
- Web UI访问:防止非法用户通过浏览器访问Hadoop Web界面(如NameNode的50070端口),需客户端提供证书才能访问。
- API调用:防止非法应用通过Hadoop REST API(如YARN的ResourceManager API)调用集群服务,需客户端提供证书才能调用。
三、两种机制的选择与协同
- Kerberos:是Hadoop的默认认证机制,适用于所有Hadoop组件(如HDFS、YARN、Hive)的内部通信,实现服务端与客户端的双向认证,是Hadoop安全的基础。
- SSL/TLS双向认证:是补充机制,适用于Web UI、REST API等场景,实现客户端与服务端的双向认证,增强Web层面的安全性。
在实际部署中,通常以Kerberos为主(覆盖所有组件通信),辅以SSL/TLS双向认证(覆盖Web UI等场景),形成完整的安全防护体系。