Keystone介紹
keystone 是OpenStack的組件之一,用於為OpenStack家族中的其它組件成員提供統一的認證服務,包括身份驗證、令牌的發放和校驗、服務列表、用戶權限的定義等等。雲環境中所有的服務之間的授權和認證都需要經過 keystone. 因此 keystone 是雲平台中第一個即需要安裝的服務。
就好比說我要開一個餐廳,提供的是餐飲服務,那么我需要去工商局注冊營業執照,keystone就是openstack里面管理服務的一個服務。
作為 OpenStack 的基礎支持服務,Keystone 做下面這幾件事情:
管理用戶及其權限
維護 OpenStack Services 的 Endpoint
Authentication(認證:就是審查身份)和 Authorization(鑒權:審查身份過后查看具有對應的權限)
學習 Keystone,得理
假如說我要投資一個酒店的項目(這里就是project),它是做服務的(這里對應到了service),我提供住宿洗浴等服務,那么我要開始宣傳了,把我的地址宣傳出去(這里就是Endpoint,服務端點,你想要享受服務,就得找到我的服務地址),在這這個項目里,我(是user),因為我是項目發起人,所以我的role是董事長,來住我酒店的人也是user,可是他們的role是顧客,普通用戶。來了以后你把你的身份信息提供給我(就是credentials),而后我做授權(authentication),我查看你預定價位的套房,從而給你授權給你相應的token(記錄了用戶的權限和信息)。
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。
Credentials 是 User 用來證明自己身份的信息,可以是:
1. 用戶名/密碼
2. Token
3. API Key
4. 其他高級方式
Authentication 是 Keystone 驗證 User 身份的過程。User 訪問 OpenStack 時向 Keystone 提交用戶名和密碼形式的 Credentials,Keystone 驗證通過后會給 User 簽發一個 Token 作為后續訪問的 Credential。
Token 是由數字和字母組成的字符串,User 成功 Authentication 后 Keystone 生成 Token 並分配給 User。
Token 用做訪問 Service 的 Credential
Service 會通過 Keystone 驗證 Token 的有效性
Token 的有效期默認是 24 小時
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
OpenStack 的 Service 包括 Compute (Nova)、Block Storage (Cinder)、Object Storage (Swift)、Image Service (Glance) 、Networking Service (Neutron) 等。每個 Service 都會提供若干個 Endpoint,User 通過 Endpoint 訪問資源和執行操作。
Endpoint 是一個網絡上可訪問的地址,通常是一個 URL。Service 通過 Endpoint 暴露自己的 API。 Keystone 負責管理和維護每個 Service 的 Endpoint。
可以使用下面的命令來查看 Endpoint。
# source devstack/openrc admin admin
# openstack catalog list
安全包含兩部分:Authentication(認證)和 Authorization(鑒權)
Authentication 解決的是“你是誰?”的問題
Authorization 解決的是“你能干什么?”的問題
Keystone 借助 Role 實現 Authorization:
1 Keystone定義Role
2 可以為 User 分配一個或多個 Role,Horizon 的菜單為:Identity->Project->ManageMembers
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的權限管理。
openstack系統基本角色有兩個:
一個是管理員admin
一個是租戶_member_
Keystone基本架構
Token: 用來生成和管理token
Catalog:用來存儲和管理service/endpoint
Identity:用來管理tenant/user/role和驗證
Policy:用來管理訪問權
keystone身份認證服務部署
keystone身份認證服務部署在controller節點上。 #第一步 下載openstack源的文件 yum install centos-release-openstack-ocata #下載openstack客戶端 yum install python-openstackclient #安裝selinux組件 yum install openstack-selinux #第二步 安裝數據庫和擴展包,版本用yum自帶的也可以,我這里用的是10.0版本 [mariadb] name=MariaDB baseurl=http://mirrors.ustc.edu.cn/mariadb/yum/10.3/centos7-amd64/ gpgkey=http://mirrors.ustc.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB gpgcheck=1 yum install mariadb mariadb-server python2-PyMySQL #配置openstack單獨配置文件 vim /etc/my.cnf.d/openstack.cnf #打開是空白文件,寫入如下內容 [mysqld] bind-address = #本機IP #寫第一個節點里集群網這個網卡的地址 default-storage-engine = innodb #默認的數據庫引擎 innodb_file_per_table = on max_connections = 4096 #最大連接數,最好寫的大一點,你平常用命令行去調用opesntack的時候,每一個操作它都會去數據里查一些信息,如果連接數寫小,它會很快把你的連接數占滿。 collation-server = utf8_general_ci #字符集 character-set-server = utf8 #第六步 啟動數據庫、把數據庫設置開機自啟 systemctl start mariadb systemctl enable mariadb #初始化數據庫 mysql_secure_installation #第三步 安裝消息隊列服務 yum install rabbitmq-server #啟動rabbitmq和設為開機自啟 systemctl start rabbitmq-server systemctl enable rabbltmq-server #在rabbitmq里創建一個openstack用戶並設置密碼為openstack rabbitmqctl add_user openstack openstack #設置權限 rabbitmqctl set_permissions openstack ".*" ".*" ".*" #讓其擁有管理員身份 rabbitmqctl set_user_tags openstack administrator #第四步 安裝緩存服務 yum install memcached python-memcached #修改memcached配置文件 vim /etc/sysconfig/memcached OPTIONS="-l 127.0.0.1,::1,controller" #啟動memcached服務和設置為開機自啟 systemctl start memcached.service systemctl enable memcached.service #第五步 登陸數據庫,並創建keystone這個庫 mysql -u root –p CREATE DATABASE keystone; #賦予權限,並允許本地登錄,第三方登陸 GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'keystone'; GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'keystone'; #第六步 安裝keystone服務,keystone這個服務是沒有自己的啟動進程了,他的啟動是調用hhtp服務對外提供服務的,想使用keystone服務,必須啟動http服務。 yum install openstack-keystone httpd mod_wsgi #修改keystone配置文件 cd /etc/keystone/ cp keystone.conf keystone.conf.bak vim keystone.conf #清空所有內容,粘貼如下內容至文本 [DEFAULT] [assignment] [auth] [cache] [catalog] [cors] [cors.subdomain] [credential] [database] connection = mysql+pymysql://keystone:keystone@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] #第七步 同步數據庫,往我剛創建的keystone庫里倒表 su -s /bin/sh -c "keystone-manage db_sync" keystone #第八步 創建fernet key認證的配置 #設置一個keystone用戶,並讓這個用戶屬於keystone組,就是創建用戶和組 keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone #創建keystone用戶身份信息,設置這個用戶的角色,並把它放置一個組里 keystone-manage credential_setup --keystone-user keystone --keystone-group keystone #第九步 創建服務端點 keystone-manage bootstrap --bootstrap-password admin \ #這是創建一個admin用戶,並設置密碼為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 #第十步 編輯httpd配置文件 vim /etc/httpd/conf/httpd.conf #找到ServerName配置段 ServerName controller #第十一步 keystone是利用wsgi這個模塊去調用httpd,所以要創建他的軟連接至httpd配置文件目錄下 ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/ #啟動httpd服務並設為開機自啟 systemctl start httpd #第十二步 創建admin用戶環境變量 cd /root 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 #第十三步 登陸openstack source openrc #第十四步 創建域 openstack project create --domain default \ --description "Service Project" service #第十五步 創建demo的項目 openstack project create --domain default \ --description "Demo Project" demo #第十六步 創建demo用戶 openstack user create --domain default \ --password-prompt demo #第十七步 創建普通用戶角色user openstack role create user #第十八步 把demo項目里的demo用戶設置為普通角色user openstack role add --project demo --user demo user