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


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

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

前提と準備

Linuxサーバー構築の記事

環境

  • ファイルサーバープログラム: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
/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

ファイルサーバー条件

  • 例として、ファイルサーバースペースで作成するセクション名を「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
/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は、以下の設定にて行われる。

/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ではない)必要があります。


上記画像のように(画像のユーザー名は運用中のものなので伏せています)

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

  • CentOS 8.1

  • openSUSE 15.1

  • Ubuntu 20.04

    • globalセクション(非常に項目が多いので一部だけ) 
    • 自分で用意するセクション 

パラメーターのチェック

# 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セキュリティの認証失敗ダイアログが出るはずです。

接続できない場合は?


最初の認証失敗の画面ではなく、接続できません、というメッセージが表示されている場合は、firewalld(後述)の設定で「firewall-cmd --list-all」で、Serviceに「samba」が許可されていなかったり、SambaサービスがLinuxで起動されているかを「systemctl status smb(d)」で確認すると「Failed」というような起動失敗が生じているかもしれません。

ログオンしてみよう

認証失敗ダイアログが表示され、ファイルサーバーに接続できたなら、pdbeditでSambaに登録したユーザーでログインします。ここでの例でのshonanの場合は、ユーザー名にshonanを、パスワードにpdbeditで登録した際のパスワード(もちろんLinuxユーザーのパスワードと区別します)を入力し、ログオンします。

そうすると、ファイルスペース名として定義したもの、ここでの例では「kazumi75kitty」が表示されていれば、smb.confで作成したセクションによるファイルスペースが正常に認識されたことになります。

ファイルを置いてみよう

ファイルスペースが認識されたら、任意のファイルをいろいろと置いてみます。

また、置いたファイルも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

それでエクスプローラーで「\\192.168.1.18\」へアクセスすると、以下のエラーがでるはずです。

そしてログ/var/log/samba/log.smbdは、以下のように、192.168.1.11からのアクセスが拒否されていることがわかります。

このようにして、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とインターネットの仕組み- 【木下 宏揚 著】コロナ社

※ 文献1.はCentOS 7 向けですが、SambaについてはCentOS 8 もyum→dnfにパッケージインストールコマンドが変わっただけの差なので、原形をとどめないような難しさは特にありません。
※ 文献2.の出版社名に「コロナ」がありますが、2020年6月現在、コロナウイルスの風評被害により「コロナ」とついただけで偏見するケースが見受けられます。コロナの本来の意味は、太陽の超高温の非常に薄いプラズマ大気であり、物理的にはコロナ放電の形状を意味するものですので、コロナの本来の意味を正しく使いましょう。