暗号化とは機密保護のためにデータをエンコードするプロセスで、エンコードされたデータにデータ所有者がアクセスするには鍵が必要になります。ZFS 暗号化を使用する利点は次のとおりです。
ZFS 暗号化は ZFS コマンドセットと統合されています。ほかの ZFS 操作と同様に、鍵の変更や再入力などの暗号化操作は、オンラインで実行されます。
既存のストレージプールがアップグレードされていれば、それを使用できます。特定のファイルシステムの暗号化には柔軟性があります。
データは、CCM および GCM 操作モードで、鍵の長さが 128、192、および 256 の AES (Advanced Encryption Standard) を使用して暗号化されます。
ZFS 暗号化は、Oracle Solaris 暗号化フレームワークを使用します。このため自動的に、暗号化アルゴリズムのすべての使用可能なハードウェアアクセラレーションまたは最適化されたソフトウェア実装にアクセスできます。
現時点では、単独のファイルシステムであっても、ZFS ルートファイルシステムまたはその他の OS コンポーネント (/var ディレクトリなど) を暗号化することはできません。
ZFS 暗号化は子孫のファイルシステムに継承できます。
一般ユーザーは、create、mount、keysource、checksum、encryption アクセス権が割り当てられている場合に、暗号化されたファイルを作成して鍵の操作を管理できます。
Oracle 鍵管理のドキュメントについては、http://www.oracle.com/technetwork/documentation/tape-storage-curr-187744.html#cryptoの記憶域暗号化のセクションを参照してください。
Oracle Key Vault のドキュメントについては、https://docs.oracle.com/en/database/related-products.html の Database セキュリティのセクションを参照してください。
ZFS ファイルシステムが作成されるときに暗号化ポリシーを設定できますが、そのポリシーを変更することはできません。たとえば、tank/home/darren ファイルシステムは、暗号化プロパティーを有効にして作成されています。デフォルトの暗号化ポリシーでは、最低 8 文字の長さが必要なパスフレーズの入力が求められます。
$ zfs create -o encryption=on tank/home/darren Enter passphrase for 'tank/home/darren': xxxxxxx Enter again: xxxxxxxx
ファイルシステムの暗号化が有効になっていることを確認します。例:
$ zfs get encryption tank/home/darren NAME PROPERTY VALUE SOURCE tank/home/darren encryption on local
ファイルシステムの暗号化の値が on になっている場合、デフォルトの暗号化アルゴリズムは aes-128-ccm です。
ラッピング鍵は、実際のデータ暗号化鍵を暗号化するために使用されます。ラッピング鍵は、上記の例のように、暗号化したファイルシステムの作成時に、zfs コマンドからカーネルに渡されます。ラッピング鍵は、ファイルにあるか (生または 16 進数形式)、パスフレーズから派生します。
ラッピング鍵の形式と場所は、keysource プロパティーで次のように指定されます。
keysource=format,location
形式は次のいずれかになります。
raw – 生の鍵バイト
hex – 16 進数の鍵文字列
passphrase – 鍵を生成する文字列
場所は次のいずれかになります。
prompt – ファイルシステムの作成またはマウント時に鍵またはパスフレーズの入力が要求される
file:///filename – ファイルシステム内の鍵またはパスフレーズファイルの場所
pkcs11 – PKCS#11 トークンでの鍵またはパスフレーズの場所を記述した URI
https://location – セキュアなサーバー上の鍵またはパスフレーズファイルの場所。この方法を使用して鍵情報を平文で転送することは推奨されていません。URL に GET を付けると、keysource プロパティーの形式部分でリクエストされた内容に従って、鍵の値またはパスフレーズのみが返されます。
keysource で https:// ロケータを使用する場合は、ZFS サーバーが提示する証明書が libcurl および OpenSSL で信頼されているものである必要があります。独自のトラストアンカーまたは自己署名付き証明書を、/etc/openssl/certs にある証明書ストアに追加します。PEM 形式の証明書を /etc/certs/CA ディレクトリに配置し、次のコマンドを実行します。
$ svcadm refresh ca-certificates
keysource 形式が passphrase の場合、ラッピング鍵はパスフレーズから派生します。それ以外の場合、keysource プロパティー値は、生のバイトまたは 16 進数形式で、実際のラッピング鍵を示します。パスフレーズがファイルに格納されているか、入力が要求される生のバイトストリームに格納されているか (これはおそらくスクリプト処理にのみ適しています) を指定できます。
ファイルシステムの keysource プロパティー値が passphrase を指定している場合、ラッピング鍵は、PKCS#5 PBKD2 と、ファイルシステムごとにランダムに生成されたソルトを使用して、パスフレーズから派生します。したがって、子孫のファイルシステムで使用された場合、同じパスフレーズでも異なるラッピング鍵が生成されます。
ファイルシステムの暗号化ポリシーは、子孫のファイルシステムによって継承され、削除することはできません。例:
$ zfs snapshot tank/home/darren@now $ zfs clone tank/home/darren@now tank/home/darren-new Enter passphrase for 'tank/home/darren-new': xxxxxxx Enter again: xxxxxxxx $ zfs set encryption=off tank/home/darren-new cannot set property for 'tank/home/darren-new': 'encryption' is readonly
暗号化された、または暗号化されていない ZFS ファイルシステムをコピーまたは移行する必要がある場合、次の点を考慮してください。
現在、暗号化されていないデータセットストリームを送信することはできず、受信側のプールのデータセットで暗号化を有効にしている場合でも、これを暗号化されたストリームとして受信することもできません。
次のコマンドを使用して、暗号化されていないデータを、暗号化を有効にしているプール/ファイルシステムに移行できます。
cp –r
find | cpio
tar
rsync
複製された暗号化ファイルシステムストリームは、暗号化されたファイルシステムで受信でき、データは暗号化されたままです。詳細については、使用例 38, 暗号化された ZFS ファイルシステムを送受信するを参照してください。
zfs key –c コマンドを使用して、暗号化されたファイルシステムのラッピング鍵を変更できます。ブート時にファイルシステムの鍵 (zfs key –l) を明示的に読み込むか、ファイルシステム (zfs mount filesystem) をマウントすることによって、既存のラッピング鍵を最初に読み込んでいる必要があります。例:
$ zfs key -c tank/home/darren Enter new passphrase for 'tank/home/darren': xxxxxxxx Enter again: xxxxxxxx
次の例では、ラッピング鍵が変更され、ラッピング鍵がファイルから取得されることを指定するように keysource プロパティー値が変更されます。
$ zfs key -c -o keysource=raw,file:///media/stick/key tank/home/darren
暗号化されたファイルシステムのデータ暗号化鍵は、zfs key –K コマンドを使用して変更できますが、新しい暗号化鍵は新しく書き込むデータにのみ使用されます。この機能は、データ暗号化鍵の制限時間に関する NIST 800-57 ガイドラインを遵守するために使用できます。例:
$ zfs key -K tank/home/darren
上記の例では、データ暗号化鍵は表示されず、ユーザーが直接管理することもできません。さらに、鍵変更操作を実行するには keychange の委任が必要です。
次の暗号化アルゴリズムを使用できます。
aes-128-ccm, aes-192-ccm, aes-256-ccm
aes-128-gcm, aes-192-gcm, aes-256-gcm
ZFS keysource プロパティーは、ファイルシステムのデータ暗号化鍵をラップする鍵の形式と場所を指定します。例:
$ zfs get keysource tank/home/darren NAME PROPERTY VALUE SOURCE tank/home/darren keysource passphrase,prompt local
ZFS rekeydate プロパティーは、前回の zfs key –K 操作の日付を特定します。例:
$ zfs get rekeydate tank/home/darren NAME PROPERTY VALUE SOURCE tank/home/darren rekeydate Wed Jul 25 16:54 2012 local
暗号化したファイルシステムの creation プロパティーと rekeydate プロパティーの値が同じであれば、zfs key –K 操作でファイルシステムの鍵が再入力されていることは決してありません。
ZFS 暗号化鍵は、集中管理の場所が必要な場合、ローカルシステムとリモートのどちらかで、ユーザーのニーズに応じて、さまざまな方法で管理できます。
ローカル – 上記の例は、ラッピング鍵がパスフレーズプロンプトまたはローカルシステム上のファイルに格納されている未処理の鍵のどちらにもなり得ることを示しています。
リモート – 鍵情報をリモートで格納するには、Oracle Key Manager のような集中管理された鍵管理システムを使用するか、http または https URI での単純な GET リクエストをサポートする Web サービスを使用します。PKCS#11 トークンを使用すれば、Oracle Solaris システムで Oracle Key Manager の鍵情報にアクセスできます。
ZFS 暗号化鍵の管理の詳細は、次を参照してください http://www.oracle.com/technetwork/articles/servers-storage-admin/manage-zfs-encryption-1715034.html
Oracle Key Manager を使用した鍵情報の管理については、次を参照してください。
http://docs.oracle.com/cd/E24472_02/
鍵操作を委任するための次のアクセス権に関する説明を確認してください。
zfs key –l コマンドと zfs key –u コマンドを使用してファイルシステム鍵をロードまたはアンロードする場合、key アクセス権が必要になります。多くの場合、mount アクセス権も必要になります。
zfs key –c コマンドと zfs key –K コマンドを使用してファイルシステム鍵を変更する場合、keychange アクセス権が必要になります。
鍵の使用 (ロードまたはアンロード) と鍵の変更に、別々のアクセス権を委任することを検討してください。これにより 2 人鍵操作モデルを使用できます。たとえば、どのユーザーが鍵を使用でき、どのユーザーが鍵を変更できるかを決めます。または、鍵の変更には両方のユーザーが同席する必要があります。このモデルを使用すると、キーエスクローシステムを構築することもできます。
暗号化した ZFS ファイルシステムをマウントしようとする場合には、次の考慮事項を確認してください。
暗号化したファイルシステム鍵がブート中に使用できない場合、ファイルシステムは自動的にはマウントされません。たとえば、暗号化ポリシーが passphrase,prompt に設定されているファイルシステムは、ブートプロセスを中断してパスフレーズの入力を要求できないため、ブート中にマウントされません。
暗号化ポリシーが passphrase,prompt に設定されているファイルシステムをブート時にマウントする場合は、zfs mount コマンドで明示的にマウントしてパスフレーズを指定するか、zfs key –l コマンドを使用して、システムのブート後に鍵の入力を要求する必要があります。
例:
$ zfs mount -a Enter passphrase for 'tank/home/darren': xxxxxxxx Enter passphrase for 'tank/home/ws': xxxxxxxx Enter passphrase for 'tank/home/mark': xxxxxxxx
暗号化したファイルシステムの keysource プロパティーが別のファイルシステム内のファイルを指している場合、特にファイルがリムーバブルメディアにある場合には、ファイルシステムのマウント順序が、暗号化されたファイルシステムがブート時にマウントされるかどうかに影響を与える可能性があります。
Oracle Solaris 11 システムを 11.1 にアップグレードする前に、暗号化されたファイルシステムがマウントされていることを確認してください。暗号化されたファイルシステムをマウントして、入力を要求されたらパスフレーズを指定します。
$ zfs mount -a Enter passphrase for 'pond/amy': xxxxxxxx Enter passphrase for 'pond/rory': xxxxxxxx $ zfs mount | grep pond pond /pond pond/amy /pond/amy pond/rory /pond/rory
その後、暗号化されたファイルシステムをアップグレードします。
$ zfs upgrade -a
アンマウントされている、暗号化された ZFS ファイルシステムをアップグレードしようとすると、次のようなメッセージが表示されます。
$ zfs upgrade -a cannot set property for 'pond/amy': key not present
また、zpool status 出力には破壊されたデータが表示されることがあります。
$ zpool status -v pond . . . pond/amy:<0x1> pond/rory:<0x1>
上のエラーが発生した場合は、上述のとおりに暗号化されたファイルシステムを再マウントします。その後、プールのエラーをスクラブして、クリアします。
$ zpool scrub pond $ zpool clear pond
ファイルシステムのアップグレードの詳細は、ZFS ファイルシステムをアップグレードするを参照してください。
ZFS の圧縮、複製解除、および暗号化のプロパティーを使用する場合は、次の考慮事項を確認してください。
ファイルを作成するときに、データは圧縮され、暗号化され、チェックサムが計算されます。続いて、可能な場合はデータが複製解除されます。
ファイルを読み取るときには、チェックサムが検証され、データが復号化されます。続いて、必要に応じてデータが解凍されます。
暗号化され、クローンも作成されたファイルシステム上で dedup プロパティーが有効になっており、このクローン上では zfs key –K コマンドも zfs clone –K コマンドも使用されていない場合は、可能であれば、すべてのクローンのデータが複製解除されます。
次の例では、pktool コマンドを使用して aes-256-ccm 暗号化鍵が生成され、/cindykey.file のファイルに書き込まれます。
$ pktool genkey keystore=file outkey=/cindykey.file keytype=aes keylen=256
続いて、tank/home/cindy ファイルシステムが作成されるときに、/cindykey.file が指定されます。
$ zfs create -o encryption=aes-256-ccm -o keysource=raw,file:///cindykey.file tank/home/cindy使用例 36 別の暗号化アルゴリズムで ZFS ファイルシステムを暗号化する
ZFS ストレージプールを作成し、そのストレージプール内のすべてのファイルシステムに暗号化アルゴリズムを継承させることができます。この例では、users プールが作成され、users/home ファイルシステムが作成され、パスフレーズを使用して暗号化されます。デフォルトの暗号化アルゴリズムは aes-128-ccm です。
続いて、users/home/mark ファイルシステムが作成され、aes-256-ccm 暗号化アルゴリズムを使用して暗号化されます。
$ zpool create -O encryption=on users mirror c0t1d0 c1t1d0 mirror c2t1d0 c3t1d0 Enter passphrase for 'users': xxxxxxxx Enter again: xxxxxxxx $ zfs create users/home $ zfs get encryption users/home NAME PROPERTY VALUE SOURCE users/home encryption on inherited from users $ zfs create -o encryption=aes-256-ccm users/home/mark $ zfs get encryption users/home/mark NAME PROPERTY VALUE SOURCE users/home/mark encryption aes-256-ccm local使用例 37 暗号化した ZFS ファイルシステムのクローンを作成する
クローンファイルシステムが、元のスナップショットと同じファイルシステムの keysource プロパティーを継承する場合、新しい keysource は不要であり、keysource=passphrase,prompt の場合でも新しいパスフレーズの入力を要求されることはありません。クローンには同じ keysource が使用されます。例:
デフォルトでは、暗号化されたファイルシステムの子孫のクローンを作成するときに、鍵の入力を要求されません。
$ zfs create -o encryption=on tank/ws Enter passphrase for 'tank/ws': xxxxxxxx Enter again: xxxxxxxx $ zfs create tank/ws/fs1 $ zfs snapshot tank/ws/fs1@snap1 $ zfs clone tank/ws/fs1@snap1 tank/ws/fs1clone
クローンファイルシステムの新しい鍵を作成する場合、zfs clone –K コマンドを使用します。
子孫の暗号化されたファイルシステムではなく、暗号化されたファイルシステムのクローンを作成する場合は、新しい鍵を入力するように要求されます。例:
$ zfs create -o encryption=on tank/ws Enter passphrase for 'tank/ws': xxxxxxxx Enter again: xxxxxxxx $ zfs snapshot tank/ws@1 $ zfs clone tank/ws@1 tank/ws1clone Enter passphrase for 'tank/ws1clone': xxxxxxxx Enter again: xxxxxxxx使用例 38 暗号化された ZFS ファイルシステムを送受信する
次の例では、tank/home/darren@snap1 スナップショットが、暗号化された /tank/home/darren ファイルシステムから作成されます。続いて、暗号化プロパティーを有効にしてスナップショットが bpool/snaps に送信されます。このため、結果として受信されたデータは暗号化されています。ただし、送信プロセス中、tank/home/darren@snap1 ストリームは暗号化されていません。
$ zfs get encryption tank/home/darren NAME PROPERTY VALUE SOURCE tank/home/darren encryption on local $ zfs snapshot tank/home/darren@snap1 $ zfs get encryption bpool/snaps NAME PROPERTY VALUE SOURCE bpool/snaps encryption on inherited from bpool $ zfs send tank/home/darren@snap1 | zfs receive bpool/snaps/darren1012 $ zfs get encryption bpool/snaps/darren1012 NAME PROPERTY VALUE SOURCE bpool/snaps/darren1012 encryption on inherited from bpool
この場合、受信した暗号化されたファイルシステムに対して、新しい鍵が自動的に生成されます。