配置服务和 pod

ENTERPRISE

配置服务和 pod 以使用密钥

您的服务定义可将密钥引用环境变量或文件。

基于文件的密钥

您可以以文件指向将密钥,为提高其他进程安全性,或者您的服务需要从容器中安装的文件中读取密钥。指向基于文件的密钥对以下内容特别有用:

  • Kerberos keytab 或其他凭据文件。
  • SSL 证书。
  • 包含敏感数据的配置文件。

任务沙盒 ($MESOS_SANDBOX/<configured-path>) 中提供基于文件的密钥。

先决条件

  • 现有密钥。以下示例使用了存储在 developer 路径名为 my-secret 的密钥。如果您完成[创建密钥]中的步骤(/cn/1.12/security/ent/secrets/create-secrets/),则您将满足此先决条件。

  • 已安装 DC/OS CLI 以及 已安装 DC/OS Enterprise CLI

  • 您必须 获取根证书,才能发布此部分的 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 界面,如 权限管理授予访问密钥选项卡 中所述。

    2. 单击 Services 选项卡。

    3. 单击右上方的 + 图标。

      添加服务

      图 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) 。

      由于服务和密钥路径匹配,服务将能够访问该密钥。有关路径的更多详细信息,请参阅空间

    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 以使用密钥 来发现所需的权限。

    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"
          }
        }
      }
      

      由于服务组和密钥路径匹配,服务将能够访问密钥。有关路径的更多详细信息,请参阅空间

    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 以使用密钥

    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 将能够访问密钥。有关路径的更多详细信息,请参阅命名空间

    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 配合使用。