Run QEMU/KVM using TAP without full root priviledge

最近勉強したPOSIX CapabilitiesがQEMU(/KVM)を使うときにも利用できそうなので試してみました。

QEMUではstand aloneで動かす場合やユーザレベル通信を使う限りにおいてはユーザアカウントでも実行可能です。しかし、外部からアクセスを受け付けるサーバ用途の場合は、ブリッジ接続(TAPインタフェース)でネットワークを構成しなければならないためroot権限が必要でした。

以下の例のように、ユーザ権限のままQEMUを実行するとTAPの生成に失敗します。

$ sudo /usr/bin/qemu-kvm -hda cap.img -net nic -net tap,ifname=tap,script=no
# => OK
$ /usr/bin/qemu-kvm -hda cap.img -net nic -net tap,ifname=tap,script=no
warning: could not configure /dev/net/tun: no virtual network emulation
Could not initialize device 'tap'

とはいえTAPを生成するためだけにQEMUをroot権限で実行するのはちょっといやですよね。

そこでPOSIX Capabilitiesです。POSXI Capabilitiesはroot権限を分割して、細粒度の権限で特権処理を制御するためのメカニズムです。必要な権限だけを一般ユーザに与えたり、rootから不要な権限を取り除くといったことができます。よくある例はpingからsetuidビットを落とすのに使う用途でしょうか。

さて実際に使ってみましょう。libcapパッケージ(f10の場合)に含まれるsetcapコマンドを使ってCAP_NET_ADMIN権限をonにしてやると*1、、、

$ sudo yum install libcap
$ sudo /usr/sbin/setcap cap_net_admin=ep /usr/bin/qemu-kvm
$ /usr/bin/qemu-kvm -hda cap.img -net nic -net tap,ifname=tap,script=no
# => OK ;-)

おー、sudoをしなくても(rootにならなくても) QEMUがTAPを作ることができました。

これで不必要な権限を与えることなくブリッジ接続でQEMUを運用できそうです。

POSIX Capabilitiesはこれ以外にもいろいろ使い道がありそうです。いま試しているLXCにも必要そうですし。Fedora 10では普通に使えるようになっている機能のなのでみなさんも試してみてはいかがでしょうか?

参考:

*1:実際はもうちょっと複雑な計算で権限が決定されているようです。