sshを介してCentOS6暗号化luksボリュームをリモートでロック解除

以下の資料は、CentOS 6 x64のbagzilla redhatMichael Schererが提案たリモートボリュームロック解除方法の適応と追加です。 このメソッドの本質は、 initramfsを変更することです。



追加のパッケージをインストールする



initramfsにdropbear sshサーバーを追加します。これは標準のリポジトリにはないため、外部epelを接続する必要があります。



rpm -Uhv http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-7.noarch.rpm yum -y install dropbear
      
      







Initramfsの変更



CentOS 6は、dracutと呼ばれるかなり便利なシステムを使用して、作成する追加モジュールであるinitramfsを生成します。 /usr/share/dracut/modules.d内のフォルダーで、インストールスクリプトと必要なファイルが含まれています。

 cd /usr/share/dracut/modules.d mkdir 40unlock cd 40unlock
      
      





モジュールをインストールするためのメインスクリプト:

 cat > install << 'EOF' #!/bin/bash cat /etc/shadow|grep root > ${moddir}/shadow dracut_install /lib64/libnss_compat.so.2 dracut_install /lib64/libnss_files.so.2 dracut_install /lib64/libnss_dns.so.2 inst_dir "/etc/dropbear" inst "${moddir}/dropbear_rsa_host_key" "/etc/dropbear/dropbear_rsa_host_key" inst_dir "/home" inst_dir "/home/root" inst_dir "/home/root/.ssh" inst "${moddir}/.profile" "/home/root" [ -s "${moddir}/authorized_keys" ] && inst "${moddir}/authorized_keys" "/home/root/.ssh/authorized_keys" inst "/etc/localtime" inst "${moddir}/nsswitch.conf" "/etc/nsswitch.conf" inst "/etc/resolv.conf" inst "/etc/host.conf" inst "/etc/hosts" inst "${moddir}/shadow" "/etc/shadow" inst "${moddir}/passwd" "/etc/passwd" inst "${moddir}/shells" "/etc/shells" inst "${moddir}/unlock" "/bin/unlock" inst_hook pre-trigger 01 "$moddir/remote-ssh.sh" inst_hook pre-pivot 01 "$moddir/clean.sh" dracut_install sed awk dropbear ifconfig route blkid cut killall true mkdir dracut_install -o ps find grep less cat tac head tail false rmdir rm touch vi ping ssh scp lsmod EOF
      
      





暗号化されたルートパスワードをシャドウから取得し、パスワードを使用してリモートでログインできるようにします。キーによる認証が必要な場合は、同じフォルダーに内部公開キーと600アクセス権を持つauthorized_keysファイルを配置します。ライブラリ。 hosts、resolv.conf、およびhost.confファイルはシステムから取得されます。 2つのフックが設定されます。1つ目(remote-ssh.sh)はパスワードが要求される前にdropbearを開始し、2つ目(clean.sh)はルートfsを変更する前にdropbearプロセスを強制終了します。 「dracut_install -o」では、メインシステムで使用可能な場合にinitramfsにインストールできるオプションのコマンドが指定されます。



スクリプト「検証」:

 cat > check << 'EOF' #!/bin/sh exit 0 EOF
      
      





このモジュールをデフォルトでdracutで使用したくない場合は、終了コードを255に変更します。そうしないと、カーネルの更新時に新しいinitramfsにこのモジュールが含まれます。



カーネルモジュールをインストールするためのスクリプト:

 cat > installkernel << 'EOF' #!/bin/bash instmods e1000 EOF
      
      





initramfsで必要なカーネルモジュールを交換します。この場合、intel e1000ネットワークカードをサポートするために、独自のカードで交換します(コマンドlspci -k



確認できます)。



次に、必要なすべての構成ファイルとスクリプトを作成します。



 echo 'root:x:0:0:root:/home/root:/bin/sh' > passwd echo '/bin/sh' > shells echo 'export PATH=/sbin:/usr/sbin:$PATH' >.profile dropbearkey -t rsa -f dropbear_rsa_host_key
      
      





ルートユーザーを作成し、システムシェルのリストを指定し、PATH変数を変更して、dropbearのrsaキーを生成します。



 cat >nsswitch.conf << 'EOF' passwd: files shadow: files group: files initgroups: files hosts: files dns bootparams: files ethers: files netmasks: files networks: files protocols: files rpc: files services: files automount: files aliases: files EOF
      
      





ユーザーを取得する場所とDNS名を変換する方法を示します。



ネットワークインターフェイスを持ち上げてdropbearを実行するためのスクリプト:

 cat >remote-ssh.sh << 'EOF' #!/bin/sh /sbin/modprobe e1000 /sbin/ifconfig lo 127.0.0.1/8 /sbin/ifconfig lo up /sbin/ifconfig eth0 192.168.100.203/24 /sbin/ifconfig eth0 up /sbin/route add default gw 192.168.100.1 /bin/mkdir -p /var/log /usr/sbin/dropbear -E -m -p 2222 -a -K 600 > /var/log/lastlog EOF
      
      





modprobeの後、ネットワークカード(installkernelスクリプトに示されているもの)に必要なモジュールロードを置き換え、ネットワーク設定とインターフェイス名を自分のものに置き換えます。これは、ipが統計情報であることを意味します。出力がdhcp経由の場合、dhclientインストールをインストールスクリプトに追加する必要があります。それに必要なすべてのライブラリ。



Dropbear停止スクリプト:

 cat > clean.sh << 'EOF' #!/bin/sh /usr/bin/killall dropbear EOF
      
      







パスワードが必要なすべてのluksボリュームのロック解除スクリプト:

 cat > unlock << 'EOF' if [ -f /etc/crypttab ] ; then sed '/^$/d;/^#/d' /etc/crypttab > /tmp/crypttab n=1 line="`sed -n "$n"p /tmp/crypttab`" while [ -n "$line" ]; do name="`echo $line|awk '{ print $1 }'`" dev="`echo $line|awk '{ print $2 }'`" key="`echo $line|awk '{ print $3 }'`" if [ "$key" = "none" ]; then luksname="$name" if [ "${dev%%=*}" = "UUID" ]; then device="`blkid -t $dev|cut -d: -f1`" else device=$dev fi echo "Password [$device ($luksname)]:" while :; do cryptsetup luksOpen $device $luksname && break done fi n=$((n+1)) line="`sed -n "$n"p /tmp/crypttab`" done sed -i /cryptsetup/c\ true /pre-pivot/* [ "$1" = "-noexit" ] && exit 0 killall plymouth killall cryptroot-ask fi exit 0 EOF
      
      





ここでは、最初にコメントアウトされていない空の行のない「クリーンな」暗号化タブを作成し、ループ内でパスワードが必要なすべてのボリュームをソートして復号化します。 dracutのluksモジュールは、ルートfsを変更する前にすべての未使用のluksボリュームを切断するため、これを防ぐために/ pre-pivotのスクリプトを変更します。 -noexit



パラメーターが-noexit



-noexit



れると、ダウンロードを妨げるプロセスは-noexit



されず、必要なパーティションを事前にマウントすることにより、initramfsからメインシステムを変更できます。 ダウンロードを続行するには、以前に手動でマウントしたパーティションをアンマウントして、コマンドを実行する必要があります

killall cryptroot-ask







ロック解除はこの方法で行われ、ルートfsを変更した後にのみボリュームの他のすべてのルート(ルートを除く)が接続されるため、 bugzillaで提案された方法ではなく、ドロップベアはハングします(フックを削除して削除する場合)が、単一のコマンドではありませんその中にもう満たされない。



その結果、/ usr / share / dracut / modules.d / 40unlockフォルダーに次のファイルが必要になります。

 [root@crypt 40unlock]# ls -al  56 drwxr-xr-x. 2 root root 4096  31 17:36 . drwxr-xr-x. 32 root root 4096  31 17:35 .. -rwxr-xr-x. 1 root root 17  31 17:35 check -rwxr-xr-x. 1 root root 36  31 17:36 clean.sh -rw-------. 1 root root 427  31 17:36 dropbear_rsa_host_key -rwxr-xr-x. 1 root root 1066  31 17:35 install -rwxr-xr-x. 1 root root 27  31 17:36 installkernel -rw-r--r--. 1 root root 222  31 17:36 nsswitch.conf -rw-r--r--. 1 root root 35  31 17:36 passwd -rw-r--r--. 1 root root 34  31 17:36 .profile -rwxr-xr-x. 1 root root 270  31 17:36 remote-ssh.sh -rw-r--r--. 1 root root 8  31 17:36 shells -rwxr-xr-x. 1 root root 740  31 17:36 unlock
      
      





ここで、すべてのスクリプトの実行権を与え、initramfsを再構築します。

 chmod a+x check clean.sh install installkernel remote-ssh.sh unlock dracut -f
      
      





次回の起動時に、sshを介してリモートでログインし、次のコマンドを使用して手動でパスワードを入力する必要があるluksボリュームをすべてロック解除できます。

 unlock
      
      







短所:

システムが仮想マシンで実行されており、ネットワークカードがvirtioデバイスである場合、これは機能しません。 おそらくudevを起動する前に、それを認識する時間はありません。 回避策として、luksルールの前に実行されるudevルールを追加するプリトリガーフックにスクリプトをハングアップしてみて(そしてudevによりロック解除が正確に発生します。luksボリュームが見つかったときに対応するコマンドが起動されます)、remote-ssh.shスクリプトが実行されます。

例:

 SUBSYSTEM!="block", GOTO="luks_end" ACTION!="add|change", GOTO="luks_end" ENV{ID_FS_TYPE}=="crypto_LUKS", RUN+="/bin/remote-ssh.sh" LABEL="luks_end"
      
      





このオプションはテストしていません。



関連リンク:



Dracut +暗号化されたルート+ネットワーク

ドラカットマニュアル



PS:与えられたスクリプトコードは、コンソールにコピーして実行するのに十分簡単で、すべてが対応するファイルに書き込まれます。



All Articles