コロナウイルスの影響で、世界経済が崩壊しており、規模関係なくテレワークの導入も相次いでいますが、小規模組織から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導入 /【Raspberry Pi】
- LinuxでApache2.4+PHP7.4をソースコンパイル - 2.PHP導入 /【Raspberry Pi】
- LinuxでApache2.4+PHP7.4をソースコンパイル - 3.MySQL導入/【Raspberry Pi】
- LinuxでApache2.4+PHP7.4 - 4.セキュリティ(chownとfirewalld)
- LinuxでIPsecゲートウェイをVPN構築 - 1.StrongSwan導入 /【Ubuntu 20.04+Raspberry Pi】
- LinuxでIPsecゲートウェイをVPN構築 - 2.VPNへの接続確認 /【Ubuntu 20.04+Raspberry Pi】
環境
- ファイルサーバープログラム: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編集後は再起動も必要)。
# vi /etc/selinux/config
SELINUX=enforcing
→ SELINUX=disabled に変更
# reboot
サーバー条件
以下の条件で、Sambaでファイルサーバーを組んでみました٩(.´͈ ᵕ `͈ .♡)۶
IPアドレス
- クライアント:192.168.1.11
- Linuxサーバー:192.168.1.18(どのディストリビューションでも同じIPアドレスを使う)
- 所属ネットワークセグメント:192.168.1.0/24
ファイルサーバー条件
- 例として、ファイルサーバースペースで作成するセクション名を「kazumi75kitty」とする
- 例として、ファイルサーバースペースとして使用するLinuxサーバー上のディレクトリは /mnt/miura/ とし、読み書きともにOKとする
作業手順
OSのアップデート
これはもちろんのことです!アップデートは事前に実行
# dnf -y upgrade
# zypper -n update
# apt-get -y update
アップデートが完了したら、Linuxを再起動します。
Sambaの導入
Sambaのインストール
Linux各ディストリビューションのパッケージからSambaをインストールします。
# dnf -y install samba
# zypper -n install samba
# 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
# 追記または変更するもののみを記載します。他はデフォルト設定のままです
[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は、以下の設定にて行われる。
# 追記または変更するもののみを記載します。他はデフォルト設定のままです
[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の説明の有無により、複雑だったり、シンプルだったりするので、画像で参考にしておきます(˶ ・ᴗ・ )⚐⚑
パラメーターのチェック
# testparm /etc/samba/smb.conf
「Loaded services file OK.」と出れば、設定は正しく記載されているはず。
Sambaサービスの起動
# systemctl start smb
# systemctl enable smb
# systemctl status smb
# 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を使っているので、そのポートを開放します。
[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月現在、コロナウイルスの風評被害により「コロナ」とついただけで偏見するケースが見受けられます。コロナの本来の意味は、太陽の超高温の非常に薄いプラズマ大気であり、物理的にはコロナ放電の形状を意味するものですので、コロナの本来の意味を正しく使いましょう。