Security/Icehouse/Keystone
本页面记录了 OpenStack Icehouse 版本中 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 | LDAP 密码哈希 | 否 | (hashlib 中的 sha1;PassLib 中的加盐) |
|
|
| sha1 | OAuth1 | 否 | oauthlib |
|
|
| sha256 | EC2 令牌 | 否 | hashlib |
|
|
| sha384 | Memcache 签名 | 否 | hashlib |
|
|
| sha512 | 密码哈希 | 否 | PassLib |
|
|
敏感数据
密钥/证书
- PKI 签名密钥 - 通过文件系统所有权/权限进行保护。
- SSL/TLS 密钥 - 通过文件系统所有权/权限进行保护。
密码
- 必须启用 Keystone 中的 SSL/TLS,以防止客户端通过网络以明文形式发送密码。
- 密码在哈希之前会被截断到最大长度
- 可通过 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)。
潜在改进
- 消除 LDAP 用户密码哈希。此代码应该是不必要的,因为客户端提供的密码仅用于执行 LDAP 绑定操作,绝不以任何形式本地存储。
- 允许在不被兼容性要求限制的情况下(例如 S3 和 EC2)配置所有哈希方案
- 使用 md5 进行令牌哈希是最大的问题,因为不鼓励使用它(或者在 FIPS 的情况下禁止使用)。正在进行更改,以便在 Juno 中使其可配置。如果可能,默认值应为 sha256。
- 允许支持 LDAP SASL 绑定方法(例如 DIGEST-MD5 和 GSSAPI)。
- 允许其他形式的外部身份验证以避免使用密码(Kerberos、SAML)。