一 認證服務
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',上面的'可以不用操作'
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' --->'只是隨機數生成的方法'而已-->https://www.cnblogs.com/omgasw/p/12157160.html
在"[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
編輯"/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
端口檢查
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