cryptsetup luksOpen에서 USB luks 파티션을 삭제하는 심볼릭 링크는 무엇입니까?

cryptsetup luksOpen에서 USB luks 파티션을 삭제하는 심볼릭 링크는 무엇입니까?

USB 플래시 드라이브를 삽입할 때 USB 플래시 드라이브의 luks 암호화 파티션에 대한 심볼릭 링크를 생성하는 새로운 udev 규칙을 작성했습니다. 내가 작성한 새로운 udev 규칙은 USB 드라이브의 luks 암호화 파티션에 대한 심볼릭 링크를 생성합니다. 그러나 /dev/mapper/ 객체(ext4 파일 시스템을 마운트할 수 있음)를 가져오기 위해 심볼릭 링크를 지정하는 "cryptsetup luksOpen"을 실행할 때 cryptsetup 명령이 끝나면 심볼릭 링크가 사라집니다. 이는 예상치 못한 일입니다. USB 드라이브가 꺼질 때까지 심볼릭 링크를 유지하고 싶습니다.

udev 규칙:

SUBSYSTEM!="block", GOTO="usb_luks_rules_end"
ENV{DEVTYPE}!="partition",  GOTO="usb_luks_rules_end"
ACTION=="add", ENV{ID_FS_TYPE}=="crypto_LUKS", SYMLINK+="myusbluks"
LABEL="usb_luks_rules_end"

심볼릭 링크가 없도록 드라이브를 분리하는 것부터 시작했습니다.

# ls /dev/my*
ls: cannot access /dev/my*: No such file or directory

luksFormat 파티션이 있는 USB 플래시 드라이브를 삽입했습니다. 암호화된 파티션 내부에는 ext4 파일 시스템이 있습니다. USB 드라이브는 /dev/sdc가 됩니다. 예측할 수 없는 /dev/sdc1 이름을 지정하는 대신 심볼릭 링크 이름을 "cryptsetup luksOpen"할 수 있도록 내 심볼릭 링크가 이 파티션을 가리키도록 하려고 합니다.

# ls -l /dev/my*
lrwxrwxrwx. 1 root root 4 Mar 24 15:51 /dev/myusbluks -> sdc1

udev 규칙은 내가 예상한 대로 작동하고 심볼릭 링크를 생성했습니다. 이제 심볼릭 링크에서 cryptsetup luksOpen을 실행하고 제어권을 되찾은 후 심볼릭 링크가 사라졌습니다!

# cryptsetup luksOpen /dev/myusbluks cr_diskbackup
Enter passphrase for /dev/myusbluks: (I enter passphrase successfully.)
# ls -l /dev/my*
ls: cannot access /dev/my*: No such file or directory
# ls -l /dev/mapper/cr_diskbackup
lrwxrwxrwx. 1 root root 8 Mar 24 15:53 /dev/mapper/cr_diskbackup -> ../dm-92
# blkid /dev/mapper/cr_diskbackup
/dev/mapper/cr_diskbackup: LABEL="backupdisk1" UUID="54e2dfcb-20d9-4699-8f7c-0834fda1b4a6" TYPE="ext4"
# ls -l /dev/sdc1
brw-rw----. 1 root disk 8, 33 Mar 24 15:53 /dev/sdc1
# blkid /dev/sdc1
/dev/sdc1: UUID="dd5c374e-963f-4604-8ca3-d271a26abc90" TYPE="crypto_LUKS"

저는 "/dev/sdc1"을 사용하는 대신 luksOpen 드라이브를 암호화하기 위해 심볼릭 링크를 사용한다는 목표 중 하나를 확실히 달성했습니다. 그러나 USB 드라이브가 물리적으로 분리될 때까지 심볼릭 링크가 지속되기를 원합니다.

다른 설정 후에 동일한 명령으로 strace를 실행했습니다. 심볼릭 링크 이름이 열리고 통계적으로 표시되는 것을 볼 수 있지만 cryptsetup strace에서 심볼릭 링크를 제거하는 내용은 아무것도 표시되지 않습니다.

다음은 cryptsetup luksOpen을 실행할 때 "udevadm Monitor"에서 가져온 것입니다.

KERNEL[2064243.853683] change   /devices/pci0000:00/0000:00:14.0/usb1/1-10/1-10.2/1-10.2:1.0/host29/target29:0:0/29:0:0:0/block/sdc/sdc1 (block)
KERNEL[2064243.854830] add      /devices/virtual/bdi/253:92 (bdi)
KERNEL[2064243.855452] add      /devices/virtual/block/dm-92 (block)
UDEV  [2064243.856682] add      /devices/virtual/bdi/253:92 (bdi)
KERNEL[2064243.856781] change   /devices/virtual/block/dm-92 (block)
UDEV  [2064243.858320] add      /devices/virtual/block/dm-92 (block)
UDEV  [2064243.897808] change   /devices/pci0000:00/0000:00:14.0/usb1/1-10/1-10.2/1-10.2:1.0/host29/target29:0:0/29:0:0:0/block/sdc/sdc1 (block)
UDEV  [2064244.124652] change   /devices/virtual/block/dm-92 (block)

"변화" 사건이 일어나고 있다는 사실은 이것과 관련이 있을 수 있습니다. cryptsetup인지 장치 매퍼인지 잘 모르겠습니다. 그러나 /dev/sdc1은 cryptsetup luksOpen이 완료된 후에도 장치로 남아 있기 때문에 동일한 장치를 계속 가리킬 수 있도록 심볼릭 링크가 단독으로 남아 있지 않은 이유를 이해할 수 없습니다. 이 작업을 수행 중인 시스템에는 luks 파티션이 없는 다른 USB 드라이브가 연결되어 있을 수 있습니다. 따라서 luks 파티션(존재하는 경우)에 대한 심볼릭 링크가 필요합니다.

내가 여기서 무엇을 놓치고 있는 걸까요? 기본 암호화 파티션에 대한 심볼릭 링크가 열려 있고 그러한 심볼릭 링크가 존재하지 않도록 하는 조치가 있는 경우 일종의 보안 문제로 간주됩니까?

답변1

저는 보다 정교한 도우미 스크립트를 사용하여 이 문제를 만족스럽게 해결했습니다. 도움말 스크립트

이해할 수 없는 이유로 항목을 확인한 후 두 번째 udev "변경" 이벤트가 발생합니다.

cryptsetup luksOpen /dev/asymlinkname cr_diskbackup

명령을 실행하면 심볼릭 링크가 사라집니다.
규칙 논리를 "Add|Change"로 전환하고 도우미 스크립트도 추가했습니다. 도우미 스크립트는 여기에 있는 스크립트를 수정한 것입니다.동일한 USB 직렬 장치에 알려진 심볼릭 링크를 할당하기 위한 udev 규칙. 수정 사항은 luks 파티션(보통 /dev/sdc1이지만 보장되지는 않음)을 가리키는 /dev 디렉터리에서 기존 기호 링크를 찾는 논리를 추가하는 것입니다. 발견되면 기호 링크의 접미사 번호가 표준 출력에 인쇄됩니다. Udev는 이 번호를 읽고 이를 접미사로 사용하여 해당 이름의 심볼릭 링크를 (재)생성합니다. Cryptsetup luksOpen은 이전과 같이 계속 작동하여 블록 장치가 여전히 존재하더라도 신비롭게 블록 장치에 대한 심볼릭 링크를 삭제합니다. 그러나 도우미 스크립트를 사용하면 "change" 이벤트에 대한 udev 규칙 작업에 의해 다시 생성되었기 때문에 이제 luksOpen 뒤에 심볼릭 링크가 나타납니다.

업데이트된 udev 규칙:

SUBSYSTEM!="block", GOTO="my_usb_luks_rules_end"
ENV{DEVTYPE}!="partition",  GOTO="my_usb_luks_rules_end"
ACTION=="add|change", ENV{ID_FS_TYPE}=="crypto_LUKS", PROGRAM="/usr/local/sbin/my-unique-usb-luks-num /dev myusbluks $env{DEVNAME}", SYMLINK+="myusbluks%c"
LABEL="my_usb_luks_rules_end"

/usr/local/sbin/my-unique-usb-luks-num 스크립트:

#!/bin/bash

if [ $# -ne 3 ]; then
    printf "Usage: $0 location prefix devicename\n" >&2
    exit 1
fi

location="$1"
prefix="$2"
devname="$3"

# Find any symlinks in the location that may already
# exist to our device. Save only the first one.
old_symlink=$( find $location -maxdepth 1 \
                    -lname "$(basename ${devname})" \
                    -name "$prefix*" |
                    sort -n | head -n 1 )

# If we found any symlinks with our prefix to the specified device, then print
# its numeric suffix to stdout for it to be "$result" (%c) in the caller udev
# rule.
if [ "${old_symlink}" != "" ]; then
   devbase=$(basename ${old_symlink})
   printf "${devbase##$prefix}\n"
   exit
fi

# No symlink was already in existence, so find a unique new suffix number.
for ((index=0; index<256; index++)); do
  if [ ! -e "$location/$prefix$index" ]; then
     # Merely print this to our stdout for it to be $result (%c) in caller udev
     # rule. Then exit.
     printf "$index\n"
     exit
  fi
done
# If we did not exit above, we printed (returned) nothing.
exit 1

Luks 파티션이 있는 USB 드라이브를 삽입하면 다음과 같은 결과가 발생합니다.

/dev/myusbluks0

생성됩니다. luks 파티션이 있는 두 번째 USB 드라이브를 동시에 연결하면 luks 파티션에 심볼릭 링크가 생성됩니다.

/dev/myusbluks1

만약 내가

cryptsetup luksOpen /dev/myusbluks0  cr_diskbackup

심볼릭 링크는 여전히 존재하며 cryptsetup luksOpen 이전의 장치를 가리킵니다. 게다가 고유번호는 더욱 방탄성을 높여주기에 충분하다.

관련 정보