【2023年6月版】Sambaメモ

# はじめに

Samba関連のメモ

# 前提条件

Ubuntu22.04 上での Samba の構築メモ
たぶん、UNIXの Samba ならだいたい一緒

# 単語

- NetBIOS
- WINS
- CIFS
- ファイルサーバ
- プリントサーバ
- WINSサーバ
- ドメインコントローラー
- Active Directory
- メンバーサーバ
- Microsoft ネットワーククライアント
- ブラウジング
- ブラウザマスタ
    - ブラウザマスタは、ネットワーク上の他のマシン（ワークステーションやサーバなど）が共有を見つけるために参照する、共有とサービスのリストを保持するマシン
    - ローカルマスターブラウザは、サブネットワーク内のすべてのマシンを知り、ドメインマスターブラウザと情報を交換する

# インストール

```terminal
$ sudo apt install samba
```

# サービス

```
$ sudo systemctl status smbd
$ sudo systemctl status nmbd
$ sudo systemctl status winbindd
```

# ポート

- 137/UDP
    - NetBIOS 名前解決、ブラウジング
- 138/UDP
    - NetBIOS 名前解決、ドメインログオン
- 139/TCP
    - ファイル共有
- 445/TCP
    - ファイル共有


# 設定

読み込まれるファイル

```terminal
$ cat /etc/samba/smb.conf
```

元のファイル

```terminal
$ cat /usr/share/samba/smb.conf
```

## smb.conf の記述
### [global]
全体設定、予約されている
- workgroup = ワークグループ名 or ドメイン名
- server role = 動作モード
    - AUTO
        - securityパラメータの設定に従う
    - STANDALONE
        - スタンドアローンのサーバ
    - MEMBER SERVER
        - ドメインのメンバサーバ
    - CLASSIC PRIMARY DOMAIN CONTROLLER
        - NTドメインのプライマリドメインコントローラ、PDC
    - CLASSIC BACKUP DOMAIN CONTROLLER
        - NTドメインのバックアップドメインコントローラ、BDC
    - ACTIVE DIRECTORY DOMAIN CONTROLLER
        - Active Directory のドメインコントローラ
- netbios name = NetBIOS名
- server string = サーバのコメント
- hosts allow = 接続許可ホスト
- hosts deny = 接続不許可ホスト
- guest account = ゲストユーザ名
- map to guest = Never or Bad User or Bad Password
- log file = ログファイル名
- max log size = ログファイルの最大サイズ、KB指定、0は制限なし
- encrypt password = Yes or No
- smb passwrd file = パスワード認証を smbpasswd 方式で行う場合の、パスワードファイルのパス
- unix password sync = Yes | No 
    - Yes にすると、Sambaパスワードの変更時にLinuxユーザのパスワードも同時に変更される
- passwd program = パスワードコマンドのパス、通常は passwd
- passwd chat = パスワード変更プロセス中に期待するプロンプトと応答
    - デフォルト値は、 `passwd chat = *New*UNIX*password* %n\n *ReType*new*UNIX*password* %n\n *passwd:*all*authentication*tokens*updated*successfully*`
- username map = マッピングファイル名 (/etc/samba/smbusers)
    - ファイルは、Linuxユーザ名 = Windowsのユーザ名（複数可） の形式で記述
        ```/etc/samba/smbusers
        john = John
        smith = "John Smith"
        taro = "大阪太郎"
        root = admin administrator
        ```
- logon script = スクリプトファイル名
    - WindowsクライアントがSambaサーバーにログインした時に実行するスクリプト
    - スクリプトは、通常、netlogon共有を作成して配置する
    - 以下は、logon script = logon.bat に設定する例
        ```/etc/samba/smb.conf
        [global]
        logon script = logon.bat
          :
          :
        [netlogon]
           comment = Network Logon Service
           path = /export/smb_share/netlogon
           guest ok = yes
           read only = yes
          :
          :
        [shared]
          :
          :
        ```
        ```/export/smb_share/netlogon/logon.bat
        @echo off
        net use s: \\SAMBA-SERVER\shared
        ```
- wins support = Yes or No
- wins server = WINSサーバのIPアドレス
- local master = Yes or No
    - ローカルマスターブラウザとして機能するかどうか
- os level = 優先度(0-255)
    - マスターブラウザとして選ばれる優先度
    - 値が高いほど、Sambaサーバがブラウザマスターに選ばれる可能性が高くなる
    - os level の値だけがブラウザマスターの選出に影響するわけではなく、マシンの種類（例えば、PDC（Primary Domain Controller）はBDC（Backup Domain Controller）やメンバーサーバよりも優先される）、起動時間（より長く稼働しているマシンが優先される）、同じ os level の場合はアルファベット順に優先される
    - Windows 9X = 1、ドメインコントローラー以外のWindows = 16、ドメインコントローラー = 32
- domain master = Yes or No
- preferred master = Yes or No or Auto
- security = USER or SHARE or DOMAIN or ADS
    - USER
        - クライアントは自身のユーザー名とパスワードを提供し、その資格情報はサーバー上の対応するユーザーとパスワードにより認証される
        - デフォルトのモード
    - SHARE
        - 接続先の共有自体に対してパスワードが設定される
        - 各共有には独自のパスワードが存在し、それを知っているクライアントだけが接続できる
        - このモードは古く、非推奨
    - DOMAIN
        - Windowsドメインコントローラーに対してユーザー認証を委譲する。ユーザーはドメインコントローラーに登録された資格情報を使用して認証を行う
        - 既存のWindowsドメインにSambaサーバーを統合する際に利用
    - ADS
        - Active Directoryサービスとの統合
        - Active Directoryドメインのメンバーサーバとして機能し、Kerberosを使用して認証を行う
- passdb backend = smbpasswd or tdbsam or ldapsam
    - smbpasswd
        - テキスト形式のファイルにユーザ情報を保存する
        - `/etc/samba/smbpasswd`
    - tdbsam
        - Trivial Database
        - Samba のデフォルト形式
        - バイナリ形式のデータベースファイルにユーザ情報を保存する
        - `/etc/samba/passdb.tdb`
        - 記述は、`passdb backend = tdbsam:/etc/samba/passdb.tdb`
    - ldapsam
        - LDAPディレクトリサービスを使用してパスワードを管理
        - Active Directory との連携で使用
    - 複数指定
        - `passdb backend = tdbsam:/etc/samba/passdb.tdb,smbpasswd` のように複数を指定可能
        
### [global]　以外で、共通の定義
- comment = 共有のコメント
- browseable = Yes or No
- writable = Yes or No
- read only = Yes or No
- path = ディレクトリのパス
- force user = ユーザ名
    - 共有内に作成するファイルやディレクトリの所有者を、強制的に指定
- force group = グループ名
    - 共有内に作成するファイルやディレクトリの所有グループを、強制的に指定
- write list = ユーザ名 or @グループ名
    - writable = No or read only = Yes のとき、例外で書き込みができるユーザ、グループ名
    - 複数の場合は、スペースで区切って記述
- hide dot file = Yes or No
    - `.` が先頭につくファイルを隠すかどうか
    - 隠すだけでアクセスはできるので注意、アクセス制限は acl で行う
- hide files = /ファイル名/
    - 隠すファイルを指定
    - '/' で区切ってファイルとディレクトリを複数指定可能、? や * のワイルドカードを指定することも可能
    - 隠すだけでアクセスはできるので注意、アクセス制限は acl で行う
- veto files = /ファイル名/
    - 表示も、アクセスもさせたくないファイルとディレクトリを指定
    - '/' で区切ってファイルとディレクトリを複数指定可能、? や * のワイルドカードを指定することも可能
- create mask = ファイルに適用可能なパーミッション、デフォルトは `0744`、論理積(AND)される
- directory mask = ディレクトリに適用可能なパーミッション、デフォルトは `0755`、論理積(AND)される
- force create mode = 必ずファイルに適用されるパーミッション、デフォルトは `0000`、論理和(OR)される
- force directory mode = 必ずディレクトリに適用されるパーミッション、デフォルトは `0000`、論理和(OR)される
- valid users = ユーザ名 or @グループ名
    - 複数の場合は、スペースで区切って記述
- guest ok = Yes or No
- public = Yes or No
    
### [homes]
ユーザーごとにホームディレクトリの共有を自動的に作成するための特別な設定、予約されている

### [printers]
プリンタ共有の設定、予約されている
- print ok = Yes or No
- pritable = Yes or No
### [セクション名]
共有フォルダや共有プリンタなどファイル共有設定、[]内の文字列が共有名となる
共有名の末尾が$の共有は、ブラウズしても見えない隠し共有となる、browseable = No と同様
- shared の設定例
    ```/etc/samba/smb.conf
      :
      :
    [shared]
       comment = ubuntu22.04 share
       path = /export/smb_share
       available = yes
       read only = no
       browsable = yes
       public = yes
       writable = yes
       guest ok = yes
      :
      :
    ```
## 設定ファイルの検証

```terminal
$ testparm
```

# ユーザ管理

## pdbedit
- ユーザ一覧
    - `pdbedit -L`
- ユーザ追加
    - `pdbedit -a NEW_USER`
    - linux のユーザを追加するわけではない、linuxのユーザとsambaのユーザを関連付ける
- ユーザ削除
    - `pdbedit -x DELETE_USER`   
    - linux のユーザが削除されるわけではない、linuxのユーザとsambaのユーザの関連付けを削除する
## smbpasswd
- ユーザ削除
    - `smbpasswd -x DELETE_USER`
    - linux のユーザが削除されるわけではない、linuxのユーザとsambaのユーザの関連付けを削除する
- ユーザの無効化
    - `smbpasswd -d DISABLE_USER`
    - linux のユーザが無効化されるわけではない、sambaのユーザが無効化される
- ユーザの有効化
    - `smbpasswd -e ENABLE_USER`
    - linux のユーザが有効化されるわけではない、sambaのユーザが有効化される

# コントロール
## smbcontrol
- `smbcontrol 宛先 コマンド` の形式
- 宛先は、smbd or nmbd or winbindd or プロセスID or all
- コマンド
    - debug
        - デバッグレベルを設定
    - ping
        - デーモンが動作しているかを確認
    - profile
        - プロファイリングデータを取得または設定
    - shutdown
        - デーモンを終了
    - reload-config
        - デーモンに設定の再読み込みを指示
## smbstatus
- Sambaの現在の状態と、現在の接続状況を表示

## samba-tool
- dns
    - DNS管理
- domain
    - ドメイン管理
- testparm
    - 設定ファイルの検証
- user
    - ユーザ管理
## nmblookup
- 後日
# smbclient
- SMBサーバと接続
SMBサーバが `192.168.100.100` ユーザ名/パスワードが `smbuser/smbpassword` の場合
```terminal
$ smbclient --user smbuser //192.168.100.100/share smbpassword
```
- MOUNTする場合(/mnt/smbにマウント)
```
# mount -t cifs //192.168.100.100/share /mnt/smb -o user=smbuser
```
# acl
- 後日
# net
- 後日

# さいごに

かんたんでしたね

# 参考リンク

[Samba公式](https://www.samba.org/)
[日本Sambaユーザ会](http://wiki.samba.gr.jp/mediawiki/index.php/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8)