提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助檔案
文章目錄
- 前言
- 一 Keystone概述
- 1.1 Keystone身份服務
- 1.2 主要功能
- 1.3 Keystone相關概念
- 1.3.1 管理物件(多元化,管理的物件型別非常豐富)
- 1.4 Keystone認證流程
- 二 openstack架構的keystone組件部署
- 2.1 部署決議
- 2.2 部署準備
- 2.3 部署流程:
- 2.3.1 創建資料庫實體和資料庫用戶
- 2.3.2 安裝、配置keystone、資料庫、Apache
- 2.3.3 對接mysql
- 2.3.4 設定傳遞認證令牌的程序模式加密
- 2.3.5 初始化認證服務資料庫
- 2.3.6 初始化fernet 密鑰存盤庫
- 2.3.7 配置bootstrap身份認證服務
- 2.3.8 配置Apache HTTP服務器
- 2.3.9.配置管理員賬戶的環境變數
- 2.3.10 創建OpenStack 域、專案、用戶和角色
- 2.3.11 查看是否可以不指定密碼就可以獲取到token資訊(驗證認證服務)
- 總結
前言
Keystone在OpenStack中的定位為全域身份服務的驗證授權,其它的服務的API在接收到請求之后會向keystone做一個認證,是否有權限進行操作,如有,按照需求中不同的功能模塊去分發給自己后端的子功能模塊,
宏觀上keystone是一個小型的認證機構,本文會從微觀上講解keystone如何進行授權認證的,
一 Keystone概述
1.1 Keystone身份服務
Keystone(OpenStack Identity Service)是OpenStack中的一個獨立的提供安全認證的模塊,主要負責openstack用戶的身份認證,令牌管理,提供訪問資源的服務目錄,以及基于用戶角色的訪問控制,
決議:1.基本功能:身份認證(職能),認證機制管理(支持多種認證機制,特性),訪問控制(1.權限;2.引導指向),,令牌管理,引導路徑
KeyStone類似一個服務總線,或者說是整個Openstack框架的注冊表,其它服務通過keystone來注冊其服務的Endpoint(服務訪問的URL),任何服務之間相互的呼叫,需要經過Keystone的身份驗證,來獲取目標服務的Endpoint來找到目標服務,
決議:keystone知道所有服務(API)的URL路徑,你需要使用的服務所對應的位置(API的URL路徑-->位置點)即可以提供路徑指引服務,前提:已經過身份驗證/權限認證
1.2 主要功能
1.身份認證(Authentication):令牌的發放和效驗
(a.令牌發放,校驗/認證)令牌管理
Auth:授權,權限管理有關
2.用戶授權(Authorization):授予用戶在一個服務中所擁有權限
(b.控制用戶可用授權的權限的范圍和使用期限)
例如:規定只可以到機械學院計算機專業大一02班進行授課,時間為一個星期
3.用戶管理(Account):管理用戶賬戶
c.管理用戶
4.服務目錄(Service Catalog):提供可用服務的API端點
(d.提供所需呼叫/使用的服務對應的API(URL)位置)及授權,鑒權通過后,會指引目標服務的endponit(API-->Web路徑-->URL路徑)具體位置
例如:機械學院8號樓123教室
1.3 Keystone相關概念
1.3.1 管理物件(多元化,管理的物件型別非常豐富)
keystone不僅可以為客戶進行授權,分發令牌,也可以給openstack內部權限進行管理
Endpoint 端點,API的位置
Role 授權角色
User 用戶
Credentials 授權程序
Authentication 授權規則
Token 令牌
Project 專案
Service 服務
相關概念
User(用戶):指使用Openstack service(1.全域 2.核心 3.其它組件)的用戶
Project(專案)(Tenant):可以理解為一個人,或范圍所擁有的資源集合,例如(nova)
Role(角色):用于劃分權限,通過給User指定Role,使User獲得Role對應操作權限
(授予用戶可以使用的權限)
Authenticatin(授權程序):確定用戶身份的程序
Token(令牌);是一個字串表示,作為訪問資源的令牌,Token包含了在指定范圍和有效時間內,可以被訪問的資源
Credenttials:用于確認用戶身份的憑證,用戶的用戶名和密碼,或者是用戶名和API密鑰,或者身份管理服務提供的認證令牌
Service:Openstack service,即Openstack中運行的組件服務,如nova,swift,glance,neutron,cinder等
Endpoint:一個可以通過網路來訪問和定位某個Openstack service的地址,通常是一個URL
1.4 Keystone認證流程
以創建虛擬機為場景來介紹
1.keystone在創建虛擬機的程序中,對用戶及其他組件之間的互動進行認證
2.keystone會頒發令牌并且進行校驗

決議:
user---》keystone
用戶通過命令列(令牌,密鑰(API密鑰)或horizon(賬號密碼)的方式登錄)
user《---keystone
驗證成功:授權權限,跳轉地址
Token包含可使用權限范圍,使用期限/Endpoint:指定nova API具體地址;控制臺的UI界面,網址
user---》nova
持有令牌+endpoint向nova API發送申請創建虛擬機的請求
keystone《---nova
會向keystone進行認證令牌是否合法,有效,可用
keystone---》nova
認證成功,令牌有效
nova---》glance
nova創建虛擬機需要鏡像服務,持有令牌+Image(申請的鏡像對應的屬性,規格)向glance需求鏡像服務(鏡像本身,源資料資訊)
keystone《---glance
會向keystone進行認證令牌是否合法,有效,可用
keystone---》glance
認證成功,令牌有效,glance處理nova請求
nova《---glance
提供Image(鏡像本身)供給nova
nova---》neutron
nova創建虛擬機需要網路服務,持有令牌+network(所需網路資源所需要的技術,網路資源)向neutron需求網路服務資源
keystone《---neutron
會向keystone進行認證令牌是否合法,有效,可用
keystone---》neutron
認證成功,令牌有效,neutron處理nova請求
nova《---neutron
提供network(網路資源)供給nova
user《---nova
創建虛擬機所需的資源準備完成,開始創建虛擬機,創建完成發送資訊給user用戶,告知虛擬機創建是否成功/失敗
二 openstack架構的keystone組件部署
2.1 部署決議
OpenStack組件安裝的順序
1、Keystone (apache) 認證
2、glance 鏡像
3、nova 計算
4、neutron 網路
部署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節點接收訊息并創建虛擬機;
監聽:使用埠,系結服務,可使用一些功能
2.2 部署準備
配置OpenStack平臺基礎服務
重命名
[root@localhost ~]# hostnamectl set-hostname controller
[root@localhost ~]# su
[root@localhost ~]# hostnamectl set-hostname compute01
[root@localhost ~]# su
[root@localhost ~]# hostnamectl set-hostname compute02
[root@localhost ~]# su
2.3 部署流程:
2.3.1 創建資料庫實體和資料庫用戶
在控制端上
[root@controller ~]# mysql -uroot -p 登錄資料庫
MariaDB [(none)]> create database keystone; 創建keystone庫,存盤相關資料
MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'KEYSTONE_DBPASS';
授權所有權限給keystone庫所有表,用戶keystone在本地,設定密碼keystone_dbpass
MariaDB [(none)]> grant all privileges on keystone.* to 'keystone'@'%' identified by 'keystone_dbpass';
授權所有權限給keystone庫所有表,用戶keystone在所有網段,設定密碼keystone_dbpass
MariaDB [(none)]> flush privileges; 重繪權限
MariaDB [(none)]> exit 退出

2.3.2 安裝、配置keystone、資料庫、Apache
安裝keystone、httpd、mod_wsgi
[root@controller ~]# yum -y install openstack-keystone httpd mod_wsgi
基于安裝centos-release-openstack-train 保證安裝更新openstack版本為最新版本t版安裝openstack-keystone
mod_wsgi包的作用是讓apache能夠代理pythone程式的組件,支持API;openstack的各個組件,包括API都是用python寫的,但訪問的是apache,apache會把請求轉發給python去處理,這些包只安裝在controler節點
[root@controller ~]# cp -a /etc/keystone/keystone.conf{,.bak}
批量將源檔案進行備份
[root@controller ~]# cd /etc/keystone/ 查看復制情況
[root@controller keystone]# ls

[root@controller keystone]# cd
[root@controller ~]# grep -Ev "^$|#" /etc/keystone/keystone.conf.bak > /etc/keystone/keystone.conf 重定向
grep -Ev "^$|#" 空行,被注釋的資料檔案
多排列顯示反向過濾
[root@controller ~]# vi /etc/keystone/keystone.conf

2.3.3 對接mysql
[root@controller ~]# openstack-config --set /etc/keystone/keystone.conf database connection mysql+pymysql://keystone:KEYSTONE_DBPASS@controller/keystone
基于安裝openstack-utils openstack其它util工具,使用openstack-config 工具命令
--set:修改,管理
/etc/keystone/keystone.conf database 修改物件內容欄位
connection mysql+pymysql://keystone:KEYSTONE_DBPASS@controller/keystone
連接 mysql使用python指定用戶名,密碼、資料庫的域名、資料庫名
2.3.4 設定傳遞認證令牌的程序模式加密
[root@controller ~]# openstack-config --set /etc/keystone/keystone.conf token provider fernet
使用openstack-config 工具命令指定token(令牌)的提供者;提供者就是keystone自己本身
Fernet:一種安全的訊息傳遞格式,保證令牌傳遞程序是安全加密的
2.3.5 初始化認證服務資料庫
[root@controller ~]# su -s /bin/sh -c "keystone-manage db_sync" keystone
初始化 使用命令 keystone管理 資料 同步 用戶名
2.3.6 初始化fernet 密鑰存盤庫
以下命令會生成兩個密鑰,生成的密鑰放于/etc/keystone/目錄下,用于加密資料,傳遞令牌的程序
[root@controller ~]# keystone-manage fernet_setup --keystone-user keystone
命令 創建 初始化 用戶
--keystone-group keystone
屬組
[root@controller ~]# keystone-manage credential_setup --keystone-user
憑證
keystone --keystone-group keystone
2.3.7 配置bootstrap身份認證服務
[root@controller ~]# keystone-manage bootstrap --bootstrap-password ADMIN_PASS \
> --bootstrap-admin-url http://controller:5000/v3/ \
> --bootstrap-internal-url http://controller:5000/v3/ \
> --bootstrap-public-url http://controller:5000/v3/ \
> --bootstrap-region-id RegionOne
keystone-manage bootstrap --bootstrap-password
命令 用戶身份 密碼
ADMIN_PASS \
> --bootstrap-admin-url http://controller:5000/v3/ \
管理網路 指定路徑 本地:埠 /v3版本(更新認證機制)
> --bootstrap-internal-url http://controller:5000/v3/ \
私有/內部網路
> --bootstrap-public-url http://controller:5000/v3/ \
公有網路
> --bootstrap-region-id RegionOne 指定一個區域名稱
此步驟是初始化openstack,會把openstack的admin用戶的資訊寫入到mysql的user表中,以及url等其他資訊寫入到mysql的相關表中
admin-url是管理網(如公有云內部openstack管理網路),用于管理虛擬機的擴容或洗掉;如果共有網路和管理網是一個網路,則當業務量大時,會造成無法通過openstack的控制端擴容虛擬機,所以需要一個管理網
internal-url是內部網路,進行資料傳輸,如虛擬機訪問存盤和資料庫、zookeeper等中間件,這個網路是不能被外網訪問的,只能用于企業內部訪問
public-url是公有網路,可以給用戶訪問的(如公有云) 但是此環境沒有這些網路,則公用同一個網路
5000埠是keystone提供認證的埠

針對高可用模式下
需要在haproxy服務器上添加一條listen
各種網路的url需要指定controler節點的域名,一般是haproxy的vip的域名(高可用模式)
2.3.8 配置Apache HTTP服務器
[root@controller ~]# echo "ServerName controller" >> /etc/httpd/conf/httpd.conf
[root@controller ~]# ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/ 創建軟鏈接
安裝完mod_wsgi包后,會生成 wsgi-keystone.conf 這個檔案,檔案中配置了虛擬主機及監聽了5000埠,mod_wsgi就是python的網關
[root@controller ~]# systemctl enable httpd 服務自啟動
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
[root@controller ~]# systemctl start httpd 服務開啟
2.3.9.配置管理員賬戶的環境變數
這些環境變數用于創建角色和專案使用,但是創建角色和專案需要有認證資訊,所以通過環境變數宣告用戶名和密碼等認證資訊,欺騙openstack已經登錄且通過認證,這樣就可以創建專案和角色;也就是把admin用戶的驗證資訊通過宣告環境變數的方式傳遞給openstack進行驗證,實作針對openstack的非互動式操作
[root@controller ~]# 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://controller:5000/v3
> export OS_IDENTITY_API_VERSION=3
> export OS_IMAGE_API_VERSION=2
> EOF
[root@ct ~]# source ~/.bashrc
通過配置環境變數,可以使用openstack命令進行一些操作
[root@controller ~]# openstack user list

2.3.10 創建OpenStack 域、專案、用戶和角色
1.創建一個專案(project),創建在指定的domain(域)中,指定描述資訊,project名稱為service(可使用openstack domain list 查詢)
[root@controller ~]# openstack project create --domain default --description "Service Project" service

2.創建角色(可使用openstack role list查看)
[root@controller ~]# openstack role create user

3.查看openstack 角色串列
[root@controller ~]# openstack role list
+----------------------------------+--------+
| ID | Name |
+----------------------------------+--------+
| 78e33b1152ce47a296fdf0ca29f5acae | reader |
| 9f1251a80f7e48839a39bd1a0a469fc0 | admin |
| ab7be80f8a1d4793803e8b620b64a1e5 | user |
| eb93e255e91a408aa35398503e1b1add | member |
+----------------------------------+--------+
決議;
admin為管理員
member為租戶
user為用戶

2.3.11 查看是否可以不指定密碼就可以獲取到token資訊(驗證認證服務)
[root@controller ~]# openstack token issue

總結
Keystone 組件是作為OpenStack 集群中統一認證、授權的模塊,其核心功能就是針對于User(用戶)、Tenant(租戶)、Role(角色)、Token(令牌/憑證)的控制(手工編譯部署即圍繞此功能展開的)
User:使用 openstack 的用戶,
Tenant:租戶,可以理解為一個人、專案或者組織擁有的資源的合集,在一個租戶中可以擁有很多個用戶,這些用戶可以根據權限的劃分使用租戶中的資源,
Role:角色,用于分配操作的權限,角色可以被指定給用戶,使得該用戶獲得角色對應的操作權限,
Token:(令牌)指的是一串位元值或者字串,用來作為訪問資源的記號,Token 中含有可訪問資源的范圍和有效時間,token 是用戶的一種憑證,需要使用正確的用戶名和密碼向 Keystone 服務申請才能得到 token,
使用手動部署的模式搭建OpenStack的思路:
1、分模塊部署
2、部署keystone模塊的基礎環境(下載依賴包、組件包、第三方工具/插件)
3、創建、開啟此模塊的功能(以keystone為例,創建并初始化認證資料庫、修改組態檔、初始化密鑰-fernet格式、配置身份認證服務)
4、驗證
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/255641.html
標籤:其他
