ヘッドレスサーバーの起動中に暗号化されたLVMを復号化するSSH


59

Ubuntu 10.04をインストールし、現在10.10をインストールしたときに、ハードドライブで「暗号化されたLVM」を有効にするオプションが提示されました。そのオプションを選択した後、起動中にLVMを復号化するためのパスワードの入力を求められます。

今、私はLinux(必ずしもUbuntuではない)を実行するヘッドレスサーバーをセットアップすることを考えていますが、サーバーがヘッドレスであるため、起動中に解読できないことを心配しています。ブート中にSSHで暗号化LVMのパスワードを入力できますか?もしそうなら、どのように設定しますか?それとも別の解決策がありますか?繰り返しますが、この質問はUbuntuに固有のものではありません。ありがとう。


4
参照してください:zless /usr/share/doc/cryptsetup/README.remote.gz
0xC0000022L

@Nateの答えは受け入れられるべきだと思います:それは(本質的に、リンクされたブログの変更を反映するには編集が必要なので)プライベートキーではなく公開キーを使用します。
ジョナサンY.

回答:


25

たとえば、14.04などのubuntuの新しいバージョンでは、@ draglyとこのブログ投稿の回答の組み合わせが非常に役立つことがわかりました。言い換えると:

  1. (サーバー上)Dropbearをインストールします

    sudo apt-get install dropbear
    
  2. (サーバー上)ルート公開/秘密キーログインのアクセス許可をコピーして割り当てる

    sudo cp /etc/initramfs-tools/root/.ssh/id_rsa ~/.
    sudo chown user:user ~/id_rsa
    

サーバー上のユーザー名にユーザーを変更することを忘れないでください

  1. (クライアント上)サーバーから秘密鍵を取得する

    scp user@remote.server:~/id_rsa ~/.ssh/id_rsa_dropbear
    
  2. (クライアント上)ssh configにエントリを追加します

    Host parkia
        Hostname 192.168.11.111
        User root
        UserKnownHostsFile ~/.ssh/know_hosts.initramfs
        IdentityFile ~/.ssh/id_rsa_dropbear
    Remember to change _parkia_ to whatever you'd like to type `ssh my-box` to be.
    
  3. (サーバー上)このファイルを作成します/etc/initramfs-tools/hooks/crypt_unlock.sh

  4. (サーバー上)そのファイルを実行可能にする

    sudo chmod +x /etc/initramfs-tools/hooks/crypt_unlock.sh
    
  5. initramfsを更新します

    sudo update-initramfs -u
    
  6. 起動時にdropbearサービスを無効にして、パーティションが復号化された後にopensshが使用されるようにします

    sudo update-rc.d dropbear disable
    

できました。やってみて。静的IPアドレスを使用してサーバーを構成する必要がある場合の手順については、上記にリンクされているブログ投稿を確認してください。


リンクされたブログは、クライアントの公開キーをサーバーの/etc/initramfs-tools/root/.ssh/authorized_keysに追加するための参照を追加しました。これは、Dropbearの秘密キーのコピーを行っても完全に無視できます。残りの指示に従うとうまくいきます。つまり、公開鍵のみを使用するため、これが受け入れられた回答であることを意味します(変更が反映されると)。
ジョナサンY.

23

BusyBoxとDropbearを使用してこのようなセットアップを行うためのガイドは、このブログ投稿に示されています。early-sshは私には役に立たず、どうやらもう必要ないようです。

以下にあなたがする必要があることをまとめました。詳細については、上記の投稿をご覧ください。

  1. サーバーに BusyBoxとDropbearをインストールする

    sudo apt-get install dropbear busybox
    
  2. サーバー上のinitramfsを更新します

    sudo update-initramfs -u
    
  3. dropbearによって生成された秘密キーをクライアントマシンにコピーします。これを行うには、これを新しいディレクトリにコピーし、所有権を変更する必要があります。あなたの上のサーバー、次の操作を行います。

    sudo cp /etc/initramfs-tools/root/.ssh/id_rsa ~/.
    sudo chown user:user ~/id_rsa
    

    userをユーザー名に置き換えることを忘れないでください。パスワードによるログインは機能していないようです。

  4. これで、クライアントで次を呼び出してscpで秘密鍵を転送できます

    scp user@remote.server:~/id_rsa ~/.ssh/id_rsa_dropbear
    
  5. 簡単にログインできるように、クライアントの〜/ .ssh / configファイルを設定します。テキストエディタで開き、次を追加します。

    Host myremoteserver
        HostName my.remote.server
        User root
        UserKnownHostsFile ~/.ssh/known_hosts.initramfs
        IdentityFile ~/.ssh/id_rsa_dropbear
    

    ホストを任意の名前に変更し、HostNameをサーバーの名前に変更します。ユーザーをrootにします。Dropbearで唯一受け入れられているユーザーのようです。ファイルを保存して閉じます。

  6. サーバーを再起動し、パスフレーズのプロンプトを待ちます。インターネット接続を検出して設定するために、Dropbearに数秒を与えます。クライアントで次のコマンドを使用してサーバーに接続します。

    ssh myremoteserver # or any name you chose
    
  7. ログインしたら、サーバーで次のコマンドを発行します。詳細については、ブログの投稿を参照してください。

    pid=`ps | grep "/scripts/local-top/cryptroot" | cut -d " " -f 3`
    kill -9 $pid
    sleep 35
    /scripts/local-top/cryptroot
    pid=`ps | grep "/bin/sh" | cut -d " " -f 3`
    kill -9 $pid;
    

    パスフレーズを入力するまでに時間がかかります(30秒)。プロンプトが表示されたら入力します。

  8. 入力して接続を閉じます

    exit
    
  9. これで、サーバーは暗号化されたハードドライブのロックを解除し、通常どおり起動するはずです。

(ブログ投稿の原作者に多大な感謝を!)


2
秘密鍵を使って移動する理由がよくわかりません。クライアントマシン上の公開鍵をルートサーバーの認証キーとしてサーバーにコピーするだけで十分でしょうか?
gertvdijk

クライアントマシンでキーペアを作成し、そこから公開キーのみをサーバーに移動することは可能だと確信していますが、正しく思い出せば、BusyBoxが受け入れる形式を見つけるのに問題があると思います。そのため、サーバー上にすでに存在するキーを再利用することが、私が働いた唯一のオプションでした。
ドラッグ

1
これをArch Linuxで動作させるにはどうすればいいですか?
Gerharddc

1
@Gerhman ArchLinux での初期sshサポートについては、AURのdropbear_initrd_encryptパッケージをご覧ください。
カレブ

1
@Gerhman archwikiページ:ルートまたは他のパーティションのリモートロック解除まだ実行していませんが、面白そうです。それをチェックアウトする必要があります:)
hanetzer

18

私が思うに、早期-sshはあなたが探しているものを提供しています。

Early-ssh is a simple initramfs hook, which installs Dropbear SSH server into  
your initramfs, and starts it at boottime, so you will be able to do a lot of  
things remotely over SSH, before your root partition gets mounted, for example:

* unlocking LUKS encrypted crypto devices - 
  even your root can be an encrypted filesystem
* assembling/altering RAID arrays (mdadm)
* checking the root filesystem in read-write mode, 
  taking action in case of errors
* and so on...

すでに.debパッケージが利用可能であるため、おそらくUbuntuで問題ありません。


これはまさに私が探しているもののようです、ありがとう!
hpy

3
良いチュートリアルやハウツーへのリンクはありますか?debian squeeze boxでEarly-SSHを使用しています。

1
はい、チュートリアルは素晴らしいでしょう。
hpy


16

/usr/share/doc/cryptsetup/README.remote.gz(Ubuntuパッケージcryptsetup)のcryptsetup readmeをご覧ください。これを達成するための完全なガイドがあります。draglyの答えに似ていますが、これはもう少しエレガントだと思います。(Dropbear形式のキー、脆弱なシェルスクリプトではなくFIFOを介してパスフレーズを渡すなど)

initramfsでのsshログインによるrootfsのロック解除

initramfsがマウントされた状態で実行中に、sshを使用してブートシステムにログインすることにより、リモートからのブートアップ時にrootfsのロックを解除できます。

セットアップ

リモートロック解除が機能するには、initramfsをビルドする前に次のパッケージをインストールする必要があります。 dropbear busybox

このファイルに/etc/initramfs-tools/initramfs.confは、initramfsの構築時に使用される構成オプションが含まれています。これは、含まれている必要がありますBUSYBOX=y のinitramfsにインストールbusyboxのを持っている(busyboxのパッケージがインストールされている場合、これがデフォルトとして設定されている)、および含有すべきではない DROPBEAR=nのinitramfsににdropbearのインストールを無効と思われます。に設定するとDROPBEAR=y、いずれの場合でもdropbearがインストールされます。DROPBEAR設定されていない場合 、dropbearは既存のcryptrootセットアップの場合にのみインストールされます。

initramfsに使用されるホストキーはdropbear_dss_host_keyおよび です。dropbear_rsa_host_key両方ともにあり/etc/initramfs-tools/etc/dropbear/ます。initramfsのコンパイル時に存在しない場合は、自動的に作成されます。手動で作成するコマンドは次のとおりです。

dropbearkey -t dss -f /etc/initramfs-tools/etc/dropbear/dropbear_dss_host_key
dropbearkey -t rsa -f /etc/initramfs-tools/etc/dropbear/dropbear_rsa_host_key

initramfsは暗号化されないため、公開鍵認証が想定されます。そのために使用されるキーはから取得され /etc/initramfs-tools/root/.ssh/authorized_keysます。initramfsのコンパイル時にこのファイルが存在しない場合は、作成 /etc/initramfs-tools/root/.ssh/id_rsa.pubされて追加されます。後者のファイルも存在しない場合は、自動的に生成されます-後でinitramfsにログインする必要がある/etc/initramfs-tools/root/.ssh/id_rsa (またはid_rsa.dropbeardropbear形式で必要な場合)一致する秘密キーが見つかります。以下は、それぞれの手順を手動で実行するコマンドです。

キーを作成するには(dropbear形式):

dropbearkey -t rsa -f /etc/initramfs-tools/root/.ssh/id_rsa.dropbear

キーをdropbear形式からopenssh形式に変換するには:

/usr/lib/dropbear/dropbearconvert dropbear openssh \
    /etc/initramfs-tools/root/.ssh/id_rsa.dropbear \
    /etc/initramfs-tools/root/.ssh/id_rsa

公開鍵を抽出するには:

dropbearkey -y -f /etc/initramfs-tools/root/.ssh/id_rsa.dropbear | \
    grep "^ssh-rsa " > /etc/initramfs-tools/root/.ssh/id_rsa.pub

authorized_keysファイルに公開鍵を追加するには:

cat /etc/initramfs-tools/root/.ssh/id_rsa.pub >> /etc/initramfs-tools/root/.ssh/authorized_keys

dhcpを使用して一部のインターフェイスを設定DEVICE=する/etc/initramfs-tools/initramfs.conf場合は、設定 で十分です。initramfsはip=カーネルパラメーターも尊重する必要があります。grubを使用する場合は、おそらく/boot/grub/menu.lst' # kopt='行で設定するか、特定の ' kernel'行に追加することをお勧めします。ip=カーネルパラメータがで文書化されているDocumentation/nfsroot.txtカーネルのソースツリーに。

課題

update-initramfs設定を変更したときに実行することを忘れないでください!

sshデーモンの十分なエントロピーを収集することが問題になる場合があります。十分なエントロピーが取得されるまで、sshデーモンの起動が遅れる場合があります。これは、起動プロセスに対して非ブロッキングであるため、コンソールにいるときは、sshdが起動を完了するのを待つ必要はありません。

ロック解除手順

リモートからロックを解除するには、次のようなことができます。

ssh -o "UserKnownHostsFile=~/.ssh/known_hosts.initramfs" \
    -i "~/id_rsa.initramfs" root@initramfshost.example.com \
    "echo -ne \"secret\" >/lib/cryptsetup/passfifo"

この例では、暗号ルートシステムのホストキーを保持する追加known_hostsファイル " ~/.ssh/known_hosts.initramfs"、暗号ルートシステムの~/id_rsa.initramfs認証キーを保持するファイル " "、暗号ルートシステムの名前が " initramfshost.example.com"、およびcryptrootパスフレーズは「secret」です

-< debian@x.ray.net>、水、2009年9月30日

別のチャンネルでこれを指摘してくれたjapに感謝します。


1
これは、ハック的なps-greppingよりもはるかに優れたアイデアのようです(公式ドキュメントなどに記載されています)。ただし、提供されるロック解除手順に関する補足事項として、コマンドラインにパスフレーズを直接入力することには注意が必要な場合があります。可能な解決策は、を使用してパスフレーズの入力を求める小さなラッパースクリプトを作成することread -s -pです。
ジョエルペット

1
Ubuntuの最近のバージョンにはそのアプローチに問題があることに注意してください。すなわち、bugs.launchpad.net / ubuntu / + source / cryptsetup / + bug / 595648
Frederick Nord

6

リモートだけでなく無人で起動できるようにしたい場合は、Mandos(私と他の人が書いた)も見る必要があります。

Mandosは、暗号化されたルートファイルシステムを備えたサーバーが無人および/またはリモートで再起動できるようにするシステムです。FAQリストを含む詳細については、イントロマニュアルページファイルを参照してください。

つまり、ブートサーバーはネットワーク経由で安全な方法でパスワードを取得します。詳細については、READMEを参照してください。


あなたの貢献をありがとう、しかし、あなたの投稿は、ほぼ同一であることの100%があなたの製品の言及ことに注意することである境界線の行動、そしてあなたが検討されているのリスクを実行スパムを Mandosはフリーソフトウェアではなかった場合には(私はあなたの記事をフラグを立てていると思いますまたは、他のサイトにマンドス以外の投稿の履歴がなかった場合)。
ジル 'SO-悪である停止

@Gilles:完了です。
テディ

2

ヘッドレスサーバー?シリアルポートがある場合は、それを使用します。

GRUBは、シリアルポートで動作するように構成できます。カーネルは、シリアルポートを使用して初期ブートメッセージを出力し、パスワードを入力してドライブのロックを解除し、ログインするように構成することもできます(サーバーがシリアルBIOSをサポートしている場合は、それも有効にします。接続する必要はありません。マシンへのモニター)。

常に、ヘッドレスサーバーに接続する「ネットワーク以外」の方法を用意することをお勧めします。


素晴らしい点!ただし、ヘッドレスサーバーに接続する「非ネットワーク」の方法は、クライアント/サーバー間の物理的な近接性が近い場合にのみのみ)関連します。シリアル接続の他の可能性/機能を見落とさない限り。
ILMostro_7


2

残念ながら、上記の答えはどれもうまくいきませんでした。さらに、サーバーから秘密鍵をコピーすることは逆説的です。

とにかく、次の指示がうまくいきました:

クライアント経由で暗号化パーティションを接続およびロック解除して、サーバーを起動します

必須パッケージをインストールする(サーバー上)

apt-get install dropbear initramfs-tools busybox

希望する公開鍵をサーバーのauthorized_keysファイルに追加します

公開鍵をコピーし/etc/dropbear-initramfs/authorized_keysてSERVERに貼り付けるだけです

ロック解除スクリプトを作成する

次のスクリプトを作成します /etc/initramfs-tools/hooks/crypt_unlock.sh

#!/bin/sh

PREREQ="dropbear"

prereqs() {
  echo "$PREREQ"
}

case "$1" in
  prereqs)
    prereqs
    exit 0
  ;;
esac

. "${CONFDIR}/initramfs.conf"
. /usr/share/initramfs-tools/hook-functions

if [ "${DROPBEAR}" != "n" ] && [ -r "/etc/crypttab" ] ; then
cat > "${DESTDIR}/bin/unlock" << EOF
#!/bin/sh
if PATH=/lib/unlock:/bin:/sbin /scripts/local-top/cryptroot; then
kill \`ps | grep cryptroot | grep -v "grep" | awk '{print \$1}'\`
# following line kill the remote shell right after the passphrase has
# been entered.
kill -9 \`ps | grep "\-sh" | grep -v "grep" | awk '{print \$1}'\`
exit 0
fi
exit 1
EOF

  chmod 755 "${DESTDIR}/bin/unlock"

  mkdir -p "${DESTDIR}/lib/unlock"
cat > "${DESTDIR}/lib/unlock/plymouth" << EOF
#!/bin/sh
[ "\$1" == "--ping" ] && exit 1
/bin/plymouth "\$@"
EOF

  chmod 755 "${DESTDIR}/lib/unlock/plymouth"

  echo To unlock root-partition run "unlock" >> ${DESTDIR}/etc/motd

fi

実行可能にする:

chmod +x /etc/initramfs-tools/hooks/crypt_unlock.sh

静的IPを作成します(またはこのステップをスキップしてDHCPを使用します)

編集/etc/initramfs-tools/initramfs.confして行を追加(または変更)します。

#format [host ip]::[gateway ip]:[netmask]:[hostname]:[device]:[autoconf]
#([hostname] can be omitted)
IP=192.168.1.254::192.168.1.1:255.255.255.0::eth0:off

initialramfsを更新する

update-initramfs -u

起動時にdropbearサービスを無効にして、パーティションが復号化された後にopensshが使用されるようにします

sudo update-rc.d dropbear disable

テスト中

  • サーバーを再起動します
  • 経由でサーバーに接続します ssh root@192.168.1.254 [-i ~/.ssh/id_rsa]

2

Debian 9(安定版)では、このソリューションは時代遅れでした。インストール中に、に関する警告が表示さdropbear: WARNING: Invalid authorized_keys file, remote unlocking of cryptroot via SSH won't work!れ、必要なキーが見つかりませんでした。この方法は本当に簡単で、素晴らしい#debianチャンネルで説明されました(ありがとうございました):

まずことを確認してbusyboxdropbearおよびdropbear-initramfsインストールされています

sudo apt install busybox dropbear*

次に~/.ssh/id_rsa.pub、ファイルに公開鍵(ほとんどの場合)を追加します/etc/dropbear-initramfs/authorized_keys

次にinitramfs、変更を考慮して更新します。:update-initramfs -u

それで全部です!

あなたが間のキーの間の衝突持つことがないようにしたい場合は、注意してくださいdropbearとのopenssh(彼らは同じIPアドレスを共有するが、異なるキーを使用)、あなたがあなたのクライアントに配置することをお勧めします~/.ssh/configそのような何か:

Host myserver_luks_unlock
     User root
     Hostname <myserver>
     # The next line is useful to avoid ssh conflict with IP
     HostKeyAlias <myserver>_luks_unlock
     Port 22
     PreferredAuthentications publickey
     IdentityFile ~/.ssh/id_rsa

次に、以下を使用して接続します。

ssh myserver_luks_unlock

プロンプトが表示されたら、busyboxプロンプトの提案に従って入力します。

cryptroot-unlock

パスワードを入力します。

楽しい!



0

私はこのページで他の人が説明した手法(IPネットワークを構成するカーネルパラメーターを持つinitramfsのSSH )を使用して、ヘッドレスUbuntu Linuxサーバー(12.02、14.04、16.04、18.04)をリモートでロック解除しています。

私は実際にロック解除を行うPythonプログラム(unlock-remote-system)を開発することさえしました。これを行うプロセスは手動で少しもろく感じ、サーバーの再起動を恐れ始めたので、精神で「それが自動化する価値がある場合」Pythonで知識をエンコードしました(これにより、セキュリティ更新プログラムを適用するための定期的な再起動が実際にはるかに簡単になりました)。

それ以来、リモートルートディスク暗号化に関する個人的なメモを世界中の人と共有することにしました。リンクされたページには、手順に関するかなりの詳細が含まれており(ここでは言及されていないヒントもあります)、最新の状態に保つつもりです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.