OpenStack核心組件-keystone

1. Keystone介紹

  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:

  1. Keystone定義Role

  1. 能夠爲 User 分配一個或多個 Role,Horizon 的菜單爲:Identity->Project->ManageMembers

  1. Service 決定每一個 Role 能作什麼事情 Service 經過各自的 policy.json 文件對 Role 進行訪問控制。 下面是 Nova 服務 /etc/nova/policy.json 中的示例:

       上面配置的含義是:對於 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_

2. Keystone基本架構

  •Token: 用來生成和管理token

  •Catalog:用來存儲和管理service/endpoint

  •Identity:用來管理tenant/user/role和驗證

  •Policy:用來管理訪問權限

3. 經過例子認識Keystone         

  能夠經過「查詢可用 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/ 目錄裏。

 4. 部署keystone

4.1 部署共享服務

  能夠經過訪問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.

4.2 部署身份認證服務

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 |
+----------------------------------+-------+

4.3 建立一個domain

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
相關文章
相關標籤/搜索