配置服务和 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 或单个服务而有所不同。

    配置服务以使用密钥

    程序因接口而异。请参阅与您所需界面相对应的部分。

  1. ## 配置服务以通过 Web 界面使用密钥
  2. 1. 作为具有必要权限的用户登录 Web 界面,如 [权限管理]($000eeac177fea75f.md) [授予访问密钥选项卡]($41f293bbed5c76a7.md) 中所述。
  3. 2. 单击 **Services** 选项卡。
  4. 3. 单击右上方的 **+** 图标。
  5. ![添加服务](/projects/mesosphere-1.12-zh/31fc4e33607f4df5a9495535a1783241.png)
  6. 1. 运行服务
  7. 4. 单击 **JSON Editor** 切换按钮。
  8. 5. 选择默认 JSON 架构的内容并删除它们,以便黑框中不显示任何文本。
  9. 6. 复制以下简单应用定义之一,并将其粘贴到黑框中。此应用定义在开发人员组内创建新服务,并引用了存储在开发人员路径内的密钥。
  10. 基于环境变量的密钥:
  11. ```
  12. {
  13. "id":"/developer/service",
  14. "cmd":"sleep 100",
  15. "env":{
  16. "MY_SECRET":{
  17. "secret":"secret0"
  18. }
  19. },
  20. "secrets":{
  21. "secret0":{
  22. "source":"developer/my-secret"
  23. }
  24. }
  25. }
  26. ```
  27. 在上述示例中,DC/OS 存储环境变量 `"MY_SECRET"` 下的密钥。观察 `"env"` `"secrets"` 对象如何用于定义基于环境变量的密钥。
  28. 基于文件的密钥:
  29. ```
  30. {
  31. "id": "developer/service",
  32. "cmd": "sleep 100",
  33. "container": {
  34. "type": "MESOS",
  35. "volumes": [
  36. {
  37. "containerPath": "path",
  38. "secret": "secretpassword"
  39. }
  40. ]
  41. },
  42. "secrets": {
  43. "secretpassword": {
  44. "source": "developer/databasepassword"
  45. }
  46. }
  47. }
  48. ```
  49. 在上述示例中,密钥将具有文件名 `path`,并且将在任务的沙盒中可用 (`$MESOS_SANDBOX/path`)
  50. 由于服务和密钥路径匹配,服务将能够访问该密钥。有关路径的更多详细信息,请参阅[空间]($3ecd320bdee07940.md#spaces)。
  51. 7. 单击 **审查并运行**。
  52. 8. 单击 **运行服务**。
  53. 9. 单击服务组名称,即**开发人员**。
  54. 10. 单击服务名称。
  55. 11. 单击其任务名称。
  56. 12. 滚动浏览**详细信息**选项卡,找到基于环境变量的密钥 `DCOS_SECRETS_DIRECTIVE`
  57. 如果要测试基于文件的密钥是否成功,可以将 `cat path` 添加到应用程序 `cmd`,以将密钥打印到 `stdout` 日志。
  58. 例如:
  59. ```
  60. {
  61. "id": "developer/service",
  62. "cmd": "cat path && sleep 100",
  63. "container": {
  64. "type": "MESOS",
  65. "volumes": [
  66. {
  67. "containerPath": "path",
  68. "secret": "secretpassword"
  69. }
  70. ]
  71. },
  72. "secrets": {
  73. "secretpassword": {
  74. "source": "developer/databasepassword"
  75. }
  76. }
  77. }
  78. ```
  79. # 通过 Marathon 应用定义配置服务以使用基于环境变量的密钥
  80. 1. 通过 `dcos auth login` 以具有必要权限的用户身份登录 CLI。请参阅 [关于配置服务和 pod 以使用密钥](#service) 来发现所需的权限。
  81. 2. 在文本编辑器内,为 Marathon 服务创建应用定义。以下应用程序定义在开发人员组内创建新服务,并引用了存储在开发人员路径内的密钥。
  82. 基于环境变量的密钥:
  83. ```
  84. {
  85. "id":"/developer/service",
  86. "cmd":"sleep 100",
  87. "env":{
  88. "MY_SECRET":{
  89. "secret":"secret0"
  90. }
  91. },
  92. "secrets":{
  93. "secret0":{
  94. "source":"developer/my-secret"
  95. }
  96. }
  97. }
  98. ```
  99. 在上述示例中,DC/OS 存储环境变量 `"MY_SECRET"` 下的密钥。观察 `"env"` `"secrets"` 对象如何用于定义基于环境变量的密钥。
  100. 基于文件的密钥:
  101. ```
  102. {
  103. "id": "developer/service",
  104. "cmd": "sleep 100",
  105. "container": {
  106. "type": "MESOS",
  107. "volumes": [
  108. {
  109. "containerPath": "path",
  110. "secret": "secretpassword"
  111. }
  112. ]
  113. },
  114. "secrets": {
  115. "secretpassword": {
  116. "source": "developer/databasepassword"
  117. }
  118. }
  119. }
  120. ```
  121. 由于服务组和密钥路径匹配,服务将能够访问密钥。有关路径的更多详细信息,请参阅[空间]($3ecd320bdee07940.md#spaces)。
  122. 3. 使用描述性名称保存文件,如 `myservice.json`
  123. 4. 通过 DC/OS CLI 将服务添加到 DC/OS
  124. ```
  125. dcos marathon app add myservice.json
  126. ```
  127. 或者,使用 Marathon API 部署应用程序,如下所示。
  128. ```
  129. 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)"
  130. ```
  131. 5. 打开 DC/OS Web 界面。
  132. 6. 单击服务组名称,即**开发人员**。
  133. 7. 单击服务名称。
  134. 8. 单击其任务名称。
  135. 9. 滚动浏览**详细信息**标签,找到基于环境变量的密钥 `DCOS_SECRETS_DIRECTIVE`
  136. 如果要测试基于文件的密钥是否成功,可以将 `cat path` 添加到应用程序 `cmd`,以将密钥打印到 `stdout` 日志。
  137. 例如:
  138. ```
  139. {
  140. "id": "developer/service",
  141. "cmd": "cat path && sleep 100",
  142. "container": {
  143. "type": "MESOS",
  144. "volumes": [
  145. {
  146. "containerPath": "path",
  147. "secret": "secretpassword"
  148. }
  149. ]
  150. },
  151. "secrets": {
  152. "secretpassword": {
  153. "source": "developer/databasepassword"
  154. }
  155. }
  156. }
  157. ```
  158. # 配置 pod 以使用密钥
  159. 1. 通过 `dcos auth login` 以具有必要权限的用户身份登录 CLI。有关权限的更多信息,请参阅 [关于配置服务和 pod 以使用密钥](#service)。
  160. 2. 在文本编辑器内,为 pod 创建应用定义。您可以使用 `"environment"` `"secrets"` 对象添加密钥,如下所示。以下简单应用程序在开发人员组内定义新服务,并引用了存储在开发人员路径内的密钥。它将密钥存储在环境变量 `"MY_SECRET"` 下。
  161. 基于环境变量的密钥:
  162. ```
  163. {
  164. "id": "/developer/pod-secret",
  165. "environment": {
  166. "MY_SECRET": {
  167. "secret": "secret0"
  168. }
  169. },
  170. "secrets": {
  171. "secret0": { "source": "developer/my-secret"}
  172. },
  173. "containers": [
  174. {
  175. "name": "container-1",
  176. "resources": {
  177. "cpus": 0.1,
  178. "mem": 128
  179. },
  180. "exec": {
  181. "command": {
  182. "shell": "sleep 3600"
  183. }
  184. }
  185. }
  186. ],
  187. "scaling": {
  188. "kind": "fixed",
  189. "instances": 1
  190. },
  191. "networks": [
  192. {
  193. "mode": "host"
  194. }
  195. ]
  196. }
  197. ```
  198. 基于文件的密钥:
  199. ```
  200. {
  201. "id": "developer/pod-with-secrets",
  202. "containers": [
  203. {
  204. "type": "MESOS",
  205. "name": "container-1",
  206. "exec": {
  207. "command": {
  208. "shell": "sleep 1"
  209. }
  210. },
  211. "volumeMounts": [
  212. {
  213. "name": "secretvolume",
  214. "mountPath": "path/to/db/password"
  215. }
  216. ]
  217. }
  218. ],
  219. "volumes": [
  220. {
  221. "name": "secretvolume",
  222. "secret": "secretpassword"
  223. }
  224. ],
  225. "secrets": {
  226. "secretpassword": {
  227. "source": "developer/databasepassword"
  228. }
  229. }
  230. }
  231. ```
  232. **注意:**由于服务组和密钥路径匹配,pod 将能够访问密钥。有关路径的更多详细信息,请参阅[命名空间](https://docs.d2iq.com/mesosphere/dcos/1.12/security/ent/#spaces)。
  233. 3. 使用描述性名称保存文件,如 `mypod.json`
  234. 4. 使用 DC/OS CLI 部署 Pod,如下所示。
  235. ```
  236. dcos marathon pod add mypod.json
  237. ```
  238. 5. 打开 DC/OS Web 界面。
  239. 6. 单击服务组名称,即**开发人员**。
  240. 7. 单击 Pod 的名称。
  241. 8. 单击以打开 **Configuration** 选项卡。
  242. 9. 滚动到 **环境变量** 区域,找到您的密钥 `MY_SECRET`
  243. ### 限制
  244. 基于文件的密钥仅与 UCR 配合使用。