以下の資料は、CentOS 6 x64の
bagzilla redhatで
Michael 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'
暗号化されたルートパスワードをシャドウから取得し、パスワードを使用してリモートでログインできるようにします。キーによる認証が必要な場合は、同じフォルダーに内部公開キーと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'
このモジュールをデフォルトでdracutで使用したくない場合は、終了コードを255に変更します。そうしないと、カーネルの更新時に新しいinitramfsにこのモジュールが含まれます。
カーネルモジュールをインストールするためのスクリプト:
cat > installkernel << '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'
modprobeの後、ネットワークカード(installkernelスクリプトに示されているもの)に必要なモジュールロードを置き換え、ネットワーク設定とインターフェイス名を自分のものに置き換えます。これは、ipが統計情報であることを意味します。出力がdhcp経由の場合、dhclientインストールをインストールスクリプトに追加する必要があります。それに必要なすべてのライブラリ。
Dropbear停止スクリプト:
cat > clean.sh << '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]
ここで、すべてのスクリプトの実行権を与え、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:与えられたスクリプトコードは、コンソールにコピーして実行するのに十分簡単で、すべてが対応するファイルに書き込まれます。