雲計算openstack核心組件——keystone身份認證服務


一、Keystone介紹:

 

      keystone 是OpenStack的組件之一,用於為OpenStack家族中的其它組件成員 提供統一的認證服務,包括身份驗證、令牌的發放和校驗、服務列表、用戶權限的定義等等。 雲環境中所有的服務之間的授權和認證都需要經過 keystone. 因此 keystone 是雲平台中第一個即需要安裝的服務。
 
作為 OpenStack 的 基礎支持服務,Keystone 做下面這幾件事情:
  1. 管理用戶及其權限
  2. 維護 OpenStack Services 的 Endpoint
  3. Authentication(認證)和 Authorization(鑒權)
 
學習 Keystone,得理解下面這些概念:
 
 

 

User

User 指代任何使用 OpenStack 的實體,可以是 真正的用戶,其他系統或者服務。
 
 
當 User 請求訪問 OpenStack 時,Keystone 會對其進行驗證。Horizon 在 Identity -> Users 管理 User
 
 
 
demo: 常規(非管理)任務應該使用無特權的項目和用戶,所有要創建 demo 項目和 demo 用戶

除了 admin 和 demo,OpenStack 也為 nova、cinder、glance、neutron 服務創建了相應的 User。 admin 也可以管理這些 User。

 
 
 

Credentials(資格證明)

 

 
 
Credentials 是 User 用來證明自己身份的信息,可以是:
1. 用戶名/密碼
2. Token
3. API Key
4. 其他高級方式
 
 
 

Authentication(身份認證)

 
 
Authentication 是 Keystone 驗證 User 身份的過程User 訪問 OpenStack 時向 Keystone 提交用戶名和密碼形式的 Credentials,Keystone 驗證通過后會給 User 簽發一個 Token 作為后續訪問的 Credential。
 
 
 

Token

 
 
Token 是 由數字和字母組成的字符串,User 成功 Authentication 后 Keystone 生成 Token 並分配給 User。
  1. Token 用做訪問 Service 的 Credential
  2. Service 會通過 Keystone 驗證 Token 的有效性
  3. Token 的有效期默認是 24 小時
 
 
 

Project

 
 
Project 用於將 OpenStack 的資源(計算、存儲和網絡)進行分組和隔離。
根據 OpenStack 服務的對象不同, Project 可以是一個客戶(公有雲,也叫租戶)、部門或者項目組(私有雲)
 
這里請注意:
  1. 資源的所有權是屬於 Project 的,而不是 User。
  2. 在 OpenStack 的界面和文檔中,Tenant / Project / Account 這幾個術語是通用的,但長期看會傾向使用 Project
  3. 每個 User(包括 admin)必須掛在 Project 里才能訪問該 Project 的資源。 一個User可以屬於多個 Project
  4. admin 相當於 root 用戶,具有最高權限
 
 
 
Horizon 在 Identity->Projects 中管理 Project
 

 

通過 Manage MembersUser 添加到 Project
 
 
 
 

 

Service

 
 
OpenStack 的 Service 包括 Compute (Nova)、Block Storage (Cinder)、Object Storage (Swift)、Image Service (Glance) 、Networking Service (Neutron) 等。 每個 Service 都會提供若干個 Endpoint,User 通過 Endpoint 訪問資源和執行操作。
 
 

Endpoint

 
 
Endpoint 是一個網絡上可訪問的地址,通常是一個 URL。Service 通過 Endpoint 暴露自己的 API。 Keystone 負責管理和維護每個 Service 的 Endpoint。
 
可以使用下面的命令來查看 Endpoint。
# source devstack/openrc admin admin
# openstack catalog list
 
 

Role

 
安全包含兩部分: Authentication(認證)和 Authorization(鑒權)
 
Authentication 解決的是“你是誰?”的問題
Authorization 解決的是“你能干什么?”的問題
 
Keystone 借助 Role 實現 Authorization
  1. Keystone定義Role
     
     
  2. 可以為 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是否有訪問權限。P olicy用來定義什么角色對應什么權限。對Keystone來說,Policy其實是一個JSON文件,默認是 /etc/keystone/policy.json 。 通過Policy,Keystone實現了對User的權限管理。
    
    3. openstack系統基本角色有兩個:

          一個是管理員admin
         一個是租戶_member_

 

二、Keystone基本架構:

 
 
 
•Token: 用來生成和管理token
•Catalog:用來存儲和管理service/endpoint
•Identity:用來管理tenant/user/role和驗證
•Policy:用來管理訪問權限
 

 

 

三、通過例子認識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/ 目錄里。
 
 
 

keystone環境部署

 


 
 
 

機器:3台
1:controller:3塊網卡(集群網,租戶網,外網)
2:compute:2塊網卡(集群網,租戶網)
3:storage:1塊網卡(集群網)


1)設置主機名,彼此域名解析,無密鑰登陸

vim /etc/hosts
192.168.253.135 controller
192.168.253.194 compute
192.168.253.15 storage
ssh-keygen
ssh-copy-id

 

2)點進openstack packages

在controller節點上:
安裝openstack客戶端軟件包

yum -y install python-openstackclient


安裝openstack-selinux軟件包

yum -y install openstack-selinux

 

3)點進SQL database

安裝數據庫

yum -y install mariadb mariadb-server python2-pymysql

 

創建openstack的配置文件(注意連接數)
vim /etc/my.cnf.d/openstack.cnf

[mysqld]
bind-address = 192.168.253.135(主節點集群ip)
default-storage-engine = innodb
innodb_file_per_table = on
max_connections = 4096
collation-server = utf8_general_ci
character-set-server = utf8


重啟自啟mariadb.server

systemctl restart(enable) mariadb.service

 

初始化mysql
mysql_secure_installation

 

4)點進Message queue

安裝rabbitmq並啟動自啟,創建openstack的用戶

yum -y install rabbitmq-server
rabbitmqctl add_user openstack admin(密碼)      #添加openstack用戶
rabbitmqctl set_permissions openstack ".*" ".*" ".*"      #給予所有虛擬機的所有交換機的所有消息隊列的權限
rabbitmqctl set_user_tags mama administrator      #設為管理員
systemctl restart rabbitmq-server.service
systemctl enable rabbitmq-server.service          #開機自啟

 

5)點進Memcached

安裝memcache

yum -y install memcached python-memcached

 

修改配置文件寫入主機名
vim /etc/sysconfig/memecached

[root@controller ~]# cat /etc/sysconfig/memcached 
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 127.0.0.1,::1,controller"


重啟自啟memcached.service

systenctl restart memcached.service

systemctl enable memcached.service


6)點擊identity service——install and configure

登陸數據庫,創建keystone的用戶和數據庫以及密碼

create database keystone;
grant all on keystone.* to keystone@'localhost' identified by 'KEYSTONE_DBPASS';
grant all on keystone.* to keystone@'%' identified by 'KEYSTONE_DBPASS';

 

安裝keystone服務,清空配置文件並導入

yum -y install openstack-keystone httpd mod_wsgi


Vim /etc/keystone/keystone.conf

數據庫的參數
[database]
connection = mysql+pymysql://keystone:KEYSTONE_DBPASS@controller/keystone
Token的參數
[token]
provider = fernet

 

導入keystone數據庫中的表

su -s /bin/sh -c "keystone-manage db_sync" keystone

 

創建keystone用戶和keystone組

# 創建keystone用戶與組
keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone


# 身份信息認證
keystone-manage credential_setup --keystone-user keystone --keystone-group keystone

 

創建admin用戶的密碼,並宣告keystone服務端點(密碼,三個服務端點)

keystone-manage bootstrap --bootstrap-password admin \
--bootstrap-admin-url http://controller:35357/v3/ \
--bootstrap-internal-url http://controller:5000/v3/ \
--bootstrap-public-url http://controller:5000/v3/ \
--bootstrap-region-id RegionOne

 

修改apache服務的配置文件

ServerName controller

 

創建keystone服務調用httpd的模塊配置文件的軟連接

ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/


啟動httpd(注意apache端口不要被占用)

systemctl restart httpd

編輯環境變量的配置文件
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://controller:35357/v3
export OS_IDENTITY_API_VERSION=3

 


7)點擊identity Create a domain, projects, users, and roles

宣告環境變量

source openrc


創建service 、 demo 的項目

在domain區域內創建一個名為server的服務項目

openstack project create --domain default \
--description "Service Project" service
openstack project create --domain default \
--description "Demo Project" demo

 

創建demo的用戶

openstack user create --domain default \
--password-prompt demo

 

創建user的角色

openstack role create user

 

2.18、把demo用戶設置為user角色

openstack role add --project demo --user demo user

 

查看項目 user 角色等

openstack project list
openstack user list
openstack role list
openstack endpoint list
openstack catalog list

 

一些報錯:

1、

[root@controller conf.d]# openstack project create --domain default \
> --description "Service Project" service
Failed to discover available identity versions when contacting http://controller:35357/v3. Attempting to parse version from URL.
Unable to establish connection to http://controller:35357/v3/auth/tokens: HTTPConnectionPool(host='controller', port=35357): Max retries exceeded with url: /v3/auth/tokens (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x4ff8250>: Failed to establish a new connection: [Errno 111] \xe6\x8b\x92\xe7\xbb\x9d\xe8\xbf\x9e\xe6\x8e\xa5',))

原因:35357端口無法啟動

而造成35357端口無法啟動的原因有兩方面:

1)apache服務出現問題

解決方法:查看80端口是否有其他服務占用

[root@controller ~]# lsof -i:80
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
httpd   20375   root    4u  IPv6  85035      0t0  TCP *:http (LISTEN)
httpd   20389 apache    4u  IPv6  85035      0t0  TCP *:http (LISTEN)
httpd   20393 apache    4u  IPv6  85035      0t0  TCP *:http (LISTEN)
httpd   20409 apache    4u  IPv6  85035      0t0  TCP *:http (LISTEN)
httpd   20410 apache    4u  IPv6  85035      0t0  TCP *:http (LISTEN)
httpd   20411 apache    4u  IPv6  85035      0t0  TCP *:http (LISTEN)
httpd   20603 apache    4u  IPv6  85035      0t0  TCP *:http (LISTEN)

如果有就停掉其他服務或kill掉

 

2)wsgi配置文件出錯或者軟連接沒起作用

[root@controller ~]# cd /etc/httpd/conf.d/
[root@controller conf.d]# ls
autoindex.conf  README  userdir.conf  welcome.conf  wsgi-keystone.conf
[root@controller conf.d]# vim wsgi-keystone.conf 
[root@controller conf.d]# cat wsgi-keystone.conf 
Listen 5000 Listen 35357

 

2、

[root@controller ~]# openstack project create --domain default --description "Service Project" service
-bash: openstack: 未找到命令

這是因為keystoneclient客戶端安裝出了問題,嘗試重新安裝。

 

OpenStack排錯常用步驟和命令

 

1.查看日志

OpenStack的日志系統設計的非常棒。大多數的問題都能從日志中找到原因。

日志路徑通常在/var/log/下。

哪里有問題就去哪里找:去相應的日志文件夾查看日志。

比如上傳鏡像報錯,就去/var/log/glance/

如果實例啟動失敗,就去/var/log/nova下查看。注意nova的日志分布於controller節點和compute節點

 

Devstack 環境中的日志,不同版本是不一樣的。P版本之前采用screen命令查看, 而P版本開始用jounalctl 命令查看 

2.端口被占用

比如keystone集成到apache里了,使用80端口。如果80端口被其他服務占用,那就完蛋了。

 

3.查看租戶/工程

租戶tenant和工程project在openstack中本質是一樣的。新版本已經不再區分這2個概念
openstack project list

 

4.檢查服務狀態

  ps -aux | grep keystone 或者ps -ef | grep keystone

  

5.查看openstack發行版本

nova-manage --version
14.0.2
對應着N版本

 

查看所有的組件狀態:

openstack-status

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM