Monthly Archives: 5月 2015

[FreeBSD][メモ] ACL(Access Control Lists)を有効にする

Pocket

ACLとは、一般的なUNIXのパーミッション制御をさらに拡張したものである。
FreeBSDのハンドブックは以下の通りであるが、どうも実動作とハンドブックの内容に食い違いがあるようなのでメモ。

https://www.freebsd.org/doc/ja_JP.eucJP/books/handbook/fs-acl.html
https://www.freebsd.org/doc/en/books/handbook/fs-acl.html

ACLはファイルシステムごとに有効/無効を設定できる。
設定変更は、そのファイルシステムをumountするか、リードオンリーの状態でしかできない。
したがって、ルートファイルシステムの設定変更は、通常起動した後ではできない。

 

ACLの有効/無効化

GENERICカーネルであればACLが使える。

ACLを有効にするには、/etc/fstabの当該ファイルシステムオプションにaclsを追加し、再起動すればよい。
もちろん、ルートファイルシステム以外なら、再起動しないまでも、いったんumount、mountすればよい。
mount -uによる再マウントでは有効にならないので注意
fstab設定例は後述

 

ACLの有効/無効化のしくみ

ファイルシステムヘッダのスーパーブロックにACLの有効/無効フラグがある。tunefsコマンドでフラグを変更できる。
fstabでaclsが指定されていると、マシン起動時に、tunefsでスーパーブロックを書き換えののち、マウントされる。

 

注意点(一度ACLを有効にしたら永続…?)

ハンドブックによれば、一度ACLを有効にしたらその設定が永続する、という。
「スーパブロックフラグを設定すると、fstab に記述されていなかったり、デバイスの順番が変わってしまっても、常に ACLs が有効な状態でマウントされます」
※英語版も同じ。

 

ハンドブックとの違い?

ところが手元のマシンの動作を見ると、tunefsによる設定に関わらず、fstabのオプションしか参照していないようだ。
つまり、fstabでaclsを削ると、ACL無効でマウントされるようだ。
(fstabにaclsが無い場合、tunefs -a disableが実行される?)

それはともかく、上記を踏まえた設定例を示す。

 

fstabの設定変更

fstabのOptionsのところ、カンマに続けて「acls」と記載。
ルートファイルシステムなら、再起動。
ルートファイルシステム以外なら、umount,mountでよい。
ACLの設定はハンドブック参照。

設定前

# Device        Mountpoint      FStype  Options Dump    Pass#
/dev/ada0p2     /               ufs     rw      1       1

設定後

# Device        Mountpoint      FStype  Options Dump    Pass#
/dev/ada0p2     /               ufs     rw,acls  1       1

以上。tunefsは考えなくてよし。

以下は記録。

 

tunefsのうごき

tunefs -pでACLの状態を確認できる。

# tunefs -p /dev/ada0p2
tunefs: POSIX.1e ACLs: (-a)   disabled

tunefs -a enable/disableでACLの有効、無効を設定できる

# tunefs -a enable /dev/ada0p2
tunefs: POSIX.1e ACLs set

# tunefs -p /dev/ada0p2
tunefs: POSIX.1e ACLs: (-a)   enabled

/dev/ada0p2 は、ルートファイルシステムなのだが、そのまま起動すると、あるいは再起動するとtunefs -pの結果がdisabledに戻ってしまう。
さらに分からないのは、fstabにaclsの記載あるなしに関わらずdisabledになること。

 

実験(fstabしか見ていない…?)

fstabにaclsを記載し、あるファイルにsetfaclでACLを設定する。
ls -laで確認すると以下のように+が付く。

$ setfacl -m u:nobwak:r,o:: file.txt
$ ls -la ./file.txt
-rw-r-----+ 1 doe  doe  8  4月 23 13:45 ./file.txt
$ mount
/dev/ada0p2 on / (ufs, local, journaled soft-updates, acls)

その後、fstabからaclsを削除し、再起動したのち、ls -laで確認すると+がない。

$ ls -la ./file.txt
-rw-r-----  1 doe  doe  8  4月 23 13:45 ./file.txt
$ mount
/dev/ada0p2 on / (ufs, local, journaled soft-updates)

なお、上記の再起動前後を通してtunefs -pの結果はdisabled.

[FreeBSD] Samba 3.xからSamba 4.xへの移行

Pocket

Sambaの4.2.0リリースに伴い、3系列サポートが終了する、とのことなので、4.xに移行した。
顛末を記す。

Samba 3系列のサポート終了について

一応はソースを。
4.2.0のリリースノートに記載されている。

https://www.samba.org/samba/history/samba-4.2.0.html

With the final release of Samba 4.2, the last series of Samba 3 has been discontinued! People still running 3.6.x or earlier,should consider moving to a more recent and maintained version (4.0 – 4.2).

 

Samba 4について(Active DirectoryにしなくてもOK)

Samba 4はActive Directoryに対応しているが、従来のドメイン管理(NT4-style)もできる。
Active Directory対応の追加により、従来機能が差し替わることはないし、テストも続けられる。

なお、3から4へのアップデートで、自動的にActive Directoryへ変更されることはない。

 

移行先の選定(4.1にした)

どうせ移行するなら4.2がいいなと思ったんだけど、2015/4/28現在、4.2のports/packageはない。
しかたなく4.1にした。

 

移行にあたっての注意

4へのアップグレードにあたり注意すべきことは以下の三点である。
うっかりすると、マシン起動時にsambaが起動しなかったり、共有が消えたり、ユーザがアクセスできなくなったりする。あな恐ろし。

  1. rc.conf(マシン起動時のsamba起動設定)の書き換え
  2. samba設定ファイルの移行
  3. sambaユーザデータベースの移行

 

インストール(アップグレード)の流れ

全体の流れを示す。

  1. samba3を停める。
  2. samba3の削除
  3. samba4のインストール
  4. rc.confの書き換え
  5. 設定ファイルの移管
  6. ユーザーデータベースの移管
  7. 起動

 

Samba3の停止

アンインストールの前に。
なお、serviceコマンドで使うSambaの識別子は、3の”samba”が4では”samba_server”に変わる(後述)。

$ sudo service samba stop
Stopping smbd.
Waiting for PIDS: 654.
Stopping nmbd.
Waiting for PIDS: 651.

 

Samba3の削除とSamba4のインストール

pkgならsamba4のインストール時にsamba3を削除してくれる。
samba4インストール後のメッセージは超重要。

$ sudo pkg install samba41
(略)
Conflicts with the existing packages have been found.
One more solver iteration is needed to resolve them.
The following 6 packages will be affected (of 0 checked):

(nobwak注 samba3は自動的に削除される)
Installed packages to be REMOVED:
samba36-3.6.25

New packages to be INSTALLED:
cyrus-sasl: 2.1.26_9
libinotify: 20140622
gamin: 0.1.10_8
ldb: 1.1.19_1
samba4: 4.1.17 
(略)
Message for samba4-4.1.17 :
 ===============================================================================
How to start: http://wiki.samba.org/index.php/Samba4/HOWTO
* Your configuration is: /usr/local/etc/smb4.conf
* All the relevant databases are under: /var/db/samba4
* All the logs are under: /var/log/samba4
* Provisioning script is: /usr/local/bin/samba-tool
(略)
Bug reports should go to the: https://bugzilla.samba.org/
===============================================================================

 

rc.confの書き換え

本記事の手順上、rc.confの書き換えをここに記載しているが、本来は設定ファイルの正常性確認や検証を済ませてからのほうがよい。

sambaの3と4では、rc.confの書式が違う。
ここを忘れたままだと、serviceコマンドでのsambaサーバの操作ができないし、次回のマシン再起動時にsambaが自動起動しない。

samba3だと;
samba_enable=”YES”
samba4だと;
samba_server_enable=”YES”

したがって、rc.confは以下のようになる。
もちろん、samba3の方は、不要なら削除して構わない。

# samba_enable="YES"
samba_server_enable="YES"

 

設定ファイルの移管

sambaの3と4では、設定ファイルの場所は/usr/local/etc/の下で変更ないのだが、ファイル名が異なる。
気づかずにsamba4を起動すると共有フォルダが消える。

samba3だと;
smb.conf
samba4だと;
smb4.conf

samba3の書式はsamba4でも有効なので、コピーするかリンクを張る。
私はリンクにしておいた。

$ cd /usr/local/etc/
$ sudo ln -s ./smb.conf ./smb4.conf
$

ユーザーデータベースの移管

samba向けのユーザデータベースも移管が必要である。
これをしないとユーザごとの認証ができない。
これには、ほとほと困らされた。

ユーザデータベースの置き場所は以下の通り。

samba3だと;
/usr/local/etc/samba/
samba4だと;
/var/db/samba4/private/

したがって、/var/db/samba4/privateとディレクトリを作成し、/usr/local/etc/samba/の下にあるファイルをコピーすればよい。

なお、samba4のユーザデータベース置き場をどう調べたかというと、ビルドオプションを表示させてPRIVATE_DIRを見た。
(こんなのすぐ分かるかよ!)

$ smbd -b|less

Build environment:
   Built by:    root@101i386-default-job-07
   Built on:    Thu Apr 16 17:40:08 UTC 2015
   Built using: cc
   Build host:  FreeBSD 101i386-default-job-07 10.1-RELEASE-p9 FreeBSD 10.1-RELEASE-p9 i386
   SRCDIR:      /wrkdirs/usr/ports/net/samba41/work/samba-4.1.17/source3
   BUILDDIR:    /wrkdirs/usr/ports/net/samba41/work/samba-4.1.17/source3

Paths:
   SBINDIR: /usr/local/sbin
   BINDIR: /usr/local/bin
   CONFIGFILE: /usr/local/etc/smb4.conf
   LOGFILEBASE: /var/log/samba4
   LMHOSTSFILE: /usr/local/etc/lmhosts
   LIBDIR: /usr/local/lib
   MODULESDIR: /usr/local/lib/shared-modules
   SHLIBEXT: so
   LOCKDIR: /var/db/samba4
   STATEDIR: /var/db/samba4
   CACHEDIR: /var/db/samba4
   PIDDIR: /var/run/samba4
   SMB_PASSWD_FILE: /var/db/samba4/private/smbpasswd
   PRIVATE_DIR: /var/db/samba4/private
(以下略)

 

起動

起動前にtestparmでsmb4.confのチェックをするのはいい習慣であります。

$ testparm
Load smb config files from /usr/local/etc/smb4.conf
Processing section "[fileshare]"
Loaded services file OK.
Server role: ROLE_STANDALONE
Press enter to see a dump of your service definitions

[global]
(略)

では起動。
rc.confでsamba_server_enable=”YES”と記載しているなら、以下の通り。

$ sudo service samba_server start
Performing sanity check on Samba configuration: OK
Starting nmbd.
Starting smbd.
Starting winbindd.
$

していないなら、以下のように「onestart」にする。

$ sudo service samba_server onestart

以上。