헤드리스 서버 부팅 중에 암호화 된 LVM을 해독하는 SSH?


59

Ubuntu 10.04 및 현재 10.10을 설치할 때 하드 드라이브에 "암호화 된 LVM"을 활성화하는 옵션이 제공되었습니다. 이 옵션을 선택한 후 부팅 중에 LVM을 해독하기 위해 암호를 입력하라는 메시지가 표시됩니다.

이제 Linux를 실행하는 헤드리스 서버 (우분투는 아님)를 설정하려고합니다. 그러나 서버가 헤드리스이므로 시작하는 동안 서버를 해독 할 수 없을지 걱정됩니다. 부팅하는 동안 SSH를 사용하여 암호화 된 LVM의 비밀번호를 입력 할 수 있습니까? 그렇다면 어떻게 설정합니까? 아니면 다른 해결책이 있습니까? 이 질문은 우분투에만 국한되지 않습니다. 감사.


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

@Nate의 대답은 받아 들여야한다고 생각합니다. 실제로 링크 된 블로그의 변경 사항을 반영하려면 편집이 필요하기 때문에 개인 키 대신 공개 키를 사용 합니다.
Jonathan Y.

답변:


25

14.04와 같은 최신 버전의 우분투의 경우 @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 구성에 항목 추가

    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의 개인 키를 계속 복사하더라도 완전히 무시할 수 있습니다. 나머지 지침을 따르면 저에게 효과적입니다. 즉, 공개 키 만 사용하기 때문에 이것이 수락 된 대답이어야합니다 (변경 사항을 반영하면).
Jonathan 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
    

    사용자를 사용자 이름으로 바꾸십시오. 비밀번호 로그인이 작동하지 않는 것 같습니다.

  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을 서버 이름으로 변경하십시오. 사용자를 루트로 둡니다. 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가 허용하는 형식을 찾는 데 문제가 있다고 생각합니다. 그래서 이미 서버에 있던 키를 재사용하는 것이 내가 일한 유일한 옵션이었습니다.
dragly December

1
Arch Linux 에서이 작업을 수행하기 위해 무엇을 해야하는지 알고 있습니까?
Gerharddc

1
@Gerhman Archlinux에서 조기 지원을 위해 AUR 의 dropbear_initrd_encrypt 패키지를 확인하십시오 .
Caleb

1
@Gerhman archwiki 페이지 : 루트 나 다른 파티션의 원격 잠금 해제 아직 완료하지 않았지만 흥미로워 보입니다. 그것을 확인해야합니다 :)
hanetzer

18

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를 사용하는 것이 좋습니다.


이것이 바로 내가 찾고있는 것 같습니다. 감사합니다!
hpy

3
좋은 튜토리얼이나 하우투에 대한 링크가 있습니까? 데비안 스퀴즈 박스에 일찍 ssh가 붙어 있습니다.

1
예, 튜토리얼이 좋을 것입니다.
hpy


16

/usr/share/doc/cryptsetup/README.remote.gz(Ubuntu package cryptsetup) 에서 cryptsetup readme를 살펴보십시오 . 이것을 달성하기위한 완전한 가이드가 있습니다. 그것은 dragly의 답변 과 비슷 하지만 조금 더 우아하다고 생각합니다. (Dropbear 형식의 키, 취약한 쉘 스크립트가 아닌 FIFO를 통해 암호문을 전달합니다.)

initramfs에서 SSH 로그인을 통해 rootfs 잠금 해제

initramfs가 마운트 된 상태에서 ssh를 사용하여 부팅 시스템에 로그인하여 원격으로 부팅 할 때 rootfs의 잠금을 해제 할 수 있습니다.

설정

원격 잠금 해제가 작동하려면 initramfs를 빌드하기 전에 다음 패키지를 설치해야합니다. dropbear busybox

파일 /etc/initramfs-tools/initramfs.conf은 initramfs를 빌드 할 때 사용되는 구성 옵션을 보유합니다. 그것은 포함해야 BUSYBOX=y 다시 initramfs에 설치 비지 박스를 가지고합니다 (비지 박스 패키지가 설치 될 때이 기본으로 설정)을 포함 할 수 없습니다 DROPBEAR=n다시 initramfs에 Dropbreak 내부의 설치를 해제 것이다. 로 설정하면 DROPBEAR=ydropbear가 설치됩니다. 경우 DROPBEAR전혀 설정되어 있지 않은 경우, Dropbreak 내부는 기존 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추가됩니다. 후자의 파일도 존재하지 않으면 파일이 자동으로 생성됩니다. 일치하는 개인 키는 나중에 initramfs에 로그인해야합니다 /etc/initramfs-tools/root/.ssh/id_rsa (또는 id_rsa.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" root@initramfshost.example.com \
    "echo -ne \"secret\" >/lib/cryptsetup/passfifo"

이 예에서는 cryptroot 시스템의 호스트 키를 보유 하는 추가 known_hosts파일 " ~/.ssh/known_hosts.initramfs", cryptroot 시스템의 ~/id_rsa.initramfs인증 된 키를 보유하는 " " 파일 , cryptroot 시스템의 이름이 " initramfshost.example.com", cryptroot 암호 문구는 " secret"입니다

-< debian@x.ray.net>, Wed, 2009 년 9 월 30 일

이것을 다른 채널 에서 알려준 jap 에게 감사드립니다 .


1
이것은 hackish ps-grepping보다 훨씬 더 좋은 아이디어 (공식 문서 및 모든 내용에 설명되어 있음)처럼 보입니다. 그러나 제공되는 잠금 해제 절차에 대한 참고로, 암호문이 쉘 어딘가 파일에있을 수 있으므로 명령 행에 직접 암호를 입력하는 것에주의해야 할 수 있습니다. 가능한 해결책은을 사용하여 암호 문구를 묻는 작은 래퍼 스크립트를 만드는 것 read -s -p입니다.
joelpet

1
최근 우분투 버전에서는 그 접근 방식에 문제가 있습니다. 즉 bugs.launchpad.net/ubuntu/+source/cryptsetup/+bug/595648
Frederick Nord

6

원격으로뿐만 아니라 무인 으로 부팅 하려면 Mandos (나와 다른 사람들이 작성한) 도 살펴 봐야합니다 .

Mandos는 암호화 된 루트 파일 시스템이있는 서버를 무인 및 / 또는 원격으로 재부팅 할 수있는 시스템입니다. FAQ 목록을 포함한 자세한 내용 은 소개 매뉴얼 페이지 파일을 참조하십시오.

즉, 부팅 서버는 네트워크를 통해 안전한 방식으로 암호를 얻습니다. 자세한 내용은 README를 참조하십시오.


귀하의 기여에 감사드립니다. 귀하의 게시물에 대해 거의 동일하게 언급 한 게시물의 100 %는 경계선 동작 이며 스팸 으로 간주 될 위험이 있습니다 (Mandos가 무료 소프트웨어가 아닌 경우 게시물에 플래그를 표시했습니다) 또는 다른 사이트에서 Mandos 이외의 게시물에 대한 기록이없는 경우).
Gilles

@Gilles : 이제 끝났습니다.
Teddy

2

헤드리스 서버? 직렬 포트가 있으면 사용하십시오.

GRUB은 직렬 포트를 통해 작동하도록 구성 할 수 있습니다. 커널은 초기 부팅 메시지 출력, 드라이브 잠금 해제를위한 암호 입력 및 로그인을 위해 직렬 포트를 사용하도록 구성 할 수도 있습니다. (서버가 직렬 BIOS를 지원하는 경우이를 활성화하십시오. 기계에 대한 모니터).

헤드리스 서버에 "네트워크가 아닌"방법을 사용하는 것이 좋습니다.


좋은 지적입니다! 비록, " 비 네트워크 머리가없는 서버에서지고의"방법은 대부분 (있는 경우에만 클라이언트 / 서버 사이의 물리적 근접성이 가까운 경우) 관련; 직렬 연결의 다른 가능성 / 기능을 간과하지 않는 한.
ILMostro_7


2

불행히도 위의 답변 중 어느 것도 나를 위해 일하지 않았습니다. 또한 서버에서 개인 키를 복사하는 것은 역설적 인 것처럼 보입니다.

어쨌든 다음 지침이 해결되었습니다.

CLIENT를 통해 암호화 된 파티션을 연결 및 잠금 해제하여 서버를 부팅하십시오.

SERVER에 필수 패키지 설치

apt-get install dropbear initramfs-tools busybox

원하는 공개 키를 SERVER의 certified_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 (stable) 에서이 솔루션은 구식이었습니다. 설치하는 동안에 대한 경고가 표시되고 dropbear: WARNING: Invalid authorized_keys file, remote unlocking of cryptroot via SSH won't work!필요한 키를 찾을 수 없습니다. 이 방법은 정말 간단하며 훌륭한 #debian 채널에서 다시 설명했습니다 (다시 감사드립니다).

먼저 있는지 확인 busybox, dropbeardropbear-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헤드리스 Ubuntu Linux 서버 (12.02, 14.04, 16.04 및 18.04)를 원격으로 잠금 해제하기 위해이 페이지의 다른 사람들이 설명 한 기술 (커널 을 구성하기 위해 커널 매개 변수가 있는 initramfs의 SSH )을 꽤 오랫동안 사용해 왔습니다.

나는 심지어 실제로 잠금 해제를 수행 하는 Python 프로그램 ( unlock-remote-system ) 을 개발하기까지 갔다 . 왜냐하면 수동으로 수행하는 과정이 약간 깨지기 쉽고 서버 재부팅을 두려워하기 시작했기 때문이다. "그것이 자동화 할 가치가 있다면"파이썬으로 내 지식을 인코딩했습니다 (실제로 보안 업데이트를 적용하기 위해 정기적으로 재부팅하는 것이 훨씬 쉬워졌습니다).

그 이후로 나는 원격 루트 디스크 암호화 에 대한 개인 메모를 세계와 공유하기로 결정했습니다 . 링크 된 페이지에는 절차에 대한 세부 정보 (여기에 언급되지 않은 힌트)가 포함되어 있으며 최신 상태로 유지하려고합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.