[关闭]
@qiezhian 2014-12-01T02:56:15.000000Z 字数 20131 阅读 1587

身份管理(1)

云计算


代号为“keystone”的OpenStack Identity 服务,是OpenStack的默认身份管理系统。您安装完身份服务后,可通过etc/keystone.conf配置文件,
或者有可能是一个单独的日志配置文件,来对它进行配置。您可通过 keystone命令行客户端来初始化数据到Identity身份服务中。

Identity concepts

User management

身份用户管理的主要组件为:

  1. $ keystone user-create --name alice --pass mypassword123 --email alice@example.com
  1. $ keystone tenant-create --name acme

Note:由于在先前版本中,在compute服务中使用的是名词project而不是tenant,所以一些命令行工具使用--project_id而不是--tenant-id或者--os-tenant-id来表示tenant的ID号。

  1. keystone role-create --name compute-user

Note:如Compute及Image服务这样的个体服务会赋予角色具体意义。在Identity服务中,角色仅仅是一个名字。
Identity服务赋予一个租户及角色给一个用户。您可以将compute-user角色赋予给在acme租户中的用户alice

  1. $ keystone user-role-add --user 892585 --role 9a764e --tenant-id 6b8fd2

用户可以在不同租户内拥有不同的角色。例如,用户alice也可以在Cyberdyne租户中拥有admin角色。用户也可以在同个租户中有多个角色。
文件/etc/[SERVICE_CODENAME]/policy.json控制了用户对于一个给定服务的操作集。例如,/etc/nova/policy.json文件指定了对Compute服务的访问策略,/etc/glance/policy.json文件指定了对Image服务的访问策略,/etc/keystone/policy.json文件指定了对Identity服务的访问策略。
在Compute、Identity以及Image服务中默认的policy.json文件只对admin角色可见:所有无需要求admin角色的操作,可被租户内的任意用户及角色获得并执行。
加入您想要限制用户在Compute服务中的操作,您需要在Identity服务中创建一个角色并修改/etc/nova/policy.json文件,这样在请求Compute操作时会需要角色认证。
例如,下面这行代码(/etc/nova/policy.json文件中)指出,对用户创建卷的操作没有任何限制:如果用户在租户内有至少一个角色,那么用户就可以在租户内创建卷。

  1. "volume:create": [],

为了限制在一个特定的租户中拥有compute-user角色的用户的创建卷操作,您应该像这样一样添加“role:compute-user":

  1. "volume:create":["role:compute-user"],

为了限制该角色的所有Compute服务请求,文件应该像这样:

  1. {
  2. "admin_or_owner": [
  3. [
  4. "role:admin"
  5. ],
  6. [
  7. "project_id:%(project_id)s"
  8. ]
  9. ],
  10. "default": [
  11. [
  12. "rule:admin_or_owner"
  13. ]
  14. ],
  15. "compute:create": [
  16. "role:compute-user"
  17. ],
  18. "compute:create:attach_network": [
  19. "role:compute-user"
  20. ],
  21. "compute:create:attach_volume": [
  22. "role:compute-user"
  23. ],
  24. "compute:get_all": [
  25. "role:compute-user"
  26. ],
  27. "compute:unlock_override": [
  28. "rule:admin_api"
  29. ],
  30. "admin_api": [
  31. [
  32. "role:admin"
  33. ]
  34. ],
  35. "compute_extension:accounts": [
  36. [
  37. "rule:admin_api"
  38. ]
  39. ],
  40. "compute_extension:admin_actions": [
  41. [
  42. "rule:admin_api"
  43. ]
  44. ],
  45. "compute_extension:admin_actions:pause": [
  46. [
  47. "rule:admin_or_owner"
  48. ]
  49. ],
  50. "compute_extension:admin_actions:unpause": [
  51. [
  52. "rule:admin_or_owner"
  53. ]
  54. ],
  55. "compute_extension:admin_actions:suspend": [
  56. [
  57. "rule:admin_or_owner"
  58. ]
  59. ],
  60. "compute_extension:admin_actions:resume": [
  61. [
  62. "rule:admin_or_owner"
  63. ]
  64. ],
  65. "compute_extension:admin_actions:lock": [
  66. [
  67. "rule:admin_or_owner"
  68. ]
  69. ],
  70. "compute_extension:admin_actions:unlock": [
  71. [
  72. "rule:admin_or_owner"
  73. ]
  74. ],
  75. "compute_extension:admin_actions:resetNetwork": [
  76. [
  77. "rule:admin_api"
  78. ]
  79. ],
  80. "compute_extension:admin_actions:injectNetworkInfo": [
  81. [
  82. "rule:admin_api"
  83. ]
  84. ],
  85. "compute_extension:admin_actions:createBackup": [
  86. [
  87. "rule:admin_or_owner"
  88. ]
  89. ],
  90. "compute_extension:admin_actions:migrateLive": [
  91. [
  92. "rule:admin_api"
  93. ]
  94. ],
  95. "compute_extension:admin_actions:migrate": [
  96. [
  97. "rule:admin_api"
  98. ]
  99. ],
  100. "compute_extension:aggregates": [
  101. [
  102. "rule:admin_api"
  103. ]
  104. ],
  105. "compute_extension:certificates": [
  106. "role:compute-user"
  107. ],
  108. "compute_extension:cloudpipe": [
  109. [
  110. "rule:admin_api"
  111. ]
  112. ],
  113. "compute_extension:console_output": [
  114. "role:compute-user"
  115. ],
  116. "compute_extension:consoles": [
  117. "role:compute-user"
  118. ],
  119. "compute_extension:createserverext": [
  120. "role:compute-user"
  121. ],
  122. "compute_extension:deferred_delete": [
  123. "role:compute-user"
  124. ],
  125. "compute_extension:disk_config": [
  126. "role:compute-user"
  127. ],
  128. "compute_extension:evacuate": [
  129. [
  130. "rule:admin_api"
  131. ]
  132. ],
  133. "compute_extension:extended_server_attributes": [
  134. [
  135. "rule:admin_api"
  136. ]
  137. ],
  138. "compute_extension:extended_status": [
  139. "role:compute-user"
  140. ],
  141. "compute_extension:flavorextradata": [
  142. "role:compute-user"
  143. ],
  144. "compute_extension:flavorextraspecs": [
  145. "role:compute-user"
  146. ],
  147. "compute_extension:flavormanage": [
  148. [
  149. "rule:admin_api"
  150. ]
  151. ],
  152. "compute_extension:floating_ip_dns": [
  153. "role:compute-user"
  154. ],
  155. "compute_extension:floating_ip_pools": [
  156. "role:compute-user"
  157. ],
  158. "compute_extension:floating_ips": [
  159. "role:compute-user"
  160. ],
  161. "compute_extension:hosts": [
  162. [
  163. "rule:admin_api"
  164. ]
  165. ],
  166. "compute_extension:keypairs": [
  167. "role:compute-user"
  168. ],
  169. "compute_extension:multinic": [
  170. "role:compute-user"
  171. ],
  172. "compute_extension:networks": [
  173. [
  174. "rule:admin_api"
  175. ]
  176. ],
  177. "compute_extension:quotas": [
  178. "role:compute-user"
  179. ],
  180. "compute_extension:rescue": [
  181. "role:compute-user"
  182. ],
  183. "compute_extension:security_groups": [
  184. "role:compute-user"
  185. ],
  186. "compute_extension:server_action_list": [
  187. [
  188. "rule:admin_api"
  189. ]
  190. ],
  191. "compute_extension:server_diagnostics": [
  192. [
  193. "rule:admin_api"
  194. ]
  195. ],
  196. "compute_extension:simple_tenant_usage:show": [
  197. [
  198. "rule:admin_or_owner"
  199. ]
  200. ],
  201. "compute_extension:simple_tenant_usage:list": [
  202. [
  203. "rule:admin_api"
  204. ]
  205. ],
  206. "compute_extension:users": [
  207. [
  208. "rule:admin_api"
  209. ]
  210. ],
  211. "compute_extension:virtual_interfaces": [
  212. "role:compute-user"
  213. ],
  214. "compute_extension:virtual_storage_arrays": [
  215. "role:compute-user"
  216. ],
  217. "compute_extension:volumes": [
  218. "role:compute-user"
  219. ],
  220. "compute_extension:volume_attachments:index": [
  221. "role:compute-user"
  222. ],
  223. "compute_extension:volume_attachments:show": [
  224. "role:compute-user"
  225. ],
  226. "compute_extension:volume_attachments:create": [
  227. "role:compute-user"
  228. ],
  229. "compute_extension:volume_attachments:delete": [
  230. "role:compute-user"
  231. ],
  232. "compute_extension:volumetypes": [
  233. "role:compute-user"
  234. ],
  235. "volume:create": [
  236. "role:compute-user"
  237. ],
  238. "volume:get_all": [
  239. "role:compute-user"
  240. ],
  241. "volume:get_volume_metadata": [
  242. "role:compute-user"
  243. ],
  244. "volume:get_snapshot": [
  245. "role:compute-user"
  246. ],
  247. "volume:get_all_snapshots": [
  248. "role:compute-user"
  249. ],
  250. "network:get_all_networks": [
  251. "role:compute-user"
  252. ],
  253. "network:get_network": [
  254. "role:compute-user"
  255. ],
  256. "network:delete_network": [
  257. "role:compute-user"
  258. ],
  259. "network:disassociate_network": [
  260. "role:compute-user"
  261. ],
  262. "network:get_vifs_by_instance": [
  263. "role:compute-user"
  264. ],
  265. "network:allocate_for_instance": [
  266. "role:compute-user"
  267. ],
  268. "network:deallocate_for_instance": [
  269. "role:compute-user"
  270. ],
  271. "network:validate_networks": [
  272. "role:compute-user"
  273. ],
  274. "network:get_instance_uuids_by_ip_filter": [
  275. "role:compute-user"
  276. ],
  277. "network:get_floating_ip": [
  278. "role:compute-user"
  279. ],
  280. "network:get_floating_ip_pools": [
  281. "role:compute-user"
  282. ],
  283. "network:get_floating_ip_by_address": [
  284. "role:compute-user"
  285. ],
  286. "network:get_floating_ips_by_project": [
  287. "role:compute-user"
  288. ],
  289. "network:get_floating_ips_by_fixed_address": [
  290. "role:compute-user"
  291. ],
  292. "network:allocate_floating_ip": [
  293. "role:compute-user"
  294. ],
  295. "network:deallocate_floating_ip": [
  296. "role:compute-user"
  297. ],
  298. "network:associate_floating_ip": [
  299. "role:compute-user"
  300. ],
  301. "network:disassociate_floating_ip": [
  302. "role:compute-user"
  303. ],
  304. "network:get_fixed_ip": [
  305. "role:compute-user"
  306. ],
  307. "network:add_fixed_ip_to_instance": [
  308. "role:compute-user"
  309. ],
  310. "network:remove_fixed_ip_from_instance": [
  311. "role:compute-user"
  312. ],
  313. "network:add_network_to_project": [
  314. "role:compute-user"
  315. ],
  316. "network:get_instance_nw_info": [
  317. "role:compute-user"
  318. ],
  319. "network:get_dns_domains": [
  320. "role:compute-user"
  321. ],
  322. "network:add_dns_entry": [
  323. "role:compute-user"
  324. ],
  325. "network:modify_dns_entry": [
  326. "role:compute-user"
  327. ],
  328. "network:delete_dns_entry": [
  329. "role:compute-user"
  330. ],
  331. "network:get_dns_entries_by_address": [
  332. "role:compute-user"
  333. ],
  334. "network:get_dns_entries_by_name": [
  335. "role:compute-user"
  336. ],
  337. "network:create_private_dns_domain": [
  338. "role:compute-user"
  339. ],
  340. "network:create_public_dns_domain": [
  341. "role:compute-user"
  342. ],
  343. "network:delete_dns_domain": [
  344. "role:compute-user"
  345. ]
  346. }

Service management

Identity服务提供identity、token(令牌)、Catalog以及Policy服务。它包含:

Identity服务也维护着用户名与服务的对应关系,例如用户名为nova的用户之于Compute服务,名为service之于一种特殊服务租户。
关于如何创建服务及端点,参见OpenStack Admin User Guide

Groups

一个组是多个用户的集合。管理员可以创建组并向其添加用户。然后将一个角色赋予给一个组,而将一个角色赋予给一个单独用户。每个组都在一个域(domain)里面。组是在Identity API v3引进的。Identity API v3还提供了与组相关的操作:

Note:Identity服务服务器也许不会允许以上所有操作。例如,如果使用以LDAP Identity为后端的Identity服务器,并且组更新无效时,那么创建、删除或者更新一个组的请求将会失败。
几个示例:
- 租户A中的组A被赋予角色A。如果用户A是组A的一员,当用户A获得租户A范围内的令牌时,该令牌也包含角色A。
- 域B中的组B被赋予角色B。如果用户B为域B的一员,且用户B获得域B范围内的令牌,该令牌也包含角色B。

Domain

一个域为Identity实体的管理定义了管理边界。一个域也许表示了一个个体、或公司或者拥有操作权限的空间。它用来将管理性活动直接暴露给系统用户。
一个域是多个租户、用户以及角色的集合。用户可以被赋予域管理员角色。域管理员也许可以在域内创建租户、用户、组,并将角色赋予给用户和组。

Certificates for PKI

PKI(Public Key Infrastructure)公钥基础设施。令牌则是使用X509标准进行加密签名的文档。要使令牌正确工作需要一对公私(public/private)密钥。公钥必须在X509证书上签名,且用来签名的证书必须来自证书颁发机构(CA)。
上述所需文件可以使用keystone-manage组件产生,或者使用外部组件产生。产生的文件必须放在顶级Identity服务配置文件keystone.conf指定的位置。并且,秘钥只能为运行Identity服务的系统用户所读取。
Warning:证书可以被任何用户读取,但是私钥不可以。私钥只能被将要签名令牌的账户读取。当使用keystone-managepki_setup命令来产生文件,您最好的选择是作为pki用户来使用上述命令。如果您以root权限运行keystone-manage命令,您可以在尾部添加--keystone-user--keystone-group来设置即将运行keystone的用户以及组

配置条目有:

如果token_format=UUID,典型的令牌就是这个样子53f7f6ef0cc344b5be706bcc8b1479e1,如果token_format=PKI,那么令牌会是一个更长文本串:

  1. MIIKtgYJKoZIhvcNAQcCoIIKpzCCCqMCAQExCTAHBgUrDgMCGjCCCY8GCSqGSIb3DQEHAaCCCYAEggl8eyJhY2Nlc3MiOiB7InRva2VuIjogeyJpc3N1ZWRfYXQiOiAiMjAxMy0wNS0zMFQxNTo1MjowNi43MzMxOTgiLCAiZXhwaXJlcyI6ICIyMDEzLTA1LTMxVDE1OjUyOjA2WiIsICJpZCI6ICJwbGFjZWhvbGRlciIsICJ0ZW5hbnQiOiB7ImRlc2NyaXB0aW9uIjogbnVsbCwgImVuYWJsZWQiOiB0cnVlLCAiaWQiOiAiYzJjNTliNGQzZDI4NGQ4ZmEwOWYxNjljYjE4MDBlMDYiLCAibmFtZSI6ICJkZW1vIn19LCAic2VydmljZUNhdGFsb2ciOiBbeyJlbmRwb2ludHMiOiBbeyJhZG1pblVSTCI6ICJodHRwOi8vMTkyLjE2OC4yNy4xMDA6ODc3NC92Mi9jMmM1OWI0ZDNkMjg0ZDhmYTA5ZjE2OWNiMTgwMGUwNiIsICJyZWdpb24iOiAiUmVnaW9uT25lIiwgImludGVybmFsVVJMIjogImh0dHA6Ly8xOTIuMTY4LjI3LjEwMDo4Nzc0L3YyL2MyYzU5YjRkM2QyODRkOGZhMDlmMTY5Y2IxODAwZTA2IiwgImlkIjogIjFmYjMzYmM5M2Y5ODRhNGNhZTk3MmViNzcwOTgzZTJlIiwgInB1YmxpY1VSTCI6ICJodHRwOi8vMTkyLjE2OC4yNy4xMDA6ODc3NC92Mi9jMmM1OWI0ZDNkMjg0ZDhmYTA5ZjE2OWNiMTgwMGUwNiJ9XSwgImVuZHBvaW50c19saW5rcyI6IFtdLCAidHlwZSI6ICJjb21wdXRlIiwgIm5hbWUiOiAibm92YSJ9LCB7ImVuZHBvaW50cyI6IFt7ImFkbWluVVJMIjogImh0dHA6Ly8xOTIuMTY4LjI3LjEwMDozMzMzIiwgInJlZ2lvbiI6ICJSZWdpb25PbmUiLCAiaW50ZXJuYWxVUkwiOiAiaHR0cDovLzE5Mi4xNjguMjcuMTAwOjMzMzMiLCAiaWQiOiAiN2JjMThjYzk1NWFiNDNkYjhmMGU2YWNlNDU4NjZmMzAiLCAicHVibGljVVJMIjogImh0dHA6Ly8xOTIuMTY4LjI3LjEwMDozMzMzIn1dLCAiZW5kcG9pbnRzX2xpbmtzIjogW10sICJ0eXBlIjogInMzIiwgIm5hbWUiOiAiczMifSwgeyJlbmRwb2ludHMiOiBbeyJhZG1pblVSTCI6ICJodHRwOi8vMTkyLjE2OC4yNy4xMDA6OTI5MiIsICJyZWdpb24iOiAiUmVnaW9uT25lIiwgImludGVybmFsVVJMIjogImh0dHA6Ly8xOTIuMTY4LjI3LjEwMDo5MjkyIiwgImlkIjogIjczODQzNTJhNTQ0MjQ1NzVhM2NkOTVkN2E0YzNjZGY1IiwgInB1YmxpY1VSTCI6ICJodHRwOi8vMTkyLjE2OC4yNy4xMDA6OTI5MiJ9XSwgImVuZHBvaW50c19saW5rcyI6IFtdLCAidHlwZSI6ICJpbWFnZSIsICJuYW1lIjogImdsYW5jZSJ9LCB7ImVuZHBvaW50cyI6IFt7ImFkbWluVVJMIjogImh0dHA6Ly8xOTIuMTY4LjI3LjEwMDo4Nzc2L3YxL2MyYzU5YjRkM2QyODRkOGZhMDlmMTY5Y2IxODAwZTA2IiwgInJlZ2lvbiI6ICJSZWdpb25PbmUiLCAiaW50ZXJuYWxVUkwiOiAiaHR0cDovLzE5Mi4xNjguMjcuMTAwOjg3NzYvdjEvYzJjNTliNGQzZDI4NGQ4ZmEwOWYxNjljYjE4MDBlMDYiLCAiaWQiOiAiMzQ3ZWQ2ZThjMjkxNGU1MGFlMmJiNjA2YWQxNDdjNTQiLCAicHVibGljVVJMIjogImh0dHA6Ly8xOTIuMTY4LjI3LjEwMDo4Nzc2L3YxL2MyYzU5YjRkM2QyODRkOGZhMDlmMTY5Y2IxODAwZTA2In1dLCAiZW5kcG9pbnRzX2xpbmtzIjogW10sICJ0eXBlIjogInZvbHVtZSIsICJuYW1lIjogImNpbmRlciJ9LCB7ImVuZHBvaW50cyI6IFt7ImFkbWluVVJMIjogImh0dHA6Ly8xOTIuMTY4LjI3LjEwMDo4NzczL3NlcnZpY2VzL0FkbWluIiwgInJlZ2lvbiI6ICJSZWdpb25PbmUiLCAiaW50ZXJuYWxVUkwiOiAiaHR0cDovLzE5Mi4xNjguMjcuMTAwOjg3NzMvc2VydmljZXMvQ2xvdWQiLCAiaWQiOiAiMmIwZGMyYjNlY2U4NGJjYWE1NDAzMDMzNzI5YzY3MjIiLCAicHVibGljVVJMIjogImh0dHA6Ly8xOTIuMTY4LjI3LjEwMDo4NzczL3NlcnZpY2VzL0Nsb3VkIn1dLCAiZW5kcG9pbnRzX2xpbmtzIjogW10sICJ0eXBlIjogImVjMiIsICJuYW1lIjogImVjMiJ9LCB7ImVuZHBvaW50cyI6IFt7ImFkbWluVVJMIjogImh0dHA6Ly8xOTIuMTY4LjI3LjEwMDozNTM1Ny92Mi4wIiwgInJlZ2lvbiI6ICJSZWdpb25PbmUiLCAiaW50ZXJuYWxVUkwiOiAiaHR0cDovLzE5Mi4xNjguMjcuMTAwOjUwMDAvdjIuMCIsICJpZCI6ICJiNTY2Y2JlZjA2NjQ0ZmY2OWMyOTMxNzY2Yjc5MTIyOSIsICJwdWJsaWNVUkwiOiAiaHR0cDovLzE5Mi4xNjguMjcuMTAwOjUwMDAvdjIuMCJ9XSwgImVuZHBvaW50c19saW5rcyI6IFtdLCAidHlwZSI6ICJpZGVudGl0eSIsICJuYW1lIjogImtleXN0b25lIn1dLCAidXNlciI6IHsidXNlcm5hbWUiOiAiZGVtbyIsICJyb2xlc19saW5rcyI6IFtdLCAiaWQiOiAiZTVhMTM3NGE4YTRmNDI4NWIzYWQ3MzQ1MWU2MDY4YjEiLCAicm9sZXMiOiBbeyJuYW1lIjogImFub3RoZXJyb2xlIn0sIHsibmFtZSI6ICJNZW1iZXIifV0sICJuYW1lIjogImRlbW8ifSwgIm1ldGFkYXRhIjogeyJpc19hZG1pbiI6IDAsICJyb2xlcyI6IFsiYWRiODM3NDVkYzQzNGJhMzk5ODllNjBjOTIzYWZhMjgiLCAiMzM2ZTFiNjE1N2Y3NGFmZGJhNWUwYTYwMWUwNjM5MmYiXX19fTGB-zCB-AIBATBcMFcxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIEwVVbnNldDEOMAwGA1UEBxMFVW5zZXQxDjAMBgNVBAoTBVVuc2V0MRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20CAQEwBwYFKw4DAhowDQYJKoZIhvcNAQEBBQAEgYCAHLpsEs2RnouriuiCgFayIqCssK3SVdhOMINiuJtqv0sE-wBDFiEj-Prcudqlz-n+6q7VgV4mwMPszz39-rwp+P5l4AjrJasUm7FrO-4l02tPLaaZXU1gBQ1jUG5e5aL5jPDP08HbCWuX6wr-QQQBSrWY8lF3HrTcJT23sZIleg==

Sign certificate issued by external CA

用外部CA(发行证书机构)发行签名证书
您可以不用keystone-manage,而用一个外部CA发行的签名证书。然而外部CA发行的证书必须满足以下条件:

当使用外部CA发行的证书时,您不必指定key-sizevalid-days,ca_password,因为这些都会被忽略。
使用外部CA发行的签名证书的基本工作流程:

Request a signing certificate from an external CA

向外部CA请求签名证书的一个途径是先产生一个PKCS#10再使用OpenSSL产生一个证书请求语法(Certificate Request Syntax (CRS) )。
创建一个证书请求配置文件。例如,创建cert_req.conf文件:

  1. [ req ]
  2. default_bits = 1024
  3. default_keyfile = keystonekey.pem
  4. default_md = sha1
  5. prompt = no
  6. distinguished_name = distinguished_name
  7. [ distinguished_name ]
  8. countryName = US
  9. stateOrProvinceName = CA
  10. localityName = Sunnyvale
  11. organizationName = OpenStack
  12. organizationalUnitName = Keystone
  13. commonName = Keystone Signing
  14. emailAddress = keystone@openstack.org

然后使用OpenSSL CLI产生一个CRS。请不要对产生的私钥进行加密,使用-nodes选项。例如

  1. $ openssl req -newkey rsa:1024 -keyout signing_key.pem -keyform PEM \
  2. -out signing_cert_req.pem -outform PEM -config cert_req.conf -nodes

如果一切顺利,您可以得到signing_cert_req.pemsigning_key.pem文件。把signing_cert_req.pem发送到您的CA并请求一个签名证书令牌,需要确保证书为PEM格式。同样也需要确保您信任的CA证书链都是PEM格式的。

Install an external signing certificate

假定您已经有了下列文件:

将上述文件拷贝到您的证书目录,例如:

  1. # mkdir -p /etc/keystone/ssl/certs
  2. # cp signing_cert.pem /etc/keystone/ssl/certs/
  3. # cp signing_key.pem /etc/keystone/ssl/certs/
  4. # cp cacert.pem /etc/keystone/ssl/certs/
  5. # chmod -R 700 /etc/keystone/ssl/certs

Note:确保证书目录只能被root访问。
Note:可以通过更好的方式来拷贝秘钥及证书文件:先运行keystone-managepki_setup,该命令也可以创建其他所需文件例如index.txtserial文件。同样,当拷贝所需文件到另一个服务器以完成复制功能时,目录的所有文件都需要,而不只是密钥和cert文件。

如果您的证书目录路径不是默认的/etc/keystone/ssl/certs,请确保它在配置文件的[signing]节有所反映。

Configure the Identity Service with SSL

您可以通过配置Identity服务来支持双向SSL(security sockets layer)。您必须从外部获得X509证书并进行配置。
Identity服务提供了一组证书样本,放在了examples/pki/certsexamples/pki/private目录下:
证书类型:

Note:对于这些证书,您可以为它们取名。您也可以将公钥/私钥整合进一个文件中。上述这些证书只是起个实例作用。

SSL configuration

为启用SSL客户端验证,修改etc/keystone.conf文件的[ssl]节。下面SSL配置示例采用了(以前的)示例证书:

  1. [ssl]
  2. enable = True
  3. certfile = <path to keystone.pem>
  4. keyfile = <path to keystonekey.pem>
  5. ca_certs = <path to ca.pem>
  6. cert_required = True

Option

External authentication with Identity

当Identity服务运行在apache-httpd上时,您可以使用外部认证方法,它不同于身份存储后端提供的认证。例如,您可以使用结合X509认证、Kerberos(一种安全认证系统)等等的SQL身份后端进行验证,而不用使用用户名与密码。

Use HTTPD authentication

web服务器,如Apache HTTP,支持多种认证方法。Identity服务可允许web服务器进行验证。然后web服务器将认证过的用户通过REMOTE_USER环境变量传给Identity服务。这个用户必须已经存在于Identity服务后端,以便从controller手上获得令牌。为了使用这种方法,Identity服务需运行在apache-httpd上。

Use X.509

下面Apache的配置片段表示是基于从已知CA获得的有效X.509证书来对用户进行认证的。

  1. <VirtualHost _default_:5000>
  2. SSLEngine on
  3. SSLCertificateFile /etc/ssl/certs/ssl.cert
  4. SSLCertificateKeyFile /etc/ssl/private/ssl.key
  5. SSLCACertificatePath /etc/ssl/allowed_cas
  6. SSLCARevocationPath /etc/ssl/allowed_cas
  7. SSLUserName SSL_CLIENT_S_DN_CN
  8. SSLVerifyClient require
  9. SSLVerifyDepth 10
  10. (...)
  11. </VirtualHost>

Integrate Identity with LDAP

Identity服务支持集成已存在的LDAP目录,以用于认证与授权服务。
Important:通过OpenStack Identity来访问LDAP后端,您必须启用在Identity服务器上authlogin_nsswitch_use_ldap这个布尔变量(为真)。为了是该选项在重启后能持续有效:

  1. # setsebool -P authlogin_nsswitch_use_ldap

Note:您可以将Identity和单一LDAP服务器集成起来。
通过配置Identity服务,在/etc/keystone/keystone.conf文件中设置相应选项。

  1. [identity]
  2. #driver = keystone.identity.backends.sql.Identity
  3. driver = keystone.identity.backends.ldap.Identity
  1. [ldap]
  2. url = ldap://localhost
  3. user = dc=Manager,dc=example,dc=org
  4. password = samplepassword
  5. suffix = dc=example,dc=org
  6. use_dumb_member = False
  7. allow_subtree_delete = False
  1. [ldap]
  2. user_tree_dn = ou=Users,dc=example,dc=org
  3. user_objectclass = inetOrgPerson
  4. tenant_tree_dn = ou=Groups,dc=example,dc=org
  5. tenant_objectclass = groupOfNames
  6. role_tree_dn = ou=Roles,dc=example,dc=org
  7. role_objectclass = organizationalRole

Note:这些架构属性是可扩展的,用于兼容不同的架构机制。例如,下面这项映射到Active Directorypeople属性:

  1. user_objectclass = person
  1. [ldap]
  2. user_allow_create = False
  3. user_allow_update = False
  4. user_allow_delete = False
  5. tenant_allow_create = False
  6. tenant_allow_update = False
  7. tenant_allow_delete = False
  8. role_allow_create = False
  9. role_allow_update = False
  10. role_allow_delete = False
  1. # service keystone restart

Warning:在服务重启期间,不能进行认证与授权。

其他LDAP集成设置选项

  1. [ldap]
  2. user_filter = (memberof=cn=openstack-users,ou=workgroups,dc=example,dc=org)
  3. tenant_filter =
  4. role_filter =
  1. [ldap]
  2. user_enabled_attribute = userAccountControl
  3. user_enabled_mask = 2
  4. user_enabled_default = 512

将角色授权与用户认证分开

当您配置好Identity服务并可以使用LDAP后端,您就可以通过Assignments(任命)特性将认证与授权分开处理。
Assignments特性能确保管理员通过Identity服务自身的SQL数据库来管理项目角色授权,并仍然可通过LDAP目录提供用户认证。
为达到这个目的,需配置:

  1. [identity]
  2. driver = keystone.identity.backends.ldap.Identity
  1. [assignment]
  2. driver = keystone.assignment.backends.sql.Assignment

在含有openstack-config的发行版中,您可以运行以下命令来配置上述两个驱动:

  1. # openstack-config --set /etc/keystone/keystone.conf \
  2. identity driver keystone.identity.backends.ldap.Identity
  3. # openstack-config --set /etc/keystone/keystone.conf \
  4. assignment driver keystone.assignment.backends.sql.Assignment

保障Identity服务于LDAP后端连接安全

Identity服务支持用TLS对LDAP传输进行加密。在进行该项配置之前,您需要确认您的证书授权文件的位置(参见Certificates for PKI一节)。
对LDAP流量TLS加密配置:

在含有openstack-config的发行版上,您可以通过下列命令来对LDAP流量进行TLS加密:

  1. # openstack-config --set /etc/keystone/keystone.conf \
  2. ldap use_tls True
  3. # openstack-config --set /etc/keystone/keystone.conf \
  4. ldap tls_cacertfile CA_FILE
  5. # openstack-config --set /etc/keystone/keystone.conf \
  6. ldap tls_req_cert CERT_BEHAVIOR

其中:

Identity服务的令牌绑定配置

令牌绑定是将从外部认证机制,如Kerberos服务器或者X.509证书,获得的信息嵌入进一个令牌。通过令牌绑定,客户端可以通过令牌执行指定的外部认证机制。这个额外的安全机制确保如果一个令牌被盗,没有外部认证的话它没有任何用处。
您可以在keystone.conf文件中为令牌绑定配置认证类型:

  1. [token]
  2. bind = kerberos

或者

  1. [token]
  2. bind = x509

目前支持kerberosX509
为了对令牌绑定执行检查,需将enforce_token_bind选项设置为一下模式之一:

  1. [token]
  2. enforce_token_bind = kerberos
  1. [token]
  2. enforce_token_bind = x509

使用信托

Identity服务管理认证与授权。信托是Identity的扩展,它能通过keystone实现委派(delegation)和扮演(impersonation)。一个信托(trust)定义了以下两者的关系:

信托可允许受托人扮演委托人。出于安全考虑,加了一些安全措施。例如,若委托人失去了一个指定角色,那么该用户使用该角色发出的所有信托及相关令牌,都会被撤销。
委派参数如下:

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注