OpenStack入門篇(七)之認證服務Keystone

1、Keystone的概述

Keystone是Openstack的組件之一,用於爲Openstack家族中的其它組件成員提供統一的認證服務,包括身份驗證,令牌的發放和校驗,服務列表,用戶權限的定義等。Openstack中任何組件均依賴與Keystone提供的服務。html

2、Keystone的功能

用戶與認證

用戶權限與用戶行爲追蹤。node

服務目錄

爲每一個組件服務提供一個可用的服務目錄和相應的API入口端點。python

3、Keystone基本概念

User

使用服務的用戶,能夠是人,服務或者系統,只要是使用了openstack服務的對象均可以稱爲用戶。當User對OpenStack進行訪問時,Keystone會對其身份進行驗證。mysql

Project

租戶,能夠理解爲一我的、項目或者組織擁有的資源的合集。在一個租戶中能夠擁有不少個用戶,這些用戶能夠根據權限的劃分使用租戶中的資源。linux

Token

指的是一串比特值或者字符串,用來做爲訪問資源的令牌。Token中含有可訪問資源的範圍和有效時間。算法

Role

角色,用於分配操做的權限。角色能夠被指定給用戶,使得該用戶得到角色對應的操做權限。安全包含兩部分:Authentication(認證)和 Authorization(鑑權)sql

Service

Openstack Service,即Openstack中運行的組件服務。nova,glance都是屬於一個服務,須要在keystone上進行建立,指定類型。
建立服務有一個服務,就建立一個endpoint,會根據服務類型去查找那個服務。Service 決定每一個 Role 能作什麼事情 ,Service 經過各自的 policy.json 文件對 Role 進行訪問控制數據庫

Endpoint

一個能夠經過網絡來訪問和定位某個Openstack Service的地址,一般是一個URL。例如,Nova須要訪問Glance服務去獲取Image時,Nova經過訪問Keystone拿到Glance的Endpoint,而後經過訪問該Endpoint去獲取Glance服務,咱們能夠經過Endpoint的region屬性去定義多個region。Endpoint該使用對象分爲三類:apache

  1. Admin URL:給admin用戶使用,被從常規的訪問中分離。
  2. Internal URL:Openstack內部服務使用來跟別的服務通訊,只能被局域網訪問。
  3. Public URL:其它用戶能夠訪問的地址,能夠被全局訪問。
  4. User 經過 Endpoint 訪問資源和執行操做

Credentials

用於確認用戶身份的憑證。json

Authentication

肯定用戶身份的過程。

4、Keystone形象比喻

若是把賓館比做爲Openstack,那麼賓館的中央管理系統就是Keystone,入住賓館的人就是User 。在賓館中擁有不少不一樣的房間,房間提供了不一樣的服務(Service)。

在入住賓館前,User須要給出身份證(Credential),中央管理系統(Keystone)在確認User的身份後(Authenticaiton),會給你一個房卡(Token)和導航地圖(Endpoint)。

不一樣VIP(Role)級別的User,擁有不一樣權限的房卡(Token),若是你的VIP(Role)等級高,你能夠享受到豪華的總統套房。

User拿着房卡(Token)和地圖(Endpoint),就能夠進入特定的房間去享受不一樣的Services。每個服務(Services)中都擁有着一些特定資源(Project),例如,按摩服務中可使用的精油種類和數量。User能夠根據本身的權限來使用這些資源。

5、Keystone與其它服務的交互

 

6、Keystone V3 API特性

Keystone V3 作出了許多變化和改進,咱們選取其中較爲重要的進行闡述:
將 Tenant 改稱爲 Project
引入 Domain 的概念
引入 Group 的概念
將 Tenant 改成 Project 並在其上添加 Domain 的概念,這更加符合現實世界和雲服務的映射。
V3 利用 Domain 實現真正的多租戶(multi-tenancy)架構,Domain 擔任 Project 的高層容器。雲服務的客戶是 Domain 的全部者,他們能夠在本身的 Domain 中建立多個 Projects、Users、Groups 和 Roles。經過引入 Domain,雲服務客戶能夠對其擁有的多個 Project 進行統一管理,而沒必要再向過去那樣對每個 Project 進行單獨管理。

Group 是一組 Users 的容器,能夠向 Group 中添加用戶,並直接給 Group 分配角色,那麼在這個 Group 中的全部用戶就都擁有了 Group 所擁有的角色權限。經過引入 Group 的概念,Keystone V3 實現了對用戶組的管理,達到了同時管理一組用戶權限的目的。這與 V2 中直接向 User/Project 指定 Role 不一樣,使得對雲服務進行管理更加便捷。

 

7、Keystone安裝配置

(1)數據庫各服務庫的建立和受權
tips:配置 OpenStack 身份認證服務前,必須建立一個數據庫和管理員令牌。因爲其他服務也須要用到數據庫,此處將全部的服務所須要的庫都進行建立並受權

[root@linux-node1 ~]# mysql -uroot -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 10
Server version: 10.1.20-MariaDB MariaDB Server

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> create database keystone;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> create database glance;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> create database nova;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> create database nova_api;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> create database neutron;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> create database cinder;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> grant all on keystone.* to 'keystone'@'localhost' identified by 'keystone';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> grant all on keystone.* to 'keystone'@'%' identified by 'keystone'; 
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> grant all on glance.* to 'glance'@'localhost' identified by 'glance';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> grant all on glance.* to 'glance'@'%' identified by 'glance';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> grant all on nova.* to 'nova'@'localhost' identified by 'nova';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> grant all on nova.* to 'nova'@'%' identified by 'nova';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> grant all on nova_api.* to 'nova'@'localhost' identified by 'nova';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> grant all on nova_api.* to 'nova'@'%' identified by 'nova';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> grant all on neutron.* to 'neutron'@'localhost' identified by 'neutron';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> grant all on neutron.* to 'neutron'@'%' identified by 'neutron'; 
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> grant all on cinder.* to 'cinder'@'localhost' identified by 'cinder';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> grant all on cinder.* to 'cinder'@'%' identified by 'cinder';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| cinder             |
| glance             |
| information_schema |
| keystone           |
| mysql              |
| neutron            |
| nova               |
| nova_api           |
| performance_schema |
+--------------------+
9 rows in set (0.00 sec)
View Code

(2)keystone服務配置:/etc/keystone/keystone.conf

在 [database] 部分,配置數據庫訪問:
[database]
...
connection = mysql+pymysql://keystone:keystone@192.168.56.11/keystone

在[token]部分,配置Fernet UUID令牌的提供者。
[token] 
... 
provider = fernet
driver = memcache

(3)初始化身份認證服務的數據庫,並驗證是否初始化成功:

[root@linux-node1 ]# su -s /bin/sh -c "keystone-manage db_sync" keystone
[root@linux-node1 ]# mysql -h 192.168.56.11 -ukeystone -pkeystone -e "use keystone;show tables;"

(4)keystone服務配置:/etc/keystone/keystone.conf

在 [memcache] 部分,配置token緩存到memcache上:
servers = 192.168.56.11:11211

設置memcached開機自啓動,並設置監聽ip地址
[root@linux-node1 ~]# systemctl enable memcached
[root@linux-node1 ~]# systemctl start memcached
[root@linux-node1 ~]# vim /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 192.168.56.11,::1"
[root@linux-node1 ~]# systemctl restart memcached

tips:openstack會常用driver驅動,更加靈活地選用多種方式。

(5)查看keystone服務全部的配置

[root@linux-node1 ~]# grep '^[a-z]' /etc/keystone/keystone.conf 
connection = mysql+pymysql://keystone:keystone@192.168.56.11/keystone
servers = 192.168.56.11:11211
provider = fernet
driver = memcache

(6)初始化Fernet key:

[root@linux-node1 ~]# keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
[root@linux-node1 ~]# keystone-manage credential_setup --keystone-user keystone --keystone-group keystone
[root@linux-node1 ~]# cd /etc/keystone/
[root@linux-node1 keystone]# ll
總用量 140
drwx------ 2 keystone keystone     22 12月  4 11:10 credential-keys
-rw-r----- 1 root     keystone   2303 7月  26 12:47 default_catalog.templates
drwx------ 2 keystone keystone     22 12月  4 11:10 fernet-keys
-rw-r----- 1 root     keystone 113658 12月  4 11:07 keystone.conf
-rw-r----- 1 root     keystone   2639 7月  26 12:48 keystone-paste.ini
-rw-r----- 1 root     keystone   1046 7月  26 12:47 logging.conf
-rw-r----- 1 keystone keystone   9742 7月  26 12:48 policy.json
-rw-r----- 1 keystone keystone    665 7月  26 12:47 sso_callback_template.html

(7)初始化命令bootstrap,初始化自動建立一個admin用戶以及相關權限,直接在keystone上進行註冊服務,建立endpoint。

[root@linux-node1 ~]# keystone-manage bootstrap --bootstrap-password admin \   
    --bootstrap-admin-url http://192.168.56.11:35357/v3/ \   
    --bootstrap-internal-url http://192.168.56.11:35357/v3/ \   
    --bootstrap-public-url http://192.168.56.11:5000/v3/ \  
    --bootstrap-region-id RegionOne

[root@linux-node1 ~]# mysql -h 192.168.56.11 -ukeystone -pkeystone
MariaDB [keystone]> use keystone;
Database changed
MariaDB [keystone]> select * from endpoint\G
*************************** 1. row ***************************
                id: 20222ecb6eeb4f378035e79c47810b08
legacy_endpoint_id: NULL
         interface: public
        service_id: 436e446b475a46fa978349211d6c64eb
               url: http://192.168.56.11:5000/v3/
             extra: {}
           enabled: 1
         region_id: RegionOne
*************************** 2. row ***************************
                id: 6cc75ee06e5245059e106e89e1643a92
legacy_endpoint_id: NULL
         interface: internal
        service_id: 436e446b475a46fa978349211d6c64eb
               url: http://192.168.56.11:35357/v3/
             extra: {}
           enabled: 1
         region_id: RegionOne
*************************** 3. row ***************************
                id: 7c7b33e8c2ac431aa7380ceeac80fb37
legacy_endpoint_id: NULL
         interface: admin
        service_id: 436e446b475a46fa978349211d6c64eb
               url: http://192.168.56.11:35357/v3/
             extra: {}
           enabled: 1
         region_id: RegionOne
3 rows in set (0.00 sec)

(8)配置apache http服務器
tips:kesytone是python寫的,apache有一個wsgi模塊,能夠經過這個模塊和python進行通訊。端口爲5000和35357,缺省狀況下,Kestone服務仍然監聽這些端口

①編輯/etc/httpd/conf/httpd.conf 文件,配置ServerName 選項爲控制節點:

ServerName 192.168.56.11:80

②建立一個連接到/usr/share/keystone/wsgi-keystone.conf文件

ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/

③設置apache開機自啓動

[root@linux-node1 ~]# systemctl enable httpd.service
[root@linux-node1 ~]# systemctl start httpd.service

(9)開始使用keystone就須要進行驗證,有兩種方式鏈接Keystone:第一種方式使用參數,另一種方式就經過環境變量方式進行鏈接。

[root@linux-node1 ~]# vim admin-openstack
export OS_USERNAME=admin
export OS_PASSWORD=admin
export OS_PROJECT_NAME=admin
export OS_USER_DOMAIN_NAME=default
export OS_PROJECT_DOMAIN_NAME=default
export OS_AUTH_URL=http://192.168.56.11:35357/v3
export OS_IDENTITY_API_VERSION=3
[root@linux-node1 ~]# openstack user list
Missing value auth-url required for auth plugin password
[root@linux-node1 ~]# source admin-openstack 
[root@linux-node1 ~]# openstack user list
+----------------------------------+-------+
| ID                               | Name  |
+----------------------------------+-------+
| 5313b45a3c474c7ea18e7272fd037b7d | admin |
+----------------------------------+-------+

(10)建立域、項目、用戶、角色
爲何建立service項目?在前面已經概述到一個用戶須要屬於一個項目(用戶組),而且要賦予一種角色(權限)進行管理服務。而其他服務須要鏈接keystone,需用使用用戶名密碼鏈接,那其餘服務天然就須要有屬於某一個項目,是什麼用戶,什麼角色去鏈接Keystone。此處默認的域建立爲爲default,對域的概念不明白能夠參考前文。
在這裏:咱們分別建立了service項目,並配置了默認的域爲default。也建立了glance、nova、neutron、cinder用戶,並賦予admin角色,使openstack的服務組件能夠與Keystone進行通訊。

[root@linux-node1 ~]# openstack project create --domain default \
>   --description "Service Project" service
 [root@linux-node1 ~]# openstack project list

常規(非管理)任務應該使用無特權的項目和用戶。做爲例子,這裏採用demo項目和demo用戶
建立demo項目,demo用戶密碼,建立use角色並賦予demo用戶user角色

[root@linux-node1 ~]# openstack project create --domain default \
>   --description "Demo Project" demo
[root@linux-node1 ~]# openstack user create --domain default \
>  --password-prompt demo
[root@linux-node1 ~]# openstack role create user
[root@linux-node1 ~]# openstack role add --project demo --user demo user

建立glance、nova、neutron、cinder用戶,並賦予admin角色

[root@linux-node1 ~]# openstack user create --domain default \
>  --password-prompt glance
[root@linux
-node1 ~]# openstack role add --project service --user glance admin
[root@linux
-node1 ~]# openstack user create --domain default \ > --password-prompt nova
[root@linux
-node1 ~]# openstack role add --project service --user nova admin [root@linux-node1 ~]# openstack user create --domain default \ > --password-prompt neutron
[root@linux
-node1 ~]# openstack role add --project service --user neutron admin [root@linux-node1 ~]# openstack user create --domain default \ > --password-prompt cinder
[root@linux
-node1 ~]# openstack role add --project service --user cinder admin [root@linux-node1 ~]# openstack user list +----------------------------------+---------+ | ID | Name | +----------------------------------+---------+ | 23aefbc43cd24bcd8e6a78d527cb1002 | nova | | 3c24e5584ce447a0b80c659d6daecd13 | demo | | 5313b45a3c474c7ea18e7272fd037b7d | admin | | 666df293c18541fcafffffac3b8587fe | glance | | cb278a7d54a4470387fe4bd88a64ee95 | neutron | | d628cec48ab8407494605aa0022dd953 | cinder | +----------------------------------+---------+ [root@linux-node1 ~]# openstack project list +----------------------------------+---------+ | ID | Name | +----------------------------------+---------+ | 02aaf7ba97114238b1d8169fedabb9be | demo | | 21a45d59913d4c05b46ad3ec92e61656 | admin | | 56e253935a6049b69140f4aebac8bb6a | service | +----------------------------------+---------+

(11)驗證操做:在安裝其餘服務以前確認身份認證服務操做
在控制節點(192.168.56.11)上操做這些命令
①由於安全性的緣由,關閉臨時認證令牌機制,撤銷臨時環境變量OS_AUTH_URL和OS_PASSWORD

[root@linux-node1 ~]# unset OS_AUTH_URL OS_PASSWORD

②做爲 admin 用戶,請求認證令牌:

[root@linux-node1 ~]# openstack --os-auth-url http://192.168.56.11:35357/v3   --os-project-domain-name default --os-user-domain-name default   --os-project-name admin --os-username admin token issue

③做爲demo 用戶,請求認證令牌:

[root@linux-node1 ~]# openstack --os-auth-url http://192.168.56.11:5000/v3   --os-project-domain-name default --os-user-domain-name default   --os-project-name demo --os-username demo token issue

tips:可以正常獲取到tonken,說明keystone服務是正常。

(12)建立 OpenStack 客戶端環境腳本
① 建立 admin 和 demo項目和用戶建立客戶端環境變量腳本

[root@linux-node1 ~]# cat admin-openstack 
export OS_USERNAME=admin
export OS_PASSWORD=admin
export OS_PROJECT_NAME=admin
export OS_USER_DOMAIN_NAME=default
export OS_PROJECT_DOMAIN_NAME=default
export OS_AUTH_URL=http://192.168.56.11:35357/v3
export OS_IDENTITY_API_VERSION=3

[root@linux-node1 ~]# cat demo-openstack 
export OS_USERNAME=demo
export OS_PASSWORD=demo
export OS_PROJECT_NAME=demo
export OS_USER_DOMAIN_NAME=default
export OS_PROJECT_DOMAIN_NAME=default
export OS_AUTH_URL=http://192.168.56.11:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2

②加載admin-openrc文件來身份認證服務的環境變量位置和admin項目和用戶證書:

[root@linux-node1 ~]# source admin-openstack 

③ 請求認證令牌:

[root@linux-node1 ~]# openstack token issue
+------------+------------------------------------------------------------------------------------+
| Field      | Value                                                                              |
+------------+------------------------------------------------------------------------------------+
| expires    | 2018-01-15 05:09:39+00:00                                                          |
| id         | gAAAAABaXCmDx9x7k_ZU0gCh2qCnfEv0Z4P8MoGWEkUeC19cNKBEEVviW9DV3OM3O53gm3OzJZ_4Wf8OJx |
|            | Q8ErmFV3qUF7GMzfVbCkwaPJAIPQWveopglMWdhKuT4IYNWBQV_frC69agmGKw1NIGSeNgQgdlGkrn7kzQ |
|            | 2u-ThWPFQPXzfAFZq24                                                                |
| project_id | 71c9b608e79546f4b90f710fea475de3                                                   |
| user_id    | fa4237d31d5145f78b87a29fbcc7ec0c                                                   |
+------------+------------------------------------------------------------------------------------+

 

到此,Keystone服務就算配置完成了。
OpenStack 排查問題的方法主要是經過日誌。 
每一個 Service 都有本身的日誌文件。

Keystone 主要有兩個日誌: 
keystone.log 和 keystone_access.log 
保存在 /var/log/apache2/ 目錄裏。

若是須要獲得最詳細的日誌信息,能夠在 /etc/keystone/keystone.conf 中打開 debug 選項

8、總結Keystone常見錯誤

401 #驗證失敗,keystone相關用戶帳戶密碼設置錯誤,時間不一樣步,或者輸入的項目名稱不對
403 #可能未初始化OS_token變量,須要使用source命令使其生效,也多是配置的配置文件未生效,須要重啓相關服務
409 #keystone建立用戶,用戶已存在
500 #服務器內部錯誤,服務配置有問題,看日誌,檢查配置
503 #keystone相關帳戶密碼設置有問題,請將相關的glance帳戶刪除,從新建立便可
服務故障 #相關服務沒有起來

Keystone的配置/etc/keystone/keystone.conf總結:①因爲Keystone須要使用數據庫,須要配置數據庫的鏈接②因爲須要將token存儲到memcache,減小對數據庫的訪問,須要配置memcached服務器地址和端口③因爲tonken的生成是基於某種算法,此處選用的是fernet方式,須要配置令牌提供者爲fernet④在選用memcache做爲緩存token的方式,須要配置驅動方式(driver)

相關文章
相關標籤/搜索