分享

hadoop【2.7.1】安全模式说明【下】

pig2 发表于 2015-12-26 17:21:39 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 0 18517
本帖最后由 pig2 于 2015-12-26 18:06 编辑


上一篇hadoop【2.7.1】安全模说明【上】
http://www.aboutyun.com/thread-16568-1-1.html



从Kerberos principal映射用户帐户

hadoop映射Kerberos principal到操作系统用户帐户,使用由hadoop.security.auth_to_local指定的规则。它是同样的工作方式在Kerberos配置文件(krb5.conf    http://web.mit.edu/Kerberos/krb5-latest/doc/admin/conf_files/krb5_conf.html)作为auth_to_local。额外,hadoop auth_to_local映射支持 /L 标记,小写字母返回名称。

默认,如果领域匹配到default_realm,它选择principal名称第一个组件(通常定义在/etc/krb5.conf)。例如host/full.qualified.domain.name@REALM.TLD 映射host为默认规则.
定制规则使用hadoop kerbname命令来测试。这个命令允许指定一个principal和使用Hadoop的当前auth_to_local规则集。输出什么身份验证,hadoop将使用它的用法。

从用户到组的映射

尽管hdfs文件是有用户和组的,但是hadoop自己没有定义组,用户到组的映射是由操作系统或LDAP来做。改变映射的方式由 hadoop.security.group.mapping 的值提供映射名称。查看Permissions Guide for details.实际上你需要管理SSO环境使用Kerberos和LDAP的Hadoop的安全模式。

代理用户

一些产品比如Apache Oozie,它代表终端用户访问hadoop访问需要能够代理终端用户。详细查看 HDFS Permissions Guide(http://hadoop.apache.org/docs/r2.7.1/hadoop-project-dist/hadoop-hdfs/HdfsPermissionsGuide.html)

datanode安全
因为datanode传输数据协议不需要使用hadoop RPC框架,DataNode 必须使用特权端口验证自己的身份,端口由 dfs.datanode.addressdfs.datanode.http.address指定。验证基于这样的假设,攻击者将无法获得根权限。
当你使用root用户执行hdfs datanode命令,服务器进程首先绑定特权端口,然后放弃特权,由HADOOP_SECURE_DN_USER 指定的用户帐户来运行。启动进程使用jsvc安装到JSVC_HOME。你必须指定HADOOP_SECURE_DN_USERJSVC_HOME 作为环境变量(在 hadoop-env.sh文件中)。

2.6.0版,SASL可以用来验证数据传输协议。这样的配置,不在需要安全集群以root用户使用jsvc和绑定特权端口启动datanode.为了启用数据传输协议SASL,需要设置hdfs-site.xml文件中的 dfs.data.transfer.protection ,对于dfs.datanode.address 设置一个非特权端口,为HTTPS_ONLY设置 dfs.http.policy和确定HADOOP_SECURE_DN_USER 环境变量没有定义。需要注意的是,如果dfs.datanode.address 设置特权端口,使用SASL数据传输协议是不可能的。这是必需的向后兼容的原因。

为了迁移集群,使用root身份认证开始使用SASL 来代替。首先确保是版本2.6.0或则后面版本,部署集群节点跟外部应用程序一样需要连接集群。仅2.6.0版本或则2.6.0以后版本HDFS客户端可以连接DataNode使用数据传输协议SASL,因此至关重要的是在迁移前有一个正确的版本。

2.6.0版本或则以后版本已经部署,更新任何外部应用程序启用SASL认证配置。如果一个HDFS客户端启用了SASL,然后它即可以使用root身份认证,也可以使用SASL身份认证连接DataNode。所有客户端的配置改变保障随后的DataNode配置改变不影响应用程序。最后每一个独立的DataNode可以被迁移,修改它的配置和重启。可以有一个混合的,有的DataNodes运行使用root身份验证,有的是用SASL 身份验证,在迁移期间暂时这是被允许的。因为HDFS客户端启用SASL可以连接二者。


数据保密性

RPC数据加密

hadoop的服务和客户端之间传送的数据。设置hadoop.rpc.protection为"privacy"在 core-site.xml 文件中激活数据加密


Block 数据传输的数据加密

DataNode数据传输协议加密激活,需要设置  dfs.encrypt.data.transfer为true.可选,你需要设置 dfs.encrypt.data.transfer.algorithm 为 “3des” 或则 “rc4”,选择指定的算法。如果没有指定,系统默认使用配置JCE,通常是3DES。
设置 dfs.encrypt.data.transfer.cipher.suites 为 AES/CTR/NoPadding 激活 AES encryption. 默认,如果没有指定,不使用AES。什么时候使用AES,由dfs.encrypt.data.transfer.algorithm 指定,它仍然在初始密钥交换时使用。AES密钥位长度可以被配置,设置dfs.encrypt.data.transfer.cipher.key.bitlength为128,192或则256,默认128.AES提供了最大的加密强度和最佳的性能。于此同时,3DES 和 RC4 被经常用于hadoop集群。

HTTP数据加密
用于hadoop集群。
在Web-console 和 clients 之间传输数据由SSL保护.

配置

HDFS 和本地文件系统二者的权限

下面表格列出了HDFS不同的路径和本地文件系统(所有节点)和推荐权限


Filesystem
Path
User:Group
Permissions
local
dfs.namenode.name.dir
hdfs:hadoop
drwx------
local
dfs.datanode.data.dir
hdfs:hadoop
drwx------
local
$HADOOP_LOG_DIR
hdfs:hadoop
drwxrwxr-x
local
$YARN_LOG_DIR
yarn:hadoop
drwxrwxr-x
local
yarn.nodemanager.local-dirs
yarn:hadoop
drwxr-xr-x
local
yarn.nodemanager.log-dirs
yarn:hadoop
drwxr-xr-x
local
container-executor
root:hadoop
--Sr-s--*
local
conf/container-executor.cfg
root:hadoop
r-------*
hdfs
/
hdfs:hadoop
drwxr-xr-x
hdfs
/tmp
hdfs:hadoop
drwxrwxrwxt
hdfs
/user
hdfs:hadoop
drwxr-xr-x
hdfs
yarn.nodemanager.remote-app-log-dir
yarn:hadoop
drwxrwxrwxt
hdfs
mapreduce.jobhistory.intermediate-done-dir
mapred:hadoop
drwxrwxrwxt
hdfs
mapreduce.jobhistory.done-dir
mapred:hadoop
drwxr-x---


通用配置
为了开启hadoop rcp 身份验证,设置hadoop.security.authentication 属性值为 "kerberos"。设置下面列出的安全相关设置。下面属性在集群所有节点core-site.xml



参数
说明
hadoop.security.authentication
kerberos
简单:没有身份验证。(默认):启用Kerberos认证协议。
hadoop.security.authorization
true
启用 RPC service-level authorization.(http://hadoop.apache.org/docs/r2.7.1/hadoop-project-dist/hadoop-common/ServiceLevelAuth.html)
hadoop.rpc.protection
authentication
authentication : 仅身份验证 (默认)  
integrity : 完整性检查除了身份验证
privacy : 数据加密除了完整性
hadoop.security.auth_to_local
RULE:exp1 RULE:exp2 DEFAULT
这个字符串值包含新的一行字符
查看 Kerberos documentation(http://web.mit.edu/Kerberos/krb5-latest/doc/admin/conf_files/krb5_conf.html)
hadoop.proxyuser.superuser.hosts

逗号分隔host,host超级用户允许代理(这里理解感觉不是太准确,贴出原文提供参考:comma separated hosts from which superuser access are allowd to impersonation)
  *表示通配符
hadoop.proxyuser.superuser.groups

逗号分隔组,组的用户由超级用户代理(这里理解感觉不是太准确,贴出原文提供参考:comma separated groups to which users impersonated by superuser belongs.)  *表示通配符


NameNode
参数
说明
dfs.block.access.token.enable
true
为了安全操作,启用 HDFS block 访问令牌
dfs.https.enable
true
这个值被弃用. 使用 dfs.http.policy
dfs.http.policy
HTTP_ONLY or HTTPS_ONLY orHTTP_AND_HTTPS
HTTPS_ONLY 关闭 http access. 这个选项优先于弃用配置dfs.https.enable和hadoop.ssl.enabled。 如果使用数据传输协议SASL,代替DataNode root和使用特权端口,这个属性必须设置HTTPS_ONLY保障HTTP servers身份认证。(查看dfs.data.transfer.protection.)
dfs.namenode.https-address
nn_host_fqdn:50470

dfs.https.port
50470

dfs.namenode.keytab.file
/etc/security/keytab/
nn.service.keytab
NameNode Kerberos keytab 文件 .
dfs.namenode.kerberos.principal
  NameNode Kerberos principal 名字.
dfs.namenode.kerberos.internal.spnego.principal
NameNode HTTP Kerberos principal 名字  .

Secondary NameNode
参数
说明
dfs.namenode.secondary.http-address
c_nn_host_fqdn:50090

dfs.namenode.secondary.https-port
50470

dfs.secondary.namenode.keytab.file
/etc/security/keytab/
sn.service.keytab
Secondary NameNode Kerberos keytab 文件 .
dfs.secondary.namenode.kerberos.principal
Secondary NameNode Kerberos principal 名字.
dfs.secondary.namenode.kerberos.internal.spnego.principal
Secondary NameNode HTTP Kerberos principal 名字 .

DataNode
参数
说明
dfs.datanode.data.dir.perm
700

dfs.datanode.address
0.0.0.0:1004
DataNode安全必须使用特权端口,为了确保server安全启动。这意味着server必须通过jsvc启动。另外,如果使用数据传输协议SASL身份验证,必须设置一个非特权端口
(查看 dfs.data.transfer.protection.)
dfs.datanode.http.address
0.0.0.0:1006
DataNode安全必须使用特权端口,确保server安全启动。意味着server必须通过jsvc启动
dfs.datanode.https.address
0.0.0.0:50470

dfs.datanode.keytab.file
/etc/security/keytab
/dn.service.keytab
DataNode Kerberos keytab 文件
dfs.datanode.kerberos.principal
DataNode Kerberos principal 名称
dfs.encrypt.data.transfer
false
当使用数据加密时,设置为true
dfs.encrypt.data.transfer.algorithm

当使用数据加密来控制加密算法时,可选设置为3des或则rc4
dfs.encrypt.data.transfer.cipher.suites

当使用数据加密,可选设置 AES/CTR/NoPadding,激活AES 数据加密
dfs.encrypt.data.transfer.cipher.key.bitlength

当使用AES数据加密时,设置 128, 192 或则 256 to 控制 key 位长度
dfs.data.transfer.protection

authentication : 仅仅身份验证
integrity : 除了身份验证,还有完整性验证
privacy : 除了完整性验证,还有数据加密
此属性未指定默认值。设置这个属性启用SASL数据传输协议身份验证。如果这个启用了,然后dfs.datanode.address必须使用非特权端口,dfs.http.policy必须设置为HTTPS_ONLY 和HADOOP_SECURE_DN_USER环境变量必须未指定,当启动DataNode进程

WebHDFS
参数
说明
dfs.web.authentication.kerberos.principal
WebHDFS Kerberos principal 名称.
dfs.web.authentication.kerberos.keytab
/etc/security/keytab/http.service.keytab
WebHDFS Kerberos keytab文件 .

ResourceManager
参数
说明
yarn.resourcemanager.keytab
/etc/security/keytab/
rm.service.keytab
ResourceManager Kerberos keytab 文件.
yarn.resourcemanager.principal
ResourceManager Kerberos principal 名称

NodeManager
参数
说明
yarn.nodemanager.keytab
/etc/security/keytab/nm.service.keytab
NodeManager Kerberos keytab 文件
yarn.nodemanager.principal
NodeManager Kerberos principal 名称
yarn.nodemanager.container-executor.class
org.apache.hadoop.yarn.server.
nodemanager.LinuxContainerExecutor
使用 LinuxContainerExecutor.
yarn.nodemanager.linux-container-executor.group
hadoop
NodeManager 的Unix 组
yarn.nodemanager.linux-container-executor.path
/path/to/bin/container-executor
容器执行器可执行程序的路径。

配置  WebAppProxy
WebAppProxy提供了一个由应用程序和最终用户输出代理端口,在web应用程序之间。如果安全启用,他将警告用户,在访问可能非安全的web应用程序。身份验证和授权使用代理处理就像任何其他特权的web应用程序。



参数
说明
yarn.web-proxy.address
WebAppProxy host:port    AM web apps 代理
host:port  如果跟 yarn.resourcemanager.webapp.address 一样或则它没有定义ResourceManager 将运行代理,否则一个独立的代理服务器将需要启动。
yarn.web-proxy.keytab
/etc/security/keytab/web-app.service.keytab
WebAppProxy Kerberos keytab文件.
yarn.web-proxy.principal
WebAppProxy Kerberos principal 名称 .

LinuxContainerExecutor
Yarn框架使用ContainerExecutor,Yarn框架定义了容器的启动和控制,一下是hadoop yarn可用的:

ContainerExecutor
描述
DefaultContainerExecutor
默认执行器,Yarn用来管理容器的执行。容器的进程NodeManager与Linux用户相同
LinuxContainerExecutor
仅支持GNU/Linux,这个executor运行容器即可以作为YARN用户提交应用程序(当完整安全性启用)也可以作为一个专用用户(默认nobody),当完整的安全性未启用。当完整安全性启用,这个executor需要创建所有用户,在集群节点容器启动时。它使用一个setuid执行文件,包括在Hadoop分布中。NodeManager使用该可执行程序来启动和杀死容器。setuid执行切换到用户提交和启动应用程序或杀死容器。为了最大限度的安全,这个executor设置严格的权限,和本地文件和目录的用户/组所有者,比如共享的objects, jars, 中间文件, 日志文件等. 需要需要说明的是,因为这,除了应用程序所有者和NodeManager,没有其它用户可以访问任何的本地文件/目录包括这些本地化的分布式缓存的部分。

要构建LinuxContainerExecutor可执行文件运行:
[mw_shl_code=bash,true] $ mvn package -Dcontainer-executor.conf.dir=/etc/hadoop/[/mw_shl_code]

路径 -Dcontainer-executor.conf.dir应该是集群节点上的路径,它的setuid可执行文件的配置文件被定位,可执行文件应安装在 $HADOOP_YARN_HOME/bin.
可执行文件必须有特定的权限: 6050 或则--Sr-s---允许用户拥有root权限(超级用户)和组拥有专用组(比如hadoop),NodeManager Unix 用户是它的组成员和不是普通的应用程序用户。

LinuxTaskController需要包括路径和由 yarn.nodemanager.local-dirs 和 yarn.nodemanager.log-dirs指定的目录,如上表所述对目录设置的权限,设置为755.

  • conf/container-executor.cfg
可执行文件需要配置文件称之为 container-executor.cfg,现在在配置文件目录传递给上述提到的mvn target。
配置文件必须由拥有的用户运行NodeManager(上述例子的yarn用户),任何人拥有的组,和应该有权限 0400 或则r-------- .

可执行文件需要下面配置项,现在在 conf/container-executor.cfg文件中。该配置项被提及为简单的键=值对,每行一个:



参数
说明
yarn.nodemanager.linux-container-executor.group
hadoop
NodeManager Unix 组.container-executor的二进制所属组应该属于这个组,应该是跟NodeManager 配置的值相同.这个配置需要验证访问container-executor 二进制的安全.
banned.users
hdfs,yarn,mapred,bin
禁止用户
allowed.system.users
foo,bar
允许系统用户
min.user.id
1000
防止其他超级用户。

下面是本地系统文件权限,需要相关的LinuxContainerExecutor不同的路径

文件系统
路径
用户:组
权限
local
container-executor
root:hadoop
--Sr-s--*
local
conf/container-executor.cfg
root:hadoop
r-------*
local
yarn.nodemanager.local-dirs
yarn:hadoop
drwxr-xr-x
local
yarn.nodemanager.log-dirs
yarn:hadoop
drwxr-xr-x

MapReduce JobHistory Server
参数
说明
mapreduce.jobhistory.address
MapReduce JobHistory Server host:port
默认端口是 10020.
mapreduce.jobhistory.keytab
/etc/security/keytab/jhs.service.keytab
MapReduce JobHistory Server Kerberos keytab文件
mapreduce.jobhistory.principal
MapReduce JobHistory Server. Kerberos principal名称




没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条