hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

Sambaサーバの環境構築手順



1 Sambaとは?

SambaはLinuxWindowsのファイルサーバとして動作させるソフトウェアです。

2 検証環境

2.1 ネットワーク構成

Windows10および、仮想マシン(1台)を使いました。各マシンは以下の役割です。

  • 仮想マシン:Sambaサーバ(Samba server)
  • Windows10:Sambaクライアント(Samba client)
+------------------- PC ----------------------+
|                                             |
|   Samba client              Samba server    |
|   +-----------+             +-----------+   |
|   |           |             |           |   |
|   | Windows10 |             | CentOS7.9 |   |
|   |           |             |           |   |
|   |           |             |           |   |
|   |           |             |    smbd   |   |
|   |           |             |    (445)  |   |
|   |           |             |           |   |
|   |           |             |           |   |
|   |           |             |           |   |
|   +-- eth0 ---+             +-- eth0 ---+   |
|    .12 |                          | .100    |
|        |                          |         |
|   +-------------------------------------+   |
|   |             hypervisor              |   |
|   +-------------------------------------+   |
|        |                          |         |
|        |                          |         |
+---------------------------------------------+
                      |
                      |
------------------------------------------------ router ------- Internet
               192.168.2.0/24                     .1

2.2 版数

CentOS版数は以下のとおりです。

[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

カーネル版数は以下のとおりです。

[root@server ~]# uname -r
3.10.0-1160.el7.x86_64

3 Sambaサーバの設定

3.1 Linuxシステムのユーザ作成

テスト用のユーザを作成します。

[root@server ~]# useradd user1

作成したユーザを確認します。

[root@server ~]# id user1
uid=1000(user1) gid=1000(user1) groups=1000(user1)

3.2 パッケージのインストール

sambaパッケージをインストールします。

[root@server ~]# yum -y install samba

Sambaの版数を確認します。

[root@server ~]# smbd -V
Version 4.10.16

以下のパッケージがインストールされました。

[root@server ~]# rpm -qa|grep samba
samba-common-libs-4.10.16-18.el7_9.x86_64
samba-client-libs-4.10.16-18.el7_9.x86_64
samba-libs-4.10.16-18.el7_9.x86_64
samba-4.10.16-18.el7_9.x86_64
samba-common-4.10.16-18.el7_9.noarch
samba-common-tools-4.10.16-18.el7_9.x86_64

3.3 SElinuxの設定

SELinuxのモードを確認します。SELinuxが有効になっていることがわかります。

[root@server ~]# getenforce
Enforcing

smbd_tドメインだけ、SELinuxを無効化します。

[root@server ~]# semanage permissive -a smbd_t

無効化したドメインを確認します。

[root@server ~]# semanage permissive -l|grep smbd_t
smbd_t

3.4 ポート番号の開放

SambaサーバはTCPの445番ポートでListenするので、445番ポートを解放します。なお、firewall-cmdコマンドの使い方は、firewall-cmdの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# firewall-cmd --add-port=445/tcp
success

解放されているポート番号を確認します。

[root@server ~]# firewall-cmd --list-ports
445/tcp

3.5 設定ファイルの変更

samba設定ファイルのバックアップを作成しておきます。

[root@server ~]# cp /etc/samba/smb.conf /etc/samba/smb.conf.bak

設定変更した項目は以下です。なお、smbdプロセス等の動作を指定する設定ファイル(/etc/sysconfig/samba)はデフォルトのまま使用しました。

[root@server ~]# diff -Nur /etc/samba/smb.conf.bak /etc/samba/smb.conf
--- /etc/samba/smb.conf.bak     2022-02-23 08:54:35.081554354 +0900
+++ /etc/samba/smb.conf 2022-02-23 08:57:06.558858007 +0900
@@ -4,7 +4,7 @@
 # you modified it.

 [global]
-       workgroup = SAMBA
+       workgroup = WORKGROUP
        security = user

        passdb backend = tdbsam
@@ -16,7 +16,7 @@

 [homes]
        comment = Home Directories
-       valid users = %S, %D%w%S
+       valid users = user1
        browseable = No
        read only = No
        inherit acls = Yes
  • securityの意味

securityは、誰がユーザ認証を行うかを設定するパラメータです。

securityの設定値 意味 備考
user ユーザ名とパスワードでローカル認証を行う Sambaサーバ自身が認証を行う
share パスワードだけで認証を行う Sambaサーバ自身が認証を行う
domain ドメインコントローラにより認証を行う 自分以外のサーバが認証を行う
  • passdb backendの意味

passdb backendは、パスワードを管理するデータベースを指定します。下記の3種類あります。ここでは、tdbsamを使用しました。

passdb backendの設定値 意味 データベースの場所
tdbsam TDB(Trivial DataBase)を使用する パスワードは/var/lib/samba/private/passdb.tdbに保存する
ldapsam LDAPを使用する LDAPサーバにユーザ情報を格納する
smbpasswd smbpasswdを使用する Samba2.2系で使用していた方式

3.6 Sambaユーザの登録

pdbeditコマンドを使って、Sambaユーザを登録します。登録するSambaユーザは、Linuxシステムのユーザアカウントが登録されている必要があります。また、パスワードは"test"と入力しました。

[root@server ~]# pdbedit -a user1
new password:
retype new password:
Unix username:        user1
NT username:
Account Flags:        [U          ]
User SID:             S-1-5-21-2774913414-1482874662-1355191062-1000
Primary Group SID:    S-1-5-21-2774913414-1482874662-1355191062-513
Full Name:
Home Directory:       \\server\user1
HomeDir Drive:
Logon Script:
Profile Path:         \\server\user1\profile
Domain:               SERVER
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:    水, 23  2月 2022 09:12:50 JST
Password can change:  水, 23  2月 2022 09:12:50 JST
Password must change: never
Last bad password   : 0
Bad password count  : 0
Logon hours         : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

登録したSambaユーザを確認します。

[root@server ~]# pdbedit -L
user1:1000:

3.7 設定ファイルの構文チェック

設定ファイルの構文に誤りがないかどうか、testparmコマンドを使ってチェックします。

[root@server ~]# testparm
Load smb config files from /etc/samba/smb.conf
Loaded services file OK.
Server role: ROLE_STANDALONE

Press enter to see a dump of your service definitions
-snip-

3.8 Sambaサーバの起動

Sambaサービスを起動します。

[root@server ~]# systemctl start smb.service

Sambaサービスの状態を確認します。smbdが起動できていることがわかります。

[root@server ~]# systemctl status smb.service
● smb.service - Samba SMB Daemon
   Loaded: loaded (/usr/lib/systemd/system/smb.service; disabled; vendor preset: disabled)
   Active: active (running) since 水 2022-02-23 09:17:04 JST; 8s ago
     Docs: man:smbd(8)
           man:samba(7)
           man:smb.conf(5)
 Main PID: 2191 (smbd)
   Status: "smbd: ready to serve connections..."
   CGroup: /system.slice/smb.service
           tq2191 /usr/sbin/smbd --foreground --no-process-group
           tq2193 /usr/sbin/smbd --foreground --no-process-group
           tq2194 /usr/sbin/smbd --foreground --no-process-group
           mq2195 /usr/sbin/smbd --foreground --no-process-group

 2月 23 09:17:04 server systemd[1]: Starting Samba SMB Daemon...
 2月 23 09:17:04 server smbd[2191]: [2022/02/23 09:17:04.824220,  0] ../../lib/util/become_daemon.c:136(daemon_ready)
 2月 23 09:17:04 server smbd[2191]:   daemon_ready: daemon 'smbd' finished starting up and ready to serve connections
 2月 23 09:17:04 server systemd[1]: Started Samba SMB Daemon.

smbdは139番、445番ポートでListenしていることがわかります。

[root@server ~]# lsof -c smbd -a -i -a -nP
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
smbd    2191 root   34u  IPv6  31753      0t0  TCP *:445 (LISTEN)
smbd    2191 root   35u  IPv6  31754      0t0  TCP *:139 (LISTEN)
smbd    2191 root   36u  IPv4  31755      0t0  TCP *:445 (LISTEN)
smbd    2191 root   37u  IPv4  31756      0t0  TCP *:139 (LISTEN)

4 Sambaクライアントの設定

4.1 ワークグループの確認

Sambaサーバで、ワークグループ名をWORKGROUPと設定したので、Sambaクライアントのワークグループ名もWORKGROUPであることを確認します。
f:id:hana_shin:20220316203655p:plain

4.2 Sambaサーバへのアクセス

赤枠の部分に\\192.168.2.100と入力します。
f:id:hana_shin:20220223095732p:plain

sambaユーザの登録で登録した、ユーザ名とパスワードを入力します。
f:id:hana_shin:20220223173932p:plain

5 Sambaの接続状況確認方法

5.1 サーバ側

smbstatusコマンドを実行すると、192.168.2.101(Windows10)からSambaサーバにアクセスしていることがわかります。また、そのアクセスは、PIDが1584のプロセスが処理していることがわかります。

[root@server ~]# smbstatus

Samba version 4.10.16
PID     Username     Group        Machine                                   Protocol Version  Encryption           Signing
----------------------------------------------------------------------------------------------------------------------------------------
1584    user1        user1        192.168.2.101 (ipv4:192.168.2.101:57569)  SMB3_11           -                    partial(AES-128-CMAC)

Service      pid     Machine       Connected at                     Encryption   Signing
---------------------------------------------------------------------------------------------
IPC$         1584    192.168.2.101 水  3月 16 19時05分52秒 2022 JST -            -

No locked files

psコマンドを使って、smbdプロセスを確認してみます。PID1573が親プロセス、PID1584が子プロセスです。

[root@server ~]# ps -C smbd -o comm,pid,ppid,args
COMMAND            PID   PPID COMMAND
smbd              1573      1 /usr/sbin/smbd --foreground --no-process-group
smbd              1584   1573 /usr/sbin/smbd --foreground --no-process-group

次に、lsofコマンドを使って、smbdプロセスの状態を確認してみます。PID1573のプロセスはLISTEN状態です。つまり、SambaクライアントからのTCPコネクション確立を待っています。一方、子プロセス(PID1584)は、SambaクライアントとTCPコネクションを確立していることがわかります。なお、lsofコマンドの使い方は、lsofコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# lsof -i:445 -a -nP
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
smbd    1573 root   34u  IPv6  26624      0t0  TCP *:445 (LISTEN)
smbd    1573 root   36u  IPv4  27650      0t0  TCP *:445 (LISTEN)
smbd    1584 root   40u  IPv4  27751      0t0  TCP 192.168.2.100:445->192.168.2.101:57569 (ESTABLISHED)

5.2 クライアント側

クライアント側でSambaの接続状況を確認してみます。WindowsPowerShellを起動します。PowerShellでGet-SmbConnectionコマンドを実行します。
f:id:hana_shin:20220316191708p:plain

6 ログの出力方法

デバッグ用にデフォルトのログ出力場所とはとは違う場所にログを出力してみます。globalセクションに、出力先(log file)と出力レベル(log level)を設定します。
・出力レベル:0~5。0がデフォルト。値が大きいほど、詳細なログを出力。
・出力先:ログの出力先を指定。%mはプロセス名に展開。

ここでは、/tmp配下にログを出力してみます。

[root@server ~]# cat /etc/samba/smb.conf
[global]
        workgroup = WORKGROUP
        security = user

        passdb backend = tdbsam
        log file = /tmp/sambalog.%m
        log level = 5

        printing = cups
        printcap name = cups
        load printers = yes
        cups options = raw

[homes]
-snip-

ログ出力を確認するため、smbを再起動します。

[root@server ~]# systemctl restart smb

ログを確認します。日時の右横の数値(0,3,4,5)がログレベルになります。

[root@server ~]# less /tmp/sambalog.smbd

-snip-

[2022/03/16 19:42:30.396232,  5] ../../source3/printing/print_cups.c:520(cups_async_callback)
  cups_async_callback: callback received for printer data. fd = 16
[2022/03/16 19:42:30.396315,  3] ../../source3/printing/print_cups.c:536(cups_async_callback)
  failed to retrieve printer list: NT_STATUS_UNSUCCESSFUL
[2022/03/16 19:42:30.396398,  2] ../../lib/util/tevent_debug.c:66(samba_tevent_debug)
  samba_tevent: EPOLL_CTL_DEL EBADF for fde[0x564448658380] mpx_fde[(nil)] fd[16] - disabling
[2022/03/16 19:42:30.397387,  1] ../../source3/printing/printer_list.c:234(printer_list_get_last_refresh)
  Failed to fetch record!

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ