samba4を「ふつうに」使おう!(2015/08/08 osc 2015 kansai@kyoto)
TRANSCRIPT
もくてき 対象となる方
Sambaのインストールをした!
ファイル共有はとりあえずできた!
Active Directoryとか、使わないです
で……
Sambaのファイルサーバとしての活用テクニックについて説明していきます
2
アジェンダ 基本(全体)設定&認証テクニック
アクセス制御テクニック#1 アクセス制御テクニック#2 監査テクニック
SambaのAD機能や、Winbind機構によるADとの連携については、今回はなしで
Sambaとは Windowsサーバ互換の各種機能を提供
ファイルサーバ(プリンタサーバ) ADドメインへの認証統合も可能
ネットワーク機能(WINS、ブラウジングなど)
ADドメインのDC機能
クライアント機能 LinuxからWindowsサーバのファイル共有にアクセス
実績のあるオープンソースソフトウェア各種Linuxディストリビューションなどに標準で同梱
廉価なNASの内部は大抵Samba
Sambaのサポートポリシー Samba Teamのポリシー
9か月ごとに新系列をリリース → 最長27か月サポート(期間短縮の動きあり) 最新系列(4.2.X)⇒フルサポート
1つ前(4.1.X)⇒メンテナンスサポート
2つ前(4.0.X)⇒セキュリティ修正のみサポートX部分の更新(マイナーバージョンアップ)は、バグ修正とセキュリティ修正のみ
✔ 実用上は、使用しているディストリビューションのサポートポリシーだけを意識していればよい
✔ ディストリビューションによって、パッケージの更新でベースのSambaのバージョンもアップする場合、しない場合がある
Samba活用テクニックインストールー全体設定編
インストールの基本 基本的なインストール手順
ファイアウォールの設定変更 Sambaが使用するポートを開放する
SELinuxの設定変更 有効にしたまま使うこともできますが……
sambaパッケージのインストール
smb.confファイル等の設定
Sambaユーザ作成
Samba起動!✔ ファイアウォール、SELinuxなどの設定を適切に行っていれば、基本的なアクセスはまず問題ないはず
SELinux#1 SELinuxを有効にしたまま使いたい場合
ユーザホーム機能を使う場合は、以下を実行
ファイル共有するディレクトリにsamba_share_tラベルを付与
✔ /tmpなど、システム標準のディレクトリは、あらかじめラベルが付与されているため、上記の設定は行わないこと
✔ SELinuxでアクセスが拒否されたファイルは、Samba経由ではフォルダ一覧でも表示されないので注意
# setsebool samba_enable_home_dirs on
# chcon -t samba_share_t /some/where/shared
別のパスからmvしてきたファイルにはラベルが付与されないので注意
SELinux#2 SELinux環境での留意点
Samba経由で自動実行するスクリプトは、必ず/var/lib/samba/scriptsに配置の上、次のようにしてラベルを(再)付与する
環境によっては、この他にも考慮すべき設定がある
✔ getsebool -a | grep sambaでSamba関連のSELinux変数一覧が表示できるので、適宜参照、変更する
✔ CentOSのsmb.confの冒頭にSELinuxに関する注意がある
# restorecon -R -v /var/lib/samba/scripts
スクリプトが起動できても、SELinuxのアクセス制限により正常に動作しない可能性はあるので注意
コンピュータ名とワークグループ コンピュータ名
基本はホスト名だが、別の名前にもできる
ワークグループ名近年設定の必要性は低下しているが、設定自体は従来同様可能
[global] netbios name = filesv ←コンピュータ名を設定 workgroup = WORKGROUP ←ワークグループ名を設定
日本語環境#1 基本の設定
[global] dos charset = CP932 unix charset = UTF-8
✔ dos charsetパラメータは、かならずCP932を設定✔ unix charsetパラメータは、Sambaサーバ上で使う文字コードを
UTF-8以外に変更する場合は要設定✔ unix charsetパラメータに設定した文字コードで、smb.confファイルも記述する
日本語環境#2 日本語共有名、コメントなど
[global] server string = 全社サーバ(Samba %v)
[第一課] comment = 第一課のみ書き込み可
✔ unix charsetパラメータに設定した文字コードで記述すること
ログの設定 ログレベル(通常0~10)により詳細度を指定
smbcontrolコマンドで動的にログレベルを変更
[global] log level = 1(運用環境では3以下を推奨)
✔ ログファイルは、デフォルト約50KBごとにローテーションされる(2世代保存)が、適切に運用するには外部のログ管理機構(logrotateなど)との連携が必須
# smbcontrol smbd debug 3
Sambaを起動するインタフェースの制御 必要なインタフェース以外でSambaを起動しない
[global] ; Sambaが(送信に)使用するインタフェース interfaces = 192.168.1.10/24 lo ; 上記で指定したインタフェースのみで待ち受け(listen)する bind interfaces only = yes ; nmbdのブロードキャストアドレスも以下に制限する socket address = 192.168.1.255
✔ localhostとは、必ず通信できるように設定すること✔ この設定により、インタフェースごとに別のSambaプロセスを起動することも可能
Sambaを起動するインタフェースを192.168.1.0/24とlocalhostのみに制限する例
Samba活用テクニック認証編
認証の基本概念 Linuxユーザに対応してSambaユーザを作成
Sambaユーザはなぜ必要?認証情報の形式がWindowsとLinuxとで異なる
ゲスト認証ゲスト認証とは?
一定の要件を満たした場合、ユーザ名とパスワードに関わらず、指定したユーザとして認証する機能
[global] ; 存在しないユーザからのアクセスをゲスト認証として扱う map to guest = bad user ; ゲスト認証の際はnobodyユーザとしてファイルにアクセスする guest account = nobody[share] ; ゲスト認証によるアクセスを許可する(デフォルトはno) guest ok = yes ; すべてのアクセスをゲスト認証とみなす guest only = yes
Samba-Linux間のパスワード同期 Sambaユーザのパスワード変更をLinuxに同期
Linuxユーザのパスワード変更をSambaに同期pam_smbpassモジュールを使用
ただし、CentOS 7.0からは削除されているため、ソースからインストールする以外の方法なし※今後Samba本体からも削除予定
[global] unix password sync = yes pam password change = yes
✔ rootによる強制パスワード変更時には機能しない
Windowsからのパスワード変更 Windowsの標準インタフェースから変更できる
複雑なパスワードの強制 基本の設定
crackcheckコマンド このパラメータ用にSambaに同梱されているコマンド(要
コンパイル)
[global] check password script = \ /usr/local/sbin/chkpasswd.sh ←任意のスクリプトを指定
$ echo PaSsW0rd | ./crackcheck –c –d pw_dict; echo $?ERR - it is based on a dictionary word253
パスワードを標準入力から受け取り、適切なら0、不適切なら0以外を返却するスクリプト
Samba活用テクニックファイル共有アクセス制御編
アクセス制御の概要 ホストレベルでのアクセス制御
⇒以下のパラメータをglobalセクションに設定する
ファイル共有レベルでのアクセス制御 IPアドレス単位
hosts allow, hosts denyパラメータ
ユーザ、グループ単位 valid users, invalid users, admin usersパラメータ
読み書き単位 read only, write list, read listパラメータ
ファイルシステムレベルでのアクセス制御伝統的なパーミッション、ACL、NTFS互換モジュール
ファイル共有レベルのアクセス制御#1 IPアドレス単位で制御
[share] ; アクセスを許可・拒否するIPアドレス hosts allow = 192.168.1. EXCEPT 192.168.1.1 hosts deny = 192.168.1.10 192.168.1.11
✔ 詳細な文法は、smb.conf(5)などを参照のこと
アクセスを許可するIPアドレスを192.168.1.0/24(192.168.1.1を除く)としたうえで、更に192.168.1.10と192.168.1.11をアクセス拒否する設定
ファイル共有レベルのアクセス制御#2 ユーザ、グループ単位で制御
[share] ; アクセスを許可するユーザ、グループ valid users = @users monyo ; アクセスを拒否するユーザ、グループ invalid users = guest ; 管理者権限でのアクセスを許可するユーザ、グループ admin users = monyo
usersグループとmonyoユーザにアクセスを許可し、guestユーザのアクセスを拒否したうえで、monyoユーザのアクセスを管理者(root)で行う設定
✔ グループ名の先頭には「@」もしくは「+」を付ける
ファイル共有レベルのアクセス制御#3 読み書き単位で制御
[share] ; 共有を読み取り専用にする read only = yes ; ただし、以下で指定するユーザ、グループは書き込みを許可する write list = monyo @admin
✔ 共有のデフォルトは読み取り専用。read only = noもしくはwriteable = yesで書き込み可能となる
✔ 特定のユーザやグループのみ書き込み可能としたい場合は、上のようにwrite listパラメータを使うとよい。
✔ 書き込み可能な共有で特定のユーザやグループを読み取り専用としたい場合に備え、read listというパラメータもある
ファイル共有レベルのアクセス制御#4 アクセス制御の組合せ設定例
[share] ; 共有にアクセスできるのはusersもしくはguestsグループのユーザ valid users = @users, @guests ; 共有を読み取り専用にする(デフォルト値) read only = yes ; ただし、usersグループのユーザには書き込みを許可する write list = @users
✔ usersグループのユーザは読み書き可能✔ guestsグループのユーザは読み取り専用✔ それ以外のユーザはアクセス不可
ゲスト認証による誰でも読み書きできる共有を作りたい!
[global] map to guest = bad user[public] path = /var/lib/samba/shares/public writeable = yes guest ok = yes guest only = yes
✔ publicディレクトリの所有者をnobodyにして、所有者が読み書きできるようにしておくこと⇒でないと、パーミッション的に書けないといった事態に…
✔ Sambaユーザを作成しなければ、すべてのアクセスが「存在しないユーザ」⇒「ゲスト認証」となり、guest ok = yesによりpublic共有にゲスト認証でアクセスできる
アクセス制御の概要(再掲) ホストレベルでのアクセス制御
⇒以下のパラメータをglobalセクションに設定する
ファイル共有レベルでのアクセス制御 IPアドレス単位
hosts allow, hosts denyパラメータ
ユーザ、グループ単位 valid users, invalid users, admin usersパラメータ
読み書き単位 read only, write list, read listパラメータ
ファイルシステムレベルでのアクセス制御伝統的なパーミッション、ACL、NTFS互換モジュール
ファイルシステムレベルでのアクセス制御#1 ファイルシステムのパーミッションやACLで許可
されていない操作はできない Linux上で直接ファイルを操作する場合は特に注意
パーミッションの操作はSamba経由でもできるが、Windows的に直観的でないためお勧めしない
ファイルシステムレベルでのアクセス制御に対する対応方針以下のいずれかを推奨
制御を行わない⇒各種パラメータでパーミッションを一律設定し、Samba経由でのアクセス時は常にアクセス可能な状態とする
ACLやNTFS互換アクセス許可モジュールで制御を行う
ファイルシステムレベルでのアクセス制御#2 各対応方針の簡易比較
アクセス制御の方式
Linux上でのアクセス制御
Samba経由でのアクセス制御
設定の難易度
制御しない ×一律同じパーミッションに設定
×制御しない(他の設定で制御する前提)
易~並
ACLによる制御 ○POSIX ACLによるアクセス制御
△NTFSに準ずるアクセス許可で制御
難
NTFS互換モジュール ×一律同じパーミッションに設定
○NTFS完全互換のアクセス許可で制御
易
✔ ファイル共有単位のアクセス制御で充分であれば「制御しない」方式が簡便⇒おすすめ
✔ NTFSとの完全互換が必要であればNTFS互換モジュール※とはいえ、NTFSの「フルコントロール」をユーザに開放していますか?
✔ ACLによる制御は高機能だが、いろいろ注意が必要
ファイルシステムレベルでのアクセス制御#3 制御を行わない⇒パーミッションの強制設定
次のような設定を推奨(smb.confとパーミッション)[share1] path = /some/where/share1 writeable = yes force create mode = 664(もしくは660など) force directory mode = 775(もしくは770など) force group = share1g
# chmod 775(もしくは770など) /some/where/share1# chgrp share1g /some/where/share1
✔ Sambaの設定で、共有内に書き込まれたファイルの所属グループを強制的にshare1gに設定し、グループへの書き込み権も付与する
✔ パーミッション的に、share1gグループに所属するユーザが書き込みできるように初期設定
ファイル共有レベルのアクセス制御#3 ファイルにアクセスするユーザ、グループを強
制変更[share] ; 共有内のファイルへのアクセスを強制的にユーザmonyo権限で実行 force user = monyo ; 共有内のファイルへのアクセスを強制的にグループusers権限で実行 force group = users ; 共有内のファイルへのアクセスを強制的にユーザroot権限で実行 ; するユーザ admin users = user1 @group2
✔ 強制変更は本来のユーザとしての認証成功後に行われる
ファイルシステムレベルでのアクセス制御#4 ACLによる制御の流れ
ファイルシステムでACLを有効にする Linuxの場合、マウントオプションにaclを付加
smb.confの設定+各ファイル共有でのパーミッション、ACL初期設定 パーミッションはアクセス制御に使わない
⇒変に影響がでないように一律設定
共有トップのディレクトリにACLとDefault ACLを設定
アクセス制御の動作 POSIX ACLのrwxとNTFSのアクセス許可が相互マッピ
ングされる。最終的なアクセス制御はACLの機能で実施⇒完全互換ではないため細かい制約が発生
ファイルシステムレベルでのアクセス制御#5 ACLによるアクセス制御の設定例
[aclshare] path = /some/where/aclshare writeable = yes ; パーミッション設定によりファイルへのアクセスを許可しないよう、 ; 所有者、所有グループを常にrootとし、上位パーミッションを引き継ぐ inherit owner = yes inherit permissions = yes force group = root ; 書き込み可能なファイルのACLを変更できるようにする dos filemode = yes
✔ アクセス許可情報は拡張属性に格納されるため、ファイルシステムで拡張属性(user_xattrマウントオプション)が有効になっている必要がある(最近ではデフォルト有効)
ファイルシステムレベルでのアクセス制御#5 ACLによるアクセス制御の設定例
✔ 設定の混乱を避けるため、パーミッション的には(root以外)誰もアクセスできない設定を行う
✔ ACLで必要なグループ(やユーザ)にアクセス権を付与する✔ Default ACL(ディレクトリ内に新規作成されたファイル、ディレクトリに付与されるACL)の設定を忘れないこと
# mkdir –p /some/where/aclshare1 ←ディレクトリを作成# chown root:root /some/where/aclshare1 ←所有者、グループをrootに指定# chmod 770 /some/where/aclshare1 ←所有者、グループ以外のアクセスを禁止# setfacl -d -m u::rwx,g::rwx,o::--- /home/samba/aclshare1 ↑ACLマスクの設定# setfacl -m group:aclshare1rw:rwx /home/samba/aclshare1# setfacl -d -m group:aclshare1rw:rwx /home/samba/aclshare1 ↑書き込み可能なグループの設定例(ACLおよびDefault ACL)# setfacl -m group:aclshare1ro:r-x /home/samba/aclshare1# setfacl -d -m group:aclshare1ro:r-x /home/samba/aclshare1 ↑読み取り専用のグループの設定例(ACLおよびDefault ACL)
ファイルシステムレベルでのアクセス制御#6 NTFSモジュール
[share] vfs objects = acl_xattr acl_xattr:ignore system acls = yes
✔ アクセス許可情報は拡張属性に格納されるため、ファイルシステムで拡張属性(user_xattrマウントオプション)が有効になっている必要がある(最近はデフォルト有効)
✔ ignore system aclsがno(デフォルト)だと、NTFSアクセス許可による制御に加え、パーミッションやACLでの制御も行われる⇒Sambaの利用者からみると不可解な動作が発生する
✔ ignore system aclsがyesの場合、Samba経由のアクセスの際、パーミッションやACLは無視され、NTFS完全互換動作が実現⇒グループが所有者となるなど、Linuxにない概念にも対応
Samba活用テクニックファイル共有機能編
ユーザホーム機能#1 ユーザホーム機能とは?
各ユーザのホームディレクトリを共有し、ユーザのアクセス時に該当ユーザの共有を表示する機能
[homes] browseable = no writeable = yes
ユーザ「monyo」でアクセスしたため、monyoという共有が表示されている
ドットファイルが「隠しファイル」として表示される
ユーザホーム機能#2 ドットファイルを参照されたくない場合
後述するveto files = /.?*/を設定する ドットファイルへのアクセスを禁止する
ユーザホーム機能で共有するホームディレクトリのパスを変更するそもそもホームディレクトリ直下にアクセスさせない
[homes] …… ; Samba経由のアクセスの際、各ユーザの.smbdir以下を共有する path = %H/.smbdir
✔ .smbdir自体は別途作成する仕組みが必要
特定の共有を隠す#1指定した共有を非表示にする
[share1] browseable = no
[share2$] ……
✔ 末尾に「$」のついた名前の共有は共有一覧で表示されない⇒これはWindowsの仕様
✔ 共有一覧で表示されないだけで、共有名を直接指定すれば、共有にアクセスできる
特定の共有を隠す#2特定ユーザに対してのみ、共有を表示する
[share] browseable = no include = share.%G
✔ 「%G」は、アクセスしたユーザの所属グループ名に変換される
✔ 所属グループがgroup1だとshare.group1ファイルの内容が読み込まれるため、共有が表示される
✔ 所属グループがそれ以外の
browseable = yes
smb.confファイル
share.group1ファイル
場合、includeパラメータで指定したファイルは存在しないためこの設定は単に無視される
✔ browseableパラメータの代わりにavailableパラメータを設定することで、特定ユーザのみアクセス可能な共有を設定できる
特定のファイルを隠す#1指定したファイルへのアクセスを禁止する
[share] ; EXEファイルと「.」から始まるファイルへのアクセスを禁止する veto files = /*.EXE/.?*/ delete veto files = yes
✔ このパラメータで指定したファイルは、ファイル一覧でも表示されず、存在しないものとして扱われる
✔ ここで指定したファイルをコピーや作成しようとしても失敗する
✔ 特定のファイル(実行ファイルなど)を置かれたくない場合や、Linux上に存在する特定ファイル(ドットファイルなど)を隠したい場合などに使うとよい
ファイル属性のサポート ファイル属性とは…?
アーカイブ、読み取り専用、システム、隠し、の4つ
Sambaによるサポート拡張属性を使って情報を保存
[share] store dos attributes = yes map archive = no
✔ ファイルシステムによる拡張属性のサポートが必要
✔ サポートがない場合は、ファイルの実行属性に情報を保存
代替データストリームのサポート代替データストリームとは…?
ファイルに複数のデータ領域を持たせる機能 IEからダウンロードしたファイルのゾーン情報など
Sambaでは拡張属性を使って情報を保存
✔ ファイルシステムによる拡張属性のサポートが必要✔ 細かい点で挙動がNTFSと完全互換ではない
[share] vfs objects = streams_xattr
ごみ箱#1 recycleモジュールにより、削除したファイルの復活が可能[share] vfs objects = recycle ; 20MBを超えるサイズのファイルはごみ箱にいれない recycle:maxsize = 20000000 ; 同一ファイル名のファイルが削除された際に別名でごみ箱に保存する recycle:versions = yes ; ディレクトリ構造を保持する recycle:keeptree = yes ; ごみ箱格納時に、ファイルのアクセス時刻を更新する recycle:touch = yes ……
✔ 古くなったごみ箱の中身は蓄積され続けるので、ファイルの最終アクセス時刻から一定以上経過したファイルを削除するといった運用が必要
ごみ箱#2複数ユーザで共用する共有の場合は、設定に
注意が必要ごみ箱をユーザごとにする場合
ごみ箱を共用にする場合
; ごみ箱のパスを%U変数で指定するのがコツ recycle:repository = .recycle.%U
; ごみ箱のパーミッションを700以外に変更 recycle:directory_mode = 770
✔ これ以外にも、ディレクトリのパーミッションや所有グループなど、フォルダのセキュリティ設定を踏まえた設定が追加で必要となる場合あり
Sambaサーバへのアクセス監査 Linux標準のログイン履歴ファイルに記録する
設定も可能
ログ出力例(lastコマンド)
[global] utmp = yes
✔ ユーザ名やホスト名を省略せず表示する際は「last -w」コマンドを使う✔ full_auditモジュールでconnectを監査しても同等の出力は得られる
monyo smb/1 ::ffff:192.168.1 Sun Aug 2 20:14 still logged inmonyo pts/0 mizuki.home.mony Sun Aug 2 18:37 - 20:09 (01:32)damedame smb/3 ::ffff:192.168.1 Sat Aug 1 22:35 - 22:36 (00:00)monyo smb/1 ::ffff:192.168.1 Sat Aug 1 19:16 - 01:11 (05:55)
Sambaサーバへのアクセス監査#2 full_auditモジュールにより、詳細なアクセス監
査が可能
ログ出力例
vfs objects = full_audit full_audit:prefix = %u|%I|%S full_audit:success = connect disconnect ... full_audit:failure = connect disconnect ...
Dec 30 03:39:51 samba32a smbd_audit: local1|192.168.135.1|connect|ok|tmpDec 30 03:39:51 samba32a smbd_audit: local1|192.168.135.1|getxattr|fail (Operation not permitted)|.|user.DOSATTRIBDec 30 03:42:11 samba32a smbd_audit: local1|192.168.135.142|open|fail (Permission denied)|r|testdirJan 12 18:50:41 lenny smbd_audit: monyo|192.168.135.233|shared|closedir|ok|Jan 12 18:50:41 lenny smbd_audit: monyo|192.168.135.233|shared|closedir|ok|Jan 12 18:51:20 lenny smbd_audit: monyo|192.168.135.23|shared|disconnect|ok|shared
参考情報ほか書籍「Samba[実践]入門」
著者: 髙橋基信 / 技術評論社
書籍「改訂版Sambaのすべて」著者: 髙橋基信 / 翔泳社
ご清聴ありがとうございました