2014年9月19日 星期五

安裝 OpenStack @ Ubuntu 14.04 (2) - 設定 Identity Service (Keystone)

安裝 OpenStack @ Ubuntu 14.04 (2) - 設定 Identity Service (Keystone)

目錄

1、安裝環境說明

  • OS:Ubuntu 14.04 LTS

  • Controller

    • IP:10.0.0.11 / 24
    • Gateway:10.0.0.1
  • Network

    • Management IP:10.0.0.21 / 24 (eth0)
    • Gateway:10.0.0.1
    • Instance Tunnel IP:10.0.1.21 / 24 (eth1)
    • External Interface (eth2)
      • IP:不指定 IP
      • 設定方式如下:(修改 /etc/network/interfaces)

    auto eth2
    iface eth2 inet manual
    up ip link set dev $IFACE up
    down ip link set dev $IFACE down

  • Compute 1

    • Management IP:10.0.0.31 / 24
    • Gateway:10.0.0.1
    • Instance Tunnel IP:10.0.1.31
  • 修改每個 node 的 /etc/hosts 檔案,並加入以下內容:

    10.0.0.11 controller
    10.0.0.21 network
    10.0.0.31 compute1

    • 使用者身分:root

    2、Identity Service 概觀

    Identity Service 在整個 OpenStack 架構中提供了兩項功能:

    1. 認證 &授權
    2. 提供可用服務的 API 服務端點目錄資訊

    Identity Service 提供了 Role-based 的管理概念,並提供傳統的 UserName/Password & Token 的認證方式。

    以下的來自官網的圖,描述了 Identity Service(Keystone) 的完整作業流程:
    Keystone 作業流程

    2.1 重要名詞說明

    Identity Service 有些觀念要先清楚,列出比較容易搞混的:

    2.1.1 Tenant

    tenant 是 identity 服務的操作者用來將特定的 resource 或是 identity objects 區隔。

    每一個 tenant 可能會對應到一個客戶,或是一個帳號,也有可能是一個專案。

    2.1.2 Role

    role 包含了指定功能的使用權限,管理者可以根據不同的 role 給定不同的權限,再將 role 指定給 user,每個 user 可以同時被指定為多個 role 藉以授予系統存取權限。

    Keystone 中已經有一個預設的 Role,名稱為 _member_

    3、安裝 Identity Service

    接著要安裝認證用的服務:

    apt-get -y install keystone

    安裝完一卡車的套件後,這裡先為 keystone 準備儲存認證用的資料庫(MySQL),輸入以下指令:

    # mysql -u root -p
    Enter password: ##########
    
    mysql> create database keystone;
    Query OK, 1 row affected (0.00 sec)
    
    mysql> grant all privileges on keystone.* to 'keystone'@'localhost' identified by 'YOURKEYSTONEDBPASSWORD';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> grant all privileges on keystone.* to 'keystone'@'%' identified by 'YOURKEYSTONEDBPASSWORD';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> exit

    接著修改 keystone 設定,將資料庫指向剛剛建立的 MySQL DB,編輯 /etc/keystone/keystone.conf

    修改 [database] 區段的 connection 設定如下:

    [database]
    connection = mysql://keystone:YOURKEYSTONEDBPASSWORD@controller/keystone

    並移除原本的 SQLite DB:

    rm /var/lib/keystone/keystone.db

    建立認證服務用的資料庫 table:

    su -s /bin/sh -c “keystone-manage db_sync” keystone

    產生 shared secret:

    openssl rand -hex 10

    編輯 keystone 設定(/etc/keystone/keystone.conf),加入以下兩個設定:

    [DEFAULT]
    admin_token = YOUR_SHARED_SECRET   #填入上一個步驟中使用 openssl 指令產生的 shared secret
    log_dir = /var/log/keystone

    重新啟動 keystone 服務:

    service keystone restart

    預設 keystone 的 token 是沒有過期的設定,因此透過以下指令將 token 的過期時間設定為 1 小時:

    (crontab -l -u keystone 2>&1 | grep -q token_flush) || echo ‘@hourly /usr/bin/keystone-manage token_flush >/var/log/keystone/keystone-tokenflush.log 2>&1’ >> /var/spool/cron/crontabs/keystone

    安裝好 Identity Service 之後,接著就要來設定認證相關資訊了。

    4、設定 user / role / tenant

    在建立 user / role / tenant 之前,必須先設定好 OS_SERVICE_TOKEN & OS_SERVICE_ENDPOINT 兩個環境變數,目的是為了以管理者的身分啟用並註冊 Identity Service:

    $ export OS_SERVICE_TOKEN=YOUR_ADMIN_TOKEN
    $ export OS_SERVICE_ENDPOINT=http://controller:35357/v2.0

    4.1 新增 User

    # 新增 user - admin
    $ keystone user-create --name=admin --pass=ADMIN_PASS --email=ADMIN_EMAIL
    
    # 新增 user - demo
    $ keystone user-create --name=demo --pass=DEMO_PASS --email=DEMO_EMAIL

    4.2 新增 Role

    # 新增 role - admin
    $ keystone role-create --name=admin

    Keystone 已經內建 _member_ 為預設 role,之後會將一般的帳號與 _member_ 進行連結。

    4.3 新增 tenant

    最後新增兩個 tenant 類型,分別是管理者(admin)以及一般使用者(demo):

    # 新增 tenant - admin
    $ keystone tenant-create --name=admin --description="Admin Tenant"
    
    # 新增 tenant - demo
    $ keystone tenant-create --name=demo --description="Demo Tenant"

    4.4 將 user / role / tenant 進行連結

    # 將 user(admin) 與 role(admin) & tenant(admin) 連結
    $ keystone user-role-add --user=admin --tenant=admin --role=admin
    
    # 將 user(admin) 與 role(_member_) & tenant(admin) 連結
    $ keystone user-role-add --user=admin --role=_member_ --tenant=admin
    
    # 將 user(demo) 與 role(_member_) & tenant(demo) 連結
    $ keystone user-role-add --user=demo --role=_member_ --tenant=demo

    4.5 設定 OpenStack services 之間用的認證資訊

    同樣的,OpenStack 中不同的 service 也需要 username / role / tenant 來進行認證並存取其他的 service,以下建立 service 用的 username / role / tenant:

    # 建立 service 用 user - service_user
    $ keystone user-create --name=service_user --pass=SERVICE_USER_PASS --email=SERVICE_USER_EMAIL
    
    # 建立 service 用 role
    $ keystone role-create --name=service_role
    
    # 建立 service 用 tenant
    $ keystone tenant-create --name=service --description="Service Tenant"
    
    # 將 user(service_user) 與 role(service_role) & tenant(service) 連結
    $ keystone user-role-add --user=service_user --role=service_role --tenant=service

    5、定義 services & API 服務端點

    之前提過 Identity Service 其中一個重要功能是「提供可用服務的 API 服務端點目錄資訊」,因此安裝好的服務都必須向 Identity Service 註冊,就連 Identity Service 自己也不例外。

    # 註冊 keystone service
    $ keystone service-create --name=keystone --type=identity --description="OpenStack Identity"
    
    # 設定 Identity Service 的 API 服務端點
    $ keystone endpoint-create --service-id=$(keystone service-list | awk '/ identity / {print $2}') --publicurl=http://controller:5000/v2.0 --internalurl=http://controller:5000/v2.0 --adminurl=http://controller:35357/v2.0

    6、驗證 Identity Service 是否安裝成功

    為了確保 Identity Service 安裝正確,首先清除 OS_SERVICE_TOKEN & OS_SERVICE_ENDPOINT 兩個環境變數。

    這兩個環境變數用途只是為了以管理者的身分設定 & 註冊 Identity Service 之用。

    $ unset OS_SERVICE_TOKEN OS_SERVICE_ENDPOINT

    6.1 進行 name-based 認證

    $ keystone --os-username=admin --os-password=YOUR_ADMIN_PASS --os-auth-url=http://controller:35357/v2.0 token-get

    這個指令會取得有效期間為一個小時(上面有設定)的 token,並搭配指定 user 的 id 資訊。

    【註】有 token 資訊表示 Identity Service 正確地被安裝 & 註冊

    6.2 進行 tenant-based 認證

    $ keystone --os-username=admin --os-password=YOUR_ADMIN_PASS --os-tenant-name=admin --os-auth-url=http://controller:35357/v2.0 \
      token-get

    這個指令會取得有效期間為一個小時(上面有設定)的 token,並搭配指定 user & tenant 的 id 資訊。

    【註】有 token 資訊表示 Identity Service 正確地被安裝 & 註冊

    6.3 簡化指令的方式

    看上面這麼一大串指令,看了頭都暈了,其實就是指定了好幾個參數,可以設定一個 bash 檔,指定所需要的環境變數,就可以將指令簡化,建立檔案 admin-openrc.sh,並填入以下內容:

    export OS_USERNAME=admin
    export OS_PASSWORD=YOUR_ADMIN_PASS
    export OS_TENANT_NAME=admin
    export OS_AUTH_URL=http://controller:35357/v2.0

    透過以下指令就可以取得全新的 token:

    $ source admin-openrc.sh
    $ keystone token-get

    最後檢視一下之前設定的 user / role / tenant 是否都有對應正確:

    # 檢視目前的 user 清單 
    $ keystone user-list
    +----------------------------------+--------------+---------+-------------------+
    |                id                |     name     | enabled |       email       |
    +----------------------------------+--------------+---------+-------------------+
    | eb54ed5c89e1411a9db5cadfd825ae42 |    admin     |   True  | admin@example.com |
    | bc1ae50e167f45edb064e582702c5792 |     demo     |   True  | admin@example.com |
    | 877f000de0064ad0a2ef33519af6cc87 | service_user |   True  | admin@example.com |
    +----------------------------------+--------------+---------+-------------------+
    
    # 檢視 role 與 user(admin) 的對應資訊
    $ keystone user-role-list --user admin --tenant admin
    +----------------------------------+----------+----------------------------------+----------------------------------+
    |                id                |   name   |             user_id              |            tenant_id             |
    +----------------------------------+----------+----------------------------------+----------------------------------+
    | 9fe2ff9ee4384b1894a90878d3e92bab | _member_ | afea5bde3be9413dbd60e479fddf9228 | e519b772cb43474582fa303da62559e5 |
    | 5d3b60b66f1f438b80eaae41a77b5951 |  admin   | afea5bde3be9413dbd60e479fddf9228 | e519b772cb43474582fa303da62559e5 |
    +----------------------------------+----------+----------------------------------+----------------------------------+

    7、參考資料

    沒有留言:

    張貼留言