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。
认证流程
假设我现在需要创建虚拟机,首先我通过用户通过命令行或者控制台登录,首先向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 |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+