ファイルサーバ構築

中丸

はじめに

Windowsネットワークの用語

CIFS/SMB

Windowsでは各種ネットワークサービスを提供するためにSMB(Server Message Block)というプロトコルを利用しています。このSMBはMicrosoft社独自のプロトコルで仕様も正式には公開されていませんでした。しかし現在ではSMBを拡張し、Windows以外でもWindowsネットワークを利用できるよう仕様を公開したCIFS(Common Internet File System)がリリースされており、SMBもCIFSに統合されています。Windows2000以降はこのCIFSを利用するのが主流になっています。

NetBIOS

Windowsネットワーク上でコンピュータ同士が通信を行う際に使用するインターフェイスのAPIです。アプリケーションはこのAPIに準拠したインターフェイスを呼び出すことで、各種ネットワークサービスを提供します。NetBIOS名はWindowsネットワーク上のコンピュータ名などを識別するためのユニークな名前です。また、同じワークグループ内で別々のマシンが同じNetBIOS名を使うことはできません。

Sambaとは?

SambaはCIFSを実装したUNIX系OS向けのサーバソフトウェアです。このSambaによって公開された共有リソースはWindowsのファイル共有機能を使って利用することができます。また、Sambaはオープンソースのソフトウェアとして開発され、無料で配布されています。

これらのSambaの機能を使ってUNIXとWindowsマシン間でファイルやプリンタを共有し、相互運用することができます。

本講義ではファイル共有を行える簡単なファイルサーバを構築します。

基本

Windowsネットワークにおけるファイルの共有

UNIXマシンは通常Windowsマシンを識別できず、また自分自身もWindowsマシンから識別されないため、
そのままではWindowsネットワークの共有には参加できません。

認証

UNIXマシンの共有リソースへの認証はSambaサーバが行います。そのため予めSambaサーバに共有を行うUNIXユーザを登録する必要があります。この時、UNIXのアカウント情報(ユーザ名、パスワード)とSamba利用ユーザの情報は同一でなければなりません。

libiconv

libiconvは、UNIX環境で文字コード変換を行うライブラリです。WindowsとUNIXではファイル名やディレクトリ名の表示に使用する文字コードが異なるので、Sambaはこのライブラリを利用した文字コードの変換も行います。しかしながら、このlibiconvのライブラリに含まれている変換テーブルには正確ではない部分があり、そのまま利用すると"~"などの文字が正しく変換されません。そこでこの変換テーブルを正しく修正するためのパッチを適当して利用することにします。

伝統的にWindows上で利用するファイル名やディレクトリ名の文字コードには、Shift-JIS (正確にはCP932)が利用されています。
しかし、Windows NT/2000/XPではCP932だけでなくUTF-8を利用することができます。よって、サーバの使用している文字コードがUTF-8であれば、CP932への変換を行わず、直接UTF-8で通信することも可能です。

smbdとnmbd

smbd

CIFS/SMBクライアントにファイル共有と印刷サービスを提供するサーバデーモン。

nmbd

NetBIOS ネームサービスとブラウジング機能を提供するサーバデーモン。

ポート

サービス名ポート番号tcp/udp
NetBios ネームサービス137udp
NetBios データグラムサービス138udp
NetBios セッションサービス139tcp
ダイレクトホスティング SMB サービス445tcp

Sambaの機能

ドメインコントローラ機能

Windows NTによって管理されるネットワーク(NTドメイン)で、ユーザやセキュリティに関する情報を管理し、ユーザ認証を行ないます。情報科学科ラボ教室で、どのマシンを使ってもWindowsへログオンが可能なのはドメインコントローラとして働いているSambaサーバでユーザ認証を行っているからです。

Samba 演習

演習の前に

皆さんが使用しているキューブマシンのMACアドレスを確認したいので、Sambaの演習の前に次の作業をやって貰います。(Sambaとは関係ありません)

wget http://192.168.1.2/chkhwaddr
chmod 700 chkhwaddr
./chkhwaddr

以上のようにコマンドを実行してもらえば、こちらで用意したサーバに皆さんのマシンのMACアドレスが送信されます。

ソースについて

UNIX系のOSのディレクトリ構造は、各々のディストリビューションでファイルやディレクトリ構造の違いによる混乱を防ぎ、互換性を保つためにFHS(Filesystem Hierarchy Standard)という標準仕様に基づいています。/usr/local/srcディレクトリはそのFHSに基づき、ソフトウェアのソースを置くためのディレクトリとして定義されています。よってソフトウェアをソースからインストール際にはこの/usr/local/srcディレクトリにソースを置いて、インストール作業を行うのがセオリーです。

Sambaのインストールをする前に

libiconvのインストールから確認作業までの一連の作業はrootで行います。

su -

libiconvのインストール

cd /usr/local/src
wget http://192.168.1.32/pub/source/libiconv-1.9.1.tar.gz
wget http://192.168.1.32/pub/source/libiconv-1.9.1-ja-patch-1.diff.gz
tar zxvf libiconv-1.9.1.tar.gz
zcat libiconv-1.9.1-ja-patch-1.diff.gz | patch -p0
cd libiconv-1.9.1
./configure --prefix=/usr/local/opt/libiconv
make
make install
echo "/usr/local/opt/libiconv/lib/" >> /etc/ld.so.conf

「 > 」は必ず2個つけてください。一つだけだと、既に設定されていたパスを消去してしまいます

ldconfig
/usr/local/opt/libiconv/bin/iconv -l | egrep -i '(-31j|-ms)'
EUC-JP-MS EUCJP-MS EUCJP-OPEN EUCJP-WIN
CP932 SJIS-OPEN SJIS-WIN WINDOWS-31J CSWINDOWS31J

Sambaのインストール

cd /usr/local/src
wget http://storage.cis.k.hosei.ac.jp/pub/source/samba-3.0.5.tar.gz
tar zxvf samba-3.0.5.tar.gz
cd samba-3.0.5/source/
   ~~~~~~~~~~~~~~~~~~
  展開したディレクトリの中のさらにsourceディレクトリに移動します。

./configure \
--with-libiconv=/usr/local/opt/libiconv/ \
--libdir=/etc/samba \
--with-configdir=/etc/samba/ \
--with-privatedir=/etc/samba/ \
--with-lockdir=/var/lib/samba \
--with-piddir=/var/run/ \
--with-swatdir=/usr/local/samba/swat \
--with-syslog \
--with-pam \
--with-pam_smbpass

configureの解説

Samba本体はデフォルトで/usr/local/sambaにインストールされるように設定されています。

ファイル場所
設定ファイル関連/etc/samba
キャッシュファイル/var/lib/samba
pidファイル/var/run
SWAT/usr/local/samba/swat
--with-syslog

syslogへの出力機能をサポートします。

--with-pam

PAM認証機構をサポートします。

--with-pam_smbpass

ほかのアプリケーションから利用可能なPAMモジュールを構築します。

コンパイル、インストールを行います。

make
make install

コマンドにパスを通す

通常FedoraCoreではrootユーザのログインシェルにbashが設定されています。
特に変更を行わなければこのbashを使って作業を行うので、bashの設定ファイルである.bashrcを設定します。

.bashrcはそのユーザが新しくシェルを作成する度に読み込まれ、設定されます。
.bash_profileもbashの設定ファイルですが、これはユーザがログインした時に一度だけ読み込まれ、設定されます。
getent passwd root
root:x:0:0:root:/root:/bin/bash
vi ~/.bashrc       <- ~(チルダ)は作業を行っているユーザのホームディレクトリを表します。
# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# Samba                                       <-
SAMBA_HOME=/usr/local/samba                   <- 
PATH=$PATH:$SAMBA_HOME/bin:$SAMBA_HOME/sbin   <- この3行を追加します
source ~/.bashrc

設定

Sambaの設定ファイルはsmb.confという名前で、各セクションごとに設定を行います。[ ] で囲った名前がそれぞれセクションの名前になります。

globalセクション

このセクション中のパラメータは、サーバ全体、 もしくは各セクションで項目が定義されていない時の 既定値として適用されます。同じ項目が他のセクションで定義されている時は、そちらが優先されます。NetBIOS名や所属するワークグループの設定を行う必須のセクションです。

homesセクション

クライアントがsmb.confファイルに存在しない共有に接続しようとすると、Sambaは [homes] セクションが定義されているかどうかを確認します。定義されている場合、その存在しない共有の共有名をUNIXのユーザ名とみなし、Sambaは登録されているユーザ名の中に、該当するユーザ名があるかどうか検索します。ユーザ名が見つかれば、SambaはクライアントをSambaサーバ上の自分のホームディレクトリに接続を試みているユーザとして扱います。

printersセクション

クライアントが smb.confファイルに存在しない共有に接続しようとして、その共有名がSambaサーバに登録されているユーザ名でもない場合に、Sambaはそれがプリンタ共有かどうかをチェックします。プリンタの設定ファイル(通常 /etc/printcap)を読み込んで、要求された共有名の定義が存在するかどうかを調べ、存在する場合はSamba はそのプリンタ名の共有を作成します。

本講義ではプリンタの共有は行わないのでprintersセクションの設定は行いません。

前準備

既にSambaがインストールしてある人は、/etc/samba以下にsmb.confがあると思いますが、その設定ファイルはコメントが多く編集し辛いので、既に置いてある設定ファイルの名前を変更しておいて、新しく設定ファイルを作ります。

ls /etc/samba/smb.conf

のコマンドで下のように表示される人は既にsmb.confが存在します。

/etc/samba/smb.conf
mv /etc/samba/smb.conf /etc/samba/smb.conf.default

smb.confの作成

vi /etc/samba/smb.conf
[global]
  netbios name=SERVER**      <- 「**」のところに自分のマシン番号を入れてください
  server string=Samba on %L
  workgroup=CUBEGROUP
  dos charset=CP932
  unix charset=UTF-8
  display charset=CP932
  security=user
  log level=1
  log file=/var/log/samba/%m.log
[homes]
  comment=%S's home directory
  browsable=no
  readonly=no
[Shared]
  comment=Shared Directory
  create mode=666
  path=/home/shared
  writeable=yes

globalセクション

netbios name

SambaサーバのNetBIOS名を設定します。本講義ではこちらで指定したNetBIOS名を設定してもらいます。(SERVER**)

server string

サーバの説明を記述します。Windowsからはコメントとして表示されます。%Lは環境変数(SambaサーバのNetBIOS名)です。

workgroup

所属するワークグループを設定します。本講義ではCUBEGROUPというワークグループに所属させます。

dos charset、unix charset、display charset

それぞれWindowsで使用する文字コード、UNIXで使用する文字コード、SWATで使用する文字コードを指定します。

security

クライアントがどのようにサーバの応答に応えるかを指定します。
security=userはクライアントが共有リソースにアクセスする際に、ユーザ名とパスワードを使ったログオンを必要とします。

log level、log file

保存するログのレベルと保存する場所を指定します。ログレベルが高いほどより詳細なログが残ります。%mはクライアントマシンのNetBIOS名をあらわす環境変数です。この変数を使うことで、クライアントマシン毎にログファイルを作成できます。

homesセクション

comment

コメントを記述します。%Sは環境変数(現在利用している共有の名前)です。

browsable

net viewコマンドやブラウズリスト中に表示される、利用可能な共有一覧に表示させるかどうかを指定します。(デフォルトはyes)

readonly

ファイルを読み取り専用で開くかどうかを指定します。(デフォルトはyes)

Sharedセクション

共有するリソースを定義し、設定を行います。

comment

homesに同じ

create mode

Samba経由で作成されたファイルのパーミッションはデフォルトのままだと744に設定されます。これを他のユーザもそのファイルを編集できるように666に変更します。

writeable

ファイルの書き込み、作成を可能にするかどうかを指定します。(デフォルトはno)

smb.confの確認(testparm)

Sambaにはsmb.confの内容が正しく書かれているかを確認するtestparmというコマンドがあります。

testparm

このコマンドを実行すると各セクションのチェックが行われ、内容が正しい場合は最後に、

Press enter to see a dump of your service definitions

と表示されます。

そしてEnterキーを押すとSambaサーバが認識する設定内容が出力されます。
ここでエラーが出た人はsmb.confの内容を確認してください。

パーミッションとログ保存用のディレクトリの作成

chmod 700 /etc/samba
chown -R root: /etc/samba
mkdir /var/log/samba
chmod 700 /var/log/samba

Sharedディレクトリの作成

mkdir /home/shared
chmod 777 /home/shared

起動スクリプト

cp /usr/local/src/samba-3.0.5/packaging/Fedora/smb.init /etc/init.d/smb
vi /etc/init.d/smb

まず41行目あたりにある「 RETVAL=0 」の前に次の2行を加えます

SMBDOPTIONS="-D"
~~~~~~~~~~~~~~~~
NMBDOPTIONS="-D"
~~~~~~~~~~~~~~~~
RETVAL=0

さらに47行目と、52行目で

daemon smbd $SMBDOPTIONS
    ↓
daemon /usr/local/samba/sbin/smbd $SMBDOPTIONS
daemon nmbd $NMBDOPTIONS
    ↓
daemon /usr/local/samba/sbin/nmbd $NMBDOPTIONS
chmod 755 /etc/init.d/smb
chkconfig --add smb

使い方は他の起動スクリプトと同様です。

/etc/init.d/smb start      <- 起動
/etc/init.d/smb restart    <- 再起動
/etc/init.d/smb stop       <- 停止

Sambaの起動

/etc/init.d/smb start

Sambaへのユーザの登録

smbpasswd -a ユーザ名
New SMB password:
Retype new SMB password:

ここで登録したユーザは/etc/samba/smbpasswdに保存されます。

smbpasswd -a ユーザ名   Sambaにユーザを登録する。
smbpasswd ユーザ名     Sambaに登録されているユーザのパスワードを変更する。
smbpasswd -x ユーザ名   Sambaに登録されているユーザを削除する。(UNIXのアカウントは削除されません。)

パスワードを変更する時はUNIXのアカウント情報と、Sambaに登録されているアカウント情報の両方を変更する必要があるので注意してください。

passwd ユーザ名
smbpasswd ユーザ名

Sambaのパスワードを変更する時は、この二つを両方行う事(ユーザ名は同一のもの)

Firewallの設定

# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended. 
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp --icmp-type any -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p udp -m udp --dport 137:138 -s 192.168.1.0/24 -j ACCEPT   <-
-A INPUT -p tcp -m tcp --dport 139 -s 192.168.1.0/24 -j ACCEPT     <-
-A INPUT -p tcp -m tcp --dport 445 -s 192.168.1.0/24 -j ACCEPT          <- この3行を追加します。
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
iptablesは上の行から順番にルールを適用していきます。よってある行でアクセスを拒否するように設定すると、
それより下の行でアクセスを許可するように設定してあってもそのルールが適用されません。順番に注意してルールを追加してください。

iptablesの再起動

/etc/init.d/iptables restart

確認作業

3.まで成功すれば、本日の演習は終了です。

UNIX側での作業

一般ユーザでホームディレクトリに適当なファイルを作ります。

su - 一般ユーザ名   <- 一般ユーザに変更
echo test > test.txt 

次はWindowsマシンを使った確認作業を行います。ここまでの作業が終わった人から順番に、机ごとに設置されているWindowsマシンで確認作業を行ってください。

Windows側での作業

デスクトップから

マイネットワーク -> ネットワーク全体 -> Microsoft Windows Network -> CUBEGROUP

と開くと各自のマシンがsmb.confで設定したNetBIOS名で表示されていると思います。

アクセスすると認証を求められるので、Sambaに登録したユーザ名とパスワードを入力してください。

画像のServer-ratはWindowsマシン自身、Literacy01、Literacy02はテスト用に構築したSambaサーバです。

次にホームディレクトリにアクセスし、UNIX側で作ったファイルを編集します。
画像ではratというユーザをSambaに登録したのでratというフォルダを開いてます。

編集は好きなように行って構いません。ここではSambaに登録したユーザのホームディレクトリにアクセスし、
ファイルの内容を変更し、保存できるということを確認できればOKです。

次にSharedフォルダにアクセスして、適当なファイルを作成して下さい。

UNIX側での作業

cd /home/shared
ls -al

上手くいかない時

症状 考えられる原因対処法
コンピュータの一覧に自分のサーバが表示されない smb.confの設定が間違っている可能性があります。/etc/samba/smb.confの設定を確認して(netbios name、workgroup辺りを中心に)、修正してください。修正したら必ずSambaを再起動してください。
サーバにアクセスしようとするとアクセスが拒否される Firewall(iptables)の設定が間違っている、もしくはSambaが正しく動作していない可能性があります/etc/sysconfig/iptablesの設定を確認し、修正してください。修正したら必ずiptablesを再起動してください。それでも上手くいかない場合は起動スクリプト(/etc/init.d/smb)も同様に確認、修正をしてSambaを再起動してください。
どうしても認証が通らない Sambaに登録しているユーザ名、もしくはパスワードがUNIXアカウントのユーザ名もしくはパスワードと異なっている可能性があります。登録されているユーザ名を確認して(cat /etc/samba/smbpasswd 等)ユーザ名が間違っている場合はsmbpasswdコマンドで登録しなおしてください。それでも認証が通らない場合は、パスワードを設定しなおしてみてください。
ファイルの名前が壊れている。 libiconvのインストールが正しく行われていない可能性があります。/etc/ld.so.confの中身を確認して(cat /etc/ld.so.conf等)/usr/local/opt/libiconv/libというパスが追加されているかどうか確認し、追加されていなければ追加してください。追加したら ldconfig コマンドを忘れずに実行してください。それでも直らない場合は、libiconvをインストールした/usr/local/opt/libiconv以下を削除して(rm /usr/local/opt/libiconv -rf)、パッチを適用するところからもう一度libiconvのインストールをやり直してみてください。
ホームディレクトリにあるファイルを編集できない smb.confの設定が間違っているか、そのファイルの所有者がroot等、異なるユーザになっている可能性があります。smb.confの設定の場合、read only、writeableの項目をよく確認してください。修正した後にはSambaの再起動を忘れずに行ってください。ファイルの所有者がSambaに登録されているユーザと異なっている場合は、「su - ユーザ名」でSambaに登録されているユーザに変更して、再度ファイルを作成してください。
sharedディレクトリに作成したファイルのパーミッションが設定した内容と異なる smb.confのSharedセクションの設定が間違っている可能性があります。smb.confでSharedセクションの項目「create mode」の項目を中心に設定を見直して、修正してください。修正後は必ずSambaを再起動してください。
エラーが発生した時はまずエラーメッセージをよく読み、ログを確認する等して原因を考えてみてください。
(今回の場合、ログは/var/log/samba以下に保存するようにしています。)

終わりに

今回の演習内容を実践することにより、将来研究室のメンバー同士でファイルを共有したり、各々のホームディレクトリにファイルを保存しておけたりする共有サービスを提供できると思います。また、より複雑な設定(容量制限、ACLの利用等)や他のソフトウェアとの連携はドキュメントを読んだりGoogleで他の運用例を検索する等をして、自分で調べてみてください。