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ドライブを暗号化するためにシンボリックリンクを使用するという目標の1つを確実に達成しました。ただし、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

私はより洗練されたヘルパースクリプトを使用してこの問題を満足に解決しました。ヘルプスクリプト

理解できない理由で項目を確認した後、2番目の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パーティションを持つ2番目のUSBドライブを同時に接続すると、luksパーティションにシンボリックリンクが作成されます。

/dev/myusbluks1

もし私が

cryptsetup luksOpen /dev/myusbluks0  cr_diskbackup

シンボリックリンクはまだ存在し、cryptsetup luksOpenより前のデバイスを指します。さらに、固有番号はさらに防弾性を高めてくれるのに十分である。

おすすめ記事