1. 程式人生 > >OpenStack核心組件原理與應用之Keystone

OpenStack核心組件原理與應用之Keystone

安全 creat 支持 mat 文件 授權 efault local code

認證服務介紹

在 OpenStack核心組件原理與應用一文中,我們介紹了OpenStack的架構及安裝前的準備工作,這篇我們來完成 OpenStack 第一個服務——認證服務的部署。
上篇“服務與項目名稱對照表”中,認證服務的 Service 名字為“Identity Service”,項目名稱為“Keystone”,主要功能是為 OpenStack 集群中的其他組件提供認證和授權服務。它能列出所有 OpenStack 服務的端點目錄。其它服務將身份認證服務當做通用的統一 API 來使用,所以 Identity Service 是需要最先部署的組件。為了從 Identity Service 服務中獲益,其他的 OpenStack 服務需要與它合作。當某個 OpenStack 服務收到來自用戶的請求時,該服務詢問 Identity 服務,驗證該用戶是否有權限進行此次請求。

Identity Service 包含的組件:

  • 服務器:一個中心化的服務器使用 RESTful 接口來提供認證和授權服務。
  • 驅動:驅動或服務後端被整合進集中式服務器中。它們被用來訪問 OpenStack 外部倉庫的身份信息, 並且它們可能已經存在於 OpenStack 被部署在的基礎設施(例如,上篇中已經安裝的 MariaDB 數據庫或 LDAP 服務器)中。
  • 模塊:中間件模塊運行於使用身份認證服務的 OpenStack 組件的地址空間中。這些模塊攔截服務請求,取出用戶憑據,並將它們送入中央服務器尋求授權。中間件模塊和OpenStack組件間的整合使用 Python Web 服務器網關接口。

當安裝 OpenStack 身份服務,用戶必須將之註冊到其 OpenStack 安裝環境的每個服務,身份服務才可以追蹤那些已經在 OpenStack 中安裝的服務,並在網絡中定位它們。

安裝和配置

這一章描述如何在控制節點上安裝和配置 OpenStack 身份認證服務,代碼名稱為 keystone,以下操作均在控制節點上完成。出於性能原因,這裏配置部署 Fernet 令牌和 Apache HTTP 服務處理請求。
在配置 OpenStack 身份認證服務前,必須創建一個數據庫和管理員令牌。
1.創建數據庫:

[root@ct1 ~]# mysql -u root -p
MariaDB [(none)]> create database keystone;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO ‘keystone‘@‘localhost‘ IDENTIFIED BY ‘KEYSTONE_DBPASS‘;    #將KEYSTONE_DBPASS改為數據庫的真實密碼,以下也是。
MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO ‘keystone‘@‘%‘ IDENTIFIED BY ‘KEYSTONE_DBPASS‘;
MariaDB [(none)]> flush privileges;

2.生成一個隨機值在初始化的配置中作為管理員的令牌

[root@ct1 ~]# openssl rand -hex 10

3.安裝並配置組件

[root@ct1 ~]# yum -y install openstack-keystone httpd mod_wsgi
[root@ct1 ~]# vim /etc/keystone/keystone.conf
[DEFAULT]
admin_token = ADMIN_TOKEN   #openssl rand –hex 10 命令生成的隨機值
[database]
connection = mysql+pymysql://keystone:[email protected]/keystone
[token]  #配置Fernet UUID令牌的提供者
provider = fernet
[root@ct1 ~]# su –s /bin/sh –C “keystone-manage db_sync” keystone #初始化身份認證服務的數據庫,可以通過 tail -f /var/log/keystone/keystone.log 查看初始化日誌
[root@ct1 ~]# keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone  #初始化Fernet keys

4.配置 HTTP 服務

[root@ct1 ~]# vim /etc/httpd/conf/httpd.conf
ServerName ct1.vtlab.io
[root@ct1 ~]# vim /etc/httpd/conf.d/wsgi-keystone.conf
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>

#啟動服務
[root@ct1 ~]# systemctl enable httpd.service
[root@ct1 ~]# systemctl start httpd.service

5.創建服務實體和API端點
身份認證服務提供其他服務的目錄和位置。每個添加到 OpenStack 中的服務在目錄中需要一個 service 實體和一些 API endpoints 。
默認情況下,身份認證服務數據庫不包含支持傳統認證和目錄服務的信息。你必須為身份認證服務創建的臨時身份驗證令牌用來初始化服務實體和API端點。
你必須使用 "--os-token" 參數將認證令牌的值傳遞給:command:openstack 命令。類似的,你必須使用"--os-url" 參數將身份認證服務的 URL傳遞給 OpenStack 命令或者設置OS_URL環境變量。本指南使用環境變量以縮短命令行的長度。
a.設置令牌環

[root@ct1 ~]# export OS_TOKEN=ADMIN_TOKEN
#將ADMIN_TOKEN換為之前生成的認證令牌,例如:
[root@ct1 ~]# export OS_TOKEN=294a4c8a8a475f9b9836

b.配置端點URL

[root@ct1 ~]# export OS_URL=http://ct1.vtlab.io:35357/v3

c.配置認證 API 版本

[root@ct1 ~]# export OS_IDENTITY_API_VERSION=3

d.創建服務實體,在OpenStack 環境中,認證服務管理服務目錄。服務使用這個目錄來決定環境中的可用服務

[root@ct1 ~]# openstack service create --name keystone --description "OpenStack Identity" identity

e.創建認證服務的API端點,身份認證服務管理了與整個環境相關的 API 端點和目錄。服務使用這個目錄來決定如何與環境中的其他服務進行通信。
API 端點有三種:admin、internal、public
默認情況下,admin api 端點允許修改用戶和租戶,public 和 internal api 不允許這些操作。

[root@ct1 ~]# openstack endpoint create --region RegionOne identity public http://ct1.vtlab.io:5000/v3
[root@ct1 ~]# openstack endpoint create --region RegionOne identity internal http://ct1.vtlab.io:5000/v3
[root@ct1 ~]# openstack endpoint create --region RegionOne identity admin http://ct1.vtlab.io:35357/v3

每個添加到OpenStack環境中的服務要求一個或多個服務實體和三個認證服務中的API 端點。

6.創建域、項目、用戶和角色
a.創建域 "default"

[root@ct1 ~]# openstack domain create --description "Default Domain" default

b.為進行管理操作,創建 admin 項目、用戶和角色

[root@ct1 ~]# openstack project create --domain default --description "Admin Project" admin
[root@ct1 ~]# openstack user create --domain default --password-prompt admin
[root@ct1 ~]# openstack role create admin
#添加admin角色到admin項目和用戶上。
[root@ct1 ~]# openstack role add --project admin --user admin admin

創建的任何角色必須映射到每個OpenStack服務配置文件目錄下的"policy.json" 文件中。默認策略是給予"admin"角色大部分服務的管理訪問權限。
示例:
本示例演示每個服務都包含的獨有的service項目。創建 service項目:

[root@ct1 ~]# openstack project create --domain default --description "Service Project" service

常規(非管理)任務應該使用無特權的項目和用戶。作為例子,本指南創建 demo 項目和用戶:

a. 創建demo項目:

[root@ct1 ~]# openstack project create --domain default --description "Demo Project" demo

b. 創建demo用戶:

[root@ct1 ~]# openstack user create --domain default --password-prompt demo

c. 創建 user 角色:

[root@ct1 ~]# openstack role create user

d. 添加 user 角色到demo項目和用戶:

[root@ct1 ~]# openstack role add --project demo --user demo user

驗證

在安裝其他服務前,需要確認身份認證服務已正常運行。
在控制節點上執行如下命令:

  1. 因為安全性的原因,關閉臨時認證令牌機制:
    編輯 /etc/keystone/keystone-paste.ini 文件,從[pipeline:public_api]、[pipeline:admin_api]、[pipeline:api_v3]部分刪除 token_auth 字段。
  2. 重置 OS_TOKEN 和 OS_URL 環境變量
    [root@ct1 ~]# unset OS_TOKEN OS_URL
  3. 作為 admin 用戶請求認證令牌:
    [root@ct1 ~]# openstack --os-auth-url http://ct1.vtlab.io:35357/v3 --os-project-domain-name default --os-user-domain-name default --os-project-name admin --os-username admin token issue
  4. 作為 demo用戶請求認證令牌:
    [root@ct1 ~]# openstack --os-auth-url http://ct1.vtlab.io:5000/v3 --os-project-domain-name default --os-user-domain-name default --os-project-name demo --os-username demo token issue

使用5000的API端口,只允許對身份認證服務API的常規訪問,不能進行管理操作

創建OpenStack客戶端環境腳本

前一節中使用環境變量和命令選項的組合通過 "openstack" 客戶端與身份認證服務交互。為了提升客戶端操作的效率,OpenStack 支持簡單的客戶端環境變量腳本即 OpenRC 文件。這些腳本通常包含客戶端所有常見的選項,當然也支持獨特的選項。更多信息,請參考: https://docs.openstack.org/queens/user/
創建 admin、demo 項目和用戶客戶端環境變量腳本。本指南接下來會引用這些腳本為客戶端操作加載合適的的憑證。

[root@ct1 ~]# vim admin-openrc
export OS_PROJECT_DOMAIN_NAME=default
export OS_USER_DOMAIN_NAME=default
export OS_PROJECT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=ADMIN_PASS
export OS_AUTH_URL=http://ct1.vtlab.io:35357/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
#將 ADMIN_PASS替換為認證服務中為admin用戶設置的密碼
[root@ct1 ~]# vim demo-openrc
export OS_PROJECT_DOMAIN_NAME=default
export OS_USER_DOMAIN_NAME=default
export OS_PROJECT_NAME=demo
export OS_USERNAME=demo
export OS_PASSWORD=DEMO_PASS
export OS_AUTH_URL=http://ct1.vtlab.io:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
#將DEMO_PASS替換為認證服務中為demo用戶設置的密碼

加載環境變量腳本:
使用特定租戶和用戶運行客戶端,你可以在運行之前簡單地加載相關客戶端腳本:

  1. 加載 admin-openrc文件來配置身份認證服務的環境變量和 admin項目及用戶證書:
    [root@ct1 ~]# source admin-openrc  #或者 . admin-openrc
  2. 請求認證令牌:
    [root@ct1 ~]# openstack token issue

下期預告

認證服務 Keystone 的部署及基礎應用已經介紹完了,下期來創建我們的鏡像服務。

OpenStack核心組件原理與應用之Keystone