1、OpenStack云计算平台搭建与管理教学教案共17单元11云计算基础平台搭建与应用课程教案授课题目: 第11讲 OpenStack的认证中心Keystone教学时数:3授课类型:理论课 实践课教学目的、要求:了解OpenStack的基本名词了解Keystone的功能了解Keystone的组件构成及功能了解Keystone的基本工作过程能够安装配置Keystone认证组件教学重点: 了解OpenStack的基本名词Keystone的组件构成及基本工作过程安装配置keystone服务 教学方法和手段: 通过微课讲解跟着视频实作教学条件: 网课参考资料:云计算基础平台搭建与应用课程教案教学内容及过
2、程旁批课前准备:检查自己前面的系统配置是否完全完成,必须完成后才能进入这一段学习。教学引入:OpenStack云计算平台是由OpenStack的多个功能组件组成。犹如搭积木一样,各个功能组件构成了云计算平台,那应该先搭建哪一个组件呢?由于OpenStack的所有组件都要通过“Keystone”组件的认证才能够进入云管理平台,因此首先安装身份认证组件:“Keystone”。教学内容与教学设计:11.1 Keystone的基本概念第1篇11.1.1 基本名词解释从本章开始我们将要接触很多OpenStack的专业名词,如域、项目、服务、端点、用户、角色、凭据、鉴权、令牌、组等,感觉好复杂的样子呢。下
3、面我们通过一个浅显的例子来理解它们。假设我投资了一个网吧,这个网吧就是项目(Project)。该网吧对外提供多种服务(Service),比如上网、泡方便面、叫外卖等。为了知道客户想要什么服务,每个服务都有一个不同的服务地址,只要你来到这个地址就能使用对应的服务,如到前台可以泡方便面,这里的地址就是服务端点(Endpoint)。在这个项目里,我、网管和来上网的人都是用户(User),我们都可以使用该网吧的服务。但我们在网吧里的权限又不一样,因为我们的角色(Role)不一样。我的角色是老板,我有查账的权限;网管的角色是管理员,负责收银和软硬件管理;其他人的角色是顾客,只能上网与消费。用户来到服务端
4、点后并不是马上就可以使用服务,得把身份凭据(Credentials)提供出来由系统进行鉴权(Authentication)以判断是否可以使用该服务(比如年龄不到不允许使用上网服务)。当通过鉴权后会给发给你一个令牌(Token),每次你要使用项目中某项服务的时候只需要出示令牌即可。比如你还需要买方便面时只需要出示令牌由管理员进行记账即可,不需要再次鉴权。另外,为了便于管理还可以将若干个用户分为若干组(Group),如VIP组收费打八折,一般会员组收费打九折,这实际是进行批量权限设定,你进了这个组就有了这个组的所有权限。随着业务扩大,又开设了很多连锁加盟店(不同的项目),显然每个加盟店有自己的用户
5、,不能拿着一个网吧的会员卡到另一个网吧消费。此时我们可以把部分项目(Project)和用户(User)划到一个域(Domain)中,并规定只有本域中的用户才能使用本域中项目的资源。其中域(Domain)、项目(Project)、组(Group)、用户(User)、角色(Role)的关系图如图11.1所示。图11.1 域、项目、组、用户和角色关系模型图(1)项目(Project)Project是可供用户访问的资源集合,不同的项目(Project)之间资源是隔离的。(2)用户(User)User指代任何拥有身份验证信息来使用OpenStack的实体,它属于特定的域(Domain),可以是真正的使用
6、人、其他系统或者服务。OpenStack中自带了“admin”用户,该用户从属于“admin”项目并且分配有“admin”角色。用户必须要指定一个项目(Project)才可以申请使用OpenStack的服务。(3)域(Domain)Domain是项目(Project)和用户(User)的集合。默认存在“default”域,如果没有创建域,所有项目和用户都使用“default”域。(4)角色(Role)Role是预定义的权限集合。OpenStack自带两个预定义角色,即“admin”和“member”。“member”角色提供普通用户访问权限。“admin”角色提供整个OpenStack环境的管
7、理特权。如果项目中的用户被分配了“admin”角色,则该用户获得与“admin”用户相同的特权。“admin”用户不仅是所属项目的管理员,还能够管理OpenStack环境中的所有项目。(5)组(Group)Group是域中的部分用户的集合。通过分配角色到组,可以批量向在该组中的所有用户分配权限。(6)凭据(Credentials)是Keystone 验证用户身份时需要的身份验证数据。这些数据包含用户名、密码、项目名、域名等信息。(7)鉴权(Authentication)鉴权(Authentication)是Keystone通过检查用户的凭据(Credentials)来确定用户的身份的过程。当用
8、户的凭据(Credentials)通过验证后,Keystone给用户提供身份验证令牌(Token),让用户能够访问该服务。(8)令牌(Token)令牌(Token)是一个加密字符串,作为访问资源的“通行证”。一个Token包含了在指定范围和有效时间内可以被访问的资源信息。(9)服务(Service)即Openstack中提供的组件服务,如计算服务、镜像服务等。(10)端点(Endpoint)一个可以通过网络来访问和定位某个服务(Service)的地址,通常是一个URL地址。如“http:/controller:5000/v3”就是Keystone组件对外提供服务的端点。Endpoint分为三类
9、:1admin-url :给管理员提供服务的地址2internal-url :给OpenStack内部组件提供服务的地址3public-url :给其他用户提供服务的地址在OpenStack Train版中这三类端点是一样的,只是保留了不同的定义而已。11.1.2 Keystone基本架构图11.2 Keystone服务后端支持模块如图11.2所示,Keystone的服务(Service)是由Token、Catalog、Identity、Policy四大后端模块所支持的。(1)Token backend 顾名思义该模块用来生成和管理Token令牌。(2)Catalog backend 用来存储
10、和管理服务(Service)、服务端点(Endpoint)。(3)Identity backend 用来管理项目(Project)、用户(User)、角色(Role)和提供验证服务。(4)Policy backend 用来管理所有访问的权限。11.1.3 Keystone认证的基本步骤图11.3 虚拟机生成步骤示意图从图11.3可以看出,对OpenStack中任何服务的访问都要经过Keystone的鉴权。Keystone的鉴权分为两种:(1)判断用户凭证是否合法用户初次使用服务时需要提交给Keystone用户名、密码等用户凭证信息。Keystone进行鉴权判断是否为合法用户,如果是则颁发令牌(
11、Token)。在颁发的令牌中包含有用户对服务的使用权限、令牌的失效时间等信息。拿着令牌就可以在系统内通行了。(2)判断用户令牌是否合法当用户(User)使用OpenStack的任一组件服务时都需要提交已获得的令牌。提供服务的组件将收到的令牌提交给KeyStone判断该令牌是否合法,是否过期,是否有权获得服务等。只有通过了KeyStone的验证后服务才会响应相应的请求。第1章 第2章 第3章 第4章 第5章 第6章 6.1 11.2 安装与配置Keystone认证服务为了避免接下来的工作中由于操作不当造成系统重装的风险,我们将前期工作进行拍摄快照保存。由于本章工作只在控制节点上实施,因此只需要给
12、控制节点拍摄快照。详细操作请参阅任务6.4。11.2.1 安装和配置Keystone(1)安装Keystone软件包rootcontroller # yum install openstack-keystone httpd mod_wsgi -y这里安装了三个软件:“openstack-keystone”,“httpd”,“mod_wsgi”。openstack-keystone是Keystone的软件包;Keystone组件实际是一款基于服务器网关接口(WSGI)协议的Web应用,它需要在支持WSGI协议的Web服务器上运行;Httpd是一个Web服务器,当它安装上mod_wsgi扩展模块就
13、能支持WSGI协议,以满足Keystone的运行需要。在安装openstack-keystone包的时候,同时也会在系统自动创建名为“keystone”的用户以及同名用户组。我们可以用如下两种方式查看系统自动生成的“keystone”用户和“keystone”用户组的相关信息。1 查看keystone用户信息rootcontroller # cat /etc/passwd | grep keystone能看见已经存在“keystone”用户。2 查看keystone用户组信息rootcontroller # cat /etc/group | grep keystone能看见已经存在“keyst
14、one”用户组。(2)创建keystone数据库并授权1 进入数据库rootcontroller # mysql -uroot -p000000因为MariaDB数据库完全兼容MySql数据库,因此在使用方式上是与MySql数据库是一样的。该命令的参数-u后为用户名,-p后为密码,不需要空格。2 建立keystone数据库MariaDB (none) CREATE DATABASE keystone; #创建一个名为keystone的数据库【提示】SQL命令需要“;”作为结束符,不要忘记。3 为数据库授权MariaDB (none) GRANT ALL PRIVILEGES ON keysto
15、ne.* TO keystonelocalhost IDENTIFIED BY KEYSTONE_DBPASS;MariaDB (none) GRANT ALL PRIVILEGES ON keystone.* TO keystone% IDENTIFIED BY KEYSTONE_DBPASS;上面两条语句把“keystone”数据库所有表(keystone.*)的所有权限(ALL PRIVILEGES)赋予本地主机(localhost )及任意远程主机(%)中名为keystone的用户,验证密码为“KEYSTONE_DBPASS”。【提示】OpenStack的密码都可以根据实际需要进行设置
16、,但一定要记住它们!4 退出数据库MariaDB (none) exit;(3)修改Keystone配置文件rootcontroller # vi /etc/keystone/keystone.conf这是一个很长的配置文件,我们首先配置Keystone组件使用的数据库。利用vi的搜索功能,搜索到database区域,增加或者修改connection = mysql+pymysql:/keystone:KEYSTONE_DBPASScontroller/keystone该行配置数据库连接信息:用户“keystone”和密码“KEYSTONE_DBPASS”(keystone:KEYSTONE)
17、去连接controller主机中的名字叫“keystone”的数据库(controller/keystone)。【提示】这里设置的用户名和密码要和数据库里对keystone数据库授权时设置的用户名和密码一致。然后在token区域下取消注释让下面设置生效。provider = fernetKeystone令牌有三种生成方式:UUID、PKI、Fernet。其中“Fernet token”是当前主流推荐的token加密格式。它是一种轻量级的消息格式,不需要存储于数据库,减少了磁盘的IO,带来了一定的性能提升。一个“Fernet token”的样子长得像这样的:gAAAAABeuBugyxPug1q
18、qhcvgl-4rHhlrd6VT71g0LdjbtnpvnKANkSqzndDcwHky-o0c06nU7jfaZhEpgnEnw8Csrw7nxrBeIMY3xBtLwLY0DJBQhHyd55b890lOt9UzXiv-YZNk7jPYP3RzfUg8HmBUSI2SUmHd2eYcrowUq32c7hv7gODLoA在这个字符串中存储了用加密密钥加密后的用户信息、权限信息、过期时间信息等。Keystone在验证的时候将用解密密钥进行解密获得原始信息。(4)同步数据库Keystone安装后已经提供了数据库的基础表数据,但还没有导入到数据库中,我们需要手动将数据同步导入到数据库中。root
19、controller # su keystone -s /bin/sh -c keystone-manage db_sync【命令解释】su keystone:切换到keystone用户,因为只有keystone用户(安装时自动创建的用户)拥有对keystone数据库完全操作的权限所以要切换到keystone用户来执行同步,执行完后将把用户切换回root用户;-s /bin/sh:-s为su命令的参数,指定用什么编译器(Shell)来执行命令,“/bin/sh”就是指定的编译器;-c:为su的参数,后面在引号内的是具体执行的命令;keystone-manage:是用来同Keystone服务进行
20、交互的命令行工具。keystone-manage的命令格式:keystone-manage 参数 具体操作(action)keystone-manage常见操作:db_sync:同步数据库;fernet_setup:创建一个“Fernet key”仓库,用于令牌(token)加密;credential_setup:创建一个“Fernet key”仓库,用于凭证(credential)加密;bootstrap:认证引导服务,初始化Keystone的登录信息;token_flush:清除过期的token。(5)检查同步后的数据库rootcontroller # mysql -uroot -p000
21、000 #进入到数据库MariaDB (none) use keystone; #转换到keystone数据库MariaDB keystone show tables; #查询该数据库中所有的表 见到如上数据库表列表时表示数据库导入成功。11.2.2 Keystone组件初始化(1)初始化Fernet密钥存储库rootcontroller # keystone-manage fernet_setup -keystone-user keystone -keystone-group keystone 该命令将自动创建“/etc/keystone/fernet-keys/”目录,并生成两个Ferne
22、t密钥放到目录下。此密钥用于加密和解密令牌(token)。rootcontroller # keystone-manage credential_setup -keystone-user keystone -keystone-group keystone该命令将自动创建“/etc/keystone/credential-keys/”目录,并生成两个Fernet密钥放到目录下。此密钥用于验证用户凭证的正确性。当token过期后需要重新输入用户名和密码等相关凭证,该密钥完成对凭证的加密和解密工作。(2)初始化身份认证引导已知OpenStack有一个默认用户为“admin”,但现在还没有对应的密码等
23、登录所必需的信息。下面我们用“keystone-manage bootstrap”命令来给admin用户初始化它的登录信息。以后登录时只需要比对用户名、密码等信息就可以进行鉴权。rootcontroller # keystone-manage bootstrap -bootstrap-password ADMIN_PASS -bootstrap-admin-url http:/controller:5000/v3/ -bootstrap-internal-url http:/controller:5000/v3/ -bootstrap-public-url http:/controller:5
24、000/v3/ -bootstrap-region-id RegionOne【命令及参数解释】keystone-manage bootstrap:给系统初始化鉴权所需要的登录信息;-bootstrap-password:设置admin用户的密码;-bootstrap-admin-url:设置admin用户使用的服务地址(endpoint);-bootstrap-internal-url:设置内部用户使用的服务地址(endpoint);-bootstrap-public-ur:设置其他用户使用的服务地址(endpoint);-bootstrap-region-id:设置区域ID名称,用于配置集群
25、服务。从命令中可以看到admin-url、internal-url、public-ur都是同样的地址,均指向Keystone的服务端点。(3)创建wsgi配置文件软链接rootcontroller # ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/该命令将wsgi-keystone.conf文件软链接到了“/etc/httpd/conf.d/”这个目录下面,链接完成后在该目录下可以看到“wsgi-keystone.conf”文件。这里并不是把该文件拷贝过去,只是建立了一个映射,类似于快捷方式。因为“/etc/htt
26、pd/conf.d/”目录下的conf文件都是Apache的配置文件,所以这个命令让“wsgi-keystone.conf”也成为Apache的配置文件之一。该配置文件让Apache能够应用mod_wsgi模块以支持WSGI协议。(4)修改Apache配置,启动Apache服务Keystone本质上是一个WEB应用,所以要借助WEB服务器运行。Apache就是一个WEB服务器应用,它的服务名为“httpd”。1修改Apache配置rootcontroller # vi /etc/httpd/conf/httpd.conf配置服务器的名称为控制节点的名称:ServerName controlle
27、r2重启Apache服务rootcontroller # systemctl enable httpd #开机启动rootcontroller # systemctl restart httpd #重新启动11.3 鉴权并验证Keystone服务11.3.1 鉴权在以上的操作中,我们设置了OpenStack用户“admin”的密码为“ADMIN_PASS”。现在该如何通过Keystone的认证登入系统呢?我们首先需要鉴权,判断用户是否是合法用户。我们可以通过环境变量传送用户名及密码等相关登录信息给KeyStone,由它进行鉴权。(1)创建初始化环境变量文件rootcontroller # vi
28、 admin-openrc在文件中写入如下命令export OS_USERNAME=adminexport OS_PASSWORD=ADMIN_PASSexport OS_PROJECT_NAME=adminexport OS_USER_DOMAIN_NAME=Defaultexport OS_PROJECT_DOMAIN_NAME=Defaultexport OS_AUTH_URL=http:/controller:5000/v3export OS_IDENTITY_API_VERSION=3export OS_IMAGE_API_VERSION=2在这里面我们定义了要登录OpenStack
29、系统用户名(OS_USERNAME)是“admin”,登录密码(OS_PASSWORD)是“ADMIN_PASS”,用户属于的域(OS_USER_DOMAIN_NAME)是“Default”,项目属于的域(OS_PROJECT_DOMAIN_NAME)是“Default”,认证地址(OS_AUTH_URL)是“http:/controller:5000/v3”,Keystone版本号(OS_IDENTITY_API_VERSION)是“3”,镜像管理应用的版本号(OS_IMAGE_API_VERSION)是“2”。(2)导入环境变量进行鉴权rootcontroller # . admin-op
30、enrc #运行rootcontroller # export -p #查看环境变量能看到如上结果,说明环境变量导入成功。这里的环境变量就是模拟用户登录时将用户名、密码等信息提供给KeyStone来验证是否允许其登录。11.3.2 验证Keystone服务(1)创建service项目rootcontroller # openstack project create -domain default service 【命令解释】“openstack project create”:创建一个项目;“-domain default”:该项目建立在“default”这个域下,该域名必须存在;“servi
31、ce”:这是新项目的名。【提示】系统存在一个默认名为“Default”、ID名为“default”的域,由于在“-domain”后的输入既可以是域的名字,也可以是域的ID,所以在这里输入Default和default均可以。rootcontroller # openstack project list #查看现有项目列表(2)创建user的角色rootcontroller # openstack role create user(3)登入系统查看系统已有的域、项目、用户和角色信息如果在后面操作中看到“Missing value auth-url required for auth plugin password”这样的错误信息,说明用户的登录信息还没有导入系统,只需将上面创建的“admin-openrc”导入到环境变量即可。1查看已有域(Domain)rootc
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1