配置服务和 pod
ENTERPRISE
配置服务和 pod 以使用密钥
您的服务定义可将密钥引用环境变量或文件。
基于文件的密钥
您可以以文件指向将密钥,为提高其他进程安全性,或者您的服务需要从容器中安装的文件中读取密钥。指向基于文件的密钥对以下内容特别有用:
- Kerberos keytab 或其他凭据文件。
- SSL 证书。
- 包含敏感数据的配置文件。
任务沙盒 ($MESOS_SANDBOX/<configured-path>
) 中提供基于文件的密钥。
先决条件
现有密钥。以下示例使用了存储在
developer
路径名为my-secret
的密钥。如果您完成[创建密钥]中的步骤(/cn/1.12/security/ent/secrets/create-secrets/),则您将满足此先决条件。您必须 获取根证书,才能发布此部分的 curl 命令。
您的[安全模式]的适当权限(/cn/1.12/security/ent/#security-modes)。
权限 执行模式 dcos:adminrouter:service:marathon full
所有安全模式 dcos:service:marathon:marathon:services:/[service-group full
严格
和宽容
安全模式在
strict
模式,用户也可能需要以下内容。dcos:adminrouter:ops:mesos full
:查看 任务 面板信息。dcos:adminrouter:ops:slave full
:查看任务的详细信息,包括日志。
只要密钥的路径和组的路径匹配正确,服务将能够访问密钥值。
该步骤根据您是否要将密钥提供给 pod 或单个服务而有所不同。
配置服务以使用密钥
程序因接口而异。请参阅与您所需界面相对应的部分。
## 配置服务以通过 Web 界面使用密钥
1. 作为具有必要权限的用户登录 Web 界面,如 [权限管理]($000eeac177fea75f.md) 和 [授予访问密钥选项卡]($41f293bbed5c76a7.md) 中所述。
2. 单击 **Services** 选项卡。
3. 单击右上方的 **+** 图标。
![添加服务](/projects/mesosphere-1.12-zh/31fc4e33607f4df5a9495535a1783241.png)
图 1. 运行服务
4. 单击 **JSON Editor** 切换按钮。
5. 选择默认 JSON 架构的内容并删除它们,以便黑框中不显示任何文本。
6. 复制以下简单应用定义之一,并将其粘贴到黑框中。此应用定义在开发人员组内创建新服务,并引用了存储在开发人员路径内的密钥。
基于环境变量的密钥:
```
{
"id":"/developer/service",
"cmd":"sleep 100",
"env":{
"MY_SECRET":{
"secret":"secret0"
}
},
"secrets":{
"secret0":{
"source":"developer/my-secret"
}
}
}
```
在上述示例中,DC/OS 存储环境变量 `"MY_SECRET"` 下的密钥。观察 `"env"` 和 `"secrets"` 对象如何用于定义基于环境变量的密钥。
基于文件的密钥:
```
{
"id": "developer/service",
"cmd": "sleep 100",
"container": {
"type": "MESOS",
"volumes": [
{
"containerPath": "path",
"secret": "secretpassword"
}
]
},
"secrets": {
"secretpassword": {
"source": "developer/databasepassword"
}
}
}
```
在上述示例中,密钥将具有文件名 `path`,并且将在任务的沙盒中可用 (`$MESOS_SANDBOX/path`) 。
由于服务和密钥路径匹配,服务将能够访问该密钥。有关路径的更多详细信息,请参阅[空间]($3ecd320bdee07940.md#spaces)。
7. 单击 **审查并运行**。
8. 单击 **运行服务**。
9. 单击服务组名称,即**开发人员**。
10. 单击服务名称。
11. 单击其任务名称。
12. 滚动浏览**详细信息**选项卡,找到基于环境变量的密钥 `DCOS_SECRETS_DIRECTIVE`。
如果要测试基于文件的密钥是否成功,可以将 `cat path` 添加到应用程序 `cmd`,以将密钥打印到 `stdout` 日志。
例如:
```
{
"id": "developer/service",
"cmd": "cat path && sleep 100",
"container": {
"type": "MESOS",
"volumes": [
{
"containerPath": "path",
"secret": "secretpassword"
}
]
},
"secrets": {
"secretpassword": {
"source": "developer/databasepassword"
}
}
}
```
# 通过 Marathon 应用定义配置服务以使用基于环境变量的密钥
1. 通过 `dcos auth login` 以具有必要权限的用户身份登录 CLI。请参阅 [关于配置服务和 pod 以使用密钥](#service) 来发现所需的权限。
2. 在文本编辑器内,为 Marathon 服务创建应用定义。以下应用程序定义在开发人员组内创建新服务,并引用了存储在开发人员路径内的密钥。
基于环境变量的密钥:
```
{
"id":"/developer/service",
"cmd":"sleep 100",
"env":{
"MY_SECRET":{
"secret":"secret0"
}
},
"secrets":{
"secret0":{
"source":"developer/my-secret"
}
}
}
```
在上述示例中,DC/OS 存储环境变量 `"MY_SECRET"` 下的密钥。观察 `"env"` 和 `"secrets"` 对象如何用于定义基于环境变量的密钥。
基于文件的密钥:
```
{
"id": "developer/service",
"cmd": "sleep 100",
"container": {
"type": "MESOS",
"volumes": [
{
"containerPath": "path",
"secret": "secretpassword"
}
]
},
"secrets": {
"secretpassword": {
"source": "developer/databasepassword"
}
}
}
```
由于服务组和密钥路径匹配,服务将能够访问密钥。有关路径的更多详细信息,请参阅[空间]($3ecd320bdee07940.md#spaces)。
3. 使用描述性名称保存文件,如 `myservice.json`。
4. 通过 DC/OS CLI 将服务添加到 DC/OS。
```
dcos marathon app add myservice.json
```
或者,使用 Marathon API 部署应用程序,如下所示。
```
curl -X POST --cacert dcos-ca.crt $(dcos config show core.dcos_url)/service/marathon/v2/apps -d @myservice.json -H "Content-type: application/json" -H "Authorization: token=$(dcos config show core.dcos_acs_token)"
```
5. 打开 DC/OS Web 界面。
6. 单击服务组名称,即**开发人员**。
7. 单击服务名称。
8. 单击其任务名称。
9. 滚动浏览**详细信息**标签,找到基于环境变量的密钥 `DCOS_SECRETS_DIRECTIVE`。
如果要测试基于文件的密钥是否成功,可以将 `cat path` 添加到应用程序 `cmd`,以将密钥打印到 `stdout` 日志。
例如:
```
{
"id": "developer/service",
"cmd": "cat path && sleep 100",
"container": {
"type": "MESOS",
"volumes": [
{
"containerPath": "path",
"secret": "secretpassword"
}
]
},
"secrets": {
"secretpassword": {
"source": "developer/databasepassword"
}
}
}
```
# 配置 pod 以使用密钥
1. 通过 `dcos auth login` 以具有必要权限的用户身份登录 CLI。有关权限的更多信息,请参阅 [关于配置服务和 pod 以使用密钥](#service)。
2. 在文本编辑器内,为 pod 创建应用定义。您可以使用 `"environment"` 和 `"secrets"` 对象添加密钥,如下所示。以下简单应用程序在开发人员组内定义新服务,并引用了存储在开发人员路径内的密钥。它将密钥存储在环境变量 `"MY_SECRET"` 下。
基于环境变量的密钥:
```
{
"id": "/developer/pod-secret",
"environment": {
"MY_SECRET": {
"secret": "secret0"
}
},
"secrets": {
"secret0": { "source": "developer/my-secret"}
},
"containers": [
{
"name": "container-1",
"resources": {
"cpus": 0.1,
"mem": 128
},
"exec": {
"command": {
"shell": "sleep 3600"
}
}
}
],
"scaling": {
"kind": "fixed",
"instances": 1
},
"networks": [
{
"mode": "host"
}
]
}
```
基于文件的密钥:
```
{
"id": "developer/pod-with-secrets",
"containers": [
{
"type": "MESOS",
"name": "container-1",
"exec": {
"command": {
"shell": "sleep 1"
}
},
"volumeMounts": [
{
"name": "secretvolume",
"mountPath": "path/to/db/password"
}
]
}
],
"volumes": [
{
"name": "secretvolume",
"secret": "secretpassword"
}
],
"secrets": {
"secretpassword": {
"source": "developer/databasepassword"
}
}
}
```
**注意:**由于服务组和密钥路径匹配,pod 将能够访问密钥。有关路径的更多详细信息,请参阅[命名空间](https://docs.d2iq.com/mesosphere/dcos/1.12/security/ent/#spaces)。
3. 使用描述性名称保存文件,如 `mypod.json`。
4. 使用 DC/OS CLI 部署 Pod,如下所示。
```
dcos marathon pod add mypod.json
```
5. 打开 DC/OS Web 界面。
6. 单击服务组名称,即**开发人员**。
7. 单击 Pod 的名称。
8. 单击以打开 **Configuration** 选项卡。
9. 滚动到 **环境变量** 区域,找到您的密钥 `MY_SECRET`。
### 限制
基于文件的密钥仅与 UCR 配合使用。