一 认证服务
keystone是一个'授权中心','openstack每个服务'要使用keystone进行'管理认证',需要'在每个服务都配置',表明'支持keystone做认证'
'认证表明:' 是系统上的一个'合法用户',但是'权限不确定'
##############分割线##############
在keystone创建的'用户',我都可以授权,'授权可以访问哪些资源',每一个'服务'都变成了'资源'
服务"=="资源
##############分割线##############
认证--->'合不合法',是不是'有效用户,能不能登陆'-->'qq登陆'
授权--->有没有'权限',登陆之后可以'做什么'
#################分割线
三大功能:'认证管理','授权管理','服务目录'
#################分割线
一个中心化的服务器使用'RESTful 接口'来提供认证和授权服务-->'接口的规范'
keystone服务目录
keystone是openstack'独立的服务'(业务拆分),有自己独立的ip和端口
35357'(admin用户访问)'和5000'(普通用户-->guster)',对外提供是http服务
##########分割线##########
'假设':如果keystone不能'做服务目录'的话,使用nova创建虚拟机,需要'其地址';使用glance服务中镜像,需要知道glance地址,才能使用镜像;
'现实':用户'使用'某个opensatck的服务,需要知道它的地址,但用户'记不住'每个服务的地址,'keystone的作用'体现出来了,'只需要记住'keystone地址就可以了
keystone'提供服务目录'的功能-->只要你来访问我'openstack的某个服务'keystone,我就告诉你它'服务'的地址
openstack部分服务的API 表现形式
'name' 'port' 'Resultful Api'
glance: 9292 http://x.x.x.x:9292
nova: 8774 http://x.x.x.x:8774
neutron:9696 http://x.x.x.x:9696
cinder
swift
keystone的交互过程
openstack各个服务'在创建的时候'就在keystone上做'注册',keystone就有'相关服务的记录信息'('有了每个服务的Resultful Api记录');用户后续使用某个服务'例如:glance',keystone就直接告诉其该服务的api地址
#############类比
keystone有点像'大公司的前台('公司的架构很复杂),前台'keystone'知道就可以,告诉我'运维保障部在哪?''负责人是谁?'
'所有的一切设计源自生活'
keystone的功能
(1) '认证管理'
(2) '权限管理'
(3) '服务目录服务管理'
服务安装小技巧
openstack每个服务'安装的小套路',掌握套路!
############'openstack服务的安装步骤'
1)mysql'创库并授权'-->因为'OpenStack每个服务'都是独立的-->在mysql体现为'一个服务'对应一个'独立的数据库'
2)在keystone上'创建用户',并关联角色('授权');角色就是'一堆权限的集合'
3)openstack的'某服务'在keystone上注册API;如果是nova,注册nova API
4)yum安装'该服务'的软件包
5)'修改'服务的'配置文件'
6)'同步数据库'
7)启动服务
############注意
keystone'不遵守'上面的规则;原因:keystone都没有'基础',其它的服务就无法完成
二 安装keystone服务
-- 在配置 OpenStack 身份认证服务前,你必须创建一个'数据库'和'管理员令牌'
-- 数据库进行操作
-- (1)用数据库连接客户端以 root 用户连接到数据库服务器
mysql -u root -p
-- (2)创建 keystone 数据库
CREATE DATABASE keystone;
-- (3)对"keystone"数据库授予恰当的权限:
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' \
IDENTIFIED BY 'KEYSTONE_DBPASS';
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' \
IDENTIFIED BY 'KEYSTONE_DBPASS';
-- 用合适的密码替换 KEYSTONE_DBPASS,退出数据库客户端
继续
-- 生成一个'随机值'在'初始的配置中'作为'管理员的令牌'-->过度的'权限不较大,不安全,keystone启动后,不用了'
keystone不能正常工作之前'没有配置好之前',可以设置一个管理员token,用管理员token实现'上面2)和3)'的操作,用'管理员令牌来实现'
# 产生随即token
openssl rand -hex 10
这里'不用随机数值',用'固定的数值,作为管理员token',上面的'可以不用操作'
wsgi说明
网关协议
http,nginx php fastcgi
http,nginx python wsgi
支持某种语言,需要'安装对应的模块'
安装keystone服务相关的软件包
yum install openstack-keystone httpd mod_wsgi -y
# 全部都是python包
报错解决
Error: Package: python2-oslo-middleware-3.8.1-1.el7.noarch (openstack-mitaka)
Requires: python-jinja2
Error: Package: python2-pysaml2-3.0.2-2.el7.noarch (openstack-mitaka)
Requires: python-zope-interface
Error: Package: python-repoze-who-2.1-1.el7.noarch (epel)
Requires: python-zope-interface
#####################解决策略#####################
'找不到相关的依赖包':https://centos.pkgs.org/
yum install http://mirror.centos.org/centos/7/os/x86_64/Packages/python-jinja2-2.7.2-4.el7.noarch.rpm -y
yum install http://mirror.centos.org/centos/7/os/x86_64/Packages/python-zope-interface-4.0.5-4.el7.x86_64.rpm -y
修改配置文件
'编辑文件' /etc/keystone/keystone.conf 并完成如下动作
配置文件有2000多行-->把'注释(深入研究)'和'空行'过滤
grep -Ev '^$|#' /etc/keystone/keystone.conf
注意该文件的'权限'--> root keystone('用户组')-->'配置文件备份'
################分割线
cp /etc/keystone/keystone.conf{,.bak}
'll /etc/keystone/keystone.conf*'
-rw-r----- 1 root keystone 73101 May 24 2017 /etc/keystone/keystone.conf
-rw-r----- 1 root root 73101 May 3 20:28 /etc/keystone/keystone.conf.bak
# 备份下
grep -Ev '#|^$' /etc/keystone/keystone.conf.bak > /etc/keystone/keystone.conf
################按区域划分,一定要配置在'对应的区域'下面
在"[DEFAULT]"部分,定义'初始管理令牌'的值
[DEFAULT]
...
admin_token = ADMIN_TOKEN
使用前面步骤生成的'随机数替换'ADMIN_TOKEN 值,这里采用上面固定'没有使用随即字符串'
################数据库
在 "[database]" 部分,配置数据库访问
[database]
...
connection = mysql+pymysql://keystone:KEYSTONE_DBPASS@controller/keystone
# 将"KEYSTONE_DBPASS"替换为你为数据库选择的密码-->mysql+pymysql://协议连接mysql
# 告诉-->如何连接数据库-->用什么协议,用户名和密码连接controller主机的keystone数据库
#################令牌
早期的令牌是'pki和uuid' --->'只是随机数生成的方法'而已-->
在"[token]"部分,配置Fernet UUID令牌的提供者'新版本'
[token]
...
provider = fernet
工具包的安装
yum install openstack-utils.noarch -y
用工具来改keystone的配置文件
openstack-config --set /etc/keystone/keystone.conf DEFAULT admin_token ADMIN_TOKEN
openstack-config --set /etc/keystone/keystone.conf database connection mysql+pymysql://keystone:KEYSTONE_DBPASS@controller/keystone
openstack-config --set /etc/keystone/keystone.conf token provider fernet
'语法':openstack-config --set 修改配置文件 那个区域 键 值
openstack-config支持'重复执行'
手动修改和工具修改的md5sum数值对比
[root@controller keystone]# md5sum keystone.conf.bak
'd5acb3db852fe3f247f4f872b051b7a9' keystone.conf.bak
[root@controller keystone]# md5sum keystone.conf
'd5acb3db852fe3f247f4f872b051b7a9' keystone.conf
结果:'手动'和'工具自动化修改'是一样的--->'md5sum 校验 配置文件来看'
提高'自动化效率'和'错误出现'的概率
同步数据库
'初始化' '身份认证服务'的数据库
su -s /bin/sh -c "keystone-manage db_sync" keystone
切换'keystone用户',用sh环境;'-c执行该命令'
'说明:' 如果使用root身份,会产生一些root用户身份的文件,keystone用户无法使用
检测数据库
# 观察是否有输出结果
mysql -u keystone -pKEYSTONE_DBPASS -e 'use keystone;show tables;'
# 如果没有输出结果,看keystone.log的日志
vim /var/log/keystone/keystone.log
-rw-r--r-- 1 keystone keystone 4402 May 3 20:54 /var/log/keystone/keystone.log
通过'该文件的日期'可以看到是su - 执行命令生成的
#########################
报错:'账户和密码不对(数据库无法同步)' --->没有进行mysql_secure'安全初始化'的原因!
初始化Fernet keys
前面的'token区域'指定了'令牌得提供者是fernet',这里要对fernet'进行初始化'
# 执行下面命令之前,对比-->ll /etc/keystone文件前后的变化-->多了一个目录
keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
配置及启动httpd服务
编辑"/etc/httpd/conf/httpd.conf" 文件,配置'ServerName' 选项为控制节点
ServerName controller
# 等价形式--> echo "ServerName controller" >> /etc/httpd/conf/httpd.conf
# sed -i '/#ServerName www.example.com:80/a ServerName controller' /etc/httpd/conf/httpd.conf
##############分割线##############
vim '/etc/httpd/conf.d/wsgi-keystone.conf'
# apache-->多站点-->多虚拟主机
Listen 5000
Listen 35357
<VirtualHost *:5000>
WSGIDaemonProcess keystone-public processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP}
WSGIProcessGroup keystone-public
WSGIScriptAlias / /usr/bin/keystone-wsgi-public
WSGIApplicationGroup %{GLOBAL}
WSGIPassAuthorization On
ErrorLogFormat "%{cu}t %M"
ErrorLog /var/log/httpd/keystone-error.log
CustomLog /var/log/httpd/keystone-access.log combined
<Directory /usr/bin>
Require all granted
</Directory>
</VirtualHost>
<VirtualHost *:35357>
WSGIDaemonProcess keystone-admin processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP}
WSGIProcessGroup keystone-admin
WSGIScriptAlias / /usr/bin/keystone-wsgi-admin
WSGIApplicationGroup %{GLOBAL}
WSGIPassAuthorization On
ErrorLogFormat "%{cu}t %M"
ErrorLog /var/log/httpd/keystone-error.log
CustomLog /var/log/httpd/keystone-access.log combined
<Directory /usr/bin>
Require all granted
</Directory>
</VirtualHost>
# 启动 Apache HTTP 服务并配置其随系统启动:
systemctl enable httpd.service
systemctl start httpd.service
nginx+uwsgi 上搭建keystone
端口检查
80 5000 35357 -->'端口'
创建服务实体和注册API
创建服务实体--->'给服务创建一个名字'
(1)先决条件
######## 配置认证令牌
export OS_TOKEN=ADMIN_TOKEN
将"ADMIN_TOKEN"替换为你在 :doc:`keystone-install`章节中生成的认证令牌'最好固定'
例如:export OS_TOKEN=294a4c8a8a475f9b9836
由于之前固定,不用随机字符串,所以就是'ADMIN_TOKEN'
######## 配置端点URL
export OS_URL=http://controller:35357/v3
######## 配置认证 API 版本
export OS_IDENTITY_API_VERSION=3
######## 检验
'env | grep ^OS'
OS_IDENTITY_API_VERSION=3
OS_TOKEN=ADMIN_TOKEN
OS_URL=http://controller:35357/v3
(2)创建服务实体
'创建服务实体'
openstack service create \
--name keystone --description "OpenStack Identity" identity
# 创建一个服务;服务的名字是 keystone;description是备注描述信息;identity进行认证
(3)注册三条API
'注册API' -->public
openstack endpoint create --region RegionOne \
identity public http://controller:5000/v3
'注册了三条API','注册的域'是 RegionOne;和identify认证服务管理,'类型'是public;'v{number}'可以进行'版本兼容'-->openstack升级,旧的API调用
公共,游客'guest'用的
'服务和服务之间'API的调用地址 -->'internal'
openstack endpoint create --region RegionOne \
identity internal http://controller:5000/v3
'管理员通道' -->'admin'
openstack endpoint create --region RegionOne \
identity admin http://controller:35357/v3
########### 说明
'不同的通道实现不同的权限'
每个添加到OpenStack环境中的服务要求一个或多个服务实体和三个认证服务中的API 注册
查看服务
openstack service list
查看API地址
openstack endpoint list