コンテンツにスキップ

1. Sambaの基礎

1.1. Sambaの概念とアーキテクチャ

1.1.1. Sambaのバージョンと機能

Sambaとは

Microsoft Winodwsのファイル/プリンタ共有・認証機能をUnix/Linux OSに実装したOSSソフトウェアのこと。

Sambaサービスの実現にはSMB/CIFSプロトコルが利用される。

提供できる機能は以下の通り。

  • ファイルサーバ機能
  • プリントサーバ機能
  • WINSサーバ機能
  • ドメインコントローラ
  • ActiveDirectoryメンバーサーバ
  • Microsoftネットワーククライアント

Sambaのバージョン

Sambaには3.0系と4.0系がある。

機能 Samba3 Samba4
ドメインコントローラ NTドメインのドメインコントローラ構築ができる(NTMLv2の使用、WINSサーバによる名前解決、LDAP連携の可能) ADドメインのドメインコントローラ構築ができる(Keroberos認証、DNSによる名前解決、LDAP内蔵)
ファイルサーバ SMB2に対応 SMB2,SMB3に対応

Samba3.0系のデーモンプロセス

Samba3.0系のデーモンプロセスはsmbdnmbにより提供される。

  • smbd
    • ファイル/プリント共有とユーザ認証機能
    • ポート番号:139/TCP,445/TCP(SMB without NetBIOS)
  • nmbd
    • ブラウジング/NetBIOS名前解決機能
    • ポート番号:137/UDP,138/UDP
  • winbindd
    • Linuxアカウント/Windowsアカウントを統合的に扱う仕組み
    • ポート番号: 445/TCP

Samba4.0系のデーモンプロセス

Samba4.0系のデーモンプロセスは3.0系に加えて以下のプロセスが追加されている。

  • samba
    • ActiveDirectoryドメインコントローラ機能
      • Keroberos認証
        • ポート番号:88/TCP・UDP
      • LDAP
        • ポート番号:389/TCP・UDP,636/TCP
      • Global Catalog
        • ポート番号:3268/TCP,3269/TCP

1.2. Sambaの設定

1.2.1. Sambaの起動

Sambaのコマンドによる起動

Sambaの起動方法はSystemdのシステムでは以下の通り。

systemctl start smb.client
systemctl start nmb.service

SysVinitを採用したシステムでは以下の通り。

/etc/init.d/smb start

testparmコマンド

testparmコマンドはsmb.confにミスがないかチェックできるコマンド

testparm [オプション]
オプション 説明
-s 構文チェック後Enter押さなくてもsmb.conf内容を表示
-v 構文チェック後smb.confに記述されていない内容も表示

レジストリを使用した起動方法

設定ファイルを極力使用せずに、レジストリを使用して設定を行う方法がある。 この方法によるSambaのメリットは以下の通り。

  • Sambaサーバにログインせずにリモートで設定を行える
  • Sambaのデーモンの起動にかかる時間が短くなる。これはデーモンは必要なタイミングまでレジストリの設定データを読み込まないため。
  • 設定反映についてSambaのデーモンのリロードが不要になる

なお、レジストリベースのSamba設定とはWindowsのレジストリのような、階層を持つキーと値による設定形式のことであり、レジストリベースであっても設定自体は設定ファイル(バックエンド)に保存される。

1.2.2. smb.conf

Sambaサーバの設定はsmb.confファイルで行う。 なお、パッケージからインストールした場合は/etc/samba、ソースコードからインストールした場合は/usr/local/samba/etcディレクトリに格納される。

smb.confは全体設定、共有定義から構成される。

smb.confの構造は以下の通り。 コメントアウトは#;で可能。

# 全体設定
[global]
パラメータ名 = 値

# 共有定義
[homes]
パラメータ名 = 値

[printers]
パラメータ名 = 値

[セクション名1]
パラメータ名 = 値

[セクション名2]
パラメータ名 = 値
セクション 説明
global Samba全体設定
homes 各ユーザのホームディレクトリ
printes 共有プリンタの設定
共有名 指定した共有に適用される設定

なお各セクションの真偽値はyes/true/1,no/false/0が使用できる。

globalセクションの設定

globalセクションではsmaba全体の設定を行う。 なお変更後はsambaの再起動が必要となる。

主要な項目は以下の通り。

[global]
    # Sambaサーバが所属するワークグループ名もしくはドメイン名を指定する
    workgroup = ワークグループ名|ドメイン名

    # Sambaサーバの動作モードを指定する
    server role = 動作モード
    # サーバ動作モード
    # AUTO : securityパラメータの設定に従う(デフォルト)
    # STANDALONE : スタンドアロンのサーバ
    # MEMBER SERVER : ドメインのメンバーサーバ
    # CLASSIC PRIMARY DOMAIN CONTROLLER : NTドメインのプライマリーコントローラ(PDC)
    # CLASSIC BACKUP DOMAIN CONTROLLER : NTドメインのバックアップドメインコントローラ(BDC)
    # ACTIVE DIRECTORY DOMAIN CONTROLLER : Active Domainのドメインコントローラ

    # NetBios名の指定
    netbios name = NETBios名

    # サーバの名前や説明の指定
    server string = コメント

    # 接続を許可するホストの指定(記載されていないホストは接続拒否)
    hosts allow = ホスト

    # ファイル共有に使用するポート(プロトコル)の優先順位の設定
    smb ports = 445 139 # CIFS優先

    # Guestアカウントの定義(アカウントが存在しないユーザにGuestとしてアクセスさせれる)
    guest account = ゲストユーザ名

    # Sambaユーザとして認証できない際の動作の指定
    map to guest = Never | Bad User | Bad password
    # Never: ゲスト認証の否認
    # Bad User: 存在しないユーザの指定でゲスト認証とみなす
    # Bad Password: Bad Userに加えてパスワード入力ミスの場合もゲスト認証とみなす

    # ログファイルの指定(「%m」で接続元ホストごとにログを分けれる)
    log file = ログファイル名

    # ログファイルの最大サイズをKB単位で指定
    max log size = サイズ

    # SambaサーバのログをWindowsのイベントビューアから参照する機能
    eventlog list = イベントログ名

    # ハッシュ値を用いた暗号化パスワードの使用を設定
    encrypt passwords = Yes | No

    # パスワード認証をsmbpassword方式で行う場合のパスワードファイルの指定
    smb password file = パスワードファイルのパス

    # SambaのパスワードとLinuxのパスワードを同期させるかの設定
    unix password sync = Yes | No
    passwd program = パスワードコマンドのパス
    passwd chat = 期待させる文字列

    # UNIXユーザを別ユーザ名とマッピングさせる
    # 「UNIXユーザ名=Windowsマシンのユーザ名」のように記述
    username map = マッピングファイル名

    # ログオフ時に実行するスクリプトファイルの指定
    logon script = スクリプトファイル名

    # SambaサーバをWINSサーバとして動作させる場合にYesを設定
    wins support = Yes | No

    # WINSサーバのIPアドレスをIPアドレスを指定する
    wins server = IPアドレス

homesセクションの設定

homeセクションでは各ユーザのホームディレクトリを指定する。

[home]
    browseable = no     # homesをブラウザリストに表示しない
    valid users = %S    # 共有にアクセス可能なユーザを制限

printersセクションの設定

共有プリンタの設定

[printers]
    printable = yes | no # スプールフォルダへの印刷データ書き込み許可設定
    path = スプールディレクトリのパス

共有名セクションの設定

指定した共有に適用される設定(以下例ではshare)を指定する。

[share]
    # コメントの指定
    comment = コメント

    # ブラウジングしたときの表示設定
    browseable = Yes | No

    # 書き込みの許可設定
    writeable = Yes | No
    read only = No | Yes

    # 共有ディレクトリのパスを指定
    path = ディレクトリのパス

    # 読み取り不可能なリソースの設定
    hide unreadable = yes | no

    # 共有内に作成するファイル/ディレクトリの所有者/グループを強制的に変換
    force user = ユーザ名
    force group = グループ名

    # 書き込みが例外許可されるユーザ/グループの指定
    write list = ユーザ名 | @グループ名

    # 「.」で始まる名前のファイル/ディレクトリを表示しないように隠し属性の適用の指定
    hide dot files = Yes | No

    # 任意の名前のファイルやディレクトリを表示させたくない場合に指定。「/」で複数指定可能。
    veto files = /ファイル名/

    # 共有内にファイルやディレクトリを作成する場合のパーミッション設定
    ############ AND演算 ##########################
    # ファイルに適用可能なパーミッション(Default:0744)
    create mask = mode
    # ディレクトリに適用可能なパーミッション(Default:0755)
    directory mask = mode
    ############ OR演算 ###########################
    # 必ずファイルに適用されるパーミッション(Default:0000)
    force create mode = mode
    # 必ずディレクトリに適用されるパーミッション(Default:0000)
    force directory mode = mode
    ###############################################

    # アクセス可能ユーザの指定
    valid users = ユーザ名

    # Guestユーザのログイン許可の指定
    guest ok = Yes | No
    public = yes | No

1.2.3. Samba変数

Sambaの設定ファイルsmb.confでは変数を使用できる。 以下のようなものがある。

変数 説明
%D 現ユーザーが所属するドメイン/ワークグループ名
%L サーバのNetBIOS名
%m クライアントのNetBIOS名
%U サーバに接続しているユーザ名
%G %Uのプライマリグループ
%S ユーザが接続した共有名
%u 共有に接続しているユーザ名
%g %uのプライマリグループ
%H %uのホームディレクトリ

1.3. Sambaの通常メンテナンス

1.3.1. Sambaの制御

Sambaを制御するための手段として構成ファイルに設定を記述する方法(smb.confの編集)とプログラムにメッセージを送る方法(smbcontrolコマンド)がある。

smbcontrolコマンド

smbcontrolはSambaのプロセス(smbd、nmbd、winbindd)にメッセージを送って制御するためのプログラムのこと。

smbcontrol [destination] [message-type] [parameter]
# 例
smbcontrol smbd shutdown
  • [destination] ... メッセージの宛先を指定
    • smbd,nmbd,winbindd or allで指定
  • [message-type] ... プロセスに送るコマンド
    • shotdown:デーモン停止
    • reload-config:設定ファイルの再読み込み
    • dubug ログレベル:指定したログレベルに変更
    • debuglevel:デバックレベルを問い合わせて表示
  • [parameter] ... パラメータを必要とするコマンドの場合

smbstatusコマンド

Sambaサーバに接続しているクライアントの確認/サーバの稼働状況を確認できるコマンド。

共有に接続しているクライアントのユーザ名、グループ名、接続元IPアドレスとポートに加え、接続を受け付けたSambaのプロセスIDを表示する。

smbstatus

1.3.2. Sambaのログレベル

[global]セクションで使用されるログ設定に関わる主な設定項目は以下の通り。

項目 説明
log file = ファイル名 ログファイルを指定
log level = レベル ログレベルの指定
max log size = キロバイト ログファイルの最大サイズの指定
debug timestamp = yes/no ログファイルに時刻を出力するかどうか
dubug hires timestamp = yes/no ログファイル二秒単位以上の時刻を出力するか指定
debug pid = yes/no ログファイルにPIDを出力するかどうか
debug uid = yes/no ログファイルにUIDを出力するかどうか
eventlog list = イベントログ名 SambaサーバのログをWindosのイベントビューアから参照する機能

Samba3系からはクラスごとにログレベルを設定できる。 使用できる主なクラスは以下の通り。

  • all ... すべてのクラス(デフォルト)
  • tdb ... TDBに関するログ
  • smb ... SMBプロトコルのデバッグに関するログ
  • passdb ... パスワードデータベースに関するログ
  • auth ... 認証に関するログ
  • winbind ... Winbindに関するログ

例)ログレベルを、パスワードデータベース関連は3、認証関連は4、その他は1に設定する場合

log level = 1 passdb:3 auth:4

1.4. Sambaのトラブルシューティング

1.4.1. TDB(Trivial Datadase)

TDB(Trivial Datadase)はSamba3.0から使用可能になったバイナリ形式の簡易データベースで様々な情報が格納されている。

smb -bコマンド

smb -bコマンドはTDBのディレクトリを確認できるコマンド

出力内容は長いため、通常はgrepコマンドを使用して必要な設定を確認する。

smb -b

tdbbackupコマンド

TDBファイルの検査およびバックアップとリストアを行うコマンド

tdbbackup [-v] TDBファイル名

-vTDBファイルの検査と、問題がある場合はバックアップからリストアを行うオプション。

tdbdumpコマンド

TDBファイルの内容表示を行うコマンド。

tdbdump

tdbtoolコマンド

TDBファイルの対話的な管理を行うコマンド。

tdbtool

tdbrestoreコマンド

tdbバックアップからリストアするコマンド。

tdbrestore > <リストアファイル> <  <バックアップファイル>

1.4.2. TDBファイル

Sambaが使用するデータベースファイルにはsercret.tdbregistory.tdbがある。

secret.tdb

Sambaが認証情報(ユーザー名、パスワードなど)を格納するためのデータベースファイル。

Sambaサーバーがユーザー認証を行う際に使用される。 通常、このファイルには、ユーザーのパスワードハッシュやアクセス許可情報などが保存される。

具体的に保存されるデータは以下のものがある。

  • machine/domain (SID)
  • LDAPと共に使用される秘密パスワード
  • machine 秘密トークン

registory.tdb

Sambaサーバーの設定情報を格納するためのデータベース。 Windowsレジストリのように、Sambaサーバーの構成や設定を管理する。

例えば、共有フォルダの設定、ユーザーのアクセス権限、ネットワークのパラメータなどがこのファイルに保存される。

1.4.3. Sambaパスワードデータベースに問い合わせ

smbpasswdコマンド

Sambaのパスワードデータベースを管理するためのユーティリティ。 パスワードの設定、変更、削除などを行う際に使用する。

smbpasswd

pdbeditコマンド

Sambaのパスワードデータベースを直接操作するための高度なユーティリティ。 ユーザーアカウントの追加、削除、属性の変更など、より広範な管理作業が可能。

pdbedit
オプション 説明
-Lv 詳細の表示
-a ユーザの追加
-x ユーザの削除

1.4.4. LDAP

LDAPとは

LDAPはネットワーク機器やユーザーID、パスワードを管理するディレクトリサービスの維持やアクセスを行うプロトコルのこと。 堅く言うと、X.500をベースとしたディレクトリサービスに接続するために使用されるプロトコルでDAPを軽量化したものともいえる。

一般的にLDAPは一元管理の認証サーバを構築する際に使用される。 LDAPによりユーザやリソースに関する情報を検索したり管理することができる。

LDIF

LDIFはディレクトリ内の情報を記述するファイル形式のこと。 LDAPサーバにディレクトリ情報を登録、変更する場合に使用される。 記法は以下の通り。

dn: 識別名
属性名: 値
属性名: 値
   :    

LDIFファイルでは最初の行でエントリの識別名(DN)を記述する。 また、複数のエントリを記載する場合は空行で区切り、コメントは行頭に「#」をつける。

なお、属性値は通常UTF-8のテキストで記載するが、バイナリデータなどの特殊なデータを指定する場合は「属性名::属性値」のようにし、属性値にはBase64でエンコードした値を指定する。

ldbsearchコマンド

LDAPデータベース内のエントリーを検索するためのコマンド。 指定されたクエリやフィルタを使用して、LDAPディレクトリ内の情報を検索する。

例えば、ユーザーアカウントやグループ、機器などの情報を検索するために使用される。

ldbsearch
オプション 解説
-h 検索を行うLDAPサーバーのホストを指定します。
-b 検索のベースDNを指定します。
-s 検索のスコープを指定します。デフォルトはbaseで、oneまたはsubを指定できます。
-D バインドに使用するDNを指定します。
-W パスワードをプロンプトで入力するように求めます。

ldbmodifyコマンド

LDAPデータベース内のエントリーを変更するためのコマンド。

LDIFファイルを使用して、エントリーの属性を変更する。 これにより、ユーザーの属性の更新やグループメンバーシップの変更などが可能になる。

ldbmodify
オプション 解説
-h 変更を行うLDAPサーバーのホストを指定します。
-b 変更の対象となるエントリーのベースDNを指定します。
-D バインドに使用するDNを指定します。
-W パスワードをプロンプトで入力するように求めます。

ldbeditコマンド

インタラクティブな方法でLDAPエントリーを編集するためのコマンド。

エディタを介してエントリーの属性を直接編集できる。これは、手動でのエントリーの編集が必要な場合に使用される。

ldbedit
オプション 解説
-h エディットするLDAPサーバーのホストを指定します。
-b エディットの対象となるエントリーのベースDNを指定します。
-D バインドに使用するDNを指定します。
-W パスワードをプロンプトで入力するように求めます。

ldbaddコマンド

LDAPデータベースに新しいエントリーを追加するためのコマンド。

追加するエントリーの情報を含むLDIFファイルを使用する。ユーザーアカウントやグループ、機器などの新しいエントリーをLDAPディレクトリに追加する際に使用される。

ldbadd
オプション 解説
-h エディットするLDAPサーバーのホストを指定します。
-b エディットの対象となるエントリーのベースDNを指定します。
-D バインドに使用するDNを指定します。
-W パスワードをプロンプトで入力するように求めます。

ldbdelコマンド

LDAPデータベースからエントリーを削除するためのコマンド。

削除するエントリーのDNを指定して使用する。 ユーザーアカウントやグループの削除など、LDAPディレクトリからエントリーを削除する際に使用される。

ldbdel
オプション 解説
-h 削除を行うLDAPサーバーのホストを指定します。
-D バインドに使用するDNを指定します。
-W パスワードをプロンプトで入力するように求めます。