「Dm-crypt/スワップの暗号化」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(→‎LVM on LUKS: 情報を更新して翻訳)
88行目: 88行目:
 
{{Note|このセクションは {{ic|encrypt}} フックを使用する場合にのみ適用され、シングルデバイスしかアンロックできません ({{Bug|23182}})。{{ic|sd-encrypt}} を使用することで複数のデバイスをアンロックできるようになりますが ([[Dm-crypt/システム設定#sd-encrypt フックを使う]]を参照)、スワップの自動認識は使えなくなります [https://github.com/systemd/systemd/issues/4878]。}}
 
{{Note|このセクションは {{ic|encrypt}} フックを使用する場合にのみ適用され、シングルデバイスしかアンロックできません ({{Bug|23182}})。{{ic|sd-encrypt}} を使用することで複数のデバイスをアンロックできるようになりますが ([[Dm-crypt/システム設定#sd-encrypt フックを使う]]を参照)、スワップの自動認識は使えなくなります [https://github.com/systemd/systemd/issues/4878]。}}
   
  +
スワップデバイスがルートファイルシステムのデバイスとは異なるデバイス上にある場合、 {{ic|encrypt}} フックによって開かれません。つまり、再開は {{ic|/etc/crypttab}} の前に行われます。 を使用できるため、再開する前に、 {{ic|/etc/mkinitcpio.conf}} にフックを作成して、スワップLUKSデバイスを開く必要があります。
If the swap device is on a different device from that of the root file system, it will not be opened by the {{ic|encrypt}} hook, i.e. the resume will take place before {{ic|/etc/crypttab}} can be used, therefore it is required to create a hook in {{ic|/etc/mkinitcpio.conf}} to open the swap LUKS device before resuming.
 
   
 
現在使用中のパーティションを使いたい場合、先に無効化する必要があります:
 
現在使用中のパーティションを使いたい場合、先に無効化する必要があります:
 
# swapoff /dev/<device>
 
# swapoff /dev/<device>
   
Also make sure you remove any line in {{ic|/etc/crypttab}} pointing to this device.
+
また、このデバイスを指す {{ic|/etc/crypttab}} の行をすべて削除してください。
   
 
既存のスワップパーティションを再利用する場合、パーティションが GPT パーティションテーブルに載っているときはパーティションを削除してから再作成する必要があります。[[パーティショニング]]を見てください。削除することで systemd-gpt-auto-generator によって起動時にパーティションが有効にならないようにします。
 
既存のスワップパーティションを再利用する場合、パーティションが GPT パーティションテーブルに載っているときはパーティションを削除してから再作成する必要があります。[[パーティショニング]]を見てください。削除することで systemd-gpt-auto-generator によって起動時にパーティションが有効にならないようにします。
   
  +
次の設定には、起動のたびにスワップパーティションに追加のパスフレーズを手動で挿入する必要があるという欠点があります。
The following setup has the disadvantage of having to insert an additional passphrase for the swap partition manually on every boot.
 
   
{{Warning|1=Do not use this setup with a key file if {{ic|/boot}} is unencrypted. Please read about the issue reported [https://wiki.archlinux.org/index.php?title=Talk:Dm-crypt&oldid=255742#Suspend_to_disk_instructions_are_insecure here]. Alternatively, use a gnupg-encrypted keyfile as per https://bbs.archlinux.org/viewtopic.php?id=120181}}
+
{{Warning|1={{ic|/boot}} が暗号化されていない場合は、このセットアップをキーファイルで使用しないでください。 報告された問題についてお読みください [https://wiki.archlinux.org/index.php?title=Talk:Dm-crypt&oldid=255742#Suspend_to_disk_instructions_are_insecurehere] または、https://bbs.archlinux.org/viewtopic.php?id=201881}} に従って gnupg で暗号化されたキーファイルを使用します。
   
  +
スワップパーティションの暗号化されたコンテナをフォーマットするには、ユーザーが記憶できるパスフレーズのキースロットを作成します。
To format the encrypted container for the swap partition, create a keyslot for a user-memorizable passphrase.
 
   
 
{{ic|/dev/mapper}} にパーティションをオープン:
 
{{ic|/dev/mapper}} にパーティションをオープン:
118行目: 118行目:
 
</nowiki>}}
 
</nowiki>}}
   
  +
パスワードを入力してスワップデバイスを開くため、または:
for opening the swap device by typing your password or
 
   
 
{{hc|/etc/initcpio/hooks/openswap|<nowiki>
 
{{hc|/etc/initcpio/hooks/openswap|<nowiki>
138行目: 138行目:
 
</nowiki>}}
 
</nowiki>}}
   
  +
暗号化されたルートデバイスからキーファイルをロードしてスワップデバイスを開くため。
for opening the swap device by loading a keyfile from a crypted root device.
 
   
  +
一部のコンピューターでは、復号化プロセスとデバイスの列挙が完了する前に mkinitcpio がデバイスをマウントしようとすると、競合状態が発生する場合があります。 コメント付きの ''オプション'' ブロックは、ルートデバイスをマウントする準備ができるまで、起動プロセスを最大2秒遅らせます。
On some computers race conditions may occur when mkinitcpio tries to mount the device before the decryption process and device enumeration is completed. The commented ''Optional'' block will delay the boot process up to 2 seconds until the root device is ready to mount.
 
   
 
{{Note|スワップがソリッドステートドライブ (SSD) 上にあり Discard/TRIM を使用する場合、{{ic|--allow-discards}} オプションを上記の openswap フックの cryptsetup 行に追加する必要があります。discard について詳しくは [[Dm-crypt/特記事項#ソリッドステートドライブ (SSD) の Discard/TRIM のサポート]]や [[SSD]] の記事を見てください。さらに 'discard' オプションをスワップデバイスの fstab エントリに追加してください。}}
 
{{Note|スワップがソリッドステートドライブ (SSD) 上にあり Discard/TRIM を使用する場合、{{ic|--allow-discards}} オプションを上記の openswap フックの cryptsetup 行に追加する必要があります。discard について詳しくは [[Dm-crypt/特記事項#ソリッドステートドライブ (SSD) の Discard/TRIM のサポート]]や [[SSD]] の記事を見てください。さらに 'discard' オプションをスワップデバイスの fstab エントリに追加してください。}}
   
  +
次に、フック設定ファイルを作成して編集します:
Then create and edit the hook setup file:
 
 
{{hc|/etc/initcpio/install/openswap|<nowiki>
 
{{hc|/etc/initcpio/install/openswap|<nowiki>
 
build ()
 
build ()
168行目: 168行目:
 
/dev/mapper/swapDevice swap swap defaults 0 0
 
/dev/mapper/swapDevice swap swap defaults 0 0
   
Set up your system to resume from {{ic|/dev/mapper/swapDevice}}. For example, if you use [[GRUB]] with kernel hibernation support, add {{ic|resume<nowiki>=</nowiki>/dev/mapper/swapDevice}} to the kernel line in {{ic|/boot/grub/grub.cfg}}. A line with encrypted root and swap partitions can look like this:
+
{{ic|/dev/mapper/swapDevice}} から再開するようにシステムを設定します。 たとえば、カーネル休止状態をサポートする [[GRUB]] を使用する場合は、 {{ic|/boot/ のカーネル行に {{ic|resume<nowiki>=</nowiki>/dev/mapper/swapDevice}} を追加します。 {{ic|/boot/grub/grub.cfg}} ルートパーティションとスワップパーティションが暗号化された行は、次のようになります。
   
 
kernel /vmlinuz-linux cryptdevice=/dev/sda2:rootDevice root=/dev/mapper/rootDevice resume=/dev/mapper/swapDevice ro
 
kernel /vmlinuz-linux cryptdevice=/dev/sda2:rootDevice root=/dev/mapper/rootDevice resume=/dev/mapper/swapDevice ro
   
  +
カーネルの更新時にパラメータを永続化するには、パラメータを {{ic|/etc/default/grub}} に追加します。
To make the parameter persistent on kernel updates, add it to {{ic|/etc/default/grub}}.
 
   
  +
起動時に、 {{ic|openswap}} フックがスワップパーティションを開くので、カーネルレジュームがそれを使用できます。 休止状態から再開するために特別なフックを使用する場合は、それらが {{ic|HOOKS}} 配列の '''後''' {{ic|openswap}} に配置されていることを確認してください。 initrd が swap を開くため、この場合、 {{ic|/etc/crypttab}} に swapDevice のエントリが必要ないことに注意してください。
At boot time, the {{ic|openswap}} hook will open the swap partition so the kernel resume may use it. If you use special hooks for resuming from hibernation, make sure they are placed '''after''' {{ic|openswap}} in the {{ic|HOOKS}} array. Please note that because of initrd opening swap, there is no entry for swapDevice in {{ic|/etc/crypttab}} needed in this case.
 
   
 
=== スワップファイルを使う ===
 
=== スワップファイルを使う ===

2020年12月22日 (火) 19:48時点における版

必要に応じて、以下で説明する様々な方法を使ってスワップパーティションを暗号化することができます。再起動時にスワップパーティションを (新しい暗号を使って) 初期化することで、過去にスワップアウトされた重要なファイルの断片がそのまま残ってしまうのを防ぐことができ、強固なデータの保護が可能になります。ただし、スワップを暗号化すると基本的にハイバネートが使えなくなってしまいます。

suspend-to-disk を使用しない

suspend-to-disk (ハイバネーション) が必要ない場合、/etc/crypttab を設定することで plain dm-crypt を使って起動時にランダムなパスワードでスワップパーティションを復号化することができます。ランダムなパスワードはシャットダウン時に破棄されるため、スワップデバイス内のデータには二度とアクセスできなくなります。

/etc/crypttabswap から始まる行をアンコメントするだけで機能を有効にできます。<device> パラメータはあなたの使用しているスワップデバイスの名前に変更してください。例:

/etc/crypttab
# <name>  <device>     <password>     <options>
swap      /dev/sdX#    /dev/urandom   swap,cipher=aes-cbc-essiv:sha256,size=256

上記の設定で /dev/sdX#/dev/mapper/swap にスワップパーティションとしてマッピングされ、通常のスワップと同じように /etc/fstab に追加できるようになります。既にスワップパーティションを使っていた場合、無効化するか fstab エントリを再利用してデバイスを /dev/mapper/swap に変更してください。大抵の場合はデフォルトのオプションで問題ありません。他のオプションやカラムの説明については man 5 crypttab および point cryptsetup FAQ 2.3 を見てください。

警告: 名前付きデバイスの中身は永久に削除されます。スワップデバイスに対してカーネルのシンプルな命名を使うのは危険です。名前の順番が起動時に変わってしまう可能性があるためです (例: /dev/sda, /dev/sdb)。以下の方法があります:
  • by-idby-path を使用する。ただし、どちらもハードウェアを変更すると変わる可能性があります。永続的なブロックデバイスの命名#by-id と by-path を参照。
  • LVM の論理ボリュームの名前を使用する。
  • #UUID と LABEL に書かれている方法を使う。ラベルや UUIDmkswap によって起動時にスワップデバイスを再作成・暗号化するため直接使われることはありません [1]

カーネルの命名の代わりに by-id による命名を使う場合、まずスワップデバイスを確認してください:

# ls -l /dev/disk/*/* | grep sdaX
lrwxrwxrwx 1 root root 10 Oct 12 16:54 /dev/disk/by-id/ata-WDC_WD2500BEVT-22ZCT0_WD-WXE908VF0470-partX -> ../../sdaX
lrwxrwxrwx 1 root root 10 Oct 12 16:54 /dev/disk/by-id/wwn-0x60015ee0000b237f-partX -> ../../sdaX

そして出力された行の中から適切なデバイスを選択して以下のように設定してください:

/etc/crypttab
# <name>  <device>                                                         <password>     <options>
swap      /dev/disk/by-id/ata-WDC_WD2500BEVT-22ZCT0_WD-WXE908VF0470-partX  /dev/urandom   swap,cipher=aes-cbc-essiv:sha256,size=256

再起動後 swapon -s を実行することで任意のデバイスマッパーエントリ (例: /dev/dm-1) が表示され、lsblk コマンドで FSTYPE カラムの crypt が表示されます。起動時に新しく暗号化するため、/dev/mapper/swap の UUID は毎回変わります。

ノート:
  • スワップに選択したパーティションが LUKS パーティションだった場合、crypttab はスワップパーティションを作成するのにパーティションを上書きしません。crypttab で間違ってスワップパーティションを指定したときにデータが消失しないようにするための安全機構です。そのようなパーティションを使うときは LUKS ヘッダーを上書きしてください。
  • ルートファイルシステムで sd-encrypt フックと luks.* カーネルパラメータを使用する場合、systemd は "Not creating device 'swap' because it was not specified on the kernel command line." とエラーを吐きます。問題を解決するには rd.luks.* パラメータを使ってください。

UUID と LABEL

ノート: 以下の方法は systemd と sd-encrypt init フックを使用している場合は機能しません。

/dev/sdX# あるいは /dev/disk/by-id/ata-SERIAL-partX などのシンプルなカーネルデバイス名で crypttab のスワップを使うのは危険です。デバイス名やパーティションレイアウトに少しでも変更があると /etc/crypttab は次回の起動時に重要なデータをフォーマットしてしまいます。PARTUUID を使用した場合も同じです。

正規の UUID またはLABELを指定することにより、正しいパーティションを識別する方が信頼性が高くなります。 デフォルトでは、 dm-crypt と mkswap がそのパーティションのコンテンツを上書きするだけで、UUID と LABEL も削除されるため、これは機能しません。 ただし、スワップオフセットを指定することは可能です。 これにより、スワップ暗号化用の永続的な UUID またはLABELを提供する以外の目的なしに、非常に小さく、空の、偽のファイルシステムを作成できます。

選択したラベルでファイルシステムを作成します:

# mkfs.ext2 -L cryptswap /dev/sdX# 1M

デバイス名の後の異常なパラメータは、ファイルシステムのサイズを 1 MiBに制限し、暗号化されたスワップの余地を残します。

# blkid /dev/sdX#
/dev/sdX#: LABEL="cryptswap" UUID="b72c384e-bd3c-49aa-b7a7-a28ea81a2605" TYPE="ext2"

これにより、 /dev/sdX# は、デバイス名やパーティション番号が将来どのように変更されるかに関係なく、 UUID または LABEL のいずれかで簡単に識別できるようになりました。 残っているのは、 /etc/crypttab/etc/fstab のエントリだけです。

/etc/crypttab
# <name> <device>         <password>    <options>
swap     LABEL=cryptswap  /dev/urandom  swap,offset=2048,cipher=aes-xts-plain64,size=256

この設定を使用すると、 cryptswap は、デバイス名が何であるかに関係なく、対応する LABEL を持つパーティションのみを使用しようとします。 パーティションを他の目的で使用することにした場合、それをフォーマットすることにより、 cryptswap LABEL もなくなるため、 cryptswap は次回の起動時にパーティションを上書きしません。

suspend-to-disk を使用する

コンピュータをディスクにサスペンド (ハイバネート) して復帰できるようにするには、スワップ領域を残す必要があります。あらかじめ LUKS スワップパーティションを用意して、ディスクに保存するか起動時に手動で入力できるようにしなければなりません。

以下の3つの方法はハイバネートのためにスワップの暗号化を設定する方法です。以下の方法を使う場合、スワップアウトされたデータがしばらくスワップに残り続ける可能性があるため注意してください。システムをシャットダウンするときにスワップを再暗号化するシステムジョブを設定することでリスクを減らすことができます。

LVM on LUKS

スワップボリュームが initramfs でアクティブ化されるボリュームグループにある場合は、 ハイバネーションの指示に従ってください。

スワップパーティションの使用

暗号化されたスワップパーティションから再開するには、暗号化されたパーティションを initramfs でロック解除する必要があります。

  • encrypt フックでデフォルトの busybox ベースの initramfs を使用する場合は、 #mkinitcpioフック の指示に従ってください。
  • sd-encrypt mkinitcpio フックで systemd ベースの initramfs を使用する場合は、追加の rd.luks カーネルパラメーターを指定するだけでスワップパーティションのロックを解除できます。

mkinitcpio フック

ノート: このセクションは encrypt フックを使用する場合にのみ適用され、シングルデバイスしかアンロックできません (FS#23182)。sd-encrypt を使用することで複数のデバイスをアンロックできるようになりますが (Dm-crypt/システム設定#sd-encrypt フックを使うを参照)、スワップの自動認識は使えなくなります [2]

スワップデバイスがルートファイルシステムのデバイスとは異なるデバイス上にある場合、 encrypt フックによって開かれません。つまり、再開は /etc/crypttab の前に行われます。 を使用できるため、再開する前に、 /etc/mkinitcpio.conf にフックを作成して、スワップLUKSデバイスを開く必要があります。

現在使用中のパーティションを使いたい場合、先に無効化する必要があります:

# swapoff /dev/<device>

また、このデバイスを指す /etc/crypttab の行をすべて削除してください。

既存のスワップパーティションを再利用する場合、パーティションが GPT パーティションテーブルに載っているときはパーティションを削除してから再作成する必要があります。パーティショニングを見てください。削除することで systemd-gpt-auto-generator によって起動時にパーティションが有効にならないようにします。

次の設定には、起動のたびにスワップパーティションに追加のパスフレーズを手動で挿入する必要があるという欠点があります。

警告: /boot が暗号化されていない場合は、このセットアップをキーファイルで使用しないでください。 報告された問題についてお読みください [3] または、https://bbs.archlinux.org/viewtopic.php?id=201881

に従って gnupg で暗号化されたキーファイルを使用します。

スワップパーティションの暗号化されたコンテナをフォーマットするには、ユーザーが記憶できるパスフレーズのキースロットを作成します。

/dev/mapper にパーティションをオープン:

# cryptsetup open --type luks /dev/<device> swapDevice

マッピングされたパーティションにスワップファイルシステムを作成:

# mkswap /dev/mapper/swapDevice

起動時にスワップをオープンにするフックを作成する必要があります。mkinitcpio-openswapAURインストールして設定するか、以下の手順に従って下さい。open コマンドを記述したフックファイルを作成:

/etc/initcpio/hooks/openswap
 run_hook ()
 {
     cryptsetup open --type luks /dev/<device> swapDevice
 }

パスワードを入力してスワップデバイスを開くため、または:

/etc/initcpio/hooks/openswap
 run_hook ()
 {
     ## Optional: To avoid race conditions
     x=0;
     while [ ! -b /dev/mapper/<root-device> ] && [ $x -le 10 ]; do
        x=$((x+1))
        sleep .2
     done
     ## End of optional

     mkdir crypto_key_device
     mount /dev/mapper/<root-device> crypto_key_device
     cryptsetup open --type luks --key-file crypto_key_device/<path-to-the-key> /dev/<device> swapDevice
     umount crypto_key_device
 }

暗号化されたルートデバイスからキーファイルをロードしてスワップデバイスを開くため。

一部のコンピューターでは、復号化プロセスとデバイスの列挙が完了する前に mkinitcpio がデバイスをマウントしようとすると、競合状態が発生する場合があります。 コメント付きの オプション ブロックは、ルートデバイスをマウントする準備ができるまで、起動プロセスを最大2秒遅らせます。

ノート: スワップがソリッドステートドライブ (SSD) 上にあり Discard/TRIM を使用する場合、--allow-discards オプションを上記の openswap フックの cryptsetup 行に追加する必要があります。discard について詳しくは Dm-crypt/特記事項#ソリッドステートドライブ (SSD) の Discard/TRIM のサポートSSD の記事を見てください。さらに 'discard' オプションをスワップデバイスの fstab エントリに追加してください。

次に、フック設定ファイルを作成して編集します:

/etc/initcpio/install/openswap
build ()
{
   add_runscript
}
help ()
{
cat<<HELPEOF
  This opens the swap encrypted partition /dev/<device> in /dev/mapper/swapDevice
HELPEOF
}

/etc/mkinitcpio.confHOOKS 配列に openswap フックを追加してください (filesystem の前で encrypt の後)。openswap の後には resume フックを追加してください:

HOOKS="... encrypt openswap resume filesystems ..."

ブートイメージを再生成:

# mkinitcpio -p linux

/etc/fstab に以下の行を追加してマッピングされたパーティションを追加:

/dev/mapper/swapDevice swap swap defaults 0 0

/dev/mapper/swapDevice から再開するようにシステムを設定します。 たとえば、カーネル休止状態をサポートする GRUB を使用する場合は、

テンプレートエラー: = 記号を使っていますか?ヘルプ:テンプレート#テンプレートを破壊する文字列のエスケープを見て下さい。

'

resume フックを etc/mkinitcpio.conf ファイルに追加してイメージを再生成してください:

HOOKS="... encrypt resume ... filesystems ..."

USB キーボードを使って復号化パスワードを入力する場合、以下のように encrypt フックの前に keyboard モジュールが来るようにしてください。モジュールが後になっていると、復号化パスワードを入力できなくなってコンピュータを起動できなくなります (keyboard を追加しても問題が起こる場合は usbinput を試してみてください):

HOOKS="... keyboard encrypt ..."

既知の問題

  • ログに "Stopped (with error) /dev/dm-1" と出力される場合 [4] を見てください。