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计算服务详解》

敬请期待!

发表回复

后才能评论