作者:Darren Moffat
2012 年 7 月发布
Oracle Solaris 11 为 ZFS 添加了透明数据加密功能。所有数据和文件系统元数据(如所有权、访问控制列表、配额信息等等)永久存储在 ZFS 池中时均经过加密。
|
ZFS 池可以同时支持加密和非加密的 ZFS 数据集(文件系统和 ZVOL)。数据加密对应用和其他 Oracle Solaris 文件服务(如 NFS 或 CIFS)完全透明。由于加密是 ZFS 的优秀特性,我们可以同时支持压缩、加密和重复数据消除。加密数据集的加密密钥管理可以委托给用户和/或 Oracle Solaris 区域。具有 ZFS 加密功能的 Oracle Solaris 提供了一个非常灵活的系统来保护处于静止状态的数据,不需要任何应用更改或资格。
ZFS 可以轻松地加密数据和管理数据加密。加密文件系统和非加密文件系统可以共处同一个存储池中。您还可以对不同系统使用不同的加密密钥,可以在本地或远程管理加密。本文向您介绍具体方法。
通过 ZFS 属性控制 ZFS 文件系统的加密和密钥管理策略,适用正常的 ZFS 继承规则。这样就可以非常轻松地在文件系统层次结构的给定点设置策略,然后自动继承。管理员(或授权用户)管理存储池中加密数据集的一个或多个主封装密钥。
以下是一个非常简单的使用 ZFS 加密的示例:
# zfs create -o encryption=on rpool/export/project Enter passphrase for 'rpool/export/project': Enter again: # zfs create rpool/export/project/A # zfs create rpool/export/project/A/design # zfs create rpool/export/project/B
在这个简单示例中,我们使用一个以交互方式请求的密码短语;稍后将讨论管理封装密钥的其他方法,其中很多方法更适合企业部署。注意,project
下创建的文件系统未提示输入密码短语,因为除非另行告知,否则 ZFS 文件系统会自动从父文件系统继承封装密钥和加密属性值。
使用 ZFS 创建加密文件系统时,系统创建一个新的(随机生成)数据加密密钥。管理员无权访问数据加密密钥,而只是管理封装密钥。
封装密钥是 128、192、256 位的 AES 密钥。它们用于解密数据集的实际数据加密密钥。封装密钥可以随时更改,即使是挂载和共享数据集时。
封装密钥可以来自多个不同位置,具体取决于根据系统所需的加密和密钥管理策略类型。ZFS 可用于本地和集中密钥管理以及委托封装密钥更改和更改密钥类型。
我们在第一个启用加密的简单示例中已经看到,如果不指定密钥管理策略,ZFS 将以交互方式提示输入密码短语。在大多数数据中心部署中,这种办法可能并不理想,因此我们需要通过非交互方式从别处获取密钥。封装密钥可以是密码短语,也可以是原始 AES 密钥。最简单的非交互式方法是将封装密钥或密码短语存储在文件中,并告知 ZFS 在哪个文件中查找该密钥。如果使用此方法,则假设其他文件系统通过其他方式(如在可移动磁盘上)保证足够安全。只有在系统启动后初次挂载 ZFS 文件系统时才需要封装密钥,如果需要的话,稍后可以移除可移动介质。
# zfs create -o encryption=on -o keysource=raw,file:///media/stick/mykey tank/project/A # zfs create -o encryption=on -o keysource=passphrase,file:///media/stick/passkey tank/project/B
在上面的示例中,原始密钥文件和密码短语文件必须已经存在。keysource
属性显示我们如何指定密钥的格式和位置。注意,如果我们要使用一个文件,必须将其指定为 file://
样式的 URI,这么做的原因稍后就会明白。
要为封装密钥提供额外的保护,还可以将封装密钥存储在可以使用 PKCS#11 API 从 Oracle Solaris 加密框架访问的安全密钥库中。Oracle Solaris 通过软令牌提供本地加密密钥库;还可以使用一种可以存储 AES 密钥的硬件安全模块。
# pktool genkey keystore=pkcs11 keytype=aes keylen=128 label=mykey Enter PIN for Sun Software PKCS#11 softtoken: # zfs create -o encryption=on -o keysource=raw,pkcs11:object=mykey tank/project/C Enter PKCS#11 token PIN for 'tank/project/C':
在上面的示例中,我们在默认软令牌密钥库中为用户创建了一个 AES 密钥。这个密钥库需要身份验证才能创建和使用其中存储的密钥,因此会提示我们输入密钥库 PIN(它实际上是一个密码短语,但由于历史原因,在 PKCS#11 术语中使用 PIN 一词)。keysource
属性所用的 PKCS#11 URI 语法允许指定 PIN 文件的路径。使用此方法可确保实际封装密钥在 PKCS#11 密钥库中加密和保护。
在某些情况下,可能更希望有一个集中式密钥管理系统,该系统为服务器的无人值守重启提供 ZFS 加密的文件系统,并且提供对封装密钥生命周期的集中控制。ZFS 提供了两种远程密钥管理方法。
第一种方法是使用远程密钥管理系统(如 Oracle Key Manager 系统),Oracle Solaris 可通过 PKCS#11 令牌访问它。在这种情况下,语法与上面的本地软令牌示例非常类似,只是密钥资料实际上在远程系统上存储和管理。
另一种方法是通过 Web 服务提供集中密钥管理。ZFS 可从任何支持对 URI 执行简单 GET 请求的 Web 服务获取封装密钥或密码短语,例如:
# zfs create -o encryption=on -o keysource=raw,https://keys.example.com/mykey tank/project/R
可以通过 HTTP 或 HTTPS 访问 Web 服务。ZFS 使用 libcurl
和 OpenSSL 访问 Web 服务;这要求 Web 服务用于 SSL/TLS 的 X.509 证书应由一个已知 CA 证书签署或是一个已知的自签名证书。Oracle Solaris 允许按以下方式扩充标准证书列表:
# cp myservercert.pem /etc/certs/CA/ # svcadm refresh ca-certificates
封装密钥在初始创建或挂载之后,可随时针对数据集层次结构进行更改。更改封装密钥不会重新加密磁盘上的任何数据,它是以原子方式对素有继承该封装密钥的数据集进行的。还可以在更改封装密钥值的同时,更改其格式和位置。这样,即使文件系统中有数据,也可以在本地和远程密钥管理之间执行在线迁移。现在回到我们原来的简单示例,更改密钥:
$ zfs key -c rpool/export/project Enter new passphrase for 'rpool/export/project':
注意,ZFS 没有提示输入当前密码短语,因为文件系统已经挂载,ZFS 知道封装密钥。它还知道哪个用户有权更改封装密钥。
除了能够更改封装密钥(仅用于加密数据加密密钥),ZFS 还能够随时随地开始对新写入的数据使用新数据加密密钥。这就可以采用符合 NIST SP800-57 密钥生命周期的方式同时管理封装密钥和数据加密密钥。
# zfs key -K tank/project/A # zfs clone -K tank/project/C@snap-1 tank/project/D
在上面的第一个示例中,我们更改了 tank/project/A
文件系统上此时间点之后写入的所有新数据的数据加密密钥。在上面的第二个示例中,我们通过克隆现有快照创建了一个新文件系统,但明确要求使用新的数据加密密钥写入该克隆独有的所有数据。
上次数据加密密钥更改的时间存储在只读的 rekeydate
属性中:
$ zfs get creation,rekeydate tank/project/A NAME PROPERTY VALUE SOURCE tank/project/A creation Thu Oct 6 12:10 2011 - tank/project/A rekeydate Thu Nov 9 11:01 2011 local
ZFS 委托系统提供了一种机制,允许用户对 ZFS 数据集执行某些操作。使用和更改密钥以及更改封装密钥的格式和位置均有单独的 ZFS 委托:key
、keychange
和 keysource
。
使用这些委托的组合可以构建一个密钥托管系统,授权某些用户知道和使用某个数据集的封装密钥,但不能更改其值或位置。其他用户可能被授权更改封装密钥的值,但不能使用它,并且这些用户可能或可能不会被授权更改封装密钥的位置(例如,在本地和远程密钥管理模式之间)。
# zfs allow -u bob keychange tank/project/C
以上示例允许用户 bob
更改数据集及其子集的封装密钥值,但不能更改 keysource
属性。这种情况下还要注意,用户 bob
在启动后实际上无法挂载 ZFS 数据集,也不能强制卸载该数据集及其密钥。root 用户(及系统启动本身)拥有所有 ZFS 委托。
ZFS 加密属性的 on
值映射到 aes-128-ccm
,因为这是目前提供的六种可用加密模式中最快的一种,而且认为它可以为许多部署提供足够的安全。根据文件系统或 ZVOL 负载的不同,您可能未能注意到(或者您注意到但并不关心)AES 密钥长度和模式之间的区别。
在 Oracle SPARC T2、T3 和 T4 处理器和带 AES-NI 扩展的 Intel 处理器上,ZFS 的所有加密均有硬件加速。SPARC T2、T3 和 T4 处理器还加速了对 ZFS 数据集启用加密时总是用于数据和元数据的 SHA256 检验和。
同时提供了 AES CCM 和 AES GCM,这样如果一种方法有缺陷(加密算法模式有时会产生与其基本算法无关的缺陷),仍然可以安全地使用另一种方法。您可能希望选择 aes-128-gcm
而非 aes-128-ccm
,原因之一就是 GCM 是 NSA Suite B 中的 AES 模式之一。ZFS 加密的设计和实现可以扩展为新的数据加密和密钥封装算法/模式组合。
在 CCM 和 GCM 模式之间选择的另一个原因是只有 CCM 模式(aes-128-ccm
、aes-192-ccm
和 aes-256-ccm
)才能结合使用 ZFS 加密和重复数据消除。
只有在文件系统或该文件系统克隆内部且仅当数据加密密钥未更改(即如果未 使用 zfs key -K
和 zfs clone -K
)时,才会消除重复的加密数据。
使用 ZFS 加密还可以完成很多工作,包括组合加密、压缩和重复数据删除。ZFS 加密已完全集成到 ZFS 存储系统和管理工具中。它甚至可以为 Oracle Solaris 区域提供完全透明的加密。
有关 ZFS 和加密的更多信息,请参见以下资源:
下面是其他一些资源:
Darren 是 Solaris 核心技术组的高级首席工程师。他是一名 Oracle Solaris 安全架构师,专攻身份验证、加密和应用控制。他还以架构师身份领导开发了 ZFS 加密功能。
他曾于 Sun 的 Solaris 开发部门任职 12 年,后随 Oracle 收购 Sun 而加入 Oracle。在开发部门工作之前,Darren 在 Sun 服务部门工作,为 Trusted Solaris 及其他 Solaris 安全功能提供支持。加入 Sun 之前,Darren 任职于英国国防部。他毕业于苏格兰格拉斯哥大学计算科学系。
修订版 1.0,2012 年 7 月 23 日 |
要了解所有 Oracle 技术中与系统管理员相关的内容,请在 Facebook 和 Twitter 上关注 OTN Systems。