这是CDP中Yarn使用手册系列的一篇。之前的文章请参考《Apache Hadoop Yarn概述》、《CDP中使用YARN Web UI和CLI》。
1 Linux 容器执行器
一个名为 setuid 的二进制文件container-executor
是hadoop-yarn
包的一部分,安装在/usr/lib/hadoop-yarn/bin/container-executor
.
这个 container-executor
仅在 YARN 上使用且仅在 GNU/Linux 上受支持的程序,以提交应用程序的用户身份运行容器。它要求在启动容器的集群主机上创建所有用户帐户。它使用 Hadoop 发行版中包含的 setuid 可执行文件。NodeManager 使用这个可执行文件来启动和终止容器。setuid 可执行文件切换到已提交应用程序并启动或终止容器的用户。为了获得最大的安全性,此执行程序设置了容器使用的本地文件和目录(例如共享对象、jar、中间文件和日志文件)的受限权限和用户/组所有权。
1.1 Parcel部署
在parcel 部署中,container-executor
文件位于parcel 内的 /opt/cloudera/parcels/CDH/lib/hadoop-yarn/bin/container-executor
. 对于/usr/lib
挂载点,setuid 应该没有问题。但是,该parcel很容易位于不同的安装点上。如果您使用的是parcel,请确保parcel 目录的挂载点没有nosuid 选项。
该container-executor
程序必须具有一组非常具体的权限和所有权才能正常运行。特别是,它必须:
1. 归root所有。
2. 归仅包含运行守护程序的YARN用户组所有。
3. 设置为 setuid。
4. 是组可读和可执行的。这对应于所有权 root:yarn
和权限 6050
。
---Sr-s--- 1 root yarn 91886 2012-04-01 19:54 container-executor
重要
对 Linux 容器执行程序的配置更改可能会导致本地 NodeManager 目录(例如usercache
)具有不正确的权限。为避免这种情况,在使用 Cloudera Manager 或命令行进行更改时,首先从所有配置的本地目录 ( yarn.nodemanager.local-dirs
) 中手动删除现有的 NodeManager 本地目录,并让 NodeManager 重新创建目录结构。
2 管理访问控制列表
访问控制列表 (ACL) 是特定权限或控制的列表,允许单个用户或组对特定对象执行特定操作,以及定义允许对给定对象执行哪些操作。
YARN ACL 不拒绝访问;相反,它们标识可以访问特定对象的用户、用户列表、组或组列表。
与 HDFS ACL 一样,YARN ACL 提供了一种为特定命名用户或命名组设置不同权限的方法。ACL 通过为用户和组的任意组合而不是单个所有者/用户或单个组定义访问控制来增强传统的权限模型。
2.1 YARN ACL 规则
了解所有 YARN ACL 必须遵守的 YARN ACL 规则。
所有 YARN ACL 都必须遵守以下规则:
· 特定值:
o 通配符 (*) 表示每个人都可以访问。
注意
您不能将通配符 (*) 与同一 ACL 中的用户和/或组列表一起使用。如果使用通配符,它必须是ACL 中的唯一项。
o 单个空格条目表示没有人可以访问。
· 如果 ACL 中没有空格,则所有条目(列出的用户和/或组)都被视为授权用户。
· YARN 资源管理器 ACL 中的组名称区分大小写。因此,如果您在 ACL 中指定大写组名,它将与从 Active Directory 解析的组名不匹配,因为 Active Directory 组名以小写形式解析。
· 如果 ACL 以单个空格开头,则它必须仅由组组成。
· ACL 中出现第二个单个空格后的所有条目都将被忽略。
· 没有拒绝访问用户或组的 ACL。但是,如果您希望完全阻止对某个操作的访问,请为不存在的用户或组输入一个值(例如'NOUSERS NOGROUPS'
),或者只需输入一个空格。通过这样做,您可以确保默认情况下没有用户或组映射到特定操作。
· 如果您只想拒绝特定的一组用户和/或组,请指定需要访问的每个用户和/或组。未包含的用户和/或组被“隐式”拒绝访问。
2.2 YARN ACL 语法
YARN ACL 语法示例。
注意
在需要单个空格的所有情况下,您将看到: <single space>
。
· 仅限用户
user1,user2,userN
使用逗号分隔的用户名列表。不要在分隔列表中的用户的逗号之后放置空格。
· 仅限用户组
<single space>HR,marketing,support
您必须以一个空格开始组专用 ACL。只有组的 ACL 使用与用户使用相同的语法,除了每个条目是组名而不是用户名。
· 用户和组
fred,alice,haley<single space>datascience,marketing,support
逗号分隔的用户名列表,后跟一个空格,后跟逗号分隔的组名列表。此示例 ACL 授权访问用户“fred”、“alice”和“haley”,以及“datascience”、“marketing”和“support”组中的用户。
例子
以下 ACL 条目仅授权访问“my_group”的成员:
<single space>my_group
以下 ACL 条目授权任何人访问:
*
以下 ACL 授权访问用户“john”、“jane”和组“HR”:
john,jane<single space>HR
在本例中,系统中定义了六个组(“group_1”到“group_6”)。以下 ACL 授权访问已定义组的子集,允许访问组1 到 5 的所有成员(并隐式拒绝访问组“group_6”的成员):
<single space>group_1,group_2,group_3,group_4,group_5
2.3 YARN ACL 类型
YARN ACL 分为三种不同类型:YARN Admin ACL、YARN 队列 ACL 和 YARN 应用 ACL。
2.3.1 管理员 ACL
使用 YARN Admin ACL 允许用户运行 YARN 管理的子命令,这些子命令通过yarn rmadmin <command>
执行
.
重要
仅在您通过yarn rmadmin <cmd>
触发和应用
YARN Admin ACL . 如果您通过 YARN 命令行运行其他 YARN 命令(例如,启动资源或节点管理器),它不会触发 YARN Admin ACL 检查或提供相同级别的安全性。
默认的 YARN Admin ACL 设置为通配符(*),这意味着所有用户和组都具有 YARN Admin的访问权限和特权。因此,在启用 YARN ACL 实施后,(通过 yarn.acl.enable
属性)每个用户都具有 YARN ACL Admin的访问权限。除非您希望所有用户都拥有 YARN Admin ACL 访问权限,否则请在初始 YARN 配置时和启用YARN ACL 之前编辑yarn.admin.acl
设置。
典型的 YARN Admin ACL 如下所示,其中系统的 Hadoop 管理员和多个组被授予访问权限:
hadoopadmin<space>yarnadmgroup,hadoopadmgroup
2.3.2 队列 ACL
使用队列 ACL 控制用户和管理员对容量调度程序队列的访问权限。应用程序提交实际上只能发生在叶队列级别,但是在父队列上设置的 ACL 限制将应用于其所有后代队列。
在容量调度程序中,通过使用提交应用程序 ACL参数授予对用户和组列表的队列访问权限来配置ACL。使用 队列管理 ACL控制各个级别的队列管理。队列管理员可以向队列提交应用程序,杀死队列中的应用程序,并获取有关队列中任何应用程序的信息。
2.3.3 应用 ACL
使用应用程序 ACL 为用户或组提供对应用程序的访问权限。
使用应用程序 ACL 为用户和/或组(都不是所有者)提供对应用程序的访问权限。应用程序 ACL 的最常见用例发生在您有一组用户协作或管理一组应用程序,并且您需要提供对日志和作业统计信息的读取访问权限,或允许修改作业(杀死工作)和/或应用程序。应用程序 ACL 是针对每个应用程序设置的,并由应用程序所有者管理。
启动应用程序的用户(所有者)始终可以访问他们启动的应用程序,其中包括应用程序日志、作业统计信息和 ACL。其他用户无法删除或更改所有者访问权限。默认情况下,没有其他用户可以访问应用程序数据,因为应用程序 ACL 默认为“ ”(单个空格),这意味着没有人可以访问。
2.3.3.1 应用ACL评估
您越了解 YARN ACL 的评估方式,您就越能做好定义和配置各种可用的 YARN ACL 的准备。
例如,如果您在管理员 ACL 中启用用户访问权限,那么您必须意识到用户可能有权访问/查看敏感数据,并应相应地进行计划。因此,如果您是整个集群的管理员,您还可以访问运行应用程序的日志,这意味着您可以查看与运行应用程序相关的日志中的敏感信息。
最佳实践:保护环境的最佳实践是将 YARN Admin ACL 设置为包含一组有限的用户和/或组。
下图显示了应用程序 ACL 的评估流程:
图 1.应用ACL 评估流程
下图显示了一个示例队列结构,从底部的叶队列开始,到顶部的根队列:
图 2.队列结构
2.3.3.1.1 示例:杀死“生产”队列中的应用程序
为用户提供在特定队列中终止应用程序的权限。
对于此应用程序 ACL 评估流程示例,假设application_1536220066338_0001
在队列“Production”中运行以下内容 :
· 应用程序所有者:John
· “数据科学”队列管理员:Jane
· YARN 集群管理员:Bob
在此用例中,John 尝试终止应用程序,这是允许的,因为他是应用程序所有者。
作为队列管理员,Jane 尝试终止队列“Production”中的作业,她可以作为父队列的队列管理员执行此操作。
Bob 是 YARN 集群管理员,他也被列为管理员 ACL 中的用户。他试图终止他不是其所有者的作业,但由于他是 YARN 集群管理员,因此他可以终止该作业。
2.3.3.1.2 示例:移动应用程序并查看“测试”队列中的日志
为用户提供在队列之间移动应用程序和查看特定队列中的日志的权限。
对于此应用程序 ACL 评估流程示例,假设application_1536220066338_0002
在队列“测试”中运行以下内容 :
· 应用程序所有者:John
· “营销”和“开发”队列管理员:Jane
· Jane 通过mapreduce.job.acl-view-job
ACL拥有日志查看权限
· YARN 集群管理员:Bob
在此用例中,John 尝试查看其作业的日志,这是允许的,因为他是应用程序所有者。
Jane 尝试访问application_1536220066338_0002
队列“Test”以将应用程序移动到“Marketing”队列。她被拒绝通过队列 ACL 访问“测试”队列——因此她无法提交或管理队列“测试”。她也无法终止在“测试”队列中运行的作业。然后,她尝试访问日志,application_1536220066338_0002
并被允许通过mapreduce.job.acl-view-job
ACL 进行访问。
Bob 尝试访问application_1536220066338_0002
队列“Test”以将应用程序移动到“Marketing”队列。作为YARN 集群管理员,他可以访问所有队列并可以移动应用程序。
注意
日志文件的权限也在文件系统级别设置并由文件系统强制执行:文件系统可以阻止您访问文件,这意味着您无法打开/读取文件以检查文件中包含的 ACL .
2.3.3.2 MapReduce 作业 ACL
创建并使用以下 MapReduce 应用程序 ACL 来查看 YARN 日志。
· mapreduce.job.acl-view-job
提供对 MapReduce 历史记录和 YARN 日志的读取访问权限。
· mapreduce.job.acl-modify-job
提供与 相同的访问权限mapreduce.job.acl-view-job
,还允许用户修改正在运行的作业。
注意
作业修改目前仅限于杀死作业。不支持其他 YARN 系统修改。
在搜索或其他活动期间,您可能会遇到以下来自MapReduce 的两个遗留设置;YARN 不支持它们。千万不能使用它们:
· mapreduce.cluster.acls.enabled
· mapreduce.cluster.administrators
2.3.3.2.1 杀死应用程序
应用程序ACL mapreduce.job.acl-modify-job
决定用户是否可以修改作业,但在 YARN 上下文中,这仅允许用户终止应用程序。
应用程序ACL mapreduce.job.acl-modify-job
决定用户是否可以修改作业,但在 YARN 上下文中,这仅允许用户终止应用程序。终止操作与应用程序无关并且是 YARN 框架的一部分。其他应用程序类型,如 MapReduce 或 Spark,独立于 YARN 框架实现自己的终止操作。MapReduce 通过mapred
命令提供终止操作。
对于 YARN,允许以下三组用户杀死正在运行的应用程序:
· 应用程序所有者
· 定义的集群管理员 yarn.admin.acl
· aclAdministerApps
为运行应用程序的队列定义的队列管理员
请注意,对于队列管理员,ACL 继承适用,如前所述。
2.3.3.3 Spark 作业 ACL
Spark ACL 为用户和组使用单独的属性。
用户和组列表都使用逗号分隔的条目列表。通配符“ *
”允许任何人访问,单个空格“ ”不允许任何人访问。使用属性spark.acls.enable来启用 Spark ACL,该属性默认设置为false
(未启用)并且必须更改为true
以在 Spark 级别强制实施 ACL。
为 Spark 应用程序创建并使用以下应用程序ACL:
· 设置spark.acls.enable
为true
(默认为false
)。
· 设置spark.admin.acls
并spark.admin.acls.groups
获得对所有 Spark 应用程序的管理访问权限。
· 设置spark.ui.view.acls
和spark.ui.view.acls.groups
查看对特定 Spark 应用程序的访问权限。
· 设置spark.modify.acls
并spark.modify.acls.groups
获得对特定 Spark 应用程序的管理访问权限。
2.3.3.4 应用程序日志的 ACL
MapReduce 应用程序ACL mapreduce.job.acl-view-job
确定您是否可以查看应用程序日志。
Aaccess 通过以下 ACL 进行评估:
· YARN admin和队列 ACL
· 应用 ACL
在应用程序处于“已完成”状态后,日志将根据您的集群设置进行聚合。您可以通过 MapReduce History 服务器 Web 界面访问聚合日志。聚合日志存储在共享集群存储上,在大多数情况下是 HDFS。您还可以通过yarn.nodemanager.remote-app-log-dir
将 Cloudera Manager 中的设置修改为指向 S3 或 Azure(应该已配置),通过 S3 或 Azure等存储选项共享日志聚合 。
聚合日志的共享存储有助于防止通过文件级权限访问日志文件。日志文件的权限也在文件系统级别设置,并由文件系统强制执行:文件系统可以阻止任何用户访问该文件,这意味着用户无法打开/读取文件以检查包含在。
在 HDFS 的集群存储用例中,您只能访问通过以下方式聚合的日志:
· 应用程序所有者
· 为 MapReduce History 服务器定义的组
当应用程序运行,生成日志,然后将日志放入 HDFS 时,就会生成一个路径/结构(例如:)/tmp/logs/john/logs/application_1536220066338_0001
。因此,对于应用程序所有者“约翰”可能被设置为访问700
,这意味着john可以read
、write
和execute
,没有其他人可以查看此目录下的文件。如果您没有 HDFS 访问权限,您将被拒绝访问。mapreduce.job.acl-view-job
中标识的命令行用户也被拒绝在文件级别访问。在这种用例中,存储在聚合日志中的应用程序 ACL 将永远不会被评估,因为应用程序 ACL 没有文件访问权限。
对于没有日志聚合的集群,运行应用的日志保存在容器运行的节点上。您可以通过执行 ACL 检查的资源管理器和节点管理器 Web 界面访问这些日志。
3 在 ResourceManager 和 Application Master 之间启用HTTPS
如果要在 ResourceManager和 Application Master 之间启用 HTTPS 通信,则必须使用一个ResourceManager 级别和两个 Application Master 级别的配置属性。
1. 在ResourceManager 端启用HTTPS 通信:
a. 导航到Cloudera Manager。
b. 选择YARN服务。
c. 搜索ResourceManager并找到 ResourceManager高级配置片段(yarn-site.xml安全阀)。
d. 添加以下配置:
<property> <name>yarn.resourcemanager.application-https.policy</name> <value>STRICT</value> </property>
e. 重新启动ResourceManager 以应用配置更改。
在ResourceManager 端启用 HTTPS 通信。密钥库和信任库可用。
有两种受支持的 Keystore 和 Truststore 格式。格式由ResourceManager 自动设置:
§ JKS:未启用 FIPS 时
§ BCFKS:启用 FIPS 时
NodeManager 收集 Keystore 和 Truststore 相关信息(文件系统上的位置、密码和格式)并使用环境变量向 Application Master 提供信息。
2. 在ApplicationMaster端开启HTTPS通信:
提交作业时,将yarn.app.mapreduce.am.webapp.https.enabled
和 yarn.app.mapreduce.am.webapp.https.client.auth
属性设置 为 true
。
以下是一个简单的“pi 作业”示例,可将其视为测试作业。请注意,jar 文件取决于部署的 CDP 版本:
yarn jar /opt/cloudera/parcels/CDH-7.1.5-1.cdh7.1.5.p0.6683980/lib/hadoop-mapreduce/hadoop-mapreduce-examples-3.1.1.7.1.5.0-149.jar pi -Dyarn.app.mapreduce.am.webapp.https.enabled=true -Dyarn.app.mapreduce.am.webapp.https.client.auth=true 1 1000
ResourceManager 和 Application Master 之间的 HTTPS 通信已启用。
4 为 YARN UI 和 REST API 配置跨域支持
YARN 上默认启用跨域资源共享 (CORS),以便相应的服务仅接受来自选定域的跨域请求。启用 CORS 还有助于 YARN UI 从浏览器获取数据端点。
CORS 在集群级别启用,然后在 YARN 等单个组件上启用。如果要设置默认值以外的其他值,请使用 Cloudera Manager 中的安全阀来配置 CORS 配置属性。
1. 在Cloudera Manager 中,选择YARN 服务。
2. 单击配置选项卡。
3. 搜索core-site.xml。
4. 查找YARN的core-site.xml 服务高级配置片段(安全阀)。
5. 单击加号图标以添加和配置以下属性:
属性 |
默认值 |
描述 |
|
|
允许跨源支持的以逗号分隔的源列表。 默认值为 *。仅提及特定源,以便服务不接受所有跨源请求。 |
|
|
允许跨域支持的以逗号分隔的方法列表。 |
|
|
允许跨域支持的以逗号分隔的标头列表。 |
|
|
可以缓存预检请求之前的秒数。 |
6. 单击保存更改。
7. 在Cloudera Manager 中,选择YARN 服务。
8. 单击配置选项卡。
9. 搜索yarn-site.xml。
10.找到YARN的yarn-site.xml服务高级配置片段(安全阀)。
11.单击加号图标以添加和配置cross-origin.enabled 属性:
属性 |
默认值 |
描述 |
|
|
为 NodeManager 启用跨域支持。 |
|
|
为 ResourceManager 启用跨域支持。 |
|
|
为时间线服务启用跨域支持。 |
注意
yarn-site.xml
中的
hadoop.http.cross-origin.allowed-origins属性值覆盖在core-site.xml
中
相同属性的值。您可以配置此属性的值以允许访问特定域;例如: regex:.*[.]hwx[.]site(:\d*)?
。
12.单击保存更改。
13.重启HDFS 和YARN 服务。
5 为长时间运行的应用程序配置 YARN 安全
长时间运行的应用程序需要额外的配置,因为默认设置只允许 hdfs 用户的委托令牌最长为 7 天,这并不总是足够的。
长时间运行的应用程序(如 Spark Streaming 作业)将需要额外的配置,因为默认设置只允许 hdfs 用户的委托令牌最长生命周期为 7 天,这并不总是足够的。
您可以通过将ResourceManager 配置为相应 HDFS NameNode 的代理用户来解决此问题,以便 ResourceManager 可以在现有令牌超过其最长生命周期时请求新令牌。然后,YARN 将能够代表用户继续执行本地化和日志聚合。 hdfs 用户。
1. 在Cloudera Manager 中,选择YARN服务。
2. 单击配置选项卡。
3. 搜索yarn-site.xml。
4. 找到ResourceManager的yarn-site.xml高级配置片段(安全阀)。
5. 单击加号图标并添加以下内容:
o 名称: yarn.resourcemanager.proxy-user-privileges.enabled
o 值:true
6. 单击保存更改。
7. 单击Cloudera Manager 徽标返回主页。
8. 选择HDFS服务。
9. 单击配置选项卡。
10.搜索core-site.xml。
11.找到core-site.xml的集群范围的 高级配置片段(安全阀)。
12.单击加号图标并添加以下内容:
o 名称:hadoop.proxyuser.yarn.hosts
o 值:*
13.再次单击加号图标并添加以下内容:
o 名称: hadoop.proxyuser.yarn.groups
o 值:*
14.单击保存更改。
15.单击服务旁边的Stale Service Restart图标以调用集群重新启动向导。
16.单击重新启动陈旧服务。
17.选择重新部署客户端配置。
18.单击立即重新启动。