Keystone

  • 根据上一篇Openstack的基础环境继续部署
  • Keystone身份服务
  • 主要功能
  • 管理对象
  • 认证流程
  • 部署Keystone


根据上一篇Openstack的基础环境继续部署

Keystone身份服务

Keystone是OpenStack中的一个独立的提供安全认证的模块,主要负责openstack用户的身份认证、令牌管理、提供访问紫云阿德服务目录以及基于用户脚色访问控制。且任何服务之间相互的调用,都需要经过keystone的认证

主要功能

  • 身份认证(Authentication):令牌的发放和校验
  • 用户授权(Authorization):授权用户在一个服务中所拥有的权限
  • 用户管理(Account):管理用户账户
  • 用户目录(Service Catalog):提供可用服务的API端口

管理对象

  • User:使用OpenStack service的用户
  • Project:可以理解为一个人或者服务所拥有的资源集合
  • Role:用于划分权限,通过user指定role,使user获得role对应的操作权限
  • Authentication:确定用户身份的过程
  • Token:是一个字符串表示,作为访问资源的令牌,token包含了在指定范围和有效期内,可以被访问的资源
  • Credentials:用于确认用户身份的凭证,用户的用户名和密码,或者是用户名和API密钥,或者身份管理服务提供的认证令牌
  • Service:openstack service,即openstack中运行的组件服务,如nova、swift/glance/neutron/cinder等。
  • Endpoint:一个可以通过网络来访问和定位某个Openstack service的地址,通常是一个URL。

认证流程

openstack Keystone 服务重启 openstack keystone原理_mysql


假设我现在需要创建虚拟机,首先我通过用户通过命令行或者控制台登录,首先向keystone申请,keystone会返回令牌和url。在keystone验证成功之后,用户创建虚拟机(nova是核心),nova收到用户的创建虚拟机的请求后,首先并不会直接去理用户,nova会拿着user的令牌向keystone认证,是否可用,keystone认证成功。同时nova会调用所需要的镜像资源、网络资源。nova讲资源整合后,创建虚拟机,创建完成成功与否,运会返回结果给用户,给与一段报告信息。且调用过程都需要相应组件经过keystone认证后才可调用。

部署Keystone

  • 创建数据库实例和数据库用户
[root@ct my.cnf.d]# mysql -u root -p     
Enter password: 

MariaDB [(none)]> create database keystone;       //创建库
Query OK, 1 row affected (0.001 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'KEYSTONE_DBPASS';             //给权限
Query OK, 0 rows affected (0.003 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'KEYSTONE_DBPASS';
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]> flush privileges;        //刷新权限列表
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]> exit
Bye
  • 安装keystone,数据库、Apache
[root@ct ~]# yum -y install openstack-keystone httpd mod_wsgi   //mod_wsgi包的作用是让apache能够代理python程序的组件;openstack的各个组件,包括API都是用python写的,但访问的是apache,apache会把请求转发给python去处理,这些包只安装在controler节点
[root@ct ~]# cp -a /etc/keystone/keystone.conf{,.bak}    
[root@ct ~]# grep -Ev "^$|#" /etc/keystone/keystone.conf.bak > /etc/keystone/keystone.conf //过滤空格或#开头内容,并将内容覆盖到配置文件中 

[root@ct ~]#  openstack-config --set /etc/keystone/keystone.conf database connection mysql+pymysql://keystone:KEYSTONE_DBPASS@ct/keystone      //通过pymysql模块访问mysql,指定用户密码、数据库的域名和数据库名

[root@ct ~]# openstack-config --set /etc/keystone/keystone.conf token provider fernet  //指定token的提供者;提供者就是keystone自己本身

[root@ct ~]# su -s /bin/sh -c "keystone-manage db_sync" keystone   //初始化认证服务数据库


- 初始化fernet 密钥存储库(会生成两个密钥,生成的密钥放于/etc/keystone/目录下,用于加密数据)
[root@ct ~]# keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
[root@ct ~]# keystone-manage credential_setup --keystone-user keystone --keystone-group keystone

- 配置bootstrap身份认证服务
[root@ct ~]# keystone-manage bootstrap --bootstrap-password ADMIN_PASS \
> --bootstrap-admin-url http://ct:5000/v3/ \        //管理网
> --bootstrap-internal-url http://ct:5000/v3/ \         //内网
> --bootstrap-public-url http://ct:5000/v3/ \        //公共网络
> --bootstrap-region-id RegionOne         //指定一个区域名称

keystone-manage bootstrap --bootstrap-password ADMIN_PASS \
> --bootstrap-admin-url http://ct:5000/v3/ \
> --bootstrap-internal-url http://ct:5000/v3/ \
> --bootstrap-public-url http://ct:5000/v3/ \
> --bootstrap-region-id RegionOne
  • Apache
[root@ct ~]# echo "ServerName controller" >> /etc/httpd/conf/httpd.conf
[root@ct keystone]#  ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/
[root@ct keystone]# systemctl start httpd
[root@ct keystone]# netstat -antp | grep 80
tcp        0      0 127.0.0.1:2380          0.0.0.0:*               LISTEN      31410/etcd          
tcp6       0      0 :::80                   :::*                    LISTEN      49485/httpd
  • 配置管理员账户的环境变量
[root@ct keystone]# cat >> ~/.bashrc << EOF
> export OS_USERNAME=admin       //控制台登录用户名
> export OS_PASSWORD=ADMIN_PASS       //控制台登录密码
> 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
[root@ct keystone]# source ~/.bashrc
[root@ct ~]# openstack user list
+----------------------------------+-------+
| ID                               | Name  |
+----------------------------------+-------+
| 5dae77e2ade54bf68f1bed3efd38183f | admin |
+----------------------------------+-------+
  • 创建Openstack域、项目、用户和角色
[root@ct ~]# openstack project create --domain default --description "Service Project" service          //创建一个项目(project),创建在指定的domain(域)中,指定描述信息,project名称为service
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | Service Project                  |
| domain_id   | default                          |
| enabled     | True                             |
| id          | 3b59e26cb5784573b6ef5c8a10cc79f4 |
| is_domain   | False                            |
| name        | service                          |
| options     | {}                               |
| parent_id   | default                          |
| tags        | []                               |
+-------------+----------------------------------+
[root@ct ~]# openstack domain list     //查询
+---------+---------+---------+--------------------+
| ID      | Name    | Enabled | Description        |
+---------+---------+---------+--------------------+
| default | Default | True    | The default domain |
+---------+---------+---------+--------------------+



[root@ct ~]# openstack role create user  //创建角色
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | None                             |
| domain_id   | None                             |
| id          | e7ad857d658e4eba886be91989e08967 |
| name        | user                             |
| options     | {}                               |
+-------------+----------------------------------+
[root@ct ~]# openstack role list    //查询
+----------------------------------+--------+
| ID                               | Name   |
+----------------------------------+--------+
| 3490cb8b607a4779862b5e50552c5369 | member |
| 5530562031bb4e5ca3a88b8e7c4ef38b | reader |
| e501ee7a487b4822a4e5b59af40b024d | admin  |
| e7ad857d658e4eba886be91989e08967 | user   |




[root@ct ~]# openstack token issue  //查询是否可以不指定密码可以获取到token信息
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field      | Value                                                                                                                                                                                   |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| expires    | 2021-08-24T06:51:25+0000                                                                                                                                                                |
| id         | gAAAAABhJIjdkwhEp0kJgw75uvXjPYxSnkEM4jrQQzpJTJm1QsVQJ_Bq0JlKbYLmbdEYrbZlmSSSUJfs-TKlYBHU4xkV7p4ec2Y8Ww0hJcVtqDnlMoPvwN5GyslXBEqqGtTqBFrzvGatwX1mWAzJX8nRPyWK-ZShp3QiFNKfJZfKB_DuuojfQ6g |
| project_id | 1d887fccaddf40818980612ce7a900e9                                                                                                                                                        |
| user_id    | 5dae77e2ade54bf68f1bed3efd38183f                                                                                                                                                        |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+