超小型シングルボードコンピュータのUSB Armoryがやって来た

USB Armoryというガジェットが家に届いた。USB Armoryは、Inverse Path というトリエステを拠点とする会社が開発した、シングルボードコンピュータだ。大きさは 一般的なUSBフラッシュメモリと同程度、価格は130USDで、ARM Cortex-A8 800MHz & 512MB DDR3 というハードウェアが手に入る。OSは、Android, Debian, Ubuntu, Arch Linuxなどが 走る。また、ハードウェアとソフトウェアはオープンソースで公開 されている。

USB Armory

基本的に何でもできるハードウェアなのだが、特にセキュリティ関係の用途を想定 しているようだ:

  • 暗号化、ウィルススキャン、ホスト認証、データ自動削除などの高度な機能を持った ストレージ
  • OpenSSHクライアントとエージェン
  • エンドツーエンド暗号化されたVPN
  • ウェブサーバつきのパスワードマネージャ
  • ビットコインのウォレット (Electrumが動作確認済み)
  • セキュリティトークン

こんなイケてるハードウェアはぜひ試してみるしかない、ということで、早速今年の 1月末に注文した。そして届いたのが今日。早速ログインして遊んでみた。

触ってみた

基板の裏側にMicro SDカードのスロットが付いており、ここにOSを焼いたカードを刺す。 今回は、Debianが既にインストールされたMicro SDカードを買った。

keichi@usbarmory:~$ df -ah
Filesystem      Size  Used Avail Use% Mounted on
rootfs          1.8G  292M  1.5G  17% /
/dev/root       1.8G  292M  1.5G  17% /
devtmpfs        252M     0  252M   0% /dev
tmpfs            51M   76K   51M   1% /run
tmpfs           5.0M     0  5.0M   0% /run/lock
proc               0     0     0    - /proc
sysfs              0     0     0    - /sys
tmpfs           101M     0  101M   0% /run/shm
devpts             0     0     0    - /dev/pts

メモリは潤沢にある。

keichi@usbarmory:~$ free
             total       used       free     shared    buffers     cached
Mem:        515688     118164     397524          0       3760     101024
-/+ buffers/cache:      13380     502308
Swap:            0          0          0

今回はDebian WheezyがプリインストールされたMicro SDカードを使った。Debian以外には、 Archのプリビルトイメージが提供されている。 イメージを自作する方法も丁寧に解説されている。

keichi@usbarmory:~$ uname -a
Linux usbarmory 3.18.2 #2 PREEMPT Fri Jan 9 15:17:41 CET 2015 armv7l GNU/Linux

どんなプロセスが動いているか調べてみた。shellinaboxdというのが見慣れないけど、 これはウェブブラウザで動くターミナルエミュレータらしい。デフォルトでは、ブラウザで USB Armoryの4300ポートにアクセスすると、ブラウザの中でターミナルが使える。 でも要らないので無効化した。あとcronも動いてるけど、USB Armoryを抜くたびにRTCが リセットされるので要らないかなあ。

keichi@usbarmory:~$ ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.1  0.2   1660  1136 ?        Ss   12:22   0:00 init [2]
root         2  0.0  0.0      0     0 ?        S    12:22   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    12:22   0:00 [ksoftirqd/0]
root         4  0.0  0.0      0     0 ?        S    12:22   0:00 [kworker/0:0]
root         5  0.0  0.0      0     0 ?        S<   12:22   0:00 [kworker/0:0H]
root         6  0.0  0.0      0     0 ?        S    12:22   0:00 [kworker/u2:0]
root         7  0.0  0.0      0     0 ?        S    12:22   0:00 [rcu_preempt]
root         8  0.0  0.0      0     0 ?        S    12:22   0:00 [rcu_sched]
root         9  0.0  0.0      0     0 ?        S    12:22   0:00 [rcu_bh]
root        10  0.0  0.0      0     0 ?        S    12:22   0:00 [watchdog/0]
root        11  0.0  0.0      0     0 ?        S<   12:22   0:00 [khelper]
root        12  0.0  0.0      0     0 ?        S    12:22   0:00 [kdevtmpfs]
root        13  0.0  0.0      0     0 ?        S    12:22   0:00 [khungtaskd]
root        14  0.0  0.0      0     0 ?        S<   12:22   0:00 [writeback]
root        15  0.0  0.0      0     0 ?        S<   12:22   0:00 [crypto]
root        16  0.0  0.0      0     0 ?        S<   12:22   0:00 [bioset]
root        17  0.0  0.0      0     0 ?        S<   12:22   0:00 [kblockd]
root        18  0.0  0.0      0     0 ?        S    12:22   0:00 [kworker/0:1]
root        19  0.0  0.0      0     0 ?        S    12:22   0:00 [kswapd0]
root        20  0.0  0.0      0     0 ?        S    12:22   0:00 [fsnotify_mark]
root        29  0.0  0.0      0     0 ?        S    12:22   0:00 [irq/17-mmc0]
root        30  0.0  0.0      0     0 ?        S    12:22   0:00 [kworker/u2:1]
root        31  0.0  0.0      0     0 ?        S<   12:22   0:00 [deferwq]
root        32  0.0  0.0      0     0 ?        S    12:22   0:00 [kworker/u2:2]
root        33  0.2  0.0      0     0 ?        S    12:22   0:00 [mmcqd/0]
root        34  0.0  0.0      0     0 ?        S    12:22   0:00 [jbd2/mmcblk0p1-]
root        35  0.0  0.0      0     0 ?        S<   12:22   0:00 [ext4-rsv-conver]
root       148  0.1  0.3   2272  1672 ?        Ss   12:22   0:00 udevd --daemon
root       252  0.0  0.0      0     0 ?        S<   12:22   0:00 [ci_otg]
root       264  0.0  0.2   2268  1532 ?        S    12:22   0:00 udevd --daemon
root       269  0.0  0.2   2268  1532 ?        S    12:22   0:00 udevd --daemon
root      1367  0.0  0.0      0     0 ?        S<   12:22   0:00 [ipv6_addrconf]
root      1481  0.0  0.4  27344  2128 ?        Sl   12:22   0:00 /usr/sbin/rsyslogd -c5
101       1501  0.0  0.4   3712  2304 ?        Ss   12:22   0:00 /usr/bin/shellinaboxd -q --background=/var/run/shellinaboxd.pid -c /var/lib/shellinabox -p 42
root      1502  0.0  0.1   1300   988 ?        Ss   12:22   0:00 startpar -f -- shellinabox
101       1503  0.0  0.2   3712  1284 ?        S    12:22   0:00 /usr/bin/shellinaboxd -q --background=/var/run/shellinaboxd.pid -c /var/lib/shellinabox -p 42
root      1527  0.0  0.2   1828  1300 ?        Ss   12:22   0:00 /usr/sbin/cron
root      1557  0.0  0.4   5136  2548 ?        Ss   12:22   0:00 /usr/sbin/sshd
root      1585  0.0  0.2   1636  1236 ?        Ss+  12:22   0:00 /sbin/getty -L console 115200 vt100
root      1616  0.2  0.7   8160  3732 ?        Ss   12:26   0:00 sshd: keichi [priv]
keichi    1618  0.0  0.5   8160  2636 ?        S    12:26   0:00 sshd: keichi@pts/0
keichi    1619  0.0  0.4   2564  2172 pts/0    Ss   12:26   0:00 -bash
keichi    1627  0.0  0.2   2464  1352 pts/0    R+   12:27   0:00 ps aux

感想

1時間ほど触ってみた感想は、かなり良い。組み込みLinuxは全然分からない僕のような 人間でも、普段使ってるUbuntuと同じように使える。パフォーマンスもかなり高い (ベンチマークを見ると、 Raspberry Pi 2よりやや遅いぐらい)ので、ストレスも感じない。 色々面白そうなことができそうなデバイスだけど、何でもできるがゆえに、どんな使い方 をしたらいいか迷ってしまう。とりあえずOpenSSH・GPG・Electrumあたりを入れて 運用してみるか。

ちなみに、このUSB Armoryの開発ストーリーを紹介しているプレゼンテーションが ここに上がっている。KiCadで RAMとの配線を設計する難しさ、すぐ壊れるインダクタ、金メッキの不具合など、 開発で直面した諸々の罠を面白く語ってくれている。ハードウェアの自作に興味のある 方はぜひ観て欲しい。実は僕がUSB Armoryの存在を知ったのは、このビデオなのだ。