dm-crypt/システム全体の暗号化
dm-crypt に戻る。
以下は dm-crypt を使って完全なシステム暗号化を行う一般的なシナリオの例です。通常のインストール手順に加える必要がある変更を全て説明しています。必要なツールは全て インストールイメージ に入っています。
概要
root ファイルシステムの暗号化については機能やパフォーマンスの点で dm-crypt が優れています。システムの root ファイルシステムが dm-crypt デバイス上にあれば、システム上のほとんど全てのファイルが暗号化されます。root 以外のファイルシステムを選択的に暗号化するのと異なり、root ファイルシステムの暗号化は様々な情報を隠匿できます。インストールされているプログラム、ユーザーアカウントのユーザー名、mlocate や /var/log/
など媒介してデータ漏洩の恐れがあるファイルなど。さらに、root ファイルシステムを暗号化することでシステムの改竄が非常に難しくなります。ブートローダーやカーネルを除く全てが暗号化されるためです。
以上の利点をのぞく、それぞれのシナリオのメリットやデメリットなどの違いをまとめて、全てのシナリオを以下の表で説明します:
シナリオ | メリット | デメリット |
---|---|---|
#LUKS を使用するシンプルなパーティションレイアウト
LUKS で root を完全に暗号化するベーシックなセットアップ |
|
|
#LVM on LUKS
LUKS 暗号化パーティションの中で LVM を使うことでパーティショニングの柔軟性を確保 |
|
|
#LUKS on LVM
LVM をセットアップした後に dm-crypt を使用 |
|
|
#Plain dm-crypt
dm-crypt の plain モードを使用、LUKS ヘッダーや LUKS の複数のキーのオプションは使わない |
|
|
上記全てのシナリオが外部からの脅威に対して十分な保護を約束しますが、共通の欠点も存在します。暗号化キーを持っているユーザーなら誰でもデバイスの全てを復号化して、他のユーザーのデータにもアクセスすることが可能という点です。これが問題だという場合は、ブロックデバイスの暗号化とスタックファイルシステムの暗号化と組み合わせて使用することで、両者の利点を取り入れることができます。ディスク暗号化を見て下さい。
他にも、スワップパーティションの暗号化を設定するべきかどうか考慮する必要があります。Dm-crypt/スワップの暗号化を見て下さい。
シナリオで使用されているパーティショニングの外観について Dm-crypt/ドライブの準備#パーティショニング も参照してください。
LUKS を使用するシンプルなパーティションレイアウト
この例ではシンプルなパーティションレイアウトによる 'dmcrypt+ LUKS のフルシステム暗号化を説明します:
+--------------------+--------------------------+--------------------------+ |Boot partition |LUKS encrypted system |Optional free space | | |partition |for additional partitions | |/dev/sdaY |/dev/sdaX |or swap to be setup later | +--------------------+--------------------------+--------------------------+
最初のステップは Arch Linux のインストールイメージを起動した後すぐに実行します。
ディスクの準備
パーティションを作成する前に、Dm-crypt/ドライブの準備 で説明されているように、ディスクを完全に消去する必要性・方法を学んでください。
それから必要なパーティションを作成します。最低でも /
が必要です (例: /dev/sdaX
) と /boot
(/dev/sdaY
)。パーティショニングを参照。
boot 以外のパーティションの準備
以下のコマンドは暗号化された root パーティションを作成・マウントします。Dm-crypt/root 以外のファイルシステムの暗号化#パーティション に詳しく説明されている手順に該当します (ページタイトルと相違して、mkinitcpio とブートローダーが正しく設定されていれば、root パーティションにも適用できます)。デフォルトになってない特定の暗号化オプションを使いたいときは (例: 暗号アルゴリズムや鍵長など)、最初のコマンドを実行する前に暗号化オプションを読んでください:
# cryptsetup -y -v luksFormat /dev/sdaX # cryptsetup open /dev/sdaX cryptroot # mkfs -t ext4 /dev/mapper/cryptroot # mount -t ext4 /dev/mapper/cryptroot /mnt
マッピングが問題ないかチェック:
# umount /mnt # cryptsetup close cryptroot # cryptsetup open /dev/sdaX cryptroot # mount -t ext4 /dev/mapper/cryptroot /mnt
パーティションを分割した場合 (例: /home
)、以上のコマンドを全てのパーティションに繰り返し実行してください。ただし /boot
は別です。起動時に追加のパーティションを扱う方法は Dm-crypt/root 以外のファイルシステムの暗号化#ロック解除とマウントの自動化 を見て下さい。
それぞれのブロックデバイスには個々のパスフレーズが必要になります。起動時に、別々のパスフレーズを入力しないといけないので、不便とも言えます。crypttab
を使うことでシステムパーティションにキーファイルを保存して使用することで別のパーティションを解錠することができます。方法は Dm-crypt/デバイスの暗号化#LUKS を使ってキーファイルでパーティションをフォーマット を見て下さい。
boot パーティションの準備
セットアップする必要があるのは暗号化されない /boot
パーティションで、暗号化する root に必要となります。例えば、標準的な MBR/BIOS の /boot
パーティションの場合、以下を実行します:
# mkfs -t ext4 /dev/sdaY # mkdir /mnt/boot # mount -t ext4 /dev/sdaY /mnt/boot
デバイスのマウント
インストールガイド#パーティションのマウントでは実際のパーティションではなく、マップされたデバイスをマウントしてください。もちろん、/boot
は暗号化されていないので、直接マウントします。
mkinitcpio の設定
encrypt
フックを mkinitcpio.conf 内の filesystems
の前に追加します:
etc/mkinitcpio.conf
HOOKS="... encrypt ... filesystems ..."
他に必要なフックについては dm-crypt/システム設定#mkinitcpio を見て下さい。
ブートローダーの設定
暗号化された root パーティションを起動するには、ブートローダーに以下のカーネルパラメータを設定する必要があります:
cryptdevice=/dev/sdaX:cryptroot
他に必要なパラメータについては Dm-crypt/システム設定#ブートローダー を見て下さい。
LVM on LUKS
The straight-forward method is to set up LVM on top of the encrypted partition instead of the other way round. Technically the LVM is setup inside one big encrypted blockdevice. Hence, the LVM is not transparent until the blockdevice is unlocked and the underlying volume structure is scanned and mounted during boot.
The disk layout in this example is:
+------------------------------------------------------------------------------------+ +----------------+ |Logical volume1 | Logical volume2 | Logical volume3 | | | |/dev/MyStorage/swapvol | /dev/MyStorage/rootvol | /dev/MyStorage/homevol | | Boot partition | |_ _ _ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _ |_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _| | (may be on | | | | other device) | | LUKS encrypted partition | | | | /dev/sdaX | | /dev/sdbY | +------------------------------------------------------------------------------------+ +----------------+
This method does not allow you to span the logical volumes over multiple disks, even in the future. The #LUKS on LVM method does not have this limitation.
ディスクの準備
パーティションを作成する前に、Dm-crypt/ドライブの準備 で説明されているように、ディスクを完全に消去する必要性・方法を学んでください。
When using the GRUB bootloader together with GPT, create a BIOS Boot Partition as explained in GRUB#BIOS systems.
Create a partition to be mounted at /boot
of type 8300
with a size of 100 MB or more.
Create a partition of type 8E00
, which will later contain the encrypted container.
Create the LUKS encrypted container at the "system" partition. Enter the chosen password twice.
# cryptsetup luksFormat /dev/sdaX
For more information about the available cryptsetup options see the LUKS encryption options prior to above command.
Open the container:
# cryptsetup open --type luks /dev/sdaX lvm
The decrypted container is now available at /dev/mapper/lvm
.
論理ボリュームの準備
Create a physical volume on top of the opened LUKS container:
# pvcreate /dev/mapper/lvm
Create the volume group named MyStorage
, adding the previously created physical volume to it:
# vgcreate MyStorage /dev/mapper/lvm
Create all your logical volumes on the volume group:
# lvcreate -L 8G MyStorage -n swapvol # lvcreate -L 15G MyStorage -n rootvol # lvcreate -l +100%FREE MyStorage -n homevol
Format your filesystems on each logical volume:
# mkfs.ext4 /dev/mapper/MyStorage-rootvol # mkfs.ext4 /dev/mapper/MyStorage-homevol # mkswap /dev/mapper/MyStorage-swapvol
Mount your filesystems:
# mount /dev/MyStorage/rootvol /mnt # mkdir /mnt/home # mount /dev/MyStorage/homevol /mnt/home # swapon /dev/MyStorage/swapvol
boot パーティションの準備
The bootloader loads the kernel, initramfs, and its own configuration files from the /boot
directory. This directory must be located on a separate unencrypted filesystem.
Create an Ext2 filesystem on the partition intended for /boot
. Any filesystem that can be read by the bootloader is eligible.
# mkfs.ext2 /dev/sdbY
Create the directory /mnt/boot
:
# mkdir /mnt/boot
Mount the partition to /mnt/boot
:
# mount /dev/sdbY /mnt/boot
Aftwards continue with the installation procedure up to the mkinitcpio step.
mkinitcpio の設定
encrypt
と lvm2
フックを mkinitcpio.conf 内の filesystems
の前に追加します:
/etc/mkinitcpio.conf
HOOKS="... encrypt lvm2 ... filesystems ..."
他に必要なフックについては dm-crypt/システム設定#mkinitcpio を見て下さい。
ブートローダーの設定
In order unlock the encrypted root partition at boot, the following kernel parameters need to be set by the boot loader:
cryptdevice=/dev/partition:MyStorage root=/dev/mapper/MyStorage-rootvol
詳しくは Dm-crypt/システム設定#ブートローダー を見て下さい。
LUKS on LVM
LVM 上で暗号化を利用するには、まず LVM ボリュームをセットアップして、それから暗号化パーティションのベースとして使うことになります。この方法では、暗号化パーティションと非暗号化パーティションのミックスが可能です。#LVM on LUKS とは違って、複数のディスクにまたがるような通常の論理ボリュームは使えません。
The following short example creates a LUKS on LVM setup and mixes in the use of a key-file for the /home partition and temporary crypt volumes for /tmp
and /swap
. The latter is considered desirable from a security perspective, because no potentially sensitive temporary data survives the reboot, when the encryption is re-initialised. If you are experienced with LVM, you will be able to ignore/replace LVM and other specifics according to your plan. If you want to span a logical volume over multiple disks during setup already, a procedure to do so is described in Dm-crypt/Specialties#Expanding LVM on multiple disks.
ディスクの準備
Partitioning scheme:
/dev/sda1
->/boot
/dev/sda2
-> LVM
Randomise /dev/sda2
according to Dm-crypt/Drive preparation#dm-crypt_wipe_before_installation.
論理ボリュームの準備
# lvm pvcreate /dev/sda2 # lvm vgcreate lvm /dev/sda2 # lvm lvcreate -L 10G -n lvroot lvm # lvm lvcreate -L 500M -n swap lvm # lvm lvcreate -L 500M -n tmp lvm # lvm lvcreate -l 100%FREE -n home lvm
# cryptsetup luksFormat -c aes-xts-plain64 -s 512 /dev/lvm/lvroot # cryptsetup open --type luks /dev/lvm/lvroot root # mkfs -t ext4 /dev/mapper/root # mount /dev/mapper/root /mnt
Note that /home
will be encrypted later in this example. Further, note that if you ever have to access the encrypted root from the Arch-ISO, the above open
action will allow you to after the LVM shows up.
boot パーティションの準備
# dd if=/dev/zero of=/dev/sda1 bs=1M # mkfs -t ext4 /dev/sda1 # mkdir /mnt/boot # mount /dev/sda1 /mnt/boot
Now after setup of the encrypted LVM partitioning, it would be time to install: Arch Install Scripts.
mkinitcpio の設定
encrypt
と lvm2
フックを mkinitcpio.conf 内の filesystems
の前に追加します:
etc/mkinitcpio.conf
HOOKS="... lvm2 encrypt ... filesystems ..."
他に必要なフックについては dm-crypt/システム設定#mkinitcpio を見て下さい。
ブートローダーの設定
上の例の場合、ブートローダーの設定で root デバイスのカーネルオプションを以下のように変更します:
cryptdevice=/dev/lvm/lvroot:root root=/dev/mapper/root
詳しくは Dm-crypt/システム設定#ブートローダー を見て下さい。
fstab と crypttab の設定
/etc/fstab
/dev/mapper/root / ext4 defaults 0 1 /dev/sda1 /boot ext4 defaults 0 2 /dev/mapper/tmp /tmp tmpfs defaults 0 0 /dev/mapper/swap none swap sw 0 0
以下の crypttab オプションは再起動するたびに一時ファイルシステムを暗号化します:
/etc/crypttab
swap /dev/lvm/swap /dev/urandom swap,cipher=aes-xts-plain64,size=256 tmp /dev/lvm/tmp /dev/urandom tmp,cipher=aes-xts-plain64,size=256
論理ボリューム /home の暗号化
Since this scenario uses LVM as the primary and dm-crypt as secondary mapper, each encrypted logical volume requires its own encryption. Yet, unlike the temporary filesystems configured with volatile encryption above, the logical volume for /home
should be persistent, of course. The following assumes you have rebooted into the installed system, otherwise you have to adjust paths.
To safe on entering a second passphrase at boot for it, a keyfile is created:
mkdir -m 700 /etc/luks-keys dd if=/dev/random of=/etc/luks-keys/home bs=1 count=256
論理ボリュームは以下のように暗号化します:
cryptsetup luksFormat -v -s 512 /dev/lvm/home /etc/luks-keys/home cryptsetup -d /etc/luks-keys/home open --type luks /dev/lvm/home home mkfs -t ext4 /dev/mapper/home mount /dev/mapper/home /home
暗号化されたマウントは crypttab で設定します:
/etc/crypttab
home /dev/lvm/home /etc/luks-keys/home
/etc/fstab
/dev/mapper/home /home ext4 defaults 0 2
これでセットアップは完了です。 and setup is done.
If you want to expand the logical volume for /home
(or any other volume) at a later point, it is important to note that the LUKS encrypted part has to be resized as well. For a procedure see Dm-crypt/Specialties#Expanding LVM on multiple disks.
Plain dm-crypt
This scenario sets up a system on a dm-crypt a full disk with plain mode encryption. Note that for most use cases, the methods using LUKS described above are the better options for both system encryption and encrypted partitions. LUKS features like key management with multiple pass-phrases/key-files are unavailable with plain mode.
The scenario uses a USB stick for the boot device and another one to store the encryption key. The disk layout is:
+------------------------------------------------------------+ +---------------+ +---------------+ |disk drive /dev/sdaX encrypted using plain mode and LVM | |USB stick 1 | |USB stick 2 | |--------------------+------------------+--------------------| |---------------| |---------------| |Volume 1: |Volume 2: |Volume 3: | |Boot device | |Encryption key | | | | | | | |file storage | |root |swap |home | |/boot | |(unpartitioned | | | | | | | |in example) | |/dev/store/root |/dev/store/swap |/dev/store/home | |/dev/sdY1 | |/dev/sdZ | +--------------------+------------------+--------------------+ +---------------+ +---------------+
The reasons for the use of two USB-keys are:
- The boot loader options required to open/unlock a plain encrypted device are detailed. Typing them each boot is error prone, storing them on an unencrypted
/boot
partition on the same device results in security concerns. - This scenario uses a key file, storing the keyfile on a second USB stick for security again. A passphrase with good entropy may be used instead.
The main consideration for choosing plain over LUKS mode for the scenario is:
- dm-crypt plain mode does not require a header on the encrypted disk. This means that an unpartitioned, encrypted disk will be indistinguishable from a disk filled with random data, which is the desired attribute for this scenario.
Plain dm-crypt encrypted disks can be more resilient to damage than LUKS encrypted disks, because it does not rely on an encryption master-key which can be a single-point of failure if damaged. However, using plain mode also requires more manual configuration of encryption options to achieve the same cryptographic strength. See also Disk encryption#Cryptographic metadata
ディスクの準備
It is vital that the mapped device is filled with data. In particular this applies to the scenario usecase we apply here.
See Dm-crypt/Drive preparation and Dm-crypt/Drive preparation#dm-crypt specific methods
boot 以外のパーティションの準備
See Dm-crypt/Device encryption#Encryption options for plain mode for details.
Using the device /dev/sdX
, with the twofish-xts cipher with a 512 bit key size and using a keyfile we have the following options for this scenario:
# cryptsetup --hash=sha512 --cipher=twofish-xts-plain64 --offset=0 --key-file=/dev/sdZ --key-size=512 open --type=plain /dev/sdX enc
Unlike encrypting with LUKS, the above command must be executed in full whenever the mapping needs to be re-established, so it is important to remember the cipher, hash and key file details.
We can now check a mapping entry has been made for /dev/mapper/enc
:
# fdisk -l
Next, we setup LVM logical volumes on the mapped device, see Lvm#Installing Arch Linux on LVM for further details:
# pvcreate /dev/mapper/enc # vgcreate store /dev/mapper/enc # lvcreate -L 20G store -n root # lvcreate -L 10G store -n swap # lvcreate -l +100%FREE store -n home
論理ボリュームをフォーマットしてマウントします。詳しくはファイルシステム#デバイスのフォーマットを見て下さい
# mkfs.ext4 /dev/store/root # mkfs.ext4 /dev/store/home # mount /dev/store/root /mnt # mkdir /mnt/home # mount /dev/store/home /mnt/home # mkswap /dev/store/swap # swapon /dev/store/swap
boot パーティションの準備
The /boot
partition can be installed on the standard vfat partition of a USB stick, if required. But if manual partitioning is needed, then a small 200MB partition is all that is required. Create the partition using a partitioning tool of your choice.
We choose a non-journalling file system to preserve the flash memory of the /boot
partition, if not already formatted as vfat:
# mkfs.ext2 /dev/sdY1 # mkdir /mnt/boot # mount /dev/sdY1 /mnt/boot
mkinitcpio の設定
encrypt
と lvm2
フックを mkinitcpio.conf 内の filesystems
の前に追加します:
etc/mkinitcpio.conf
HOOKS="... encrypt lvm2 ... filesystems ..."
他に必要なフックについては dm-crypt/システム設定#mkinitcpio を見て下さい。
ブートローダーの設定
In order to boot the encrypted root partition, the following kernel parameters need to be set by the boot loader:
cryptdevice=/dev/sdX:enc cryptkey=/dev/sdZ:0:512 crypto=sha512:twofish-xts-plain64:512:0:
他に必要なパラメータについては Dm-crypt/システム設定#ブートローダー を見て下さい。
インストール後
You may wish to remove the USB sticks after booting. Since the /boot
partition is not usually needed, the noauto
option can be added to the relevant line in /etc/fstab
:
/etc/fstab
# /dev/sdYn /dev/sdYn /boot ext2 noauto,rw,noatime 0 2
However, when an update to the kernel or bootloader is required, the /boot
partition must be present and mounted. As the entry in fstab
already exists, it can be mounted simply with:
# mount /boot