跳转到: 导航, 搜索

Security/Icehouse/Keystone

本页面记录了 OpenStack Icehouse 版本中 Keystone 项目相关的安全细节。

已实现的加密

Keystone 没有自研的加密实现,所有内容都来自 Python 标准库或第三方库。

使用的加密

加密算法

算法 目的 可配置 实现 详情 源代码
AES Memcache 后端加密 PyCrypto
  • 可选项,用于加密令牌后端。
  • keystoneclient.middleware.memcache_crypt.py
RSA PKI 令牌签名 Yes OpenSSL
  • 2048, sha1 默认值
  • 可通过 openssl.conf 进行配置。
  • 密钥/证书可以在 Keystone 外部创建,然后直接放入指定位置。
  • keystone.common.openssl.py
  • keystoneclient.common.cms.py

哈希算法

算法 目的 可配置 实现 详情 源代码
md5 令牌哈希 hashlib
  • 哈希值用作令牌后端中的内部标识符。
  • 被哈希的数据是整个经过密码学签名的令牌(使用配置的签名密钥)。碰撞的可能性应该很低。
  • keystoneclient.utils.py
  • keystoneclient.common.cms.py
sha1 S3 凭证 hashlib
  • 用于验证 S3 凭证的签名。
  • 由于需要与 S3 兼容,因此无法进行配置。
  • keystone.contrib.s3.core.py
sha1 LDAP 密码哈希 (hashlib 中的 sha1;PassLib 中的加盐)
  • 使用 PassLib 默认值进行加盐(当前为 4 字节)。
  • keystone.common.utils.py
sha1 OAuth1 oauthlib
  • 用于验证 OAuth1 令牌的签名。
  • Keystone 仅使用 HMAC-SHA1 签名进行 OAuth1 令牌的签名(如 RFC 5849 中所述)。
  • 可以禁用 OAuth 支持。
  • 可能使用 hashlib 进行实际算法。
  • keystone.contrib.oauth1.core.py
  • keystone.contrib.oauth1.verifier.py
sha256 EC2 令牌 hashlib
  • 由于需要与 EC2 兼容,因此无法进行配置。
  • keystone.credential.controllers.py
  • keystone.common.utils.py
  • keystoneclient.contrib.ec2.utils.py
sha384 Memcache 签名 hashlib
  • 在启用 memcache 加密时,用于签名和验证。
  • keystoneclient.middleware.memcache_crypt.py
sha512 密码哈希 PassLib
  • 算法不可配置,但可以通过 CONF.crypt_strength(默认值为 40000)配置轮数。
  • keystone.common.utils.py

敏感数据

密钥/证书

  • 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)。