手册页部分 1M: 系统管理命令

退出打印视图

更新时间: 2014 年 7 月
 
 

zfs_encrypt(1M)

名称

zfs_encrypt - 对 ZFS 文件系统进行加密

用法概要

zfs [-?]
zfs help subcommand | help | property property-name | permission
zfs help -l properties
zfs create -o encryption=on [-o keysource=raw | hex | 
     passphrase,prompt | file://|pkcs11:|https://] ...dataset
zfs clone [-p] [-K] [-o property=value] ...snapshot filesystem|volume
zfs get [-r|-d depth][-Hp][-o all | field[,...]] [-s source[,...]]
     all | property[,...] filesystem|volume|snapshot ...
zfs key -l | {-a | [-r] filesystem|volume}
zfs key -u [-f] {-a | [-r] filesystem|volume}
zfs key -c [-o keysource=value] {-a | [-r] filesystem|volume}
zfs key -K {-a | [-r] filesystem|volume}
zfs mount 
zfs mount [-vO] [-o options] -a | filesystem
zfs unmount [-f] -a | filesystem|mountpoint

描述

zfs create -o encryption 命令可对 ZFS 存储池中新建的 ZFS 数据集进行加密,如 zpool(1M) 中所述。

加密

加密是对数据进行编码以实现保密性的过程,数据拥有者需要使用密钥才能访问编码的数据。您可以在创建 ZFS 数据集时设置加密策略,但是该策略不可进行更改。有关详细信息,请参见“本机属性”中的 encryptionkeysource 属性说明。

数据集加密将被永久继承,在数据集克隆期间无法删除。接收复制的数据集流时,如果希望加密,则目标数据集必须启用加密。否则,数据将以明文形式存储。完全复制的加密数据集流将产生一个加密数据集,但该数据集采用新生成的密钥。流本身不会被加密。

本机 ZFS 加密属性

以下与 ZFS 加密相关的本机属性包含有关数据集的只读统计信息。无法设置或继承这些属性。除非另有说明,否则本机属性适用于所有数据集类型。有关 ZFS 本机属性的完整描述和列表,请参见 zfs(1M)

keychangedate

上次对给定数据集执行 zfs key –c 操作而导致包装密钥发生更改的日期。如果未执行密钥更改操作,则 keychangedate 与创建日期相同。

keystatus

标识数据集的加密密钥状态。通过显示 availableunavailable 的状态,可指明数据集密钥的可用性。对于没有启用加密的数据集,则显示 none

mounted

对于文件系统,指示当前是否已挂载文件系统。此属性可以是 yesno

rekeydate

上次因对此数据集执行 zfs key –Kzfs clone –K 操作而导致数据加密密钥发生更改的日期。如果未执行密钥更新操作,则 rekeydatecreation 日期相同。

在创建文件系统后无法更改以下属性,因此在创建文件系统时应设置这些属性。如果未使用 zfs createzpool create 命令设置属性,则从父数据集继承这些属性。如果在这些功能获得支持以前已创建的父数据集缺少这些属性,则新文件系统将为这些属性采用缺省值。

encryption=off | on | aes-128-ccm | aes-192-ccm | aes-256-ccm | aes-128-gcm | aes-192-gcm | aes-256-gcm

定义用于加密数据集的加密算法和密钥长度。on 值等于 aes-128-ccm。缺省值为 off(关闭)。将加密设置为 off 以外的值时,checksum 属性被设置为 sha256+mac 并且变为 readonly

如果向一般用户委派了相应的权限,则该用户可以创建加密的文件以及管理密钥操作,例如:创建、挂载、密钥源、检验和以及加密。


注 -  重复数据删除功能仅适用于 aes-128-ccmaes-192-ccmaes-256-ccm。在具有 gcm 模式的数据集上也可以设置 dedup 属性,但这不会产生可删除重复数据的块。如果层次结构中层次较低的文件系统具有 ccm 模式,在使用 aes-128-gcmaes-192-gcmaes-256-gcm 加密方式之一时,可以设置 dedup 属性,因为可以继承该属性。

在创建时必须指定以下属性,并可以使用特殊命令修改这些属性:

keysource=raw | hex | passphrase,prompt | file://|pkcs11:|https://

定义包含数据集密钥的密钥格式和位置。使用 zfs key –l 命令创建、挂载或装入数据集时,必须提供密钥。

keysource 属性接受两个值:format(格式),确定提供密钥的方式;locator(定位器),标识密钥的来源位置。

format 接受三个值:

  • raw:原始的密钥字节

  • hex:十六进制密钥字符串

  • passphrase:生成密钥的字符串

locator 接受两个值:

  • prompt:创建或挂载数据集时提示您输入密钥或口令短语

  • file:///filename:密钥文件或口令短语文件在文件系统中的位置

  • pkcs11:描述 PKCS#11 令牌中密钥或口令短语位置的 URI

  • https://location:密钥文件或口令短语文件在安全服务器上的位置。不建议使用此方法以明文形式传输密钥信息。根据在 keysource 的格式部分中请求的内容,对 URL 执行 GET 可仅返回密钥值或口令短语。

    keysource 使用 https:// 定位器时,服务器提供的证书必须是 libcurl 和 OpenSSL 信任的证书。将自己的信任锚点证书或自签名证书添加到 /etc/openssl/certs 下的证书库中。将 PEM 格式证书放在 /etc/certs/CA 目录下并运行 svcadm refresh ca-certificates 命令。

有关使用 https:// 定位器创建密钥的示例,请参见“示例”。

要更改包装密钥值或密钥,必须运行 zfs key –c 命令。如果只需要更改密钥位置(例如,文件名更改),则使用 zfs set 命令及 keysource 属性。请注意,当只使用 zfs set 命令更改密钥位置时,ZFS 不会执行检查,如新位置是否具有有效的包装密钥。

如果未指定和未继承 keysource,则对于已启用加密的数据集,缺省的 keysource 将设置为 passphrase,prompt;对于已禁用加密的数据集,该属性将设置为 none


注 -  启用加密后所有设置(压缩)都有效。

子命令

子命令

修改状态的所有子命令将以原始形式永久记录到池中。

zfs ?

显示帮助消息。

zfs help command | help | property property-name | permission

显示 zfs 命令的用法信息。可以显示特定命令、属性或委托权限的帮助。如果显示特定命令或属性的帮助,将显示命令语法或属性值。在不带任何参数的情况下使用 zfs help 将显示完整的 zfs 命令列表。

zfs help –l properties

显示 zfs 属性信息,包括是否可以编辑和继承属性值以及可能的属性值。

zfs create [-p] [–o encryption=on] [-o keysource=raw | hex | passphrase, prompt | file://|pkcs11:|https://] ... filesystem

创建新的 ZFS 文件系统并启用加密,它使用 aes-128-ccm。有关支持的加密算法的列表,请参见加密属性描述。

–p

创建所有非现有的父数据集。以这种方式创建的数据集会根据从父项继承的 mountpoint 属性自动挂载。在命令行上使用 –o 选项指定的任何属性将被忽略。如果目标文件系统已经存在,则会成功完成此操作。

–o encryption=value

将加密属性设置为 value。可以指定多个 –o 选项。如果在多个 –o 选项中指定了相同的属性,则会导致错误。

zfs clone [–p] [–K] [–o property=value] ... snapshot filesystem|volume

创建给定快照的克隆。有关详细信息,请参见“克隆”一节。目标数据集可以位于 ZFS 分层结构中的任意位置,并且创建为与原始数据集相同的数据类型。

–p

创建所有非现有的父数据集。以这种方式创建的数据集会根据从父项继承的 mountpoint 属性自动挂载。如果目标文件系统或卷已存在,则操作将成功完成。

–o property=value

设置指定的属性;有关详细信息,请参见 zfs create

–K

在此数据集的钥匙串中创建一个新的数据加密密钥。写入克隆中的数据将使用新的数据加密密钥,该密钥与其原始快照不同。

zfs set keysource=value filesystem|volume| ...

对每个数据集将 keysource 属性设置为给定值。只能更改 keysource 位置。如果要更改包装密钥值,请使用 zfs key –c 命令。

–r

在子数据集的整个子树中递归应用设置的有效值。根据属性,可以设置或继承有效值。

zfs get encryption | keysource | keystatus | rekeydate filesystem|volume| ...

显示给定数据集的属性。

–r

递归显示给定数据集的属性。

–d depth

递归显示任何后代数据集,并将递归深度限制为 depth。深度为 1 时将仅显示数据集及其直接子项。

–H

以更容易被脚本解析的格式显示输出。将省略所有标题,并通过单个制表符而不是任意数量的空格显式分隔各个字段。

zfs key -l | {-a | [-r] filesystem|volume}

装入一个数据集以及继承该密钥的任何数据集的加密密钥。通过该命令提供的密钥不是用于加密数据集的实际密钥。它是数据集的数据加密密钥集的包装密钥。

–l

装入包装密钥以取消加密数据集和继承该密钥的数据集的锁定。该命令基于数据集的 keysource 属性定义的内容装入密钥。

在池导入期间,在挂载数据集时执行密钥装入操作。在引导期间,如果包装密钥可用并且 keysource 未设置为 prompt,将执行密钥装入操作。

–a

应用于系统上所有池中的所有数据集。

–r

将该操作递归应用于命名文件系统或卷下的所有数据集。

zfs key -u [-f] | {-a | [-r] filesystem|volume}

卸载一个数据集以及继承该密钥的任何数据集的加密密钥。

–u

先取消挂载数据集,然后尝试卸载加密数据集以及继承密钥的数据集的包装密钥。如果卸载成功,数据集将无法访问并且已取消挂载。

–f

在尝试卸载密钥前尝试强制取消挂载数据集。如果未指定,将尝试正常取消挂载。

–a

应用于系统上所有池中的所有数据集。

–r

将该操作递归应用于命名文件系统或卷下的所有数据集。

zfs key -c [-o keysource=value] | {-a | [-r] filesystem|volume}

更改包装密钥。如果新密钥具有不同的格式或定位器,keysource 属性必须包含在该命令中。仅 zfs key –c 命令中包含的 keysource 属性可以更改。

–c

更改加密数据集和继承包装密钥的数据集的包装密钥。现有密钥必须装入之后,密钥更改操作才能发生。ZFS 不会提示您输入现有口令短语。

–o property=value

密钥更改操作中包含的要更改的属性。keysource 属性是唯一一个可以在密钥更改操作中更改的选项。

您必须具有更改 keysource 属性的权限。

–a

应用于系统上所有池中的所有数据集。

–r

将该操作递归应用于命名文件系统或卷下的所有数据集。

zfs key -K {-a | [-r] filesystem|volume}

创建新的数据加密密钥。新的数据加密密钥由与该数据集的任何现有数据加密密钥相同的包装密钥包装。

–K

为该数据集创建新的数据加密密钥。在该操作之后写入的数据将使用新的数据加密密钥。

–a

应用于系统上所有池中的所有数据集。

–r

将该操作递归应用于命名文件系统或卷下的所有数据集。

zfs mount
zfs mount [–vO] [–o options] –a | filesystem

挂载 ZFS 文件系统。自动在引导过程中调用。有关 zfs mount 语法的完整描述,请参见 zfs(1M)

filesystem

挂载指定的文件系统。

已加密数据集的 zfs mount 操作可能会提示您输入密钥,具体取决于 keysource 属性值。例如,如果 keysource 定位器设置为 prompt,可能会发生这种情况。

zfs unmount [–f] –a | filesystem|mountpoint

卸载当前挂载的 ZFS 文件系统。自动在关闭过程中调用。有关 zfs unmount 语法的完整描述,请参见 zfs(1M)

filesystem|mountpoint

卸载指定的文件系统。也可以为该命令指定系统上 ZFS 文件系统挂载点的路径。

对于已加密的数据集,卸载文件系统时,不会卸载密钥。要卸载密钥,请参见 zfs key

示例

示例 1 创建加密数据集

以下示例显示如何使用 passphrase 提示符(即 keysource 属性的缺省值)创建加密数据集。该示例假定 tank/home 数据集未加密。

# zfs create -o encryption=on tank/home/bob
Enter passphrase for 'tank/home/bob/': **********
Enter again: **********

在以下示例中,pktool(1) 命令用于生成文件的原始密钥。接下来,通过 aes-256-ccm 算法和 pktool 生成的原始密钥文件创建加密数据集 (tank/home/anne)。

# pktool genkey keystore=file outkey=/media/stick/mykey \
keytype=aes keylen=256
# zfs create -o encryption=aes-256-ccm \
-o keysource=raw,file:///rmdisk/stick/mykey tank/home/anne

该示例显示如何创建将检索存储在某个 https 位置的口令短语的 ZFS 加密文件系统。

# zfs create -o encryption=on \
-o keysource=passphrase,https://keys.example.com/keys/42 tank/home/fs1

该示例显示如何生成 PKCS#11 令牌中的原始密钥。然后,使用从 pktool 生成的原始 PKCS#11 密钥创建加密数据集。

# pktool genkey keystore=pkcs11 keytype=aes keylen=128 label=fs2
Enter PIN for Sun Software PKCS#11 softtoken: xxxxx
# zfs create -o encryption=on -o keysource=raw,pkcs11:object=fs2 \
tank/home/fs2
Enter PKCS#11 token PIN for 'tank/home/fs2': xxxxx

该示例显示如何生成 KMS 令牌中的原始密钥。然后,使用从 pktool 生成的原始 KMS 密钥创建加密数据集。

# pktool genkey keystore=pkcs11 keytype=aes keylen=256 token=KMS \
label=fs3
Enter PIN for KMS: xxxxx
# zfs create -o encryption=aes-256-ccm \
-o keysource="raw,pkcs11:token=KMS;object=fs3" tank/home/fs3
Enter 'KMS' PKCS#11 token PIN for 'tank/home/fs3': xxxxx
示例 2 通过不同的加密算法创建加密数据集

在该示例中,所有 tank/home 数据集都继承 keysource 属性,但使用不同的加密算法创建 tank/home/bob 数据集。

# zpool create tank ....
# zfs create -o encryption=on tank/home
# zfs get keystatus tank/home
NAME       PROPERTY   VALUE        SOURCE
tank/home  keystatus  available    -

# zfs create -o encryption=aes-256-ccm tank/home/bob
示例 3 继承加密和密钥源属性

在该示例中,所有的 tank/home 数据集都继承 encryptionkeysource 属性。

# zpool create -O encryption=on -o keysource=raw,file:///... tank ...
# zfs create tank/home
示例 4 更改加密数据集的包装密钥和密钥源

该示例显示如何将数据集的包装密钥更改为数据集的 keysource 属性定义的新密钥。

# zfs create -o encryption=aes-256-ccm -o keysource=raw,file:///etc/keyfile \
tank/home/rory
# zfs get keysource tank/home/rory
NAME            PROPERTY   VALUE                    SOURCE
tank/home/rory  keysource  raw,file:///etc/keyfile  local
# zfs key -c -o keysource=passphrase,prompt  tank/home/rory
Enter passphrase for 'tank/home/rory/': **********
Enter again: **********
# zfs get keychangedate tank/home/rory
NAME            PROPERTY       VALUE                  SOURCE
tank/home/rory  keychangedate  Thu Jun 28 14:32 2012  local

以下示例显示如何更改数据集的包装密钥的 http 位置。

# zfs get keysource tank/home/bob
NAME           PROPERTY   VALUE              SOURCE
tank/home/bob  keysource  passphrase,prompt  local

# zfs set keysource=passphrase,https://internal.example.com/keys/bob/zfs \
tank/home/bob

您必须具有委托的 keykeychange 权限才能更改 keysource 属性。

示例 5 重设数据集的加密密钥

该示例显示如何更改您或管理员既看不到也未管理的数据集加密密钥。数据集的加密密钥由 keysource 属性中指定的密钥包装(加密)。

# zfs key -K tank/project42
# zfs get rekeydate,creation tank/project42

您必须具有委托的 keychange 权限才能执行密钥更改操作。

示例 6 定制加密数据集的包装密钥

以下示例说明包装密钥大小不必与为 encryption 属性指定的密钥大小匹配。

# zfs create -o encryption=aes-128-gcm -o keysource=raw,file:///k256 \
/tank/home/amy

在上述示例中,加密密钥大小为 128,而包装密钥大小为 256。

# zfs create -o encryption=aes-256-gcm -o keysource=raw,file:///k192 \
/tank/home/rose

在上述示例中,加密密钥大小为 256,而包装密钥大小为 192。

退出状态

将返回以下退出值:

0

成功完成。

1

出现错误。

2

指定的命令行选项无效。

属性

有关下列属性的说明,请参见 attributes(5)

属性类型
属性值
可用性
system/file-system/zfs
接口稳定性
Committed(已确定)

另请参见

chmod(1)chown(1)pktool(1)ssh(1)mount(1M)zfs(1M)zpool(1M)chmod(2)chown(2)stat(2)write(2)attributes(5)

有关使用其他 ZFS 功能的信息,请参见 zfs_allow(1M)zfs_share(1M)zfs(1M)在 Oracle Solaris 11.2 中管理 ZFS 文件系统