【VMware】CentOS7にSambaを導入しファイルサーバーを構築する

## 概要
仮想サーバにSambaを導入しファイルサーバーを構築して、windowsからアクセスする

## 環境
* windows10
* VMware Workstation 16 Player
* CentOS7
* サーバのIPアドレスは`192.168.3.200/24`と設定している

## OS環境の作成
VMware Workstation 16 Playerを使用してCentOS7の「最小限のインストール」をする。
※その際に、選択した環境のアドオン「開発ツール」にチェックを入れてインストールする。

## ホスト名の設定
ホスト名＝ファイルサーバー名となります。今回のホスト名は`fileServer`としている。
変更したいときは以下参考にしてください。

https://qiita.com/C_Koch/items/5db959c2ba83818ba5cc



## SELinuxを無効に設定
「/etc/selinux/config」の7行目「SELINUX=enforcing」を「SELINUX=disable」に修正する。

```:完成形
# vi /etc/selinux/config
1
2 # This file controls the state of SELinux on the system.
3 # SELINUX= can take one of these three values:
4 #     enforcing - SELinux security policy is enforced.
5 #     permissive - SELinux prints warnings instead of enforcing.
6 #     disabled - No SELinux policy is loaded.
7 SELINUX=disable
8 # SELINUXTYPE= can take one of three values:
9 #     targeted - Targeted processes are protected,
10 #     minimum - Modification of targeted policy. Only selected processes are protected.
11 #     mls - Multi Level Security protection.
12 SELINUXTYPE=targeted
```
※行数は`:set number`で表示可能

## ファイヤーウォールの設定
### 2つの設定方法がある

1．firewalldを使用
2．iptablesを使用

### １．firewalldを使用
#### １－１．現在のファイヤーウォールの設定確認
servicesにsambaが無いことを確認

```
# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
```

#### １－２．接続するserviceにsambaを追加する

```
# firewall-cmd --add-service=samba --permanent
success
# firewall-cmd --reload
success
```
`--permanent`を付けることで、firewalld の再起動/再読み込み時にも反映させるようにする。

#### １－３．設定後確認
servicesにsambaが追加されていることを確認

```
firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources:
  services: dhcpv6-client samba ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
```

### ２．iptablesを使用
前提条件１：CentOS7ではfirewalldが使用されているため、iptablesが別途インストールされていること。
前提条件２：firewalldを無効にしていること
#### ２－１ /etc/sysconfig/iptablesで現在許可されているポートを確認する
`cat /etc/sysconfig/iptables`などを使用してみる

```:/etc/sysconfig/iptables
# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
```

#### ２－２．ポートを/etc/sysconfig/iptablesに追加する
`vi /etc/sysconfig/iptables`で編集モードへ行く。

下記の項目を「22ポート」(-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT)の下に追記

```:22ポートの下に追加する内容
-A INPUT -p tcp -m tcp --dport 135:139 -j ACCEPT
-A INPUT -p udp -m udp --dport 135:139 -j ACCEPT
-A INPUT -p tcp -m tcp --dport microsoft-ds -j ACCEPT
```
以下、完成形を載せておく。

```:/etc/sysconfig/iptables完成版
# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 135:139 -j ACCEPT
-A INPUT -p udp -m udp --dport 135:139 -j ACCEPT
-A INPUT -p tcp -m tcp --dport microsoft-ds -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
```

#### ２－３．設定後確認
servicesにwindowsで使用するポートが追加されていることを確認

```
# iptables --list
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
...
ACCEPT     tcp  --  anywhere             anywhere             tcp dpts:epmap:netbios-ssn
ACCEPT     udp  --  anywhere             anywhere             udp dpts:epmap:netbios-ssn
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:microsoft-ds
...
```
参考サイト：https://bit.ly/2T4mNjy 　　https://bit.ly/3fW3txP

## sambaのインストール
### １．sambaをインストールする

```
# yum -y install samba samba-common
```

### ２．sambaの起動と確認
```
//sambaの起動
# systemctl start smb nmb

//起動確認
# systemctl status smb nmb
● smb.service - Samba SMB Daemon
   Loaded: loaded (/usr/lib/systemd/system/smb.service; enabled; vendor preset: disabled)
   Active: active (running) since 土 2021-05-29 23:56:16 JST; 27min ago
     Docs: man:smbd(8)
           man:samba(7)
           man:smb.conf(5)
 Main PID: 1043 (smbd)
   Status: "smbd: ready to serve connections..."
   CGroup: /system.slice/smb.service
   (省略)

● nmb.service - Samba NMB Daemon
   Loaded: loaded (/usr/lib/systemd/system/nmb.service; enabled; vendor preset: disabled)
   Active: active (running) since 土 2021-05-29 23:56:15 JST; 27min ago
     Docs: man:nmbd(8)
           man:samba(7)
           man:smb.conf(5)
 Main PID: 1021 (nmbd)
   Status: "nmbd: ready to serve connections..."
   CGroup: /system.slice/nmb.service
           tq1021 /usr/sbin/nmbd --foreground --no-process-group
           mq1041 /usr/sbin/nmbd --foreground --no-process-group
　　(省略)
```

### ３．Samba自動起動の設定
```
//自動起動の設定
# systemctl enable smb nmb
Created symlink from /etc/systemd/system/multi-user.target.wants/smb.service to /usr/lib/systemd/system/smb.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/nmb.service to /usr/lib/systemd/system/nmb.service.

//設定の確認
# systemctl is-enabled smb nmb
enabled
enabled
```


## sambaの設定
`/etc/samba/smb.conf`に設定を入れていく
### １．`smb.conf`のバックアップを取っておく

```:/etc/samba/smb.confのバックアップ
# cp /etc/samba/smb.conf /etc/samba/smb.conf.org
```

### ２．`/etc/samba/smb.conf`を以下のように設定する

```:/etc/samba/smb.conf
# See smb.conf.example for a more detailed config file or
# read the smb.conf manpage.
# Run 'testparm' to verify the config is correct after
# you modified it.

[global]
        workgroup = WORKGROUP
        server string = SAMBA SERVER Version %v
        netbios name = fileServer
        security = user
        passdb backend = tdbsam
        dos charset = CP932
        unix charset = UTF-8
        wins support = yes
        # printing = cups
        # printcap name = cups
        load printers = no
        disable spoolss = yes
        # cups options = raw

[homes]
        comment = Home Directories
        valid users = %S, %D%w%S
        browseable = No
        read only = No
        inherit acls = Yes

[share]
        comment = Share Folder for All Users
        path = /home/share/
        browseable = yes
        read only = no
        hosts allow = 192.168.3.


#[printers]
#       comment = All Printers
#       path = /var/tmp
#       printable = Yes
#       create mask = 0600
#       browseable = No

#[print$]
#       comment = Printer Drivers
#       path = /var/lib/samba/drivers
#       write list = @printadmin root
#       force group = @printadmin
#       create mask = 0664
#       directory mask = 07:75
```
上記のコードの意味を以下の表にまとめておく

* [global]について

|global|意味|
|:------------------------------------------------|:----------------|
|workgroup = WORKGROUP|Windowsで利用するワークグループ名|
|server string = SAMBA SERVER Version %v|  ネットワークコンピュータ一に表示される情報 |
|netbios name = fileServer| ファイルサーバー名の設定  | 
|security = user|誰がユーザ認証を行うかを設定するパラメータ<br>(ユーザ名とパスワードでローカル認証を行う)|
|passdb backend = tdbsam|Sambaのパスワードデータベースの形式(TDB)|
|dos charset = CP932|WINDOWS側の文字コード設定|
|unix charset = UTF-8|WINDOWS側の文字コード設定 |
|wins support = yes|WINSサポート用パラメータ、WINS利用時に有効|
|load printers = no|プリンタ共有機能の設定パラメータ、noで無効|
|disable spoolss = yes|プリンタ共有機能の設定パラメータ、yesで無効|

* [homes][share]について

|homes / share| 意味 |
|:-|:-|
| comment = Home Directories  |  共有フォルダに設定する任意のコメント |
| valid users = %S, %D%w%S  | アクセス可能なユーザを指定<br>(%Sはアクセスしてきたユーザ名に置き換わる変数)  |
|  browseable = No | 共有フォルダを見えるかどうか  |
| read only = No  | 共有フォルダを読み取り専用にするかどうか  |
|  inherit acls = Yes |  上位のディレクトリに付与されているACLアクセス許可すべてが継承可能となりファイル、フォルダ作成時に自動的に付与 |
| path = /home/share/  | 共有フォルダとして設定するディレクトリのパス  |
|  hosts allow = 192.168.3.  | アクセスできるIPアドレスの指定  |

### ３．設定の確認
2行目のように`Loaded services file OK.`と出ていれば問題ない。
また、上の方の行に`unkown`というエラーが出ていたら、ファイルのどこかにスペルミスや構文の間違いがある。

```
# testparm -s
Load smb config files from /etc/samba/smb.conf
Loaded services file OK.
Server role: ROLE_STANDALONE

# Global parameters
[global]
        disable spoolss = Yes
        dos charset = CP932
        load printers = No
        security = USER
        server string = SAMBA SERVER Version %v
        wins support = Yes
        idmap config * : backend = tdb


[homes]
        browseable = No
        comment = Home Directories
        inherit acls = Yes
        read only = No
        valid users = %S %D%w%S


[share]
        comment = Share Folder for All Users
        hosts allow = 192.168.3.
        path = /home/share/
        read only = No
```

## 共有用ディレクトリの作成
`/etc/samba/smb.conf`の設定で、`share`ディレクトリの設定を入れたため、`share`ディレクトリを作成する。

```
# cd /home/
# mkdir share
# chmod -R 0777 share
# chown -R nobody:nobody share
```

## Sambaアクセス用ユーザー作成と追加
### １．Linuxユーザー(サーバサイド)のユーザーを作成

```
# useradd samba01
# passwd samba01
Changing password for user samba01
New password: samba01パスワード
Retype new password: パスワードを再入力
passwd: all authentication tokens updated successfully.
```

### ２．Windows側のユーザー属性追加
Sambaユーザの登録をします。

```
# pdbedit -a -u samba01 -f "samba user01"
new password:     passwdコマンドと同じパスワード
retype new password:     パスワードを再入力
```
`-a`は新規作成するためのオプション。
`-u`はユーザー名を指定するためのオプション。
`-f`はフルネームの設定です。これはあってもなくても問題ありません。

### ３．設定確認
```
//作成したユーザの表示
# pdbedit -L
samba01:1004:samba user01

//ユーザーの詳細な情報
# pdbedit -L -v samba01
Unix username:        samba01
NT username:
Account Flags:        [U          ]
User SID:             S-1-5-21-3128501545-864274216-2484869991-1002
Primary Group SID:    S-1-5-21-3128501545-864274216-2484869991-513
Full Name:            samba user01
Home Directory:       \\fileserver\samba01
HomeDir Drive:
Logon Script:
Profile Path:         \\fileserver\samba01\profile
Domain:               FILESERVER
Account desc:
Workstations:
Munged dial:
Logon time:           0
Logoff time:          Thu, 07  Feb 2036 00:06:39 JST
Kickoff time:         Thu, 07  Feb 2036 00:06:39 JST
Password last set:    Sat, 29  May 2021 18:42:35 JST
Password can change:  Sat, 29  May 2021 18:42:35 JST
Password must change: never
Last bad password   : 0
Bad password count  : 0
Logon hours         : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
```

#### もし間違ってユーザを作成したり追加してしまったら

https://qiita.com/C_Koch/items/a3d1ce26a098a6ccb94d

## Sambaの再起動
```
# systemctl restart smb
```

## サーバにping疎通
コマンドプロンプトを起動し、サーバのコンピュータ名にpingを送り疎通確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/748917/a2dd0cc2-eca0-2daa-daaf-0a073c6439d6.png)

もし通らなかったら、IPアドレスでpingが疎通する確認
　＝＞疎通する：時間がたったら再度コンピュータ名で疎通してみる
　＝＞疎通しない：IPアドレスなどの設定がおかしい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/748917/8724220a-7eb9-7537-eb69-48b25dbbf858.png)

## 共有フォルダの確認
エクスプローラーを開き、上の検索バーに`\\fileServer`と入力する
エクスプローラーで`\`は`￥`と表示されるはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/748917/cf7eff17-2651-2c08-3a4e-1ea1302dd984.png)

Enterを押したら、「ネットワーク視覚情報入力」というダイアログが出るので、先ほど追加したユーザ名とパスワードを入力する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/748917/cbec6c09-c73a-7d9e-89e5-b2488c048f89.png)

以下のように、ファイルが確認出来たら完成です！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/748917/2ccf4ad7-4fcb-8170-8abe-88fba7335753.png)

## 共有フォルダへのアクセス許可がないときの対処法
https://qiita.com/C_Koch/items/5f41aa0f84c039a99efa
## 共有フォルダへのアクセスが遅いことへの対処法
https://qiita.com/C_Koch/items/c87405de26a0458b2ff0
## ゴミ箱機能を追加する
https://qiita.com/C_Koch/items/fcecf2bdcf2fa2bebd37

## 参考サイト
* https://www.rem-system.com/centos-samba/
* https://qiita.com/s_szk/items/e5ce7a042779675301f4#samba%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB
* https://qiita.com/hana_shin/items/e768ef63bdeeef3ada39#2-%E7%92%B0%E5%A2%83