OpenStack 認證服務 KeyStone [二]node
openstack
時間:2016年11月23日
python
Keystone做用:
1.用戶與認證:用戶權限與用戶行爲跟蹤;
2.服務目錄:提供一個服務目錄,包括全部服務項和相關Api的斷點
3.SOA相關知識mysql
Keystone主要兩大功能用戶認證
服務目錄
(至關於一個註冊中心)linux
User
:用戶
它是用一個數字表明使用openstack雲服務的一我的、系統、或服務。身份驗證服務將會驗證傳入的由用戶聲明將調用的請求
一個租戶能夠有多個用戶
一個用戶能夠屬於一個或多個租戶
用戶對租戶和操做權限由用戶在租戶中承擔的角色來決定。sql
Project
:項目
它是各個服務中的一些能夠訪問的資源集合或者說叫資源組
。它是一個容器
,用於組織和隔離資源,或標識對象。數據庫
Token
:令牌apache
Role
:角色
表明一組用戶能夠訪問的資源權限,例如Nova
中的虛擬機、Glance
中的鏡像json
Service
:服務
Service即服務,如Nova、Glance、Swift。根據前三個概念(User,Tenant和Role)一個服務能夠確認當前用戶是否具備訪問其資源的權限。可是當一個user嘗試着訪問其租戶內的service時,他必須知道這個service是否存在以及如何訪問這個service。vim
Endpoint
:端點
Endpoint翻譯爲「端點」,咱們能夠理解它是一個服務暴露出來的訪問點,若是須要訪問一個服務,則必須知道他的endpoint。Endpoint的每一個URL都對應一個服務實例的訪問地址,而且具備public、orivate和admin這三種權限。pubic url能夠徹底被全局訪問,private url只能被局域網訪問,admin url被從常規的訪問中分離。api
安裝Openstack驗證服務KeyStone
[root@linux-node1 ~]# yum install -y openstack-keystone httpd mod_wsgi memcached python-memcached
提示: wsgi
是python一個cgi
的接口(keystone須要使用httpd
來運行)
注意!
編輯文件/etc/keystone/keystone.conf
,咱們管理keystone
只須要修改keystone的配置文件便可
在配置文件裏面以[xxx
]裏面的內容叫作配置欄目(相似於mysql配置文件[mysqld]下面)
在[DEFAULT]
部分,定義初始管理令牌的值:
咱們使用openssl
生成一個隨機值
[root@linux-node1 ~]# openssl rand -hex 101b0abfc7e9a314a0fd7f[root@linux-node1 ~]# vim /etc/keystone/keystone.conf[DEFAULT]admin_token = 1b0abfc7e9a314a0fd7f
keystone默認
沒有用戶,須要進行建立用戶。這樣咱們在配置文件中加入admin_token
,在沒有用戶的狀況下可使用admin_token進行訪問。還能夠設置不用用戶名和密碼。簡單來講admin_token
就是初始化時候超級管理員的用戶
在[database]
部分,配置數據庫訪問:
[database]connection = mysql+pymysql://keystone:keystone@192.168.56.11/keystone
用戶名:密碼:數據庫地址:數據庫名稱
由於咱們須要將用戶密碼保存到數據庫中,因此咱們要配置數據庫
配置Fernet UUID令牌的提供者
提供令牌有四種方式[fernet|pkiz|pki|uuid]
默認是uuid
[token]provider = fernetdriver = memcache
默認是存儲在sql
中,咱們須要將它修改成memcache
提示:關於爲何選擇fernet
咱們能夠參考下方文章
Keystone幾種token生成的方式分析
http://blog.csdn.net/miss_yang_cloud/article/details/49633719
配置memcached
[memcache]servers = 192.168.56.11:11211
提示:官方默認是localhost
,可是若是是正式生產環境可能在另外一臺服務器上
總結keystone有如下配置
[root@linux-node1 ~]# grep '^[a-Z]' /etc/keystone/keystone.conf[DEFAULT]admin_token = 1b0abfc7e9a314a0fd7f[database]connection = mysql +pymysql://keystone:keystone@192.168.56.11/keystone[memcached]servers = 192.168.56.11:11211[token]provider = fernetdriver = memcache
初始化數據庫
[root@linux-node1 ~]# su -s /bin/sh -c "keystone-manage db_sync" keystone
會自動找到keystone
配置文件裏的mysql
鏈接,來幫咱們建立數據庫中的表
問題:咱們爲何要使用keystone用戶去同步數據庫呢?
由於同步數據庫會在/var/log/keystone
去寫一個日誌,若是使用root
權限,keystone
啓動時會讀取這個日誌,那麼將沒法進行讀取出現啓動錯誤的狀況
檢查表是否建立成功
[root@linux-node1 ~]# mysql -h 192.168.56.11 -ukeystone -pkeystone -e "use keystone;show tables;"
舒適提示:若是查看錶的時候發現沒有,那麼咱們就應該排查/var/log/keystone.log
在羣裏問問題必須本身先看了沒有問題在進行提問
初始化Fernet keys;
建立相關的證書
[root@linux-node1 ~]# keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
執行完命令以後會在/etc/keystone
下生成fernet-keys
目錄,它的權限是keystone裏面存放這一些相關證書
提示:咱們要注意/etc/keystone/keystone.conf
文件的權限
啓動memcached並設置開啓激動
[root@linux-node1 ~]# systemctl start memcached.service [root@linux-node1 ~]# systemctl enable memcached.service Created symlink from /etc/systemd/system/multi-user.target.wants/memcached.service to /usr/lib/systemd/system/memcached.service.
檢查
咱們須要檢查是否有11211
memcached
的端口
查看配置文件
[root@linux-node1 ~]# cat /etc/sysconfig/memcachedPORT="11211" #端口號USER="memcached" #用戶MAXCONN="1024" #最大鏈接數CACHESIZE="64" #大小64兆OPTIONS=""
配置Http
由於咱們當時是安裝了一個鏈接httpd
用的一個api
,簡單的來講咱們要經過apache
來啓動keystone
配置/etc/httpd/conf/httpd.conf
文件,配置ServerName
選項爲控制節點,若是咱們不修改servername那麼keystone將沒法啓動
[root@linux-node1 ~]# vim /etc/httpd/conf/httpd.confServerName 192.168.56.11:80
建立文件/etc/httod/conf.d/wsgi-keystone.conf
[root@linux-node1 ~]# cat /etc/httpd/conf.d/wsgi-keystone.confListen 5000Listen 35357<VirtualHost *:5000> WSGIDaemonProcess keystone-public processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP} WSGIProcessGroup keystone-public WSGIScriptAlias / /usr/bin/keystone-wsgi-public WSGIApplicationGroup %{GLOBAL} WSGIPassAuthorization On ErrorLogFormat "%{cu}t %M" ErrorLog /var/log/httpd/keystone-error.log CustomLog /var/log/httpd/keystone-access.log combined <Directory /usr/bin> Require all granted </Directory></VirtualHost><VirtualHost *:35357> WSGIDaemonProcess keystone-admin processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP} WSGIProcessGroup keystone-admin WSGIScriptAlias / /usr/bin/keystone-wsgi-admin WSGIApplicationGroup %{GLOBAL} WSGIPassAuthorization On ErrorLogFormat "%{cu}t %M" ErrorLog /var/log/httpd/keystone-error.log CustomLog /var/log/httpd/keystone-access.log combined <Directory /usr/bin> Require all granted </Directory></VirtualHost>
啓動並設置開機啓動
[root@linux-node1 ~]# systemctl enable httpd.service Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.[root@linux-node1 ~]# systemctl start httpd.service
檢查
若是沒有啓動咱們要查看/var/log/keystone/keystone.log
並須要開啓debug日誌
開啓debug
日誌以下:
[root@linux-node1 ~]# vim /etc/keystone/keystone.conf#debug = true將false修改成true將開啓
排錯方案以下:若是服務出現異常,首先先打開debug 而後重啓服務 查看日誌
以上就是keystone安裝,下面咱們還須要設置keystone
由於咱們要鏈接到keystone因此須要建立keystone用戶,keystone還須要本身進行註冊服務
鏈接keystone有倆種方式:
一種是使用keystone –os-username --os-password
另外一種是使用環境變量
3
個環境變量1.設置admin_token環境變量
[root@linux-node1 ~]# export OS_TOKEN=1b0abfc7e9a314a0fd7fadmin_token後面的值是咱們在keystone.conf裏面寫的
2.設置鏈接到keystone的地址(配置端點URL
)
[root@linux-node1 ~]# export OS_URL=http://192.168.56.11:35357/v3設置keystone的admin(35357)端口 v3是用第三個版本
3.配置認證API版本
[root@linux-node1 ~]# export OS_IDENTITY_API_VERSION=3
經過admin
的token
設置環境變量進行操做::
[root@linux-host1 ~]# export OS_TOKEN=1b0abfc7e9a314a0fd7f #keystone配置文件中定義的token的值[root@linux-host1 ~]# export OS_URL=http://192.168.56.11:35357/v3 #keystone地址、端口和驗證版本,35357是keystone的admin端口,5000是public端口[root@linux-host1 ~]# export OS_IDENTITY_API_VERSION=3 #配置API版本的環境變量
建立default
域
[root@linux-node1 ~]# openstack domain create --description "Default Domain" Default+-------------+----------------------------------+| Field | Value |+-------------+----------------------------------+| description | Default Domain || enabled | True || id | 8af40091347e4b109d44feae01fc4356 || name | Default |+-------------+----------------------------------+--description是域的描述,最後一個是域的名稱
提示:只有在環境變量下才能夠建立這個域,而且生成的ID
是隨機的
爲了進行管理操做,建立管理的項目
、用戶
和角色
建立admin項目 至關於管理的,能夠管理全部的雲主機
[root@linux-node1 ~]# openstack project create --domain default --description "Admin Project" admin+-------------+----------------------------------+| Field | Value |+-------------+----------------------------------+| description | Admin Project || domain_id | 8af40091347e4b109d44feae01fc4356 || enabled | True || id | 026a58f98402437fa95ef4a21fbd4d1a || is_domain | False || name | admin || parent_id | 8af40091347e4b109d44feae01fc4356 |+-------------+----------------------------------+#命令格式爲openstack project --domain 域 --description "描述" 項目名
建立admin用戶
密碼咱們設置爲admin
[root@linux-node1 ~]# openstack user create --domain default --password-prompt adminUser Password:Repeat User Password:+-----------+----------------------------------+| Field | Value |+-----------+----------------------------------+| domain_id | 8af40091347e4b109d44feae01fc4356 || enabled | True || id | a809e8be52c84732aecd8ebb93481d65 || name | admin |+-----------+----------------------------------+
提示:密碼請設置跟我一致!
建立admin角色
角色就是在一個項目裏面有多個角色,咱們只能建立在配置文件中設置的角色。配置路徑/etc/keystone/policy.json
[root@linux-node1 ~]# openstack role create admin+-----------+----------------------------------+| Field | Value |+-----------+----------------------------------+| domain_id | None || id | c934dad680e142d09c434e2301b2a9bf || name | admin |+-----------+----------------------------------+
添加admin角色到admin項目和用戶上
把admin
用戶添加到admin
項目並受權admin
的角色,角色就是admin
權利的集合
[root@linux-node1 ~]# openstack role add --project admin --user admin admin
小結:前三個環境變量是爲了鏈接到keystone
上,後面的就是爲了建立域
、項目
、用戶
和角色
,給域、項目、用戶和角色作了一個關聯
建立一個demo項目
demo項目就相似於咱們去阿里雲上註冊了一個帳號,基本流程跟建立admin是同樣的
[root@linux-node1 ~]# openstack project create --domain default --description "Demo Project" demo+-------------+----------------------------------+| Field | Value |+-------------+----------------------------------+| description | Demo Project || domain_id | 8af40091347e4b109d44feae01fc4356 || enabled | True || id | ff5398ee1b2e4d00bafd57f82dc150e6 || is_domain | False || name | demo || parent_id | 8af40091347e4b109d44feae01fc4356 |+-------------+----------------------------------+
建立demo用戶
[root@linux-node1 ~]# openstack user create --domain default --password-prompt demoUser Password:Repeat User Password:+-----------+----------------------------------+| Field | Value |+-----------+----------------------------------+| domain_id | 8af40091347e4b109d44feae01fc4356 || enabled | True || id | a78ec26501374df4a574bd3f8153d67f || name | demo |+-----------+----------------------------------+密碼設置爲demo
建立角色User
[root@linux-node1 ~]# openstack role create user+-----------+----------------------------------+| Field | Value |+-----------+----------------------------------+| domain_id | None || id | 4161dec8714f468f832a55a6ec2abb9e || name | user |+-----------+----------------------------------+提示:角色一共就只有兩種,一個是admin另外一個就是user了
受權
[root@linux-node1 ~]# openstack role add --project demo --user demo user把demo用戶添加到demo項目並授予user角色
建立一個service項目
咱們各個服務之間須要去訪問keystone
,那麼訪問keystone就須要作認證,就須要咱們建立用戶,這個用戶就要屬於一個項目。因此咱們要先建立一個server項目而後咱們還須要給每一個項目單首創建一個用戶
[root@linux-node1 ~]# openstack project create --domain default --description "Demo Project" service+-------------+----------------------------------+| Field | Value |+-------------+----------------------------------+| description | Demo Project || domain_id | 8af40091347e4b109d44feae01fc4356 || enabled | True || id | 1c2419156c1b4214b53c50f3f075aeb3 || is_domain | False || name | service || parent_id | 8af40091347e4b109d44feae01fc4356 |+-------------+----------------------------------+
提示:咱們建立server
項目是給服務用戶用的,如今咱們就須要建立openstack組件
全部的服務的用戶,openstack
官方文檔是沒操做一個服務就建立一個用戶,咱們在這直接建立完全部用戶
建立glance用戶
[root@linux-node1 ~]# openstack user create --domain default --password-prompt glanceUser Password:Repeat User Password:+-----------+----------------------------------+| Field | Value |+-----------+----------------------------------+| domain_id | 8af40091347e4b109d44feae01fc4356 || enabled | True || id | c57d19c6b3784c53b40c48013c11530a || name | glance |+-----------+----------------------------------+受權[root@linux-node1 ~]# openstack role add --project service --user glance admin
建立Nova用戶
[root@linux-node1 ~]# openstack user create --domain default --password-prompt novaUser Password:Repeat User Password:+-----------+----------------------------------+| Field | Value |+-----------+----------------------------------+| domain_id | 8af40091347e4b109d44feae01fc4356 || enabled | True || id | c9a1b50f0b1c42b4a218b2e8dc43078c || name | nova |+-----------+----------------------------------+[root@linux-node1 ~]# openstack role add --project service --user nova admin
建立neutron用戶並受權
[root@linux-node1 ~]# openstack user create --domain default --password-prompt neutronUser Password:Repeat User Password:+-----------+----------------------------------+| Field | Value |+-----------+----------------------------------+| domain_id | 8af40091347e4b109d44feae01fc4356 || enabled | True || id | 99939909b95f4d8aa2ad59622ae10432 || name | neutron |+-----------+----------------------------------+[root@linux-node1 ~]# openstack role add --project service --user neutron admin
建立glance用戶並受權
[root@linux-host1 ~]# openstack user create --domain default --password-prompt glanceUser Password:Repeat User Password:+-----------+----------------------------------+| Field | Value |+-----------+----------------------------------+| domain_id | f5282392070044e18b5e93299ee15b5a || enabled | True || id | 4ee18653aa5b47f293fdf8ed658b221c || name | glance |+-----------+----------------------------------+[root@linux-node1 ~]# openstack role add --project service --user glance admin
舒適提示:若是出現錯誤可使用如下命令進行排錯
用戶相關設置:openstack user –help
[root@linux-node1 ~]# openstack user --helpCommand "user" matches: user create user delete user list user password set user set user show
服務相關設置:
[root@linux-node1 ~]# openstack service --helpCommand "service" matches: service create service delete service list service provider create service provider delete service provider list service provider set service provider show service set service showopenstack project list查看是否有項目openstack user list 查看是否有用戶
以上就是keystone的用戶部署
keystone還有一個功能是服務註冊
,咱們須要將服務註冊到上面來
建立服務
[root@linux-node1 ~]# openstack service create --name keystone --description "OpenStack Identity" identity+-------------+----------------------------------+| Field | Value |+-------------+----------------------------------+| description | OpenStack Identity || enabled | True || id | 22e86b1d085d46d58b5db1aae7f8d26d || name | keystone || type | identity |+-------------+----------------------------------+其餘服務過來找的時候就會查找是否含有相似爲identity
建立endpoint
前文介紹: Endpoint
翻譯爲「端點
」,咱們能夠理解它是一個服務暴露出來的訪問點,若是須要訪問一個服務,則必須知道他的endpoint。Endpoint的每一個URL都對應一個服務實例的訪問地址,而且具備public、orivate和admin
這三種權限。pubic url
能夠徹底被全局訪問,private url
只能被局域網訪問,admin url
被從常規的訪問中分離。
建立公有端點(public)
[root@linux-node1 ~]# openstack endpoint create --region RegionOne identity public http://192.168.56.11:5000/v3+--------------+----------------------------------+| Field | Value |+--------------+----------------------------------+| enabled | True || id | 041e59113fb84bc1955b4853719e5bdf || interface | public || region | RegionOne || region_id | RegionOne || service_id | 22e86b1d085d46d58b5db1aae7f8d26d || service_name | keystone || service_type | identity || url | http://192.168.56.11:5000/v3 |+--------------+----------------------------------+
建立私有端點(internal)
[root@linux-node1 ~]# openstack endpoint create --region RegionOne identity internal http://192.168.56.11:5000/v3+--------------+----------------------------------+| Field | Value |+--------------+----------------------------------+| enabled | True || id | 5dbf154c482144848a45314c38d86751 || interface | internal || region | RegionOne || region_id | RegionOne || service_id | 22e86b1d085d46d58b5db1aae7f8d26d || service_name | keystone || service_type | identity || url | http://192.168.56.11:5000/v3 |+--------------+----------------------------------+
建立admin
咱們須要將端口改爲35357
,由於keystone
比較特殊,須要單獨一個端口
[root@linux-node1 ~]# openstack endpoint create --region RegionOne identity admin http://192.168.56.11:35357/v3+--------------+----------------------------------+| Field | Value |+--------------+----------------------------------+| enabled | True || id | 30138e420b5b4625a9c8ee2bca56b2d5 || interface | admin || region | RegionOne || region_id | RegionOne || service_id | 22e86b1d085d46d58b5db1aae7f8d26d || service_name | keystone || service_type | identity || url | http://192.168.56.11:35357/v3 |+--------------+----------------------------------+舒適提示:若是一不當心輸入錯了,須要將三個端點刪除重新建立
檢查keystone是否安裝成功
測試以前咱們須要刪除刪除環境變量unset OS_TOKEN OS_URL
帳號是admin
,密碼咱們設置的是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 issuePassword: +------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| Field | Value |+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| expires | 2016-11-17T04:51:30.580499Z || id | gAAAAABYLSlCWrN1SZuiZsXNPLo5-JosU1wrgfiwxHBTYPFqfStOZNa8jFSyYhMSPeeC5Fj1qHTJ9ct67IzqjhFcpWrsj7dkRPajxh7NbUAoJsM7aeRJTgWCx7oWQgoR5VqcItnu0ru_45we71BG_mrd9fJxRinPbbDbjEMkpGSN || | XJeOyhSCYrA || project_id | 026a58f98402437fa95ef4a21fbd4d1a || user_id | a809e8be52c84732aecd8ebb93481d65 |+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
用這個用戶名和密碼獲取一個token
,若是能夠獲取到說明正常,若是沒有獲取到說明失敗
測試demo用戶
密碼咱們一樣設置的是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 issuePassword: +------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| Field | Value |+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| expires | 2016-11-17T04:56:37.343347Z || id | gAAAAABYLSp17aa9fPaMORIV-wpQa2cxCHfBiU5RbhlW8fPu-uIUsKuXj4gaI8NWLCj7Y3GIam8752UY0miXJxnvJ7ew3lMPpCnYLPrObmvXmo1yeKa391u9yucUbKGIX-ma- || | O0iijuy7-XNcGbKa2Ylwij3j3xbyaIUwiiRddnObNx3ZPVjTEo || project_id | ff5398ee1b2e4d00bafd57f82dc150e6 || user_id | a78ec26501374df4a574bd3f8153d67f |+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
建立腳本
建立admin
和demo
項目和用戶建立客戶端環境變量腳本,爲了之後的方便而建立
[root@linux-node1 ~]# cat admin-openstack.shexport OS_PROJECT_DOMAIN_NAME=default export OS_USER_DOMAIN_NAME=default export OS_PROJECT_NAME=admin export OS_USERNAME=adminexport OS_PASSWORD=adminexport OS_AUTH_URL=http://192.168.56.11:35357/v3export OS_IDENTITY_API_VERSION=3export OS_IMAGE_API_VERSION=2
測試腳本是否生效
建立完成後,咱們下次在想驗證token
就能夠直接使用命令來執行
[root@linux-node1 ~]# source admin-openstack.sh [root@linux-node1 ~]# openstack token issue+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| Field | Value |+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| expires | 2016-11-17T07:52:13.398484Z || id | gAAAAABYLVOdq_gR3JayGSrGeEnJZJHeCxAmkxpAZ9asbj8IH91-jDgImQrVprlPvMO2qXlLAAV3mShVSvEOmMoGpDaCG_ulcr0EB0xo1v- || | p171xzH3E7ke5NaNNdZWOlIfFmLACa7sA5wULKVz7kSBbS4g_h_bJq0lxr7ev4MX8FsWRnmmtGZI || project_id | 026a58f98402437fa95ef4a21fbd4d1a || user_id | a809e8be52c84732aecd8ebb93481d65 |+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+[root@linux-node1 ~]#
編寫demo的環境
[root@linux-node1 ~]# cat demo-openstack.shexport OS_PROJECT_DOMAIN_NAME=defaultexport OS_USER_DOMAIN_NAME=defaultexport OS_PROJECT_NAME=demoexport OS_USERNAME=demoexport OS_PASSWORD=demoexport OS_AUTH_URL=http://192.168.56.11:5000/v3export OS_IDENTITY_API_VERSION=3export OS_IMAGE_API_VERSION=2[root@linux-node1 ~]# source demo-openstack.sh[root@linux-node1 ~]# openstack token issue+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| Field | Value |+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| expires | 2016-11-17T07:54:19.996447Z || id | gAAAAABYLVQc_H2-tIGst4GvEhpu03taLaXP9yE1Yru2foNEzvdW5zFErR_8nvyqkZ2-f8HoHSOpVcRvDPxbujk93uB4a0meYWRS6Ve5zYFZ7v74CbmMRkB-f7hThsTET1uazzKDXFP46gzBV3G135NT-xdjKp- || | pQv58ZNm7BVHSXVtMIES289M || project_id | ff5398ee1b2e4d00bafd57f82dc150e6 || user_id | a78ec26501374df4a574bd3f8153d67f |+------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
之後咱們要執行openstack
命令,直接執行這個環境變量便可
---------以上就是keystone的配置----------