Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
8
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

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

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

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

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

  • CentOS 8.1
    CentOS8-smbconf.png

  • openSUSE 15.1
    openSUSE15-smbconf.png

  • Ubuntu 20.04

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

パラメーターのチェック

# 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

接続できない場合は?

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

ログオンしてみよう

認証失敗ダイアログが表示され、ファイルサーバーに接続できたなら、pdbeditでSambaに登録したユーザーでログインします。ここでの例でのshonanの場合は、ユーザー名にshonanを、パスワードにpdbeditで登録した際のパスワード(もちろんLinuxユーザーのパスワードと区別します)を入力し、ログオンします。
Conn-logged-on.png
そうすると、ファイルスペース名として定義したもの、ここでの例では「kazumi75kitty」が表示されていれば、smb.confで作成したセクションによるファイルスペースが正常に認識されたことになります。

ファイルを置いてみよう

ファイルスペースが認識されたら、任意のファイルをいろいろと置いてみます。
FileSave-OK.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

それでエクスプローラーで「\\192.168.1.18\」へアクセスすると、以下のエラーがでるはずです。
Smb-allowdomainchg-2.png
そしてログ/var/log/samba/log.smbdは、以下のように、192.168.1.11からのアクセスが拒否されていることがわかります。
Smb-allowdomainchg-3.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とインターネットの仕組み- 【木下 宏揚 著】コロナ社

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
8
Help us understand the problem. What are the problem?