Keystone 身份安全认证模块
Keystone 身份安全认证模块
1.Keystone (OpenStack Identity Service)是OpenStack中的一个独立的提供安全认证的模块,主要负责openstack用户的身份认证、令牌管理、提供访问资源的服务目录、以及基于用户角色的访问控制。
2.Keystone类似一个服务总线,或者说是整个Openstack框架的注册表,其他服务通过keystone来注册其服务的Endpoint (服务访问的URL) ,任何服务之间相互的调用,需要经过Keystone的身份验证,来获得目标服务的Endpoint来找到目标服务。
总结:
1.多方式的认证和授极(token) 、提供可访问的资源的集合
2.认证成功之后,会指引lopenstack内部服务/组件的位置
Keystone 模块功能
身份认证(Authentication) :令牌的发放和校验
用户授权(Authorization) :授予用户在一个服务中所拥有权限
用户管理(Account) :管理用户账户
服务目录(Service Catalog) :提供可用服务的APl端点
keystone 相关概念
User:指使用Openstack service的用户。
Project(Tenant):可以理解为一个人、或服务所拥有的资源集合。
Role:用于划分权限。通过给User指定Role,使User获得Role对应操作权限
Authentication:确定用户身份的过程
Token:是一个字符串表示,作为访问资源的令牌。Token包含了在指定范围和有效时间内,可以被访问的资源。
Credentials:用于确认用户身份的凭证。用户的用户名和密码,或者是用户名和API密钥,或者身份管理服务提供的认证令牌。
Service: Openstack service,即Openstack中运行的组件服务。如nova.swift, glance, neutron, cinder等。
Endpoint:一个可以通过网络来访问和定位某个Openstack service的地址,通。常是一个URL
keystone 认证流程
Openstack Keystone 环境部署
部署 openstack 组件
时,需先行安装认证服务(keystone)
,而认证服务是使用 Apache
运行的,安装完成后才可以创建、管理账号,然后安装镜像服务(glance)
、计算服务(nova)
、网络服务(neutron)
其中计算服务
和网络服务
分为管理端
和客户端
,所以需要在openstack 的管理端
安装计算服务和网络服务的管理端
,在创建虚拟机的 node 节点
上安装计算服务和网络服务的客户端
,最后安装 dashboard 服务
,openstack 各种组件
的API
都是通过apache
运行的
openstack 的管理端
负责创建
、管理
虚拟机过程的调度
,通过 openstack 管理端创建虚拟机的相关数据
最终都会记录到 mysql(mariadb)
中
node 节点没有权限往数据库中写数据,只有控制端有权限,并且node 节点
与控制端
通讯是通过rabbitmq 间接通讯
,node 节点会监听 rabbitmq
控制端也会监听 rabbitmq
,控制端把创建虚拟机的指令发送到 rabbitmq
,由监听 rabbitmq 指定队列
的node节点接收消息并创建虚拟机
1.创建数据库实例和数据库用户
mysql -u root -p密码
create database keystone;
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'KEYSTONE_DBPASS';
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'KEYSTONE_DBPASS';
flush privileges;
quit
2.安装、配置keystone、数据库、Apache
安装
keystone
、httpd
、mod_wsgi
mod_wsgi包的作用是让apache能够代理python程序的组件;openstack的各个组件,包括API都是用python写的,但访问的是apache,apache会把请求转发给python去处理,这些包只安装在controler节点
yum -y install openstack-keystone httpd mod_wsgi
cp -a /etc/keystone/keystone.conf{,.bak}
#对原文件创建一个备份
grep -Ev "^$|#" /etc/keystone/keystone.conf.bak > /etc/keystone/keystone.conf
#通过pymysql模块访问mysql,指定用户名密码、数据库的域名、数据库名
openstack-config --set /etc/keystone/keystone.conf database connection mysql+pymysql://keystone:KEYSTONE_DBPASS@ct/keystone
#指定token的提供者;提供者就是keystone自己本身
openstack-config --set /etc/keystone/keystone.conf token provider fernet
#Fernet:一种安全的消息传递格式
3.初始化认证服务数据库
su -s /bin/sh -c "keystone-manage db_sync" keystone
su 命令用于变更为其他使用者的身份,除 root 外,需要键入该使用者的密码。
-s shell 或 --shell=shell 指定要执行的 shell (bash csh tcsh 等),预设值为 /etc/passwd 内的该使用者(USER) shell
4.初始化fernet 密钥存储库
(以下命令会生成两个密钥,生成的密钥放于/etc/keystone/目录下,用于加密数据)
keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
keystone-manage credential_setup --keystone-user keystone --keystone-group keystone
5.配置bootstrap身份认证服务
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 #指定一个区域名称
#此步骤是初始化openstack,会把openstack的admin用户的信息写入到mysql的user表中,以及url等其他信息写入到mysql的相关表中;
#admin-url是管理网(如公有云内部openstack管理网络),用于管理虚拟机的扩容或删除;如果共有网络和管理网是一个网络,则当业务量大时,会造成无法通过openstack的控制端扩容虚拟机,所以需要一个管理网;
#internal-url是内部网络,进行数据传输,如虚拟机访问存储和数据库、zookeeper等中间件,这个网络是不能被外网访问的,只能用于企业内部访问
#public-url是共有网络,可以给用户访问的(如公有云) #但是此环境没有这些网络,则公用同一个网络
#5000端口是keystone提供认证的端口
`以下部分指的是openstack多节点的配置`
`#需要在haproxy服务器上添加一条listen`
`#各种网络的url需要指定controler节点的域名,一般是haproxy的vip的域名(高可用模式)`
6.配置Apache HTTP服务器
echo "ServerName controller" >> /etc/httpd/conf/httpd.conf
7.创建配置文件
#安装完mod_wsgi包后,会生成 wsgi-keystone.conf 这个文件,文件中配置了虚拟主机及监听了5000端口,mod_wsgi就是python的网关
ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/
8.开启httpd服务
systemctl enable httpd
systemctl start httpd
9.配置管理员账户的环境变量
#这些环境变量用于创建角色和项目使用,但是创建角色和项目需要有认证信息,所以通过环境变量声明用户名和密码等认证信息,欺骗openstack已经登录且通过认证,这样就可以创建项目和角色;也就是把admin用户的验证信息通过声明环境变量的方式传递给openstack进行验证,实现针对openstack的非交互式操作
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
source ~/.bashrc
`export OS_USERNAME=admin #控制台登陆用户名`
`export OS_PASSWORD=ADMIN_PASS #控制台登陆密码`
#通过配置环境变量,可以使用openstack命令进行一些操作,示例:
openstack user list
创建OpenStack 域、项目、用户和角色
#创建一个项目(project),创建在指定的domain(域)中,指定描述信息,project名称为service(可使用openstack domain list 查询)
openstack project create --domain default --description "Service Project" service
#创建角色(可使用openstack role list查看)
openstack role create user
#查看openstack 角色列表
openstack role list
#admin为管理员
#member为租户
#user:用户
#查看是否可以不指定密码就可以获取到token信息(验证认证服务)
openstack token issue
小结
Keystone 组件是作为OpenStack 集群中统一认证、授权的模块,其核心功能就是针对于User(用户)、Tenant(租户)、Role(角色)、Token(令牌/凭证)的控制(手工编译部署即围绕此功能展开的)
User:使用 openstack 的用户。
Project/Tenant:租户,可以理解为一个人、项目或者组织拥有的资源的合集。在一个租户中可以拥有很多个用户,这些用户可以根据权限的划分使用租户中的资源。
Role:角色,用于分配操作的权限。角色可以被指定给用户,使得该用户获得角色对应的操作权限。
Token:指的是一串比特值或者字符串,用来作为访问资源的记号。Token 中含有可访问资源的范围和有效时间,
token 是用户的一种凭证,需要使用正确的用户名和密码向 Keystone 服务申请才能得到 token。
`使用手动部署的模式搭建OpenStack的思路:
1、分模块部署
2、部署keystone模块的基础环境(下载依赖包、组件包、第三方工具/插件)
3、创建、开启此模块的功能(以keystone为例,创建并初始化认证数据库、修改配置文件、初始化密钥-fernet格式、配置身份认证服务)
4、验证`