Raspberry pi[Ubuntu]でファイル鯖[Samba]を構築

# お知らせ
こんにちは、愛知工業大学システム工学研究会です。
この記事は、2021-04-05に書かれた記事です。
間違った内容や古い内容が紛れていますが、過去の記事を残す一環として記事を書きます。
よろしくおねがいします。

Raspberry pi[Ubuntu]でファイル鯖[Samba]を構築
===

## 目次

1. はじめに
    1.1\. 対象者
    1.2\. 目標
    1.3\. Sambaとは
2. 構築環境
    2.1\. ハードウェア
    2.2\. ソフトウェア
3. 構築手順
    3.1\. パッケージのインストール
    3.2\. zlib のインストール
    3.3\. Samba のインストール
    3.4\. 設定ファイルの配置
    3.5\. ユーザ作成
    3.6\. グループ作成
    3.7\. グループにユーザ追加・削除
    3.8\. Samba用ユーザ追加
    3.9\. 共有用のフォルダ作成
    3.10\. 設定ファイルの編集
    3.11\. Samba の起動
    3.12\. ポート開放
4. ファイル鯖に接続(Mac & Windows10)
5. 参考資料

## 1\. はじめに

今回は、ディストリビューションの固定されているパッケージから構築するのではなく、公式より公開されているソースファイルから構築していきます。ディストリビューションからでは、簡単で早く構築できますが、バージョンが古く、セキュリティ面での不安要素があります。対して、ソースファイルからでは少し複雑で時間がかかりますが、最新のバージョンで構築でき、バグの存在が確認された場合はパッチの公開もされます。長期運用や本番環境を検討する場合は、迷うことなく後者を選択するべきです。

### 1.1\. 対象者

今回は以下の項目に心当たりがある方を対象にしています。
また、CUIの操作、vim等のテキストエディタの操作に慣れていることも含みます。テキストエディタについてはvim以外でも構いません。

* Raspberry pi を使って何かしてみたい
* 初めてファイル鯖を構築する
* 自宅でファイル鯖の運用をしてみたい
* ソースファイルからの構築をしてみたい

### 1.2\. 目標

少人数でファイル共有するための環境を構築すること

### 1.3\. Sambaとは

本当に簡単に言うとNASのようなものと認識しても問題ないです。WindowsやMac、Linuxとのファイル共有ができます。今回は記載していませんが、Active Directory と連携し、アクセス管理することもできます。

## 2\. 構築環境

事前に Raspberry pi のセットアップが終了していることが前提です。

### 2.1\. ハードウェア

| 項目 | 詳細 |
| :-: | :-: |
| Raspberry pi | 3 Model b+ |
| micro SD | 32GB |

### 2.2\. ソフトウェア

| 項目 | バージョン |
| :-: | :-: |
| Ubuntu | 20.04 |
| Samba | 4.13.4 |

## 3\. 構築手順

### 3.1\. パッケージのインストール

動作要件に必須であるパッケージのインストールをしていきます。

```
> apt install -y gcc make acl python3 libpython3-dev pkg-config libgnutls28-dev libjansson-dev libarchive-dev libacl1-dev \ libldap2-dev libldap2-dev libpam0g-dev libgpgme-dev libparse-yapp-perl libdbus-1-dev
```

### 3.2\. zlib のインストール

Zip や gzip に使われている圧縮アルゴリズムをライブラリ化された zlib のインストールをしていきます。これも動作要件に必須です。

```
> cd /home/ubuntu > wget http://zlib.net/zlib-1.2.11.tar.gz > tar -zxf zlib-1.2.11.tar.gz -C /usr/local/src > cd /usr/local/src/zlib-1.2.11 > ./configure > make && make install
```

### 3.3\. Samba のインストール

```
> cd /home/ubuntu > wget https://download.samba.org/pub/samba/stable/samba-4.13.4.tar.gz > tar -zxf samba-4.13.4.tar.gz > cd samba-4.13.4 > ./configure --without-ad-dc 'configure' finished successfully (5m32.860s) > make && make install Waf: Leaving directory `/home/ubuntu/samba-4.13.4/bin/default' Build commands will be stored in bin/default/compile_commands.json 'install' finished successfully (25m53.303s) > /usr/local/samba/sbin/smbd -V Version 4.13.4
```

### 3.4\. 設定ファイルの配置

デフォルト設定ファイルを特定のディレクトリに配置する。この設定ファイルを配置しないと起動に失敗します。

```
> cd /home/ubuntu/samba-4.13.4 > cp examples/smb.conf.default /usr/local/samba/etc/smb.conf
```

### 3.5\. ユーザ作成

ファイル鯖にアクセスするためのユーザを作成するためには、Linuxユーザの作成が必要です。今回は３ユーザ作成します。
ユーザの作成には、パスワード、名前などの入力項目がありますが、下記の操作例ではすべての項目に情報を入力していますが、必要なのはパスワードと名前だけです。残りの項目は未入力のままでも問題ありません。

```
> adduser user01 Adding user `user01' ... Adding new group `user01' (1001) ... Adding new user `user01' (1001) with group `user01' ... Creating home directory `/home/user01' ... Copying files from `/etc/skel' ... New password: Retype new password: passwd: password updated successfully Changing the user information for user01 Enter the new value, or press ENTER for the default 　　Full Name []: hoge 　　Room Number []: 001 　　Work Phone []: 00012345678 　　Home Phone []: 01012345678 　　Other []: none Is the information correct? [Y/n] Y > cat /etc/passwd | grep user01 user01:x:1001:1002:hoge,001,00012345678,01012345678,none:/home/user01:/bin/bash ### 上記と同手順でユーザ"user02"、"user03"を追加
```

### 3.6\. グループ作成

ファイル鯖へのアクセス権限をグループ単位で管理するためにグループを作成します。

```
> groupadd group-A > cat /etc/group | grep group-A group-A:x:1004:
```

### 3.7\. グループにユーザ追加・削除

グループ単位で管理するために、アクセスを許可するユーザをグループに追加していきます。

```
> gpasswd -a user01 group-A Adding user user01 to group group-A > gpasswd -a user02 group-A Adding user user02 to group group-A > gpasswd -a user03 group-A Adding user user03 to group group-A > getent group group-A group-A:x:1004:user01,user02,user03
```

グループ単位でのアクセス制御をしているため、アクセス制限をかける場合はグループからユーザを削除します。

```
> gpasswd -d user02 group-A Removing user user02 from group group-A
```

### 3.8\. Samba用ユーザ追加

Smaba用のユーザを追加します。入力項目はパスワードのみです。パスワードは必ずしもLinuxユーザを作成した時のパスワードと同じである必要はありません。

```
> /usr/local/samba/bin/smbpasswd -a user01 New SMB password: ←任意のパスワード入力 Retype new SMB password: ←もう一度パスワード入力 Added user user01. ### 上記と同手順でSambaユーザ"user02"、"user03"を追加
```

### 3.9\. 共有用のフォルダ作成

フォルダを複数作成し、各フォルダにアクセス権限を付与することも可能ですが、今回は「share01」フォルダでファイルの共有をします。
mkdirコマンドでフォルダを作成後、chmodコマンドでフォルダのアクセス権を変更します。

```
> mkdir /home/share01 > chmod 770 /home/share01 > chgrp group-A /home/share01
```

### 3.10\. 設定ファイルの編集

Sambaへのアクセス制限や編集＆読み込み権限付与などの設定をしていきます。
不要な設定は削除してもいいですが、今回はコメントアウトしていきます。
記事の冒頭でも書きましたが、ファイルの編集にはvim以外でも構いません。

```
> vim /usr/local/samba/etc/smb.conf #======================= Global Settings ======================= [global] ## Browsing/Identification ### # Change this to the workgroup/NT-domain name your Samba server will part of # workgroup = MYGROUP ###コメントアウトする workgroup = WORKGROUP ###追記 dos charset = CP932 ###追記 unix charset = UTF-8 ###追記 #======================= Share Definitions ======================= # Un-comment the following (and tweak the other settings below to suit) # to enable the default home directory shares. This will share each # user's home directory as \\server\username ####### コメントアウト ####### #[homes] # comment = Home Directories # browseable = no # writable = yes ########################### ########### 追記 ########### [share01] Comment = share folder path = /home/share01 writable = yes guest ok = no valid users = @group-A ########################### ####### コメントアウト ####### #[printers] # comment = All Printers # path = /usr/spool/samba # browseable = no ## Set public = yes to allow user 'guest account' to print # guest ok = no # writable = no # printable = yes ###########################
```

設定ファイルに入力ミスや書き方が正しいかの確認をします。「Press enter to see a dump of your service definitions」と表示されれば問題ありません。そして、Enterキーを押すと、設定ファイルに記載されている内容が表示されます。

```
> /usr/local/samba/bin/testparm /usr/local/samba/etc/smb.conf Press enter to see a dump of your service definitions
```

### 3.11\. Samba 起動

設定が完了したところで、Sambaを起動していきます。
起動後は実際にプロセスが動いているか、psコマンドで確認していきます。以下のように「smbd」のプロセスが表示されることを確認します。

```
> /usr/local/samba/sbin/smbd -D > ps -e | grep smbd 77178 ? 00:00:00 smbd
```

smb.conf の内容を変更した際は以下のコマンドを実行し、設定ファイルを再読み込みします。

```
> /usr/local/samba/bin/smbcontrol smbd reload-config
```

Sambaを停止するには以下のコマンドを実行します。

```
> /usr/local/samba/bin/smbcontrol smbd shutdown
```

### 3.12\. ポート開放

ファイル鯖に接続するために特定のポート開放をします。
すでにSSH接続するためのTCPの22番ポートの開放をしている場合は「ufw allow proto tcp to 0.0.0.0/0 port 22」の実行は必要ありません。TCPの445番ポートを開放後に、「ufw reload」を実行し、ufwを再読み込みしてください。

```
> ufw allow proto tcp to 0.0.0.0/0 port 22 Rule added > ufw allow proto tcp to 0.0.0.0/0 port 445 Rule added > ufw enable Command may disrupt existing ssh connections. Proceed with operation (y|n)? y <-- Enter"y" Firewall is active and enabled on system startup > ufw status Status: active To Action From -- ------ ---- 22/tcp ALLOW Anywhere 445/tcp ALLOW Anywhere
```

## 4\. ファイル鯖に接続(Mac & Windows10)

* Mac の場合
    1. Finderを開く
    2. ⌘＋K を押下
    3. 接続先を「smb://ファイル鯖のIPアドレス/share01」を入力し、「接続」をクリック
    4. 以下の項目を入力し、「接続」をクリック
        * ユーザの種類：登録ユーザ
        * 名前：「user01」or「user02」or「user03」
        * パスワード：各Samba用ユーザを追加した際に登録したパスワード
    5. ネットワークドライブに接続できることを確認
* Windows10 の場合
    1. 左のサイドメニューから「PC」をクリック
    2. 上部のメニューから「コンピュータ」をクリック
    3. 「ネットワークドライブの割り当て」をクリック
    4. ドライブは未割当のドライブを選択、フォルダ名には「\\ipアドレス\share01」を入力し、完了をクリック
    5. ネットワークドライブに接続できることを確認

## 5\. 参考資料

* [Samba.org](https://www.samba.org/)
* [zlib Home Site](http://zlib.net/)
* [zlibのインストール - [Linux [Red Hatなど]/サーバー] ぺんたん ...](https://pentan.info/server/linux/zlib.html)