Docker+SambaでWindows互換のファイルサーバーを作る方法

Docker

DockerとSambaを使って、安全なネットワーク ストレージを作りましょう。

マイクロソフトの援助もあって、sambaは洗練され、Windowsとの互換性を高めています。

アクセスコントロールについては、まずPOSIX ACLで設定してみます。

次にWindows NTFS完全互換のアクセスコントロールに変更します。

Dockerのインストールと、使用するイメージやネットワークは、前回の記事を参照してください。

コンテナの作成

前回ビルドしたdebian.protoイメージを使って、sambaサーバーを作ります。

コンテナ名は「folders」にします。

データ保存ボリュームの準備

ホスト上に、foldersコンテナがデータを保存する「FOLDERS」ディレクトリを作成します。

ホストの /v ディレクトリーは「RAID1」で冗長化されています。

ここに「FOLDERS」ディレクトリを作れば安全です。

fumi@y3:~$ sudo mkdir /v/FOLDERS

debianコンテナ作成

基本システムのみの「debianコンテナ」を作成します。

docker run \
 --name=folders \
 --hostname=folders \
 --network=private-net \
 --ip=192.168.11.10 \
 --volume=/v/FOLDERS:/srv \
 --detach=true \
 debian.proto

コンテナ作成は完了です。

この意味は、次の通りです。

docker runコンテナを作ります。
–name=foldersコンテナに folders という名前を付けます。
–hostname=foldersコンテナの hostname に folders を設定します。
–network=private-netprivate-net ネットワークに接続します。
–ip=192.168.11.10ipアドレスを 192.168.11.10 に設定します。
–volume=/v/FOLDERS:/srvホストの /v/FOLDERS を コンテナの /srv に対応させます。
–detach=trueデタッチ モードで起動します。
debian.protodebian.proto イメージを使ってコンテナを作ります。

今回新しいオプションが出てきました。

「–volume=/v/FOLDERS:/srv」は、永続データを保存場所を指定するオプションです。

ホストの「/v/FOLDERS」ディレクトリーが、コンテナの「/srv」ディレクトリーにバインドされます。

コンテナが「/srv」に書き込みすると、ホストの「/v/FOLDERS」に書き込まれます。

sambaのインストール

コンテナにsambaをインストールします。

コンテナが起動しているかを確認してみます。

docker ps
CONTAINER ID   IMAGE          COMMAND         CREATED         STATUS         PORTS     NAMES
e37f6add81cc   debian.proto   "/startup.sh"   6 seconds ago   Up 5 seconds             folders
4d8392d46f6f   debian.proto   "/startup.sh"   4 days ago      Up 3 days                dns0

「foldersコンテナ」が起動していることを確認しました。

「foldersコンテナ」に入ります。

docker exec -it folders bash

起動しているプロセスを確認します。

root@folders:/# ps -A
  PID TTY          TIME CMD
    1 ?        00:00:00 bash
    8 ?        00:00:00 tail
    9 pts/0    00:00:00 bash
   16 pts/0    00:00:00 ps

「bash」とコンテナを永続させるための「tail」のみが起動しています。

sambaをインストールします。

root@folders:/# apt -y install samba

sambaの「設定ファイル」を作ります。

catとヒアドキュメントで書き込むとき、「タブは通らない」ので、スペースに替えてください。

cat <<'EOF' > /etc/samba/smb.conf
[global]
        dos charset = CP932
        server string = ネットワークストレージ
        map to guest = Bad User
        dns proxy = No
        idmap config * : backend = tdb
        acl group control = No
        acl map full control = No
        acl allow execute always = No
        local master = No
        os level = 0
        domain master = No
        preferred master = No
        load printers = no
        printing = bsd
        printcap name = /dev/null
        disable spoolss = yes

[ストレージ1]
        path = /srv/S1
        read only = No
        create mask = 0644
        force create mode = 0644
        directory mask = 0755
        force directory mode = 0755
        guest ok = No
EOF

viで編集してもOKです。

root@folders:/# vi /etc/samba/smb.conf

設定ファイルの内容は以下の通りです。

[global]
        dos charset = CP932
        server string = ネットワークストレージ
        map to guest = Bad User
        dns proxy = No
        idmap config * : backend = tdb
        acl group control = No
        acl map full control = No
        acl allow execute always = No
        local master = No
        os level = 0
        domain master = No
        preferred master = No
        load printers = no
        printing = bsd
        printcap name = /dev/null
        disable spoolss = yes

[ストレージ1]
        path = /srv/S1
        read only = No
        create mask = 0644
        force create mode = 0644
        directory mask = 0755
        force directory mode = 0755
        guest ok = No

設定内容は次の通りです。

[global]ここから、次の [] までが、samba 全体の設定です。
[ストレージ1]フォルダの名前です。
ここから次の [] までが、このフォルダについての設定です。

省エネルギーのハードウエアを使う場合、リソースの浪費は禁物です。

[global]エリアで、sambaで自動的に起動する「lpqd プロセスの起動を抑制」しています。

プリントサーバーをこのコンテナで使う場合は、以下を「コメント化」してください。

#       load printers = no
#       printing = bsd
#       printcap name = /dev/null
#       disable spoolss = yes

フォルダの設定は、[]に挟まれた、「フォルダの名前」から始まります。

「path = /srv/S1」でフォルダの名前「ストレージ1」とLinuxのディレクトリー「/srv/S1」を結びつけます。

そのほかは、ファイル保存時のアクセス許可設定です。

ただし、ここでは拡張属性を使ったアクセスコントロールは使いません。

共有ストレージではなく、ユーザー単位のネットワーク ストレージです。

この設定では、「sambaユーザーのアクセス権限」は「Linuxユーザーのパーミション」によって決まります。

各設定の詳細は、「smb.conf」のマニュアルを参照してください。

smb.conf

「testparm」で、設定に文法ミスがないか確認します。

root@folders:/# testparm

間違ったパラメーターやWARNINGがあれば、修正してください。

ユーザーを作る

今回のsambaの設定では、「Linuxのローカルユーザー」と「sambaのユーザー」がリンクしています。

同名の「Linuxのローカルユーザー」がなければ、「sambaのユーザー」を作ことはできません。

この設定では「Linuxユーザーのパスワード」と「sambaユーザーのパスワード」は同期しません。

Linuxユーザーのパスワードは設定しなくてもOKです。

homeディレクトリも必要ありません。

ここではユーザーとして「fumi」を設定します。

Linuxユーザー「fumi」を作ります。

root@folders:/# useradd fumi

次にsambaユーザーを作ります。

root@folders:/# pdbedit -a fumi

パスワードの設定を促されますので、任意に設定してください。

以下のように作成したユーザー情報が出力されます。

new password:
retype new password:
Unix username:        fumi
NT username:          
Account Flags:        [U          ]
User SID:             S-1-5-21-2460080139-991547097-4264342129-1000
Primary Group SID:    S-1-5-21-2460080139-991547097-4264342129-513
Full Name:            
Home Directory:       \\folders\fumi
HomeDir Drive:        
Logon Script:         
Profile Path:         \\folders\fumi\profile
Domain:               FOLDERS
Account desc:         
Workstations:         
Munged dial:          
Logon time:           0
Logoff time:          木, 07  2月 2036 00:06:39 JST
Kickoff time:         木, 07  2月 2036 00:06:39 JST
Password last set:    水, 30  6月 2021 09:08:44 JST
Password can change:  水, 30  6月 2021 09:08:44 JST
Password must change: never
Last bad password   : 0
Bad password count  : 0
Logon hours         : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

sambaのユーザーが作成されました。

Windowsなどのパソコンから、このネットワーク ストレージにアクセスする場合には、「sambaユーザー」と「パスワード」でアクセスします。

共有フォルダー用のディレクトリを作る

「smb.conf」の設定で「ストレージ1」フォルダを「/srv/S1」にリンクさせました。

「ストレージ1」に保存したデータは、コンテナの「/srv/S1」に保存されます。

コンテナに「/srv/S1」を作ります。

root@folders:/# mkdir /srv/S1

sambaユーザーのアクセス権は、linuxユーザーのパーミションで決まります。

sambaで「fumi」が「ストレージ1」にアクセスできるように、Linuxユーザー「fumi」を「/srv/S1」の所有者にして、アクセス全権を与えます。

root@folders:/# chown fumi /srv/S1

設定完了です。

sambaを起動する

sambaを起動します。

sambaには「nmbd」、「smbd」、「samba-ad-dc」が含まれていますが、ネットワーク ストレージに必要なのは「smbd」だけです。

「smbd」のみの起動で、今回の目的は達成されます。

root@folders:/# /etc/init.d/smbd start

プロセスを確認してみます。

root@folders:/# ps -A
  PID TTY          TIME CMD
    1 ?        00:00:00 bash
   15 ?        00:00:00 smbd
   16 ?        00:00:00 tail
   18 ?        00:00:00 smbd-notifyd
   19 ?        00:00:00 cleanupd
   20 pts/0    00:00:00 bash
   28 pts/0    00:00:00 ps

「smbd」が起動しています。

コンテナの起動と共に、smbdを立ち上げるために、「startup.sh」に起動スクリプトを追加しておきます。

root@folders:/# sed -i '1a /etc/init.d/smbd start' /startup.sh

viでstartup.shを編集してもいOKです。

startup.shは以下のようになります。

#!/usr/bin/env bash
/etc/init.d/smbd start
tail -f /dev/null

Windowsからアクセスする

foldersコンテナを使ってみましょう。

Windows10から、ネットワーク ストレージにアクセスして、パソコンにあるデータをバックアップしてみましょう。

foldersコンテナの「ipアドレス」は「192.168.11.10」に設定しました。

① Windows10の検索ボックスに「\\192.168.11.10」を入力します。

最初の「\\」はネットワーク上のサーバーにアクセスするときに使う「おまじない」です。

② 「開く」をクリックします。

開いたウインドウに「ストレージ1」フォルダが表示されます。

資格情報を入力してフォルダーにつなぐ

現在「Windowsにサインインしているユーザー」と、「foldersコンテナで『ストレージ1』フォルダにアクセス権を設定したsambaユーザー」が異なる場合は、接続時に資格情報を求められます。

「ストレージ1」をダブルクリックすると、資格情報の入力ダイアログがポップアップします。

sambaユーザー「fumi」と先ほど設定した「パスワード」を入力します。

「資格情報を記憶する」にチェックしておくことで、以後の資格情報の入力を省略することができます。

資格情報が承認され、フォルダーが開きます。

資格情報を入力しないでフォルダーにつなぐ

現在Windowsにサインインしているユーザーが、sambaユーザーと同じ「fumi」で、パスワードも同じである場合は、あらためて認証情報は求められません。

Windowsとsambaのユーザーを同じにしておけば、Windowsへのサインインでsambaの認証も済ませることができます。

ただし、Windowsのパスワードを変更すると、sambaとパスワードが異なることになり、認証情報の入力が再現します。

ローカル ファイルを転送する

Windowsパソコンのローカルディスク データをファイルサーバーに転送してみます。

ここに、「バックアップ」フォルダを新規作成します。

ウインドウ内に表示された「このフォルダーはからです。」の下あたりを「右クリック」します。

「新規作成(X)」→「フォルダー(F)」で、フォルダを作成します。

foldersコンテナの「/srv/S1」ディレクトリーのパーミションが「fumi」ユーザーに対して正しく設定されていれば、フォルダを作成することができます。

設定が間違っていると、次のように警告が表示されます。

コンテナの「/srv/S1」ディレクトリーのパーミションを確認してください。

「新しいフォルダー」ができたら、フォルダ名を「バックアップ」に変更します。

下記では、「ピクチャ」ホルダをバックアップしています。

Windows10では、「ドラッグ&ドロップ」すると「バックアップ」フォルダに「ショートカット」ができるだけなので、「コピー&ペースト」でバックアップを行ってください。

Windowsのアクセス権限とコンテナ上のパーミション

sambaの使い方は様々です。

Windowsに準拠した拡張属性を使用することもできます。

POSIXに従ったUNIX互換のACLで使用することもできます。

「Windowsから見たアクセス権限」は、「ソフトウエアsambaのアクセス権」です。

今回の設定では、「sambaのアクセス権」は、「コンテナのLinuxのパーミション」です。

Windowsからsambaを経由して、コンテナにフォルダやファイルを保存するとき、どのような権限が設定されるかは、「smb.conf」に依存します。

今回は下記のように設定しました。

        create mask = 0644
        force create mode = 0644
        directory mask = 0755
        force directory mode = 0755

これは、Windowsから書き込まれたデータが、この設定に従って、コンテナ上のLinuxパーミションに変換されます。

コンテナ上のパーミション

「smb.conf」が指示するファイルとディレクトリー作成時の権限付与は以下の通りです。

作成者グループそれ以外
ファイル書込・削除/読取読取読取
ディレクトリー書込・削除/実行/読取実行/読取実行/読取

先ほどWindowsから作成した「バックアップ」フォルダのコンテナ上のパーミションを表示すると、次のようになっています。

root@folders:/# ls -l /srv/S1/
合計 0
drwxr-xr-x 3 fumi fumi 26  7月  1 18:46 バックアップ
root@folders:/# ls -l /srv/S1/バックアップ/ピクチャ/
合計 21720

-rw-r--r-- 1 fumi fumi   64936 12月 13  2020 'コメント 2020-12-13 091110.png'
-rw-r--r-- 1 fumi fumi   64936 12月 13  2020 'コメント 2020-12-13 091311.png'
-rw-r--r-- 1 fumi fumi  324117 12月 13  2020 'コメント 2020-12-13 091339.png'
-rw-r--r-- 1 fumi fumi  321975 12月 13  2020 'コメント 2020-12-13 091407.png'
-rw-r--r-- 1 fumi fumi   13877 12月 13  2020 'コメント 2020-12-13 091450.png'
-rw-r--r-- 1 fumi fumi  341531 12月 13  2020 'コメント 2020-12-13 091519.png'
-rw-r--r-- 1 fumi fumi  380106 12月 13  2020 'コメント 2020-12-13 091635.png'
-rw-r--r-- 1 fumi fumi  322974 12月 13  2020 'コメント 2020-12-13 091705.png'
-rw-r--r-- 1 fumi fumi  332191 12月 13  2020 'コメント 2020-12-13 091728.png'
-rw-r--r-- 1 fumi fumi   38349 12月 13  2020 'コメント 2020-12-13 091810.png'
-rw-r--r-- 1 fumi fumi   17533 12月 13  2020 'コメント 2020-12-13 091833.png'
-rw-r--r-- 1 fumi fumi   20174 12月 13  2020 'コメント 2020-12-13 092323.png'
...

「smb.conf」の設定どおりにディレクトリーとファイルが作成されていることが確認できます。

Windowsから見たアクセス権限

Windowsから見ると、作成したフォルダやファイルは、下記のように設定されます。

ファイル / フォルダー 作成者グループそれ以外
ファイル特殊読み取り読み取り
フォルダー特殊読み取りと実行読み取りと実行

Linux(unix)のパーミションをWindowsはどのように表現するのでしょうか。

先ほどバックアップしたファイルの「プロパティ」から「セキュリティ」の内容を見てみましょう。

所有者「fumi」の「特殊」アクセス権の内容は、次のようなものです。

コンテナ上のLinuxパーミションを「そのまま」表示しています。

「smb.conf」の設定で、「ストレージ1」フォルダーに保存するファイルの実行権限は付与しませんでした。

設定どおりなら、「ストレージ1」フォルダーに保存したEXEファイルは実行できないはずです。

「ストレージ1」フォルダーに保存したEXEファイルを「ダブルクリック」すると、次のように警告されます。

WindowsからEXEファイルに実行権限を付与することができます。

実行権限を付けることで、プログラムの実行が可能になります。

今度は「バックアップ」フォルダーのアクセス権です。

ユーザー「fumi」に付与された「特殊」権限の内容は以下です。

フォルダーも、コンテナ上のLinuxパーミションを「そのまま」表示しています。

Windowsから変更したアクセス権の妙

WindowsからLinuxのパーミションを変更することができました。

Windowsから、このネットワーク ストレージ上のファイルのアクセス権を変更することは、WindowsでLinuxのパーミションを変更することにほかなりません。

foldersコンテナでLinux上のパーミションを確認すると、以下の通りでした。

変更前です。

root@folders:/# ls -l /srv/S1/バックアップ/netenum20210527
合計 4092
...
-rw-r--r--  1 fumi fumi 2257920  5月 26 20:19 netenum5.exe
...

変更後です。

root@folders:/# ls -l /srv/S1/バックアップ/netenum20210527
合計 4092
...
-rwxrwxr--+ 1 fumi fumi 2257920  5月 26 20:19 netenum5.exe
...

Linux 上で、ファイルに実行権限「x」が付いていることがわかります。

ユーザーだけでなくグループにも実行権限が付与されています。

「+」が付いているのは、POSIXのACLが付与されたことを示しています。

再び、Windowsから実行権限を削除してみます。

削除後です。

root@folders:/# ls -l /srv/S1/バックアップ/netenum20210527
合計 4092
...
-rw-rwxr--+ 1 fumi fumi 2257920  5月 26 20:19 netenum5.exe
...

ユーザーの実行権限はなくなりましたが、グループの権限はそのままです。

POSIXのACL情報が変更されているかもしれません。

getfacl コマンドでACLを表示してみます。

root@folders:/# getfacl /srv/S1/バックアップ/netenum20210527/netenum5.exe 
getfacl: Removing leading '/' from absolute path names
# file: srv/S1/バックアップ/netenum20210527/netenum5.exe
# owner: fumi
# group: fumi
user::rw-
user:fumi:rw-
group::r--
group:fumi:r--
mask::rwx
other::r--

グループの実行権限は削除されているのが確認できます。

互換性のないWindowsとLinuxのアクセス権限を、sambaがどのように扱っているのかは、微妙なところです。

「ユーザー単位」のネットワーク ストレージが目的であれば、問題はないかもしれません。

ただし、この設定では、思うようにWindowsからの権限設定ができません。

複数のユーザーでファイルを共有するような使い方をする場合は、トラブルになることが想像できます。

vfs_acl_xattr VFSモジュールが導入される以前は、このようなトラブルを避けながらファイルサーバーを運用するには、ひと工夫が必要でした。

一般的なパーミションの概要は下記をご参照ください。

ファイルパーミッション - Wikipedia

名前でアクセスできるようにする

先ほどはfoldersコンテナにipアドレス「192.168.11.10」でアクセスしました。

Windowsホストと同じように「エクスプローラーのネットワーク」に表示されて、「名前でアクセス」できると利便性が高まります。

WDSで名前解決

以前のWindowsはNetBIOSによってネットワーク上のホスト検索をしていましたが、最近のWindows10ではWSDによって名前解決を行います。

なので上記の設定ではNetBIOSを有効にせず、nmbdデーモンを起動しませんでした。

「foldes」コンテナにWDSをインストールしたいのですが、Debianにはパッケージがありません。

Pythonで作られたWDSがあるので、これをインストールします。

umi@y3:~$ docker exec -it folders bash
root@folders:/# apt -y install wget python3
root@folders:/# wget https://raw.githubusercontent.com/christgau/wsdd/master/src/wsdd.py
root@folders:/# mv wsdd.py /usr/local/bin/
root@folders:/# chmod u+x /usr/local/bin/wsdd.py

WDSサーバーのインストール完了です。

起動します。

/usr/local/bin/wsdd.py -d WORKGROUP &

コンテナの起動と共にWDSを起動するために、「エントリーポイント」に登録します。

root@folders:/# sed -i '1a /usr/local/bin/wsdd.py -d WORKGROUP &' /startup.sh

これで、Windows10の「エクスプローラーのネットワーク」に「foldes」が表示されます。

WSDによって検索されているかを確認するには「エクスプローラー」左側のペインで[ネットワーク]をクリックして、「表示」タブで表示形式「詳細」を選択します。

「項目の行」を右クリックして、プルダウンリストから[探索方法]にチェックを入れます。

「folders」の「探索方法」列に「WDS」が確認できます。

mDNSで名前解決

マッキントッシュからもアクセスする場合は、mDNSを入れておきます。

最近のWindows10はmDNSにも対応しています。

対応以前のWindowsには、AppleのBonjourをインストールすることで対応できます。

ただし、mDNSで「folders → 192.168.11.10」の解決はできますが「エクスプローラーのネットワーク」には表示されません。

次の手順でmDNSを有効にできます。

root@folders:/# apt -y install dbus avahi-daemon
root@folders:/# /etc/init.d/dbus start
root@folders:/# /etc/init.d/avahi-daemon start

「エントリーポイント」に登録します。

root@folders:/# sed -i '1a /etc/init.d/dbus start && /etc/init.d/avahi-daemon start' /startup.sh

「startup.sh」は以下のようになります。

#!/usr/bin/env bash
/etc/init.d/dbus start && /etc/init.d/avahi-daemon start
/usr/local/bin/wsdd.py -d WORKGROUP &
/etc/init.d/smbd start
tail -f /dev/null

そのほかの名前解決

DNSで名前解決する方法もありますが、ここでは説明しません。

また、「Active Directory」ドメインに参加させることでも名前解決はできます。

vfs_acl_xattr VFSモジュールを使ったWindows完全互換の実現

上記の設定では、Windowsと完全互換ではなかったので、Windowsからアクセスするファイルサーバーとしては使い勝手がよくありませんでした。

その代わり、WindowsからLinuxのパーミションを操作できるため、ホストOSでWindows用のファイルサーバーにSSHなどでアクセスして使うという、WindowsとLinuxの相互運用が可能す。

Sambaの「vfs_acl_xattr VFSモジュール」は、WindowsのNTFSアクセス権との完全互換を実現します。

その代わりに、Linuxのパーミションを完全に無視するので、Windowsと同じユーザーアカウントでLinuxホストを使うことが難しくなります。

今度は、「vfs_acl_xattr VFSモジュール」 を使って、先ほどのファイルサーバーをWindows互換に変更してみます。

コンテナの更新

vfs_acl_xattr VFSモジュール」 を使うためには、Dockerコンテナを「–privileged」オプションで起動する必要があります。

いまのところ、既存のコンテナに「–privileged」を追加することはできません。

なので、以下の手順でコンテナを更新します。

foldersコンテナを停止します。

docker stop folders

foldersコンテナをdockerイメージにします。

docker commit folders folders.no_vfs_acl_xattr

foldersという名前で新しいコンテナを作りたいので、既存のfoldersコンテナの名前を変更します。

docker rename folders folders.old

新しいイメージ「 folders.no_vfs_acl_xattr 」で、同じ名前、同じipアドレスで新しいコンテナを作ります。

docker run \
 --privileged \
 --name=folders \
 --hostname=folders \
 --network=private-net \
 --ip=192.168.11.10 \
 --volume=/v/FOLDERS:/srv \
 --detach=true \
 folders.no_vfs_acl_xattr

この意味は、次の通りです。

docker runコンテナを作ります。
–privileged 特権モードでコンテナを実行します。
–name=foldersコンテナに folders という名前を付けます。
–hostname=foldersコンテナの hostname に folders を設定します。
–network=private-netprivate-net ネットワークに接続します。
–ip=192.168.11.10ipアドレスを 192.168.11.10 に設定します。
–volume=/v/FOLDERS:/srvホストの /v/FOLDERS を コンテナの /srv に対応させます。
–detach=trueデタッチ モードで起動します。
folders.no_vfs_acl_xattr folders.no_vfs_acl_xattr イメージを使ってコンテナを作ります。

今回新しいオプションが出てきました。

–privileged」オプションはコンテナとホスト間のセキュリティー分離をオフにします。

コンテナー内で root で実行されているプロセスは、ホストに於いてもrootの権限を持ちます。

コンテナの用途によっては、注意が必要なオプションです。

元となるイメージと「–privileged」オプション以外は前回と全く同じです。

コンテナに入ります。

docker exec -it folders bash

smbdプロセスが自動起動していますので、停止させます。

root@folders:/# /etc/init.d/smbd stop

アプリケーションによっては、コンテナ上のプロセスをうまく停止できないものがあります。

その場合はkillコマンドで停止します。

これまで使っていたディレクトリーは移動して、同じ名前のディレクトリーを新規作成します。

root@folders:/# mv /srv/S1 /srv/BU1
root@folders:/# mkdir /srv/S1

「/srv/S1」は拡張属性のみでアクセスコントロールします。

Linuxのアクセスコントロールは使用しないので、 「/srv/S1」のパーミションは開放します。

root@folders:/# chmod 777 /srv/S1

sambaの設定ファイル「smb.conf」を書き換えます。

catとヒアドキュメントで書き込むとき、「タブは通らない」ので、スペースに替えてください。

cat <<'EOF' > /etc/samba/smb.conf
[global]
        dos charset = CP932
        server string = ネットワークストレージ
        workgroup = WORKGROUP

        load printers = no
        printing = bsd
        printcap name = /dev/null
        disable spoolss = yes

        logon home = 
        logon path = 

        domain master = No
        local master = No
        os level = 0
        preferred master = No

        acl group control = Yes

        vfs objects = acl_xattr
        acl_xattr:ignore system acls = yes
        acl_xattr:default acl style = windows

	map acl inherit = yes
	inherit acls = yes
	dos filemode = yes
	force unknown acl user = yes

        create mask = 0666
        directory mask = 0777
        map archive = no
        map hidden = no
        map readonly = no
        map system = no
        store dos attributes = yes


[ストレージ1]
        path = /srv/S1
        comment = 1番目の共有
        read only = No
        guest ok = No
        admin users = admin
EOF

viで編集してもOKです。

root@folders:/# vi /etc/samba/smb.conf

設定ファイルの内容は以下の通りです。

[global]
        dos charset = CP932
        server string = ネットワークストレージ
        workgroup = WORKGROUP

        load printers = no
        printing = bsd
        printcap name = /dev/null
        disable spoolss = yes

        logon home = 
        logon path = 

        domain master = No
        local master = No
        os level = 0
        preferred master = No

        acl group control = Yes

        vfs objects = acl_xattr
        acl_xattr:ignore system acls = yes
        acl_xattr:default acl style = windows

	map acl inherit = yes
	inherit acls = yes
	dos filemode = yes
	force unknown acl user = yes

        create mask = 0666
        directory mask = 0777
        map archive = no
        map hidden = no
        map readonly = no
        map system = no
        store dos attributes = yes


[ストレージ1]
        path = /srv/S1
        comment = 1番目の共有
        read only = No
        guest ok = No
        admin users = admin

この設定の肝は次のものです。

vfs objects = acl_xattr acl_xattr vfsモジュールを有効にする。
acl_xattr:ignore system acls = yes システムのアクセスコントロールを無視する。
acl_xattr:default acl style = windows Windows互換のアクセスコントロールを使う。
admin users = fumi「ストレージ1」の管理権限をユーザーadminに渡します。

Linuxのパーミションを開放しているので、ユーザーがログインできると、なんでもできてしまいます。

既存のLinuxユーザーをログインできないように変更します。

root@folders:/# usermod -s /sbin/nologin fumi
root@folders:/# usermod -s /sbin/nologin yellow

管理用ユーザーを登録しておきます。

新規ユーザーは、ログインできないように作成します。

root@folders:/# useradd -s /sbin/nologin admin
root@folders:/# pdbedit -a admin

smbdプロセスを起動します。

root@folders:/# /etc/init.d/smbd start

これでWindows完全互換のファイルサーバーが完成しました。

共有フォルダーの初期設定

Windows10パソコンのエクスプローラーのネットワークを開いて、foldersにアクセスしてみます。

まだ、何もWindowsネットワーク共有としての設定をしていないので、管理者admin以外のユーザーは「ストレージ1」フォルダーを開くことができません。

次の手順で「folders」への接続を、ユーザー「admin」で再接続します。

コマンドプロンプトを開きます。

検索ボックスに「cmd」と入力して「コマンドプロンプト」アプリを開きます。

現在の接続を切断します。

net use \\folders\ストレージ1 /delete

ユーザー「admin」で接続します。

net use \\folders\ストレージ1 password /user:admin

再度「folders」にアクセスして、「ストレージ1」を開きます。

今度はアクセスできました。

smb.confの「 admin users = admin 」設定で、ユーザー「admin」は、このフォルダーにフルコントロールのアクセス権を持っています。

共有フォルダーの設計

Windows完全互換のメリットを活用して、運用の手間を省略する共有設計です。

管理者が行うのは、このアクセス許可設定とユーザーの作成だけです。

次のように設定します。

ユーザー/グループ対象アクセス権限
Everyoneこのフォルダーのみ書き込み
Creator Ownerサブフォルダーとファイルのみフルコントロール

「ストレージ1」には誰でもフォルダーを追加できます。

追加したフォルダーに対しては、作った人「Creator Owner」に全権を与えます。

作った人以外はこのフォルダーを変更/削除することはできません。

フォルダーを作ったユーザーが必要に応じて「自らアクセス権を設定」します。

共有フォルダーのアクセス許可設定

ユーザー「admin」で「folders」にアクセスして、「ストレージ1」のプロパティーを開きます。

「セキュリティ」タブで「詳細設定」をクリックします。

「ストレージ1のセキュリティの詳細設定」で「追加(D)」ボタンをクリックします。

「プリンシパルの選択」をクリックするとポップアップする「ユーザーまたはグループの選択」ダイアログボックスの「選択するオブジェクト名を入力してください(E):」欄に「Everyone」を入力して「OK」ボタンをクリックします。

「Everyone」に対して、次のように設定して「OK」ボタンをクリックします。

プリンシパル適用先基本のアクセス許可
Everyoneこのフォルダーのみ+書き込み

設定される「アクセス許可の詳細」を確認したい場合は、「OK」ボタンを押す前に「高度なアクセス許可を表示する」をクリックします。

ここで「OK」ボタンで設定を確定することもできますし、「基本のアクセス許可を表示する」をクリックして戻ることができます。

つづいて、「Creator Owner」を追加します。

「プリンシパルの選択」をクリックするとポップアップする「ユーザーまたはグループの選択」ダイアログボックスの「選択するオブジェクト名を入力してください(E):」欄に「creator owner」を入力して「OK」ボタンをクリックします。

「CREATOR OWNER」に対して、次のように設定して「OK」ボタンをクリックします。

プリンシパル適用先基本のアクセス許可
CREATOR OWNERサブフォルダーとファイルのみ+フルコントロール


次のように設定されていることを確認します。

プリンシパル適用先基本のアクセス許可
Everyoneこのフォルダーのみ読み取り、書込みと実行
CREATOR OWNERサブフォルダーとファイルのみフルコントロール

「共有アクセス許可」についても、確認しておきます。

「Everyoneフルコントロール」になっているので、問題ありません。

「OK」ボタンで設定を終了します。

まだ何も入っていないフォルダーの初期設定なので、警告が出た場合は「OK」をクリックして進みます。

以上で初期設定は完了です。

現在の「ストレージ1」に 管理ユーザー「admin」で 接続しています。

設定が終わったので接続を切断します。

net use \\folders\ストレージ1 /delete

共有のアクセス許可については、下記に説明があります。

Wondows10でファイルサーバーを作る方法
Windows10パソコンでファイルサーバーを作ります。 10人程度で使うのであれば、「Windows Server」や専用装置を使わなくても、Windowsパソコンで十分かもしれません。 インターネット上に無料で使えるストレージサービスは...

Windowsから設定した拡張属性の確認

vfs_acl_xattr VFSモジュール を使うことで、Windows互換のNTFSアクセス コントロールを実現できます。

acl_xattr は、ファイルのNTFSアクセス権を拡張属性に格納します。

拡張属性は「getfattr」コマンドで表示することができます。

ただし、NTFSの拡張属性はヒューマン フレンドリーではありません。

fumi@y3:~$ docker exec -it folders getfattr -n security.NTACL /srv/S1
getfattr: Removing leading '/' from absolute path names
# file: srv/S1
security.NTACL=0sAwADAAAAAgAEAAIAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAScZAAAAHQAAAAAAAAAhAAAAAECAAAAAAAWAQAAAAAAAAABAgAAAAAAFgIAAAAAAAAAAgBcAAQAAAAAABgA/wEfAAECAAAAAAAWAQAAAAAAAAAAABQA/wEfAAEBAAAAAAAFEgAAAAAAFAC/ARIAAQEAAAAAAAEAAAAAAAsUAP8BHwABAQAAAAAAAwAAAAA=

一般ユーザーによる自分専用フォルダーの作成

別のユーザーで共有に接続した場合、切断してもしばらく切断処理が完了しない場合があります。

確実に接続を切断する一番いい方法は、クライアント パソコンを再起動することです。

「エクスプローラーのネットワーク」から「foldes」をクリックします。

「ストレージ1」フォルダーを開いて、自分専用のフォルダーを新規作成します。

名前を「yellowのフォルダ」にしてみます。

「yellowのフォルダ」を「右クリック」して「プロパティ(R)」を選択します。

「yellowのフォルダのプロパティ」で「セキュリティ」タブを開いて「詳細設定(V)」をクリックします。

「yellowのフォルダのセキュリティの詳細設定」でアクセス許可を確認します。

フォルダー作成ユーザー「yellow」に「フルコントロール」アクセス権が設定されています。

その他のユーザーにはアクセス権が設定されていないので、ユーザー「admin」以外はこのフォルダーにアクセスできません。

セキュリティーの確認

例えば、ユーザー「fumi」で 「yellowのフォルダ」 にアクセスしても拒否されます。

現在の「yellow」接続を切断します。

net use \\folders\ストレージ1 /delete

ユーザー「fumi」で接続します。

net use \\folders\ストレージ1 password /user:fumi

「yellowのフォルダに対するアクセス許可がありません。」という警告が出ます。

「fumi」の接続を切断します。

net use \\folders\ストレージ1 /delete

アクセスコントロールをユーザーに委任する

この共有設定のメリットは、初期設定後は管理者の負担が軽減できることです。

ユーザー「yellow」が必要に応じて、自分でユーザーにアクセス許可を与えれば共有フォルダーの完成です。

Windowsパソコンから使うのであれば、Windows互換のアクセスコントロールを使うことで、洗練されたセキュリティー設定ができるファイルサーバーになります。

アクセスしているユーザーの確認

Windows10では「コンピューターの管理」の共有のセッションで確認できます。

Wondows10でファイルサーバーを作る方法
Windows10パソコンでファイルサーバーを作ります。 10人程度で使うのであれば、「Windows Server」や専用装置を使わなくても、Windowsパソコンで十分かもしれません。 インターネット上に無料で使えるストレージサービスは...

Sambaでは、「smbstatus」コマンドで確認することができます。

Dockerホストからコンテナにコマンドを流し込みます。

fumi@y3:~$ docker exec -it folders smbstatus

またはコンテナにbashでログインしてコマンドを実行します。

fumi@y3:~$ docker exec -it folders bash
root@folders:/# smbstatus

以下のように出力されます。

Samba version 4.9.5-Debian
PID     Username     Group        Machine                                   Protocol Version  Encryption           Signing              
----------------------------------------------------------------------------------------------------------------------------------------
1031    yellow       yellow       192.168.11.31 (ipv4:192.168.11.31:55573)  SMB3_11           -                    partial(AES-128-CMAC)

Service      pid     Machine       Connected at                     Encryption   Signing     
---------------------------------------------------------------------------------------------
ストレージ1 1031    192.168.11.31 水  7月 28 17時03分26秒 2021 JST -            -           

Locked files:
Pid          Uid        DenyMode   Access      R/W        Oplock           SharePath   Name   Time
--------------------------------------------------------------------------------------------------
1031         1002       DENY_NONE  0x100081    RDONLY     NONE             /srv/S1   yellowのフォルダ   Wed Jul 28 17:03:34 2021
1031         1002       DENY_NONE  0x100081    RDONLY     NONE             /srv/S1   yellowのフォルダ   Wed Jul 28 17:03:34 2021
1031         1002       DENY_NONE  0x100081    RDONLY     NONE             /srv/S1   .   Wed Jul 28 17:03:31 2021
1031         1002       DENY_NONE  0x100081    RDONLY     NONE             /srv/S1   .   Wed Jul 28 17:03:31 2021
1031         1002       DENY_NONE  0x100081    RDONLY     NONE             /srv/S1   .   Wed Jul 28 17:03:31 2021

Dockerホスト上のパーミション

foldersコンテナが動いている、Dockerホストのパーミションはどうなっているでしょうか。

Dockerホストの「/v/FOLDERS」は、foldersコンテナの「/srv」にバインドされています。

foldersコンテナはsambaの設定で、「/srv/S1」を「ストレージ1」フォルダとしています。

Windowsからyellowが「yellowのフォルダ」を作成しました。

Windowsからfumiが「fumiのフォルダ」を作成しました。

「folders」コンテナ上では、以下のようになっています。

root@folders:/# ls -l /srv/S1/
合計 8
drwxrwxrwx 2 fumi   fumi     6  7月 29 15:13 fumiのフォルダ
drwxrwxrwx 6 yellow yellow 204  7月 27 18:08 yellowのフォルダ

続いて、Dockerホスト上で確認してみます。

fumi@y3:~$ ls -l /v/FOLDERS/S1/
合計 8
drwxrwxrwx 2 fumi fumi   6  7月 29 15:13 fumiのフォルダ
drwxrwxrwx 6 1002 1002 204  7月 27 18:08 yellowのフォルダ

コンテナ上の「 fumiのフォルダ 」の所有者とグループは「fumi」と表示されています。

Dockerホスト上でも同じ「fumi」です。

「yellowのフォルダ」では、コンテナで「yellow」と表示されていた所有者やグループはホスト上では「1002」というuid番号に替わっています。

fumiについては、たまたま「ホスト上のユーザー」と「コンテナ上のユーザー」に「fumi」ユーザーが存在し、そのユーザーが同じ「uid」を持っているからなのです。

一方yellowはコンテナには存在しますが、ホストには対応するユーザー名がないので、番号だけが表示されているのです。

「注意が必要」なのは、コンテナの永続ファイルを「Dockerホストから別のホストに」バックアップする場合です。

rsyncはユーザーの「名前ベース」でデータを転送します。

所有者や権限なども併せて転送する場合、「名前ベース」にするのか「uid番号ベース」にするかを決めておかないと、トラブルになります。

「コンテナ側のuid番号」をベースとするのであれば、「–numeric-ids」オプションを付けて転送する必要があるのです。

また、拡張属性を合わせてバックアップする場合は、「–xattrs」オプションが必要です。

パスワードの管理

今回のようなスタンドアローンのファイルサーバーでは「 vfs_acl_xattr VFSモジュールを使ったWindows完全互換 」の場合は、管理者にパスワードの管理を委ねることになります。

Windows互換とユーザー自身でのパスワードの管理を両立させる場合は、ドメインコントローラーを立ててActive Directoryに認証を統合するのが一般的な方法です。

まとめ

Dockerとsambaで、Windows完全互換のファイルサーバーを作成しました。

個人での利用や小さなオフィスでは、十分に使える小道具です。

sambaで「Active Directory」の「ドメイン コントローラー」を作ることも可能です。

ただし、長い期間での運用を考えたとき、そのような複雑な機構を構築して、将来の負担にならないかを検討することも必要です。

タイトルとURLをコピーしました