新建 Markdown File (2)

God_ZY發表於2020-12-16

Keystone身份服務

  • Keystone(OpenStack Identity Swrvice)是OpenStack中的一個獨立的提供安全認證的模組,主要負責openstack使用者的身份認證,令牌管理,提供訪問資源的服務目錄,以及基於使用者腳色的訪問控制。
  • Keystone類似一個服務匯流排,或者說是整個OpenStack框架的登錄檔,其他服務通過keystone來註冊其服務的Endpoint(服務訪問的URL),任何服務之間相互的呼叫,需要經過Keystone的身份驗證來獲得目標服務的Endpoint來找到目標服務

主要功能:

  • 身份認證(Authentication):令牌的發放和效驗
  • 使用者授權(Authorization):授予使用者在一個服務中所擁有許可權
  • 使用者管理(Account):管理使用者賬戶
  • 服務目錄(Service Catalog):提供可用服務的API端點

Keystone管理物件:

Users:表示API的一個特定使用者,屬於一個指定的domain。可以賦予user許可權(role),每一個user-domain或user-project都可以有一組許可權。

Groups:表示一組擁有某許可權的使用者,屬於一個指定的domain。可以賦予group特定的role,此時group內的user都自動具備該role表示的許可權。

Credentials:與user關聯的認證憑據。一個user可能有一個或多個credential,一個credential與某一個project關聯。

Projects:在OpenStack中表示一組資源(也就Folsom版本的Tenants,Tenant概念在G版被廢棄),一個project屬於某一個domain。

Domains:表示一組projects和users的集合。每一個project或user只能屬於一個domain,但user可以屬於多個projects。domain有名稱空間的概念,即在一個名稱空間內的名稱是否是全域性唯一。

Roles:角色,表示一組在project或domain範圍內允許的操作。

Services:表示一類服務。

Endpoints:表示服務的URL。

Tokens:表示認證使用者的標識,有認證服務生成。沒有token的資源URL,token的使用是在X-Auth-Token和X-Subject-Token頭部

Keystone 認證流程

image-20201214084548582

此圖為虛擬機器建立過程圖

元件元件包括:user、keystone、nova、glance、neutron虛擬機器建立必備元件,keystone全域性認證完後,nova獲取資源,nova通過排程演算法將資源排程到裸金屬上(排程演算法:資源集合,根據演算法或者打分機制,根據權重分配到後端最高的節點)

  • 使用者通過命令列或者horizon控制皮膚的方式登入openstack,憑藉自己的證照(credentials)給keystone驗證。
  • Keystone對使用者的證照驗證,驗證通過則會釋出一個令牌(token)和使用者所需服務的位置點(endpoint)給使用者。使用者得到了位置點(endpoint)之後,攜帶自己的令牌,向nova發起請求,請求建立虛擬機器。nova會拿著使用者的token向keystone進行認證,看是否允許使用者執行這樣的操作。
  • keystone認證通過之後,返回給nova,nova即開始執行建立虛擬機器的請求。首先需要映象資源,nova帶著令牌(token)和所需要的映象名向glance提出映象資源的請求。
  • glance會拿著token去向keystone進行認證,看是否允許提供映象服務。keystone認證成功後,返回給glance。glance向nova提供映象服務。
  • 建立虛擬機器還需要網路服務,nova攜帶token向neutron傳送網路服務的請求
  • neutron拿著nova給的token向keystone進行認證,看是否允許向其提供網路服務。keystone認證成功後,返回給nuetron。nuetron則給nova提供網路規劃服務。
  • 網路服務。keystone認證成功後,返回給nuetron。nuetron則給nova提供網路規劃服務。
  • nova獲取了映象和網路之後,開始建立虛擬機器,通過hypervisior可呼叫底層硬體資源進行建立。建立完成返回給使用者,成功執行了使用者的請求。

部署

部署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節點接收訊息並建立虛擬機器;

OpenStack元件安裝的順序

  1. Keystone(apache)
  2. glance
  3. nova
  4. neutron

使用手動部署的模式搭建OpenStack的思路:

  1. 分模組部署
  2. 部署keystone模組的基礎環境(下載依賴包、元件包、第三方工具/外掛)
  3. 建立、開啟此模組的功能(以keystone為例,建立並初始化認證資料庫、修改配置檔案、初始化金鑰-fernet格式、配置身份認證服務)
  4. 驗證

建立資料庫例項和資料庫使用者

[root@ct ~]# mysql -u root -p
MariaDB [(none)]> create database keystone;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'KEYSTONE_DBPASS';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'KEYSTONE_DBPASS';
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> exit

安裝keystone、httpd、mod_wsgi

#mod_wsgi包的作用是讓apache能夠代理pythone程式的元件;openstack的各個元件,包括API都是用python寫的,但訪問的是apache,apache會把請求轉發給python去處理,這些包只安裝在controler節點

[root@ct ~]# yum -y install openstack-keystone httpd mod_wsgi

[root@ct ~]# cp -a /etc/keystone/keystone.conf{,.bak}

[root@ct ~]# grep -Ev "^$|#" /etc/keystone/keystone.conf.bak > /etc/keystone/keystone.conf
#通過pymysql模組訪問mysql,指定使用者名稱密碼、資料庫的域名、資料庫名

[root@ct ~]# openstack-config --set /etc/keystone/keystone.conf database connection mysql+pymysql://keystone:KEYSTONE_DBPASS@ct/keystone
#指定token的提供者;提供者就是keystone自己本身

[root@ct ~]# openstack-config --set /etc/keystone/keystone.conf token provider fernet
Fernet:一種安全的訊息傳遞格式

初始化認證服務資料庫

[root@ct ~]# su -s /bin/sh -c "keystone-manage db_sync" keystone

初始化fernet 金鑰儲存庫(以下命令會生成兩個金鑰,生成的金鑰放於/etc/keystone/目錄下,用於加密資料)

[root@ct keystone]# keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
[root@ct keystone]# keystone-manage credential_setup --keystone-user keystone --keystone-group keystone

配置bootstrap身份認證服務

[root@ct ~]# 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提供認證的埠 
#需要在haproxy伺服器上新增一條listen 
#各種網路的url需要指定controler節點的域名,一般是haproxy的vip的域名(高可用模式)

配置Apache HTTP伺服器

[root@ct ~]# echo "ServerName controller" >> /etc/httpd/conf/httpd.conf

建立配置檔案

#安裝完mod_wsgi包後,會生成 wsgi-keystone.conf 這個檔案,檔案中配置了虛擬主機及監聽了5000埠,mod_wsgi就是python的閘道器
[root@ct ~]# ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/

開啟服務

[root@ct conf.d]# systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
[root@ct conf.d]# systemctl start httpd

配置管理員賬戶的環境變數

#這些環境變數用於建立角色和專案使用,但是建立角色和專案需要有認證資訊,所以通過環境變數宣告使用者名稱和密碼等認證資訊,欺騙openstack已經登入且通過認證,這樣就可以建立專案和角色;也就是把admin使用者的驗證資訊通過宣告環境變數的方式傳遞給openstack進行驗證,實現針對openstack的非互動式操作

[root@ct ~]# 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
[root@ct ~]# source ~/.bashrc

通過配置環境變數,可以使用openstack命令進行一些操作,示例:

[root@ct ~]# openstack user list

建立OpenStack 域、專案、使用者和角色

● 建立一個專案(project),建立在指定的domain(域)中,指定描述資訊,project名稱為service(可使用openstack domain list 查詢)
[root@ct ~]# openstack project create --domain default --description "Service Project" service 

● 建立角色(可使用openstack role list檢視)
[root@ct ~]# openstack role create user

● 檢視openstack 角色列表
[root@ct ~]# openstack role list
# admin為管理員
# member為 租戶
# user:使用者

● 檢視是否可以不指定密碼就可以獲取到token資訊(驗證認證服務)
[root@ct ~]#  openstack token issue

Keystone 元件是作為OpenStack 叢集中統一認證、授權的模組,其核心功能就是針對於User(使用者)、Tenant(租戶)、Role(角色)、Token(令牌/憑證)的控制(手工編譯部署即圍繞此功能展開的)

  • User:使用 openstack 的使用者。
  • Tenant:租戶,可以理解為一個人、專案或者組織擁有的資源的合集。在一個租戶中可以擁有很多個使用者,這些使用者可以根據許可權的劃分使用租戶中的資源。
  • Role:角色,用於分配操作的許可權。角色可以被指定給使用者,使得該使用者獲得角色對應的操作許可權。
  • Token:指的是一串位元值或者字串,用來作為訪問資源的記號。Token 中含有可訪問資源的範圍和有效時間,token 是使用者的一種憑證,需要使用正確的使用者名稱和密碼向 Keystone 服務申請才能得到 token。

相關文章