keystone 是OpenStack的組件之一,用於爲OpenStack家族中的其它組件成員提供統一的認證服務,包括身份驗證、令牌的發放和校驗、服務列表、用戶權限的定義等等。雲環境中全部的服務之間的受權和認證都須要通過 keystone. 所以 keystone 是雲平臺中第一個即須要安裝的服務。node
做爲 OpenStack 的基礎支持服務,Keystone 作下面這幾件事情:
(1)管理用戶及其權限
(2)維護 OpenStack Services 的 Endpoint
(3)Authentication(認證)和 Authorization(鑑權)python
1)Usermysql
User指任何可使用OpenStack的實體,能夠是真正的用戶,能夠是其餘系統或服務。linux
User訪問OpenStack時,keystone會對其進行驗證。redis
admin:openstack平臺的超級管理員,負責openstack服務的管理和訪問權限sql
demo: 常規(非管理)任務應該使用無特權的項目和用戶,全部要建立 demo 項目和 demo 用戶。數據庫
除了admin和demo,OpenStack也爲nova、cinder、glance、neutron服務建立了相應的User。json
2)Credentialsbootstrap
Credentials是User用來證實本身身份的信息,能夠是:vim
(1)用戶名/密碼
(2)Token
(3)API Key
(4)其餘高級方式
3)Authentication
Authentication 是 Keystone 驗證 User 身份的過程。User 訪問 OpenStack 時向 Keystone 提交用戶名和密碼形式的 Credentials,Keystone 驗證經過後會給 User 簽發一個 Token 做爲後續訪問的 Credential。
4)Token
Token 是由數字和字母組成的字符串,User 成功 Authentication 後 Keystone 生成 Token 並分配給 User。
(1)Token 用作訪問 Service 的 Credential
(2)Service 會經過 Keystone 驗證 Token 的有效性
(3)Token 的有效期默認是 24 小時
5)Project
Project 用於將 OpenStack 的資源(計算、存儲和網絡)進行分組和隔離。根據 OpenStack 服務的對象不一樣,Project 能夠是一個客戶(公有云,也叫租戶)、部門或者項目組(私有云)。
注意:
(1)資源的全部權是屬於 Project 的,而不是 User。
(2)在 OpenStack 的界面和文檔中,Tenant / Project / Account 這幾個術語是通用的,但長期看會傾向使用 Project
(3)每一個 User(包括 admin)必須掛在 Project 裏才能訪問該 Project 的資源。 一個User能夠屬於多個 Project。
(4)admin 至關於 root 用戶,具備最高權限
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:
openstack catalog list [root@node1 ~]# openstack catalog list +----------+----------+-----------------------------------+ | Name | Type | Endpoints | +----------+----------+-----------------------------------+ | keystone | identity | RegionOne | | | | admin: http://node1:35357/v3/ | | | | RegionOne | | | | public: http://node1:5000/v3/ | | | | RegionOne | | | | internal: http://node1:5000/v3/ | | | | | +----------+----------+-----------------------------------+
8)Role
安全包含兩部分:Authentication(認證)和 Authorization(鑑權)
Authentication 解決的是「你是誰?」的問題
Authorization 解決的是「你能幹什麼?」的問題
Keystone 藉助 Role 實現 Authorization:
Keystone定義Role
能夠爲 User 分配一個或多個 Role,Service 決定每一個 Role 能作什麼事情 Service 經過各自的 policy.json 文件對 Role 進行訪問控制。 下面是 Nova 服務 /etc/nova/policy.json 中的示例:
上面配置的含義是:對於 create、attach_network 和 attach_volume 操做,任何Role的 User 均可以執行; 但只有 admin 這個 Role 的 User 才能執行 forced_host 操做。
OpenStack 默認配置只區分 admin 和非 admin Role。 若是須要對特定的 Role 進行受權,能夠修改 policy.json。
Openstack對User的驗證除了身份驗證,還須要鑑別 User 對某個Service是否有訪問權限。Policy用來定義什麼角色對應什麼權限。對Keystone來講,Policy實際上是一個JSON文件,默認是 /etc/keystone/policy.json 。經過Policy,Keystone實現了對User的權限管理。
1)安裝openstack環境
yum install python-openstackclient
yum install openstack-selinux
2)準備數據庫
yum install mariadb mariadb-server python2-PyMySQL vim /etc/my.cnf.d/openstack.cnf [mysqld] bind-address = 192.168.52.101 default-storage-engine = innodb innodb_file_per_table = on max_connections = 4096 collation-server = utf8_general_ci character-set-server = utf8 systemctl enable mariadb.service systemctl start mariadb.service mysql_secure_installation #進行數據庫初始化
3)搭建消息隊列服務
yum install rabbitmq-server systemctl restart rabbitmq-server.service systemctl enable rabbitmq-server.service 建立openstack用戶 rabbitmqctl add_user openstack openstack rabbitmqctl set_permissions openstack ".*" ".*" ".*"
4)建立緩存服務
yum install memcached python-memcached vim /etc/sysconfig/memcached OPTIONS="-l 127.0.0.1,::1,controller,node1" systemctl restart memcached.service systemctl enable memcached.service
1)安裝和配置
(1)登陸數據庫
mysql -uroot -p MariaDB [(none)]> create database keystone; #建立keystone數據庫 MariaDB [(none)]> grant all privileges on keystone.* to 'keystone'@'localhost' identified by 'KEYSTONE_DBPASS'; #授予用戶權限並設置密碼,容許在本機登陸 grant all privileges on keystone.* to 'keystone'@'%' identified by 'KEYSTONE_DBPASS'; #授予用戶權限並設置密碼,容許在任意主機登陸
(2)安裝keystone包並進行配置
yum install openstack-keystone httpd mod_wsgi vim /etc/keystone/keystone.conf [database] connection = mysql+pymysql://keystone:KEYSTONE_DBPASS@node1/keystone [token] provider = fernet
或者按照下列方法進行設置
cp /etc/keystone/keystone.conf /etc/keystone/keystone.conf.bak -a #備份配置文件 vim /etc/keystone/keystone.conf #將配置文件中的內容所有刪除並添加如下內容 [DEFAULT] [assignment] [auth] [cache] [catalog] [cors] [cors.subdomain] [credential] [database] connection = mysql+pymysql://keystone:KEYSTONE_DBPASS@controller/keystone [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] provider = fernet [tokenless_auth] [trust]
(3)加載數據到數據庫
su -s /bin/sh -c "keystone-manage db_sync" keystone
(4)初始化fernet祕鑰存儲庫
keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
keystone-manage credential_setup --keystone-user keystone --keystone-group keystone
(5)引導認證服務
keystone-manage bootstrap --bootstrap-password admin \ > --bootstrap-admin-url http://node1:35357/v3/ \ > --bootstrap-internal-url http://node1:5000/v3/ \ > --bootstrap-public-url http://node1:5000/v3/ \ > --bootstrap-region-id RegionOne
(6)配置httpd服務
vim /etc/httpd/conf/httpd.conf ServerName node1 #只修改此處 ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/ #建立軟連接 [root@node1 ~]# cd /etc/httpd/conf.d [root@node1 conf.d]# ls -l 總用量 16 -rw-r--r-- 1 root root 2926 11月 5 2018 autoindex.conf -rw-r--r-- 1 root root 366 11月 5 2018 README -rw-r--r-- 1 root root 1252 10月 30 2018 userdir.conf -rw-r--r-- 1 root root 824 10月 30 2018 welcome.conf lrwxrwxrwx 1 root root 38 7月 29 14:47 wsgi-keystone.conf -> /usr/share/keystone/wsgi-keystone.conf systemctl restart httpd.service systemctl enable httpd.service
(7)設置登陸信息
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://node1:35357/v3 export OS_IDENTITY_API_VERSION=3 source openrc在命令行模式下登入openstack
2)建立域、項目、用戶、角色
建立service項目 openstack project create --domain default --description "Service Project" service +-------------+----------------------------------+ | Field | Value | +-------------+----------------------------------+ | description | Service Project | | domain_id | default | | enabled | True | | id | a1710fdff32a4605a8ab549f8680dd45 | | is_domain | False | | name | service | | parent_id | default | +-------------+----------------------------------+ 建立demo項目 openstack project create --domain default --description "Demo Project" demo +-------------+----------------------------------+ | Field | Value | +-------------+----------------------------------+ | description | Demo Project | | domain_id | default | | enabled | True | | id | 9f4f23f099bb4da3bc41c99f7a8a4f20 | | is_domain | False | | name | demo | | parent_id | default | +-------------+----------------------------------+ 查看項目 openstack project list +----------------------------------+---------+ | ID | Name | +----------------------------------+---------+ | 7d3f0cd56a104c60a36196675f62428e | admin | | 9f4f23f099bb4da3bc41c99f7a8a4f20 | demo | | a1710fdff32a4605a8ab549f8680dd45 | service | +----------------------------------+---------+
(2)建立用戶demo並設置密碼
openstack user create --domain default --password-prompt demo手動輸入密碼 或: openstack user create --domain default --password=demo demo +---------------------+----------------------------------+ | Field | Value | +---------------------+----------------------------------+ | domain_id | default | | enabled | True | | id | e880cc125bb541128c9bc47233d91732 | | name | demo | | options | {} | | password_expires_at | None | +---------------------+----------------------------------+ 查看用戶 openstack user list +----------------------------------+-------+ | ID | Name | +----------------------------------+-------+ | cd9ce1eb589b445e9b98c53a36bdc8d8 | admin | | e880cc125bb541128c9bc47233d91732 | demo | +----------------------------------+-------+
(3)建立角色user
openstack role create user +-----------+----------------------------------+ | Field | Value | +-----------+----------------------------------+ | domain_id | None | | id | 348324e7aee745229551eb412fd96a18 | | name | user | +-----------+----------------------------------+ 查看角色 openstack role list +----------------------------------+----------+ | ID | Name | +----------------------------------+----------+ | 348324e7aee745229551eb412fd96a18 | user | | 9fe2ff9ee4384b1894a90878d3e92bab | _member_ | | c6b4ab1a75d041e298f59570bd7dd46e | admin | +----------------------------------+----------+
(4)將demo項目下的demo用戶設置爲user角色
openstack role add --project demo --user demo user
3)驗證登陸信息
(1)取消環境變量值
unset OS_AUTH_URL OS_PASSWORD
(2)輸入admin用戶登陸信息登陸
openstack --os-auth-url http://node1: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 | 2019-07-29T09:44:06+0000 | | id | gAAAAABdPrHWXAwrKHKnU3CMr5odqMjYwK90C5bD6rdPEfoJzTuAh-G3YZcb0SHzr8ek8qaS5zgN4haULRxpgcrli | | | XJ32hhKvmN8UZTSRgW58l_Nu1e1l4gjDjxXyUS25a4krWJ46brr4qpq3AvUu40_B9ccw9Z_7vjiDA_- | | | FTKpmqFnRNrAH-k | | project_id | 7d3f0cd56a104c60a36196675f62428e | | user_id | cd9ce1eb589b445e9b98c53a36bdc8d8 | +------------+-------------------------------------------------------------------------------------------+
OpenStack排查問題的方法主要靠日誌,每一個service都有本身的日誌文件。
Keystone主要有兩個日誌:keystone.log 和 keystone_access.log,保存在 /var/log/keystone 與 /var/log/httpd/ 目錄中。
vim /var/log/keystone/keystone.log 2019-07-29 14:36:47.607 43150 INFO migrate.versioning.api [-] 66 -> 67... 2019-07-29 14:36:48.060 43150 INFO migrate.versioning.api [-] done 2019-07-29 14:36:48.060 43150 INFO migrate.versioning.api [-] 67 -> 68... 2019-07-29 14:36:48.065 43150 INFO migrate.versioning.api [-] done 2019-07-29 14:36:48.065 43150 INFO migrate.versioning.api [-] 68 -> 69... 2019-07-29 14:36:48.069 43150 INFO migrate.versioning.api [-] done 2019-07-29 14:36:48.069 43150 INFO migrate.versioning.api [-] 69 -> 70... 2019-07-29 14:36:48.073 43150 INFO migrate.versioning.api [-] done
vim /var/log/httpd/keystone_access.log 192.168.52.101 - - [29/Jul/2019:15:01:40 +0800] "GET /v3 HTTP/1.1" 200 245 "-" "osc-lib/1.3.1 keystoneauth1/2.18.0 python-requests/2.11.1 CPython/2.7.5" 192.168.52.101 - - [29/Jul/2019:15:01:42 +0800] "POST /v3/auth/tokens HTTP/1.1" 201 1082 "-" "osc-lib/1.3.1 keystoneauth1/2.18.0 python-requests/2.11.1 CPython/2.7.5" 192.168.52.101 - - [29/Jul/2019:15:02:21 +0800] "GET /v3 HTTP/1.1" 200 245 "-" "osc-lib/1.3.1 keystoneauth1/2.18.0 python-requests/2.11.1 CPython/2.7.5" 192.168.52.101 - - [29/Jul/2019:15:02:23 +0800] "POST /v3/auth/tokens HTTP/1.1" 201 1082 "-" "osc-lib/1.3.1 keystoneauth1/2.18.0 python-requests/2.11.1 CPython/2.7.5"
若是須要獲得詳細的日誌信息能夠將配置文件中的debug選項打開
vim /etc/keystone/keystone.conf
[DEFAULT]
debug=True