見出し画像

393.1 ファイルサービス

主題393:Sambaの共有の設定
393.1 ファイルサービス

LinuC300の試験範囲である主題390~397まであるうちの「主題393:Sambaの共有の設定」から「393.1 ファイルサービス」についてのまとめ

  • 重要度:4

  • 説明:
    混在環境においてファイル共有の作成と設定を行えること。

  • 主要な知識範囲
    - ファイル共有の作成と設定を行う
    - ファイルサービスの移行を計画する
    - IPC$の秘匿
    - ユーザやグループがファイル共有を操作するためのスクリプトを作成する
    - Sambaの共有アクセスの設定パラメータ

  • 重要なファイル、用語、ユーティリティ:
    - smb.conf
    - [homes]
    - smbcquotas
    - smbsh
    - browseable、 writeable、 valid users、 write list、 read list、 read only および guest ok
    - IPC$
    - mount、 smbmount


(補足)
Sambaユーザーは事前に作成されています。
(別記事 Appendix (準備その4)ユーザーを作成する 参照)


ファイル共有の作成と設定を行う

ファイルの共有をするにはsmb.confにセクションを追加する。
以下の操作例では新たに[share1]を追加とグローバルセクション([global])の一部設定を変更しています。

[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# mkdir -p /var/samba_share/share1
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# ls -ld /var/samba_share/share1
drwxr-xr-x 2 root root 2  64 23:04 /var/samba_share/share1
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# vi /usr/local/samba/lib/smb.conf
     :
[global]
     :
   workgroup = WORKGROUP
     :
   server string = rocky9-samba31 Samba3 Server No1
     :
   dos charset = CP932
   unix charset = UTF-8
   create mask = 644
   directory mask = 755
   max protocol = SMB2
     :
[share1]
    comment = %L share directory
    path = /var/samba_share/share1
    public = yes
    writable = yes

[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# testparm -s
Load smb config files from /usr/local/samba/lib/smb.conf
Processing section "[homes]"
Processing section "[printers]"
Processing section "[share1]"
Loaded services file OK.
Server role: ROLE_STANDALONE
[global]
        dos charset = CP932
        server string = rocky9-samba31 Samba3 Server No1
        log file = /usr/local/samba/var/log.%m
        max protocol = SMB2
        dns proxy = No
        idmap config * : backend = tdb
        create mask = 0644

[homes]
        comment = Home Directories
        read only = No
        browseable = No

[printers]
        comment = All Printers
        path = /usr/spool/samba
        printable = Yes
        print ok = Yes
        browseable = No

[share1]
        comment = %L share directory
        path = /var/samba_share/share1
        read only = No   <--- writable = yes が置き換わっている
        guest ok = Yes   <--- public = yes が置き換わっている
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# systemctl restart smb
[root@rocky9-samba31 ~]#

(補足)
Samba3ではSMBのバージョンはSMB1.0(max protocol = NT1)になっている。
Windows10の場合はデフォルトでSMB1.0は無効化されているので、SMB1.0のSambaサーバーにアクセスすると以下のような警告が出るので、SMB1.0を有効化する必要がある。

SMB1.0が必要であるという警告が表示される
Windowsの機能 で「SMB1.0/CIFSファイル共有のサポート」を有効化する

ファイルサービスの移行を計画する

ファイルサービスの移行に際して留意しておきたい項目。
・利用するファイルサービスのミドルウェア(Samba or Samba以外)
・使用するファイルシステム(xfs, zfs, btrfs,…)
・必要なディスク容量
・ディスクの冗長化の有無(RAIDなど)
・バックアップ計画
・ユーザーデータベース
・ディスククォータ設定の有無
・そのた いろいろ

これらの留意事項のうちSambaの機能として対応するべきはユーザーデータベースとディスククォータの有無になる。

~ユーザーデータベース~
Sambaのユーザーデータベースはpassdb.tdbやsecrets.tdbに格納されているのでtdbbackupやtdbtoolなどで対応可能。
(別記事 392.4 Sambaのトラブルシューティング 参照)

~ディスククォータ~

smbcquotasコマンドにより、Windows 2000 Server以降で実装されたディスククォータを、Sambaサーバーから表示、設定することが可能となります。

改訂版 Sambaのすべて』(翔泳社)

(別記事 Appendix smbcquotasコマンド 参照)
参考:LPIC-3 300 smbcquotas - The Urban Penguin


IPC$の秘匿

~IPCとは~
IPC(Interprocess Communications)はリモート・プロセス間通信共有という特殊な共有サービスである。
マイクロソフトのWEBサイトには以下のような記述があった。

IPC$ 共有について
IPC$ 共有は、null セッション接続とも呼ばれます。 このセッションを使用すると、Windows では、匿名ユーザーは、ドメイン アカウントの名前やネットワーク共有の列挙など、特定のアクティビティを実行できます。

IPC$ 共有は、Windows Server サービスによって作成されます。 この特別な共有は、サーバーへの後続の名前付きパイプ接続を許可するために存在します。 サーバーの名前付きパイプは、組み込みのオペレーティング システム コンポーネントと、システムにインストールされているアプリケーションまたはサービスによって作成されます。 名前付きパイプを作成するときに、プロセスはパイプに関連付けられているセキュリティを指定します。 その後、指定したユーザーまたはグループにのみアクセスが許可されるようにします。

IPC$ 共有と null セッションの動作 - Windows Server | Microsoft Learn
★ Sambaサーバーで共有を確認 ★
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# smbstatus -S

Service      pid     machine       Connected at
-------------------------------------------------------
IPC$         152   sakuzo-win10    Tue Jun  6 23:06:37 2023  <--- IPC$共有
user00       152   sakuzo-win10    Tue Jun  6 23:06:56 2023

[root@rocky9-samb31 ~]#
★ クライアントPC(Windows10)のPowerShellで共有を確認 ★
PS C:\>
PS C:\> net use
新しい接続は記憶されます。


ステータス  ローカル名 リモート名                ネットワーク名

-------------------------------------------------------------------------------
OK                     \\192.168.56.31\IPC$      Microsoft Windows Network  <--- IPC$共有
コマンドは正常に終了しました。

PS C:\>
IPC$共有にアクセスできるわけではない

IPC$は共有リソースをユーザーやパスワードなどを使わずに匿名で取得することを可能にする仕組みで Nullセッション と呼ばれている。
このNullセッションを悪用したNullセッション攻撃という攻撃手法がある。

IDとパスワードのような認証を省略して気軽に共有フォルダにアクセスできるのは利便性が高いものの、一方ではその機能が攻撃を受けるリスクになるという側面もあると言える。
このことから必要に応じてIPC$への接続を制限する必要がある。

制限方法(1):[IPC$]セクションで通信制限
hosts allow(allow hosts):信頼できるネットワークを許可
hosts deny(deny hosts):信頼できないネットワークを拒否
お互いの設定で矛盾が生じている場合は hosts allow が優先される。

[IPC$]
   hosts allow = 10.0.0.0/24 127.0.0.1
   hosts deny = 0.0.0.0/0

制限方法(2):パケットフィルタリング
Sambaサーバーでiptablesやfirewalldのようなパケットフィルタリング機能で通信制限をする。
もしくは、ネットワーク上にファイアウォールを配置し適切なフィルタリグ設定をする。


ユーザやグループがファイル共有を操作するためのスクリプトを作成する

~smbsh~
smbshコマンドに関する情報で見つけられたのものは非常に少ない。
O'ReillyのWEBサイトには次のような記述があった。

To use smbsh, your Samba installation must be configured using the configure option --with-smbwrapper.

Samba, SecoUsing nd Edition by

また、smbwrapperというキーワードを検索すると日本Sambaユーザー会のWEBサイトに次のような記述があった。

--with-smbwrapper
smbshコマンドを使用する場合は指定する。
Linuxカーネル2.2/2.4では現在うまく動作しない。
Linuxカーネル2.0なら指定してみると良い。
(デフォルトはなし)

日本Sambaユーザ会 - Samba 2.2 日本語版インストール

別記事で紹介している Samba3.6 の configure オプションには --with-smbwrapper はなかったのでSamba3よりも古いバージョンで使われていたので、現在は利用できないコマンドであると推測される。
(別記事 Appendix Samba3 ./configure --help 参照)

~smbmount~
こちらもsmbsh同様にsmbmountコマンドの情報で見つけられたのものは非常に少ない。
Samba3.0をソースからインストールする際に --with-smbmount をつけることでsmbmountが使えるようになるという情報がいくつかあったが、Samba3.6 の configure オプションには含まれていないので、どこかのバージョンで削除されたものと推測される。
(別記事 Appendix Samba3 ./configure --help 参照)

~smbclient~
Samba3.0.12から追加されたコマンド。
サーバー上の SMB/CIFS リソースにアクセスする ftp のようなクライアントツール。
(別記事 Appendix smbclientコマンド 参照)

-L:サーバー上で利用可能な サービスを一覧する
-U:接続するSambaユーザーを指定する

★ Samba3のsmbclientコマンド ★
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# smbclient -L 192.168.56.31 -U user00
Enter user00's password: **********   <-- パスワードを入力
Domain=[WORKGROUP] OS=[Unix] Server=[Samba 3.6.25]

        Sharename       Type      Comment
        ---------       ----      -------
        share1          Disk      rocky9-samba31 share directory
        IPC$            IPC       IPC Service (rocky9-samba31 Samba3 Server No1)
        user00          Disk      Home Directories
Domain=[WORKGROUP] OS=[Unix] Server=[Samba 3.6.25]

        Server               Comment
        ---------            -------
        **********
        ROCKY9-SAMBA31       rocky9-samba31 Samba3 Server No1

        Workgroup            Master
        ---------            -------
        WORKGROUP            **********
[root@rocky9-samba31 ~]#
★ Samba4のsmbclientコマンド ★
[root@rocky9-samba41 ~]#
[root@rocky9-samba41 ~]# smbclient -L 192.168.56.31 -U user00
Password for [SAMBA\user00]: **********   <-- パスワードを入力

        Sharename       Type      Comment
        ---------       ----      -------
        share1          Disk      rocky9-samba31 share directory
        IPC$            IPC       IPC Service (rocky9-samba31 Samba3 Server No1)
        user00          Disk      Home Directories
SMB1 disabled -- no workgroup available
[root@rocky9-samba41 ~]#

~smbclient操作例(1)~
rocky9-samba31 にあるファイルを rocky9-samba41 にダウンロード(get)する

★ rocky9-samba31 にファイルを用意する ★
[root@rocky9-samba31 ~]#
[root@rocky9-samba31 ~]# cd /var/samba_share/share1/
[root@rocky9-samba31 share1]#
[root@rocky9-samba31 share1]# touch samba31-test0{1,2,3}.txt
[root@rocky9-samba31 share1]#
[root@rocky9-samba31 share1]# ls -lF
合計 2
-rw-r--r-- 1 root root 0  65 22:47 samba31-test01.txt
-rw-r--r-- 1 root root 0  65 22:47 samba31-test02.txt
-rw-r--r-- 1 root root 0  65 22:47 samba31-test03.txt
[root@rocky9-samba31 share1]#
★ rocky9-samba41 から rocky9-samba31 に user00 で接続しファイルをgetする ★
[root@rocky9-samba41 ~]#
[root@rocky9-samba41 ~]# ls -l
合計 0
[root@rocky9-samba41 ~]#
[root@rocky9-samba41 ~]# smbclient '\\192.168.56.31\share1' -U user00
Password for [SAMBA\user00]: **********   <-- パスワードを入力
Try "help" to get a list of possible commands.
smb: \>
smb: \> help
?              allinfo        altname        archive        backup
blocksize      cancel         case_sensitive cd             chmod
chown          close          del            deltree        dir
du             echo           exit           get            getfacl
geteas         hardlink       help           history        iosize
lcd            link           lock           lowercase      ls
l              mask           md             mget           mkdir
more           mput           newer          notify         open
posix          posix_encrypt  posix_open     posix_mkdir    posix_rmdir
posix_unlink   posix_whoami   print          prompt         put
pwd            q              queue          quit           readlink
rd             recurse        reget          rename         reput
rm             rmdir          showacls       setea          setmode
scopy          stat           symlink        tar            tarmode
timeout        translate      unlock         volume         vuid
wdel           logon          listconnect    showconnect    tcon
tdis           tid            utimes         logoff         ..
!
smb: \>
smb: \> pwd
Current directory is \\192.168.56.31\share1\
smb: \>
smb: \> ls
  .                                   D        0  Mon Jun  5 00:25:01 2023
  ..                                  D        0  Sun Jun  4 23:04:58 2023
  samba31-test01.txt                  N        0  Mon Jun  5 22:47:45 2023
  samba31-test03.txt                  N        0  Mon Jun  5 22:47:45 2023
  samba31-test02.txt                  N        0  Mon Jun  5 22:47:45 2023

                48818816 blocks of size 1024. 47916800 blocks available
smb: \>
smb: \> get samba31-test03.txt
getting file \samba31-test03.txt of size 0 as samba31-test03.txt (0.0 KiloBytes/sec) (average 0.0 KiloBytes/sec)
smb: \>
smb: \> exit
[root@rocky9-samba41 ~]#
[root@rocky9-samba41 ~]# ls -l
合計 1
-rw-r--r-- 1 root root 0  65 22:49 samba31-test03.txt
[root@rocky9-samba41 ~]#

~smbclient操作例(2)~
rocky9-samba41 にあるファイルを rocky9-samba31 にアップロード(put)する

[root@rocky9-samba41 ~]#
[root@rocky9-samba41 ~]# touch samba41-test0{1,2,3}.txt
[root@rocky9-samba41 ~]#
[root@rocky9-samba41 ~]# ls -l
合計 2
-rw-r--r-- 1 root root 0  65 22:49 samba31-test03.txt <-- 前の操作でgetしたファイル
-rw-r--r-- 1 root root 0  65 22:56 samba41-test01.txt
-rw-r--r-- 1 root root 0  65 22:56 samba41-test02.txt
-rw-r--r-- 1 root root 0  65 22:56 samba41-test03.txt
[root@rocky9-samba41 ~]#
[root@rocky9-samba41 ~]# smbclient '\\192.168.56.31\share1' -U user00
Password for [SAMBA\user00]:
Try "help" to get a list of possible commands.
smb: \>
smb: \> pwd
Current directory is \\192.168.56.31\share1\
smb: \>
smb: \> ls
  .                                   D        0  Mon Jun  5 00:25:01 2023
  ..                                  D        0  Sun Jun  4 23:04:58 2023
  samba31-test01.txt                  N        0  Mon Jun  5 22:47:45 2023
  samba31-test03.txt                  N        0  Mon Jun  5 22:47:45 2023
  samba31-test02.txt                  N        0  Mon Jun  5 22:47:45 2023

                48818688 blocks of size 1024. 47916672 blocks available
smb: \>
smb: \> put samba41-test02.txt
putting file samba41-test02.txt as \samba41-test02.txt (0.0 kb/s) (average 0.0 kb/s)
smb: \>
smb: \> ls
  .                                   D        0  Mon Jun  5 00:25:01 2023
  ..                                  D        0  Sun Jun  4 23:04:58 2023
  samba31-test01.txt                  N        0  Mon Jun  5 22:47:45 2023
  samba41-test02.txt                  N        0  Mon Jun  5 23:03:26 2023
  samba31-test03.txt                  N        0  Mon Jun  5 22:47:45 2023
  samba31-test02.txt                  N        0  Mon Jun  5 22:47:45 2023

                48818688 blocks of size 1024. 47916672 blocks available
smb: \>
smb: \> exit
[root@rocky9-samba41 ~]#
[root@rocky9-samba31 share1]#
[root@rocky9-samba31 share1]# ls -l
合計 2
-rw-r--r-- 1 root   root   0  6月  5 22:47 samba31-test01.txt
-rw-r--r-- 1 root   root   0  6月  5 22:47 samba31-test02.txt
-rw-r--r-- 1 root   root   0  6月  5 22:47 samba31-test03.txt
-rw-r--r-- 1 user00 user00 0  6月  5 23:03 samba41-test02.txt <-- rocky9-samba41からputされたファイル
[root@rocky9-samba31 share1]#

~mount -t cifs~
mountコマンドでSambaの共有フォルダをマウントすることができる。
/etc/fstab に設定することもできる。

※lxdコンテナで mount -t cifs コマンドを使う場合は下記コマンドで "ecurity.privileged" という設定を "false(default)" から "true" に変更してコンテナを再起動する必要があります。

ubuntu@linuc300:~$ 
ubuntu@linuc300:~$ lxc config set <コンテナ名> security.privileged true
ubuntu@linuc300:~$ lxc restart <コンテナ名>
ubuntu@linuc300:~$ 

~mount -t cifs 操作例~
rocky9-samba31 にある共有フォルダ(share1)を rocky9-samba41 にマウントする。
マウントできてしまえばSambaサーバーの共有フォルダがローカル上に存在するディレクトリと同じように扱う事ができる。

★ cifs-utilsパッケージをインストール ★
[root@rocky9-samba41 ~]#
[root@rocky9-samba41 ~]# dnf install -y cifs-utils
[root@rocky9-samba41 ~]#


★ マウントポイントとなるディレクトリを作成 ★
[root@rocky9-samba41 ~]#
[root@rocky9-samba41 ~]# mkdir -p /mnt/samba31/share1
[root@rocky9-samba41 ~]#
[root@rocky9-samba41 ~]# ls -ld /mnt/samba31/share1
drwxr-xr-x 2 root root 2  65 23:10 /mnt/samba31/share1
[root@rocky9-samba41 ~]#

★ マウントする ★
[root@rocky9-samba41 ~]#
[root@rocky9-samba41 ~]#
[root@rocky9-samba41 ~]# mount -t cifs -o vers=1.0,username=user00,password=password00 //192.168.56.31/share1 /mnt/samba31/share1
[root@rocky9-samba41 ~]#
[root@rocky9-samba41 ~]# df -h
ファイルシス                      サイズ  使用  残り 使用% マウント位置
default/containers/rocky9-samba41    47G  594M   46G    2% /
none                                492K  4.0K  488K    1% /dev
udev                                1.9G     0  1.9G    0% /dev/fuse
tmpfs                               100K     0  100K    0% /dev/lxd
tmpfs                               100K     0  100K    0% /dev/.lxd-mounts
tmpfs                               2.0G     0  2.0G    0% /dev/shm
tmpfs                               785M  8.1M  777M    2% /run
tmpfs                               4.0M     0  4.0M    0% /sys/fs/cgroup
//192.168.56.31/share1               47G  881M   46G    2% /mnt/samba31/share1   <-- マウントされている
[root@rocky9-samba41 ~]#
[root@rocky9-samba41 ~]# ls -l /mnt/samba31/share1
合計 4096
-rw-r--r-- 1 root root 0  65 22:47 samba31-test01.txt
-rw-r--r-- 1 root root 0  65 22:47 samba31-test02.txt
-rw-r--r-- 1 root root 0  65 22:47 samba31-test03.txt
-rw-r--r-- 1 1000 1000 0  65 23:03 samba41-test02.txt
[root@rocky9-samba41 ~]#

(補足)Samba3にアクセスする際の注意

Samba3.6でSMB2.0がサポートされている。
デフォルトは max protocol = NT1 となっていてSMB1.0になっているので、max protocol = SMB2 という設定を追加すればSMB2.0が利用できる。
しかし、CIFSでマウントしようとするとデフォルトSMB2.1以上の新しいバージョンで接続を試みているようでエラーになってしまうので、mountコマンドのオプションに -o vers=1.0 を追加して明示的にSMB1.0で接続する必要がある。

[root@rocky9-samba41 ~]#
[root@rocky9-samba41 ~]# mount -t cifs -o username=user00,password=password00 //192.168.56.31/share1 /mnt/samba31/share1
mount error(22): Invalid argument
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs) and kernel log messages (dmesg)
[root@rocky9-samba41 ~]# 
[root@rocky9-samba41 ~]# dmesg | grep CIFS
     :
[ 4510.275146] CIFS: No dialect specified on mount. Default has changed to a more secure dialect, SMB2.1 or later (e.g. SMB3.1.1), from CIFS (SMB1). To use the less secure SMB1 dialect to access old servers which do not support SMB3.1.1 (or even SMB3 or SMB2.1) specify vers=1.0 on mount.
     :
[root@rocky9-samba41 ~]#

Sambaの共有アクセスの設定パラメータ

~グローバルセクションで定義する設定~

  • guest account = nobody
    guest ok = Yes と設定されている場合、Sambaサーバーにアクセスする際に適用されるユーザー名。

  • map to guest = Never
    Sambaサーバー上にユーザーが存在しなかったりパスワードが不正だった場合など認証ができなかったユーザーをどのように扱うかを定義する。
    Never:拒否する
    Bad User:不正なパスワードでのログインは拒否し、Sambaサーバー上に存在しないユーザーをゲストログインとして扱い guest account で指定されたアカウントにマッピングする。
    Bad Password:不正パスワードでのログインは guest account で指定されたアカウントにマッピングする。
    Bad Uid:security = DOMAIN または ADS で構成されている場合のみ意味を持つ。 認証が成功したにも関わらずSambaサーバー上にユーザーが存在しない場合に guest account で指定されたアカウントにマッピングする。

~共有フォルダを定義する設定~

  • path =
    セクション名(=共有名)に対応するディスク上のパス。

  • browseable(browsable) = Yes
    ブラウザリストに表示させる設定。

  • comment =
    ブラウザリストで表示させる補足情報。

  • hide dot files = No
    ドット( . )で始まるファイルを非表示にする。

  • hide files =
    非表示にするファイルを指定する。

  • hide special files = No
    ソケット、デバイス、FIFOなどの特殊なファイルを非表示にする。

  • hide unreadable = No
    読み取り権限がないファイルを非表示にする。

  • hide unwriteable files = No
    書き込み権限がないファイルを非表示にする。

~共有フォルダへのアクセスを制限する~

  • guest ok(public) = No
    Sambaのユーザーデータベースに存在しないユーザーのアクセスをゲストアクセスとして接続を許可する。
    map to guest = Bad User である必要がある。

  • guest only = No
    Sambaのユーザーデータベースに存在しないユーザーのアクセスをゲストアクセスのみ許可される。 
    map to guest = Bad User と guest ok = Yes になっている必要がある。

  • valid users =
    サービスの利用を許可するユーザー。

  • invalid users =
    サービスの利用を拒否するユーザーを+, &, @ などの記号を用いて定義する。

  • hosts allow(allow hosts) =
    サービスに対するアクセスを許可するホストを定義する。複数設定する場合はカンマ( , )、スペース、タブで区切る。

  • hosts deny(deny hosts) =
    サービスに対するアクセスを許可するホストを定義する。 複数設定する場合はカンマ( , )、スペース、タブで区切る。
    hosts allowと矛盾が生じる場合はhosts allowが優先される。

~共有フォルダ内のファイルやディレクトリの所有者を制御する~

  • force group(group) =
    共有フォルダにアクセスするユーザーの所属グループを指定されたグループ名にする。

  • force user =
    共有フォルダにアクセスするユーザー名を指定されたユーザー名にする。

  • inherit owner = No
    新たに作成するディレクトリやファイルの所有者について親ディレクトリの設定を引き継ぐ。

  • inherit permissions = No
    新たに作成するディレクトリやファイルのパーミッションについて親ディレクトリの設定を引き継ぐ。

~読み書きを制御する設定~

  • read only = Yes / writeable = No ※反意語
    読み取り専用を拒否 → 書き込み可能。

  • read list =
    読み取り許可を与えるユーザーを定義する。
    read only(writeable)の設定に関係なくこの設定によって読み取りのみ可能になる。

  • write list =
    書き込み許可を与えるユーザーを定義する。
    read only(writeable)の設定に関係なくこの設定によって書き込みが可能になる。

  • veto files =
    アクセスを禁止するファイルやディレクトリを指定する。

  • delete veto files = No
    veto filesで指定したディレクトリ内のファイルを削除できるようにするかどうかを設定する。
    No:veto filesで指定したディレクトリ内はファイルは削除できない。
    Yes:veto filesで指定したディレクトリ内であってもファイルは削除できる。


参考文献


この記事が気に入ったらサポートをしてみませんか?