设为首页 收藏本站
查看: 930|回复: 0

[经验分享] openstack(四)Keystone

[复制链接]

尚未签到

发表于 2018-6-1 10:41:23 | 显示全部楼层 |阅读模式
  一、简介
  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服务时,仅需亮出令牌即可。
  下图是从官网截取的具体认证流程图,以供参考:
DSC0000.png

  三、安装和配置
  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:mypasswd@10.13.25.11/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 test@gmail.com  --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代码结构
DSC0001.png

  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-497632-1-1.html 上篇帖子: openstack(三)AMQP(RabbitMQ) 下篇帖子: openstack运维实战系列(十一)之neutron替换instance的IP
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表