気ままにインフラエンジニア

渋谷で働くインフラエンジニアの備忘録。 TwitterID: @nakashii_

CentOS 6.2 上のKVMをリモートのvirt-managerから操作する

CentOS系ではyum install qemu-kvm libvirtしたあと、root以外でlibvirtを実行できるような設定になっていない。

・rootユーザーでSSHログインはしない
virt-managerはサーバー上でなく、手元からリモートで動かしたい

上記を満たすために、libvirtdの設定を変更する。

# vi /etc/libvirt/libvirtd.conf
unix_sock_group = "libvirt"
unix_sock_rw_perms = "0770"
groupadd libvirt
usermod -a -G libvirt [username]

これでlibvirtdを再起動すればOK…のはずだったのだが。
SSHの鍵認証をさせて、virt-managerで接続させても延々と"libvirtError: authentication failed"のような認証エラーが出る。

# vi /usr/share/polkit-1/actions/org.libvirt.unix.policy
<allow_any>auth_admin</allow_any> 
<allow_inactive>auth_admin</allow_inactive>

上記の修正で直ったという情報もあったけれど、どうもしっくりこないので調べた。(そもそもこれで認証が通ったら、unix_sock_rw_perms = "0770"の設定は何なんだ?)

結論としては、PolicyKitの認証が関係していた。
CentOSでは、libvirtd.confがほとんどの場合コメントアウトしてあり、以下の部分も同様。

# /etc/libvirt/libvirtd.conf
# auth_unix_rw = "none"

libvirtd.conf中のauth_unix_rwの説明に、以下のようにある。

# Set an authentication scheme for UNIX read-write sockets
# By default socket permissions only allow root. If PolicyKit
# support was compiled into libvirt, the default will be to
# use 'polkit' auth.

つまりCentOS6では、libvirtが最初からpolicykitを使うようにビルドされているということだ。

libvirtd.confを以下のように編集しなおして、無事操作できた。

# vi /etc/libvirt/libvirtd.conf
unix_sock_group = "libvirt"
unix_sock_rw_perms = "0770"
auth_unix_rw = "none"

ちなみに、Ubuntu系では最初から

auth_unix_ro = "none"
auth_unix_rw = "none"

と設定されている。

openSUSEのマニュアルにも、 第7章 接続と権限

推奨設定
SSH を利用したリモートからのトンネル
7.1.1.1項 「パーミッションとグループ所有者を利用した UNIX ソケット向けのアクセス制御」

想定済みというわけらしい…。うーんこのRHEL


参考にしたサイト