Keystone是Openstack的組件之一,用於爲Openstack家族中的其它組件成員提供統一的認證服務,包括身份驗證,令牌的發放和校驗,服務列表,用戶權限的定義等。Openstack中任何組件均依賴與Keystone提供的服務。html
用戶權限與用戶行爲追蹤。node
爲每一個組件服務提供一個可用的服務目錄和相應的API入口端點。python
使用服務的用戶,能夠是人,服務或者系統,只要是使用了openstack服務的對象均可以稱爲用戶。當User對OpenStack進行訪問時,Keystone會對其身份進行驗證。mysql
租戶,能夠理解爲一我的、項目或者組織擁有的資源的合集。在一個租戶中能夠擁有不少個用戶,這些用戶能夠根據權限的劃分使用租戶中的資源。linux
指的是一串比特值或者字符串,用來做爲訪問資源的令牌。Token中含有可訪問資源的範圍和有效時間。算法
角色,用於分配操做的權限。角色能夠被指定給用戶,使得該用戶得到角色對應的操做權限。安全包含兩部分:Authentication(認證)和 Authorization(鑑權)sql
Openstack Service,即Openstack中運行的組件服務。nova,glance都是屬於一個服務,須要在keystone上進行建立,指定類型。
建立服務有一個服務,就建立一個endpoint,會根據服務類型去查找那個服務。Service 決定每一個 Role 能作什麼事情 ,Service 經過各自的 policy.json 文件對 Role 進行訪問控制數據庫
一個能夠經過網絡來訪問和定位某個Openstack Service的地址,一般是一個URL。例如,Nova須要訪問Glance服務去獲取Image時,Nova經過訪問Keystone拿到Glance的Endpoint,而後經過訪問該Endpoint去獲取Glance服務,咱們能夠經過Endpoint的region屬性去定義多個region。Endpoint該使用對象分爲三類:apache
用於確認用戶身份的憑證。json
肯定用戶身份的過程。
若是把賓館比做爲Openstack,那麼賓館的中央管理系統就是Keystone,入住賓館的人就是User 。在賓館中擁有不少不一樣的房間,房間提供了不一樣的服務(Service)。
在入住賓館前,User須要給出身份證(Credential),中央管理系統(Keystone)在確認User的身份後(Authenticaiton),會給你一個房卡(Token)和導航地圖(Endpoint)。
不一樣VIP(Role)級別的User,擁有不一樣權限的房卡(Token),若是你的VIP(Role)等級高,你能夠享受到豪華的總統套房。
User拿着房卡(Token)和地圖(Endpoint),就能夠進入特定的房間去享受不一樣的Services。每個服務(Services)中都擁有着一些特定資源(Project),例如,按摩服務中可使用的精油種類和數量。User能夠根據本身的權限來使用這些資源。
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 不一樣,使得對雲服務進行管理更加便捷。
(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)
(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 選項
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)