OpenStack模塊之Keystone部署解析

提示:文章寫完後,目錄可以自動生成,如何生成可參考右邊的幫助文檔


前言

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、驗證
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章