本主题介绍如何为 Spark 配置 DC/OS 服务帐户。
在 DC/OS 严格安全模式下运行时,调度器和作业都 必须使用 DC/OS 服务帐户 进行 Mesos 认证。
配置服务帐户
本部分介绍如何为 Apache Spark 配置 DC/OS 访问权限。根据您的 安全模式, Apache Spark 可能需要 服务身份认证 以访问 DC/OS。
安全模式 | 服务帐户 |
---|---|
已禁用 | 不可用 |
宽容 | 可选 |
严格 | 必填 |
如果您在宽容模式下安装服务且未指定服务帐户,Metronome 和 Marathon 将按照此服务的请求是由具有 超级用户权限的帐户做出的那样行事。
前提条件:
- 已安装 DC/OS CLI 并以超级用户身份登录。
- 已安装 Enterprise DC/OS CLI 0.4.14 或更高版本。
- 如果您的 安全模式 是
permissive
或strict
,您必须 获取 root 证书,才能发出本部分中的 curl 命令。
创建密钥对
在此步骤中,系统使用 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 "Spark <service-account-id>
注意: 您可以使用以下命令验证您的新服务帐户。
dcos security org service-accounts show <service-account-id>
创建密钥
创建密钥 (spark//<secret-name>
) with your service account (<service-account-id>
) and private key specified (<private-key>.pem
)。
如果您在与服务名称匹配的路径中存储密钥(例如,您的服务名称和密钥路径都是 spark
),则只有名为 spark
的服务可以访问它。
宽容 (Permissive)
dcos security secrets create-sa-secret <private-key>.pem <service-account-id> spark/<secret-name>
严格 (Strict)
dcos security secrets create-sa-secret --strict <private-key>.pem <service-account-id> spark/<secret-name>
注意: 您可以使用以下命令列出密钥:
dcos security secrets list /
创建和分配权限
使用以下 curl
命令快速为 Spark 服务配置所需权限。这也可通过 UI 完成。
注意:
- 在资源中的任何
/
字符必须替换为%252F
,才能在curl
命令中进行传递。 - 使用 API 管理权限时,您必须首先创建权限,然后分配权限。有时,权限可能已存在。在此情况下,API 返回告知性信息。您可以将其视为确认并继续执行下一个命令。
- 创建权限。其中一些权限可能已存在。
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:* \
-d '{"description":"Allows a framework to register with the Mesos master using the Mesos default role"}' \
-H 'Content-Type: application/json'
curl -X PUT -k \
-H "Authorization: token=$(dcos config show core.dcos_acs_token)" "$(dcos config show core.dcos_url)/acs/api/v1/acls/dcos:mesos:master:task:app_id:%252Fspark" \
-d '{"description":"Allow to read the task state"}' \
-H 'Content-Type: application/json'
如果这些命令返回 307 Temporary Redirect
错误,可能是因为您的群集 URL (dcos config show core.dcos_url
) 未设置为超文本传输协议安全(https://
)。
- 使用以下命令将权限和允许的操作授予服务帐户。运行这些命令,并且指定您的服务帐户名称 (
<service-account-id>
) 。
curl -X PUT -k \
-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:*/users/<service-account-id>/create"
curl -X PUT -k \
-H "Authorization: token=$(dcos config show core.dcos_acs_token)" "$(dcos config show core.dcos_url)/acs/api/v1/acls/dcos:mesos:master:task:app_id:%252Fspark/users/<service-account-id>/create"
curl -X PUT -k \
-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
创建自定义配置文件
创建将用于安装 Apache Spark 的自定义配置文件,并另存为 config.json
。指定服务帐户 (<service_account_id>
) and a secret path (spark/<secret-name>
) .
{
"service": {
"service_account": "<service_account_id>",
"service_account_secret": "spark/<secret-name>"
}
}
使用密钥存储库
DC/OS Enterprise 允许用户以文件的形式向 DC/OS 密钥存储库添加特权信息。这些文件 可在 Spark 作业中引用,可用于认证和授权不同的外部服务(例如 HDFS)。例如,我们使用此功能传递 Kerberos Keytab。有关如何使用密钥的详细信息, 参见官方文档。
放置密钥的地方
为了让 Spark 可用到密钥,密钥必须放置在可通过 Spark 服务访问的路径中。如果只有 Spark 需要访问密钥,将密钥存储在匹配所述 Spark 服务名称的路径中(例如 spark/secret
)。有关密钥路径如何限制对密钥的访问的详细信息,请参阅 有关空间的密钥文档。
限制
有权访问 Spark(调度器)服务实例的任何人可访问对其可用的所有密钥。不要授予用户访问 Spark 调度器实例的权限,除非他们也被允许访问所有可用于 Spark 调度器实例的密钥。
二进制密钥
您可以将二进制文件,如 Kerberos keytab,存储在 DC/OS 密钥存储库中。在 DC/OS 1.11 和更高版本中,您可以直接从 二进制文件创建密钥,而在 DC/OS 1.10 或更早版本中,文件必须按照 RFC 4648 的说明进行 base64 编码,才能保存为密钥。
DC/OS 1.11+
要使用 kerb5.keytab
二进制内容创建名为 mysecret
的密钥,运行:
$ dcos security secrets create --file kerb5.keytab mysecret
DC/OS 1.10 或更早版本
要使用 kerb5.keytab
二进制内容创建名为 mysecret
的密钥,首先使用
base64
命令行实用程序对其进行编码。以下示例使用 BSD base64
(macOS 中默认 )。
$ base64 -i krb5.keytab -o kerb5.keytab.base64-encoded
或者,GNU base64
(Linux 中默认)默认在编码数据中插入行馈送。
使用 -w 0
自变量禁用自动换行。
$ base64 -w 0 -i krb5.keytab > kerb5.keytab.base64-encoded
现在文件已编码,可以将其作为密钥存储。
$ dcos security secrets create -f kerb5.keytab.base64-encoded some/path/__dcos_base64__mysecret
当 some/path/__dcos_base64__mysecret
密钥在您的 dcos spark run
命令中被引用时,其 base64 解码的
内容将作为您的应用程序中的[临时文件] 提供(http://mesos.apache.org/documentation/latest/secrets/#file-based-secrets)
Spark 。
使用 Mesos 密钥
在密钥存储库中添加密钥之后,
您可以将它们传递至 Spark,并使用 spark.mesos.<task-name>.secret.names
和
spark.mesos.<task-name>.secret.<filenames|envkeys>
配置参数 哪里 <task-name>
是 或 driver
要么
executor
。
指定 filenames
或 envkeys
将密钥实现为基于文件的密钥或
环境变量。这些配置参数将使用“压缩”在一起的逗号分隔列表制作
最终的密钥文件或环境变量。我们建议尽可能使用基于文件的密钥,因为这样
比环境变量更加安全。
仅 Mesos containerizer 支持密钥,Docker containerizer 不支持。要使用 Mesos containerizer,添加此配置:
--conf spark.mesos.containerizer=mesos
例如,要在驱动程序 和 执行程序中以文件形式使用名为 spark/my-secret-file
的密钥,添加这些配置
参数:
--conf spark.mesos.containerizer=mesos
--conf spark.mesos.driver.secret.names=spark/my-secret-file
--conf spark.mesos.driver.secret.filenames=target-secret-file
--conf spark.mesos.executor.secret.names=spark/my-secret-file
--conf spark.mesos.executor.secret.filenames=target-secret-file
这将把密钥 spark/my-secret-file
的内容放入驱动程序和执行程序沙箱中
名为target-secret-file
的安全 RAM-FS 挂载密钥文件中。如果您想作为环境变量使用密钥(例如
AWS 凭证),您将按以下更改配置:
--conf spark.mesos.containerizer=mesos
--conf spark.mesos.driver.secret.names=/spark/my-aws-secret,/spark/my-aws-key
--conf spark.mesos.driver.secret.envkeys=AWS_SECRET_ACCESS_KEY,AWS_ACCESS_KEY_ID
这假设您的密钥存取键存储在名为 spark/my-aws-secret
的密钥中,您的密钥 ID 在
spark/my-aws-key
.
限制
使用基于环境和文件的密钥组合时,需要相同数量的接收器和密钥 来源(即文件和环境变量)。例如
--conf spark.mesos.containerizer=mesos
--conf spark.mesos.driver.secret.names=/spark/my-secret-file,/spark/my-secret-envvar
--conf spark.mesos.driver.secret.filenames=target-secret-file,placeholder-file
--conf spark.mesos.driver.secret.envkeys=PLACEHOLDER,SECRET_ENVVAR
将 spark/my-secret-file
的内容放入 PLACEHOLDER
环境变量,将 target-secret-file
文件
以及 spark/my-secret-envvar
内容放入 SECRET_ENVVAR
和 placeholder-file
。如果是二进制
密钥,环境变量将仍然为空,因为不能给环境
变量分配二进制值。
Spark SSL
DC/OS Apache Spark 中的 SSL 支持对以下信道进行加密:
- 从 DC/OS Admin Router 到调度器。
- 从驱动程序向执行程序提供的文件。
要启用 SSL,必须提供 Java keystore(和可选信任存储)及其密码。在 提交工作时,以下前三个设置为 必需。如果使用信任存储,后两个也是 必需:
变量 | 说明 |
---|---|
--keystore-secret-path |
密钥库在秘密商店的路径 |
--keystore-password |
用于访问密钥库的密码 |
--private-key-password |
私钥的密码 |
--truststore-secret-path |
信任库在秘密商店的路径 |
--truststore-password |
用于访问信任库的密码 |
此外, t有一些 Spark 配置变量 与SSL设置相关. 这些配置设置是可选的:
变量 | 说明 | 默认值 |
---|---|---|
spark.ssl.enabledAlgorithms |
允许的 cypher | JVM 默认值 |
spark.ssl.protocol |
协议 | TLS |
keystore 和信任存储使用 Java 键工具 创建。keystore 必须包含一个私钥及其 已签名公钥。信任存储是可选的,可能包含明确受 Java 信任的自签名 root-ca 证书 。
将存储添加到您在 DC/OS 密钥存储库的密钥中。例如,如果您的 keystore 和信任存储 分别为 server.jks 和 trust.jks,则使用以下命令将其添加到密钥 存储:
dcos security secrets create /spark/keystore --text-file server.jks
dcos security secrets create /spark/truststore --text-file trust.jks
您必须向您的 dcos spark run
命令中添加以下配置。
括号中的内容是可选的:
dcos spark run --verbose --submit-args="\
--keystore-secret-path=<path/to/keystore, e.g. spark/keystore> \
--keystore-password=<password to keystore> \
--private-key-password=<password to private key in keystore> \
(—-truststore-secret-path=<path/to/truststore, e.g. spark/truststore> \)
(--truststore-password=<password to truststore> \)
(—-conf spark.ssl.enabledAlgorithms=<cipher, e.g., TLS_RSA_WITH_AES_128_CBC_SHA256> \)
--class <Spark Main class> <Spark Application JAR> [application args]"
DC/OS 1.10 或更早版本: 因为两个存储都是二进制文件,它们必须是 base64 编码,然后才能放入 DC/OS 密钥存储库。按照上述有关编码二进制密钥的说明,编码 keystore 和信任存储。
注意: 如果您使用 spark.mesos.[driver|executor].secret.envkeys
指定了基于环境的密钥,由于密钥实施方式,keystore 和
信任存储密钥也将显示为基于环境的密钥。您可以
忽略这些额外的环境变量。
Spark SASL(执行程序认证和数据块转移服务加密)
Spark 使用简单认证安全层 (SASL) 对驱动程序进行认证,并加密 组件之间发送的消息。此功能依赖于您预期在相互之间通信的所有组件之间的一个共享密钥 。可以使用 DC/OS Spark CLI 生成密钥
dcos spark secret <secret_path>
# for example
dcos spark secret /spark/sparkAuthSecret
这将生成随机密钥,并将其上传到指定路径的 DC/OS 密钥存储库14。要使用此 密钥进行 RPC 认证,在您的 CLI 命令中添加以下配置:
dcos spark run --submit-args="\
...
--executor-auth-secret=/spark/sparkAuthSecret
...
"