一、简介
Keystone(OpenStack Identity Service)是 OpenStack 框架中负责管理身份验证、服务规则和服务令牌功能的模块。用户访问资源需要验证用户的身份与权限,服务执行操作也需要进行权限检测,这些都需要通过 Keystone 来处理。
Keystone提供3A(Account, Authentication, Authoriz
ation)服务,
无论是dashboard还是client API都需要先通过keystone的认证后才可以获取Openstack服务列表。
Keystone 中主要涉及到如下几个概念:
1、用户(user):顾名思义就是使用服务的用户,可以是人、服务或者是系统,只要是使用了 Openstack 服务的对象都可以称为用户。
2、租户(tenant):租户,可以理解为一个人、项目或者组织拥有的资源的合集。在一个租户中可以拥有很多个用户,这些用户可以根据权限的划分使用租户中的资源。Keystone V3中将 tenant 改称为了Project。
3、角色(role):角色,用于分配操作的权限。角色可以被指定给用户,使得该用户获得角色对应的操作权限
4、令牌(token):指的是一串比特值或者字符串,用来作为访问资源的记号。Token 中含有可访问资源的范围和有效时间。
服务目录部件(Service Catalog)提供了一套REST API服务端点列表并以此作为决策参考,主要包含以下几个概念:
1、服务(service):一个OpenStack服务,例如Nova、Swift、Glance或Keystone。一个服务可以拥有一个或多个端点,用户可以通过它与OpenStack的服务或资源进行交互。
2、端点(endpoint):一个可以通过网络访问的地址(例如一个URL),代表了OpenStack服务的API入口。端点也可以分组为模板,每个模板代表一组可用的OpenStack服务,这些服务是跨区域(regions)可用的,例如将多个Swift Proxy Server分别配置为不同的域(regionOne、regionTwo等)。
3、模板(Template):一个端点集合,代表一组可用的OpenStack服务端点。
二、认证流程:
1.用户(user)提供自己的用户名称及用户身份凭证(Crenditial,如密码);
2.keystone验证用户(user)的身份(Crenditial);
3.认证成功后,keystone会给用户分配一个令牌(token),用户在访问其他Openstack服务时,仅需亮出令牌即可。
下图是从官网截取的具体认证流程图,以供参考:
三、安装和配置
1、首先数据库授权:
# mysql -u root -p > CREATE DATABASE keystone; > GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'mypasswd'; > GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'mypasswd'; > EXIT
2、用openssl生成一个随机数值作为用做后面的token:
$ openssl rand -hex 10 ba48c69ef1612f3b8569
3、安装
# yum install openstack-keystone httpd mod_wsgi python-openstackclient memcached python-memcached # systemctl enable memcached.service # systemctl start memcached.service
4、配置
修改配置文件:
>>>> /etc/keystone/keystone.conf [DEFAULT] ... admin_token = ba48c69ef1612f3b8569 # 注意该信息,admin_token参数是用来访问Keystone服务的,即Keystone服务的Token。我们用刚才生成的随机数替换。客户端可以使用该Token访问Keystone服务、查看信息、创建其他服务等 verbose = True # 启用verbose logging,方便troubleshooting [database] ... connection = mysql://keystone:[email protected]/keystone # 此处为数据库参数,指定数据库文件的存放位置,其中10.13.25.11为数据库地址,第一个keystone为用户名,mypasswd为访问密码,第二个keystone为数据库名称。 [memcache] ... servers = localhost:11211 [token] ... provider = keystone.token.providers.uuid.Provider driver = keystone.token.persistence.backends.memcache.Token [revoke] ... driver = keystone.contrib.revoke.backends.sql.Revoke
Populate the Identity service database:
# su -s /bin/sh -c "keystone-manage db_sync" keystone
配置Apache服务:
# vim /etc/httpd/conf/httpd.conf ServerName controller
# vim /etc/httpd/conf.d/wsgi-keystone.conf Listen 5000 Listen 35357 <VirtualHost *:5000> WSGIDaemonProcess keystone-public processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP} WSGIProcessGroup keystone-public WSGIScriptAlias / /var/www/cgi-bin/keystone/main WSGIApplicationGroup %{GLOBAL} WSGIPassAuthorization On LogLevel info ErrorLogFormat "%{cu}t %M" ErrorLog /var/log/httpd/keystone-error.log CustomLog /var/log/httpd/keystone-access.log combined </VirtualHost> <VirtualHost *:35357> WSGIDaemonProcess keystone-admin processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP} WSGIProcessGroup keystone-admin WSGIScriptAlias / /var/www/cgi-bin/keystone/admin WSGIApplicationGroup %{GLOBAL} WSGIPassAuthorization On LogLevel info ErrorLogFormat "%{cu}t %M" ErrorLog /var/log/httpd/keystone-error.log CustomLog /var/log/httpd/keystone-access.log combined </VirtualHost>
# mkdir -p /var/www/cgi-bin/keystone # vim /var/www/cgi-bin/keystone/{main,admin} import os from keystone.server import wsgi as wsgi_server name = os.path.basename(__file__) application = wsgi_server.initialize_application(name)
# chown -R keystone:keystone /var/www/cgi-bin/keystone # chmod 755 /var/www/cgi-bin/keystone/* # systemctl enable httpd.service # systemctl start httpd.service
配置authentication token:
# export OS_TOKEN=ba48c69ef1612f3b8569
配置后端服务器(endpoint)的URL,这里可以写ip地址:
# export OS_URL=http://controller:35357/v2.0
创建service entity 和API endpoint
# openstack service create --name keystone --description "OpenStack Identity" identity +-------------+----------------------------------+ | Field | Value | +-------------+----------------------------------+ | description | OpenStack Identity | | enabled | True | | id | 8e052bba87e84bb1b3857b82720d8c01 | | name | keystone | | type | identity | +-------------+----------------------------------+ # openstack service show keystone //也可以用这条命令查看 # openstack endpoint create --publicurl http://10.13.25.11:5000/v2.0 --internalurl http://10.13.25.11:5000/v2.0 --adminurl http://10.13.25.11:35357/v2.0 --region RegionOne identity +--------------+----------------------------------+ | Field | Value | +--------------+----------------------------------+ | adminurl | http://10.13.25.11:35357/v2.0 | | id | 0be7d1ed3e0d45a9aad465b65f6df6f0 | | internalurl | http://10.13.25.11:5000/v2.0 | | publicurl | http://10.13.25.11:5000/v2.0 | | region | RegionOne | | service_id | 8e052bba87e84bb1b3857b82720d8c01 | | service_name | keystone | | service_type | identity | +--------------+----------------------------------+
四、keystone命令
1、创建租户、用户和角色
# openstack project create --description "Admin Project" admin //创建管理租户 # openstack user create --password-prompt admin //创建管理员用户 # openstack role create admin //创建管理员角色 # openstack role add --project admin --user admin admin //赋予管理员角色 # openstack project create --description "Service Project" service //给service创建租户 # openstack project create --description "Demo Project" demo //给demo创建租户 # openstack user create --password-prompt demo //创建用户 # openstack role create user //创建角色 # openstack role add --project demo --user demo user //给租户和用户添加角色 # unset OS_TOKEN OS_URL //Unset 临时 OS_TOKEN 和OS_URL 环境变量
2、配置环境变量
# openstack --os-auth-url http://10.13.25.11:35357 --os-project-name admin --os-username admin --os-auth-type password token issue
# vim /root/admin-openrc.sh export OS_PROJECT_DOMAIN_ID=default export OS_USER_DOMAIN_ID=default export OS_PROJECT_NAME=admin export OS_TENANT_NAME=admin export OS_USERNAME=admin export OS_PASSWORD=mypassword export OS_AUTH_URL=http://10.13.25.11:35357/v3 export PS1='[\u@\h \W(admin)]\$ ' # vim /root/demo-openrc.sh export OS_PROJECT_DOMAIN_ID=default export OS_USER_DOMAIN_ID=default export OS_PROJECT_NAME=demo export OS_TENANT_NAME=demo export OS_USERNAME=demo export OS_PASSWORD=mypassword export OS_AUTH_URL=http://10.13.25.11:5000/v3 export PS1='[\u@\h \W(demo)]\$ ' # cd /root # source admin-openrc.sh # openstack token issue
3、查看命令
# keystone user-list # keystone tenant-list # keystone role-list # keystone user-role-list # keystone service-list # keystone endpoint-list
4、创建命令
# keystone tenant-create --name tenant1 --description A test Tenant --enabled true # keystone user-create --name user1 --tenanet tenant1 --pass 123456 --email [email protected] --enabled true # keystone role-create --name role1 # keystone user-role-add --user user1 --role role1 --tenant tenant1 # keystone service-create --name cinder --type volume --description Cinder Service # keystone endpoint-create \ --service cinder \ --publicurl http://10.13.25.11:8776/v1 \ --internalurl http://10.13.25.11:8776/v1 \ --adminurl http://10.13.25.11:8776/v1 \ --region regionOne
5、删除命令
# keystone tenant-delete <tenant> # usage: keystone user-delete <user> # keystone user-role-remove --user <user> --role <role> [--tenant <tenant>] # keystone role-delete <role> # keystone service-delete <service> # keystone endpoint-delete <endpoint-id>
五、角色的作用
在Openstack中一个user可以同时属于多个tenant,role定义了用户能够shixian的行为
核心:user需要使用role实现加入多个tenant的操作。
案例:
将用户加入多个租户操作步骤: 创建tenant: #keystone tenant-create --name tenant1 --enabled true #keystone tenant-create --name tenant2 --enabled true 创建user: #keystone user-create --name user1 --tenant tennat1 --password 123456 --enabled true #keystone user-create --name user2 --tenant tennat2 --password 123456 --enabled true 不创建role,使用user1创建一个虚拟机实例(instance): #nova image-list #nova flavor-list #nova --os-username user1 --os-password 123456 --os-tenant tenant1 boot instance1 --image "65d3f61a-885f-4c06-996f-278431e91339" --flavor m1.tiny 使用user2的身份查看tenant1里面的instance: #nova --os-username user2 --os-password 123456 --os-tenant-name tenant1 list 结果为空(因为user2没有对tenant1的操作权限) 创建任意角色(role): #keystone role-create --name role1 使用role1的角色将user2加入到tenant1中: #keystone user-role-add --user user2 --role role1 --tenant tenant1 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 再次使用user2的身份查看tenant1中的instance: #nova --os-username user2 --os-password 123456 --os-tenant-name tenant1 list +---------------------------------------------------------------+------------------+--------------+------------------+------------------+--------------------------------+ | ID | Name | Status | Task State | Power State | Networks | +--------------------------------------------------------------+--------------------+---------------+----------------+-----------------+---------------------------------+ | 694ddb6a-2b79-4ebc-9986-ef9eb51d71dd | instance1 | SHUTOFF | - | Shutdown | private=192.168.0.12 | +-------------------------------------------------------------+-------------------+-----------------+---------------+-------------------+--------------------------------+ #nova --os-username user2 --os-password 123456 --os-tenant-name tenant1 delete instance1 //删除虚拟机实例 |
六、决定角色的核心
决定角色权限的核心:policy.json
#cat /etc/keystone/policy.json #cat /etc/neutron/policy.json #cat /etc/glance/policy.json #cat /etc/cinder/policy.json
七、keystone代码结构