危険なUSB攻撃からユーザーを守るQubes OS
この記事ではUSBセキュリティ全般について概観したあと、Qubes OSにおけるUSB機器の使い方について解説します。

USBはセキュリティ上の脅威となりやすく、USBを利用した各種の攻撃から守るために Qubes OSでは sys-usb という USB機器を専門的に取り扱うキューブ(仮想マシン)が用意されています。USBマウス、USBメモリなどのUSB機器を利用する場合、sys-usb からそれらを利用する別のキューブにそのUSB機器を接続させる作業が必要です。また一見USBと無関係なデバイスも内部的にUSBを利用しているものがあります。たとえばSDカードやWebカメラなどがそうです。これらの機器を使いたい場合もsys-usbから別のキューブに機器を接続させる必要があります。
記事の冒頭ではなぜUSB機器を注意して取り扱う必要があるのか明らかにするために、USBを利用したサイバー攻撃のリスクについて説明します。記事の主要部分ではQubes OSのキューブにUSBデバイスを「アタッチ」して使用するやり方を詳しく解説していきます。
- USBはどうしてそんなに危険なのか
- USB攻撃に対するQubes OSのディフェンス: sys-usbによるUSB機器の管理
- Qubes OSにおけるUSB機器の使い方
- USBマウス
- USBキーボード
- Qubes Global Configでの USB入力機器の設定
- ブロックデバイス(USBメモリ、外付けHDD/SSD、SDカード等)の使い方
- GNOME Disks を使ってUSBメモリのパーティションにラベルを付ける
- USBメモリ等のパーティションだけをキューブにアタッチする方法
- LinuxのISOファイルからライブUSBを作成する
- USB接続の光学ドライブ
- Webカメラ
- Bluetooth マウス
- Androidスマホ・タブレットとUSB経由で接続
- USB接続のプリンタ・スキャナ
USBはどうしてそんなに危険なのか
一向に衰えないUSB攻撃の脅威
USBメモリなどを利用したUSB関連のサイバー攻撃に関する報道を目にする機会も多いと思います。軽く検索しただけでも以下のような記事が見つかりました。
- USBメモリーを標的に送りつけて攻撃--挿入されたPCにランサムウェアをインストール
- USBケーブルでウイルス感染? その仕組みと対策
- Kaspersky、セキュアなUSBメモリを悪用し、アジア太平洋地域のある政府機関を標的とした高度なAPT攻撃活動を発見
- USBメモリを起点としたFlowCloudを用いた攻撃について
- 兵器化されたUSBデバイスによる攻撃
- USBがいかにサイバーセキュリティの大きな脅威を生み出すか
セキュリティ確保のために企業内のネットワークを直接インターネットに繋がない対策を取っている企業用途・産業用途のITシステムは多いです。エアギャップ(air gap)と呼ばれるこのような仕組みも、攻撃者が細工したUSBが何らかの形でシステムに持ち込まれて接続されてしまうとセキュリティが保てなくなります。以下のネット記事はエアギャップによるシステムの防御にとっていかにUSBが脅威であるのか解説しています。
日本のAmazonでもUSB攻撃ツールが堂々と売られているのが度々確認されてます。

以下はペンテストのツールと称してハッキングツールを販売しているHak5という企業のウェブサイトです。何の変哲もないUSBメモリだがPCをハッキングするようなUSBツールが世の中に出回っているのです。

USBの規格自体に問題がある
なぜここまでUSB攻撃の脅威は一向に衰えることを知らないのか、なぜさっさとパッチを当てて解決できないのか疑問に思う方も多いでしょう。そのような疑問に対する、ある意味とても残念でショッキングな答えがUSBセキュリティの研究者の論文に書いてありました。Jing Tian et al(2018)1 は以下のように述べています。
Unfortunately, USB innovation has largely left security as an afterthought. New specifications rarely mention security, and until recently, USB designers placed the onus of security onto the consumers and vendors of USB devices [123]. As a result, USB devices are often a ripe target for attackers.
(訳) 不幸なことにUSBという技術革新において、セキュリティはどうでもよい付け足しのように扱われきた。USBの新しい仕様でもめったにセキュリティについて言及されていないし、つい最近までUSBの設計者はセキュリティを確保する責任は消費者とUSB機器のベンダーにあると言い張っていた。そのせいでUSB機器はしばしば攻撃者にとって格好のターゲットとなっている。
以下はUSBの仕様策定団体 USB-IFが 2014年に出した声明の一部です。
The USB-IF agrees that consumers should always ensure their devices are from a trusted source and that only trusted sources interact with their devices. Consumers safeguard their personal belongings and the same effort should be applied to protect themselves when it comes to technology. In order for a USB device to be corrupted, the offender would need to have physical access to the USB device. To prevent the spread of malware, consumers should only grant trusted sources with access to their USB devices.
(訳) USB-IF は、消費者が自分のデバイスが信頼できるソースからのものであること、および信頼できるソースのみが自分のデバイスと対話することを常に確認する必要があることに同意します。 消費者は自分の持ち物を守るのと同じように、テクノロジーに関しても自分自身を守るために同じ努力を払う必要があります。 USB デバイスを改ざんする場合、犯罪者が USB デバイスに物理的にアクセスする必要があります。 マルウェアの拡散を防ぐために、消費者は信頼できるソースにのみ USB デバイスへのアクセスを許可する必要があります。
攻撃者がUSB機器に物理的にアクセスしない限り攻撃は成功しないのだから、USB機器を守る責任は消費者にあり、USBの危険性をUSBの仕様のせいにしないでくれとUSB-IFは言っているわけです。どうやら"多重防御"という発想がUSB-IFには欠けているようです。消費者がうっかりミスや攻撃者の詐欺によって、悪意あるUSB機器を自分のPCに接続したらもうそれで終わりなのです。
新しい世代のUSBになっても解決されないUSBの脆弱性
USB-C 規格の採用のときにようやく USB-C Type AuthenticationというUSB機器製造者による署名システムの仕組みが導入されました。
残念ながらこれはUSB-C規格のオプションで必須の項目にはなっていません。また上記のJing Tian et al(2018) の論文によれば Type-C authには仕様上の欠陥があってファームウェアが書き換えられると成りすまし攻撃が可能であり攻撃リスクは依然として残されたままだそうです(ファームウェアに署名する仕組みが仕様には無いということです)。
USB 3.0 になってからは映像の出力までUSBでできるようになりました。USB3系とType-Cの登場によって消費者にとっての利便性が増したのは事実ですが、同時に攻撃者にとってもパワーアップした攻撃手法が使えるようになったようです。Lu Hongyi et al.(2021)2 はUSB-Cを利用して被害者のデバイスの画像出力を遠隔のPCにWiFiやGSMを通じて送信し、遠隔のPCから瞬時にマウス操作とキー入力を送信してデバイスを乗っ取る手法を開発しました。
USB攻撃から自分のデバイスを守るのは消費者の責任という恐ろしい状況は当分続きそうです。ユーザーが入手可能な解決手法の一つはQubes OSを利用することです。
USB攻撃に対するQubes OSのディフェンス: sys-usbによるUSB機器の管理
Xenの仮想化ではデバイスを仮想マシンに割り当てることが可能です。USB機器をパソコンに差し込んだとき、マイクロコントローラーやファームウェアから送られてくる通信内容を解釈して適切なドライバを読み込みUSB機器が使えるようにする作業を仮想マシンのOSに担当させることができるのです。
Xen を仮想化のシステムとして利用するQubes OSでは、sys-usbというキューブ(仮想マシン)がUSB機器を直接取り扱います。Qubes OSを通常通りインストールすれば デフォルトで sys-usbが作成されているはずです。Dom0が直接危険なUSB機器を取り扱わないことにより、システム全体が悪意あるUSBから攻撃されるのを防いでいます。
以下はdom0のターミナルから qvm-device pci というコマンドの出力でUSB関連のところを表示したものです。qvm-device pci はパソコンのPCI機器の一覧を表示し、さらに別のキューブに使用させていればその旨を表示します。私のPCではUSBコントローラーが2つあっていずれも sys-usbによって使用されています。
[ft7777@dom0 ~]$ qvm-device pci | grep -i usb dom0:04_00.3 USB controller: Advanced Micro Devices, Inc. [AMD] Renoir/Cezanne USB 3.1 sys-usb (no-strict-reset=True) dom0:04_00.4 USB controller: Advanced Micro Devices, Inc. [AMD] Renoir/Cezanne USB 3.1 sys-usb (no-strict-reset=True)
Dom0のターミナルから lsusb コマンドを実行しても何も表示されないので USB機器はdom0に接続されていないことがわかります。
[ft7777@dom0 ~]$ lsusb [ft7777@dom0 ~]$
sys-usbのターミナルから lsusb コマンドを叩くと以下のように幾つかのUSB機器が表示されました。
user@sys-usb:~$ lsusb Bus 005 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 004 Device 003: ID 0c45:6d1a Microdia Integrated_Webcam_HD Bus 004 Device 002: ID 8087:0032 Intel Corp. AX210 Bluetooth Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 003 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 001 Device 002: ID 0627:0001 Adomax Technology Co., Ltd QEMU Tablet Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
このうちWebカメラとブルートゥースが本物のUSB機器です。Linux Foundation -- root hub や QEMU Tablet はダミーのUSB機器だと思います。
こうしてUSB機器の管理はsys-usbに委託されており dom0の安全が保たれているのです。
Qubes OSにおけるUSB機器の使い方
USBマウス
Qubes OSでUSBマウスを使いたい場合、マウスをUSBポートに差し込むと次のようなポップアップが出ます。

OKボタンをタッチパッドでクリックするか、タブキーを複数回押して OKボタンにフォーカスしてからエンターキーを押すかすると、マウスが使えるようになります。
Targetすなわちマウスをつなぐ相手方キューブはかならず dom0 を選んでください。Dom0につなぐと聞くとセキュリティ的に大丈夫なのか心配になるかもしれません。実を言うとマウス、キーボード、タッチスクリーンなどは直接dom0に機器をつなぐわけではなく、sys-usbで行ったUSB機器の操作を間接的にdom0に伝える仕組みが採用されています。
実際マウスを接続したあと dom0のターミナルから lsusb コマンドを実行しても何も表示されませんが、sys-usbのターミナルから lsusbを実行すると新たにつないだマウスの情報が表示されます。
マウスなどインプットデバイスをPCに接続したあと、sys-usbにおいて input-proxy-sender というプロセスが開始されてこれが dom0にマウスなどインプットデバイスの動きを伝えているそうです。次の画面は sys-usbで input-proxy-sender のプロセスを表示したものです。
user@sys-usb:~$ ps auxww | grep input-proxy | grep -v grep root 1581 0.0 0.5 3084 1920 ? S 17:01 0:00 /usr/bin/qrexec-client-vm dom0 qubes.InputMouse /usr/bin/input-proxy-sender /dev/input/event6 root 1582 0.0 0.2 2328 896 ? S 17:01 0:00 input-proxy-sender /dev/input/event6
またマウス接続後 dom0 では input-proxy-receiver というsys-usbからやってきたデータを受け取るプロセスが動きます。
[ft7777@dom0 ~]$ ps auxww | grep input-proxy | grep -v grep ft7777 8071 0.0 0.0 2456 1280 ? S 17:01 0:00 /usr/bin/input-proxy-receiver --mouse
このように直接dom0にマウスがつながるわけではないので、例えばマウスのファームウェアが改変されバッファオーバーフローなどによってOSが乗っ取られるとしたら sys-usbが乗っ取られるわけです。ではUSB機器がdom0に直接つながってないからdom0が乗っ取られる可能性が100%無いのかというとそうでもないようです。
BadUSBなどをうっかり接続してsys-usbが攻撃者に乗っ取られた場合にもしもUSBマウスが使用されていると、前述の input-proxy-senderなどを攻撃者が操って Qubes OS全体を間接的に操作することが理論的にはありえるのです。しかし攻撃者からすればマウスのポインタがスクリーンのどこにあるのか、操作すべきウィンドウの大きさと位置はどうなってるのか等もろもろの情報を正確に把握していないと、マウスへの情報伝達のみでシステムを攻撃するのは極めて困難です3。こういう事情でマウスを使うことはそれほどのリスクではないと考えられます。それでもQubesのドキュメントでは以下のように警告しています。
If you connect USB input devices (keyboard and mouse) to a VM, that VM will effectively have control over your system. Because of this, the benefits of using a USB qube entrusted with a keyboard or other interface device are much smaller than using a fully untrusted USB qube.
(訳) もしUSBインプットデバイス(キーボードとマウス)を仮想マシンにつないでしまうと、その仮想マシンは実質的にはシステム全体をコントロールできてしまいます。これゆえに、USBキューブをまったく信頼しないで使う場合と比べて、キーボードその他のインターフェイスデバイスをつないで信頼したUSBキューブを使う場合その利点はずっと少なくなります。
最も高度なセキュリティが必要な場合はUSBマウスを使わずにタッチパッドのみで操作するのが望ましいようです。
USBキーボード
上記のようにUSBマウスを使うことにはそれほどのリスクは無いのに対して、USBキーボードを使うことはかなりの危険性を伴います。BadUSBはキーボードであるかのように振る舞い、邪悪なコマンドを入力しシステムを乗っ取ろうとするものが多いのです。BadUSBがPCに接続されたときにUSBキーボードを利用していると、そのような悪意あるコマンドが一瞬のうちに入力される危険性があります。これゆえに基本的にはUSBキーボードの使用は避けるべきです。
ノートPCユーザーがどうしてもUSBキーボードを使いたい場合は、信頼できないUSB機器と同時に利用しないでください。現在sys-usbはディスポーザブルになっていて、再起動するとマルウェアフリーのクリーンな状態に戻ります。USBキーボードを使う前に一旦 sys-usbを再起動するとよいでしょう。
デスクトップPCでUSBキーボードしか利用可能でない場合はリスクを承知でUSBキーボードを使わざるをえません。USB攻撃のリスクがあったとしてもそれ以外のセキュリティが得られることを考えればQubes OSを使うメリットは大きいので、デスクトップ機でQubes OSを使うことをためらう必要はありません。攻撃者側もQubes OSであることを想定したコードを予めBadUSBに仕込んでおく必要があるので、Qubes OS利用中にUSB攻撃が成功してしまう可能性は現実問題としてはそんなに高くはないとも考えられます。
なおデスクトップPCでPCIエクスプレスの拡張スロットが余っている場合、そこにUSB増設ボードを取り付けることでUSBキーボード利用に伴う被害リスクを抑えることが可能です。この場合増設したUSBボードは dom0に直接つなげて、dom0にキーボードが直接つながる状態にします。信頼できないUSB機器は従来のUSBポートにつなぐようにしてsys-usbの管轄下に置き、キーボードと分離するわけです。詳細は Qubes のマニュアルを見てください。ただしやり方を間違えるとログイン前の LUKSパスフレーズの入力が不可能になってQubes OSからロックアウトされる事故が起きやすいので、このテクニックは初心者にはおすすめしません。
Qubes Global Configでの USB入力機器の設定
USBキーボードの使用を禁止したいとき、USBマウスを接続するとdom0につなぐポップアップが出るようにしたいときなど、USB入力機器をPCに接続した際の振る舞いを設定するには Qubes Global Config を用います。
画面左上Q - 歯車アイコン - Qubes Tools - Qubes Global Config の順に選んで、Qubes Global Config を起動します。左側の欄から USB Devices のタブをクリックします。

メインウィンドウの USB Input Devices の下には以下のように書いてあります。
USB input devices, especially keyboards, are a significant security risk. If you're not using a USB keyboard, USB mouse, USB touchscreen, or USB tablet, you can disable them here. (Note Laptop built-in keyboards are usually not USB keyboards.)
(訳) USB入力デバイス、特にキーボードは重大なセキュリティリスクです。USBキーボード、USBマウス、USBタッチスクリーン、USBタブレットを使用しないのであれば、ここで無効にすることができます。(ノートパソコンの内蔵キーボードは通常USBキーボードではありません。)
Keyboard: の右横のドロップダウンメニューから disable を選んでおくと、USBキーボードを接続したときにエラーメッセージが出てキーボードの接続が拒否されるようになります。デスクトップPCでUSBキーボードしかキーボードが使えない人はここは enable のままにしておいてください(下手にいじるとPCが操作不能になります)。
Mouse: の右横のドロップダウンメニューから always ask を選んでおけば、USBマウスを接続するとマウスを接続するためのダイアログが出てユーザーが操作して始めてマウスが使えるようになります。Bluetoothマウスを使いたい場合もここを always ask にしておいてください。
設定を変更したら OKボタンまたは Applyボタンを押して変更を適用します。
ブロックデバイス(USBメモリ、外付けHDD/SSD、SDカード等)の使い方
このセクションではUSBメモリなどブロックデバイスの使い方を解説します。USB関連でブロックデバイスといったら外付けの記録装置のことだ程度の理解でいいと思います。USBメモリが代表例ですが、外付けのハードディスクやSSDもほぼ同様に使えます。
以下の例では FAT32でフォーマットされた16GBのUSBメモリを使っていきます。今からやっていくのはpersonal キューブからこのUSBメモリに対してファイルの読み書きを行うことです。
まずはUSBメモリをQubes OSが動いているPCに差し込みます。すると以下のようなポップアップが現れます。

sys-usbが作成されたQubes OSではUSB機器が差し込まれるとその機器はsys-usbで認識されます。USBメモリを接続したあと sys-usb のターミナルから lsusb コマンドを実行すると以下のように新しいUSB機器が表示されると思います。
[user@sys-usb ~]$ lsusb (略) Bus 002 Device 007: ID 13fe:5500 Phison Electronics Corp. Flash drive (略)
シリコンパワーのUSBのはずですが中身は ファイソン・エレクトロニクスという台湾企業のUSBメモリのようです。
さらに sys-usbで lsblk コマンドによりブロックデバイスを表示すると /dev/sda に 14.8G のデバイスが新たにできているのでこれがUSBメモリです。また /dev/sda1 がUSBメモリ内のFAT32でフォーマットされたパーティションです。なお /dev/xvdaから /dev/xvddまでは仮想のディスク領域で、sys-usbのシステムやユーザーデータを扱う領域です。
[user@sys-usb ~]$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 1 14.8G 0 disk └─sda1 8:1 1 14.8G 0 part xvda 202:0 1 20G 0 disk (略)
personal キューブにこのUSBメモリをつなげます。まずは personal キューブを起動しておいてください。
スクリーン右上の通知領域にデバイスを扱うためのアイコン
があります。このアイコンはUSBメモリの形を表しているようです。少し前まではこういうアイコン
でしたが 2024年4月くらいに変更になりました。このアイコンをクリックすると以下のようなメニューが表示されます。

ドロップダウンメニューの中にUSBメモリ関連の項目が3つもあって分かりにくいです。一番上の Data (Block) Devices のところに2つの "Silicon-Power 16G()" というアイテムがあり、さらに一番下の USB Devices のところに UFD_3.0_Silicon-Power16G... というアイテムが1つあります。
USBメモリなどのブロックデバイスを使う場合は上にある Data (Block) Devices の方を使います。一番下の USB Devices のところのアイテム(この例ではUFD_3.0_Silicon-Power16G... のところ) は使いません。
では Data (Block) Devices の中からどれを使えばよいのか、 上の表記では何がなんだか分からないと思います。 "Silicon-Power 16G()"が2つありますが、正解を言うと上の "Silicon-Power 16G()"が sys-usbの /dev/sda を指していて、下の "Silicon-Power 16G()" が sys-usbの /dev/sda1 を指しています。簡単に使えるのは上にある /dev/sda の方です。
それでは上記画像のように上側の "Silicon-Power 16G()"をクリックして、Attach to qube のメニューから personal キューブをクリックしてください。これで /dev/sda が personal キューブに接続されます。
接続すると以下のようなポップアップが出ます。

このあと再度スクリーン右上のアイコン
をクリックするとUSBメモリが personalキューブにアタッチされていると表示されます(一番上のアイテムで sys-usb → personal と表示されているところ)。

personalキューブのファイルブラウザを開いてください。
するとファイルブラウザの左側ペイン内の下のほうに "16GBボリューム" という項目があるのが分かると思います。これがUSBメモリ内部のパーティションです。

この "16GBボリューム" をクリックするとUSBメモリがマウントされてUSBメモリ内部が表示されます。

USBメモリの中にあらかじめ作成しておいた test ファイルがあるのが見えます。以下はこのファイルを Mousepad で編集しているところです。

こうして personalキューブで自由にUSBメモリを使えるようになりました。personalキューブとUSBメモリの間でファイルのコピーアンドペーストなどもできます。
ブロックデバイスをアタッチしたキューブでは何が起きているのか
personalキューブのターミナルを開いてください。そこから lsusb コマンドと lsblk コマンドを実行したのが以下の出力です。
[user@personal ~]$ lsusb [user@personal ~]$
lsusbコマンドを実行しても何も表示されません。つまり personal キューブには usb機器は接続されていません。
[user@personal ~]$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS xvda 202:0 1 20G 0 disk ├─xvda1 202:1 1 200M 0 part (中略) xvdi 202:128 1 14.8G 0 disk └─xvdi1 202:129 1 14.8G 0 part /run/media/user/4F1D-92CC
一方 lsblk コマンドによりブロックデバイスを表示するとその中の xvdi と xvdi1のところにUSBメモリの情報が表示されます。
以下のようにこれらは /dev/xvdi と /dev/xvdi1 というブロックデバイスとして認識されています。
[user@personal ~]$ ls /dev/xvdi* /dev/xvdi /dev/xvdi1
USBとして認識しているのは sys-usb の中の話であって、sys-usb がそのUSBの中にあるブロックデバイス の /dev/sda/ を personalキューブに貸しているような状態です。 そしてpersonalキューブではそれを仮想のブロックデバイスである/dev/xvdi として認識しています。
このような仕組みによって USBメモリのマイクロコントローラやファームウェアが悪意あるものに改ざんされていてもそれにより直接攻撃を受けるのは sys-usb の方です。これにより personalキューブはこのようなUSB攻撃から守られているわけです。
sys-usbを用いても攻撃を受けるリスクは依然として残る
ではpersonalキューブは完全に安全なのかというと残念ながらそうではありません。Qubes OS開発者Joanna Rutkowskaはそのブログ4の中でUSB攻撃には"物理的な攻撃"以外にもソフトウェア・アタックと呼ぶべき種類の攻撃があると警告しています。このRutkowska(2011)で指摘されている攻撃の一つは、パーティションテーブルを改ざんしてOSを乗っ取るタイプです。またファイルシステムのメタデータを改ざんする手法もありえるそうです。別の論文 Rutkowska(2014)5 p.5では LUKSのヘッダーを改ざんしてOSを乗っ取る攻撃の可能性も指摘されています。
パーティション・テーブルやLUKSのヘッダーを改変するのは遠隔からでも実行可能なことには特に注意が必要です。例えばWindows や Ubuntuがすでに遠隔から攻撃者に乗っ取られていて、そのパソコンでUSBメモリ・ハードディスクを使用しているときにパーティションテーブル等が改ざんされた後、そのUSB機器を Qubes OS内のpersonalキューブにつないでしまうとpersonalキューブもやはり攻撃者に乗っ取られてしまうリスクがあるのです。
さらには改ざんされたファイルがUSB経由で侵入するリスクも考えないといけません。これはPDFファイルや動画ファイルあるいは圧縮ファイルなどが改ざんされ、そのようなファイルを取り扱うアプリケーション(PDFリーダー、動画プレーヤー、圧縮・解凍ライブラリなど)のゼロデイ脆弱性をついてOSを乗っ取るタイプの攻撃です。Rutkowska(2014)はこのようなファイルの改ざんは "even more significant attack surface" だと指摘しています。
USBの攻撃というと攻撃者が物理的に被害者に何らかの形で近づかないと無理であると認識している人が多いですが、これは誤りです。地球の裏側からでもUSB攻撃は可能なのです。しかもエアギャップと呼ばれるインターネットに接続していないコンピュータでもユーザーが改変されたUSBをつないでしまうとこのような攻撃は成功します。
上記のような攻撃リスクを考えるとsys-usb の仕組みにも限界があることが分かります。では一体何のために sys-usb があるのでしょうか。それは dom0 をUSB攻撃から守り、Qubes OS全体の安全を保つことです。さらにはUSBを一切使わない、USB経由のファイルも取り込まない隔離されたキューブをUSB攻撃から守る意味合いがあるのです。
USB機器を利用しているキューブからUSBの接続を解除する(デタッチする)
現在 personalキューブに USBメモリがつながっている状態ですが、USBメモリをpersonalキューブから外してみます。まだUSBメモリの領域がマウントされている場合はまずはアンマウントしたほうが安全だと思います。personalキューブのファイルブラウザから左側ペインで USBメモリを表しているところ(以下の例では 16GBボリューム)を右クリックして、マウント解除を選んでください。

マウントを解除したらUSBをpersonalキューブから外すために、スクリーン右上の
をクリックすると出てくるドロップダウンメニューから以下のように "Detach from personal" をクリックしてください。

このあと USBメモリ本体をパソコンから抜いて作業は終了です。
SDカードをディスポーザブル・キューブに接続する
今度はSDカードを使えるようにします。SDカードをPCのスロットに差し込みます。すると以下のようなポップアップが出ました。

スクリーン右上の
を押すと以下のようなデバイスに関するメニューが表示されました。

SDカードの場合は Data (Block) Devices のところにだけアイテムが表示されて、USB Devices には表示なしです。Data (Block) Devices の上側の "()" という意味不明な表示が SDカード本体です。さらにその下の (SD-DATA) はSDカードの中のパーティションです。このSD-DATAというのは私が予めつけておいたラベルですので、ラベルをつけてなければ単なる () で表示されるはずです。
今回は personalキューブではなくて、ディスポーザブルキューブにSDカードをつないでみます。
まず 上側の () の表示のところをクリックすると左側のドロップダウンメニューが追加されますが、その下方の Attach to new disposable qube: 以下にある default-dvm をクリックすると fedoraベースのディスポーザブルが起動してそこに SDカードがアタッチされます。
新しいディスポーザブルが起動し終わったら、スクリーン右上の水色キューブ
をクリックしてそのディスポーザブルのファイルブラウザを開きます。

ファイルブラウザの左下のほうにある デバイス の "ファイルシステム"の下に SD-DATA という表示があり、これが SDカードのパーティションです。

このSD-DATAの箇所をクリックするとパーティションをマウントして、SDカードの中のデータが以下のように表示されます。

利用を終えたらSD-DATAのところを右クリックしてマウント解除を選択しアンマウントしてください。
つづいてスクリーン右上
からデタッチします。ディスポーザブルをまだ使いたい場合は Detach from disp#### の方を押します。ディスポーザブルをシャットダウンしてよければ下側の Detach and shut down disp#### を押してください。

デタッチが終わってからパソコンから SDカードを抜いてください。
GNOME Disks を使ってUSBメモリのパーティションにラベルを付ける
ここではUSBメモリのパーティションにラベルを付けるやり方を解説します。なぜラベルを付けるのかというと、そうするとUSBのアタッチなどの作業がやりやすくなるからです。 パーティションにラベルを付けるときはコマンドを打つよりもGUIでやった方がずっと簡単なので、GNOME Disks を使うことにします。まだインストールしていない場合は fedoraのテンプレートから gnome-disk-utility をインストールしてください。
[user@fedora-39-xfce ~]$ sudo dnf install gnome-disk-utility
インストールが終わったらテンプレートキューブ(上の例ではfedora-39-xfce)をシャットダウンします。fedora テンプレートがシャットダウンするよりも前に personalキューブを起動していた場合はpersonalキューブを再起動してください。
Dom0からコマンドラインでUSBブロックデバイスをアタッチする方法
最初にUSBメモリをパソコンに差し込みます。 これまでと同様にGUIを用いる方法で USBメモリをアタッチしてもいいのですが、今回はdom0のターミナルからコマンドラインを使う方法を紹介します。personalキューブにアタッチするのであらかじめ personalキューブを起動しておいてください。
Dom0のターミナルを開いて qvm-block というコマンドを入力します。
[ft7777@dom0 ~]$ qvm-block BACKEND:DEVID DESCRIPTION USED BY sys-usb:sda Silicon-Power16G () sys-usb:sda1 Silicon-Power16G ()
Qubes OSにつながっている外付けのブロックデバイスの一覧が表示されました。シリコンパワーの16GBのUSBメモリは sys-usbの /dev/sda として認識されています。またその中のパーティションは sys-usb の /dev/sda1 として認識されています。USED BY の欄は空白なのでまだ sys-usb から他のキューブにつなげていない状態です。
qvm-block は qvm-device block の省略形だそうです。このコマンドの使い方の詳細は dom0から man qvm-device をご覧ください。
フォーマットやパーティションの編集をする場合はUSBメモリ全体を使うので、パーティションだけのsys-usb:sda1 ではなく USBメモリ本体のsys-usb:sda の方をアタッチする必要があります。
USBメモリを personalキューブにアタッチするために以下のコマンドを実行します。
[ft7777@dom0 ~]$ qvm-block attach personal sys-usb:sda
次のコマンドによってpersonalキューブに実際にアタッチされたことを確かめることができます。
[ft7777@dom0 ~]$ qvm-block ls personal BACKEND:DEVID DESCRIPTION USED BY sys-usb:sda Silicon-Power16G () personal (read-only=no, frontend-dev=xvdi)
それでは personalキューブから GNOME Disks を起動します。personalキューブのターミナルから以下のコマンドを打ちます。
[user@personal ~]$ gnome-disks &
GNOME Disks が起動しました。

GNOME Disksウィンドウ左にあるディスク一覧から USBメモリの/dev/xvdi (この例では16GBブロックデバイス)をクリックします。

USBメモリの /dev/xvdi が表示されたら画面中央のやや左付近にある歯車アイコンをクリックすると以下のようにメニューがあらわれます。

"ファイルシステムを編集" という箇所をクリックします。そうすると以下のようなポップアップが出ます。"ファイルシステムを編集"するといっても操作可能なのはラベルの編集だけです。ここに何か好きなラベル名を入力してください。

ここでは SP16G-DATA という名前にしました。変更ボタンを押してラベルを付与します。
以下のとおり新たに SP16G-DATA というラベルが付きました。

ここから先やっていく作業内容は一旦USBメモリを personalキューブからデタッチして、さらにパソコンからも外してからUSBメモリを挿し直すことです。
もしもpersonalキューブ上でUSBメモリをマウントしていたら最初にアンマウントしてください。
Dom0からコマンドラインでUSBブロックデバイスをデタッチする方法
デタッチもdom0からコマンドでやりましょう。最初に qvm-block あるいは qvm-block ls personal コマンドでブロックデバイスの一覧を確認します。
[ft7777@dom0 ~]$ qvm-block BACKEND:DEVID DESCRIPTION USED BY sys-usb:sda Silicon-Power16G () personal (read-only=no, frontend-dev=xvdi)
次にUSBメモリをデタッチします。
[ft7777@dom0 ~]$ qvm-block detach personal sys-usb:sda
このあと USBメモリをPCから外して、もう一度差し込みます。
そして今度は GUIでアタッチしてみます。スクリーン右上経由でブロックデバイスを確認すると以下のようになっています。今度はUSBメモリ全体が "Silicon-Power 16G()", その中のパーティションが "Silicon-Power 16G(SP16G-DATA)" と表示されて区別がつくようになりました。

このようにパーティションには必ずラベルを付けるようにすることで、USBメモリやUSBハードディスクを接続したとき Qubes OS上でどのパーティションなのかあるいはUSB全体なのか等の区別がつくようになります。
上の図にあるように personalキューブでUSBメモリを使う場合は、上側にあるラベルなしの "Silicon-Power 16G()" などの表記のところをクリックすると sys-usb:sda のようなUSBメモリ全体を personalキューブにアタッチできます。
アタッチしたあと personal のファイルブラウザを開いてみます。すると以下のように USBメモリのパーティションのところに SP16G-DATA のラベルが表示されました。

こうしてファイルブラウザの SP16G-DATA のところをクリックすると中のパーティションがマウントされて以下の図のようにUSB内部のファイルにアクセスできるようになります。

Qubes OS上でUSBメモリをフォーマットしたい場合は、ここまでの解説に従ってどこかのキューブにUSBメモリ全体をアタッチし、そのキューブでGNOME Disks を起動してください。ディスポーザブルキューブにアタッチしてそこでGNOME Disks を使ってもいいと思います。GNOME Disks を起動してからは普通のLinuxと同様にフォーマット等の作業を行うだけです。
USBメモリ等のパーティションだけをキューブにアタッチする方法
ここまでは sys-usbの /dev/sda のようなUSBメモリ全体を他のキューブにアタッチしてきました。そうではなく /dev/sda1 のようなUSBメモリ内部のパーティションをアタッチする方法について解説します。
USBメモリ全体ではなくパーティションのみを例えば personalキューブにアタッチすれば、personalキューブはUSBメモリのパーティションテーブルを解析せずにすみます。パーティションテーブルが改ざんされていた場合に攻撃を受けるのは sys-usbだけで、personalキューブは助かります。ただしファイルシステムのメタデータの改ざん、暗号化関連でLUKSのヘッダーの改ざん、中に入っているPDFファイルなどの改ざんのような攻撃により personalキューブが被害を受けるリスクは依然として残っています。
Qubes 公式マニュアルでは次のように書いてあります。
Note: attaching individual partitions (e.g. sys-usb:sda1) can be slightly more secure because it doesn’t force the target app qube to parse the partition table.
(訳) 注: sys-usb:sda1のような個別のパーティションをアタッチするほうが少しだけ安全です。というのもターゲットのAppキューブがパーティションテーブルを解析することがないからです。
パーティションをアタッチする場合は、残念ながら自動マウントしてくれないのでマウントの作業を手動で実行する必要があり少し面倒になります。面倒を避けたいときは、少しだけセキュリティが弱くなることを承知の上で USBメモリ全体(sys-usb:sdaのほう)をアタッチしてください。
それでは今度はパーティションの方を sys-usbから personalキューブにアタッチします。 USBメモリは一旦PCから抜いて挿し直してください。
以下の画面で上から2番目の パーティションのラベル SP16G-DATA があるところをクリックしてから、左のドロップダウンメニューから personal を選んでください。

これで personalに SP16G-DATAパーティションがアタッチされました。Dom0のターミナルから qvm-block コマンドを実行してアタッチの結果を確認してみましょう。
[ft7777@dom0 ~]$ qvm-block BACKEND:DEVID DESCRIPTION USED BY sys-usb:sda1 Silicon-Power16G (SP16G-DATA) personal (read-only=no, frontend-dev=xvdi)
この出力によれば sys-usb:sda1 のパーティションは personal キューブの xvdi としてアタッチされています。上の方でUSBメモリ全体 sys-usb:sda をアタッチしたときパーティション sys-usb:sda1 は personalキューブ内で xvdi1 のように数字がついたのに対して、今回は数字なしの xvdi であることに注意してください。つまり今回は USBのパーティションが /dev/xvdi1 ではなく /dev/xvdi というデバイスとして認識されています。
次に このパーティションを personalキューブ内でマウントします。
personalキューブのターミナルを開いてください。lsblk コマンドで personalキューブ内のブロックデバイスを確認すると以下のように /dev/xvdi のみ認識されていて、/dev/xvdi1 は存在しません。
[user@personal ~]$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS xvda 202:0 1 20G 0 disk (中略) xvdi 202:128 1 14.8G 0 disk
ここではマウントするために udisksctl コマンドを使ってみます。mount コマンドに比べるとユーザー権限のみでマウントできて sudo を付ける必要がないなどのメリットがあります。
[user@personal ~]$ udisksctl mount -b /dev/xvdi Mounted /dev/xvdi at /mnt/removable
ブロックデバイスをマウントするときは udisksctl mount -b [/devで始まるデバイスへのパス] という書式です。-b はブロックデバイスの意味です。
udisksctlコマンドの出力で Mounted /dev/xvdi at /mnt/removable というメッセージが出ました。マウントポイントは /mnt/removable になったので、ここにアクセスするとUSBメモリのパーティション内のファイルを使用できます。以下はファイルブラウザにて /mnt/removable を表示しています。

USBメモリを使い終えたらアンマウントします。アンマウントするには以下のコマンドを personalのターミナルから入力します。
[user@personal ~]$ udisksctl unmount -b /dev/xvdi Unmounted /dev/xvdi.
Unmounted /dev/xvdi. という出力が出たらアンマウント成功です。エラーが出てアンマウントできない場合はファイルブラウザなどでまだUSBメモリ内にアクセスしていないかチェックしてください。
上の例では コマンドラインから udisksctl を用いましたが、GNOME Disksを使ってマウント・アンマウントすることも可能です。以下のGNOME Disks ウィンドウにある
の箇所を押すとUSBメモリのパーティションをマウント・アンマウントできます。

LinuxのISOファイルからライブUSBを作成する
Qubes OS上でLinuxなどのISOファイルをUSBにコピーしてライブUSBを作成したい場合も、ISOファイルがあるキューブにこれまでと同様にUSBメモリ全体をアタッチして作業を行います。
以下の例ではディスポーザブルの disp4835 というキューブに Linux Mint 21.3の CinnamonエディションのISOが既にダウンロードしてあり、それを用いてライブUSBを作成します。 なおキューブ上でLinuxのISOファイル等の巨大ファイルをダウンロードするときはあらかじめキューブの Settings からストレージのサイズを大きくしておいてください。デフォルトでは 2GBしかないので大抵の場合キューブ内のストレージ容量が不足します。以下の図の Private storage max size のところを適切に調整してからISOファイルをダウンロードしてください。

まずはISOファイルのあるキューブに USBメモリをアタッチします。USBメモリをPCに挿してからスクリーン右上の
アイコンをクリックします。USBメモリ全体の方をアタッチすることに注意してください。USBメモリ全体は以下の画面では上側のアイテムです。それを disp4835にアタッチします。

なおISOファイルをUSBメモリに焼く場合、USBメモリ内に保存されたファイルは失われるので必要なファイルはどこかにバックアップをとってから以下の作業を行ってください。
アタッチしたキューブ(この例では disp4835) のターミナルから lsblkコマンドを実行すると
[user@disp4835 ~]$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS xvda 202:0 1 20G 0 disk (中略) xvdi 202:128 1 14.8G 0 disk └─xvdi1 202:129 1 14.8G 0 part
という表示が出ました。/dev 以下のxvdi関係のデバイスを ls コマンドで確認してみます。
[user@disp4835 ~]$ ls -l /dev/xvdi* brw-rw----. 1 root disk 202, 128 6月 3 21:02 /dev/xvdi brw-rw----. 1 root disk 202, 129 6月 3 21:02 /dev/xvdi1
USBメモリ全体が /dev/xvdi です。数字1がついている /dev/xvdi1 はUSBメモリ内部のパーティションです。ddコマンドまたはcpコマンドで iso をコピーするターゲットはUSBメモリ全体をあらわす /dev/xvdi の方です。
ここでLinux Mint Cinnamonエディションの iso ファイルは /home/user/Downloads/以下にあるものとします。以下では cp コマンドでライブUSBを作成します。syncコマンドを後ろに付けておくと完全に書き込みが終わってからコマンド全体が終了するので書き込み失敗を防ぐことができます。
[user@disp4835 ~]$ sudo cp /home/user/Downloads/linuxmint-21.3-cinnamon-64bit.iso /dev/xvdi && sync
書き込みが終了したあと、このキューブから USBメモリをデタッチしてください。
このあとパソコンを再起動させUSBメモリから起動したところ以下のように Linux Mint 21.3 Cinnamon Edition が無事立ち上がりました。

USB接続の光学ドライブ
Qubes OSで CD, DVDを使いたい場合はUSB接続の光学ドライブを使います。光学ドライブはファイルを扱うのでブロックデバイスなのかと勘違いしやすいですが、Qubes OS内部ではBlock Devicesではなく USB Devices の一つとして扱われています。
(円盤の入っていない状態の)光学ドライブをUSB経由でパソコンに接続します。このあとスクリーン右上の
アイコンをクリックすると

USB Devices の一覧中に
音楽CDの場合は .wav ファイルが扱えるアプリケーションが当該キューブで利用可能になっている必要があります。DVDを見る場合なら DVDのデコードが可能なソフトが入っていないといけません。
Snap版 の VLCを入れておくとDVD閲覧もwav再生もできて便利です。Snapを利用するときはこのブログの以前のエントリーを参考にしてください。
VLCを入れたいキューブで次のように snapのVLCを検索してみます。
user@music:~$ snap find vlc Name Version Publisher Notes Summary vlc 3.0.20-1-g2617de71b6 videolan✓ - The ultimate media player (後略)
公式のアプリにはvideolan✓のようにチェックマークがついているのでこれをインストールしてください。
user@music:~$ snap install vlc
光学ディスクドライブに再生したいCD等を入れます。光学ディスクドライブをアタッチしたキューブの Thunar ファイルブラウザを見ると

このように左側下のところにCDデバイスの「オーディオ⋯」という項目が現れました。
そしてこの「オーディオ⋯」のところをクリックするとCDを回転させる光学ドライブの音が聞こえてきてしばらくすると、以下のように中身の音声ファイルが表示されました。

以下はこの中のwavファイルをVLCで再生させているところです。

使い終わったらCDをイジェクトして取り出してから、使用しているキューブから光学ドライブをデタッチさせます。
なお以上はFedoraテンプレートベースのキューブで実行した例です。このブログ執筆時点(2024年6月)ではDebianテンプレート系のキューブでCDを再生しようとするとエラーが出てしまいCDの中身が認識できませんでした。
Webカメラ
Webカメラも実はUSB機器の一つです。ノートPCに内蔵されたWebカメラもUSB機器として認識されています。
sys-usbのターミナルから lsusb コマンドで調べてみると内蔵のWebカメラが表示されます。
user@sys-usb:~$ lsusb | grep -i cam Bus 004 Device 003: ID 0c45:6d1a Microdia Integrated_Webcam_HD
Webカメラを使うキューブに対して以下のようにアタッチするとWebカメラが使えるようになります。

cheese などのカメラ関係のソフトをインストールして、カメラが機能することを確かめてください。
Bluetooth マウス
ブルートゥースはコンピュータの内部でUSBに接続されているそうです。これゆえ Qubes OSではブルートゥースは sys-usb が管理しています。ブルートゥースのあるPCで sys-usbが作成してある場合、以下のように lsusb コマンドを sys-usbのターミナルから実行するとブルートゥース機器が表示されるはずです。
[user@sys-usb ~]$ lsusb | grep -i bluetooth Bus 004 Device 002: ID 8087:0032 Intel Corp. AX210 Bluetooth
fedora-39-xfceテンプレートにはデフォルトでブルートゥース関連のパッケージがインストールされています6。しかしブルートゥース関連のサービスは自動起動しない設定になっているのでブルートゥースのアイコン等は見当たらないと思います。
ブルートゥースを使いたい人は dom0 のターミナルから以下のコマンドで sys-usb で blueman のサービスを自動起動するように設定してください。
[ft7777@dom0 ~]$ qvm-service --enable sys-usb blueman
このあと sys-usb を再起動させるか、または sys-usb のターミナルから blueman-applet & を実行するとスクリーン右上の通知領域に下図のようにブルートゥースのアイコン
が現れます。ブルートゥースのアイコンは普通は青ですが、sys-usbのテーマカラーによって赤くなっています。

このブルートゥースのアイコンを使ってブルートゥース・マウスを接続してみます。 最初にブルートゥース・マウスの電源を入れておきます。またマウスのマニュアルを見てマウスから電波を発信する方法を調べておいてください。
ブルートゥースアイコンをクリックすると出てくるウィンドウで "検索" ボタンを押下します。

マウスから電波が出ていればしばらくすると以下のようにマウスが検知されるはずです。マウスの部分をクリックしてから鍵マーク
のところをクリックするとペアリングしてマウスと通信できるようになります。

マウスを利用するには USB接続のマウスと同様にdom0につなげる必要があります。Qubesのグローバル設定( Qubes Global Config)からマウスが使えるようになっていれば以下のようにdom0につなげてよいか聞かれます。

OKボタンをクリックするとブルートゥース・マウスが使えるようになります。
Qubes OS 4.2のデフォルトで sys-usbはディスポーザブルキューブになっています。このせいで前回起動時にブルートゥース機器をペアリングして信頼したことを再起動するとsys-usbは忘れてしまいます。ペアリングの作業を毎回するのが面倒な場合はこちらのQubes OSフォーラムのエントリーを参照してください。
Androidスマホ・タブレットとUSB経由で接続
AndroidデバイスをUSB経由でQubesにつないでファイルの転送をやる場合、執筆時点(2024年6月)ではバグがあって残念なことに sys-usb以外のキューブではうまく使えません。
以下の画像にあるようにandroid機器は USB Devices として認識されて、これを他のキューブにアタッチすることまではできます。そのあとアンドロイド機器をマウントしようとするとエラーが発生してマウントに失敗します。

sys-usbは赤いテーマカラーになっていて "危険"なキューブです。ここで Android のファイルを扱わざるを得ないのは好ましくない状況です。しかしQubes OS R4.2で sys-usbはディスポーザブルになっているので、仮にBadUSBで一旦感染しても再起動すればクリーンな状態に戻ります。このような事情があるのでAndroid をPCにつなぐ前に一旦 sys-usbを再起動してください。
AndroidデバイスをUSBケーブルでPCにつないだあと、sys-usbのファイルブラウザを立ち上げます。するとウィンドウ左下に Android のアイコンが出てきます。

AndroidとPC間でファイルをやり取りする場合は MTP (media transfer protocol) という機能を使います。Android側で 充電モードからMTPモードに適切に変更してください。
そのあと sys-usbのファイルブラウザから Androidのアイコンをクリックすると Androidデバイスがマウントされて中のファイルを扱えるようになります。

Androidデバイス内のファイルを例えば personalキューブにコピーしたい場合は、
- androidデバイス内から sys-usb内部のディレクトリに一旦コピー
- sys-usb内部のディレクトリから personalキューブに移動
という手順でコピーしてください。
作業終了後、sys-usbのファイルブラウザから Androidのところを今度は右クリックして "マウント解除"を選んでアンマウントしてから、USBケーブルをPCから抜いてください。
USB接続のプリンタ・スキャナ
この節ではUSBでパソコンにつながっているプリンタ及びスキャナの使い方を解説します。
Linuxでプリンタを使用するときには CUPS というアプリケーションが必要ですが、セキュリティ上の懸念があるからQubes OS内ではCUPSをデフォルトで走らせないほうがよいという提案がなされました。これを受けて Qubes OS4.2から CUPSのデーモンは明示的にユーザーが許可しないかぎり実行されません。また fedora-39-xfce テンプレートでは cups 自体がインストールされていません。
このCUPSの自動実行禁止措置によってQubes OS 4.2からプリンタが使いにくくなってしまいました。私自身プリンタを有効にしようとして悪戦苦闘しましたが、何とか動いたのでそのやり方を以下に示します。ただしプリンタを動かすのは機種によって、あるいは環境によってやり方が大幅に異なる可能性があります。
最近のプリンタは Internet Printing Protocol (IPP) というプロトコルを利用してドライバーなしで動かすことが可能です。IPPは本来ネットワーク上にあるプリンタを利用するためのプロトコルですが、IPP-USBという機能を利用してUSB接続のプリンタもIPPプリンタとして利用できます。Fedoraのマニュアルには以下のように書いてありました。
Most printers released since 2010 are capable of AirPrint or IPP Everywhere, which means they don't need to be installed to work - the device is found by Avahi and the print capabilities are communicated via IPP protocol - they are basically driverless devices. (2010年以降にリリースされたほとんどのプリンタは、AirPrintまたはIPP Everywhereに対応しており、動作するためにインストールする必要はありません - プリンタはAvahiによって検出され、印刷機能はIPPプロトコルを介して通信されます - 要するにドライバーレスのプリンタなのです。)
IPPプリンタの場合ドライバーをインストールする必要もないし、プリンタをあらかじめセットアップする必要もありません。アプリケーションから印刷を実行するとすぐにプリンタが見つかり、そのまま印刷できます。
プリンタが IPP over USB に対応しているかどうかチェック
プリンタがIPPプロトコルをサポートしているかどうかは以下のやり方で分かります。この方法はFedoraのマニュアルを参考にしました。パソコンにUSBケーブルでプリンタを接続し、プリンタの電源を入れてください。Qubes OSの場合 sys-usb にプリンタがつながります。sys-usbのコマンドラインから、まず lsusb コマンドを実行します。
[user@sys-usb ~]$ lsusb Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 001 Device 002: ID 0627:0001 Adomax Technology Co., Ltd QEMU Tablet Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 002 Device 006: ID 0bda:0129 Realtek Semiconductor Corp. RTS5129 Card Reader Controller Bus 002 Device 015: ID 04b8:1108 Seiko Epson Corp. EP-10VA Series Bus 003 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
エプソンのプリンタが Bus 002 Device 015 の状態で接続されています。次は lsusb に -v オプションを付けて実行するとUSB機器の詳細なデータが表示されます。プリンタに限定して表示するために -s オプションで Bus と Device を指定します。
[user@sys-usb ~]$ lsusb -v -s 002:015
Bus 002 Device 015: ID 04b8:1108 Seiko Epson Corp. EP-10VA Series
Couldn't open device, some information will be missing
Device Descriptor:
(中略)
Configuration Descriptor:
(中略)
Interface Descriptor:
(中略)
bInterfaceClass 7 Printer
bInterfaceSubClass 1 Printer
bInterfaceProtocol 4
iInterface 0
IPP Printer Descriptor:
(後略)
このような bInterfaceClassから始まる行で 7 - 1 - 4 の数字が並んでいれば、IPP over USB が使える証拠です。
IPP over USB が使えることが分かった場合、必要なパッケージをテンプレート・キューブにインストールし、プリンタを利用するキューブで CUPS等の必要なデーモンが走るように設定すればすぐにプリンタが使えるようになります。
上のFedoraマニュアルから引用した文章にもあるように Avahi というネットワーク上の機器を検知するデーモンが走ってないとIPPプリンタを見つけられません。IPP over USBを利用する場合でも Avahi は必要です。
IPPプリンタをUSB経由で利用するうえで必要となる主なパッケージは cups, avahi, ipp-usb です。これらは debian-12-xfce テンプレートにはデフォルトでインストールされていました。まずは debianテンプレートベースのキューブからプリントしてみます。
なおブリンターを使うときセキュリティ上注意しなければいけない点もあります。USB機器をアタッチするキューブは例えばファームウェアが改ざんされたプリンタから攻撃を受けるリスクがあります。またキューブ上で cups, avahiのデーモンが走ることによりアタックサーフェスが増大します。このためセキュリティを重視するキューブではプリンタを使わず、印刷内容をPDFファイルとして出力してそのファイルをプリンタ専用のキューブにコピーしてから印刷するのがベターです。
Debianテンプレートベースの printing キューブを作成してIPPプリンタを使用
では Debian テンプレートに基づく印刷専用のキューブを作成しましょう。Alt + F3 を押してから C R E (エンターキー) の順に入力するなどして Create New Qube を起動します。Name欄は printing など好きな名前を入力し、テーマカラーは自由に選んでください。Template の欄は debian-12-xfce にします。Applications のところに Print Settings を追加しておくといいと思います。これでよければ Create ボタンを押すと printing キューブが作成されます。

続いては新しい printing キューブの Settings ウィンドウを開いてください。その Services タブをクリックします。

Select a service のドロップダウンメニューから cups を選択してから、右上の + Add ボタンを押します。すると以下のように cups のサービスが動くように設定されます。

さらに Avahiのサービスも動くように設定します。ドロップダウンメニュー内には avahi が見当たらないので自分で書き込む必要があります。以下のようにサービス選択のドロップダウンメニューの一番下の (custom...) をクリックして +Add ボタンを押します。

小さいポップアップウィンドウが開くのでそこに avahi と入力してOKを押します。

これで以下のようにprinting キューブにおいて cups と avahi のサービスが使えるようになります。Apply ボタンまたは OKボタンを押して設定を有効にしてください。

なおここまで説明してきた cupsなどのサービスを有効にするのは dom0のターミナルからも実行できます。Dom0からprintingキューブの cups と avahiのサービスを有効にするには以下のようにします。詳細は dom0のターミナルから man qvm-service を閲覧してください。
[ft7777@dom0 ~]$ qvm-service printing cups on [ft7777@dom0 ~]$ qvm-service printing avahi on [ft7777@dom0 ~]$ qvm-service printing cups on avahi on
つぎは printingキューブから印刷できるか試してみます。printingキューブを起動してください。スクリーン右上の
をクリックして printing キューブにプリンタをアタッチします。

何か印刷が使えるアプリケーションを起動して印刷できるか確認します。ここではFirefoxを使います。Firefoxで印刷したいWebページを見つけたら Ctrl + P を押すと印刷のダイアログが出ます。そこにはプリンタの選択欄があり、うまくいっていれば接続したプリンタの名前が見つかると思います。

実際に印刷できるか試してみてください。
うまくいかない場合は avahi-daemon, cups, ipp-usb のデーモンが running の状態になっているか以下のようなコマンドで確認してください。なお実際にプリンタをアタッチしてから、あるいは、印刷のダイアログを出してからようやくデーモンがスタートするケースもあります。少なくともプリンタをキューブにつないでから以下のコマンドを打つとよいでしょう。
user@printing:~$ systemctl status avahi-daemon
● avahi-daemon.service - Avahi mDNS/DNS-SD Stack
Loaded: loaded (/lib/systemd/system/avahi-daemon.service; disabled; preset>
Drop-In: /usr/lib/systemd/system/avahi-daemon.service.d
└─30_qubes.conf
Active: active (running) since Thu 2024-06-27 19:54:09 JST; 41s ago
TriggeredBy: ● avahi-daemon.socket
Main PID: 1231 (avahi-daemon)
Status: "avahi-daemon 0.8 starting up."
Tasks: 2 (limit: 385)
Memory: 1.2M
CPU: 25ms
CGroup: /system.slice/avahi-daemon.service
├─1231 "avahi-daemon: running [printing.local]"
└─1236 "avahi-daemon: chroot helper"
user@printing:~$ systemctl status ipp-usb
● ipp-usb.service - Daemon for IPP over USB printer support
Loaded: loaded (/lib/systemd/system/ipp-usb.service; static)
Active: active (running) since Thu 2024-06-27 19:54:09 JST; 58s ago
Docs: man:ipp-usb(8)
Main PID: 1237 (ipp-usb)
Tasks: 11 (limit: 385)
Memory: 7.7M
CPU: 24ms
CGroup: /system.slice/ipp-usb.service
└─1237 /sbin/ipp-usb udev
user@printing:~$ systemctl status cups
● cups.service - CUPS Scheduler
Loaded: loaded (/lib/systemd/system/cups.service; enabled; preset: enabled)
Drop-In: /usr/lib/systemd/system/cups.service.d
└─30_qubes.conf
Active: active (running) since Thu 2024-06-27 19:51:24 JST; 3min 48s ago
TriggeredBy: ● cups.path
● cups.socket
Docs: man:cupsd(8)
Process: 604 ExecStartPost=/usr/lib/qubes/init/control-printer-icon.sh (cod>
Main PID: 579 (cupsd)
Status: "Scheduler is running..."
Tasks: 1 (limit: 385)
Memory: 3.3M
CPU: 25ms
CGroup: /system.slice/cups.service
└─579 /usr/sbin/cupsd -l
Warning: some journal files were not opened due to insufficient permissions.
試しに dom0から printingキューブの avahiサービスを一旦 off にしてから printingキューブを再起動後、プリンタをアタッチしたところ cups, ipp-usbのデーモンは正常に実行されましたが、avahi-daemonは以下のように inactive (dead) となってしまいました。この状態で印刷をしようとするとプリンタが見つけられませんでした。
user@printing:~$ systemctl status avahi-daemon
○ avahi-daemon.service - Avahi mDNS/DNS-SD Stack
Loaded: loaded (/lib/systemd/system/avahi-daemon.service; disabled; preset: disabled)
Drop-In: /usr/lib/systemd/system/avahi-daemon.service.d
└─30_qubes.conf
Active: inactive (dead)
TriggeredBy: ● avahi-daemon.socket
Condition: start condition failed at Thu 2024-06-27 19:58:59 JST; 14min ago
└─ ConditionPathExists=/var/run/qubes-service/avahi was not met
上のメッセージを見ると " start condition failed " となっていてデーモンのスタートの条件を満たしていません。avahi サービスをオフにしていると "/var/run/qubes-service/avahi" というファイルが作成されずに avahi-daemon が走らないせいで、プリンタを見つけることができなくなったのです。
Debianベースのキューブからスキャナを使う
上で作成した printingキューブでスキャナも使ってみます。ここでは simple scan というアプリケーションを用います。もしまだインストールしていなかったら以下のように debian-12-xfceテンプレートから simple-scan をインストールしてください。
user@debian-12-xfce:~$ sudo apt install simple-scan
インストール後テンプレートをシャットダウンします。さらに printingキューブの Settingsから "Document Scanner" という項目をアプリケーションメニューに追加します。 printingキューブを再起動します。
printingキューブに複合機またはスキャナをアタッチします。その後 Document Scanner を起動します(これが Simple Scanです)。うまくいけば以下のように自動的にスキャナを検出します。

左上のスキャン・ボタンを押してスキャンできるか試してください。
プリンタと同様に最近のスキャナはドライバ無しのスキャンに対応しています。eSCL というApple系のプロトコルを利用する場合と WSD というマイクロソフト系のプロトコルを利用する場合の2つがあるようです。 airscan-discover というコマンドを使うと、eSCLまたはWSD対応のスキャナをネットワーク内から見つけます。ただしpringtingキューブではファイアウォールの内側にあるのでUSB接続のスキャナのみ探索可能です。airscan-discoverも Avahiを利用しているそうです。以下の画面は airscan-discoverでスキャナを見つけているところです。
user@printing:~$ airscan-discover [devices] EPSON EP-10VA Series (USB) = http://127.0.0.1:60000/eSCL/, eSCL
Fedoraテンプレート・ベースのキューブで IPPプリンタ・スキャナを使用
fedora-39-xfceテンプレートの場合 cups, avahi, ipp-usb等の必要なパッケージがデフォルトではインストールされていないようです。まずはそれらをインストールします。なおavahi, ipp-usbはcupsを入れると芋づる式にインストールされます。このほか system-config-printer というプリンタの設定に使うアプリは既にインストールされていますが、これが繰り返しユーザー名・パスワードの認証を求めるエラーを起こすのを回避するために cups-pk-helper のパッケージを入れておきます。さらにスキャナ用に simple-scanもインストールします。
[user@fedora-39-xfce ~]$ sudo dnf install cups cups-pk-helper simple-scan
インストール成功後 fedora-39-xfceテンプレートをシャットダウンします。
さきほど作成した printingキューブを debian-12-xfceベースから fedora-39-xfceベースに変更して fedoraベースのappキューブでも印刷・スキャンがうまくいくか試してみます。 printingキューブを起動中なら一旦シャットダウンします。printingキューブのセッティングウィンドウなどから printingキューブのテンプレートを fedora-39-xfceに変更してください。

すでに解説しましたが、プリンタを使うキューブではcups, avahi のサービスが有効になっている必要があります。
[ft7777@dom0 ~]$ qvm-service printing cups on avahi on
これらが off になっていた場合は有効化してください。
[ft7777@dom0 ~]$ qvm-service printing cups on [ft7777@dom0 ~]$ qvm-service printing avahi on
printingキューブを起動して Firefox などから IPP over USBで印刷できるか確認してください。

さらにスキャナもうまく機能するか確認してみてください。

IPP非対応のプリンタでドライバをインストールして印刷
IPPに対応していないプリンタはドライバをインストールしないと使えません。またIPP対応のプリンタでもIPPでは十分な性能が出ない懸念などからドライバをインストールしたいケースもあるでしょう。この節ではプリンタのドライバをインストールし、プリンタの設定を行ってから印刷をする方法を解説します。
プリンタの設定を行う場合、プリンタ関係の設定はルートディレクトリに保存されます。ということはappキューブでプリンタの設定をしてしまうと、キューブを再起動したときに未設定の状態に戻ってしまいます。永続的にプリンタの設定したい場合はテンプレートで設定するか、スタンドアローンという特殊なキューブで設定するかどらちかを選ぶ必要があります。テンプレートで設定する場合はプリンタというUSB機器をアタッチするか、あるいはローカルネットワークにあるプリンタと通信するかしないといけないので、テンプレートが攻撃を受けるリスクが否定できません。テンプレートで設定する場合は少なくともクローンしたテンプレートで設定することをおすすめします。この記事ではスタンドアローンを利用して印刷専用キューブを作成してプリンタの設定をする方法をとります。
スタンドアローン・キューブとはホームディレクトリだけでなくルートディレクトリも含めて自分自身で持つような独立したキューブです。キューブ作成時にテンプレートからルートディレクトリをコピーして作成されます7。スタンドアローン・キューブのルートディレクトリは永続的です。つまりルートディレクトリ内の変更は再起動後も維持されます。スタンドアローン・キューブ作成後テンプレートで行われたインストール・アップデートの作業やルートディレクトリ内の各種設定ファイルの書き換えはスタンドアローン・キューブには一切反映されません。スタンドアローン・キューブで行われたインストール・アップデートの作業やルートディレクトリ内の各種設定ファイルの書き換えもやはりテンプレートには一切反映されません。stand-alone は「独立型の」という意味です。
スタンドアローンでプリンタを設定すればルートディレクトリ内にある設定ファイルは再起動しても失われません。USB接続に伴う攻撃リスク、オープンソースでないドライバを入れることによるセキュリティリスクもスタンドアローンだけに限定できてテンプレートを守ることができます。
プリンタ用のスタンドアローン・キューブを作成
Create New Qube を起動してください。左側ペインにある Standalone をクリックします。Basic Properties の Name 欄は何か好きなキューブ名を付けてください。ここでは MyPrinting にしました。Label欄は好きな色を選んでください。
Clone from existing (既存のキューブからクローン) のところは Template or standalone qube のラジオボタンをクリックします。この例ではテンプレートの fedora-39-xfce を選びます。この選択によってMyPrintingキューブはFedoraベースのキューブになります。Applications のところでは +ボタンを押してから Print Settings を選んで、プリンタの設定アプリをMyPrintingキューブのアプリケーションメニューに追加しておきましょう。

これでよければ Createボタン押してスタンドアローンの MyPrinting キューブを作成します。キューブが作成されると Qube created successfully!というメッセージが出ます。
Dom0のターミナルから MyPrinting キューブの cupsサービスをオンにします。
[ft7777@dom0 ~]$ qvm-service MyPrinting cups on [ft7777@dom0 ~]$ qvm-service MyPrinting cups on
今回はUSB接続のプリンタを設定します。IPP over USBもネットワークプリンタも使わない場合 Avahi が動いている必要はありません。cupsのサービスが動作していればそれで十分です。
MyPrinting キューブにプリンタ・ドライバをインストール
私の持っているプリンタの1つは Canonの複合機で、ネットワーク機能が無くUSBのみでPCとつながるタイプのせいなのか IPP に対応していませんでした。また Canon 公式のWebサイトを見にいっても残念ながら Linux用のドライバは提供されていなかったです。しかしこのような Linux非対応のプリンタであっても、オープンソースのドライバが提供されているケースがあります。
MyPrintingのターミナルを起動してください。Fedoraのレポジトリにどんなプリンタ・ドライバがあるのか dnf を使って調べてみます。
[user@MyPrinting ~]$ sudo dnf search printer driver
メタデータの期限切れの最終確認: 0:01:51 前の 2024年07月07日 14時54分06秒 に実施しました。
====================== 名前 & 概要 一致: printer, driver =======================
printer-driver-brlaser.x86_64 : Brother laser printer driver
epson-inkjet-printer-escpr.i686 : Drivers for Epson inkjet printers
epson-inkjet-printer-escpr.x86_64 : Drivers for Epson inkjet printers
epson-inkjet-printer-escpr2.noarch : Drivers for Epson inkjet printers
====================== 概要 & 名前 一致: printer, driver =======================
ptouch-driver.x86_64 : CUPS driver for Brother P-touch label printers
ptouch-driver-foomatic.noarch : Foomatic database data for Brother P-touch label
: printers
========================== 概要 一致: printer, driver ==========================
c2esp.x86_64 : CUPS driver for Kodak AiO printers
foo2ddst.x86_64 : Linux printer driver for DDST protocol
foo2hbpl.x86_64 : Linux printer driver for HBPL protocol
foo2hiperc.x86_64 : Linux printer driver for HIPERC protocol (Oki C3400n etc.)
foo2hp.x86_64 : Linux printer driver for HP 1600, HP 2600n
foo2lava.x86_64 : Linux printer driver for Zenographics LAVAFLOW protocol
foo2oak.x86_64 : Linux printer driver for OAKT protocol (HPLJ1500 etc.)
foo2qpdl.x86_64 : Linux printer driver for Samsung CLP-300, CLP-600, CLP-3160
foo2slx.x86_64 : Linux printer driver for SLX protocol (Lexmark C500n etc.)
foo2xqx.x86_64 : Linux printer driver for HP LaserJet M1005 MFP
foo2zjs.x86_64 : Linux printer driver for ZjStream protocol
foomatic.x86_64 : Tools for using the foomatic database of printers and printer
: drivers
foomatic-db.noarch : Database of printers and printer drivers
gutenprint.i686 : Printer Drivers Package
gutenprint.x86_64 : Printer Drivers Package
gutenprint-cups.x86_64 : CUPS drivers for Canon, Epson, HP and compatible
: printers
hplip-common.i686 : Files needed by the HPLIP printer and scanner drivers
hplip-common.x86_64 : Files needed by the HPLIP printer and scanner drivers
libppd.x86_64 : Library for retro-fitting legacy printer drivers
libppd.i686 : Library for retro-fitting legacy printer drivers
pnm2ppa.x86_64 : Drivers for printing to HP PPA printers
splix.x86_64 : Driver for QPDL/SPL2 printers (Samsung and several Xerox
: printers)
エプソン, HPなど特定の企業のプリンタ専用のドライバもありますが、特に注目すべきは gutenprint-cups (グーテンプリント) と foomatic (フーマティック)のパッケージです。Redhat のマニュアル(表4.1 ドライバーパッケージのリスト)を見ると foomatic のパッケージが 「Brother、Canon、Epson、Gestetner、HP、Infotec、Kyocera、Lanier、Lexmark、NRG、Ricoh、Samsung、Savin、Sharp、Toshiba、Xerox など」のメーカー製プリンタ用、gutenprint-cupsのパッケージが「Brother、Canon、Epson、Fujitsu、HP、Infotec、Kyocera、Lanier、NRG、Oki、Minolta、Ricoh、Samsung、Savin、Xerox など」のメーカー製プリンタ用のドライバだということです。
私の所有するのは Canon製ですから foomaticと gutenprint-cups の両方ともインストールしておいて、あとはプリンタ設定アプリ( system-config-printer)に設定を任せることにしました。結論から言いますと gutenprint-cupsだけあれば私のプリンタは動くようです。
スタンドアローンのMyPrintingはFedoraテンプレートからコピーして作成しました。もしもその作成時点で Fedoraテンプレートに cups等のパッケージをインストールしていなかった場合は以下のコマンドを MyPrintingのターミナルから打って cups等のパッケージをインストールしてください。このブログエントリーの上から順に作業していれば以下のコマンドは不要です。
[user@MyPrinting ~]$ sudo dnf install cups cups-pk-helper simple-scan
foomaticとgutenprint-cupsのプリンタ・ドライバーを MyPrintingキューブにインストールします。
[user@MyPrinting ~]$ sudo dnf install foomatic gutenprint-cups
lpinfo -m コマンドを使うとインストールされたプリンタドライバの長い一覧が表示されます。私のプリンタの型番はCanonの MP490シリーズですが、以下のように grepコマンドで検索したところ該当のドライバが入っていました。これでうまくいきそうです。
[user@MyPrinting ~]$ lpinfo -m | grep -i mp490 gutenprint.5.3://bjc-MP490-series/expert Canon MP490 series - CUPS+Gutenprint v5.3.4 gutenprint.5.3://bjc-MP490-series/simple Canon MP490 series - CUPS+Gutenprint v5.3.4 Simplified gutenprint.5.3://bjc-MULTIPASS-MP490/expert Canon PIXMA MP490 - CUPS+Gutenprint v5.3.4 gutenprint.5.3://bjc-MULTIPASS-MP490/simple Canon PIXMA MP490 - CUPS+Gutenprint v5.3.4 Simplified gutenprint.5.3://bjc-PIXUS-MP490/expert Canon PIXUS MP490 - CUPS+Gutenprint v5.3.4 gutenprint.5.3://bjc-PIXUS-MP490/simple Canon PIXUS MP490 - CUPS+Gutenprint v5.3.4 Simplified
system-config-printer (Print Settings)を使ってプリンタを設定
プリンタの電源を入れUSBでパソコンに接続し、スクリーン右上の
から MyPrintingキューブにプリンタをアタッチします。
以下の図のようにMyPrintingキューブの Print Settings のアプリを起動します。あるいはMyPrintingキューブのターミナルから system-config-printer & と入力すると同じアプリが起動します。

下図はプリンタ設定のウィンドウが起動したところです。

ウィンドウ中央の Add ボタンを押します。「デバイスを選択」の画面に遷移します。うまくいっていればUSB接続のプリンタの機種名が左側欄に出てきますので、そこをクリックしてからウィンドウ右下の Forwardボタンを押します。

Forwardボタンを押すとすぐに ドライバを検索しているポップアップが出ます。

しばらくするとドライバを選択する一覧表が出てきて、うまい具合にCanonが自動的に選択されていました。

さらに Forwardをクリックすると機種名を選択する画面に移ります。ここでも MP490シリーズが自動的にピックアップされています。素直に recommended になっているものを選べばいいと思います。

再度Forwardを押すと「プリンタの説明」という確認画面が現れるので、これでよければ Apply ボタンをクリックします。

この後すぐに以下のようにテストページを印刷してよいか聞かれます。プリンタに用紙をセットして印刷がうまくいくか確認するとよいでしょう。

ここまでやってきたプリンタの設定に成功すると、プリンタ設定のウィンドウには以下のように設定済みのプリンタが表示されます。

あとはFirefoxなどのソフトウェアからも印刷できるかどうか試してみてください。
また複合機をお持ちの方はスキャナも機能するか確認しましょう。MyPrintingのアプリケーションメニューに Document Scanner を追加してからスキャナアプリを起動します。起動後しばらくすると以下のようにCanonの複合機が無事認識されました。

Debianベースのスタンドアローンにドライバを入れる
ここまで説明してきました MyPrining はFedoraベースのキューブでした。Debianベースのスタンドアローンにプリンタドライバを入れるやり方を以下で簡単に説明します。
Create New Qube から Debianベースのスタンドアローン DebPrinting キューブを作成して、cupsサービスを on にしておきます。
Debian系のキューブにはすでに cupsも cups-pk-helper もインストール済みだと思います。 DebPrintingキューブのターミナルを起動してドライバを入れます。Debianにはプリンタドライバを全部入れるメタパッケージがあるので、それを入れるのが一番簡単そうです。
user@DebPrinting:~$ sudo apt install printer-driver-all
これで gutenprint も foomatic もインストールされました。
Debianの場合 lpinfoコマンドは sudo が必要です。インストールされたプリンタドライバを確認するには以下のようなコマンドを使います。
user@DebPrinting:~$ sudo lpinfo -m | grep -i mp490 gutenprint.5.3://bjc-MP490-series/expert Canon MP490 series - CUPS+Gutenprint v5.3.4 gutenprint.5.3://bjc-MULTIPASS-MP490/expert Canon PIXMA MP490 - CUPS+Gutenprint v5.3.4 gutenprint.5.3://bjc-PIXUS-MP490/expert Canon PIXUS MP490 - CUPS+Gutenprint v5.3.4
あとは Print Settings (system-config-printer)を起動して上でやったようなプリンタの設定をすれば印刷できるようになります。

- J. Tian, N. Scaife, D. Kumar, M. Bailey, A. Bates and K. Butler, "SoK: "Plug & Pray" Today – Understanding USB Insecurity in Versions 1 Through C," 2018 IEEE Symposium on Security and Privacy (SP), San Francisco, CA, USA, 2018, pp. 1032-1047↩
- LU, Hongyi, et al. Badusb-c: Revisiting badusb with type-c. In: 2021 IEEE Security and Privacy Workshops (SPW). IEEE, 2021. p. 327-338.↩
-
前述の Lu, Hongyi et al(2021) は以下のように述べています。
(I)t is hard for attackers to locate specific functional UI patterns such as buttons and links on victim’s computers by disguising USB devices, e.g., mice. This explains why typical BadUSB attacks often only stay in the command line, using commands to download malicious scripts for execution.
(訳) マウスなどのUSBデバイスになりすまして被害者のコンピュータ上のボタンやリンク等のユーザーインターフェイスがどうなっているか正確に把握することは攻撃者にとって困難です。これゆえにBadUSB攻撃は大抵の場合コマンドラインから行われ、悪意のあるスクリプトをダウンロードして実行するコマンドを打つのです。↩ - Joanna Rutkowska, "USB Security Challenges" May 31, 2011 https://blog.invisiblethings.org/2011/05/31/usb-security-challenges.html↩
- Rutkowska, Joanna. "Software compartmentalization vs. physical separation." Invisible Things Lab (2014).↩
-
ブルートゥース関連のパッケージがインストールされていない場合はテンプレートから
sudo dnf install bluemanを実行してください。↩ - これは本当は不正確な言い方です。テンプレートからコピーせずに、LinuxのISOファイルなどから直接新規インストールするようなスタンドアローンのキューブもあります。↩
Qubes OSのバックアップ
この記事はQubes OSをUSB外付けの記録装置にバックアップする手順を解説していきます。 Qubes OSをメインのマシンとして使っていくと、やはりデータを定期的にバックアップする必要が出てきます。 また、パソコンを買い替える場合それまで使ってきたQubes OSを別のマシンに移しかえることもあると思いますが、それもバックアップと同一のやり方でできます。

- バックアップ前に考えること
- バックアップ用のUSB外付けハードディスクを接続
- Backup Qubes を使って Qubes OSのバックアップをとる
- バックアップの整合性を検証する
- バックアップからリストアする
今回の記事の公式マニュアルは以下のものです。
バックアップ前に考えること
外付けのハードディスクやSSDにバックアップを保存する場合、あらかじめハードディスク等をどこかのキューブにアタッチしておきます。注意点ですが、起動中のキューブは起動直前の古い状態が保存されてしまいます。重要な作業をやっているキューブはいったんシャットダウンしてからバックアップしたほうがよいでしょう。ハードディスクをアタッチするキューブも、起動前の状態が保存されることに注意してください。
この記事では外付けのハードディスクにバックアップデータを保存しますが、ほかにも特定のキューブ内にいったんすべてのデータを保存するやり方もあります。内部のSSDが十分なサイズがある場合、保存用のキューブを作成しておいてその保存用キューブにバックアップを取るのも一案です。つまりパソコン内部に一旦データをためてから、外部のディスクにデータを移す手順もありえます。
バックアップ用のUSB外付けハードディスクを接続
work, personal などの普段使うキューブにハードディスクをアタッチしてもよいのですが、それだとUSB機器がアタッチすることによるセキュリティリスクがあることや、使用するworkなどのキューブは起動前の状態が保存されることを考えると、ディスポーザブルキューブにハードディスクをアタッチしたほうがいいと思います。ただしうっかりバックアップ途中にディスポーザブルをシャットダウンしないよう注意してください。
まずはUSBハードディスクをパソコンに差し込みます。sys-usbにハードディスクが認識されるとその旨のポップアップのメッセージが出ます。 そのあと画面右上のUSBアイコンから以下のようにして新たに起動するディスポーザブルにハードディスクをアタッチします。

さらに画面右上青色キューブ経由で disp####のファイルマネージャーを起動して、そこからハードディスクをマウントしておいてください。 ファイルマネージャーの左欄にあるデバイス一覧にハードディスクがあるのでそこをクリックするとマウントできます。

Backup Qubes を使って Qubes OSのバックアップをとる
画面左上のQアイコンを押して、一番左の列中の一番下にある歯車アイコンを押します。真ん中のメニューの中から Qubes Tools を押して、右のメニュー欄から Backup Qubes を押すとバックアップ用のツールが起動します。 このかわりに Alt + F3 を押して、backup と入力して検索してもよいでしょう。

以下のように Dom0 で Qubes Backup が起動しました。

右側の一覧にあるキューブがバックアップされるものです。左側一覧にあるキューブはバックアップしないものです。バックアップする必要のないキューブは < ボタンを押して左に移動させてください。
たくさんのキューブが右側一覧に選択してあるとバックアップに時間がかかります。時間がないときは重要なキューブだけ右側に残してバックアップするというのもアリです。
Compress backup にチェックが入っていることを確認してください。チェックが入っている場合バックアップは圧縮ファイルとして保存されます。
保存する・しないものを選択し終えたら、Nextボタンを押します。

以下の画面では一番上にある Backup destination directory (バックアップ先のディレクトリ) のところにある Target qube のドロップダウンメニューをクリックして、保存先のキューブを選びます。この記事では保存先としてディスポーザブルの disp#### をクリックして選択します。

Backup directory or command のすぐ下にある ... をクリックすると disp####キューブでディレクトリを選択するウィンドウが開くので、 disp#### キューブにアタッチされたハードディスクのディレクトリを選んでください。他の場所からたどっていくと選択できると思います。

真ん中あたりにある Backup security欄の Encryption passphrase に暗号化のパスフレーズを入力し、そのすぐ下の Confirm passphrase に同じものを確認のために入力します。ハードディスク自体が暗号化されていない場合は十分に長いパスフレーズを選んでください。

Save settings as default backup profile のチェックボックスにチェックを入れておくと、今回のキューブとディレクトリ名が次回のバックアップ時にも使えるようになります。ただしこの記事ではディスポーザブルを使用しているので、次回のバックアップではそのディスポーザブルは存在しないのでこの設定を保存しても無意味ですから、今回はチェックを外しておきます。vault などのAppキューブにバックアップを保存するのであれば、Save settings as default backup profile のチェックボックスにチェックを入れておくと、同じキューブ同じディレクトリに毎回バックアップできるようになります。
これでよければ Next ボタンをクリックします。すると以下のバックアップの概要を示すウィンドウに遷移します。

上の画面によれば全部で 42.7 GiBの容量をバックアップします。また "The VM is running, backup will contain its state from before its start!" (このVMは実行中であり、バックアップにはVMがスタートする前の状態が保存されます)と表示されているキューブは、最新のデータがバックアップに含まれないので注意してください。
確認したら Next ボタンを押してバックアップを開始します。つぎのようなバックアップ中の画面に切り替わります。

大量にバックアップする場合は結構な時間がかかると思います。バックアップが終了すると以下の画面のように表示されます。Finish ボタンを押して Qubes backup ツールを閉じてください。

バックアップ終了後はハードディスクをマウントしたキューブのファイルマネージャーから、ハードディスクをアンマウントしてください。 アンマウントしたあとは、画面右上のUSBアイコン経由で作業用のキューブ(この記事では disp####) からハードディスクをデタッチしてください。
バックアップの整合性を検証する
バックアップのときに失敗してデータが壊れてしまってはバックアップする意味がありません。公式マニュアルによればバックアップをとったら、データの整合性を検証するのがのぞましいそうです。以下にそのやり方を示します。
USB外付け記録装置がまだアタッチされてない場合は、どこかのキューブにアタッチしましょう。以下では debian-12ベースのディスポーザブルを起動しつつ外付けHDDをアタッチしています。

起動したディスポーザブル disp#### のファイルマネージャーから以下のようにしてハードディスクをマウントします。

保存しておいたバックアップを探しておいて、ファイルパスを確認しておきます。以下の例では /media/user/40e025d5-3a33-444a-9b06-63bb3f528314/hozon/ です。

次に Restore Backup というQubesのツールを画面左上Q経由で起動します。

リストアのツールが以下のように起動したら一番上のキューブ選択のドロップダウンメニュー(Qube: のところ)からハードディスクがアタッチされた disp#### を選びます。
その下の Backup file: は一番右にある3点リーダ ... のところをクリックしてバックアップファイルのところまでたどっていき、バックアップファイルを選択してください。
一番大事なところですが、バックアップの整合性を確認するには中央欄 Restore optionsの中にある Test restore to verify integrity (no data actually restored) のチェックボックスをオンにしてください。Test restore to verify integrity (no data actually restored)は「整合性を検証するためにリストアのテストをする(実際にはデータのリストアをしない)」という意味です。
バックアップのときに暗号化した場合、Encrypted backup: のチェックボックスをオンにしておいて、Decryption passphrase にパスフレーズを入力します。

これでよければ Next ボタンを押します。パスフレーズが正しければ以下の画面に移ります。これは整合性を検証したいキューブを左側の一覧から選ぶ画面です。すべて検証したほうがよいですから、中央にあるボタンの一番上にある >> ですべてのキューブを右側欄に移して全部を検証することにします。

以下はすべてのキューブが右側に移動した画面です。

Nextボタンを押すと以下のように、検証する対象のキューブの概要が表示されます。

これでよければ Nextボタンを押し、バックアップの検証を開始します。
以下は検証中のウィンドウです。

検証作業が終わり異常無しなら次のようなポップアップウィンドウで成功を表示します。

Finishボタンを押してリストアツールを閉じます。
バックアップからリストアする
このセクションでは上記の作業でバックアップしたファイルから一部のキューブのみをリストアしてみます。vaultキューブをリストアする例を示します。リストアされたvaultは vault1 という数字の 1 がついた別名で復元されます。
バックアップが保存されているハードディスクをどこかのキューブにアタッチしておき、マウントも実行しておきます。

上の検証作業と同じようにしてリストアツール (Restore Backup)を起動します。
以下のウィンドウでは Qube: 欄にハードディスクがアタッチされたキューブを指定し、Backup file: 欄にはバックアップファイルを指定します。 実際にリストアするときは、前回の整合性検証のときとは異なり Test restore to verify integrity (no data actually restored) のチェックボックスはオフのままにしておきます。

暗号化のパスフレーズを入力して Next ボタンをクリックします。
以下のような画面に遷移します。この左側の一覧からリストアしたいキューブを選択します。今回は vault キューブのみをクリックして、> ボタンを押して以下の画面のように右の欄に移動させます。

Next ボタンを押すとリストアする内容を確認する以下の画面が表示されます。vault キューブの行の右側に will be renamed to ''vault1' (vault1 という名前に変更されます)と表示されていることに注意してください。

Nextボタンを押すとリストアが始まります。

リストアが上手くいくと以下のように表示されます。

OKボタン、つづいて Finish ボタンをクリックしてリストアのツールを終了させます。
リストア終了後 Qube Manager でキューブの一覧を表示させたところ、新たに vault1 キューブが作成されていてリストアがうまくいっていました。