« | »

最近の OSC のセミナーで紹介していた Snapper で作成した Btrfs ファイルシステムのスナップショットを Samba で公開し、「以前のバージョン」のファイルにアクセスできるファイルサーバーが、CentOS でも 7.2 になって構築できるようになりました。

Snapper は openSUSE 傘下のプロジェクトで、設定しておいたルールに応じて、自動的にファイルシステムのスナップショットを撮ってくれます。Samba 4.2 以降で、Samba と Snapper が vfs_snapper で連携できるようになりました。細かい話は OSC 京都のスライドをチェックして下さい。

では早速インストールしてみましょう。ポイントは SELinux への対応です。(まさか、無効にしていないですよね?) ここは openSUSE ユーザ会の Blog ということで、細かい CentOS の解説は行わないことにします。

とりあえず、samba と snapper をインストールします:

$ sudo yum install samba snapper

共有するディレクトリ /srv/share を作成します。以前のバージョンに対応した共有ディレクトリは Btrfs の(サブ)ボリュームである必要がありま。アクセス権は実際に使用する環境に合わせて変更して下さい:

$ sudo btrfs subvol create share
$ sudo chgrp -R geeko share
$ sudo chmod g+w share

SELinux で Samba サーバーが /srv/share にアクセスできるようにします:

# semanage がインストールされていない場合
$ sudo yum install policycoreutils-python

# ラベル設定
$ sudo semanage fcontext -a -t samba_share_t /srv/share
$ sudo restorecon /srv/share/

Samba サーバーの設定をします。今回は /etc/samba/smb.conf に次のような設定を追加します。
最後の vfs objects の設定がミソです:

[share]
 comment = Shared Directory
 browseable = yes
 writable = yes
 guest ok = no
 path = /srv/share
 vfs objects = btrfs snapper

Snapper の設定をします。スナップショットの残し方の設定は openSUSE と共通なので、スライドを参照して下さい:

$ sudo snapper -c smb-share create-config /srv/share

ユーザアカウント geeko がスナップショットにアクセスできるようにします。設定ファイルの直接編集も可能です:

$ sudo snapper -c smb-share set-config ALLOW_USERS=geeko

Samba サーバーを立ち上げましょう。まずはファイアウォールを開けて:

$ sudo firewall-cmd --add-service=samba --permanent
$ sudo firewall-cmd --reload

サービスの自動起動設定をし、smb サービスを開始します:

$ sudo systemctl enable smb.service
$ sudo systemctl start smb.service

ユーザー geeko を Samba サーバーのユーザーに追加し、パスワードを設定してログインできるようにします。

sudo pdbedit -a geeko

あとは Windows からアクセスして、右クリックして、「以前のバージョン」タブを開くだけ…なのですが、なんと Samba サーバーが Snapper に接続する際に、SELinux が拒否してしまいます。次のようなログが /var/log/audit/audit.log にしっかり記録されています:

type=USER_AVC msg=audit(1452273485.220:943): pid=534 uid=81 auid=4294967295 ses=4294967295 subj=system_u:system_r:system_dbusd_t:s0-s0:c0.c1023 msg='avc: denied { send_msg } for msgtype=method_call interface=org.opensuse.Snapper member=ListConfigs dest=org.opensuse.Snapper spid=16293 tpid=16588 scontext=system_u:system_r:smbd_t:s0 tcontext=system_u:system_r:snapperd_t:s0-s0:c0.c1023 tclass=dbus exe="/usr/bin/dbus-daemon" sauid=81 hostname=? addr=? terminal=?'

Samba から Snapper にアクセスを許可するポリシーを作成してみます。次のような samba-snapper.te を作成し

module samba-snapper 1.0;
require {
  type smbd_t;
  type snapperd_t;
  class dbus { send_msg };
}

allow smbd_t snapperd_t:dbus { send_msg };

ルールをビルドします:

# Makefile がインストールされていない場合
$ sudo yum install selinux-policy-devel

# ビルド
$ make -f /usr/share/selinux/devel/Makefile

作成した samba-snapper.pp をシステムにインストールすると、以前のバージョンにアクセスできるようになります。

sudo semodule -i samba-snapper.pp

CentOS で以前のバージョンに対応したファイルサーバーを構築する方法を紹介しました。ぜひ、スライドで紹介している openSUSE で YaST を使った設定と比べてみて下さい。

コメント/トラックバック