Openstack之路(二)認證服務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"
- 初始化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-11 10:22:42+00:00 |
| id | gAAAAABaVyziT1-asUKbU77tMkmfxqEW2zjEUmAYbLVMP5IKhiSbIJfcz0hCLITQjUA_em52ME0aedkKwm |
| | _G3ab_ts0H45rt3Jq72-1Rt_ldRaTdXGDwuuKxs_Dr4SaocAfjcqAf3mWQwiRVb7vctxfd- |
| | vYzFCt_IhEoCQXHEuARRGOdZ_T1GtU |
| project_id | 71c9b608e79546f4b90f710fea475de3 |
| user_id | fa4237d31d5145f78b87a29fbcc7ec0c |
+------------+------------------------------------------------------------------------------------+
- 作為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-11 10:24:22+00:00 |
| id | gAAAAABaVy1G0siKGf2BRNHd98ZBK55nf0Z3Iu1SitjV7WAvzKJ0y2NekH_1yid_AMoFCThaEnVwSldRf_ |
| | K9jAuvvc3sy1kQE0zlgZShn6vY-k6qaS_xyN0U0WnCHJst4eDLEQDNZzFDY- |
| | 6XmdwxdwicBQwyIIlrXrmIfVPvpDn5VVxOyCG3ZKo |
| project_id | e10068ee83dc464683ff232494d30d39 |
| user_id | 903b9cf22cd248729fb770feb56a71c5 |
+------------+------------------------------------------------------------------------------------+
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-15 05:09:39+00:00 |
| id | gAAAAABaXCmDx9x7k_ZU0gCh2qCnfEv0Z4P8MoGWEkUeC19cNKBEEVviW9DV3OM3O53gm3OzJZ_4Wf8OJx |
| | Q8ErmFV3qUF7GMzfVbCkwaPJAIPQWveopglMWdhKuT4IYNWBQV_frC69agmGKw1NIGSeNgQgdlGkrn7kzQ |
| | 2u-ThWPFQPXzfAFZq24 |
| project_id | 71c9b608e79546f4b90f710fea475de3 |
| user_id | fa4237d31d5145f78b87a29fbcc7ec0c |
+------------+------------------------------------------------------------------------------------+
Openstack之路(二)認證服務Keystone