keystone是OpenStack的組件之一,用於爲OpenStack家族中的其它組件成員提供統一的認證服務,包括身份驗證、令牌的發放和校驗、服務列表、用戶權限的定義等等。雲環境中全部的服務之間的受權和認證都須要通過 keystone. 所以 keystone 是雲平臺中第一個即須要安裝的服務。html
做爲 OpenStack 的基礎支持服務,Keystone 作下面這幾件事情:python
管理用戶及其權限mysql
維護 OpenStack Services 的 Endpoint(服務端點)linux
Authentication(認證)和 Authorization(鑑權)redis
例如:sql
學習 Keystone,得理解下面這些概念:數據庫
keystone的相關概念能夠以一個城市的酒店服務來舉例說明:apache
酒店就相似於project項目,酒店提供住宿的服務service,user至關於客人,endpoint至關於客人住酒店時的詢問的酒店的地址,role爲角色,如客人定了個豪華套房,name他就是貴賓,定了標間,他就是普通客人,credentials至關於入住酒店時提供的身份證,酒店前臺利用身份證獲取身份信息並提供房間,這個過程至關於authentication,辦理入住後拿到的房卡至關於token,利用token就能夠刷開房間門進行住宿這項service。json
1> Userbootstrap
User 指代任何使用 OpenStack 的實體,能夠是真正的用戶,其餘系統或者服務。
當 User 請求訪問 OpenStack 時,Keystone 會對其進行驗證。Horizon 在 Identity->Users 管理 User
admin:openstack平臺的超級管理員,負責openstack服務的管理和訪問權限
demo: 常規(非管理)任務應該使用無特權的項目和用戶,全部要建立 demo 項目和 demo 用戶
除了 admin 和 demo,OpenStack 也爲 nova、cinder、glance、neutron 服務建立了相應的 User。 admin 也能夠管理這些 User。
2> credentials
Credentials 是 User 用來證實本身身份的信息,能夠是:
用戶名/密碼
Token
API Key
其餘高級方式
3> Authentication
Authentication 是 Keystone 驗證 User 身份的過程。User 訪問 OpenStack 時向 Keystone 提交用戶名和密碼形式的 Credentials,Keystone 驗證經過後會給 User 簽發一個 Token 做爲後續訪問的 Credential。
4> Token
Token 是由數字和字母組成的字符串,User 成功 Authentication 後 Keystone 生成 Token 並分配給 User。
Token 用作訪問 Service 的 Credential
Service 會經過 Keystone 驗證 Token 的有效性
Token 的有效期默認是 24 小時
5> oject
Project 用於將 OpenStack 的資源(計算、存儲和網絡)進行分組和隔離。
根據 OpenStack 服務的對象不一樣,Project 能夠是一個客戶(公有云,也叫租戶)、部門或者項目組(私有云)。
這裏請注意:
資源的全部權是屬於 Project 的,而不是 User。
在 OpenStack 的界面和文檔中,Tenant / Project / Account 這幾個術語是通用的,但長期看會傾向使用 Project
每一個 User(包括 admin)必須掛在 Project 裏才能訪問該 Project 的資源。 一個User能夠屬於多個 Project。
admin 至關於 root 用戶,具備最高權限
Horizon 在 Identity->Projects 中管理 Project
經過 Manage Members 將 User 添加到 Project
6> service
OpenStack 的 Service 包括 Compute (Nova)、Block Storage (Cinder)、Object Storage (Swift)、Image Service (Glance) 、Networking Service (Neutron) 等。每一個 Service 都會提供若干個 Endpoint,User 經過 Endpoint 訪問資源和執行操做。
7> Endpoint
Endpoint 是一個網絡上可訪問的地址,一般是一個 URL。Service 經過 Endpoint 暴露本身的 API。 Keystone 負責管理和維護每一個 Service 的 Endpoint。
可使用下面的命令來查看 Endpoint。
source devstack/openrc admin admin
openstack catalog list
8> Role
安全包含兩部分:Authentication(認證)和 Authorization(鑑權)
Authentication 解決的是「你是誰?」的問題
Authorization 解決的是「你能幹什麼?」的問題
Keystone 藉助 Role 實現 Authorization:
上面配置的含義是:對於 create、attach_network 和 attach_volume 操做,任何Role的 User 均可以執行; 但只有 admin 這個 Role 的 User 才能執行 forced_host 操做。
2. OpenStack 默認配置只區分 admin 和非 admin Role。 若是須要對特定的 Role 進行受權,能夠修改 policy.json。
Openstack對User的驗證除了身份驗證,還須要鑑別 User 對某個Service是否有訪問權限。Policy用來定義什麼角色對應什麼權限。對Keystone來講,Policy實際上是一個JSON文件,默認是 /etc/keystone/policy.json 。經過Policy,Keystone實現了對User的權限管理。
3. openstack系統基本角色有兩個:
一個是管理員admin
一個是租戶_member_
•Token: 用來生成和管理token
•Catalog:用來存儲和管理service/endpoint
•Identity:用來管理tenant/user/role和驗證
•Policy:用來管理訪問權限
能夠經過「查詢可用 image」這個實際操做讓你們對這些概念創建更加感性的認識。User admin 要查看 Project 中的 image
第 1 步 登陸
當點擊 時,OpenStack 內部發生了哪些事情?請看下面
Token 中包含了 User 的 Role 信息
第 2 步 顯示操做界面
請注意,頂部顯示 admin 可訪問的 Project 爲 「admin」 和 「demo」。 其實在此以前發生了一些事情:
同時,admin 能夠訪問 Intance, Volume, Image 等服務
這是由於 admin 已經從 Keystone 拿到了各 Service 的 Endpoints
第 3 步 顯示 image 列表
點擊 「Images」,會顯示 image 列表
背後發生了這些事:
首先 admin 將請求發送到 Glance 的 Endpoint
Glance 向 Keystone 詢問 admin 身份是否有效
接下來 Glance 會查看 /etc/glance/policy.json 判斷 admin 是否有查看 image 的權限
權限斷定經過,Glance 將 image 列表發給 admin。
Troubleshoot
OpenStack 排查問題的方法主要是經過日誌。每一個 Service 都有本身的日誌文件。
Keystone 主要有兩個日誌: keystone.log 和 keystone_access.log,保存在 /var/log/apache2/ 目錄裏。devstack 的 screen 窗口已經幫咱們打開了這兩個日誌。 能夠直接查看:
若是須要獲得最詳細的日誌信息,能夠在 /etc/keystone/keystone.conf 中打開 debug 選項。
在非 devstack 安裝中,日誌可能在 /var/log/keystone/ 目錄裏。
能夠經過訪問OpenStack的官網:https://docs.openstack.org/stein/ ,中文版的操做手冊版本只有M版本,所以用英文版來操做選擇ocata版原本進行部署。
進入ocata版本後下拉選擇installation Guides,進入後選擇centos環境進行操做。
進入操做手冊後能夠選擇在線看,也能夠選擇下載PDF看。
選擇在線觀看,進入操做手冊界面。
但因爲官網下載速度較慢,此處實驗使用內網從已下載的網頁資源進行部署,部署內容與官網操做一致。在終端192.168.16.66上部署,部署是要善用虛擬機快照。
1> 對OpenStack所用到的四臺終端均進行域名解析。
[root@ajy6 ~]# vim /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.16.65 ajy5 192.168.16.66 ajy6 192.168.16.68 ajy8 192.168.16.69 ajy9
2> 選擇Environment,在生產環境中NTP服務是必定要部署的,但在實驗環境中爲了節省時間,直接進行OpenStack package 部署。部署過程按照官網步提供的驟進行便可。
3> 根據官網提示,先進行centos環境裏OpenStack源的配置。
也能夠直接使用內網已經準備好的源。
[root@ajy6 ~]# cd /etc/yum.repos.d/
[root@ajy6 yum.repos.d]# ls
Centos7-Base-yunwei.repo rdo-release-yunwei.repo epel-yunwei.repo
4> 安裝OpenStack client的安裝包
安裝以前確保防火牆和selinux是關閉的。
yum install python-openstackclient
5> 安裝OpenStack selinux的擴展包。
[root@ajy6 ~]# yum install openstack-selinux -y
6> 部署數據庫
1) 安裝
[root@ajy6 ~]# yum install openstack-selinux -y
2) 編輯數據庫配置文件
[root@ajy6 ~]# cd /etc/my.cnf.d/ [root@ajy6 my.cnf.d]# ls auth_gssapi.cnf enable_encryption.preset mysql-clients.cnf client.cnf mariadb-server.cnf tokudb.cnf
默認數據庫配置文件爲mariadb-server.cnf,此處不使用默認的配置文件,新建一個openstack.cnf的配置文件,使用官方模板
[root@ajy6 my.cnf.d]# vim openstack.cnf [mysqld] bind-address = 192.168.16.66 #監聽地址改成本地主機地址 default-storage-engine = innodb #默認引擎 innodb_file_per_table = on #過濾規則 max_connections = 4096 #最大鏈接數 collation-server = utf8_general_ci #字符集 character-set-server = utf8
3) 啓動數據庫,並開機自啓
[root@ajy6 my.cnf.d]# systemctl start mariadb.service [root@ajy6 my.cnf.d]# systemctl enable mariadb.service Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.
4) 數據庫初始化
[root@ajy6 my.cnf.d]# mysql_secure_installation ......... [root@ajy6 my.cnf.d]# mysql -uroot -p123 Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 9 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)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | +--------------------+ 3 rows in set (0.00 sec)
7> 部署消息隊列
1) 安裝RabbitMQ
[root@ajy6 my.cnf.d]# yum install rabbitmq-server
2) 啓動消息隊列服務並開機自啓
[root@ajy6 ~]# systemctl start rabbitmq-servre.service Failed to start rabbitmq-servre.service: Unit not found. #重啓失敗,刪除多於的緩存文件再啓動 [root@ajy6 ~]# cd /var/lib/rabbitmq/ [root@ajy6 rabbitmq]# ls erl_crash.dump mnesia [root@ajy6 rabbitmq]# rm -rf * [root@ajy6 ~]# systemctl start rabbitmq-server.service [root@ajy6 ~]# systemctl enable rabbitmq-server.service Created symlink from /etc/systemd/system/multi-user.target.wants/rabbitmq-server.service to /usr/lib/systemd/system/rabbitmq-server.service.
3) 添加用戶OpenStack,並給予權限
[root@ajy6 ~]# rabbitmqctl add_user openstack 123 Creating user "openstack" ... [root@ajy6 ~]# rabbitmqctl set_permissions openstack ".*" ".*" ".*" Setting permissions for user "openstack" in vhost "/" ...
8> 部署Memcache
1) 下載安裝
[root@ajy6 ~]# yum install memcached python-memcached -y
2) 編輯mamcache配置文件
[root@ajy6 ~]# vim /etc/sysconfig/memcached PORT="11211" USER="memcached" MAXCONN="1024" CACHESIZE="64" OPTIONS="-l 127.0.0.1,::1,ajy6" #添加主機名或主機ip都可
3) 啓動Memcache服務
[root@ajy6 ~]# systemctl start memcached.service [root@ajy6 ~]# systemctl enable memcached.service Created symlink from /etc/systemd/system/multi-user.target.wants/memcached.service to /usr/lib/systemd/system/memcached.service.
1> 登陸數據庫,建立keystone數據庫
[root@ajy6 ~]# mysql -uroot -p123 MariaDB [(none)]> create database keystone; Query OK, 1 row affected (0.00 sec) MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | keystone | | mysql | | performance_schema | +--------------------+
2> 給keystone數據庫賦權
MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' \ #本地登陸 -> IDENTIFIED BY 'KEYSTONE_DBPASS'; MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' \ #第三方登陸 -> IDENTIFIED BY 'KEYSTONE_DBPASS'; MariaDB [(none)]> exit Bye
3> 安裝keystone服務
[root@ajy6 ~]# yum install openstack-keystone httpd mod_wsgi -y
keystone沒有本身單獨的服務,只是一我的軟件包,keystone經過加載mod_wsgi模塊調用http來對外服務。
4> 修改keystone的配置文件
[root@ajy6 ~]# cd /etc/keystone/ [root@ajy6 keystone]# ls default_catalog.templates logging.conf keystone.conf policy.json keystone-paste.ini sso_callback_template.html # 刪除keyston.conf全部文件按照官方文檔從新配置,因此配置以前先備份。 [root@ajy6 keystone]# cp keystone.conf keystone.conf.bak [root@ajy6 keystone]# vim keystone.conf #編輯配置端,大部分默認段是空的,只修改兩處:主機和令牌提供者的插件 [DEFAULT] [assignment] [auth] [cache] [catalog] [cors] [cors.subdomain] [credential] [database] connection = mysql+pymysql://keystone:KEYSTONE_DBPASS@ajy6/keystone #已作過域名解析能夠寫主機名,也能夠寫主機ip [domain_config] [endpoint_filter] [endpoint_policy] [eventlet_server] [federation] [fernet_tokens] [healthcheck] [identity] [identity_mapping] [kvs] [ldap] [matchmaker_redis] [memcache] [oauth1] [oslo_messaging_amqp] [oslo_messaging_kafka] [oslo_messaging_notifications] [oslo_messaging_rabbit] [oslo_messaging_zmq] [oslo_middleware] [oslo_policy] [paste_deploy] [policy] [profiler] [resource] [revoke] [role] [saml] [security_compliance] [shadow_users] [signing] [token] #令牌由插件fernet提供 provider = fernet [tokenless_auth] [trust]
5> 同步數據庫
[root@ajy6 ~]# su -s /bin/sh -c "keystone-manage db_sync" keystone
同步數據庫後查看導入到數據庫的表,有表存在則同步成功。
[root@ajy6 ~]# mysql -uroot -p123 MariaDB [(none)]> use keystone MariaDB [keystone]> show tables; +------------------------+ | Tables_in_keystone | +------------------------+ | access_token | | assignment | | config_register | | consumer | | credential | | endpoint | | endpoint_group | | federated_user | | federation_protocol | | group | | id_mapping | | identity_provider | | idp_remote_ids | | implied_role | | local_user | | mapping | | migrate_version | | nonlocal_user | | password | | policy | | policy_association | | project | | project_endpoint | | project_endpoint_group | | region | | request_token | | revocation_event | | role | | sensitive_config | | service | | service_provider | | token | | trust | | trust_role | | user | | user_group_membership | | user_option | | whitelisted_config | +------------------------+ 38 rows in set (0.00 sec) MariaDB [keystone]> exit Bye
6> 用fernet設置token
[root@ajy6 ~]# keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
[root@ajy6 ~]# keystone-manage credential_setup --keystone-user keystone --keystone-group keystone
7> 設置keystone服務端點並設置admin用戶密碼
[root@ajy6 ~]# keystone-manage bootstrap --bootstrap-password admin \ #用戶密碼爲admin > --bootstrap-admin-url http://ajy6:35357/v3/ \ #管理網,端口爲35357 > --bootstrap-internal-url http://ajy6:5000/v3/ \ #內網,端口爲5000 > --bootstrap-public-url http://ajy6:5000/v3/ \ #公共網,端口爲5000 > --bootstrap-region-id RegionOne #工做域
8> 配置http服務,加入主機名
[root@ajy6 ~]# vim /etc/httpd/conf/httpd.conf #ServerName www.example.com:80 ServerName ajy6
9> 建立插件wsgi調用http的連接
[root@ajy6 ~]# ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/ [root@ajy6 ~]# cd /etc/httpd/conf.d/ [root@ajy6 conf.d]# ll lrwxrwxrwx 1 root root 38 Jun 29 02:55 wsgi-keystone.conf -> /usr/share/keystone/wsgi-keystone.conf
10> 啓動httpd服務,則將keystone服務啓動
[root@ajy6 ~]# systemctl start httpd [root@ajy6 ~]# systemctl enable httpd Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
11> 配置admin用戶的環境變量。
在命令行要控制OpenStack環境必須進行登陸,所以須要在命令將OpenStack admin身份信息設置爲環境變量,宣告admin身份信息。
環境變量保存在/root/openrc下面,文件名openrc自定義。
[root@ajy6 ~]# pwd /root [root@ajy6 ~]# vim openrc 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://ajy6:35357/v3 #主機 export OS_IDENTITY_API_VERSION=3
執行文件腳本,宣告環境變量
[root@ajy6 ~]# sh openrc
#或者用命令source
[root@ajy6 ~]# source openrc
宣告完成後就至關於在圖形界面使用帳戶密碼登陸OpenStack,所以可使用openstack 命令了。
#查看OpenStack裏面的用戶 [root@ajy6 ~]# openstack user list +----------------------------------+-------+ | ID | Name | +----------------------------------+-------+ | 4a3f3226d6a74669a23da16b623c386c | admin | +----------------------------------+-------+
1> 建立一個服務項目
[root@ajy6 ~]# openstack project create --domain default \ > --description "Service Project" service #建立一個service項目,默認在domain域 +-------------+----------------------------------+ | Field | Value | +-------------+----------------------------------+ | description | Service Project | | domain_id | default | | enabled | True | | id | 6338a2d46b78461fb172e3f5a4774482 | | is_domain | False | | name | service | | parent_id | default |
查看項目列表
[root@ajy6 ~]# openstack project list
+----------------------------------+---------+
| ID | Name |
+----------------------------------+---------+
| 6338a2d46b78461fb172e3f5a4774482 | service |
| 9856add5c8ad499b8b7e07b2d8cf0c0d | admin |
+----------------------------------+---------+
2> 建立demo項目
[root@ajy6 ~]# openstack project create --domain default \ > --description "Demo Project" demo +-------------+----------------------------------+ | Field | Value | +-------------+----------------------------------+ | description | Demo Project | | domain_id | default | | enabled | True | | id | a617fd3550a74b039ceec50afec1e370 | | is_domain | False | | name | demo | | parent_id | default | +-------------+----------------------------------+ [root@ajy6 ~]# openstack project list +----------------------------------+---------+ | ID | Name | +----------------------------------+---------+ | 6338a2d46b78461fb172e3f5a4774482 | service | | 9856add5c8ad499b8b7e07b2d8cf0c0d | admin | | a617fd3550a74b039ceec50afec1e370 | demo | +----------------------------------+---------+
3> 建立demo用戶
[root@ajy6 ~]# openstack user create --domain default \ > --password-prompt demo User Password: #爲方便記憶,用戶和密碼均爲demo Repeat User Password: +---------------------+----------------------------------+ | Field | Value | +---------------------+----------------------------------+ | domain_id | default | | enabled | True | | id | fca9c0d1f4fb4524a25ee8562794f6c0 | | name | demo | | options | {} | | password_expires_at | None | +---------------------+----------------------------------+ [root@ajy6 ~]# openstack user list +----------------------------------+-------+ | ID | Name | +----------------------------------+-------+ | 4a3f3226d6a74669a23da16b623c386c | admin | | fca9c0d1f4fb4524a25ee8562794f6c0 | demo | +----------------------------------+-------+ #刪除用戶用命令 user delete [root@ajy6 ~]# openstack user delete demo [root@ajy6 ~]# openstack user list +----------------------------------+-------+ | ID | Name | +----------------------------------+-------+ | 4a3f3226d6a74669a23da16b623c386c | admin | +----------------------------------+-------+ #從新建立用戶demo,直接在添加的時候寫入密碼 [root@ajy6 ~]# openstack user create --domain default --password=demo demo +---------------------+----------------------------------+ | Field | Value | +---------------------+----------------------------------+ | domain_id | default | | enabled | True | | id | a5b7806347f04a839e5f87098c45e8b1 | | name | demo | | options | {} | | password_expires_at | None | +---------------------+----------------------------------+
4> 建立角色user
[root@ajy6 ~]# openstack role list +----------------------------------+----------+ | ID | Name | +----------------------------------+----------+ | 6a7c42942f1a4a3881c1b89f0052de38 | admin | | 9fe2ff9ee4384b1894a90878d3e92bab | _member_ | +----------------------------------+----------+ [root@ajy6 ~]# openstack role create user +-----------+----------------------------------+ | Field | Value | +-----------+----------------------------------+ | domain_id | None | | id | 58e8774b5b01404bbbc1feec776abcfe | | name | user | +-----------+----------------------------------+ [root@ajy6 ~]# openstack role list +----------------------------------+----------+ | ID | Name | +----------------------------------+----------+ | 58e8774b5b01404bbbc1feec776abcfe | user | | 6a7c42942f1a4a3881c1b89f0052de38 | admin | | 9fe2ff9ee4384b1894a90878d3e92bab | _member_ | +----------------------------------+----------+
5> 將角色user添加到demo項目的demo用戶
[root@ajy6 ~]# openstack role add --project demo --user demo user