使用 udev 的 USB 閃存白名單

使用 udev 的 USB 閃存白名單

我想為 USB 隨身碟創建類似“白名單”的內容。我的意思是「拒絕一切不允許的事」。

我知道我應該使用udev規則:

  1. 新增至/etc/udev/rules.d/規則以拒絕每個 USB 隨身碟
  2. 添加另一個具有更高編號的規則以允許我想要的

我只想處理 USB 隨身碟。這些規則可以基於 USB 驅動器中的任何資訊。我的意思是供應商 ID、序號。我的意思是我對這個案子沒有任何願望。任何解決方案。

但我不知道應該在規則文件中寫入什麼。你能舉個例子嗎?

UPD。我建立一個包含以下內容的文件:

deck@crunch /etc/udev/rules.d $ cat 90-deny-usbflash.rules 
BUS=="usb", OPTIONS+="ignore_device"

據我所知,該資料夾是透過udev使用監視的inotify,因此更改應該會立即生效。但沒有應用任何更改。

答案1

您沒有說您是否安裝了其他自動安裝所有驅動器的軟體。我下面的解決方案假設您不這樣做。如果您這樣做,那麼您的問題就不同了:您應該指定它是什麼,以便有人可以建議如何卸載它或控制它。

以下是僅安裝允許的磁碟機的 udev 規則範例(未經測試,但基於我使用的類似規則):

#-- Skip if not an appropriate "sd" device
KERNEL!="sd[b-z]*", GOTO="99_exit"
SUBSYSTEM!="block", GOTO="99_exit"

#-- Handle 'remove' and 'change' events
SUBSYSTEMS=="usb", ACTION=="remove", RUN+="/usr/bin/pumount /dev/%k", GOTO="99_exit"
ACTION=="remove|change", GOTO="99_exit"

#-- Create useful environment variables
SUBSYSTEMS=="usb", ENV{ID_SERIAL}!="?*", IMPORT{builtin}="usb_id"
SUBSYSTEMS=="usb", ENV{ID_FS_LABEL}!="?*", IMPORT{program}="/sbin/blkid -o udev -p %N"

#-- Skip if this is not a filesystem (e.g. if this is the whole drive, not a formatted partition)
ENV{ID_FS_USAGE}!="filesystem", GOTO="99_exit"

#-- Mount only allowed drives:
SUBSYSTEMS=="usb", ACTION=="add", ENV{ID_FS_LABEL}=="something_allowed", RUN+="/usr/bin/sudo -u someuser /usr/bin/pmount -t vfat /dev/%k /media/some_name"
SUBSYSTEMS=="usb", ACTION=="add", ENV{ID_FS_LABEL}=="other_allowed", RUN+="/usr/bin/sudo -u someuser /usr/bin/pmount -t vfat /dev/%k /media/other_name"

#-- Exit
LABEL="99_exit"

當然,您使用的安裝命令取決於您的偏好。我展示的只是一個例子。

更新:我從你的評論中了解到,你確實安裝了一些可以自動安裝的東西。在我的系統(Debian Wheezy)上,我沒有。我嘗試了你建議的 grep 並得到了不同的結果。在 中/lib/udev/rules.d/80-udisks.rules,我找到了這段程式碼:

# Mark devices that shouldn't be automounted / autoassembled etc.
#
# Deny all, then punch holes for what looks like physical drives
# (TODO: this heuristic might need some work)
#

ENV{UDISKS_PRESENTATION_NOPOLICY}="1"
KERNEL=="sd*|hd*|sr*|mmcblk*|mspblk*", ENV{DISKS_PRESENTATION_NOPOLICY}="0"

這表明,如果我安裝了自動掛載軟體,它可以由 UDISKS_PRESENTATION_NOPOLICY 環境變數控制。您尚未指定您的發行版,但它顯然有所不同。

答案2

你可以嘗試USB衛士。它在 UDev 和 Linux 核心 USB 授權框架之上實作了 USB 裝置黑名單/白名單。您可以使用 UDev 實現與已經建議的相同的效果,但 USBGuard 是用於該工作的專用工具,並且它有一個規則語言和(可選)GUI 小程式。

由於USB隨身碟通常都有序號,因此在usbguard中使用VID:PID和序號將其列入白名單會像這樣:

allow 1234:5678 serial "123456" with-interface equals { 08:*:* }
allow 1234:5678 serial "abcdef" with-interface equals { 08:*:* }
block

這將允許(授權)連接兩個僅具有大容量儲存介面、VID:PID 或 1234:5678 以及 iSerial 值「123456」或「abcdef」的 USB 裝置。其他一切都會被阻止。

免責聲明:我是該專案的作者。

相關內容