Upgrade to Pro — share decks privately, control downloads, hide ads and more …

USBGuard でUSB デバイスを保護(2023年版)

USBGuard でUSB デバイスを保護(2023年版)

Kenichiro MATOHARA

April 23, 2023
Tweet

More Decks by Kenichiro MATOHARA

Other Decks in Technology

Transcript

  1. USBGuard でUSB
    デバイスを保護
    (2023年版)
    Kenichiro Matohara(matoken)
    1

    View Slide

  2. 南隅から参加(鹿児島の右下)
    好きなLinuxディストリビューションはDebian
    お仕事募集 mailto:work@matohara.org
    Kenichiro Matohara(matoken)
    https://matoken.org
    2

    View Slide

  3. 公共のUSB充電ステーションの
    危険性に関する注意喚起
    'Juice Jacking': The
    Dangers of Public USB
    Charging Stations |
    Federal Communications
    Commission
    3

    View Slide

  4. 主にスマートフォンに向けた注意喚起.
    PCの場合も BadUSB, PoisonTap, USBdriveby……
    4

    View Slide

  5. 以前の発表
    udev + sysfs でUSB デバイス接続時に条件に合わせて許可拒否
    USBを保護するUSBGuard
    鹿児島Linux勉強会2017.01(2017-01-04)
    https://kagolug.connpass.com/event/47774/
    https://bitbucket.org/matoken/linux-
    2017.01/src
    https://speakerdeck.com/matoken/usbwobao-
    hu-suruusbguard
    5

    View Slide


  6. その後
    GUI フロントエンドのusbguard-applet-qt → Debianでは
    bullseye(stable)でdrop (Archにはあるよう)
    USBGuard 通知の usbguard-notifier が
    bookworm(testing) で入った
    6

    View Slide

  7. USBGuard の導入
    $ sudo apt install usbguard
    7

    View Slide

  8. files
    /etc/usbguard/usbguard-daemon.conf
    デーモン設定
    /etc/usbguard/rules.conf
    ルールファイル
    /etc/usbguard/rules.d/
    ルールディレクトリ
    /var/log/usbguard/usbguard-audit.log
    ログ
    8

    View Slide

  9. 権限の設定
    IPC経由でUSBguardにアクセスするための権限
    plugdev groupに居たのでそのままでOKだった
    $ sudo grep ^IPCAllow /etc/usbguard/usbguard-daemon.conf
    IPCAllowedUsers=root
    IPCAllowedGroups=root plugdev
    $ id | grep -m 1 -o plugdev
    plugdev
    9

    View Slide

  10. ポリシー生成
    usbguard generate-policy で現在接続されているデバイスを接続
    されているポートで許可,それ以外はblock する設定情報が書き出され
    る.(以前と比べてhash等が使えるようになっている)
    $ usbguard generate-policy
    allow id 1d6b:0002 serial "0000:00:14.0" name "xHCI Host Controller" hash "jEP/6WzviqdJ5VSeTUY
    allow id 1d6b:0003 serial "0000:00:14.0" name "xHCI Host Controller" hash "3Wo3XWDgen1hD5xM3PSN
    allow id 18d1:4ee7 serial "43570d33" name "SDM439-MTP _SN:9E71312D" hash "bUT6xGWCUcrmzAXIjnhlN
    allow id 05e3:0610 serial "" name "USB2.1 Hub" hash "CbRB9LX/JdGjNWCYSOcIwMVXE0UpOR03LCotWrTbu
    allow id 5986:054c serial "200901010001" name "USB HD Webcam" hash "9k1B2RV7iLzVYE0EUiXoKSr4V0X
    allow id 8087:0a2b serial "" name "" hash "TtRMrWxJil9GOY/JzidUEOz0yUiwwzbLm8D7DJvGxdg=" paren
    allow id 05e3:0626 serial "" name "USB3.1 Hub" hash "15SBGsOo8K+JjtOKSCn7t0i6ifer4wmhzep1yEB5p
    allow id 1b3f:2008 serial "" name "USB Audio Device" hash "2WvHLXDFTIVfoa/z54LmFuVBuBbDPnCPaly
    allow id 17ef:6047 serial "" name "ThinkPad Compact USB Keyboard with TrackPoint" hash "SkOJyG
    10

    View Slide

  11. ポリシーをルールファイルに書
    いて反映
    1 設定ファイル作成
    2 設定の既定値書き込み
    3 設定調整(今回は外付けキーボードをどのポートでも利用できる
    よう修正)
    $ sudo install -m 0600 -o root -g root /dev/zero /etc/usbguard/rules.conf
    $ usbguard generate-policy | sudo tee /etc/usbguard/rules.conf
    $ sudo vi /etc/usbguard/rules.conf
    1
    2
    3
    11

    View Slide

  12. デバイスの許可不許可
    allow
    許可
    block
    利用不可(手動で許可も可能)
    reject
    利用不可(利用するには再接続が必要)
    12

    View Slide

  13. 設定
    設定に使える属性の例
    デバイスID,ハッシュ,USBデバイス名,シリアル,ポートID,インタ
    ーフェイスタイプ,USBポートID,ローカルタイム,ランダム(!)
    これらを組み合わせて様々なルールが設定可能.
    特定のポートに特定のデバイスを接続すると認識
    特定のタイプ(マスストレージデバイスのみ等)だけ認識
    HIDデバイスを1台だけ認識
    ランダムで許可
    :
     設定詳細 → usbguard-rules.conf(5)
    13

    View Slide

  14. 設定例(generate-policyで自動生成
    されたもの)
    Lenovo Trackpoint Keyboard 既定値( 1 of 2 )
    1 デバイスの許可拒否(allow/block/reject)
    2 USB VenderID:ProductID
    3 シリアル
    4 名前
    5 デバイス属性値と USB 記述子データから計算されたハッシュ
     実際は1行
    allow \
    id 17ef:6047 \
    serial "" \
    name "ThinkPad Compact USB Keyboard with TrackPoint" \
    hash "SkOJyGDMSWYWvEMS0OImUGa5DaH6Ndg4WOGcPTy3MQc=" \
    1
    2
    3
    4
    5
    14

    View Slide

  15. Lenovo Trackpoint Keyboard 既定値( 2 of 2 )
    1 親デバイスのハッシュ
    2 USBポート
    3 インターフェイスタイプ(
    )
    4 デバイス属性
     どのポートでも利用できるようにしたい場合は,この設定から
    parent-hash と via-port を消す.
    parent-hash "CbRB9LX/JdGjNWCYSOcIwMVXE0UpOR03LCotWrTbuCM=" \
    via-port "1-4.4" \
    with-interface { 03:01:01 03:01:02 } \
    with-connect-type "unknown"
    1
    2
    3
    4
    03から始まるのはHID device class
    15

    View Slide

  16. EXAMPLE POLICIES
    manより
    USBマスストレージのみを許可
    特定のYubikeyを特定のポートだけで許可する
    疑わしい(BadUSBのような)デバイスを拒否する
    まだUSBキーボードが1つも許可されていない場合にのみキーボード
    のみのデバイスを許可する
    ロシアンルーレット
    16

    View Slide

  17. USBマスストレージのみを許可
    allow with-interface equals { 08:*:* }
    17

    View Slide

  18. 特定のYubikeyを特定のポートだ
    けで許可する
    allow 1050:0011 name "Yubico Yubikey II" serial "0001234567" \
    via-port "1-2" hash "044b5e168d40ee0245478416caf3d998"
    reject via-port "1-2"
    18

    View Slide

  19. 疑わしい(BadUSBのような)デバ
    イスを拒否する
     マスストレージ(08h)かつ,HID(03h)/ビデオ
    (e0h)/CDC(02h)のデバイスを拒否する
    allow with-interface equals { 08:*:* }
    reject with-interface all-of { 08:*:* 03:00:* }
    reject with-interface all-of { 08:*:* 03:01:* }
    reject with-interface all-of { 08:*:* e0:*:* }
    reject with-interface all-of { 08:*:* 02:*:* }
    19

    View Slide

  20. まだUSBキーボードが1つも許可
    されていない場合にのみキーボ
    ードのみのデバイスを許可する
    allow with-interface one-of { 03:00:01 03:01:01 } \
    if !allowed-matches(with-interface one-of { 03:00:01 03:01:01 })
    20

    View Slide

  21. ロシアンルーレット
    allow if random(0.1666)
    reject
    21

    View Slide

  22. USBGuard daemon を有効にする
    1 USBGuard を起動
    2 USBGuard を有効に
     KeyboardがUSB接続の場合設定ミスで操作できなくなる可能
    性がある.リモート接続や sudo systemctl start
    usbguard; sleep 60; sudo systemctl stop
    usbguard のようなことをしておいたほうがいい.
    $ sudo systemctl start usbguard
    $ sudo systemctl enable usbguard
    1
    2
    22

    View Slide

  23. 後で接続したデバイスを有効に
    したい
    1 block されているデバイスを確認
    2 list-devices の結果を参考にしてルールファイルに追記
    3 USBGuard daemon 再起動
    $ usbguard list-devices | grep -i block
    12: block id 046d:081b serial "159F4170" name "" hash "YSWl6EEC6EF4Rmi5/mMzQlVbZymdd0s1tK8gJ8Q
    $ echo 'allow id 046d:081b serial "159F4170" name "" hash "YSWl6EEC6EF4Rmi5/mMzQlVbZymdd0s1tK8g
    | sudo tee -a /etc/usbguard/rules.conf
    $ sudo service usbguard reload
    Restarting Usbguard daemon.
    1
    2
    3
    23

    View Slide

  24. デスクトップ向け通知(usbguard-
    notifier)
    usbguard-notifier でUSBGuard の通知をポップアップで利用で
    きる
    1 usbguard-notifer を導入
    2 usbguard-notifier を起動(USBデバイスを接続して動作確
    認)
    3 usbguard-notifier を有効に
    $ sudo apt install usbguard-notifier
    $ systemctl --user start usbguard-notifier
    $ systemctl --user enable usbguard-notifier
    1
    2
    3
    24

    View Slide

  25. ポップアップ通知 :)
    25

    View Slide

  26. ルールにないデバイスの許可(一
    時的)
    block されているデバイスを手動で許可する
    reject されているものは不可
    26

    View Slide

  27. id指定
    1 usbguard watch や usbguard list-devices で確認でき
    るidを指定
    $ sudo usbguard allow-device 103 1
    27

    View Slide

  28. デバイス名指定
     同様に block, reject も可能
    $ lsusb | grep Qualcomm
    Bus 001 Device 127: ID 05c6:9024 Qualcomm, Inc. SDM439-MTP _SN:9E71312D
    $ sudo usbguard allow-device name \"Qualcomm, Inc. SDM439-MTP _SN:9E71312D\"
    28

    View Slide

  29. SEE ALSO: usbauth
    2015年にSUSE 向けに最初に作成されたらしい.Linux 4.4+
    設定は自分で1から書かないといけなそう?(未確認)
    usbauth - USB firewall against BadUSB
    attacks kochstefan/usbauth-all
    29

    View Slide

  30. まとめ
    USBGuard でファイヤーウォール的にUSB デバイスの許可,拒否
    BadUSB 対策等に
    とはいえ物理アクセスされる時点で色々出来てしまうので過信は禁

    モバイルマシンや複数人がアクセスできる端末などにポリシーに沿っ
    て設定しておくと少し安心?
    30

    View Slide

  31. 奥付
    発表
    2023-04-
    23(sun)
    発表者
    利用ソフトウェア
    ライセンス
    鹿児島Linux勉強会 2023.04(オンライン開催)
    Kenichiro Matohara(matoken)
    Asciidoctor Reveal.js
    CC BY 4.0
    31

    View Slide

  32. View Slide