Keystone 安裝與設定

OpenStack 的 Keystone 提供了身份驗證服務,透過單點整合用於管理驗證、授權與服務目錄,來提升服務的使用安全。

提醒! 以下操作將一律在 Controller 進行。

安裝前準備

在開始安裝前,要預先建立一個資料庫給 Keystone 儲存相關資訊,使用以下指令建立資料庫:

$ mysql -u root -p

P.S. 若無法登入的話,請進入 root 底下執行該指令修改:

$ mysql -u root
use mysql;
update user set password=PASSWORD("passwd") where User='root';
GRANT ALL PRIVILEGES ON root.* TO 'root'@'localhost' IDENTIFIED BY 'passwd';

透過以下命令用來更新現有帳號資料或建立 Keystone 資料庫:

CREATE DATABASE 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可以隨需求修改。

套件安裝與設定

由於 Eventlet 將在後續版本被棄用,所以在安裝 Keystone 之前要手動設定服務在安裝完與開機時不自動啟動:

$ echo "manual" | sudo tee /etc/init/keystone.override
manual

在 Kilo 與 Liberty 版本中, Keystone 專案棄用了 Eventlet Networking,因此本教學將使用 Apache2 mod_wsgi 來提供身份證認服務,這邊預設下將佔用到 5000 與 35357 Port。因此在安裝 Keystone 時將停用原生服務。而在 Mitaka 版本將正式移除 Eventlet。

確認關閉自動啟動 Keystone 後,就可以直接安裝套件,透過以下指令安裝:

$ sudo apt-get install keystone apache2 libapache2-mod-wsgi

安裝完後,編輯/etc/keystone/keystone.conf設定檔,在[DEFAULT]部分修改使用以下方式:

[DEFAULT]
admin_token = 21d7fb48086e09f30d40be5a5e95a7196f2052b2cae6b491

[database]部分修改使用以下方式:

[database]
# connection = sqlite:////var/lib/keystone/keystone.db
connection = mysql+pymysql://keystone:[email protected]/keystone

[memcache]部分加入以下內容:

[memcache]
servers = 10.0.0.11:11211

[token]部分加入以下內容:

[token]
provider = fernet

完成後,透過 Keystone 管理指令來同步資料庫建立資料表:

$ sudo keystone-manage db_sync

接著初始化 fernet keys:

$ sudo keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
2016-10-07 09:21:28.824 4953 INFO keystone.common.fernet_utils [-] key_repository does not appear to exist; attempting to create it
...

$ sudo keystone-manage credential_setup --keystone-user keystone --keystone-group keystone
2016-10-07 09:21:44.854 4963 INFO keystone.common.fernet_utils [-] key_repository does not appear to exist; attempting to create it
...

最後引導身份認證服務:

$ sudo keystone-manage bootstrap --bootstrap-password passwd \
--bootstrap-admin-url http://10.0.0.11:35357/v3/ \
--bootstrap-internal-url http://10.0.0.11:35357/v3/ \
--bootstrap-public-url http://10.0.0.11:5000/v3/ \
--bootstrap-region-id RegionOne

這邊ADMIN_PASS可以隨需求修改。

設定 Apache HTTP 伺服器

由於本教學採用 WSGI Mod 來提供 Keystone 服務,因此我們將使用到 Apache2 來建立 HTTP 服務,首先編/etc/apache2/apache2.conf 加入以下內容:

ServerName 10.0.0.11

接著建立一個設定檔/etc/apache2/sites-available/keystone.conf來提供 Keystone 服務,並加入以下內容(預設安裝即存在):

Listen 5000
Listen 35357

<VirtualHost *:5000>
    WSGIScriptAlias / /usr/bin/keystone-wsgi-public
    WSGIDaemonProcess keystone-public processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP}
    WSGIProcessGroup keystone-public
    WSGIApplicationGroup %{GLOBAL}
    WSGIPassAuthorization On
    LimitRequestBody 114688

    <IfVersion >= 2.4>
      ErrorLogFormat "%{cu}t %M"
    </IfVersion>

    ErrorLog /var/log/apache2/keystone.log
    CustomLog /var/log/apache2/keystone_access.log combine

    <Directory /usr/bin>
        <IfVersion >= 2.4>
            Require all granted
        </IfVersion>
        <IfVersion < 2.4>
            Order allow,deny
            Allow from all
        </IfVersion>
    </Directory>
</VirtualHost>

<VirtualHost *:35357>
    WSGIScriptAlias / /usr/bin/keystone-wsgi-admin
    WSGIDaemonProcess keystone-admin processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP}
    WSGIProcessGroup keystone-admin
    WSGIApplicationGroup %{GLOBAL}
    WSGIPassAuthorization On
    LimitRequestBody 114688

    <IfVersion >= 2.4>
      ErrorLogFormat "%{cu}t %M"
    </IfVersion>

    ErrorLog /var/log/apache2/keystone.log
    CustomLog /var/log/apache2/keystone_access.log combined

    <Directory /usr/bin>
        <IfVersion >= 2.4>
            Require all granted
        </IfVersion>
        <IfVersion < 2.4>
            Order allow,deny
            Allow from all
        </IfVersion>
    </Directory>
</VirtualHost>

Alias /identity /usr/bin/keystone-wsgi-public
<Location /identity>
    SetHandler wsgi-script
    Options +ExecCGI

    WSGIProcessGroup keystone-public
    WSGIApplicationGroup %{GLOBAL}
    WSGIPassAuthorization On
</Location>

Alias /identity_admin /usr/bin/keystone-wsgi-admin
<Location /identity_admin>
    SetHandler wsgi-script
    Options +ExecCGI

    WSGIProcessGroup keystone-admin
    WSGIApplicationGroup %{GLOBAL}
    WSGIPassAuthorization On
</Location>

P.S. 在新版本中安裝 Apache2 時,會自動建立一個擁有以上內容的檔案,我們只需要透過 Apache2 enable 即可。

確認檔案無誤後,就可以讓 Apache2 使用這個設定檔,透過以下指令:

$ sudo ln -s /etc/apache2/sites-available/keystone.conf /etc/apache2/sites-enabled

完成後就可以重新啟動 Apache2 伺服器:

$ sudo service apache2 restart

最後由於第一次安裝時,預設會建立一個 SQLite 資料庫,因此這邊可以將之刪除:

$ sudo rm -f /var/lib/keystone/keystone.db

建立 Service 與 API Endpoint

在建立 Keystone service 與 Endpoint 之前,要先導入一些環境變數,由於 OpenStack client 會自動抓取系統某些環境變數來提供 API 的存取,首先透過以下指令導入:

export OS_USERNAME=admin
export OS_PASSWORD=passwd
export OS_PROJECT_NAME=admin
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_DOMAIN_NAME=Default
export OS_AUTH_URL=http://10.0.0.11:35357/v3
export OS_IDENTITY_API_VERSION=3

完後上述後,就可以建立 Service 實體來提供身份認證:

$ openstack project create --domain default \
--description "Service Project" service

成功的話,會看到類似以下結果:

+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | Service Project                  |
| domain_id   | default                          |
| enabled     | True                             |
| id          | abf889b4e323489687bf3f00afe9ab62 |
| is_domain   | False                            |
| name        | service                          |
| parent_id   | default                          |
+-------------+----------------------------------+

在後續安裝的 OpenStack 各套件服務都需要建立一個或多個 Service,以及 API Endpoint 目錄。

P.S. 在 Newton 版本中,Keystone 一些操作被簡化了,但是其概念大致不變。

建立 Keystone demo user

身份認證服務會透過 domains、projects、roles 與 Users 組合來進行授權動作。由於 Newton 版本將 admin 在 bootstrap 的時候建立完成了,因此這邊說明建立一個 demo project:

# 建立 demo project
$ openstack project create --domain default \
--description "Demo Project" demo

# 建立 demo User
$ openstack user create --domain default \
--password-prompt demo

# 建立 admin Role
$ openstack role create user

# 加入 Project 與 User 到 admin Role
$ openstack role add --project demo --user demo user

以上指令可以重複的建立不同的 Project 與 User。

驗證服務

在進行其他服務安裝之前,一定要確認 Keystone 服務沒有任何錯誤,首先取消上面導入的環境變數:

unset OS_URL

首先透過以下指令來驗證 admin 可以登入取得當前 token:

$ openstack --os-auth-url http://10.0.0.11:35357/v3 \
--os-project-domain-name default \
--os-user-domain-name default \
--os-project-name admin \
--os-username admin \
token issue

其中 default 是當沒有指定 Domain 時的預設名稱。

成功的話,會看到類似以下結果:

+------------+----------------------------------------------------------------------------------------------------+
| Field      | Value                                                                                              |
+------------+----------------------------------------------------------------------------------------------------+
| expires    | 2016-10-07 10:56:30+00:00                                                                          |
| id         | gAAAAABX93FOv_42CdkIDVr8GoKc3r0ChhA3Rtc37RI-                                                       |
|            | znsCRVucCiU6JxZApUGeEdMYXUVr_VbrvgEbepGH6D3lxHeFY8_Wct8Vc4pgIGqGSKjlAv2K4-L6H-                     |
|            | UraX2JKp6cVbe8jytiEkshzY7G5NmoTwaiCAYz-obBZ6tte7_HykpLVlfNbtE                                      |
| project_id | ba57e6880afe403dbf78f946766df5e0                                                                   |
| user_id    | 15d7a1ff307244c6836d16e2967ca5f9                                                                   |
+------------+----------------------------------------------------------------------------------------------------+

接著驗證是否可以使用 admin 的 API 來取得所有使用者列表:

$ openstack --os-auth-url http://10.0.0.11:35357/v3 \
--os-project-domain-name default \
--os-user-domain-name default \
--os-project-name admin \
--os-username admin \
project list

成功的話,會看到類似以下結果:

+----------------------------------+---------+
| ID                               | Name    |
+----------------------------------+---------+
| 6b3472aa28284861b46dbeddfc91ff60 | demo    |
| abf889b4e323489687bf3f00afe9ab62 | service |
| ba57e6880afe403dbf78f946766df5e0 | admin   |
+----------------------------------+---------+

然後再透 demo 使用者來驗證是否有存取權限,這邊利用 v3 來取得 Token:

$ openstack --os-auth-url http://10.0.0.11:5000/v3 \
--os-project-domain-name default \
--os-user-domain-name default \
--os-project-name demo \
--os-username demo \
token issue

本教學範例密碼為demo

成功的話,會看到類似以下結果:

+------------+----------------------------------------------------------------------------------------------------+
| Field      | Value                                                                                              |
+------------+----------------------------------------------------------------------------------------------------+
| expires    | 2016-10-07 15:56:30+00:00                                                                          |
| id         | gAAAAABX93FOv_42CdkIDVr8GoKc3r0ChhA3Rtc37RI-                                                       |
|            | znsCRVucCiU6JxZApUGeEdMYXUVr_VbrvgEbepGH6D3lxHeFY8_Wct8Vc4pgIGqGSKjlAv2K4-L6H-                     |
|            | UraX2JKp6cVbe8jytiEkshzY7G5NmoTwaiCAYz-obBZ6tte7_HykpLVlfNbtE                                      |
| project_id | ba57e6880afe403dbf78f946766df5e0                                                                   |
| user_id    | 15d7a1ff307244c6836d16e2967ca5f9                                                                   |
+------------+----------------------------------------------------------------------------------------------------+

P.S 這邊會發現使用的 Port 從 35357 轉換成 5000,這邊只是為了區別 Admin URL 與 Public URL 中使用的 Port。

最後再透過 demo 來使用擁有管理者權限的 API:

$ openstack --os-auth-url http://10.0.0.11:5000/v3 \
--os-project-domain-name default \
--os-user-domain-name default \
--os-project-name demo \
--os-username demo \
user list

成功的話,會看到類似以下結果:

You are not authorized to perform the requested action: identity:list_users (HTTP 403)

若上述過程都沒有錯誤,表示 Keystone 目前很正常的被執行中。

使用腳本切換使用者

由於後續安裝可能會切換不同使用者來驗證一些服務,因此可以透過建立腳本來導入相關的環境變數,來達到不同使用者的切換,首先建立以下兩個檔案:

$ touch admin-openrc demo-openrc

編輯 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=passwd
export OS_AUTH_URL=http://10.0.0.11:35357/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2

編輯 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
export OS_AUTH_URL=http://10.0.0.11:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2

完成後,可以透過 Linux 指令來執行檔案導入環境變數,如以下指令:

$ source admin-openrc

也可以使用以下方式來執行檔案:

$ . admin-openrc

完成後,在使用 OpenStack client 就可以省略一些基本參數了,如以下指令:

$ openstack token issue
+------------+----------------------------------------------------------------------------------------------------+
| Field      | Value                                                                                              |
+------------+----------------------------------------------------------------------------------------------------+
| expires    | 2016-10-07 11:10:08+00:00                                                                          |
| id         | gAAAAABX93SAMqmfwMFe2Ke0ASQV0_zVqrQ6VkvTh9tk75LHJeKJ79TTKGxOL6E7rdwrk8UpSaJCNNb-xzBxp2mrwUTOJ1CZbv |
|            | Hzz6MpijVizXrXZyNjhe1IfoKUvVjBNlIQOrjVE0HYRHOKA2DmpXXHnWaGzX_dipJ3oJb0bqf3HbNoscZRnkk              |
| project_id | ba57e6880afe403dbf78f946766df5e0                                                                   |
| user_id    | 15d7a1ff307244c6836d16e2967ca5f9                                                                   |
+------------+----------------------------------------------------------------------------------------------------+

results matching ""

    No results matching ""