玩转企业云计算平台系列(三):Openstack 身份认证服务 Keystone
点击下方名片,设为星标!回复“1024”获取2TB学习资源!前面介绍了 Openstack 入门、基础环境部署等相关的知识点,今天我将详细的为大家介绍 Openstack 身份认证服务 Keystone相关知识,希望大家能够从中收获多多!如有帮助,请点在看、转发分享朋友圈支持一波!!!Keystone概念Keystone (OpenStack Identity Service)是OpenStack
点击下方名片,设为星标!
回复“1024”获取2TB学习资源!
前面介绍了 Openstack 入门、基础环境部署等相关的知识点,今天我将详细的为大家介绍 Openstack 身份认证服务 Keystone相关知识,希望大家能够从中收获多多!如有帮助,请点在看、转发分享朋友圈支持一波!!!
Keystone概念
Keystone (OpenStack Identity Service)是OpenStack中的一个独立的提供安全认证的模块,主要负责openstack用户的身份认证、令牌管理、提供访问资源的服务目录、以及基于用户角色的访问控制。Keystone类似一个服务总线,或者说是整 个Openstack框架的注册表,其他服务通过keystone来注册其服务的Endpoint (服务访问的URL),任何服务之间相互的调用,需要经过Keystone的身 份验证,来获得目标服务的Endpoint来找到目标服务。
Keystone服务在Openstack架构中的位置:
Keystone作用
在Openstack中,Ketstone负责用户认证和服务目录两大功能的实现,相当于一个注册中心,主要有以下功能:
-
1、用户与认证,包括用户权限与用户行为跟踪。
-
身份认证:负责令牌的发放和校验
-
用户授权:授权用户有指定的可执行动作的范围
-
用户管理:管理用户的账户
-
-
2、服务目录,即提供一个服务目录,包括所有的服务项和相关API的端点。
-
服务目录:提供可用服务的API端点位置
-
-
3、SOA相关知识。
Keystone基本架构
更多关于云计算服务 Openstack 系列的学习文章,请参阅:企业云计算平台 Openstack ,本系列持续更新中。
Keystone的管理对象
Keystone服务贯穿整个架构,在进行身份认证服务的整个流程中,有几个重要的概念。
-
用户(user):指的是使用openstack架构的用户。
-
证书(credentials):用于确认用户身份的凭证,证明自己是自己,包括用户的用户名和密码,或是用户名和API密钥,或者身份管理服务提供的认证令牌。
-
认证(authentication):确定用户身份的过程。
-
项目(project):可以理解为一个人,或服务所拥有的资源的集合。
-
角色(role):用于划分权限,通过给user指定role,使user获得role对应操作权限
-
服务(service):openstack架构的组件服务,如nova、neutron、cinder、swift、glance等。
-
令牌(token):由字符串表示,作为访问资源的凭证,是用户的身份/权限证明文件;token决定了用户的权限范围,在指定的权限内进行操作;也包括令牌的有效期,在指定的时间范围内用户才有这些权限。
-
端点(endpoint):一个可以通过网络来访问和定位某个openstack service的地址,即用户创建一个项目过程中需要的各个服务资源的位置
虚拟机创建流程

工作流程

-
用户通过命令行或者horizon控制面板的方式登录openstack,凭借自己的证书(credentials)给keystone验证。
-
Keystone对用户的证书验证,验证通过则会发布一个令牌(token)和用户所需服务的位置点(endpoint)给用户。
-
用户得到了位置点(endpoint)之后,携带自己的令牌,向nova发起请求,请求创建虚拟机。
-
nova会拿着用户的token向keystone进行认证,看是否允许用户执行这样的操作。
-
keystone认证通过之后,返回给nova,nova即开始执行创建虚拟机的请求。首先需要镜像资源,nova带着令牌(token)和所需要的镜像名向glance提出镜像资源的请求。
-
glance会拿着token去向keystone进行认证,看是否允许提供镜像服务。keystone认证成功后,返回给glance。glance向nova提供镜像服务。
-
创建虚拟机还需要网络服务,nova携带token向neutron发送网络服务的请求
-
neutron拿着nova给的token向keystone进行认证,看是否允许向其提供网络服务。keystone认证成功后,返回给nuetron。nuetron则给nova提供网络规划服务。
-
nova获取了镜像和网络之后,开始创建虚拟机,通过hypervisior可调用底层硬件资源进行创建。创建完成返回给用户,成功执行了用户的请求。
安装 Keystone
数据库安装与设置
yum install -y mariadb mariadb-server python2-PyMySQL
完成安装。 之后,我们为Openstack增加MySQL数据库的配置,在/etc/my.cnf.d/目录下,新创建openstack.cnf文件,并写入如下内容:
[mysqld]
bind-address = 192.168.136.101
default-storage-engine = innodb #默认存储引擎[innodb]
innodb_file_per_table # 使用独享表空间
max_connections = 4096 #最大连接数是4096 (默认是1024)
collation-server = utf8_general_ci #数据库默认校对规则
character-set-server = utf8 #默认字符集
之后,我们需要创建Openstack运行所需要的数据库,并授予响应的权限,进入mysql后,执行命令:
create database keystone;
grant all on keystone.* to 'keystone'@'localhost' identified by 'keystone';
grant all on keystone.* to 'keystone'@'%' identified by 'keystone';
create database glance;
grant all on glance.* to 'glance'@'%' identified by 'glance';
grant all on glance.* to 'glance'@'localhost' identified by 'glance';
create database nova;
grant all on nova.* to 'nova'@'localhost' identified by 'nova';
grant all on nova.* to 'nova'@'%' identified by 'nova';
create database nova_api;
grant all on nova_api.* to 'nova_api'@'localhost' identified by 'nova_api';
grant all on nova_api.* to 'nova_api'@'%' identified by 'nova_api';
create database neutron;
grant all on neutron.* to 'neutron'@'%' identified by 'neutron';
grant all on neutron.* to 'neutron'@'localhost' identified by 'neutron';
flush privileges;
在上述配置中,keystone为认证服务的数据库,glance为镜像数据库,nova为虚拟化数据库,neutron为网络资源管理数据库。上述命令执行过程如下:更多关于云计算服务 Openstack 系列的学习文章,请参阅:企业云计算平台 Openstack ,本系列持续更新中。
安装、配置keystone
直接采用YUM的方式进行安装,执行命令:
yum install -y openstack-keystone httpd mod_wsgi
keystone配置
在keystone安装完成后,我们还需要进行keystone的配置。但是在进行keystone的配置之前,我们还需要先生成一个token,执行命令:
openssl rand -hex 10
会生成一串字符串,该命令执行情况如下:keystone的配置文件是/etc/keystone/keystone.conf,进入该文件后,我们需要改动以下4个地方:
-
首先,我们找到
[default]
模块,将该模块下的admin_token字段修改为我们刚刚复制的字符串内容。 -
其次,我们找到
[database]
模块,在该模块下添加如下内容:
connection = mysql+pymysql://keystone:keystone@192.168.136.101/keystone
在上述配置中,keystone:keystone表示MySQL数据库的用户名和密码,最后的/keystone表示MySQL的数据库。我们可以根据自己的实际配置进行灵活修改。
再次,我们找到[token]
模块,在该模块下添加如下内容:
provider = fernet
driver = memcache
表示使用fernet的令牌提供方式和memcache的数据库存储。最后,我们找到[memcache]
模块,在该模块下添加如下内容:
servers = 192.168.136.101:11211
最后,我们完成上述配置后,实际有用的配置如下所示:
这样,我们的keystone就配置完成了。
keystone数据库初始化
在keystone配置完成后,我们还需要进行keystone的数据库初始化配置。执行命令:
su -s /bin/sh -c "keystone-manage db_sync" keystone
等待该命令执行结束后,我们来查看数据库初始化的效果,执行命令:
mysql -h 192.168.136.101 -ukeystone -pkeystone -e "use keystone;show tables;"
结果如下所示:从上图可以看出,我们的keystone数据库初始化成功!
Fernet Keys初始化
最后,我们还需要初始化Fernet Keys,执行命令:
keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
就可以在/etc/keystone/目录下生成fernets-keys目录,在该目录下就存放了线管的Fernet证书。
Openstack Keystone配置环境变量
在进行Keysrtone的配置之前,我们需要先创建环境变量,这样我们才能成功连接到Keystone中。执行命令:
export OS_TOKEN=e4f523fef7082712e949
export OS_URL=http://192.168.136.101:35357/v3
export OS_IDENTITY_API_VERSION=3
可以设置这三个环境变量。其中,第一个OS_TOKEN是我们在Keystone配置文件中设置的admin_token的值,OS_URL是本机的IP地址,这两个参数大家在使用时可以根据自己的实际情况进行修改。
注意,只有完成这三个环境变量的创建,才能够进行下步的操作,否则Openstack会报错!更多关于云计算服务 Openstack 系列的学习文章,请参阅:企业云计算平台 Openstack ,本系列持续更新中。
帮助命令
在openstack中,使用–help参数来显示一条命令的帮助,例如,执行命令:
openstack --help
可以显示所有openstack的相关命令。该命令执行结果(部分)如下所示:当然,我们也可以针对单个模块,来查看命令帮助,执行命令:
openstack user --help
可以显示openstack user模块的相关命令,该命令执行结果如下所示:同样的,我们执行命令:
openstack service --help
也可以显示service模块的相关命令,该命令执行结果如下所示:这样,当我们遇到不会的openstack命令后,就可以使用–help参数来查看具体的使用方式了。接下来,我们就可以正式进行Keystone域、项目、用户和角色的创建了。
域、项目、用户和角色的创建
首先,我们先创建一个Default域,执行命令:
openstack domain create --description "Default" Default
即可创建Default的域,在上述命令中,–description参数后面是对该域的描述,不具有实际作用,该命令执行结果如下:接下来,我们在该Default域下创建admin的项目,执行命令:
openstack project create --domain Default --description "admin" admin
该命令执行结果如下:在这里,我们的admin项目是专门用于Openstack管理的项目,通过该项目可以管理Openstack中所有的云主机。
接下来,我们尝试在Default域中,创建admin用户,执行命令:
openstack user create --domain Default --password-prompt admin
即可创建名为admin的用户,该命令执行后,会输入两次密码,作为该用户的登录密码。该命令执行情况如下所示:接下来,我们需要创建admin的角色,执行命令:
openstack role create admin
该命令执行结果如下所示:之后,我们需要将admin用户添加到admin项目上,执行命令:
openstack role add --project admin --user admin admin
在上述命令中,–project参数指定了项目明,–user参数则指定了用户名,最后的admin是我们刚刚创建的Role。
这样,我们的Default域就配置完成了。接下来,我们再以基本相同的方式,来配置一个demo域。
首先,我们先创建demo域,执行命令:
openstack project create --domain Default --description "Demo" demo
该命令执行情况如下所示:之后,我们在Default域中,创建user-demo用户,执行命令:
openstacl user create --domain Default --password-prompt user-demo
该命令执行结果如下所示:接下来,我们创建名为user的角色,执行命令:
openstack role create user
该命令执行结果如下所示:最后,我们将demo用户添加到demo项目中,并授予user权限,执行命令:
openstack role add --project demo --user user-demo user
这样我们的Keystone域、项目、用户和角色的创建就完成了。更多关于云计算服务 Openstack 系列的学习文章,请参阅:企业云计算平台 Openstack ,本系列持续更新中。
Keystone中Nova、Neutron与Glance用户的创建与授权
Service服务项目创建
在Openstack中,各个服务需要访问Keystone,而访问Keystone的需要进行认证。为了配置各个服务对Keystone访问的认证,我们需要为每个服务创建用户,并且每个用户还要属于一个项目。接下来,我们就需要创建这个Server项目,并且给每个服务单独创建一个用户。
首先,我们来创建service服务项目,执行命令:
openstack project create --domain Default --description "Service" service
该命令执行结果如下所示:
Nova、Neutron与Glance用户的创建与授权
接下来,我们要为Glance、Nova和Neutron三个服务分别创建用户,并进行授权。
Glance用户的创建命令如下所示:
openstack user create --domain Default --password-prompt glance
该命令执行结果如下所示:对Glance用户进行授权的命令如下:
openstack role add --project service --user glance admin
Nova的用户创建和授权命令如下:
openstack user create --domain Default --password-prompt nova
openstack role add --project service --user nova admin
上述两条命令执行结果如下:Neutron的用户创建和授权命令如下:
openstack user create --domian Default --password-prompt neutron
openstack role add --project service --user neutron admin
上述两条命令执行结果如下:这样,我们就实现了Openstack的Keystone中Nova、Neutron与Glance用户的创建与授权了。
Keystone服务注册
Keystone 服务创建
首先,我们来创建identity服务,这样当其他服务需要注册时,就需要寻找我们创建的identity服务。执行命令:
openstack service create keystone --description "Openstack Keystone" identity
即可创建名为identity的Service服务了,该命令执行结果如下所示:
Keystone端点创建
接下来,我们还要创建Keystone的Endpoint,我们需要分别创建public、private以及admin三种权限的端点。公共(public)端点的创建命令如下所示:
openstack endpoint create --region RegionOne identity http://192.168.136.101:5000/v3
该命令执行结果如下所示:内部(Internal)端点的创建命令如下所示:
openstack endpoint create --region RegionOne identity internal http://192.168.136.101:5000/v3
该命令执行结果如下所示:admin端点创建命令如下所示:
openstack endpoint create --region RegionOne identity admin http://192.168.136.101:35357/v3
注意,在上述命令中,由于admin的URL与Internal和Public URL的分离性,因此在这里我们将其端口配置为35357。该命令执行结果如下所示:
Keystone安装结果检验
在完成上述步骤后,我们的Keystone就已经安装完毕了,接下来,让我们检验一下Keystone的安装结果。
首先,我们先删除之前设置的环境变量OS_TOKEN以及OS_URL。(注:OS_TOKEN必须删除,OS_URL也可以不删除,相应的在下面的命令中,就可以省略–os-auth-url参数了)执行命令:
unset OS_TOKEN OS_URL
接下来,我们先测试admin用户,执行命令:
openstack --os-auth-url http://192.168.136.101:35357/v3 --os-project-domain-name default --os-user-domain-name default --os-project-name admin --os-username admin token issue
在弹出的对话框中输入密码,结果如下所示:从上图可知,我们的admin用户安装成功!接下来,我们测试一下user-demo用户,执行命令:
openstack --os-auth-url http://192.168.136.101:5000/v3 --os-project-domain-name default --os-user-domain-name default --os-project-name demo --os-username user-demo token issue
同样的,在弹出的对话框中输入user-demo用户的密码,结果如下所示:从上图可知,我们的user-demo用户安装成功!更多关于云计算服务 Openstack 系列的学习文章,请参阅:企业云计算平台 Openstack ,本系列持续更新中。
环境变量脚本使用
最后,为了我们更方便的使用Keystone,我们可以把admin用户和user-demo用户的相关参数写成脚本文件,这样当我们要使用该用户登录openstack时,执行该脚本,就可以直接登录使用,从而免去了上述很长的命令了。
admin用户的脚本文件admin-openstack.sh内容如下所示:
export OS_PROJECT_DOMAIN_NAME=Default
export OS_USER_DOMAIN_NAME=default
export OS_PROJECT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=admin
export OS_AUTH_URL=http://192.168.136.101:35357/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
我们执行该脚本后,然后执行命令:
openstack token issue
结果如下所示:同理,我们也可以配置user-demo用户的脚本文件demo-openstack.sh,其内容如下所示:
export OS_PROJECT_DOMAIN_NAME=Default
export OS_USER_DOMAIN_NAME=default
export OS_PROJECT_NAME=demo
export OS_USERNAME=user-demo
export OS_PASSWORD=user-demo
export OS_AUTH_URL=http://192.168.136.101:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
执行该脚本文件后,我们执行命令:
openstack token issue
执行结果如下所示:从以上结果看出,我们的admin用户和user-demo用户的脚本均配置成功!更多关于云计算服务 Openstack 系列的学习文章,请参阅:企业云计算平台 Openstack ,本系列持续更新中。
参考文章:https://blog.csdn.net/KY06_Xxy/article/details/110959473 https://blog.csdn.net/weixin_40228200/article/details/125079572 https://blog.csdn.net/weixin_40228200/article/details/125108273
读者专属技术群
构建高质量的技术交流社群,欢迎从事后端开发、运维技术进群(备注岗位,已在技术交流群的请勿重复添加)。主要以技术交流、内推、行业探讨为主,请文明发言。广告人士勿入,切勿轻信私聊,防止被骗。
扫码加我好友,拉你进群
推荐阅读 点击标题可跳转
PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。点“在看”支持我们吧!
更多推荐
所有评论(0)