barbican的核心是加解密以及密钥的存储。基本思想是初始化时生成一个根密钥,安全的存储在硬件HSM中,无法读出,智能进行加解密操作。所有的应用密钥在存储在数据库中之前,都是经过根密钥加密的,因此不怕数据库被拖库。使用密钥时,从数据库读出密文,用根密钥解密后获取明文,再使用。
密钥存储、生成、加解密这部分,barbican充分利用的openstack的插件思想,进行抽象化设计,可以支持不同的软件、硬件密钥管理方案,如PKCS11硬件、KMIP硬件等。
插件的基类,定义了对称、非对称密钥的产生、存储接口
plugin.interface.secret_store.SecretStoreBase
基于此基类的三个插件:
plugin.store_crypto.StoreCryptoAdapterPlugin
plugin.dogtag.DogtagKRAPlugin
plugin.mip_secret_store.KMIPSecretStore
其中,DogtagKRAPlugin 和 KMIPSecretStore插件自带密钥的产生、存储功能
而类似HSM的设备只有密钥产生、加密解密的功能,不带存储功能,只能由plugin.store_crypto.StoreCryptoAdapterPlugin插件作为一个桥接层,提供存储和密钥产生的功能。
其中密钥存储功能由StoreCryptoAdapterPlugin插件提供,加密、解密、产生密钥功能又由一系列的crypto插件提供:
基类:
plugin.crypto.base.CryptoPluginBase
插件:
plugin.crypto.simple_crypto.SimpleCryptoPlugin
plugin.crypto.p11_crypto.P11CryptoPlugin
=======================================
p11_crypto插件
底层由pkcs11.py实现pkcs11接口,直接和硬件HSM或加密卡打交道,pkcs11.py通过cffi机制来实现python中调用HSM厂商提供的c语言lib库。
barbican初始化时,需要通过barbican_manager命令行工具,在HSM硬件中生成两个对称密钥:
MKEK:系统唯一根密钥,用来加密其它KEK(目前实现是每个项目一个KEK,用来加密用户密钥)
MKHK:与MKEK连用,用来计算经过MKEK加密后的HMAC值