Security/Juno/Keystone
此页面记录了 OpenStack Juno 版本中 Keystone 项目的安全相关细节。
目录
已实现的加密
Keystone 没有自研的加密实现,所有内容都来自 Python 标准库或第三方库。
使用的加密
库
- oauthlib (使用 hashlib)
- OpenSSL
- PassLib
- PyCrypto
- Python hashlib
- python-ldap (最终使用 GnuTLS、NSS 或 OpenSSL,具体取决于平台)
- Requests (用于 keystoneclient HTTPS 使用 - 需要调查底层加密用法)
加密算法
| 算法 | 目的 | 可配置 | 实现 | 详情 | 源代码 |
|---|---|---|---|---|---|
| AES | Memcache 后端加密 | 否 | PyCrypto |
|
|
| RSA | PKI 令牌签名 | Yes | OpenSSL |
|
|
哈希算法
| 算法 | 目的 | 可配置 | 实现 | 详情 | 源代码 |
|---|---|---|---|---|---|
| md5 | 令牌哈希 | 否 | hashlib |
|
|
| sha1 | S3 凭证 | 否 | hashlib |
|
|
| sha1 | OAuth1 | 否 | oauthlib |
|
|
| sha256 | EC2 令牌 | 否 | hashlib |
|
|
| sha384 | Memcache 签名 | 否 | hashlib |
|
|
| sha512 | 密码哈希 | 否 | PassLib |
|
|
敏感数据
密钥/证书
- PKI 签名密钥 - 通过文件系统所有权/权限保护。
- SSL/TLS 密钥 - 通过文件系统所有权/权限保护。
密码
- 必须在 Keystone 中启用 SSL/TLS,以防止客户端通过网络以明文发送密码。
- 在哈希之前执行严格的密码检查。如果设置为 true,则操作将以 HTTP 403 Forbidden 错误失败;如果设置为 false,密码将自动截断为预定义的最大长度。
- 可通过 CONF.strict_password_check(默认=False)配置
- 可通过 CONF.identity.max_password_length(默认=4096)配置
- SQL Identity
- 密码哈希存储在 SQL 数据库中。
- 可以使用 SSL/TLS 保护与数据库的连接。
- LDAP Identity
- 必须使用 SSL/TLS 连接到 LDAP,以防止 Keystone 通过网络以明文发送密码。
令牌 (Tokens)
- 签名的令牌存储在以下后端之一的完整形式中
- KVS
- Memcached
- 临时存储。
- 能够使用 AES 加密和 sha384 签名。
- SQL (默认)
- 持久存储。
- 可以使用 SSL/TLS 保护与数据库的连接。
- 过期的令牌不会自动从后端删除。应使用“keystone-manage token_flush”命令定期删除过期的令牌(通过 cron)。
潜在改进
- 允许在不被兼容性要求限制的情况下(例如 S3 和 EC2)配置所有哈希方案
- 使用 md5 进行令牌哈希是最大的问题,因为不鼓励其使用(或在 FIPS 的情况下禁止)。更改 正在进行,以便在 Juno 中使其可配置。如果可能,默认值应为 sha256。
- 允许支持 LDAP SASL 绑定方法(例如 DIGEST-MD5 和 GSSAPI)。
- 允许其他形式的外部身份验证以避免使用密码(Kerberos、SAML)。
自 Icehouse 以来的显著变化
- 可配置的令牌哈希算法支持(正在进行中)
- 消除密码截断
- 删除 LDAP 密码哈希代码