SSH untuk mendekripsi LVM terenkripsi selama boot server tanpa kepala?


59

Ketika saya menginstal Ubuntu 10,04 dan, sekarang, 10,10, saya ditawari opsi untuk mengaktifkan "LVM terenkripsi" untuk hard drive saya. Setelah memilih opsi itu, saya diminta kata sandi saya saat boot untuk mendekripsi LVM.

Sekarang, saya berpikir untuk membuat server tanpa kepala yang menjalankan Linux (belum tentu Ubuntu), tetapi saya khawatir karena server itu tanpa kepala saya tidak akan bisa mendekripsi saat startup. Apakah saya bisa masuk SSH saat boot untuk memasukkan kata sandi saya untuk LVM terenkripsi? Jika demikian, bagaimana cara mengaturnya? Atau ada solusi lain? Sekali lagi pertanyaan ini BUKAN spesifik untuk Ubuntu. Terima kasih.


4
Lihat juga:zless /usr/share/doc/cryptsetup/README.remote.gz
0xC0000022L

Saya pikir jawaban @Nate harus jawaban yang diterima: itu (pada dasarnya, karena pengeditan diperlukan untuk mencerminkan perubahan dalam blog yang ditautkan) menggunakan kunci publik di seluruh alih-alih yang pribadi .
Jonathan Y.

Jawaban:


25

Untuk versi ubuntu yang lebih baru, misalnya, 14,04, saya menemukan kombinasi @dragly dan jawaban blogpost ini sangat membantu. Mengutip:

  1. (Di server) Instal Dropbear

    sudo apt-get install dropbear
    
  2. (Di server) Salin dan tetapkan izin untuk login root publik / kunci privat

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

ingatlah untuk mengubah pengguna menjadi nama pengguna Anda di server

  1. (Pada klien) Ambil kunci pribadi dari server

    scp user@remote.server:~/id_rsa ~/.ssh/id_rsa_dropbear
    
  2. (Pada klien) Tambahkan entri ke 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. (Di server) Buat file ini di/etc/initramfs-tools/hooks/crypt_unlock.sh

  4. (Di server) Jadikan file itu dapat dieksekusi

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

    sudo update-initramfs -u
    
  6. Nonaktifkan layanan dropbear saat boot sehingga openssh digunakan setelah partisi didekripsi

    sudo update-rc.d dropbear disable
    

Kamu sudah selesai. Cobalah. Periksa posting blog yang ditautkan ke atas untuk instruksi tentang cara mengkonfigurasi server dengan alamat IP statis jika itu adalah sesuatu yang perlu Anda lakukan.


Blog yang ditautkan telah menambahkan referensi untuk menambahkan kunci publik klien ke server /etc/initramfs-tools/root/.ssh/authorized_keys, bahkan jika itu masih melalui menyalin kunci pribadi Dropbear, yang orang dapat abaikan sepenuhnya. Mengikuti petunjuk lainnya bekerja untuk saya, yang berarti ini harus menjadi jawaban yang diterima (setelah itu mencerminkan perubahan itu), karena hanya menggunakan kunci publik.
Jonathan Y.

23

Panduan untuk melakukan pengaturan seperti itu dengan BusyBox dan Dropbear ditampilkan di posting blog ini . ssh-awal tidak bekerja untuk saya dan tampaknya tidak diperlukan lagi.

Saya telah merangkum apa yang perlu Anda lakukan di berikut ini. Untuk lebih jelasnya, lihat posting di atas:

  1. Instal BusyBox dan Dropbear di server Anda

    sudo apt-get install dropbear busybox
    
  2. Perbarui initramfs Anda di server

    sudo update-initramfs -u
    
  3. Salin kunci pribadi yang dihasilkan oleh dropbear ke mesin klien Anda. Anda mungkin harus menyalin ini ke dir baru dan mengubah kepemilikan untuk melakukan ini. Di server Anda lakukan hal berikut:

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

    Ingatlah untuk mengganti pengguna dengan nama pengguna Anda. Login kata sandi sepertinya tidak berfungsi.

  4. Sekarang Anda dapat mentransfer kunci pribadi dengan scp dengan memanggil yang berikut di klien Anda :

    scp user@remote.server:~/id_rsa ~/.ssh/id_rsa_dropbear
    
  5. Siapkan file ~ / .ssh / config klien Anda untuk login mudah. Buka dengan editor teks dan tambahkan berikut ini:

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

    Ubah Host menjadi apa pun yang Anda suka dan HostName menjadi nama server Anda. Biarkan pengguna menjadi root. Tampaknya menjadi satu-satunya pengguna yang diterima di Dropbear. Simpan dan tutup file.

  6. Mulai ulang server Anda dan tunggu konfirmasi frasa sandi. Berikan Dropbear beberapa detik untuk mendeteksi dan mengatur koneksi internetnya. Hubungkan ke server Anda dengan perintah berikut pada klien Anda :

    ssh myremoteserver # or any name you chose
    
  7. Saat masuk, terbitkan perintah berikut di server Anda . Lihat posting blog untuk detail:

    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;
    

    Diperlukan waktu (30 detik) sebelum Anda mengetikkan frasa sandi. Ketikkan ketika diminta.

  8. Tutup koneksi dengan mengetik

    exit
    
  9. Server Anda sekarang harus membuka kunci hard drive terenkripsi dan boot seperti biasa.

(Terima kasih banyak kepada penulis asli posting blog!)


2
Saya tidak begitu mengerti alasan untuk pindah dengan kunci pribadi. Seharusnya cukup untuk menyalin kunci publik Anda di mesin klien ke server sebagai kunci resmi untuk server root, kan?
gertvdijk

Saya yakin itu mungkin untuk membuat pasangan kunci pada mesin klien dan hanya memindahkan kunci publik dari sana ke server, tetapi jika saya ingat dengan benar saya pikir ada beberapa masalah menemukan format yang akan diterima BusyBox. Jadi menggunakan kembali kunci yang sudah ada di server adalah satu-satunya pilihan yang saya dapat.
dragly

1
Adakah yang harus saya lakukan agar Arch Linux berfungsi?
Gerharddc

1
@Gerhman Periksa paket dropbear_initrd_encrypt di AUR untuk dukungan awal-ssh di Archlinux.
Caleb

1
@Gerhman archwiki page: Membuka kunci secara remote dari root atau partisi lain Belum melakukannya, tetapi terlihat menarik.
Harus

18

Saya pikir early-ssh memberikan apa yang Anda cari:

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...

Sudah ada paket deb., Jadi Anda mungkin baik-baik saja dengan Ubuntu.


Sepertinya ini persis apa yang saya cari, terima kasih!
Hpy

3
Apakah Anda memiliki tautan ke tutorial yang bagus atau howto? Saya terjebak dengan ssh awal pada kotak pemeras debian saya.

1
Ya, tutorial akan sangat bagus.
Hpy


16

Lihat readme cryptsetup untuk ini dalam /usr/share/doc/cryptsetup/README.remote.gz(paket Ubuntu cryptsetup). Di sana ada panduan lengkap untuk mencapai hal ini. Ini mirip dengan jawaban dragly , tapi saya pikir ini sedikit lebih elegan. (Dropbear kunci yang diformat, melewati frasa sandi melalui FIFO daripada skrip shell yang rapuh, dll.)

membuka kunci rootfs melalui login ssh di initramfs

Anda dapat membuka kunci rootfs Anda saat bootup dari jarak jauh, menggunakan ssh untuk masuk ke sistem booting saat sedang berjalan dengan initramfs yang terpasang.

Mempersiapkan

Untuk membuka kunci jarak jauh agar berfungsi, paket-paket berikut harus diinstal sebelum membangun initramfs: dropbear busybox

File tersebut /etc/initramfs-tools/initramfs.confmenyimpan opsi konfigurasi yang digunakan saat membangun initramfs. Seharusnya berisi BUSYBOX=y (ini ditetapkan sebagai default ketika paket busybox diinstal) untuk memiliki busybox diinstal ke dalam initramfs, dan tidak boleh berisi DROPBEAR=n, yang akan menonaktifkan instalasi dropbear ke initramfs. Jika diatur ke DROPBEAR=y, dropbear akan dipasang dalam hal apa pun; jika DROPBEARtidak disetel sama sekali, maka dropbear hanya akan dipasang jika ada pengaturan cryptroot yang ada.

Kunci host yang digunakan untuk initramfs adalah dropbear_dss_host_keydan dropbear_rsa_host_key, keduanya terletak di /etc/initramfs-tools/etc/dropbear/. Jika mereka tidak ada ketika initramf dikompilasi, mereka akan dibuat secara otomatis. Berikut ini adalah perintah untuk membuatnya secara manual:

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

Karena initramfs tidak akan dienkripsi, otentikasi publickey diasumsikan. Kunci yang digunakan untuk itu akan diambil dari /etc/initramfs-tools/root/.ssh/authorized_keys. Jika file ini tidak ada ketika initramf dikompilasi, file itu akan dibuat dan /etc/initramfs-tools/root/.ssh/id_rsa.pubakan ditambahkan ke dalamnya. Jika file yang terakhir tidak ada, itu akan dihasilkan secara otomatis - Anda akan menemukan kunci privat yang cocok yang nantinya akan Anda butuhkan untuk masuk ke initramfs di bawah /etc/initramfs-tools/root/.ssh/id_rsa (atau id_rsa.dropbearjika Anda memerlukannya dalam format dropbear). Berikut ini adalah perintah untuk melakukan langkah masing-masing secara manual:

Untuk membuat kunci (dalam format dropbear):

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

Untuk mengonversi kunci dari format dropbear ke format openssh:

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

Untuk mengekstrak kunci publik:

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

Untuk menambahkan kunci publik ke file otor_keys:

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

Dalam kasus Anda ingin beberapa antarmuka untuk mendapatkan dikonfigurasi menggunakan dhcp, pengaturan DEVICE=di /etc/initramfs-tools/initramfs.confharus memadai. Initramfs juga harus menghormati ip=parameter kernel. Jika Anda menggunakan grub, Anda mungkin ingin mengaturnya /boot/grub/menu.lst, baik di baris ' # kopt=' atau ditambahkan ke kernelbaris ' ' tertentu . The ip=parameter kernel didokumentasikan dalam Documentation/nfsroot.txtdalam source kernel.

Masalah

Jangan lupa untuk menjalankan update-initramfsketika Anda mengubah konfigurasi untuk membuatnya efektif!

Mengumpulkan cukup entropi untuk daemon ssh terkadang tampaknya menjadi masalah. Startup ssh daemon mungkin tertunda sampai cukup banyak entropi telah diambil. Ini bukan pemblokiran untuk proses startup, jadi ketika Anda berada di konsol Anda tidak perlu menunggu sshd untuk menyelesaikan startupnya.

Prosedur membuka kunci

Untuk membuka kunci dari jarak jauh, Anda dapat melakukan sesuatu seperti ini:

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

Contoh ini mengasumsikan bahwa Anda memiliki known_hostsfile tambahan " ~/.ssh/known_hosts.initramfs" yang menyimpan kunci host sistem cryptroot, bahwa Anda memiliki file " ~/id_rsa.initramfs" yang memegang kunci-resmi untuk sistem cryptroot, bahwa nama sistem cryptroot adalah " initramfshost.example.com", dan bahwa frasa sandi cryptroot adalah " secret"

- < debian@x.ray.net>, Rab, 30 Sep 2009

Terima kasih kepada jap karena menunjukkan hal ini kepada saya di saluran yang berbeda.


1
Ini sepertinya ide yang jauh lebih baik (dijelaskan dalam dokumen resmi dan semuanya) daripada hackish ps-grepping. Sebagai catatan tambahan pada prosedur membuka kunci yang disediakan, orang mungkin ingin berhati-hati mengetik frasa sandi secara langsung pada baris perintah karena kemungkinan besar akan berakhir di file riwayat shell di suatu tempat. Solusi yang mungkin adalah membuat skrip pembungkus kecil yang meminta kata sandi digunakan read -s -p.
joelpet

1
perhatikan bahwa ada masalah dengan pendekatan itu dalam versi Ubuntu terbaru, yaitu bugs.launchpad.net/ubuntu/+source/cryptsetup/+bug/595648
Frederick Nord

6

Jika Anda ingin dapat mem-boot tanpa pengawasan dan juga dari jarak jauh, Anda juga harus melihat Mandos (yang saya dan orang lain telah tulis):

Mandos adalah sistem untuk memungkinkan server dengan sistem file root terenkripsi untuk reboot tanpa pengawasan dan / atau jarak jauh. Lihat file halaman manual intro untuk informasi lebih lanjut, termasuk daftar FAQ.

Singkatnya, server booting mendapatkan kata sandi melalui jaringan, dengan cara yang aman. Lihat README untuk detailnya.


Terima kasih atas kontribusi Anda, tetapi perhatikan bahwa 100% posting Anda yang hampir identik menyebutkan produk Anda adalah perilaku batas , dan Anda berisiko dianggap spam (saya akan menandai posting Anda jika Mandos bukan perangkat lunak bebas atau Anda tidak memiliki riwayat posting non-Mandos di situs lain).
Gilles 'SO- stop being evil'

@Gilles: Selesai sekarang.
Teddy

2

Server tanpa kepala? Jika memiliki port serial, gunakan itu.

GRUB dapat dikonfigurasi untuk berfungsi pada port serial. Kernel Anda juga dapat dikonfigurasikan menggunakan port serial untuk menghasilkan pesan-pesan boot awal, memasukkan kata sandi untuk membuka kunci drive Anda, dan masuk. (Jika server Anda mendukung BIOS serial, aktifkan juga. Maka Anda tidak akan pernah harus terhubung monitor ke mesin sama sekali).

Selalu merupakan ide bagus untuk memiliki cara "non-jaringan" untuk masuk ke server tanpa kepala.


Poin yang bagus! Padahal, cara " non-jaringan " untuk masuk ke server tanpa kepala sebagian besar ( hanya ) relevan jika kedekatan fisik antara klien / server dekat; kecuali saya mengabaikan beberapa kemungkinan / fitur koneksi Serial lainnya.
ILMostro_7


2

Sayangnya, tidak ada jawaban di atas yang berfungsi untuk saya. Selain itu, menyalin kunci pribadi dari server tampaknya paradoks.

Bagaimanapun, instruksi berikut berhasil:

Boot SERVER Anda dengan menghubungkan dan membuka kunci partisi yang dienkripsi melalui CLIENT Anda

Instal paket wajib (di SERVER)

apt-get install dropbear initramfs-tools busybox

Tambahkan kunci publik yang Anda inginkan ke file serahkan_keys SERVER

Cukup salin dan tempel kunci publik ke /etc/dropbear-initramfs/authorized_keysSERVER

Buat skrip pembuka kunci

Buat skrip berikut dalam /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

Jadikan itu dapat dieksekusi:

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

Buat IP statis (atau lewati langkah ini untuk menggunakan DHCP)

Edit /etc/initramfs-tools/initramfs.confuntuk menambahkan (atau mengubah) baris:

#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

Perbarui initialramfs

update-initramfs -u

Nonaktifkan layanan dropbear saat boot sehingga openssh digunakan setelah partisi didekripsi

sudo update-rc.d dropbear disable

Pengujian

  • Mulai ulang server Anda
  • Sambungkan ke server Anda melalui ssh root@192.168.1.254 [-i ~/.ssh/id_rsa]

2

Pada debian 9 (stabil), solusi ini sudah usang. Selama instalasi, saya mendapat peringatan tentang dropbear: WARNING: Invalid authorized_keys file, remote unlocking of cryptroot via SSH won't work!, dan saya tidak dapat menemukan kunci yang diperlukan. Metode ini sangat sederhana, dan dijelaskan kepada saya di saluran #debian yang hebat (terima kasih lagi):

Pertama pastikan itu busybox, dropbeardan dropbear-initramfssudah diinstal

sudo apt install busybox dropbear*

kemudian tambahkan kunci publik Anda (sebagian besar waktu ~/.ssh/id_rsa.pub) dalam file /etc/dropbear-initramfs/authorized_keys.

Perbarui kemudian initramfsuntuk memperhitungkan perubahan:: update-initramfs -u

Itu saja!

Catatan, jika Anda ingin menghindari bentrokan antara tombol di antara dropbeardan openssh(mereka berbagi ip yang sama, tetapi menggunakan kunci yang berbeda), Anda mungkin ingin memasukkan ~/.ssh/configsesuatu seperti itu pada klien Anda :

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

Kemudian, Anda cukup terhubung menggunakan:

ssh myserver_luks_unlock

dan begitu Anda mendapatkan prompt, ketik seperti yang disarankan oleh prompt busybox:

cryptroot-unlock

dan ketikkan kata sandi Anda.

Nikmati!



0

Saya telah menggunakan teknik yang dijelaskan oleh orang lain di halaman ini (SSH dalam initramfs dengan IPparameter kernel untuk mengkonfigurasi jaringan) selama beberapa tahun sekarang untuk membuka kunci server Linux Ubuntu tanpa kepala dari jarak jauh (12.02, 14.04, 16.04 dan 18.04).

Saya bahkan melangkah lebih jauh dengan mengembangkan program Python ( unlock-remote-system ) yang melakukan unlocking sebenarnya bagi saya, karena proses melakukan ini secara manual terasa agak rapuh dan saya mulai takut me-reboot server saya, jadi dengan semangat dari "jika sakit itu layak diotomatisasi" Saya menyandikan pengetahuan saya dengan Python 😇 (dan ini memang membuatnya lebih mudah untuk melakukan reboot secara teratur untuk menerapkan pembaruan keamanan).

Sejak itu saya memutuskan untuk juga membagikan catatan pribadi saya tentang enkripsi disket jarak jauh dengan dunia. Halaman yang tertaut berisi beberapa detail tentang prosedur ini (juga beberapa petunjuk yang tidak disebutkan di sini) dan saya bermaksud untuk memperbaruinya.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.