背景
我们使用的hadoop-3.2.4版本,其hadoop http web-控制台认证,simple认证机制是有问题的。整个simple的认证逻辑是错误的,截止目前仍未修复。
具体分析
具体的认证逻辑在AuthenticationFilter.java类中。
simple类别对应的PseudoAuthenticationHandler类。其managementOperation方法未做任何逻辑实现,直接返回的true。这个真的很扯淡,网上一堆按官方文档进行的配置,是完全不启任何作用,直接放行的,真不知道是如何通过安全验证的!
此处逻辑应该完善,基于用户名密码的方式来进行校验。奈何hadoop.http.authentication.signature.secret.file中指定只有密钥信息。完全没有相关的用户名配置,其逻辑直接将密钥当成了用户名,社区感觉一定都不重视simple认证,可是用户角度来看,这种是最简单安全漏洞修复方法,不需要引入任何别的组件。修改的思路:
在hadoop.http.authentication.signature.secret.file指定的文件中,配置用户名和密码对。以行为单位,例如:
hadoop:oxab&^12
一并将相应的逻辑进行修改。
替代方案
当然也可采用,nginx代理的方式来解决。htpasswd命令 是Apache的Web服务器内置工具,用于创建和更新储存用户名、域和用户基本认证的密码文件。
1、安装httpd-tools(只是方便用于生产用户名密码)
#yum安装,也可直接手动下载安装包安装
yum install -y httpd-tools
#生成用户名和密码
htpasswd -c hadoop-http-auth-signature-secret.db hadoop
2、配置Nginx
upstream hadoop-ns {
server xxx:9870 weight=10;
#server yyy:9870 weight=1;
}
upstream hadoop-yarn {
server xxx:8088 weight=10;
server yyy:8088 weight=1;
}
upstream hadoop-hdfs {
server xxx:8020 weight=10;
server yyy:8020 weight=1;
}
server {
listen 39870;
server_name xxx;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
auth_basic "Hadoop HTTP web-consoles";
auth_basic_user_file /usr/local/nginx/hadoop-http-auth-signature-secret.db;
proxy_pass http://hadoop-ns;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
更进一步
熟悉Hadoop namenode HA机制小伙伴,一定会发现以上配置并不是完美的,其无法感知活跃的namenode。我们可以结合nginx ngx_http_upstream_hc_module模块来实现自定义检测的逻辑。来看下官方的一个配置示例: