web-dev-qa-db-ja.com

SSHは、ヘッドレスサーバーの起動中に暗号化されたLVMを復号化しますか?

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

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

62
hpy

14.04など、ubuntuの新しいバージョンの場合、@ draglyと this blogposts ' の組み合わせが非常に役立つことがわかりました。言い換えると:

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

    Sudo apt-get install dropbear
    
  2. (サーバー上)rootの公開/秘密鍵ログインのコピーとアクセス許可の割り当て

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

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

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

    scp [email protected]:~/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. (サーバー上)作成 このファイル at /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アドレスを使用してサーバーを構成する方法が必要な場合は、上記にリンクされているブログ投稿を確認してください。

26
nsg

BusyBoxとDropbearでこのような設定を行うためのガイドは このブログ投稿 に示されています。アーリーsshは私にとっては機能せず、どうやらもう必要ないようです。

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

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

    Sudo apt-get install dropbear busybox
    
  2. サーバーでinitramfsを更新します

    Sudo update-initramfs -u
    
  3. Dropbearによって生成された秘密鍵をクライアントマシンにコピーします。これを新しいディレクトリにコピーして所有権を変更しなければならない場合があります。 serverで次の手順を実行します。

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

    Userを自分のユーザー名に置き換えてください。パスワードのログインが機能していないようです。

  4. これで、clientで以下を呼び出すことにより、scpで秘密鍵を転送できます。

    scp [email protected]:~/id_rsa ~/.ssh/id_rsa_dropbear
    
  5. clientの〜/ .ssh/configファイルを設定して、簡単にログインできるようにします。テキストエディタで開き、以下を追加します。

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

    Hostを任意の名前に変更し、HostNameをサーバーの名前に変更します。ユーザーをrootにします。 Dropbearで承認されている唯一のユーザーのようです。ファイルを保存して閉じます。

  6. serverを再起動し、パスフレーズのプロンプトを待ちます。 Dropbearがインターネット接続を検出してセットアップするまで数秒かかります。 clientで次のコマンドを使用してサーバーに接続します。

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

    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. これでサーバーは暗号化されたハードドライブのロックを解除し、通常どおりに起動するはずです。

(ブログ投稿の元の著者に大きな感謝を!)

23
dragly

私は early-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で問題ないでしょう。

18
wag

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

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

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

セットアップ

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

ファイル/etc/initramfs-tools/initramfs.confには、initramfsのビルド時に使用される構成オプションが含まれています。 initramfsにbusyboxをインストールするためには、BUSYBOX=y(busyboxパッケージのインストール時にデフォルトとして設定されます)を含める必要があります。また、initramfsへのdropbearのインストールを無効にするDROPBEAR=nを含めないでください。 DROPBEAR=yに設定すると、dropbearはどのような場合でもインストールされます。 DROPBEARがまったく設定されていない場合、dropbearは既存のcryptrootセットアップの場合にのみインストールされます。

Initramfsに使用されるホストキーはdropbear_dss_Host_keydropbear_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が追加されます。後者のファイルも存在しない場合は、自動的に生成されます。一致する秘密鍵は、後で/etc/initramfs-tools/root/.ssh/id_rsa(またはid_rsa.dropbear)でinitramfsにログインする必要があります。 dropbear形式で必要です)。以下は、それぞれの手順を手動で実行するコマンドです。

キーを作成するには(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" [email protected] \
    "echo -ne \"secret\" >/lib/cryptsetup/passfifo"

この例では、cryptrootシステムのホストキーを保持する追加のknown_hostsファイル "~/.ssh/known_hosts.initramfs"があり、ファイルの承認済みキーを保持するファイル "~/id_rsa.initramfs"があることを前提としています。 cryptrootシステム、cryptrootシステムの名前は「initramfshost.example.com」、cryptrootパスフレーズは「secret

-<[email protected]>、水曜日、2009年9月30日

jap のおかげで、これを別のチャネルで私に指摘してくれました。

16
gertvdijk

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

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

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

6
Teddy

ヘッドレスサーバー?シリアルポートがある場合は使用してください。

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

ヘッドレスサーバーにアクセスするための「非ネットワーク」方法を持つことは常に良い考えです。

2
LawrenceC

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

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

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

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

apt-get install dropbear initramfs-tools busybox

必要な公開鍵をサーバーのauthorized_keysファイルに追加します

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

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

/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 [email protected] [-i ~/.ssh/id_rsa]経由でサーバーに接続します
2
ceremcem

Arch LinuxにはAURパッケージ dropbear_initrd_encrypt があり、そのまま使用できます。有線インターフェースでかなりうまく機能します。ワイヤレスのために少しハックしなければならなかった。

2
user3188445

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

それで全部です!

注:dropbearopensshの間のキーの衝突を避けたい場合(同じ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

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

楽しい!

2
tobiasBora

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

私は実際に私のためにロック解除を行うPythonプログラム( nlock-remote-system )を開発することさえしました。少し壊れやすいので、サーバーを再起動するのを怖がり始めたので、「それが害を及ぼす場合は自動化する価値がある」という精神で、知識をPython ????セキュリティ更新プログラムを適用するための定期的な再起動がはるかに簡単になりました)。

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

1
xolox

私はあなたのためにこれを行うAnsibleロールを書きました。ロール debops-contrib.dropbear_initramfs を取得して実行するだけです。詳細は ロールのドキュメント を参照してください。

0
ypid