複数のパスワード保護された暗号化ボリュームをマウントする必要がある仮想化されたCentOS 7サーバーがあります。起動プロセス中に復号化パスワードを入力するためのコンソールにアクセスできないため、起動時にデバイスを自動的にマップできません。システムを再起動した後、手動で実行する必要があります
cryptsetup luksOpen <device> <name>
基盤となる各ブロックデバイスを暗号化されたデバイスにマップします。そのためには、基盤となる各ブロックデバイスのUUIDと、それがマップする名前をメモしておく必要があります。このプロセスを自動化する簡単な方法はありますか? noauto
キーワードを使用して/etc/crypttab
に情報を追加し、デバイスが起動時にマウントされないようにすることができます。ただし、cryptsetupでこのファイルの情報を使用できません。
cryptsetup luksOpen <name>
のようなコマンドを使用して/etc/crypttab
を読み取り、基礎となるブロックデバイスの名前を検索すると便利です(で定義できる方法と同様にmount <mountpoint>
/etc/fstab
)。
Cryptsetupで/etc/crypttab
からマッピングを読み取る方法はありますか?
cryptdisks_start と cryptdisks_stop をご覧ください。まさにそのとおりです。
# cryptdisks_start <name>
# mount <mountpoint>
...stuff...
# umount <mountpoint>
# cryptdisks_stop <name>
使用できます
Sudo systemctl start systemd-cryptsetup@<name>
の代わりに
cryptsetup luksOpen UUID=... <name>
/ etc/crypttabに次のようなエントリがある場合:
<name> UUID=... none noauto
必要に応じて、パスフレーズの入力を求められます。
対応するユニットファイルは systemd-cryptsetup-generator によって自動的に生成されます。
次のコマンドを使用して、生成されたすべてのユニットファイルをリストできます。
systemctl list-unit-files| grep systemd-cryptsetup
試してみたいと思います systemd-cryptsetup-generator
。
通常、このプロセスはinitramfsの起動中に実行され、動的に 各ブロックデバイスを復号化するsystemdユニット/etc/crypttab
。その後、いつでもこれらのユニットを起動でき、必要なパスフレーズの入力を求められます。
これは仮想マシンであるため、仮想コンソールにアクセスできる必要があります。つまり、ファイルシステムを通常どおりに暗号化し、起動時にパスフレーズを提供できます。もちろん、パスフレーズをいつ入力したかに関係なく、仮想マシンで使用するだけで 暗号化されたファイルシステムのセキュリティはとにかく危険にさらされます 。
この場合のために特別にbashスクリプトを作成しました。crypttab
を解析して、開く/閉じるデバイスのuuidを取得し、
その後、マウントオプションを格納するためにfstab
を使用します。
慣例として、暗号化されたデバイスを、/dev/mapper
のデバイスノードのような名前のディレクトリのルートフォルダーにマウントしますが、大文字にします。
たとえば、crypttabのxsnl
という名前のデバイスは/Xsnl
にマウントされます。
注意:noauto
とfstab
の両方でcrypttab
オプションを使用する必要があります。
#!/bin/bash
usage(){
echo "usage: ./crypt.sh [open|close] <encrypted_dev>"
}
OP=$1
TARGET=$2
# we bail out in case no first argument is passed
if [[ $OP != 'close' ]] && [[ $OP != 'open' ]]; then
usage
echo "Exiting: first argument must be either 'lock' or 'unlock'."
exit
fi
# we bail out in case no second argument is passed
if [[ -z $TARGET ]]; then
usage
echo "Exiting: second argument must be the name of the entry in fstab."
exit
fi
# our convention is to give same name to fstab mount point (upperfirst) and crypttab name (lower)
MAPPDEV=$(echo $TARGET | awk '{print tolower($0)}')
ENCRYPTED_DEV=$(Sudo grep -w $MAPPDEV /etc/crypttab)
# we bail out if we don't match a device in crypttab
if [[ -z $ENCRYPTED_DEV ]]; then
usage
echo "Exiting: no device named $MAPPDEV found in crypttab."
exit
fi
SEC_FIELD=$( echo $ENCRYPTED_DEV | sed -r 's/\s+/ /g' | cut -d' ' -f2)
# now we have all the info,
# depending on $OP (operation mode) we decide what to do
if [[ $OP == 'close' ]]; then
Sudo umount /$TARGET
Sudo cryptsetup luksClose $MAPPDEV
exit
fi
# if we get here we need to open and mount
Sudo cryptsetup luksOpen $SEC_FIELD $MAPPDEV
Sudo mount /$TARGET