{lamp/}
{card-describe title="OpenStack———keystone"}
Keystone——身份服务
Keystone (OpenStack ldentityService)是OpenStack中的一个独立的提供安全认证的模块,主要负责openstack用户的身份认证、令牌管理、提供访问资源的服务目录(指引路径)、以及基于用户角色的访问控制
Keystone提供路径指引服务前提
Keystone类似一个服务总线,或者说是整个Openstack框架的注册表,其他服务通过keystone来注册其服务的Endpoint(服务访问的URL),任何服务之间相互的调用,需要经过Keystone的身份验证,来获得目标服务的Endpoint来找到目标服务。
主要功能
身份认证(Authentication) :令牌的发放和校验
用户授权(Authorization):授予用户在一个服务中所拥有权限
用户管理(Account) :管理用户账户
服务目录(Service Catalog):提供可用服务的API端点
主要管理对象
User、Credentials、Authentication、Token、Project、Service、Endpoint、Role
User:指使用Openstack service的用户。
Project(Tenant):可以理解为一个人、或服务所拥有的资源集合。
Role:用于划分权限。通过给User指定Role,使User获得Role对应操作权限
Authentication:确定用户身份的过程。
Token:是一个字符串表示,作为访问资源的令牌。Token包含了在指定范围和有效时间内,可以被访问的资源。
Credentials:用于确认用户身份的凭证。用户的用户名和密码,或者是用户名和API密钥,或者身份管理服务提供的认证令牌。
Service: Openstack service,即Openstack中运行的组件服务。如swift、glance、neutron、cinder等。
Endpoint:一个可以通过网络来访问和定位某个Openstack service的地址,通常是一个URL。
Keystone认证流程图
{/card-describe}
{lamp/}
初始化数据库
♾️ autohotkey 代码:#登录数据库,密码为000000
mysql -u root -p000000
创建Keystone数据库
♾️ python 代码:CREATE DATABASE keystone;
授予对Keystone数据库的适当访问权限
♾️ python 代码:GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY '000000';
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY '000000';
#之后exit退出数据库
具体执行结果图
♾️ python 代码:[root@ct ~]# mysql -u root -p
Enter password: #输入数据库密码000000
MariaDB [(none)]> create database keystone;
Query OK, 1 row affected (0.003 sec)
MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY '000000';
Query OK, 0 rows affected (0.013 sec)
MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY '000000';
Query OK, 0 rows affected (0.000 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.004 sec)
MariaDB [(none)]> exit
Bye
部署ketstone以及相关组件
安装软件包
♾️ python 代码:yum install openstack-keystone httpd mod_wsgi -y
修改配置文件,配置数据库访问
♾️ python 代码:vim /etc/keystone/keystone.conf
在[database]中,配置数据库访问:
♾️ python 代码:connection=mysql+pymysql://keystone:000000@controller/keystone
在该[token]中,配置Fernet令牌提供者:
♾️ python 代码:provider = fernet
填充身份服务数据库
♾️ python 代码:su -s /bin/sh -c "keystone-manage db_sync" keystone
查看keystone再数据库中是否有了数据
♾️ python 代码:mysql -u root -p000000 -e"use keystone;show tables;"
输入如下:
♾️ python 代码:+------------------------------------+
| Tables_in_keystone |
+------------------------------------+
| access_rule |
| access_token |
| application_credential |
| application_credential_access_rule |
| application_credential_role |
| assignment |
| config_register |
| consumer |
| credential |
| endpoint |
| endpoint_group |
| federated_user |
| federation_protocol |
| group |
| id_mapping |
| identity_provider |
| idp_remote_ids |
| implied_role |
| limit |
| local_user |
| mapping |
| migrate_version |
| nonlocal_user |
| password |
| policy |
| policy_association |
| project |
| project_endpoint |
| project_endpoint_group |
| project_option |
| project_tag |
| region |
| registered_limit |
| request_token |
| revocation_event |
| role |
| role_option |
| sensitive_config |
| service |
| service_provider |
| system_assignment |
| token |
| trust |
| trust_role |
| user |
| user_group_membership |
| user_option |
| whitelisted_config |
+------------------------------------+
初始化Fernet密钥存储库
♾️ python 代码:keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
keystone-manage credential_setup --keystone-user keystone --keystone-group keystone
#此命令没有输出
配置bootstrap身份认证服务
♾️ python 代码:keystone-manage bootstrap --bootstrap-password 000000 \
--bootstrap-admin-url http://controller:5000/v3/ \
--bootstrap-internal-url http://controller:5000/v3/ \
--bootstrap-public-url http://controller:5000/v3/ \
--bootstrap-region-id RegionOne
- 此步骤是初始化openstack,会把openstack的admin用户的信息写入到mysql的user表中,以及url等其他信息写入到mysql的相关表中;
- admin-url是管理网(如公有云内部openstack管理网络),用于管理虚拟机的扩容或删除;如果共有网络和管理网是一个网络,则当业务量大时,会造成无法通过openstack的控制端扩容虚拟机,所以需要一个管理网;
- internal-url是内部网络,进行数据传输,如虚拟机访问存储和数据库、zookeeper等中间件,这个网络是不能被外网访问的,只能用于企业内部访问
- public-url是共有网络,可以给用户访问的(如公有云) ,但是此环境没有这些网络,则公用同一个网络
- 5000端口是keystone提供认证的端口
- 需要在haproxy服务器上添加一条listen
各种网络的url需要指定controler节点的域名,一般是haproxy的vip的域名(高可用模式)
配置Apache HTTP服务器
编辑/etc/httpd/conf/httpd.conf文件并配置
♾️ python 代码:vi /etc/httpd/conf/httpd.conf
添加或者修改如下:
♾️ python 代码:ServerName controller
一键修改方式如下:
♾️ python 代码:echo "ServerName controller" >> /etc/httpd/conf/httpd.conf
创建配置文件
♾️ python 代码:
安装完mod_wsgi包后,会生成 wsgi-keystone.conf 这个文件,文件中配置了虚拟主机及监听了5000端口,mod_wsgi就是python的网关ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/
开启服务
♾️ python 代码:#配置开机自启 systemctl enable httpd.service systemctl start httpd.service
查看状态
♾️ python 代码:systemctl status httpd
结果如下就代表启动成功
♾️ python 代码:[root@controller ~]# systemctl status httpd ● httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled) Active: active (running) since 六 2021-06-26 14:36:21 CST; 42min ago Docs: man:httpd(8) man:apachectl(8) Process: 41854 ExecStop=/bin/kill -WINCH ${MAINPID} (code=exited, status=0/SUCCESS) Main PID: 41866 (httpd) Status: "Total requests: 111; Current requests/sec: 0; Current traffic: 0 B/sec" Tasks: 42 CGroup: /system.slice/httpd.service ├─41866 /usr/sbin/httpd -DFOREGROUND ├─41867 /usr/sbin/httpd -DFOREGROUND ├─41868 /usr/sbin/httpd -DFOREGROUND ├─41869 /usr/sbin/httpd -DFOREGROUND ├─41870 (wsgi:keystone- -DFOREGROUND ├─41871 (wsgi:keystone- -DFOREGROUND ├─41872 (wsgi:keystone- -DFOREGROUND ├─41873 (wsgi:keystone- -DFOREGROUND ├─41874 (wsgi:keystone- -DFOREGROUND ├─41875 /usr/sbin/httpd -DFOREGROUND ├─41876 /usr/sbin/httpd -DFOREGROUND ├─41877 /usr/sbin/httpd -DFOREGROUND ├─41878 /usr/sbin/httpd -DFOREGROUND ├─41879 /usr/sbin/httpd -DFOREGROUND ├─41917 /usr/sbin/httpd -DFOREGROUND ├─41940 /usr/sbin/httpd -DFOREGROUND ├─41977 /usr/sbin/httpd -DFOREGROUND └─42004 /usr/sbin/httpd -DFOREGROUND 6月 26 14:36:21 controller systemd[1]: Stopped The Apache HTTP Server. 6月 26 14:36:21 controller systemd[1]: Starting The Apache HTTP Server... 6月 26 14:36:21 controller systemd[1]: Started The Apache HTTP Server.
配置管理员账户的环境变量
这些环境变量用于创建角色和项目使用,但是创建角色和项目需要有认证信息,所以通过环境变量声明用户名和密码等认证信息,欺骗openstack已经登录且通过认证,这样就可以创建项目和角色;也就是把admin用户的验证信息通过声明环境变量的方式传递给openstack进行验证,实现针对openstack的非交互式操作
♾️ python 代码:export OS_USERNAME=admin export OS_PASSWORD=000000 export OS_PROJECT_NAME=admin export OS_USER_DOMAIN_NAME=Default export OS_PROJECT_DOMAIN_NAME=Default export OS_AUTH_URL=http://controller:5000/v3 export OS_IDENTITY_API_VERSION=3 #这样配置之后,重启服务器虎会失效
写入~/.bashrc文件下
♾️ python 代码:cat >> ~/.bashrc << EOF export OS_USERNAME=admin //控制台登陆用户名 export OS_PASSWORD=000000 //控制台登陆密码 export OS_PROJECT_NAME=admin export OS_USER_DOMAIN_NAME=Default export OS_PROJECT_DOMAIN_NAME=Default export OS_AUTH_URL=http://ct:5000/v3 export OS_IDENTITY_API_VERSION=3 export OS_IMAGE_API_VERSION=2 EOF source ~/.bashrc
配置了环境变量就可以进行一些openstack操作
♾️ python 代码:[root@controller ~]# openstack user list +----------------------------------+-----------+ | ID | Name | +----------------------------------+-----------+ | 93450284697642e781348aa5f20ff00b | admin | | ef8b6d926c4a430eb0cceb5a39328bda | myuser | | 80d23ee16f4b40b7acc5ea9d0257c5ba | glance | | 1c1fa588362a4b5a96d7b90a5cb128ec | placement | | 8daac410d454453a850ab4371e7356c0 | nova | +----------------------------------+-----------+
创建OpenStack 域、项目、用户和角色
创建一个项目(project),创建在指定的domain(域)中,指定描述信息,project名称为service(可使用openstack domain list 查询)
♾️ python 代码:#创建新域 openstack domain create --description "An Example Domain" example
结果如下
♾️ python 代码:+-------------+----------------------------------+ | Field | Value | +-------------+----------------------------------+ | description | Service Project | | domain_id | default | | enabled | True | | id | 70a6fc6eb82f48dfa3d66d5389dcea3e | | is_domain | False | | name | service | | options | {} | | parent_id | default | | tags | [] | +-------------+----------------------------------+
创建角色(可使用openstack role list查看)
♾️ python 代码:openstack project create --domain default --description "Service Project" service
结果如下
♾️ python 代码:+-------------+----------------------------------+ | Field | Value | +-------------+----------------------------------+ | description | Service Project | | domain_id | default | | enabled | True | | id | 70a6fc6eb82f48dfa3d66d5389dcea3e | | is_domain | False | | name | service | | options | {} | | parent_id | default | | tags | [] | +-------------+----------------------------------+
创建普通用户的项目和用户
♾️ python 代码:openstack project create --domain default --description "Demo Project" myproject
结果如下
♾️ python 代码:+-------------+----------------------------------+ | Field | Value | +-------------+----------------------------------+ | description | Demo Project | | domain_id | default | | enabled | True | | id | 329rhdd32y2f48dfa3d66d5389dcea3e | | is_domain | False | | name | myproject | | options | {} | | parent_id | default | | tags | [] | +-------------+----------------------------------+
再次输入指令
♾️ python 代码:openstack user create --domain default --password-prompt myuser
结果如下
♾️ python 代码:#会输入密码,不要输错了 +-------------+------------------------------------------+ | Field | Value | +-------------+------------------------------------------+ | domain_id | default | | enabled | True | | id | d0e42f995f29415c87705af0e7754ddc | | name | user | | options | {} | | password_expires_at | None | +-------------+------------------------------------------+
创建myrole角色
♾️ python 代码:openstack role create myrole
结果如下
♾️ python 代码:+-------------+----------------------------------+ | Field | Value | +-------------+----------------------------------+ | description | None | | domain_id | None | | id | d0e42f995f29415c87705af0e7754ddc | | name | user | | options | {} | +-------------+----------------------------------+
将myrole角色添加到myproject项目和myuser用户
♾️ python 代码:openstack role add --project myproject --user myuser myrole
验证认证服务
查看是否可以不指定密码就可以获取到token信息
♾️ python 代码:
♾️ python 代码:openstack token issue
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Field | Value | +------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | expires | 2021-02-18T09:27:10+0000 | | id | gAAAAABgLiTedvBu5lIbeJPJ-gUoWoIJx_NpRWcaTFjWf-oN_x5q6AhkYN0WUBvlLKR8nO9RJRJmczdvOlD9h7Kl-Cp-d3Fvd3knzrhY8nEKKW2TA16JTd6KmN9UeczQtQL9nLJn5wnum8AQ6OLp_mfYukFMC7tlBKDfYa8Eugxoj164BwTfeTg | | project_id | 667d2c1d9fca46a690b830e6864580c9 | | user_id | 09a752a6b18d48f2ae1f472599e94c5a | +------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
到这里,keystone部署完毕
总结
到这里,我们就已经完成了对keystone的部署,那么接下来就是镜像服务Glance,那么今天的学习就到这里啦,明天再见了。
最后我们来听歌放松一下吧
{music id="433059656" color="#b922b4" /}