安全

保护 HDFS 服务

DC/OS Apache HDFS 安全

  • DC/OS Apache HDFS 服务允许您创建服务帐户以为 Apache HDFS 配置访问权限。服务允许您创建和分配访问所需的权限。

  • DC/OS Apache HDFS 服务支持 Apache HDFS的本地传输加密机制。该服务提供自动化和编排,以简化这些重要功能的使用。目前,不支持 Apache HDFS 的身份验证和授权功能。

注意: 这些安全功能仅在 DC/OS Enterprise 1.10 及更高版本中可用。

配置服务帐户

本部分介绍如何为 Apache HDFS 配置 DC/OS 访问权限。根据您的 安全模式, Apache HDFS 可能需要 服务身份认证 以访问 DC/OS。

安全模式 服务帐户
已禁用 不可用
宽容 可选
严格 必填

如果您在宽容模式下安装服务且未指定服务帐户,Metronome 和 Marathon 将按照此服务的请求是由具有 超级用户权限的帐户做出的那样行事。

前提条件:

创建密钥对

在此步骤中,系统使用 Enterprise DC/OS CLI 创建 2048 位 RSA 公私密钥对。

创建公私密钥对并将每个值保存到当前目录中的单独文件中。

dcos security org service-accounts keypair <private-key>.pem <public-key>.pem

注意: 您可以使用 DC/OS 密钥存储库 以确保密钥对的安全。

创建服务帐户

从终端提示中创建一个新的服务帐户(<service-account-id>) containing the public key (<your-public-key>.pem)。

dcos security org service-accounts create -p <your-public-key>.pem -d "HDFS <service-account-id>

注意: 您可以使用以下命令验证您的新服务帐户。

dcos security org service-accounts show <service-account-id>

创建密钥

创建密钥 (hdfs//<secret-name>) with your service account (<service-account-id>) and private key specified (<private-key>.pem)。

如果您在与服务名称匹配的路径中存储密钥(例如,您的服务名称和密钥路径都是 hdfs),则只有名为 hdfs 的服务可以访问它。

宽容 (Permissive)

dcos security secrets create-sa-secret <private-key>.pem <service-account-id> hdfs/<secret-name>

严格 (Strict)

dcos security secrets create-sa-secret --strict <private-key>.pem <service-account-id> hdfs/<secret-name>

注意: 您可以使用以下命令列出密钥:

dcos security secrets list /

创建和分配权限

使用以下 curl 命令快速为 Apache HDFS 服务配置所需权限。

注意:资源中的任何 / 字符必须替换为 %252F ,才能在 curl 命令中传递。 - 使用 API 管理权限时,您必须首先创建权限,然后分配权限。有时,权限可能已存在。在此情况下,API 返回告知性信息。您可以将其视为确认并继续执行下一个命令。

  1. 创建权限。

重要信息: 这些命令使用 `hdfs-role`的默认 Apache HDFS `role` 值。如果您正在运行多个 Apache HDFS实例,使用正确的名称替换 `hdfs-role` 实例 (`-role`). 例如, 如果你有一个 Apache HDFS 例 `hdfs2`, 您将替换代码示例中的每个角色值 `hdfs2-role`。

宽容 (Permissive)

运行这些命令,并且指定您的服务帐户名称 (<service-account-id>) 。

curl -X PUT --cacert dcos-ca.crt \
-H "Authorization: token=$(dcos config show core.dcos_acs_token)" $(dcos config show core.dcos_url)/acs/api/v1/acls/dcos:mesos:master:task:user:nobody \
-d '{"description":"Allows Linux user nobody to execute tasks"}' \
-H 'Content-Type: application/json'
curl -X PUT --cacert dcos-ca.crt \
-H "Authorization: token=$(dcos config show core.dcos_acs_token)" $(dcos config show core.dcos_url)/acs/api/v1/acls/dcos:mesos:master:framework:role:hdfs-role \
-d '{"description":"Controls the ability of hdfs-role to register as a framework with the Mesos master"}' \
-H 'Content-Type: application/json'
curl -X PUT --cacert dcos-ca.crt \
-H "Authorization: token=$(dcos config show core.dcos_acs_token)" $(dcos config show core.dcos_url)/acs/api/v1/acls/dcos:mesos:master:reservation:role:hdfs-role \
-d '{"description":"Controls the ability of hdfs-role to reserve resources"}' \
-H 'Content-Type: application/json'
curl -X PUT --cacert dcos-ca.crt \
-H "Authorization: token=$(dcos config show core.dcos_acs_token)" $(dcos config show core.dcos_url)/acs/api/v1/acls/dcos:mesos:master:volume:role:hdfs-role \
-d '{"description":"Controls the ability of hdfs-role to access volumes"}' \
-H 'Content-Type: application/json'
curl -X PUT --cacert dcos-ca.crt \
-H "Authorization: token=$(dcos config show core.dcos_acs_token)" $(dcos config show core.dcos_url)/acs/api/v1/acls/dcos:mesos:master:reservation:principal:<service-account-id> \
-d '{"description":"Controls the ability of <service-account-id> to reserve resources"}' \
-H 'Content-Type: application/json'
curl -X PUT --cacert dcos-ca.crt \
-H "Authorization: token=$(dcos config show core.dcos_acs_token)" $(dcos config show core.dcos_url)/acs/api/v1/acls/dcos:mesos:master:volume:principal:<service-account-id> \
-d '{"description":"Controls the ability of <service-account-id> to access volumes"}' \
-H 'Content-Type: application/json'

严格 (Strict)

运行这些命令,并且指定您的服务帐户名称 (<service-account-id>) 。

curl -X PUT --cacert dcos-ca.crt \
-H "Authorization: token=$(dcos config show core.dcos_acs_token)" $(dcos config show core.dcos_url)/acs/api/v1/acls/dcos:mesos:master:framework:role:hdfs-role \
-d '{"description":"Controls the ability of hdfs-role to register as a framework with the Mesos master"}' \
-H 'Content-Type: application/json'
curl -X PUT --cacert dcos-ca.crt \
-H "Authorization: token=$(dcos config show core.dcos_acs_token)" $(dcos config show core.dcos_url)/acs/api/v1/acls/dcos:mesos:master:reservation:role:hdfs-role \
-d '{"description":"Controls the ability of hdfs-role to reserve resources"}' \
-H 'Content-Type: application/json'
curl -X PUT --cacert dcos-ca.crt \
-H "Authorization: token=$(dcos config show core.dcos_acs_token)" $(dcos config show core.dcos_url)/acs/api/v1/acls/dcos:mesos:master:volume:role:hdfs-role \
-d '{"description":"Controls the ability of hdfs-role to access volumes"}' \
-H 'Content-Type: application/json'
curl -X PUT --cacert dcos-ca.crt \
-H "Authorization: token=$(dcos config show core.dcos_acs_token)" $(dcos config show core.dcos_url)/acs/api/v1/acls/dcos:mesos:master:reservation:principal:<service-account-id> \
-d '{"description":"Controls the ability of <service-account-id> to reserve resources"}' \
-H 'Content-Type: application/json'
curl -X PUT --cacert dcos-ca.crt \
-H "Authorization: token=$(dcos config show core.dcos_acs_token)" $(dcos config show core.dcos_url)/acs/api/v1/acls/dcos:mesos:master:volume:principal:<service-account-id> \
-d '{"description":"Controls the ability of <service-account-id> to access volumes"}' \
-H 'Content-Type: application/json'
  1. 使用以下命令将权限和允许的操作授予服务帐户。

重要信息: 这些命令使用 `hdfs-role`的默认 Apache HDFS `role` 值。如果您正在运行多个 Apache HDFS实例,使用正确的名称替换 `hdfs-role` 实例 (`-role`). 例如, 如果你有一个 Apache HDFS 例 `hdfs2`, 您将替换代码示例中的每个角色值 `hdfs2-role`。

运行这些命令,并且指定您的服务帐户名称 (<service-account-id>) 。

curl -X PUT --cacert dcos-ca.crt \
-H "Authorization: token=$(dcos config show core.dcos_acs_token)" $(dcos config show core.dcos_url)/acs/api/v1/acls/dcos:mesos:master:framework:role:hdfs-role/users/<service-account-id>/create
curl -X PUT --cacert dcos-ca.crt \
-H "Authorization: token=$(dcos config show core.dcos_acs_token)" $(dcos config show core.dcos_url)/acs/api/v1/acls/dcos:mesos:master:reservation:role:hdfs-role/users/<service-account-id>/create
curl -X PUT --cacert dcos-ca.crt \
-H "Authorization: token=$(dcos config show core.dcos_acs_token)" $(dcos config show core.dcos_url)/acs/api/v1/acls/dcos:mesos:master:volume:role:hdfs-role/users/<service-account-id>/create
curl -X PUT --cacert dcos-ca.crt \
-H "Authorization: token=$(dcos config show core.dcos_acs_token)" $(dcos config show core.dcos_url)/acs/api/v1/acls/dcos:mesos:master:task:user:nobody/users/<service-account-id>/create
curl -X PUT --cacert dcos-ca.crt \
-H "Authorization: token=$(dcos config show core.dcos_acs_token)" $(dcos config show core.dcos_url)/acs/api/v1/acls/dcos:mesos:master:reservation:principal:<service-account-id>/users/<service-account-id>/delete
curl -X PUT --cacert dcos-ca.crt \
-H "Authorization: token=$(dcos config show core.dcos_acs_token)" $(dcos config show core.dcos_url)/acs/api/v1/acls/dcos:mesos:master:volume:principal:<service-account-id>/users/<service-account-id>/delete

传输加密

启用传输加密后,DC/OS Apache HDFS 将使用正确配置自动部署所有节点,以通过 SSL 加密通信。节点将使用 SSL 在它们之间安全地进行通信。

该服务使用 DC/OS CA 生成用于保护服务的 SSL 工件。任何信任 DC/OS CA 的客户端都会认为服务证书有效。

注意 使用 Kerberos 身份认证并不_要求_启用传输加密,但传输加密 _可以_ 与 Kerberos 身份认证结合。

先决条件

配置传输加密

设置服务帐户

授予 服务帐户正确的权限。

  • 在 DC/OS 1.10,所需权限为 dcos:superuser full
  • 在 DC/OS 1.11+ 中,所需权限为:
dcos:secrets:default:/<service name>/* full
dcos:secrets:list:default:/<service name> read
dcos:adminrouter:ops:ca:rw full
dcos:adminrouter:ops:ca:ro full

其中 <service name> 是要安装的服务的名称。

安装服务

除了自有选项,安装 DC/OS Apache HDFS 服务包括以下选项:

{
    "service": {
        "service_account": "<your service account name>",
        "service_account_secret": "<full path of service secret>",
        "security": {
            "transport_encryption": {
                "enabled": true, "allow_plaintext": <true|false default false>

            }
        }
    }
}

客户端传输加密

启用传输加密时,服务客户端需要进行配置以使用 DC/OS CA 捆绑包 以验证它们对服务所进行的连接。请查阅客户端的文档,了解信任 CA 并适当配置您的客户端的信息。

待确认 注意:可以更新正在运行的 DC/OS Apache HDFS 服务以在初次安装后启用传输加密,但在过渡期间,服务可能不可用。另外,您的 HDFS 客户端需要重新配置,除非 service.security.transport_encryption.allow_plaintext 设置为 true。

身份认证

DC/OS Apache HDFS 支持 Kerberos 身份认证。

Kerberos 身份认证

Kerberos 身份认证依赖中央权限来验证 HDFS 客户端是其所声明的身份。DC/OS Apache HDFS 与现有 Kerberos 基础架构集成,以验证客户端的身份。

先决条件

  • 从 DC/OS 集群可访问的 KDC 的主机名和端口
  • 充分访问 KDC 的权限,以创建 Kerberos principal
  • 充分访问 KDC 的权限,以检索已生成的 principal 的 keytab
  • DC/OS Enterprise CLI
  • DC/OS 超级用户权限

配置 Kerberos 身份认证

创建 principal

DC/OS Apache HDFS 服务要求部署每个节点的 Kerberos principal。HDFS 服务的整体拓扑是:

  • 3 个日志节点
  • 2 个名称节点(带 ZKFC)
  • 可配置数量的数据节点

注意:Apache HDFS 需要一个针对 `service primary` 和 `HTTP` 二者的 principal。后者由 HTTP api 使用。

所需的 Kerberos principal 形式如下:

<service primary>/name-0-node.<service subdomain>.autoip.dcos.thisdcos.directory@<service realm>
HTTP/name-0-node.<service subdomain>.autoip.dcos.thisdcos.directory@<service realm>
<service primary>/name-0-zkfc.<service subdomain>.autoip.dcos.thisdcos.directory@<service realm>
HTTP/name-0-zkfc.<service subdomain>.autoip.dcos.thisdcos.directory@<service realm>
<service primary>/name-1-node.<service subdomain>.autoip.dcos.thisdcos.directory@<service realm>
HTTP/name-1-node.<service subdomain>.autoip.dcos.thisdcos.directory@<service realm>
<service primary>/name-1-zkfc.<service subdomain>.autoip.dcos.thisdcos.directory@<service realm>
HTTP/name-1-zkfc.<service subdomain>.autoip.dcos.thisdcos.directory@<service realm>

<service primary>/journal-0-node.<service subdomain>.autoip.dcos.thisdcos.directory@<service realm>
HTTP/journal-0-node.<service subdomain>.autoip.dcos.thisdcos.directory@<service realm>
<service primary>/journal-1-node.<service subdomain>.autoip.dcos.thisdcos.directory@<service realm>
HTTP/journal-1-node.<service subdomain>.autoip.dcos.thisdcos.directory@<service realm>
<service primary>/journal-2-node.<service subdomain>.autoip.dcos.thisdcos.directory@<service realm>
HTTP/journal-2-node.<service subdomain>.autoip.dcos.thisdcos.directory@<service realm>

<service primary>/data-<data-index>-node.<service subdomain>.autoip.dcos.thisdcos.directory@<service realm>
HTTP/data-<data-index>-node.<service subdomain>.autoip.dcos.thisdcos.directory@<service realm>

带有:

  • service primary = service.security.kerberos.primary
  • data index = 0 up to data_node.count - 1
  • service subdomain = service.name with all/'s removed
  • service realm = service.security.kerberos.realm

例如,如果使用以下选项安装:

{
    "service": {
        "name": "a/good/example",
        "security": {
            "kerberos": {
                "primary": "example",
                "realm": "EXAMPLE"
            }
        }
    },
    "data_node": {
        "count": 3
    }
}

则要创建的 principal 是:

example/name-0-node.agoodexample.autoip.dcos.thisdcos.directory@EXAMPLE
HTTP/name-0-node.agoodexample.autoip.dcos.thisdcos.directory@EXAMPLE
example/name-0-zkfc.agoodexample.autoip.dcos.thisdcos.directory@EXAMPLE
HTTP/name-0-zkfc.agoodexample.autoip.dcos.thisdcos.directory@EXAMPLE
example/name-1-node.agoodexample.autoip.dcos.thisdcos.directory@EXAMPLE
HTTP/name-1-node.agoodexample.autoip.dcos.thisdcos.directory@EXAMPLE
example/name-1-zkfc.agoodexample.autoip.dcos.thisdcos.directory@EXAMPLE
HTTP/name-1-zkfc.agoodexample.autoip.dcos.thisdcos.directory@EXAMPLE

example/journal-0-node.agoodexample.autoip.dcos.thisdcos.directory@EXAMPLE
HTTP/journal-0-node.agoodexample.autoip.dcos.thisdcos.directory@EXAMPLE
example/journal-1-node.agoodexample.autoip.dcos.thisdcos.directory@EXAMPLE
HTTP/journal-1-node.agoodexample.autoip.dcos.thisdcos.directory@EXAMPLE
example/journal-2-node.agoodexample.autoip.dcos.thisdcos.directory@EXAMPLE
HTTP/journal-2-node.agoodexample.autoip.dcos.thisdcos.directory@EXAMPLE

example/data-0-node.agoodexample.autoip.dcos.thisdcos.directory@EXAMPLE
HTTP/data-0-node.agoodexample.autoip.dcos.thisdcos.directory@EXAMPLE
example/data-1-node.agoodexample.autoip.dcos.thisdcos.directory@EXAMPLE
HTTP/data-1-node.agoodexample.autoip.dcos.thisdcos.directory@EXAMPLE
example/data-2-node.agoodexample.autoip.dcos.thisdcos.directory@EXAMPLE
HTTP/data-2-node.agoodexample.autoip.dcos.thisdcos.directory@EXAMPLE
活动目录

Microsoft Active Directory 可当作 Kerberos KDC 一样使用 。这样做需要在 Active Directory 用户和 Kerberos principal 之间创建映射。

实用程序 ktpass 可用于从 Active Directory 创建 keytab 并同时生成映射。

然而,映射 可以手动创建。对于一个 Kerberos principal,如 <primary>/<host>@<REALM>, Active Directory 用户应该拥有它 servicePrincipalName 和 `userPrincipalName”,属性设置为

servicePrincipalName = <primary>/<host>
userPrincipalName = <primary>/<host>@<REALM>

例如,存在 Kerberos principal example&#x2F;name-0-node.agoodexample.autoip.dcos.thisdcos.directory@EXAMPLE,则正确的映射应为,

servicePrincipalName = example&#x2F;name-0-node.agoodexample.autoip.dcos.thisdcos.directory
userPrincipalName = example&#x2F;name-0-node.agoodexample.autoip.dcos.thisdcos.directory@EXAMPLE

如果映射不正确或不存在,该服务将无法认证该 Principal。Kerberos 调试日志中的症状会是

KRBError:
sTime is Wed Feb 07 03:22:47 UTC 2018 1517973767000
suSec is 697984
error code is 6
error Message is Client not found in Kerberos database
sname is krbtgt/AD.MESOSPHERE.COM@AD.MESOSPHERE.COM
msgType is 30

userPrincipalName 设置不正确时的表单错误,以及

KRBError:
sTime is Wed Feb 07 03:44:57 UTC 2018 1517975097000
suSec is 128465
error code is 7
error Message is Server not found in Kerberos database
sname is kafka/kafka-1-broker.confluent-kafka.autoip.dcos.thisdcos.directory@AD.MESOSPHERE.COM
msgType is 30

servicePrincipalName 设置不正确时的表单错误。

在 DC/OS 密钥存储库中放置服务 Keytab

DC/OS Apache HDFS 服务使用包含所有节点 principal 的 keytab(服务 keytab)。创建上述 principal 后,生成服务 keytab ,确保包括所有节点 principal。这将作为秘钥存储在 DC/OS 密钥存储库中。

注意:DC/OS 1.10 不支持将二进制密钥直接添加到密钥存储库中,仅支持文本文件。而是,先进行文件的 base64 编码,并将其保存到密钥存储库中`/desired/path/__dcos_base64__secret_name`。DC/OS 安全模块将在服务使用文件时处理文件的解码。

服务 keytab 应存储在 service/path/name/service.keytab (如上文对 DC/OS 1.10 所备注,应为 __dcos_base64__service.keytab),在此service/path/name 将服务的路径和名称匹配。例如,如果使用这些选项安装

{
    "service": {
        "name": "a/good/example"
    }
}

则服务 keytab 应保存在 a/good/example/service.keytab

向密钥存储库添加文件的文档可以参见 此处

注意 密钥访问由 DC/OS Spaces控制,其功能如命名空间。位于与服务相同 DC/OS 空间中的任何密钥由该服务访问。然而,匹配两个路径是最安全的选项。此外,密钥名称 `service.keytab` 是惯例,而非要求。

安装服务

除了您自己的选项外,安装 DC/OS Apache HDFS 服务还提供以下选项:

{
    "service": {
        "security": {
            "kerberos": {
                "enabled": true,
                "kdc": {
                    "hostname": "<kdc host>",
                    "port": <kdc port>
                },
                "primary": "<service primary default hdfs>",
                "realm": "<realm>",
                "keytab_secret": "<path to keytab secret>",
                "debug": <true|false default false>
            }
        }
    }
}

授权

DC/OS Apache HDFS 服务支持 HDFS的本地授权,其过程与 UNIX 文件权限类似。如果 Kerberos 已按 以上 详述内容启用,则 Kerberos principal 将映射到 HDFS 用户,并据此分配权限。

启用授权

先决条件

将 Kerberos Principal 设置为用户映射

必须设置自定义映射以将 Kerberos principal 映射到操作系统用户名,以确定组成员身份。这是通过设置参数提供的,

{
    "hdfs": {
        "security_auth_to_local": "<custom mapping>"
    }
}

其中 <custom mapping> 是 base64 编码字符串。

注意:没有 默认映射。必须 在安装时或在服务更新时设置一个映射。

文章有对如何创建自定义映射的详细说明,见“Kerberos Principal 和 UNIX 用户名”部分。

注意:在 DC/OS 1.11 及以上版本中,DC/OS UI 将自动对与 base64 之间的映射进行编码和解码。如果从 CLI 安装或从早于 DC/OS 1.11 版本的 UI 中安装,必须手动执行编码。