fabian 2019-06-29
keystone主要为了实现以下关键功能:
keystone中的一些基本概念简介
可使用OpenStack云服务的个人、系统或服务的数字化形象。(Digital representation of a person, system, or service who uses OpenStack cloud services. )
用于确认用户身份的数据。
确认一个用户身份的认证过程。
一段字母和数字组成的文本,用于访问OpenStack 的API和资源。
一个用来分组或隔离资源的集合。租户还可以用来分组或隔离认证对象。根据不同的服务操作者,一个租户可以对应一个顾客、一个账户、一个组织或一个项目。(A container used to group or isolate resources. Tenants also group or isolate identity objects. Depending on the service operator, a tenant may map to a customer, account, organization, or project.)
OpenStack的服务,用于Compute(nova),Object Storage(swift)或Image Service(glance)等。它为用户访问资源,实施运作提供了一个或多个端点(endpoint)。
一个可以通过网络来访问服务的地址,通常是一个URL地址。
一种定义好的拥有施行特定操作的权限的个人特征。
一种用于OpenStack认证API的命令行交互界面。
keystone服务安装在controller节点上。
使用root身份进入数据库(密码为安装数据库步骤时设立的):$ mysql -u root -p
进入数据库界面后创建属于keystone的数据库:
<pre>CREATE DATABASE keystone;</pre>
把keystone数据库的访问权限赋予名为keystone,来自任何主机地址的用户,并设定访问密码为KEYSTONE_DBPASS(替换为合适的密码):
<pre>GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'KEYSTONE_DBPASS';<br>GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'KEYSTONE_DBPASS';</pre>
可以把KEYSTONE_DBPASS变更为合适的密码。
退出数据库客户端。
# apt-get install keystone python-keystoneclient
# vi /etc/keystone/keystone.conf文件:[DEFAULT]部分,定义initial administration token:[DEFAULT]<br>...<br>admin_token = ADMIN_TOKEN</pre>其中替换ADMIN_TOKEN为合适的值,可以通过# openssl rand -hex 10来生成。
继续在[DEFAULT]部分开启“输出详细记录日志”的选项:
<pre>[DEFAULT]<br>...<br>verbose = True</pre>
在[database]部分,设定数据库访问选项:
<pre>[database]<br>...<br>connection = mysql://keystone:KEYSTONE_DBPASS@controller/keystone</pre>
把KEYSTONE_DBPASS替换为创建keystone数据库时所授权的密码。配置默认使用SQL的数据库连接,需要注释掉或删除。
在[token]部分,配置UUID token provider和SQL driver:
<pre>[token]<br>...<br>provider = keystone.token.providers.uuid.Provider<br>driver = keystone.token.persistence.backends.sql.Token</pre>
在[revoke]部分,配置SQL revocation driver:
<pre>[revoke]<br>...<br>driver = keystone.contrib.revoke.backends.sql.Revoke</pre>
同步认证服务数据库:
# keystone-manage db_sync
重启认证服务:# service keystone restart
默认Ubuntu会产生SQLite数据库,可以将其删除:# rm -f /var/lib/keystone/keystone.db
默认情况下,认证服务会无限量地存储过期的token,这将导致数据库占用空间大幅度增加而且会降低认证服务的性能,用以下命令可以定期清除过期的token:
<pre># (crontab -l -u keystone 2>&1 | grep -q token_flush) || \<br>echo '@hourly /usr/bin/keystone-manage token_flush >/var/log/keystone/keystone-tokenflush.log 2>&1' \
/var/spool/cron/crontabs/keystone</pre>
在使用keystone命令操作前,需要先使用临时的administration token(即在/etc/keystone/keystone.conf文件中设定的ADMIN_TOKEN),并手动配置认证服务的地址(endpoint)。
将administration token写入环境变量:$ export OS_SERVICE_TOKEN=ADMIN_TOKEN
将endpoint写入环境变量:$ export OS_SERVICE_ENDPOINT=<a href="http://controller" rel="nofollow noreferrer">http://controller</a>:35357/v2.0
创建admin租户:
<pre>$ keystone tenant-create --name admin --description "Admin Tenant"
| Property | Value | 
|---|---|
| description | Admin Tenant | 
| enabled | True | 
| id | e8cda8def37b4d32b765759f1faa5ed2 | 
| name | admin | 
</pre>
创建admin用户:
| <pre> $ keystone user-create --name admin --pass ADMIN_PASS --email EMAIL_ADDRESS | |
|---|---|
| Property | Value | 
| [email protected] | |
| enabled | True | 
| id | 13b460ca8d9e4aa094e8f4f4fff6f087 | 
| name | admin | 
| username | admin | 
+----------+----------------------------------+</pre>
  用合适的密码代替ADMIN_PASS。
创建admin角色:
| <pre> $ keystone role-create --name admin | |
|---|---|
| Property | Value | 
| id | 2bf07853b40b420eb9e9e2aa23ff3e9e | 
| name | admin | 
+----------+----------------------------------+</pre>
将admin角色赋予给admin租户和admin用户。$ keystone user-role-add --user admin --tenant admin --role admin
  这条命令不会产生输出显示。
创建demo租户:
<pre>$ keystone tenant-create --name demo --description "Demo Tenant"
| Property | Value | 
|---|---|
| description | Demo Tenant | 
| enabled | True | 
| id | ef5783a270d84bb880a2c6fb85eac651 | 
| name | demo | 
+-------------+----------------------------------+</pre>
创建属于demo租户的demo用户
| <pre> keystone user-create --name demo --tenant demo --pass DEMO_PASS --email EMAIL_ADDRESS | |
|---|---|
| Property | Value | 
| [email protected] | |
| enabled | True | 
| id | 2a6e8190e26c4f27ba98171235a8b219 | 
| name | demo | 
| tenantId | ef5783a270d84bb880a2c6fb85eac651 | 
| username | demo | 
+----------+----------------------------------+</pre>
  用合适的密码代替DEMO_PASS
OpenStack的服务都需要被赋予租户,用户和角色的性质来与其他服务进行交互。每个服务都需要创建一个或多个独立的用户,这个用户被赋予admin角色,并且属于service租户下。
创建service租户:
| <pre> $ keystone tenant-create --name service --description "Service Tenant" | |
|---|---|
| Property | Value | 
| description | Service Tenant | 
| enabled | True | 
| id | e4288b01bc084a29ad6133f882a58732 | 
| name | service | 
+-------------+----------------------------------+</pre>
具体操作如上一步骤所述。
创建认证服务的服务实体:
<pre>$ keystone service-create --name keystone --type identity \
| --description "OpenStack Identity" | |
|---|---|
| Property | Value | 
| description | OpenStack Identity | 
| enabled | True | 
| id | d7bbd538857b4caa9f7f9730a74b98ca | 
| name | keystone | 
| type | identity | 
+-------------+----------------------------------+</pre>
创建认证服务的API端点:
<pre>$ keystone endpoint-create \
--service-id $(keystone service-list | awk '/ identity / {print $2}') \
--publicurl http://controller:5000/v2.0 \
--internalurl http://controller:5000/v2.0 \
--adminurl http://controller:35357/v2.0 \
| --region regionOne | |
|---|---|
| Property | Value | 
| adminurl | http://controller:35357/v2.0 | 
| id | 32fb8b8934024c30bd1f0b7795a51220 | 
| internalurl | http://controller:5000/v2.0 | 
| publicurl | http://controller:5000/v2.0 | 
| region | regionOne | 
| service_id | d7bbd538857b4caa9f7f9730a74b98ca | 
+-------------+----------------------------------+</pre>
$ unset OS_SERVICE_TOKEN OS_SERVICE_ENDPOINT
admin租户和用户的身份,请求一条authentication token:$ keystone --os-tenant-name admin --os-username admin --os-password ADMIN_PASS \| --os-auth-url http://controller:35357/v2.0 token-get | |
|---|---|
| Property | Value | 
| expires | 2015-11-24T12:37:45Z | 
| id | 1d5ebdf4e60a4f648240a20a65cbf96e | 
| tenant_id | 4f7806287c9a437e9cd912504ff71727 | 
| user_id | fd151acb7cc34bba8d4d9cf391ad0d06 | 
+-----------+----------------------------------+</pre>
ADMIN_PASS为之前设定的admin用户密码。
admin租户和用户的身份,列出租户清单:$ keystone --os-tenant-name admin --os-username admin --os-password ADMIN_PASS \| --os-auth-url http://controller:35357/v2.0 tenant-list | ||
|---|---|---|
| id | name | enabled | 
| 4f7806287c9a437e9cd912504ff71727 | admin | True | 
| d1f7caccc65840b68258997a759da07f | demo | True | 
| 5ab4d5c513f543cfbf8e3be97f5df5fb | service | True | 
+----------------------------------+---------+---------+</pre>
ADMIN_PASS为之前设定的admin用户密码。
admin租户和用户的身份,列出用户清单:$ keystone --os-tenant-name admin --os-username admin --os-password ADMIN_PASS \| --os-auth-url http://controller:35357/v2.0 user-list | |||
|---|---|---|---|
| id | name | enabled | |
| fd151acb7cc34bba8d4d9cf391ad0d06 | admin | True | [email protected] | 
| 812116bcca5b4a01981669fcef09ee11 | demo | True | [email protected] | 
+----------------------------------+-------+---------+-------------------+</pre>
ADMIN_PASS为之前设定的admin用户密码。
admin租户和用户的身份,列出角色清单:$ keystone --os-tenant-name admin --os-username admin --os-password ADMIN_PASS \| --os-auth-url http://controller:35357/v2.0 role-list | |
|---|---|
| id | name | 
| 9fe2ff9ee4384b1894a90878d3e92bab | member | 
| 61286483662e40ba8f0a48b05fc8a451 | admin | 
+----------------------------------+----------+</pre>
ADMIN_PASS为之前设定的admin用户密码。其中_member_的来历如下,在创建用户时:Using the --tenant option automatically assigns the member role to a user. This option will also create the member role if it does not exist.(创建时使用的命令为keystone user-create --name demo --tenant demo --pass DEMO_PASS --email EMAIL_ADDRESS)
demo租户和用户的身份,请求一条authentication token:$ keystone --os-tenant-name demo --os-username demo --os-password DEMO_PASS \| --os-auth-url http://controller:35357/v2.0 token-get | |
|---|---|
| Property | Value | 
| expires | 2015-11-24T13:06:04Z | 
| id | 9eca8d1dff374c2da6f358e85f0b60af | 
| tenant_id | d1f7caccc65840b68258997a759da07f | 
| user_id | 812116bcca5b4a01981669fcef09ee11 | 
+-----------+----------------------------------+</pre>
DEMO_PASS为之前设定的demo用户密码。
demo租户和用户的身份,验证无法执行admin专属命令:$ keystone --os-tenant-name demo --os-username demo --os-password DEMO_PASS \--os-auth-url http://controller:35357/v2.0 user-list
You are not authorized to perform the requested action: admin_required (HTTP 403)</pre>
admin-openrc.sh,并输入以下内容:export OS_TENANT_NAME=adminexport OS_USERNAME=admin
export OS_PASSWORD=ADMIN_PASS
export OS_AUTH_URL=http://controller:35357/v2.0</pre>
ADMIN_PASS为之前设定的admin用户密码。
demo-openrc.sh,并输入以下内容:export OS_TENANT_NAME=demoexport OS_USERNAME=demo
export OS_PASSWORD=DEMO_PASS
export OS_AUTH_URL=http://controller:5000/v2.0</pre>
DEMO_PASS为之前设定的demo用户密码。
注:端口35357是为拥有管理权限的操作准备的,端口5000是为普通用户操作准备的。
根据不同租户和用户,执行$ source admin-openrc.sh</code>或<code>$ source demo-openrc.sh。
安装完keystone后,创建"Admin Tenant"时出现“Unable to establish connection to http://controller:35357/v2.0/tenants”的错误,可能是安装keystone时未完整安装,重新安装并更新。在验证步骤时出现(HTTP 401),有可能是密码等配置错误,导致访问权限受限,重新检查配置文件和各个用户的密码情况。