Linux(CentOS 8.1・openSUSE 15.1・Ubuntu 20.04)の社内サーバー構築の基本！Sambaでファイルサーバー

コロナウイルスの影響で、世界経済が崩壊しており、規模関係なくテレワークの導入も相次いでいますが、小規模組織からPCを使った業務で、部屋の中のLAN内でファイルを共有することから、まずは始めたいと思います( ˶˙ᵕ˙˶ )

基本は**Linux＋Sambaによる、LAN内のファイルサーバー**で、組織内で複数のPCでファイルを共有することから始めましょう！簡単なため、Linux各ディストリビューションに用意されているSambaをインストールして、Linuxによるファイルサーバーを構築します

# 前提と準備
## Linuxサーバー構築の記事
- Sambaでファイルサーバー構築(CentOS 8.1・openSUSE 15.1・Ubuntu 20.04)【この記事】
- [LinuxでApache2.4＋PHP7.4をソースコンパイル - 1.Apache導入](https://qiita.com/kazumi75kitty/items/daaf8ff8feb50ad04f41) /[【Raspberry Pi】](https://qiita.com/kazumi75kitty/items/67686eccaaec73251458)
- [LinuxでApache2.4＋PHP7.4をソースコンパイル - 2.PHP導入](https://qiita.com/kazumi75kitty/items/fca116b1b387fe56c93c) /[【Raspberry Pi】](https://qiita.com/kazumi75kitty/items/50f1a447f6ebc2ee2b61)
- [LinuxでApache2.4＋PHP7.4をソースコンパイル - 3.MySQL導入](https://qiita.com/kazumi75kitty/items/76807c637c096618a0e1)/[【Raspberry Pi】](https://qiita.com/kazumi75kitty/items/4212dacc45944f27ca94)
- [LinuxでApache2.4＋PHP7.4 - 4.セキュリティ(chownとfirewalld)](https://qiita.com/kazumi75kitty/items/8ad51806ac50bd04b644)
- [LinuxでIPsecゲートウェイをVPN構築 - 1.StrongSwan導入](https://qiita.com/kazumi75kitty/items/60941f00ae91c4d9f555) /[【Ubuntu 20.04＋Raspberry Pi】](https://qiita.com/kazumi75kitty/items/08259681247a6c2ebd0d)
- [LinuxでIPsecゲートウェイをVPN構築 - 2.VPNへの接続確認](https://qiita.com/kazumi75kitty/items/f5a33abda9f8edd5c47f) /[【Ubuntu 20.04＋Raspberry Pi】](https://qiita.com/kazumi75kitty/items/c83f920f052d83d62457)

## 環境
- ファイルサーバープログラム：Samba(Linuxパッケージ標準のsmbd)
- クライアント：Windows10 Pro
- サーバーのアーキテクチャ：x64(動作はHyper-Vの第2世代で確認)
Linuxのディストリビューション：CentOS 8.1 / openSUSE 15.1 Leap / Ubuntu 20.04(すべて64bit)

## 前提
- ユーザーはrootでインストールするものとする。キャプチャ画面では管理者adminを作成し、そこからsudoでrootと同様のコマンドを実行する
- どのディストリビューションでも、ファイアウォールはfirewalldを使うものとする(ディストリビューション独自のファイアウォールコマンドは使用しない)
- OSのインストールについては省略する
- LANのネットワークセグメントは192.168.1.0/24に属するものとする
- CentOSについては、SELinuxを無効にします(/etc/selinux/config編集後は再起動も必要)。

```CentOS8.1
# vi /etc/selinux/config
```
```ini:/etc/selinux/config
SELINUX=enforcing
→　SELINUX=disabled に変更
```
```CentOS8.1
# reboot
```

## サーバー条件
以下の条件で、Sambaでファイルサーバーを組んでみました٩(.´͈ ᵕ `͈ .♡)۶

### IPアドレス
- クライアント：192.168.1.11
- Linuxサーバー：192.168.1.18(どのディストリビューションでも同じIPアドレスを使う)
- 所属ネットワークセグメント：192.168.1.0/24

![サーバー図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617906/d5e61ea4-6bd8-9c7b-e41c-ce19ea0bcdab.png)


### ファイルサーバー条件
- 例として、ファイルサーバースペースで作成するセクション名を「kazumi75kitty」とする
- 例として、ファイルサーバースペースとして使用するLinuxサーバー上のディレクトリは /mnt/miura/ とし、読み書きともにOKとする

# 作業手順
## OSのアップデート
これはもちろんのことです！アップデートは事前に実行

```CentOS8.1
# dnf -y upgrade
```
```openSUSE15.1
# zypper -n update
```
```Ubuntu20.04
# apt-get -y update
```

アップデートが完了したら、**Linuxを再起動**します。

## Sambaの導入

### Sambaのインストール
Linux各ディストリビューションのパッケージからSambaをインストールします。

```CentOS8.1
# dnf -y install samba
```
```openSUSE15.1
# zypper -n install samba
```
```Ubuntu20.04
# apt-get -y install samba
```

### Sambaを利用するユーザーの作成
新たにSambaファイルサーバーを利用するLinuxユーザーを新規に作成。
今回は例として「*shonan*」というユーザー名でファイルサーバーを使うものとします。

```
# useradd -m shonan
# passwd shonan　　←　　ユーザーに対するパスワードを設定します
```

次に、作成したLinuxユーザーに対して、Sambaへ登録します。*pdbedit*コマンドを使います。

```
# pdbedit -a shonan
```

ここで混乱してはいけないこととしては、Linuxユーザー作成時で登録したパスワードとは別に、**Sambaファイルサーバー用のパスワードをさらに設定する必要があります**。実際にWindowsからファイルサーバーへログオンするには、Linuxユーザーのパスワードではなく**pdbeditコマンドで設定したパスワードである**ことを忘れないでください(私は簡単のためLinuxパスワードと同じにしていますが。。( ๑･∞･๑ ))

### Sambaの設定
Sambaの設定を「/etc/samba/smb.conf」にて行います。

```
# vi /etc/samba/smb.conf
```

```ini:/etc/samba/smb.conf
# 追記または変更するもののみを記載します。他はデフォルト設定のままです
[global]
   workgroup = [所属するWindowsのワークグループ名]
   hosts allow = [接続許可するIPアドレスまたはネットワークセグメント]
[<任意のセクション名>]
   comment = [任意のコメント]
   path = [ファイルサーバーとして利用するディレクトリ]
   read only = no
   browsable = yes
   writable = yes
```
このファイルでは、Linuxファイルサーバー上のディレクトリを、任意のセクション名として区切ることで、柔軟な用途でファイルサーバーとして公開することができるのです。

そこで今回は「ファイルサーバー条件」の記載の通り、セクション名を「*kazumi75kitty*」という名前で、Linuxの「*/mnt/miura/*」というディレクトリを、ファイルサーバーとして利用できるようにしたいと思います。また、ネットワークが192.168.1.0/24にいることが前提ですから、このネットワークを許可します。

そうすると、/etc/samba/smb.confは、以下の設定にて行われる。

```ini:/etc/samba/smb.conf(例)
# 追記または変更するもののみを記載します。他はデフォルト設定のままです
[global]
   workgroup = [所属するWindowsのワークグループ名]
   hosts allow = 192.168.1. 127.0.0.1
   # hosts allowで、192.168.1.0/24と自分自身を許可する場合は、上記の記載方法になります。
[kazumi75kitty]
   comment = File Server Test in Miura Peninsula
   path = /mnt/miura
   read only = no
   browsable = yes
   writable = yes
```

所属するWindowsのワークグループ名は、コントロールパネルのシステムのプロパティで確認できるので、あえて記載しませんでした＾＾

### ディレクトリに関してハマりやすいこと

セクションの「path」で指定したディレクトリは、**所有者をpdbeditで登録したユーザーと同じにしないと、ファイルサーバーのファイルやディレクトリへアクセスできなかったりするので**、所有者をちゃんと確認してから、変えてあげています

今回「/mnt/miura/」をファイルサーバーのスペースに使用し、例えばユーザーはshonanで使いたい場合は、**/mnt/miura/のディレクトリの所有者がshonanである**(rootではない)必要があります。

![Ownerchange.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617906/d8e84035-78dc-47f4-93a9-e1b1b30c863a.png "所有者の確認とchown")
上記画像のように(画像のユーザー名は運用中のものなので伏せています)

なお、ディストリビューションによってはsmb.confの説明の有無により、複雑だったり、シンプルだったりするので、画像で参考にしておきます(˶ ･ᴗ･ )⚐⚑

- CentOS 8.1
![CentOS8-smbconf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617906/1d902a7e-c3a8-10f9-1772-ceeb3b972bd3.png "CentOS 8.1のsmb.conf")

- openSUSE 15.1
![openSUSE15-smbconf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617906/848df20c-a1cd-5c01-b34e-f6cb15e9ab52.png "openSUSE 15.1のsmb.conf")

- Ubuntu 20.04
 - globalセクション(非常に項目が多いので一部だけ)　
![Ubuntu20-smbconf-global.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617906/20f1e6cf-fb49-9d7c-db0d-b55c774cd36e.png "openSUSE 15.1のsmb.conf")
 - 自分で用意するセクション　
![Ubuntu20-smbconf-sect.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617906/3086f938-bab3-bc19-eb62-6dd58e5fb6a8.png "openSUSE 15.1のsmb.conf")

### パラメーターのチェック

```
# testparm /etc/samba/smb.conf
```
「Loaded services file OK.」と出れば、設定は正しく記載されているはず。

### Sambaサービスの起動

```CentOS8.1・openSUSE15.1
# systemctl start smb
# systemctl enable smb
# systemctl status smb
```

```Ubuntu20.04
# systemctl start smbd
# systemctl enable smbd
# systemctl status smbd
```

enableを使うことで、再起動後も自動起動でファイルサーバーを使うことができます。

statusで「Active」「Running」と出ていて「Failed」が出ていないかを確認。もし「Failed」となっている場合は、smb.confの設定のスペルミスなど、再度確認に戻る羽目になります。

次に、ログを確認し、何もエラーがなければ、smb.confで指定したディレクトリを認識しています。

```
# less -r /var/log/samba/log.smbd
```

「canonicalize_connect_path failed for service samba, path /mnt/miura」のようにパス指定失敗が表示されるときは、指定したディレクトリが存在しているか、ls -lコマンドで所有者とパーミッションを確認し、アクセス可能でない可能性がある。

### ファイルサーバーにアクセスしてみよう
では、Windowsのクライアントから、Linuxファイルサーバーにアクセスしてみます。
Windowsのエクスプローラーで「\\\\[LinuxファイルサーバーのIPアドレス]」を入力します。

まずはfirewalldの開放を行います(詳細は後術)。

```
# firewall-cmd --permanent --add-service=samba
# firewall-cmd --reload
```

ここでは、サーバーのIPアドレスが192.168.1.18なので「\\\\192.168.1.18\\」でアクセスします。正常にサーバーを識別できれば、Windowsセキュリティの認証失敗ダイアログが出るはずです。
![Conn-OK.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617906/92f766d8-30ae-06e7-ede2-67b4025b7455.png "接続OK→認証可能な状態")
#### 接続できない場合は？
![Conn-NG.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617906/e9d82615-bd7a-5ecb-f4b7-d06834a8ea31.png "接続NG")
最初の認証失敗の画面ではなく、接続できません、というメッセージが表示されている場合は、firewalld(後述)の設定で「firewall-cmd --list-all」で、Serviceに「samba」が許可されていなかったり、SambaサービスがLinuxで起動されているかを「systemctl status smb(d)」で確認すると「Failed」というような起動失敗が生じているかもしれません。

#### ログオンしてみよう
認証失敗ダイアログが表示され、ファイルサーバーに接続できたなら、pdbeditでSambaに登録したユーザーでログインします。ここでの例でのshonanの場合は、ユーザー名にshonanを、パスワードに**pdbeditで登録した際のパスワード**(**もちろんLinuxユーザーのパスワードと区別します**)を入力し、ログオンします。
![Conn-logged-on.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617906/071faffc-8a8c-a1f3-972a-595f80645c93.png "ログオン直後の表示")
そうすると、ファイルスペース名として定義したもの、ここでの例では「kazumi75kitty」が表示されていれば、smb.confで作成したセクションによるファイルスペースが正常に認識されたことになります。

#### ファイルを置いてみよう
ファイルスペースが認識されたら、任意のファイルをいろいろと置いてみます。
![FileSave-OK.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617906/0fec713f-06d1-3801-adb7-2ed8fa418da8.png "ファイルが置けた")
また、置いたファイルもWindows上で編集し、保存できることも確認してみます。

### ファイルが置けない、または読み取り専用となってしまう場合
Linuxサーバー側で、ファイルサーバーとして使用中のディレクトリで、所有者が違ってたり、パーミッションが読み書きできない状態になっているので、もう一度ls -lコマンドで再確認。

# 基本的なセキュリティ

## Sambaの設定での基本セキュリティ
基本的には、部外者へのアクセスを許さない、ということが大前提です。応用なセキュリティとしては、ドメインやActive Directoryを用いる手法もありますが、ここでは割愛します。部外者のネットワークからはアクセスしないという前提で、自分の属するネットワークだけアクセスを許すという方法で、**smb.confのhosts allowを制限します。**

今回の例では、192.168.1.0/24でファイルサーバーを利用していますが、smb.confのhosts allowから192.168.1.を許可しない設定にしたらどうなるのでしょうか？？

例えば、以下のように、192.168.1.を許可せず、192.168.2.を許可します。
 ~~hosts allow = 192.168.1. 127.0.0.1~~
hosts allow = 192.168.2. 127.0.0.1
![Smb-allowdomainchg-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617906/ede6fc56-a14c-9576-dfbd-40b3a1b4c6da.png "許可ネットワークを変えてみる")

それでエクスプローラーで「\\\\192.168.1.18\\」へアクセスすると、以下のエラーがでるはずです。
![Smb-allowdomainchg-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617906/e389613d-c615-f138-fd43-17476cdbd217.png "アクセス拒否")
そしてログ/var/log/samba/log.smbdは、以下のように、192.168.1.11からのアクセスが拒否されていることがわかります。
![Smb-allowdomainchg-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617906/89f96c7c-2275-3c5a-1101-e81c511be7fe.png "ログ")

このようにして、Sambaを利用できるネットワークドメインを制限できましたね。

## firewalldによる基本セキュリティ
先ほど「firewall-cmd」で、以下のファイアウォールを開放したと思います。

```
# firewall-cmd --permanent --add-service=samba
# firewall-cmd --reload
```

これは、firewalldというLinuxのファイアウォールで、Sambaというサービスを常に受信許可するという意味で、指定された以外のサービスは許可しないということを意味しています。どのサービスを許可しているかを確認する場合は、以下のコマンドを入力し「services: dhcpv6-client ssh samba」のように、services:以下に許可するサービスが表示されているかを確認します。

```
# firewall-cmd --list-all
```

なお、そのほかにrich rulesを用いて、Sambaの使用するポートを、特定のIPアドレスやネットワークを対象に許可するという手法も可能ですが、ここでは省略します。

## Ubuntuでufwを使用する場合
Ubuntuの場合は、x64ではfirewalldが確かに使えますが、ほとんどの場合はufwでしょう。そこで、ufwでも一応載せておきます。SambaではUDPの137・138と、TCPの139・445を使っているので、そのポートを開放します。

```Ubuntu20.04(ufw)
[Ubuntuなど、firewalldではなくufwを使う場合]
# ufw allow 137/udp
# ufw allow 138/udp
# ufw allow 139/tcp
# ufw allow 445/tcp

# ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 30303/tcp                  ALLOW IN    192.168.1.0/24
[ 2] 5900:5999/tcp              ALLOW IN    192.168.1.0/24
[ 3] 137/udp                    ALLOW IN    Anywhere
[ 4] 138/udp                    ALLOW IN    Anywhere
[ 5] 139/tcp                    ALLOW IN    Anywhere
[ 6] 445/tcp                    ALLOW IN    Anywhere
[ 7] 137/udp (v6)               ALLOW IN    Anywhere (v6)
[ 8] 138/udp (v6)               ALLOW IN    Anywhere (v6)
[ 9] 139/tcp (v6)               ALLOW IN    Anywhere (v6)
[10] 445/tcp (v6)               ALLOW IN    Anywhere (v6)
```
なお追加したポートのFromに「Anywhere」とありますが、あくまでもufwのファイアウォールではIPアドレスを制限していないだけであって、実際にSambaの設定ではIPアドレスを制限されています。例えばsmb.confのhosts allowが192.168.1.ならば、192.168.1.0/24のみを受けつけていますね。なるほど…

# 参考文献
　1. CentOS7で作るネットワークサーバー構築ガイド【サーバ構築研究会 著】秀和システム
　2. 情報処理工学 –OSとインターネットの仕組み- 【木下 宏揚 著】コロナ社
<sub>
※　文献1.はCentOS 7 向けですが、SambaについてはCentOS 8 もyum→dnfにパッケージインストールコマンドが変わっただけの差なので、原形をとどめないような難しさは特にありません。
※　文献2.の出版社名に「コロナ」がありますが、2020年6月現在、コロナウイルスの風評被害により「コロナ」とついただけで偏見するケースが見受けられます。コロナの本来の意味は、太陽の超高温の非常に薄いプラズマ大気であり、物理的にはコロナ放電の形状を意味するものですので、コロナの本来の意味を正しく使いましょう。
</sub>