Keystone的概述
Keystone是Openstack的組件之一,用於爲Openstack家族中的其它組件成員提供統一的認證服務,包括身份驗證,令牌的發放和校驗,服務列表,用戶權限的定義等。Openstack中任何組件均依賴與Keystone提供的服務。
Keystone的功能
用戶與認證
用戶權限與用戶行爲追蹤。
服務目錄
爲每個組件服務提供一個可用的服務目錄和相應的API入口端點。
Keystone基本概念
User
顧名思義就是使用服務(Openstack Service)的用戶,可以是人、服務或者是系統,只要是使用了Openstack服務的對象都可以稱爲用戶。
Project
租戶,可以理解爲一個人、項目或者組織擁有的資源的合集。在一個租戶中可以擁有很多個用戶,這些用戶可以根據權限的劃分使用租戶中的資源。
Token
指的是一串比特值或者字符串,用來作爲訪問資源的令牌。Token中含有可訪問資源的範圍和有效時間。
Role
角色,用於分配操作的權限。角色可以被指定給用戶,使得該用戶獲得角色對應的操作權限。
Service
Openstack Service,即Openstack中運行的組件服務。
Endpoint
一個可以通過網絡來訪問和定位某個Openstack Service的地址,通常是一個URL。例如,Nova需要訪問Glance服務去獲取Image時,Nova通過訪問Keystone拿到Glance的Endpoint,然後通過訪問該Endpoint去獲取Glance服務,我們可以通過Endpoint的region屬性去定義多個region。Endpoint該使用對象分爲三類:
- Admin URL:給admin用戶使用,被從常規的訪問中分離。
- Internal URL:Openstack內部服務使用來跟別的服務通信,只能被局域網訪問。
- Public URL:其它用戶可以訪問的地址,可以被全局訪問。
Credentials
用於確認用戶身份的憑證。
Authentication
確定用戶身份的過程。
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可以根據自己的權限來使用這些資源。
Keystone與其它服務的交互
Keystone安裝配置
Keystone的安裝
- 創建一個數據庫和管理員令牌
MariaDB [(none)]> create database keystone;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| keystone |
| mysql |
| performance_schema |
+--------------------+
4 rows in set (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)]> exit
Bye
- 安裝Keystone相關軟件包
[root@linux-node1 ~]# yum -y install openstack-keystone httpd mod_wsgi
[root@linux-node1 ~]# rpm -qa openstack-keystone httpd mod_wsgi
mod_wsgi-3.4-12.el7_0.x86_64
openstack-keystone-10.0.3-1.el7.noarch
httpd-2.4.6-67.el7.centos.6.x86_64
Keystone的配置
- 編輯/etc/keystone/keystone.conf文件,並完成如下更改
[root@linux-node1 ~]# cp -a /etc/keystone/keystone.conf /etc/keystone/keystone.conf_$(date +%F)
[root@linux-node1 ~]# vim /etc/keystone/keystone.conf
在[database]
部分,配置數據庫訪問
[database]
......
640 connection = mysql+pymysql://keystone:[email protected]/keystone
在[memcache]
部分,配置緩存服務
[memcache]
......
1476 servers = 192.168.56.11:11211
在[token]
部分,配置Fernet UUID令牌的提供者
[token]
.....
2659 provider = fernet
2669 driver = memcache
- 初始化身份認證服務的數據庫
[root@linux-node1 ~]# su -s /bin/sh -c "keystone-manage db_sync" keystone
[root@linux-node1 ~]# mysql -ukeystone -pkeystone -e "use keystone;show tables"|wc -l
38
- 初始化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
- 創建身份服務API端點
[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
- 配置Apache HTTP服務器
編輯/etc/httpd/conf/httpd.conf文件,配置ServerName選項爲控制節點
[root@linux-node1 ~]# vim /etc/httpd/conf/httpd.conf
95 ServerName 192.168.56.11:80
創建一個鏈接到/usr/share/keystone/wsgi-keystone.conf文件
[root@linux-node1 ~]# ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/
[root@linux-node1 ~]# ls -l /etc/httpd/conf.d/wsgi-keystone.conf
lrwxrwxrwx 1 root root 38 Jan 11 15:55 /etc/httpd/conf.d/wsgi-keystone.conf -> /usr/share/keystone/wsgi-keystone.conf
啓動httpd,並配置爲開機自啓
[root@linux-node1 ~]# systemctl enable httpd.service
[root@linux-node1 ~]# systemctl start httpd.service
[root@linux-node1 ~]# systemctl status httpd.service
- 配置admin賬戶,配置環境變量,臨時生效
[root@linux-node1 ~]# export OS_USERNAME=admin
[root@linux-node1 ~]# export OS_PASSWORD=admin
[root@linux-node1 ~]# export OS_PROJECT_NAME=admin
[root@linux-node1 ~]# export OS_USER_DOMAIN_NAME=Default
[root@linux-node1 ~]# export OS_PROJECT_DOMAIN_NAME=Default
[root@linux-node1 ~]# export OS_AUTH_URL=http://192.168.56.11:35357/v3
[root@linux-node1 ~]# export OS_IDENTITY_API_VERSION=3
- 創建項目、域、用戶和角色
創建service項目
[root@linux-node1 ~]# openstack project create --domain default --description "Service Project" service
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | Service Project |
| domain_id | default |
| enabled | True |
| id | afc19f08df4948989710d453c4ee45d0 |
| is_domain | False |
| name | service |
| parent_id | default |
+-------------+----------------------------------+
常規(非管理)任務應該使用無特權的項目和用戶,創建demo項目和用戶
[root@linux-node1 ~]# openstack project create --domain default --description "Demo Project" demo
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | Demo Project |
| domain_id | default |
| enabled | True |
| id | e10068ee83dc464683ff232494d30d39 |
| is_domain | False |
| name | demo |
| parent_id | default |
+-------------+----------------------------------+
[root@linux-node1 ~]# openstack user create --domain default --password-prompt demo
User Password:
Repeat User Password:
+---------------------+----------------------------------+
| Field | Value |
+---------------------+----------------------------------+
| domain_id | default |
| enabled | True |
| id | 903b9cf22cd248729fb770feb56a71c5 |
| name | demo |
| password_expires_at | None |
+---------------------+----------------------------------+
創建user角色
[root@linux-node1 ~]# openstack role create user
+-----------+----------------------------------+
| Field | Value |
+-----------+----------------------------------+
| domain_id | None |
| id | 145f27cc922b449694d0bf6e1b8b85c7 |
| name | user |
+-----------+----------------------------------+
添加user角色到demo項目和用戶
[root@linux-node1 ~]# openstack role add --project demo --user demo user
Keystone驗證操作
- 因爲安全性的原因,關閉臨時認證令牌機制,撤銷臨時環境變量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
Password:
+------------+--------------------------------------------------------------------------------------------------------------+
| Field | Value |
+------------+--------------------------------------------------------------------------------------------------------------+
| expires | 2018-01-20 04:38:06+00:00 |
| id | gAAAAABaYrmeJL1mde_wln1z1G559nIsJd_D42uLbblKK4PTywSiqXhkg2DaVPFab8Iz0h64-YF6dq- |
| | D1xgTjXHfWCQpWcepHhC59OYznFY9J0PeECPqWcuOJrh_OJOkLuncdc_cvs3Ecjux2JXGw8fY6ZmJVoGnsc4lO78MUD-q6pHjqj4twrU |
| project_id | 14055178975d417987c5a94f030c7acf |
| user_id | d7f8f54a45814161a48e0d5feba4942c |
+------------+--------------------------------------------------------------------------------------------------------------+
- 作爲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
Password:
+------------+--------------------------------------------------------------------------------------------------------------+
| Field | Value |
+------------+--------------------------------------------------------------------------------------------------------------+
| expires | 2018-01-20 04:40:30+00:00 |
| id | gAAAAABaYrouwJJcEUD8E0WMULvfn-rjPIEIP0OSrYwgvQZMrgJpV7MYLQ_deU0aZ4zEFqdzMvRvIkkIafvvKe8azJQkrBCFnCNVIblj9QS7 |
| | JbpiigVWkxXSHgNEAqDyzpAe_xTjQQU5A27Kf8MOIMfDw6NBoh4N9biY9Fkgf6IF7H0ngr1aitI |
| project_id | 8a788702c6ea46419bb85b4e4600e3c4 |
| user_id | 48cd83bd3ce54b8ebece24680e8c8b0a |
+------------+--------------------------------------------------------------------------------------------------------------+
Openstack客戶端環境腳本
- 創建腳本
編輯admin-openrc文件並且增加以下內容
[root@linux-node1 ~]# 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
export OS_AUTH_URL=http://192.168.56.11:35357/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
編輯文件demo-openrc並添加如下內容
[root@linux-node1 ~]# 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
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-openrc
請求認證令牌
[root@linux-node1 ~]# openstack token issue
+------------+--------------------------------------------------------------------------------------------------------------+
| Field | Value |
+------------+--------------------------------------------------------------------------------------------------------------+
| expires | 2018-01-20 04:42:41+00:00 |
| id | gAAAAABaYrqxOK2q0kjx7jsWU2BIAR5YudyAF491y6pPbl9J2SOLWjdGP7_XeTKnTHKyVGm13zaqnzw4jj- |
| | 6ZNKIqP5NhvmwtNsVeQK4QVFmEECZ850ZeBBdnwTxhn0mTFr3_n0aEnZ96iBJ4aLLbo2T4KM2AdSn5wBzpvHJnstSDu4rVBG0tNs |
| project_id | 14055178975d417987c5a94f030c7acf |
| user_id | d7f8f54a45814161a48e0d5feba4942c |
+------------+--------------------------------------------------------------------------------------------------------------+