USB 키를 사용하여 Debian 8에서 Linux 루트 파티션의 비밀번호 없는 암호화
이 페이지에서
- 데비안 OS 설치
- 암호 없는 루트 파일 시스템 구성\n
- 결론
침입자가 민감한 정보를 훔칠 수 없도록 저장 장치(하드 디스크, 휴대용 메모리 스틱)의 중요 데이터 보안이 필요합니다. 이 자습서에서는 Linux 루트 파일 시스템 및 스왑 영역의 보안에 초점을 맞춥니다. 부팅 시 암호가 필요한 기본 Linux 암호화 기능 "LUKS"가 사용됩니다. 따라서 다음 목표는 부팅 시 암호화된 볼륨에 암호를 자동으로 제공하는 것입니다. 사용 가능한 데비안 배포판의 이전 릴리스에 대한 동일한 주제에 대한 몇 가지 기사가 이미 있습니다. 하지만 이 가이드에서는 Debain 8(Jessie) 버전이 VirtualBox VM에 설치됩니다.
데비안 OS 설치
이 자습서에서는 Debian Jessie가 VM에 설치되며 세부 정보는 다음 그림에 표시됩니다. 동일한 절차가 "실제" 서버나 데스크톱에서도 작동합니다.
VM에 Debian net installer iso 파일을 추가하고 VM을 시작하면 설치 프로그램 프롬프트가 나타납니다. 설치 프로세스를 시작하려면 "설치" 옵션을 선택하십시오.

다음 몇 개의 화면은 Debian의 기본 설정을 묻는 메시지를 표시합니다. 주어진 목록에서 원하는 언어 옵션을 선택하십시오.

다음 그림과 같이 국가 또는 지역을 선택합니다.

키보드의 언어를 구성합니다.

기본 설정 후 설치 프로그램은 구성을 위해 더 많은 구성 요소를 로드합니다.

다시 말하지만 설치 프로세스 중에 더 많은 기본 설정이 구성됩니다.
1. 호스트네임 설정

2. 도메인 이름 구성

3. "루트" 사용자의 암호를 설정합니다.


4. 루트가 아닌 새 사용자를 생성합니다.




5. 시간대 설정

6. 마지막으로 가장 중요한 부분은 디스크 파티션입니다.

이 도움말에서는 하드 디스크의 수동 파티션 나누기가 필요합니다. 따라서 위의 프롬프트에서 "수동" 옵션을 선택하고 원하는 하드 디스크를 선택하여 프로세스를 시작하십시오.

위의 그림과 같이 Debian이 VM에 설치됩니다. 아래에 표시된 선택된 하드 디스크의 분할을 시작하려면 Enter 키를 누르십시오.

위의 메시지를 수락하면 다음 화면이 나타납니다. 다음 스크린샷과 같이 현재 하드 디스크에 파티션이 없습니다.

가상 하드 디스크에 첫 번째 파티션을 생성하려면 "Enter"를 누르십시오.

하드 디스크에 생성한 첫 번째 파티션은 "/boot" 마운트 지점용 "/dev/sda1"입니다.

파티션에 대해 기본 또는 논리 유형이 선택되었습니다.

새 파티션의 위치가 선택됩니다.

마운트 지점 "/boot"는 다음 스크린샷에 표시됩니다.

첫 번째 파티션이 하드 디스크에 성공적으로 생성되었습니다. Linux 커널은 나중에 \/boot\ 파티션에 배치됩니다.

VM 하드 디스크에 생성된 두 번째 파티션은 스왑이며 스왑 파티션의 크기는 RAM 크기의 두 배가 되어야 합니다. 다음 스크린샷과 같이 나머지 여유 공간이 스왑을 위해 선택됩니다.

스왑 파티션의 크기를 설정합니다.

다음 스크린샷은 파티션이 스왑 영역으로 선택되었음을 보여줍니다.

다른 파티션도 VM에 생성됩니다.

Linux 플랫폼의 코어 파티션은 /의 나머지 공간("루트" 마운트 지점)에 생성됩니다. 다음 스냅샷은 \root\ 파티션의 크기를 보여줍니다.

하드 디스크의 새 파티션에 대해 "암호화의 물리적 볼륨" 옵션을 선택합니다.

다음 스크린샷에서 강조 표시된 옵션은 Linux 플랫폼에서 파티션을 암호화하는 데 필요합니다.

"암호화를 위한 물리적 볼륨"을 선택한 후의 파티션 설정은 다음 그림과 같습니다. 기본 암호화 방법은 device-mapper(dm-crypt)이고 암호화 알고리즘은 256 키 크기의 AES입니다.

가상 하드 디스크에 파티션이 성공적으로 생성된 것은 아래 그림과 같습니다.

다음 스크린샷에서 선택한 데비안에서 암호화된 볼륨의 고급 구성이 제공됩니다.

다음 프롬프트는 암호화된 볼륨의 구성을 시작하기 전에 현재 파티션 구성표가 하드 디스크에 기록되어야 함을 보여줍니다.

다음 프롬프트는 Debian 플랫폼에서 암호화된 볼륨 생성을 보여줍니다.

암호화된 볼륨에 대한 장치를 선택합니다. 부팅 파티션을 암호화할 수 없으므로 암호화된 볼륨에 대한 부팅 장치 "/dev/sda1"를 선택하지 마십시오.
다음 스크린샷에 표시된 것처럼 암호화된 볼륨에 대해 "/dev/sda3"만 선택되었으며 이것이 디스크의 루트 파티션입니다.

암호화된 볼륨을 구성한 후 완료를 선택하여 변경 사항을 적용합니다.

그러나 암호화된 볼륨에 대해 스왑 파티션이 선택되지 않은 경우 다음 오류 메시지가 표시됩니다.

따라서 암호화된 볼륨에 대해 두 파티션을 모두 선택합니다.

스왑 암호화 볼륨에 대한 파티션 설정은 아래와 같습니다.

다음 프롬프트는 데이터가 "sda2"(스왑)에서 삭제됨을 보여줍니다.

\sda2\ 및 \sda3\의 데이터 삭제는 아래와 같습니다.


프로세스가 완료되면 암호화된 두 파티션에 대한 암호를 입력합니다.

동일한 암호를 다시 입력합니다.

디스크에서 암호화된 볼륨을 성공적으로 구성한 후의 파티션 테이블은 아래와 같습니다.

Debian OS 설치를 시작하려면 파티셔닝 프로세스를 완료하십시오. 그러나 파티션에 대해 마운트 지점 "/"이(가) 아직 선택되지 않았기 때문에 다음 오류 프롬프트가 나타납니다.

위의 오류 프롬프트 후 암호화된 볼륨을 재구성하여 탑재 지점을 설정합니다. 이 문서에서 \sda3_crypt\는 루트 파일 시스템이고 \sda2_crypt\는 스왑 영역입니다.

암호화된 볼륨의 "/" 마운트 지점을 선택합니다.

"sda2_crypt" 암호화된 볼륨을 스왑 영역으로 선택합니다.

다음 스크린샷은 암호화된 볼륨의 최종 파티션 테이블을 보여줍니다.

파티션 포맷은 아래와 같습니다.

포맷 프로세스가 완료되면 기본 시스템이 설치됩니다.

다음 스크린샷은 Debian 패키지용 아카이브 미러 선택을 보여줍니다.

패키지 관리자 구성은 아래와 같습니다.

기본 또는 핵심 시스템만 아직 설치되어 있으며 표시된 목록에서 다른 패키지를 설치할 수 있습니다.

목록에서 데스크탑 환경 및 기타 패키지를 선택하십시오.

선택한 패키지의 설치는 아래와 같습니다.

Linux 부트 로더 "GRUB" 설치는 다음 스크린샷에 표시되어 있습니다.

부트로더 설치를 위해 장치(sda)가 선택되었습니다.

마지막으로 설치 프로세스가 완료되었습니다.

재부팅 후 암호를 입력하여 sda3 디스크를 복호화하십시오.

스왑 영역인 sda2 디스크를 해독하기 위한 암호를 입력합니다.

설치된 시스템에 성공적으로 로그인합니다.

암호 없는 루트 파일 시스템 구성
이제 부팅 시 암호를 입력하는 프로세스가 USB 메모리 스틱을 사용하여 자동화됩니다. 사용하는 대신
암호, USB의 비밀 키가 암호화된 볼륨을 해독합니다. USB 스틱을 VM에 연결하고 "dmesg" 명령어를 사용하여 찾습니다. 내 VM에서 \/dev/sdb\로 감지됩니다.

8192 임의 바이트의 비밀 키는 dd 명령을 사용하여 USB 스틱에서 추출됩니다.
dd if=/dev/sdb of=/root/secret.key bs=512 skip=4 count=16

위에서 생성한 비밀 키는 "cryptsetup" 명령을 사용하여 암호화된 볼륨에 추가됩니다. 기본적으로 암호는 슬롯 0에 보관됩니다. 따라서 슬롯 1은 두 번째 비밀 키에 사용됩니다.
"blkid" 명령을 실행하여 디스크의 볼륨 세부 정보를 가져옵니다.
blkid

이 가이드에서 볼륨 복호화를 위한 비밀 키는 /dev/sda3에만 추가됩니다. 그러나 "/dev/sda2"(스왑) 파티션에도 추가할 수 있습니다.
cryptsetup luksAddKey /dev/sda3 /root/secret.key --key-slot 1

/etc/udev/rules.d/99-custom-usb.rules 파일에 USB 장치에 대한 간단한 udev 규칙이 생성되며, 사용할 심볼릭 링크는 /dev/usbdevice입니다.
SUBSYSTEMS=="usb", DRIVERS=="usb",SYMLINK+="usbdevice%n"

다음 명령어를 사용하여 규칙을 다시 로드합니다.
udevadm control --reload-rules

USB 장치를 삽입하여 사용자 정의 규칙을 확인하십시오.

USB 기기에서 비밀 키를 읽고 부팅 시 cryptsetup에 제공하려면 셸 스크립트가 필요합니다. 스크립트는 \/usr/local/sbin/openluksdevices.sh\로 생성되며 http://www.oxygenimpaired.com/ 사이트에서 가져옵니다.
#!/bin/sh
############taken from following link#########
###http://www.oxygenimpaired.com/debian-lenny-luks-encrypted-root-hidden-usb-keyfile
TRUE=0
FALSE=1
# flag tracking key-file availability
OPENED=$FALSE
if [ -b /dev/usbdevice ]; then
# if device exists then output the keyfile from the usb key
dd if=/dev/usbdevice bs=512 skip=4 count=16 | cat
OPENED=$TRUE
fi
if [ $OPENED -ne $TRUE ]; then
echo "FAILED to get USB key file ..." >&2
/lib/cryptsetup/askpass "Try LUKS password: "
else
echo "Success loading key file for Root . Moving on." >&2
fi
sleep 2
실행할 수 있도록 스크립트의 권한을 설정합니다.
chmod a+x /usr/local/sbin/openluksdevices.sh

fstab 구성 파일과 마찬가지로 crypttab 파일에는 Linux 플랫폼의 암호화된 볼륨에 대한 정보가 포함되어 있습니다. sda3_crypt 암호화 파티션에 대한 셸 스크립트를 추가합니다. 암호화된 볼륨에 대한 구성 파일 "/etc/crypttab"의 내용은 다음과 같습니다.
sda3_crypt /dev/disk/by-uuid/c37a8128-5ea9-45c6-8890-d52f3d452ccc none luks,keyscript=/usr/local/sbin/openluksdevices.sh

"/etc/initramfs-tools/conf.d/cryptroot" 파일에 다음 줄을 추가합니다.
CRYPTROOT=target=sda3_crypt,source=/dev/disk/by-uuid/c37a8128-5ea9-45c6-8890-d52f3d452ccc

"/etc/initramfs-tools/modules" 파일에 "usb_storage"가 추가되었는지 확인하십시오.

다음 셸 스크립트(/etc/initramfs-tools/hooks/udevusbkey.sh)도 외부 소스에서 가져옵니다. 임시 파일 시스템 "initrd"에 사용자 정의 udev 규칙을 추가하는 데 사용됩니다.
#!/bin/sh
# udev-usbkey script
###taken from
###http://www.oxygenimpaired.com/ubuntu-with-grub2-luks-encrypted-lvm-root-hidden-usb-keyfile
PREREQ="udev"
prereqs()
{
echo "$PREREQ"
}
case $1 in
prereqs)
prereqs
exit 0
;;
esac
. /usr/share/initramfs-tools/hook-functions
# Copy across relevant rules
cp /etc/udev/rules.d/99-custom-usb.rules ${DESTDIR}/lib/udev/rules.d/
exit 0

스크립트의 권한을 변경하십시오.
chmod a+x /etc/initramfs-tools/hooks/udevusbkey.sh

GRUB2 부트 로더 구성에 일부 변경이 필요합니다. 그러나 구성 파일 "/boot/grub/grub.cfg"의 직접 변경은 허용되지 않습니다. 따라서 "/etc/default/grub" 구성 파일에서 "GRUB_CMDLINE_LINUX_DEFAULT" 매개변수를 변경하십시오. 아래와 같이 "rootdelay" 및 "cryptopts"는 "GRUB_CMDLINE_LINUX_DEFAULT" 매개변수에 포함됩니다.
GRUB_CMDLINE_LINUX_DEFAULT="rootdelay=20 cryptopts=target=sda3_crypt,source=/dev/disk/by-uuid/c37a8128-5ea9-45c6-8890-d52f3d452ccc,keyscript=/lib/cryptsetup/scripts/openluksdevices.sh"
GRUB_CMDLINE_LINUX=""
# Uncomment to enable BadRAM filtering, modify to suit your needs
# This works with Linux (no patch required) and with any kernel that obtainsConclusion

"update-grub" 명령을 실행하여 "/boot/grub/grub.cfg" 구성 파일에 위의 변경 사항을 적용하십시오.

위 명령 후 "/boot/grub/grub.cfg" 구성 파일에 다음 변경 사항이 적용되었습니다.
echo 'Loading Linux 3.16.0-4-686-pae ...'
linux /vmlinuz-3.16.0-4-686-pae root=UUID=b30cdb22-8e3c-4ffd-a0c7-af96b90ba016 ro rootdelay=20 cryptopts=target=sda3_crypt,source=/dev/disk/by-uuid/c37a8128-5ea9-45c6-8890-d52f3d452ccc,keyscript=/lib/cryptsetup/scripts/openluksdevices.sh
echo 'Loading initial ramdisk ...'
initrd /initrd.img-3.16.0-4-686-pae
"update-initramfs -u"를 실행하여 모든 커널의 임시 파일 시스템 파일을 업데이트합니다.

재부팅하기 전에 newley가 생성한 "initrd.img"의 압축을 풀고 키 스크립트가 "lib/cryptsetup/scripts" 디렉토리에 복사되었고 사용자 정의 udev 규칙이 "lib/udev/rules.d/에 복사되었는지 확인하십시오.\디렉토리.
cd /tmp/
zcat /boot/initrd.img-3.16.0-4-686-pae | cpio -iv

Keyscript가 initramfs 스크립트에 성공적으로 포함되었습니다.

사용자 지정 USB 규칙도 udev 규칙에 포함됩니다.

전체 설정을 테스트하기 전에 VM 설정에 USB 장치를 추가하십시오.

마지막으로 암호화된 볼륨에 대한 비밀 키가 성공적으로 로드됩니다.

결론
이 기사에서는 USB 메모리 장치에 보관된 비밀 키를 사용하여 암호화된 파티션을 엽니다. 부팅 시 암호화된 볼륨에 대한 비밀 키를 제공하기 위해 자동 셸 스크립트가 사용됩니다.