@qiezhian
2014-12-01T02:56:15.000000Z
字数 20131
阅读 1587
云计算
代号为“keystone”的OpenStack Identity 服务,是OpenStack的默认身份管理系统。您安装完身份服务后,可通过etc/keystone.conf
配置文件,
或者有可能是一个单独的日志配置文件,来对它进行配置。您可通过 keystone
命令行客户端来初始化数据到Identity身份服务中。
身份用户管理的主要组件为:
$ keystone user-create --name alice --pass mypassword123 --email alice@example.com
$ keystone tenant-create --name acme
Note:由于在先前版本中,在compute服务中使用的是名词project
而不是tenant
,所以一些命令行工具使用--project_id
而不是--tenant-id
或者--os-tenant-id
来表示tenant的ID号。
compute-user
的角色:
keystone role-create --name compute-user
Note:如Compute及Image服务这样的个体服务会赋予角色具体意义。在Identity服务中,角色仅仅是一个名字。
Identity服务赋予一个租户及角色给一个用户。您可以将compute-user
角色赋予给在acme
租户中的用户alice
。
$ 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
文件中)指出,对用户创建卷的操作没有任何限制:如果用户在租户内有至少一个角色,那么用户就可以在租户内创建卷。
"volume:create": [],
为了限制在一个特定的租户中拥有compute-user
角色的用户的创建卷操作,您应该像这样一样添加“role:compute-user"
:
"volume:create":["role:compute-user"],
为了限制该角色的所有Compute服务请求,文件应该像这样:
{
"admin_or_owner": [
[
"role:admin"
],
[
"project_id:%(project_id)s"
]
],
"default": [
[
"rule:admin_or_owner"
]
],
"compute:create": [
"role:compute-user"
],
"compute:create:attach_network": [
"role:compute-user"
],
"compute:create:attach_volume": [
"role:compute-user"
],
"compute:get_all": [
"role:compute-user"
],
"compute:unlock_override": [
"rule:admin_api"
],
"admin_api": [
[
"role:admin"
]
],
"compute_extension:accounts": [
[
"rule:admin_api"
]
],
"compute_extension:admin_actions": [
[
"rule:admin_api"
]
],
"compute_extension:admin_actions:pause": [
[
"rule:admin_or_owner"
]
],
"compute_extension:admin_actions:unpause": [
[
"rule:admin_or_owner"
]
],
"compute_extension:admin_actions:suspend": [
[
"rule:admin_or_owner"
]
],
"compute_extension:admin_actions:resume": [
[
"rule:admin_or_owner"
]
],
"compute_extension:admin_actions:lock": [
[
"rule:admin_or_owner"
]
],
"compute_extension:admin_actions:unlock": [
[
"rule:admin_or_owner"
]
],
"compute_extension:admin_actions:resetNetwork": [
[
"rule:admin_api"
]
],
"compute_extension:admin_actions:injectNetworkInfo": [
[
"rule:admin_api"
]
],
"compute_extension:admin_actions:createBackup": [
[
"rule:admin_or_owner"
]
],
"compute_extension:admin_actions:migrateLive": [
[
"rule:admin_api"
]
],
"compute_extension:admin_actions:migrate": [
[
"rule:admin_api"
]
],
"compute_extension:aggregates": [
[
"rule:admin_api"
]
],
"compute_extension:certificates": [
"role:compute-user"
],
"compute_extension:cloudpipe": [
[
"rule:admin_api"
]
],
"compute_extension:console_output": [
"role:compute-user"
],
"compute_extension:consoles": [
"role:compute-user"
],
"compute_extension:createserverext": [
"role:compute-user"
],
"compute_extension:deferred_delete": [
"role:compute-user"
],
"compute_extension:disk_config": [
"role:compute-user"
],
"compute_extension:evacuate": [
[
"rule:admin_api"
]
],
"compute_extension:extended_server_attributes": [
[
"rule:admin_api"
]
],
"compute_extension:extended_status": [
"role:compute-user"
],
"compute_extension:flavorextradata": [
"role:compute-user"
],
"compute_extension:flavorextraspecs": [
"role:compute-user"
],
"compute_extension:flavormanage": [
[
"rule:admin_api"
]
],
"compute_extension:floating_ip_dns": [
"role:compute-user"
],
"compute_extension:floating_ip_pools": [
"role:compute-user"
],
"compute_extension:floating_ips": [
"role:compute-user"
],
"compute_extension:hosts": [
[
"rule:admin_api"
]
],
"compute_extension:keypairs": [
"role:compute-user"
],
"compute_extension:multinic": [
"role:compute-user"
],
"compute_extension:networks": [
[
"rule:admin_api"
]
],
"compute_extension:quotas": [
"role:compute-user"
],
"compute_extension:rescue": [
"role:compute-user"
],
"compute_extension:security_groups": [
"role:compute-user"
],
"compute_extension:server_action_list": [
[
"rule:admin_api"
]
],
"compute_extension:server_diagnostics": [
[
"rule:admin_api"
]
],
"compute_extension:simple_tenant_usage:show": [
[
"rule:admin_or_owner"
]
],
"compute_extension:simple_tenant_usage:list": [
[
"rule:admin_api"
]
],
"compute_extension:users": [
[
"rule:admin_api"
]
],
"compute_extension:virtual_interfaces": [
"role:compute-user"
],
"compute_extension:virtual_storage_arrays": [
"role:compute-user"
],
"compute_extension:volumes": [
"role:compute-user"
],
"compute_extension:volume_attachments:index": [
"role:compute-user"
],
"compute_extension:volume_attachments:show": [
"role:compute-user"
],
"compute_extension:volume_attachments:create": [
"role:compute-user"
],
"compute_extension:volume_attachments:delete": [
"role:compute-user"
],
"compute_extension:volumetypes": [
"role:compute-user"
],
"volume:create": [
"role:compute-user"
],
"volume:get_all": [
"role:compute-user"
],
"volume:get_volume_metadata": [
"role:compute-user"
],
"volume:get_snapshot": [
"role:compute-user"
],
"volume:get_all_snapshots": [
"role:compute-user"
],
"network:get_all_networks": [
"role:compute-user"
],
"network:get_network": [
"role:compute-user"
],
"network:delete_network": [
"role:compute-user"
],
"network:disassociate_network": [
"role:compute-user"
],
"network:get_vifs_by_instance": [
"role:compute-user"
],
"network:allocate_for_instance": [
"role:compute-user"
],
"network:deallocate_for_instance": [
"role:compute-user"
],
"network:validate_networks": [
"role:compute-user"
],
"network:get_instance_uuids_by_ip_filter": [
"role:compute-user"
],
"network:get_floating_ip": [
"role:compute-user"
],
"network:get_floating_ip_pools": [
"role:compute-user"
],
"network:get_floating_ip_by_address": [
"role:compute-user"
],
"network:get_floating_ips_by_project": [
"role:compute-user"
],
"network:get_floating_ips_by_fixed_address": [
"role:compute-user"
],
"network:allocate_floating_ip": [
"role:compute-user"
],
"network:deallocate_floating_ip": [
"role:compute-user"
],
"network:associate_floating_ip": [
"role:compute-user"
],
"network:disassociate_floating_ip": [
"role:compute-user"
],
"network:get_fixed_ip": [
"role:compute-user"
],
"network:add_fixed_ip_to_instance": [
"role:compute-user"
],
"network:remove_fixed_ip_from_instance": [
"role:compute-user"
],
"network:add_network_to_project": [
"role:compute-user"
],
"network:get_instance_nw_info": [
"role:compute-user"
],
"network:get_dns_domains": [
"role:compute-user"
],
"network:add_dns_entry": [
"role:compute-user"
],
"network:modify_dns_entry": [
"role:compute-user"
],
"network:delete_dns_entry": [
"role:compute-user"
],
"network:get_dns_entries_by_address": [
"role:compute-user"
],
"network:get_dns_entries_by_name": [
"role:compute-user"
],
"network:create_private_dns_domain": [
"role:compute-user"
],
"network:create_public_dns_domain": [
"role:compute-user"
],
"network:delete_dns_domain": [
"role:compute-user"
]
}
Identity服务提供identity、token(令牌)、Catalog以及Policy服务。它包含:
keystone-all
.一起启动服务以及管理性APIs来为OpenStack提供Catalog、Authorization以及Authentication服务。Identity服务也维护着用户名与服务的对应关系,例如用户名为nova
的用户之于Compute服务,名为service
之于一种特殊服务租户。
关于如何创建服务及端点,参见OpenStack Admin User Guide
。
一个组是多个用户的集合。管理员可以创建组并向其添加用户。然后将一个角色赋予给一个组,而将一个角色赋予给一个单独用户。每个组都在一个域(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。
一个域为Identity实体的管理定义了管理边界。一个域也许表示了一个个体、或公司或者拥有操作权限的空间。它用来将管理性活动直接暴露给系统用户。
一个域是多个租户、用户以及角色的集合。用户可以被赋予域管理员角色。域管理员也许可以在域内创建租户、用户、组,并将角色赋予给用户和组。
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
的用户以及组
配置条目有:
/etc/keystone/ssl/certs/signing_cert.pem
/etc/keystone/ssl/private/signing_key.pem
/etc/keystone/ssl/certs/ca.pem.
如果token_format=UUID
,典型的令牌就是这个样子53f7f6ef0cc344b5be706bcc8b1479e1
,如果token_format=PKI
,那么令牌会是一个更长文本串:
MIIKtgYJKoZIhvcNAQcCoIIKpzCCCqMCAQExCTAHBgUrDgMCGjCCCY8GCSqGSIb3DQEHAaCCCYAEggl8eyJhY2Nlc3MiOiB7InRva2VuIjogeyJpc3N1ZWRfYXQiOiAiMjAxMy0wNS0zMFQxNTo1MjowNi43MzMxOTgiLCAiZXhwaXJlcyI6ICIyMDEzLTA1LTMxVDE1OjUyOjA2WiIsICJpZCI6ICJwbGFjZWhvbGRlciIsICJ0ZW5hbnQiOiB7ImRlc2NyaXB0aW9uIjogbnVsbCwgImVuYWJsZWQiOiB0cnVlLCAiaWQiOiAiYzJjNTliNGQzZDI4NGQ4ZmEwOWYxNjljYjE4MDBlMDYiLCAibmFtZSI6ICJkZW1vIn19LCAic2VydmljZUNhdGFsb2ciOiBbeyJlbmRwb2ludHMiOiBbeyJhZG1pblVSTCI6ICJodHRwOi8vMTkyLjE2OC4yNy4xMDA6ODc3NC92Mi9jMmM1OWI0ZDNkMjg0ZDhmYTA5ZjE2OWNiMTgwMGUwNiIsICJyZWdpb24iOiAiUmVnaW9uT25lIiwgImludGVybmFsVVJMIjogImh0dHA6Ly8xOTIuMTY4LjI3LjEwMDo4Nzc0L3YyL2MyYzU5YjRkM2QyODRkOGZhMDlmMTY5Y2IxODAwZTA2IiwgImlkIjogIjFmYjMzYmM5M2Y5ODRhNGNhZTk3MmViNzcwOTgzZTJlIiwgInB1YmxpY1VSTCI6ICJodHRwOi8vMTkyLjE2OC4yNy4xMDA6ODc3NC92Mi9jMmM1OWI0ZDNkMjg0ZDhmYTA5ZjE2OWNiMTgwMGUwNiJ9XSwgImVuZHBvaW50c19saW5rcyI6IFtdLCAidHlwZSI6ICJjb21wdXRlIiwgIm5hbWUiOiAibm92YSJ9LCB7ImVuZHBvaW50cyI6IFt7ImFkbWluVVJMIjogImh0dHA6Ly8xOTIuMTY4LjI3LjEwMDozMzMzIiwgInJlZ2lvbiI6ICJSZWdpb25PbmUiLCAiaW50ZXJuYWxVUkwiOiAiaHR0cDovLzE5Mi4xNjguMjcuMTAwOjMzMzMiLCAiaWQiOiAiN2JjMThjYzk1NWFiNDNkYjhmMGU2YWNlNDU4NjZmMzAiLCAicHVibGljVVJMIjogImh0dHA6Ly8xOTIuMTY4LjI3LjEwMDozMzMzIn1dLCAiZW5kcG9pbnRzX2xpbmtzIjogW10sICJ0eXBlIjogInMzIiwgIm5hbWUiOiAiczMifSwgeyJlbmRwb2ludHMiOiBbeyJhZG1pblVSTCI6ICJodHRwOi8vMTkyLjE2OC4yNy4xMDA6OTI5MiIsICJyZWdpb24iOiAiUmVnaW9uT25lIiwgImludGVybmFsVVJMIjogImh0dHA6Ly8xOTIuMTY4LjI3LjEwMDo5MjkyIiwgImlkIjogIjczODQzNTJhNTQ0MjQ1NzVhM2NkOTVkN2E0YzNjZGY1IiwgInB1YmxpY1VSTCI6ICJodHRwOi8vMTkyLjE2OC4yNy4xMDA6OTI5MiJ9XSwgImVuZHBvaW50c19saW5rcyI6IFtdLCAidHlwZSI6ICJpbWFnZSIsICJuYW1lIjogImdsYW5jZSJ9LCB7ImVuZHBvaW50cyI6IFt7ImFkbWluVVJMIjogImh0dHA6Ly8xOTIuMTY4LjI3LjEwMDo4Nzc2L3YxL2MyYzU5YjRkM2QyODRkOGZhMDlmMTY5Y2IxODAwZTA2IiwgInJlZ2lvbiI6ICJSZWdpb25PbmUiLCAiaW50ZXJuYWxVUkwiOiAiaHR0cDovLzE5Mi4xNjguMjcuMTAwOjg3NzYvdjEvYzJjNTliNGQzZDI4NGQ4ZmEwOWYxNjljYjE4MDBlMDYiLCAiaWQiOiAiMzQ3ZWQ2ZThjMjkxNGU1MGFlMmJiNjA2YWQxNDdjNTQiLCAicHVibGljVVJMIjogImh0dHA6Ly8xOTIuMTY4LjI3LjEwMDo4Nzc2L3YxL2MyYzU5YjRkM2QyODRkOGZhMDlmMTY5Y2IxODAwZTA2In1dLCAiZW5kcG9pbnRzX2xpbmtzIjogW10sICJ0eXBlIjogInZvbHVtZSIsICJuYW1lIjogImNpbmRlciJ9LCB7ImVuZHBvaW50cyI6IFt7ImFkbWluVVJMIjogImh0dHA6Ly8xOTIuMTY4LjI3LjEwMDo4NzczL3NlcnZpY2VzL0FkbWluIiwgInJlZ2lvbiI6ICJSZWdpb25PbmUiLCAiaW50ZXJuYWxVUkwiOiAiaHR0cDovLzE5Mi4xNjguMjcuMTAwOjg3NzMvc2VydmljZXMvQ2xvdWQiLCAiaWQiOiAiMmIwZGMyYjNlY2U4NGJjYWE1NDAzMDMzNzI5YzY3MjIiLCAicHVibGljVVJMIjogImh0dHA6Ly8xOTIuMTY4LjI3LjEwMDo4NzczL3NlcnZpY2VzL0Nsb3VkIn1dLCAiZW5kcG9pbnRzX2xpbmtzIjogW10sICJ0eXBlIjogImVjMiIsICJuYW1lIjogImVjMiJ9LCB7ImVuZHBvaW50cyI6IFt7ImFkbWluVVJMIjogImh0dHA6Ly8xOTIuMTY4LjI3LjEwMDozNTM1Ny92Mi4wIiwgInJlZ2lvbiI6ICJSZWdpb25PbmUiLCAiaW50ZXJuYWxVUkwiOiAiaHR0cDovLzE5Mi4xNjguMjcuMTAwOjUwMDAvdjIuMCIsICJpZCI6ICJiNTY2Y2JlZjA2NjQ0ZmY2OWMyOTMxNzY2Yjc5MTIyOSIsICJwdWJsaWNVUkwiOiAiaHR0cDovLzE5Mi4xNjguMjcuMTAwOjUwMDAvdjIuMCJ9XSwgImVuZHBvaW50c19saW5rcyI6IFtdLCAidHlwZSI6ICJpZGVudGl0eSIsICJuYW1lIjogImtleXN0b25lIn1dLCAidXNlciI6IHsidXNlcm5hbWUiOiAiZGVtbyIsICJyb2xlc19saW5rcyI6IFtdLCAiaWQiOiAiZTVhMTM3NGE4YTRmNDI4NWIzYWQ3MzQ1MWU2MDY4YjEiLCAicm9sZXMiOiBbeyJuYW1lIjogImFub3RoZXJyb2xlIn0sIHsibmFtZSI6ICJNZW1iZXIifV0sICJuYW1lIjogImRlbW8ifSwgIm1ldGFkYXRhIjogeyJpc19hZG1pbiI6IDAsICJyb2xlcyI6IFsiYWRiODM3NDVkYzQzNGJhMzk5ODllNjBjOTIzYWZhMjgiLCAiMzM2ZTFiNjE1N2Y3NGFmZGJhNWUwYTYwMWUwNjM5MmYiXX19fTGB-zCB-AIBATBcMFcxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIEwVVbnNldDEOMAwGA1UEBxMFVW5zZXQxDjAMBgNVBAoTBVVuc2V0MRgwFgYDVQQDEw93d3cuZXhhbXBsZS5jb20CAQEwBwYFKw4DAhowDQYJKoZIhvcNAQEBBQAEgYCAHLpsEs2RnouriuiCgFayIqCssK3SVdhOMINiuJtqv0sE-wBDFiEj-Prcudqlz-n+6q7VgV4mwMPszz39-rwp+P5l4AjrJasUm7FrO-4l02tPLaaZXU1gBQ1jUG5e5aL5jPDP08HbCWuX6wr-QQQBSrWY8lF3HrTcJT23sZIleg==
用外部CA(发行证书机构)发行签名证书
您可以不用keystone-manage
,而用一个外部CA发行的签名证书。然而外部CA发行的证书必须满足以下条件:
当使用外部CA发行的证书时,您不必指定key-size
,valid-days
,ca_password
,因为这些都会被忽略。
使用外部CA发行的签名证书的基本工作流程:
向外部CA请求签名证书的一个途径是先产生一个PKCS#10再使用OpenSSL产生一个证书请求语法(Certificate Request Syntax (CRS) )。
创建一个证书请求配置文件。例如,创建cert_req.conf
文件:
[ req ]
default_bits = 1024
default_keyfile = keystonekey.pem
default_md = sha1
prompt = no
distinguished_name = distinguished_name
[ distinguished_name ]
countryName = US
stateOrProvinceName = CA
localityName = Sunnyvale
organizationName = OpenStack
organizationalUnitName = Keystone
commonName = Keystone Signing
emailAddress = keystone@openstack.org
然后使用OpenSSL CLI产生一个CRS。请不要对产生的私钥进行加密,使用-nodes
选项。例如
$ openssl req -newkey rsa:1024 -keyout signing_key.pem -keyform PEM \
-out signing_cert_req.pem -outform PEM -config cert_req.conf -nodes
如果一切顺利,您可以得到signing_cert_req.pem
和signing_key.pem
文件。把signing_cert_req.pem
发送到您的CA并请求一个签名证书令牌,需要确保证书为PEM格式。同样也需要确保您信任的CA证书链都是PEM格式的。
假定您已经有了下列文件:
signing_cert.pem
signing_key.pem
cacert.pem
将上述文件拷贝到您的证书目录,例如:
# mkdir -p /etc/keystone/ssl/certs
# cp signing_cert.pem /etc/keystone/ssl/certs/
# cp signing_key.pem /etc/keystone/ssl/certs/
# cp cacert.pem /etc/keystone/ssl/certs/
# chmod -R 700 /etc/keystone/ssl/certs
Note:确保证书目录只能被root访问。
Note:可以通过更好的方式来拷贝秘钥及证书文件:先运行keystone-managepki_setup
,该命令也可以创建其他所需文件例如index.txt
及serial
文件。同样,当拷贝所需文件到另一个服务器以完成复制功能时,目录的所有文件都需要,而不只是密钥和cert
文件。
如果您的证书目录路径不是默认的/etc/keystone/ssl/certs
,请确保它在配置文件的[signing]
节有所反映。
您可以通过配置Identity服务来支持双向SSL(security sockets layer)。您必须从外部获得X509证书并进行配置。
Identity服务提供了一组证书样本,放在了examples/pki/certs
和examples/pki/private
目录下:
证书类型:
cacert.pem
ssl_cert.pem
middleware.pem
cakey.pem
Note:对于这些证书,您可以为它们取名。您也可以将公钥/私钥整合进一个文件中。上述这些证书只是起个实例作用。
为启用SSL客户端验证,修改etc/keystone.conf
文件的[ssl]
节。下面SSL配置示例采用了(以前的)示例证书:
[ssl]
enable = True
certfile = <path to keystone.pem>
keyfile = <path to keystonekey.pem>
ca_certs = <path to ca.pem>
cert_required = True
Option
enable
True
表示启动SSL,默认是false
。certfile
keyfile
certfile
中,那keyfile
可忽略。ca_certs
cert_required
False
。当Identity服务运行在apache-httpd
上时,您可以使用外部认证方法,它不同于身份存储后端提供的认证。例如,您可以使用结合X509认证、Kerberos(一种安全认证系统)等等的SQL身份后端进行验证,而不用使用用户名与密码。
web服务器,如Apache HTTP,支持多种认证方法。Identity服务可允许web服务器进行验证。然后web服务器将认证过的用户通过REMOTE_USER
环境变量传给Identity服务。这个用户必须已经存在于Identity服务后端,以便从controller手上获得令牌。为了使用这种方法,Identity服务需运行在apache-httpd
上。
下面Apache的配置片段表示是基于从已知CA获得的有效X.509证书来对用户进行认证的。
<VirtualHost _default_:5000>
SSLEngine on
SSLCertificateFile /etc/ssl/certs/ssl.cert
SSLCertificateKeyFile /etc/ssl/private/ssl.key
SSLCACertificatePath /etc/ssl/allowed_cas
SSLCARevocationPath /etc/ssl/allowed_cas
SSLUserName SSL_CLIENT_S_DN_CN
SSLVerifyClient require
SSLVerifyDepth 10
(...)
</VirtualHost>
Identity服务支持集成已存在的LDAP目录,以用于认证与授权服务。
Important:通过OpenStack Identity来访问LDAP后端,您必须启用在Identity服务器上authlogin_nsswitch_use_ldap
这个布尔变量(为真)。为了是该选项在重启后能持续有效:
# setsebool -P authlogin_nsswitch_use_ldap
Note:您可以将Identity和单一LDAP服务器集成起来。
通过配置Identity服务,在/etc/keystone/keystone.conf
文件中设置相应选项。
keystone.conf
文件中启用LDAP驱动
[identity]
#driver = keystone.identity.backends.sql.Identity
driver = keystone.identity.backends.ldap.Identity
keystone.conf
文件中定义LDAP目标服务器
[ldap]
url = ldap://localhost
user = dc=Manager,dc=example,dc=org
password = samplepassword
suffix = dc=example,dc=org
use_dumb_member = False
allow_subtree_delete = False
keystone.conf
文件中,在LDAP目录中创建组织性单元(OU)并定义它们相应位置
[ldap]
user_tree_dn = ou=Users,dc=example,dc=org
user_objectclass = inetOrgPerson
tenant_tree_dn = ou=Groups,dc=example,dc=org
tenant_objectclass = groupOfNames
role_tree_dn = ou=Roles,dc=example,dc=org
role_objectclass = organizationalRole
Note:这些架构属性是可扩展的,用于兼容不同的架构机制。例如,下面这项映射到Active Directory
的people
属性:
user_objectclass = person
keystone.conf
文件中的对象类型的:
[ldap]
user_allow_create = False
user_allow_update = False
user_allow_delete = False
tenant_allow_create = False
tenant_allow_update = False
tenant_allow_delete = False
role_allow_create = False
role_allow_update = False
role_allow_delete = False
# service keystone restart
Warning:在服务重启期间,不能进行认证与授权。
其他LDAP集成设置选项
[ldap]
user_filter = (memberof=cn=openstack-users,ou=workgroups,dc=example,dc=org)
tenant_filter =
role_filter =
user_filter
滤掉。 keystone.conf
文件中对Active Directory
账户状态属性进行掩膜处理:
[ldap]
user_enabled_attribute = userAccountControl
user_enabled_mask = 2
user_enabled_default = 512
当您配置好Identity服务并可以使用LDAP后端,您就可以通过Assignments
(任命)特性将认证与授权分开处理。
Assignments特性能确保管理员通过Identity服务自身的SQL数据库来管理项目角色授权,并仍然可通过LDAP目录提供用户认证。
为达到这个目的,需配置:
/etc/keystone/keystone.conf
配置文件中[identity]
节。然后,将驱动配置键设置为keystone.identity.backends.ldap.Identity:
[identity]
driver = keystone.identity.backends.ldap.Identity
/etc/keystone/keystone.conf
配置文件中[assignment]
节,然后将驱动配置键设置为keystone.identity.backends.sql.Assignment:
[assignment]
driver = keystone.assignment.backends.sql.Assignment
在含有openstack-config
的发行版中,您可以运行以下命令来配置上述两个驱动:
# openstack-config --set /etc/keystone/keystone.conf \
identity driver keystone.identity.backends.ldap.Identity
# openstack-config --set /etc/keystone/keystone.conf \
assignment driver keystone.assignment.backends.sql.Assignment
Identity服务支持用TLS对LDAP传输进行加密。在进行该项配置之前,您需要确认您的证书授权文件的位置(参见Certificates for PKI
一节)。
对LDAP流量TLS加密配置:
/etc/keystone/keystone.conf
配置文件ldap
节use_tls
配置键设为True
,这样就启用了TLStls_cacertfile
配置键设置为证书授权文件的路径。您也可以将tls_cacertdir
配置键设置为包含所有证书颁发机构文件的目录。如果tls_cacertfile
和tls_cacertdir
都进行了配置,那么tls_cacertdir
会被忽略。[ldap]
节的tls_req_cert
配置键设置为demand
、allow
或者never
: demand
:总是需要从LDAP服务器请求证书。会话会因没有提供证书,或者证书不能被已存在的证书颁发机构文件验证而终止。 allow
:总是会从LDAP服务器请求证书。就算没有提供证书,会话也会继续。但如果提供了证书但是却不能为已存在的证书颁发机构文件所验证,那么证书会被忽略而会话仍然继续。 never
:无需请求证书。在含有openstack-config
的发行版上,您可以通过下列命令来对LDAP流量进行TLS加密:
# openstack-config --set /etc/keystone/keystone.conf \
ldap use_tls True
# openstack-config --set /etc/keystone/keystone.conf \
ldap tls_cacertfile CA_FILE
# openstack-config --set /etc/keystone/keystone.conf \
ldap tls_req_cert CERT_BEHAVIOR
其中:
CA_FILE
是用来加密LDAP流量的证书颁发机构文件的绝对路径。CERT_BEHAVIOR
则指定了对来自LDAP服务器的TLS会话执行客户端证书检查的类型(demand
、allow
或者never
)。令牌绑定是将从外部认证机制,如Kerberos
服务器或者X.509
证书,获得的信息嵌入进一个令牌。通过令牌绑定,客户端可以通过令牌执行指定的外部认证机制。这个额外的安全机制确保如果一个令牌被盗,没有外部认证的话它没有任何用处。
您可以在keystone.conf
文件中为令牌绑定配置认证类型:
[token]
bind = kerberos
或者
[token]
bind = x509
目前支持kerberos
和X509
。
为了对令牌绑定执行检查,需将enforce_token_bind
选项设置为一下模式之一:
disable
permissive
strict
required
kerberos
kerberos
认证机制。
[token]
enforce_token_bind = kerberos
x509
x.509
认证机制。
[token]
enforce_token_bind = x509
Identity服务管理认证与授权。信托是Identity的扩展,它能通过keystone
实现委派(delegation)和扮演(impersonation)。一个信托(trust)定义了以下两者的关系:
信托可允许受托人扮演委托人。出于安全考虑,加了一些安全措施。例如,若委托人失去了一个指定角色,那么该用户使用该角色发出的所有信托及相关令牌,都会被撤销。
委派参数如下:
0
:该委托不能再委派权限 1
:该委托可将权限委派给任何委托组,但后者不能继续委托 inf
:该委托可以无限递归(委托)all_endpoints
,它允许与委托租户相关的所有端点都可以使用信托。