危険な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攻撃の脅威

USBメモリなどを利用したUSB関連のサイバー攻撃に関する報道を目にする機会も多いと思います。軽く検索しただけでも以下のような記事が見つかりました。

セキュリティ確保のために企業内のネットワークを直接インターネットに繋がない対策を取っている企業用途・産業用途のITシステムは多いです。エアギャップ(air gap)と呼ばれるこのような仕組みも、攻撃者が細工したUSBが何らかの形でシステムに持ち込まれて接続されてしまうとセキュリティが保てなくなります。以下のネット記事はエアギャップによるシステムの防御にとっていかにUSBが脅威であるのか解説しています。

日本のAmazonでもUSB攻撃ツールが堂々と売られているのが度々確認されてます。

USB攻撃を行うガジェットが日本のAmazonでも販売されている
USB攻撃を行うガジェットが日本のAmazonでも販売されている

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

さまざまなハッキングガジェットを販売する Hak5のウェブサイト
さまざまなハッキングガジェットを販売する Hak5のウェブサイト

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ポートに差し込むと次のようなポップアップが出ます。

USBマウスを接続するとdom0で使用してよいか聞かれる
USBマウスを接続するとdom0で使用してよいか聞かれる

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 のタブをクリックします。

Qubes Global Config からUSBキーボードやマウスの使用禁止・許可の設定を行う
Qubes Global Config からUSBキーボードやマウスの使用禁止・許可の設定を行う

メインウィンドウの 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に差し込みます。すると以下のようなポップアップが現れます。

USBメモリをパソコンに差し込んだときのメッセージ
USBメモリをパソコンに差し込んだときのメッセージ

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メモリをpersonalキューブで使えるようにするためにアイコンをクリック
USBメモリをpersonalキューブで使えるようにするためにアイコンをクリック

ドロップダウンメニューの中に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キューブにアタッチするときのメッセージ
USBメモリを personalキューブにアタッチするときのメッセージ

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

USBメモリが personalキューブにアタッチされている状態
USBメモリが personalキューブにアタッチされている状態

personalキューブのファイルブラウザを開いてください

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

personalキューブのファイルブラウザからUSBメモリが扱えるようになった
personalキューブのファイルブラウザからUSBメモリが扱えるようになった

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

USBメモリの中身を表示しているところ
USBメモリの中身を表示しているところ

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

USBメモリの中のファイルを personalキューブのMousepadで編集
USBメモリの中のファイルを personalキューブの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 コマンドによりブロックデバイスを表示するとその中の xvdixvdi1のところに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メモリをアンマウントする
USBメモリをアンマウントする

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

personalキューブからUSBメモリを外す(デタッチする)
personalキューブからUSBメモリを外す(デタッチする)

このあと USBメモリ本体をパソコンから抜いて作業は終了です。

SDカードをディスポーザブル・キューブに接続する

今度はSDカードを使えるようにします。SDカードをPCのスロットに差し込みます。すると以下のようなポップアップが出ました。

SDカードをPCのスロットに入れたときのメッセージ
SDカードをPCのスロットに入れたときのメッセージ

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

SDカードのデバイスに関するメニュー表示
SDカードのデバイスに関するメニュー表示

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カードをマウントできるようになった
ディスポーザブルでSDカードをマウントできるようになった

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

マウント後 SDカードの中のデータが表示された
マウント後 SDカードの中のデータが表示された

利用を終えたらSD-DATAのところを右クリックしてマウント解除を選択しアンマウントしてください。

つづいてスクリーン右上 からデタッチします。ディスポーザブルをまだ使いたい場合は Detach from disp#### の方を押します。ディスポーザブルをシャットダウンしてよければ下側の Detach and shut down disp#### を押してください。

SDカードをデタッチするとともにディスポーザブルをシャットダウン
SDカードをデタッチするとともにディスポーザブルをシャットダウン

デタッチが終わってからパソコンから 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-blockqvm-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 が起動しました。

personalキューブ上で GNOME Disksが起動した
personalキューブ上で GNOME Disksが起動した

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

左側ペインからUSBメモリを選んだ後、歯車のアイコンをクリックする
左側ペインからUSBメモリを選んだ後、歯車のアイコンをクリックする

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

歯車アイコンをクリックしてUSBメモリに関するメニューを表示させる
歯車アイコンをクリックしてUSBメモリに関するメニューを表示させる

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

USBメモリ内部のパーティションにラベルを付ける
USBメモリ内部のパーティションにラベルを付ける

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

USBメモリのパーティションに新しくラベルが追加された
USBメモリのパーティションに新しくラベルが追加された

ここから先やっていく作業内容は一旦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 のラベルが表示されました。

USBメモリのパーティションのところに SP16G-DATA のラベルが表示された
USBメモリのパーティションのところに SP16G-DATA のラベルが表示された

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

ラベルをつけた後USBメモリのパーティションにアクセスしているところ
ラベルをつけた後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キューブにUSBメモリのパーティションのみをアタッチする
personalキューブにUSBメモリのパーティションのみをアタッチする

これで 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 を表示しています。

ファイルブラウザにて /mnt/removable にあるUSBメモリ内部を表示
ファイルブラウザにて /mnt/removable にあるUSBメモリ内部を表示

USBメモリを使い終えたらアンマウントします。アンマウントするには以下のコマンドを personalのターミナルから入力します。

[user@personal ~]$ udisksctl unmount -b /dev/xvdi 
Unmounted /dev/xvdi.

Unmounted /dev/xvdi. という出力が出たらアンマウント成功です。エラーが出てアンマウントできない場合はファイルブラウザなどでまだUSBメモリ内にアクセスしていないかチェックしてください。

上の例では コマンドラインから udisksctl を用いましたが、GNOME Disksを使ってマウント・アンマウントすることも可能です。以下のGNOME Disks ウィンドウにある の箇所を押すとUSBメモリのパーティションをマウント・アンマウントできます。

GNOME DisksからUSBメモリのパーティションをマウント
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にアタッチします。

ライブUSBを作成するめたにUSBメモリ全体をキューブにアタッチする
ライブUSBを作成するめたにUSBメモリ全体をキューブにアタッチする

なお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のLinux Mintを使用しているところ
ライブUSBのLinux Mintを使用しているところ

USB接続の光学ドライブ

Qubes OSで CD, DVDを使いたい場合はUSB接続の光学ドライブを使います。光学ドライブはファイルを扱うのでブロックデバイスなのかと勘違いしやすいですが、Qubes OS内部ではBlock Devicesではなく USB Devices の一つとして扱われています。

(円盤の入っていない状態の)光学ドライブをUSB経由でパソコンに接続します。このあとスクリーン右上の アイコンをクリックすると

USB Devices の中のアイテムに光学ドライブが出現した
USB Devices の中のアイテムに光学ドライブが出現した

USB Devices の一覧中に"I-O_DATA_DEVICE_INC._Optical_Storage..."という光学ディスクドライブの項目が現れました。このアイテムをCD, DVDを使いたいキューブにアタッチします。上図では music というキューブにアタッチしようとしています。

音楽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のアイテムが表示された
CDを使うキューブでファイルブラウザにCDのアイテムが表示された

このように左側下のところにCDデバイスの「オーディオ⋯」という項目が現れました。

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

CDの音声ファイルがファイルブラウザに表示された
CDの音声ファイルがファイルブラウザに表示された

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

VLCで.wavファイルを再生しているところ
VLCで.wavファイルを再生しているところ

使い終わったら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カメラが使えるようになります。

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につなげてよいか聞かれます。

ブルートゥース・マウスを dom0 につなげるポップアップ
ブルートゥース・マウスを dom0 につなげるポップアップ

OKボタンをクリックするとブルートゥース・マウスが使えるようになります。

Qubes OS 4.2のデフォルトで sys-usbはディスポーザブルキューブになっています。このせいで前回起動時にブルートゥース機器をペアリングして信頼したことを再起動するとsys-usbは忘れてしまいます。ペアリングの作業を毎回するのが面倒な場合はこちらのQubes OSフォーラムのエントリーを参照してください。

Androidスマホ・タブレットとUSB経由で接続

AndroidデバイスをUSB経由でQubesにつないでファイルの転送をやる場合、執筆時点(2024年6月)ではバグがあって残念なことに sys-usb以外のキューブではうまく使えません

以下の画像にあるようにandroid機器は USB Devices として認識されて、これを他のキューブにアタッチすることまではできます。そのあとアンドロイド機器をマウントしようとするとエラーが発生してマウントに失敗します。

AndroidタブレットをUSB経由で接続したところ
AndroidタブレットをUSB経由で接続したところ

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

AndroidデバイスをUSBケーブルでPCにつないだあと、sys-usbのファイルブラウザを立ち上げます。するとウィンドウ左下に Android のアイコンが出てきます。

sys-usbのファイルブラウザに Androidのアイコンが見える
sys-usbのファイルブラウザに Androidのアイコンが見える

AndroidとPC間でファイルをやり取りする場合は MTP (media transfer protocol) という機能を使います。Android側で 充電モードからMTPモードに適切に変更してください。

そのあと sys-usbのファイルブラウザから Androidのアイコンをクリックすると Androidデバイスがマウントされて中のファイルを扱えるようになります。

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 キューブが作成されます。

Create New QubeからDebianベースの printing キューブを作成
Create New QubeからDebianベースの printing キューブを作成

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

printing キューブの Settings ウィンドウからServices タブをクリックしてCUPSを選ぶ
printing キューブの Settings ウィンドウからServices タブをクリックしてCUPSを選ぶ

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

 cups のサービスが動くように設定された
cups のサービスが動くように設定された

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

サービス選択のドロップダウンメニューの一番下の (custom...) を選んで Addを押す
サービス選択のドロップダウンメニューの一番下の (custom...) を選んで Addを押す

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

新しいサービス名として avahi を入力
新しいサービス名として avahi を入力

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

printing キューブにおいて cups と avahi のサービスが使えるようになった
printing キューブにおいて cups と avahi のサービスが使えるようになった

なおここまで説明してきた 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 キューブにプリンタをアタッチします。

printing キューブにプリンタをアタッチ
printing キューブにプリンタをアタッチ

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

Firefoxから印刷を実行するところ。プリンタ名が出ていれば成功
Firefoxから印刷を実行するところ。プリンタ名が出ていれば成功

実際に印刷できるか試してみてください。

うまくいかない場合は 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に変更してください。

printingキューブのテンプレートをFedoraベースに変更
printingキューブのテンプレートをFedoraベースに変更

すでに解説しましたが、プリンタを使うキューブでは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で印刷できるか確認してください。

FedoraテンプレートベースのキューブからIPP over USBで印刷するところ
FedoraテンプレートベースのキューブからIPP over USBで印刷するところ

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

Fedora系のキューブからスキャナを使用しているところ
Fedora系のキューブからスキャナを使用しているところ

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 New Qubeからプリンタ用のスタンドアローン・キューブを作成
Create New Qubeからプリンタ用のスタンドアローン・キューブを作成

これでよければ 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 & と入力すると同じアプリが起動します。

MyPrintingキューブのプリンタ設定アプリを起動する
MyPrintingキューブのプリンタ設定アプリを起動する

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

プリンタ設定のウィンドウが起動した
プリンタ設定のウィンドウが起動した

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

USB接続のプリンタの機種名が左側欄に出てきた
USB接続のプリンタの機種名が左側欄に出てきた

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

ドライバを検索しているポップアップ
ドライバを検索しているポップアップ

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

プリンタドライバを選択する一覧表が出てきた
プリンタドライバを選択する一覧表が出てきた

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

プリンタの機種名を選択する画面
プリンタの機種名を選択する画面

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

プリンタを設定する確認画面
プリンタを設定する確認画面

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

テストページを印刷してよいか聞いている
テストページを印刷してよいか聞いている

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

プリンタ設定のウィンドウに設定済みのプリンタが表示されている
プリンタ設定のウィンドウに設定済みのプリンタが表示されている

あとはFirefoxなどのソフトウェアからも印刷できるかどうか試してみてください。

また複合機をお持ちの方はスキャナも機能するか確認しましょう。MyPrintingのアプリケーションメニューに Document Scanner を追加してからスキャナアプリを起動します。起動後しばらくすると以下のようにCanonの複合機が無事認識されました。

MyPrintingキューブでスキャナを試しているところ
MyPrintingキューブでスキャナを試しているところ

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)を起動して上でやったようなプリンタの設定をすれば印刷できるようになります。

Debian系のキューブにおいてプリンタの設定からキヤノンのプリンタを設定
Debian系のキューブにおいてプリンタの設定からキヤノンのプリンタを設定


  1. 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
  2. LU, Hongyi, et al. Badusb-c: Revisiting badusb with type-c. In: 2021 IEEE Security and Privacy Workshops (SPW). IEEE, 2021. p. 327-338.
  3. 前述の 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攻撃は大抵の場合コマンドラインから行われ、悪意のあるスクリプトをダウンロードして実行するコマンドを打つのです。
  4. Joanna Rutkowska, "USB Security Challenges" May 31, 2011 https://blog.invisiblethings.org/2011/05/31/usb-security-challenges.html
  5. Rutkowska, Joanna. "Software compartmentalization vs. physical separation." Invisible Things Lab (2014).
  6. ブルートゥース関連のパッケージがインストールされていない場合はテンプレートから sudo dnf install blueman を実行してください。
  7. これは本当は不正確な言い方です。テンプレートからコピーせずに、LinuxのISOファイルなどから直接新規インストールするようなスタンドアローンのキューブもあります。