本帖最后由 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.address 和 dfs.datanode.http.address指定。验证基于这样的假设,攻击者将无法获得根权限。
当你使用root用户执行hdfs datanode命令,服务器进程首先绑定特权端口,然后放弃特权,由HADOOP_SECURE_DN_USER 指定的用户帐户来运行。启动进程使用jsvc安装到JSVC_HOME。你必须指定HADOOP_SECURE_DN_USER 和 JSVC_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名称 |
|