Keystone身份认证服务详解:从原理到生产实践
Keystone身份认证服务详解:从原理到生产实践
一、Keystone概述
1.1 Keystone是什么?
Keystone是OpenStack的身份认证与授权服务,是整个OpenStack架构的核心基础组件。所有其他OpenStack服务在启动时都必须向Keystone注册API端点,并在处理请求时验证Token的有效性。
Keystone的核心功能:
- 用户身份管理(User)
- 项目/租户管理(Project/Tenant)
- 域隔离(Domain)
- 角色权限控制(Role)
- 服务目录与端点管理(Endpoint)
- 令牌发行与验证(Token)
1.2 Keystone架构
Keystone采用微服务架构,主要由以下几个核心服务组成:
| 服务 | 端口 | 功能描述 |
|---|---|---|
| keystone-admin | 35357 | 管理API(内部使用) |
| keystone-public | 5000 | 公共API(用户认证) |
| keystone-wsgi-admin | 35358 | WSGI管理接口 |
| keystone-wsgi-public | 5001 | WSGI公共接口 |
二、Keystone核心概念详解
2.1 User(用户)
User代表使用OpenStack系统的人或服务。每个用户都属于一个或多个项目,并被分配特定角色。
用户管理命令:
# 创建用户
openstack user create --password-prompt --email admin@example.com admin
# 创建用户并指定域
openstack user create --domain corporate --password-prompt alice
# 修改用户密码
openstack user password set --password-prompt admin
# 禁用用户
openstack user disable admin
# 删除用户
openstack user delete demo
# 查看用户列表
openstack user list
openstack user list --domain corporate
# 查看用户详细信息
openstack user show admin
2.2 Project/Tenant(项目)
Project是OpenStack中资源隔离的基本单元,用于组织和管理计算、存储、网络等资源。
# 创建项目
openstack project create --description "Production Environment" production
# 创建项目并指定域
openstack project create --domain corporate --description "Development" development
# 查看项目列表
openstack project list
openstack project list --domain corporate
# 查看项目详细信息
openstack project show production
# 更新项目描述
openstack project set --description "Updated Description" production
# 删除项目
openstack project delete development
2.3 Domain(域)
Domain是更高层次的身份命名空间隔离,适用于大型企业或多组织场景。
# 创建域
openstack domain create --description "Corporate Domain" corporate
# 查看域列表
openstack domain list
# 查看域详细信息
openstack domain show corporate
# 禁用域
openstack domain disable corporate
# 创建域管理员
openstack user create --domain corporate \
--password-prompt \
--email admin@corporate.com \
corporate-admin
2.4 Role(角色)
Role定义了一组权限的集合,通过将角色分配给用户来控制其访问权限。
# 创建角色
openstack role create project-admin
openstack role create network-admin
openstack role create readonly
# 查看角色列表
openstack role list
# 查看角色详细信息
openstack role show admin
# 将角色分配给用户
openstack role add --project production --user admin admin
# 从用户撤销角色
openstack role remove --project production --user admin admin
# 查看用户在项目中分配的角色
openstack role list --project production --user admin
2.5 Token(令牌)
Token是用户认证成功后获得的临时访问凭证,用于后续的API请求认证。
Token类型对比:
| Token类型 | 特点 | 适用场景 |
|---|---|---|
| UUID | 简单字符串,需存储在后端 | 小规模部署 |
| Fernet | 加密令牌,无需持久化存储 | 推荐用于生产环境 |
| JWT | 自包含令牌,支持离线验证 | 需要无状态验证的场景 |
三、认证方式详解
3.1 用户名密码认证
方法一:命令行参数
openstack --os-auth-url http://controller:5000/v3 \
--os-project-id \
--os-username admin \
--os-password admin123 \
project show
方法二:环境变量
# 加载环境变量
export OS_AUTH_URL=http://controller:5000/v3
export OS_PROJECT_NAME=admin
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_DOMAIN_NAME=Default
export OS_USERNAME=admin
export OS_PASSWORD=admin123
export OS_IDENTITY_API_VERSION=3
# 使用环境变量
openstack project list
3.2 应用凭证认证(推荐用于生产环境)
应用凭证是服务账号的理想选择,避免使用用户密码。
# 创建应用凭证
openstack application credential create my-credential
# 创建带权限限制的应用凭证
openstack application credential create \
--name "limited-credential" \
--role member \
--expiration "2024-12-31T23:59:59" \
limited-credential
# 使用应用凭证
export OS_APPLICATION_CREDENTIAL_ID=
export OS_APPLICATION_CREDENTIAL_SECRET=
openstack server list
3.3 联邦认证(企业集成)
企业环境中,Keystone可以与现有的身份提供商(IdP)集成。
# 配置SAML2联邦
openstack federation identity provider create corporate-idp \
--description "Corporate Identity Provider"
# 创建映射规则
openstack mapping create corporate-mapping \
--rules /etc/keystone/mapping.json
# 创建域配置
openstack domain create corporate \
--description "Corporate Domain"
四、配置文件详解
4.1 Keystone主配置文件
# /etc/keystone/keystone.conf
[DEFAULT]
# 日志配置
log_dir = /var/log/keystone
logging_context_format_string = %(asctime)s.%(msecs)03d %(levelname)s %(name)s [%(request_id)s] %(instance)s%(message)s
[database]
connection = mysql+pymysql://keystone:keystone_db_pass@controller/keystone
max_retries = -1
[token]
# Token配置(推荐Fernet)
provider = fernet
expiration = 86400 # 24小时
# UUID配置(开发环境)
# provider = uuid
# provider = uuid
[cache]
backend = oslo_cache.memcache_pool
enabled = true
memcache_servers = controller:11211
[credential]
provider = fernet
key_repository = /etc/keystone/credential-keys/
[fernet_tokens]
key_repository = /etc/keystone/fernet-keys/
[ldap]
# LDAP集成配置
# url = ldap://ldap.example.com
# user = cn=admin,dc=example,dc=com
# password = ldap_password
# base = dc=example,dc=com
# user_tree_dn = ou=Users,dc=example,dc=com
[revoke]
driver = sql
[healthcheck]
path = /healthcheck
4.2 Apache配置(生产环境推荐)
# /etc/apache2/sites-available/keystone.conf
Listen 5000
Listen 35357
WSGIDaemonProcess keystone-public processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP}
WSGIProcessGroup keystone-public
WSGIScriptAlias / /usr/bin/keystone-wsgi-public
WSGIApplicationGroup %{GLOBAL}
Require all granted
ErrorLog ${APACHE_LOG_DIR}/keystone-error.log
CustomLog ${APACHE_LOG_DIR}/keystone-access.log combined
WSGIDaemonProcess keystone-admin processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP}
WSGIProcessGroup keystone-admin
WSGIScriptAlias / /usr/bin/keystone-wsgi-admin
WSGIApplicationGroup %{GLOBAL}
Require all granted
ErrorLog ${APACHE_LOG_DIR}/keystone-error.log
CustomLog ${APACHE_LOG_DIR}/keystone-access.log combined
五、生产环境最佳实践
5.1 密码策略
# 配置密码复杂度策略
# /etc/keystone/keystone.conf
[identity]
password_hash_algorithm = bcrypt
password_hash_rounds = 12 # 提高安全性,但增加CPU开销
# 用户密码过期策略
# 使用安全策略
openstack user password expire admin
5.2 Fernet密钥轮换
# 手动轮换Fernet密钥
keystone-manage fernet_rotate
# 自动轮换(添加到cron)
# crontab -e
# 0 2 * * * keystone-manage fernet_rotate
# 轮换多个密钥
keystone-manage fernet_rotate --max_active_keys 3
5.3 审计日志
# 启用审计日志
# /etc/keystone/keystone.conf
[audit]
enabled = true
middleware_notifications_path = /var/log/keystone/audit.log
5.4 性能优化
# /etc/keystone/keystone.conf
[database]
# 连接池配置
max_pool_size = 10
max_overflow = 20
[cache]
# 缓存配置
memcache_servers = controller1:11211,controller2:11211,controller3:11211
dead_retry = 300
[token]
# 禁用不必要的功能
cache = true
caching = true
六、常见问题与解决方案
6.1 401 Unauthorized 错误
问题现象: 认证失败,返回401错误
排查步骤:
# 1. 检查环境变量
echo $OS_AUTH_URL
echo $OS_PROJECT_NAME
# 2. 验证凭据
openstack --os-auth-url http://controller:5000/v3 \
--os-username admin \
--os-password admin123 \
token issue
# 3. 检查Keystone服务状态
systemctl status apache2
systemctl status keystone
# 4. 查看日志
tail -f /var/log/apache2/keystone-access.log
tail -f /var/log/keystone/keystone.log
6.2 Token过期问题
# 查看当前Token有效期
openstack token issue
# 检查Token配置
grep "expiration" /etc/keystone/keystone.conf
# 续租Token
# 重新认证获取新Token
openstack --os-auth-url http://controller:5000/v3 token issue
6.3 端点不可用
# 查看所有端点
openstack endpoint list
# 检查服务注册
openstack service list
# 检查端点健康
curl http://controller:5000/v3
curl http://controller:35357/v3
七、总结
Keystone作为OpenStack的身份认证中心,其配置和管理对于整个云平台的安全至关重要。
核心要点回顾:
下篇预告: 《Nova计算服务详解》
敬请期待!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。







