funini.com 自由研究 Samba

Samba

簡単に言うと、UnixマシンのディスクをWindowsから見れるようにするソフトです。 他にもWindowsのユーザー管理をUnixから出来るようにしたり、プリントサーバーになってみたり、
今回はとりあえず普通にディスク共有させて、さらにldapでユーザー管理してみます。OSはVine2.6です。

とりあえずSambaごっこ

とりあえず、aptから入れたsambaで、LDAPと繋がずに遊んでみます。 aptからsambaを入れて、コマンドラインからSAMBAユーザーの追加を行います。
smbpasswd kei
(パスワード設定)
その後、rootで
/etc/init.d/smbd start
として、サーバー側の準備は完了です。
windowsの「ファイル名を指定して実行」で、 \\(ホスト名かipアドレス)\(ユーザー名)として、ファイル一覧がエクスプローラから見れれば成功です。 なお、windows98/Meでは、ログインユーザー名がWindowsにログインしたユーザー名で固定されてしまっているようなので、 うまくいかないかもしれません。
実験が終わったら、aptから入れたsambaはさくっと消してしまいましょう。(vine2.6の場合。samba3.0以降が入るディストリビューションなら消さなくてもいいです)

インストール

まず、samba.orgからsamba-3.0.14a.tar.gzを落としてきて、
$ ./configure --with-automount --with-smbmount --with-pam \
--with-syslog --with-quotas --with-acl-support --with-ldap --with-ldapsam
$ make
としてコンパイル。
$ make install
でインストール。 /usr/local/sambaにインストールされます。
--with-ldapsamは古いsambaでldap対応させるときに使っていたオプションで今は不要のはずなんですが、 入れてみたらなんかうまくいきました。(これを入れるとldapがsmbpasswdより優先になるっぽい)
はじめはswatという設定ツールで設定するのが楽でしょう。swatはブラウザからSambaの設定ができるプログラムです。 /usr/local/samba/sbin/swatをinetdに登録すると使えます。ただ、ここではrootのパスワードも流すので、以下のように 通信経路の暗号化を行うのがよいでしょう。
うまくldapとつなげると、swatはユーザーのためのパスワード管理ツールとしても使えます。 (linux / samba /windows全部共通です)

Swatの暗号化

stunnelを用いて暗号化したかったのですが、なかなかうまくいきませんでした。 そこでvineのパッケージにあったstoneを使ってみたら…すごくあっさりいってしまって拍子抜け。
まず、swatを902番で立ち上げます。vine2.6の標準はinetdなので、以下のようにしました。
/etc/services
swat            902/tcp                         # Swat
/etc/services
swat    stream  tcp     nowait  root    /usr/local/samba/sbin/swat
設定後は/etc/init.d/inet restartです。 Redhat系列のvineでは
service inet restart
でもいいらしい。
そして、stoneでSSL化して、これを901に転送します。
/etc/stone.conf
-l -D -o 99 -g 99 -z key=/etc/stone.pem -z cert=/etc/stone.pem localhost:902 901/ssl
見てお分かりのとおり、これはそのままコマンドラインオプションになります。 つまり、コマンドラインで
# stone -l -D -o 99 -g 99 -z key=/etc/stone.pem -z cert=/etc/stone.pem localhost:902 901/ssl
としてもいいです。
あ、上で指定した鍵を前もって作らなければいけません。鍵は
# openssl req -new -x509 -days 365 -nodes -out stone.pem -keyout stone.pem
とすると、一年間有効な鍵が/etc/stone.pemに作成されます。 これであとはstoneをシステムサービスに登録します。 ntsysvで、stoneを常時起動するサービスにしましょう。
あとはブラウザで
https://[ホスト名]:901/
にアクセスすると、ログイン画面が出ます。ユーザー:root/ パスワード : [rootのパス]でやりたい放題モードになります。

smb.confの編集

Sambaとldapをつなぐ設定をします。設定ファイルは/usr/local/lib/smb.confを使いましょう。 これもswatからできるのですが、色んな設定を試すには直接編集の方が楽です。
僕の環境ではこんな感じにしました。
/usr/local/samba/lib/smb.conf
[global]
passdb backend  = ldapsam:ldap://127.0.0.1/
ldap admin dn    = cn=root,o=funini
ldap passwd sync = yes
ldap suffix      = o=funini
ldap user suffix = ou=People
ldap group suffix = ou=Group
ldap machine suffix = ou=Machine

security = user
load printers = no
log file = /usr/local/samba/var/log.%m
max log size = 50

[homes]
comment = Home Directories
browseable = no
writable = yes
ldap admin dnには、管理者のエントリを入れます。 エントリを入れたら当然パスワードが必要になりますが、これは
# smbpasswd -w パスワード
として格納します。 ここまで準備ができたら、swatからデーモンを立ち上げましょう。 「すべて起動」でいいと思います。

Samba-LDAP入れてユーザー管理

ここまでの操作で、もうLDAPとSambaの接続は完了のはずです。 でも、まだLDAPのデータベースが空っぽなので、使えません。 LDAPへの情報登録は先ほどのようにldifというテキストファイルを書いて、手動で入力してもいいのですが、 それではあまりに面倒です。
そこで、ユーザー管理ツールを使います。とりあえずsmbldap-toolsとwebminを上げておきます。 webminはブラウザからユーザー管理が出来るソフトで、多機能らしいです。 でも今回はコマンドラインから使えればいいので、もっとシンプルなsmbldap-toolsを使うことにしました。
smbldapはSambaとは別に開発されているツールで、コマンドラインから用います。 これを用いると、Sambaの認証に使えるようなLDAPのエントリを簡単に追加したり削除したりできるperlのスクリプトです。 普通のadduser / passwd / groupaddみたいなユーザー管理のコマンドと同じように動作し、しかも ここで作成したユーザーはUnixの認証にも、Sambaの認証にも使えます。Sambaをドメインコントローラーにすると、 Windowsの認証にも用いることができます。
なお、SambaがLDAPと情報をやり取りする時にはこのツールを用いません。あくまでもパスワード管理のためのツールです。
インストール
sambaのアーカイブにも含まれていますが、僕はsmbldap-toolsのサイトからsmbldap-tools-0.9.1.tgzを落としてきました。 アーカイブを解凍して、マニュアルと格闘しながらコピーしたり設定したりします。
まず、大量のperlライブラリを用いるらしいので、CPANというツールを使ってインストールします。CPANは、http://search.cpan.orgからcpanで検索してインストールします。 CPANのインストールが出来たら、
# cpan
cpan> install HOGE::FUGA
て感じでさくさくインストールできます。
smbldapに必要なモジュールは以下のとおりです。 (このリストはここからコピーしてきました) これら全てperlで書かれているのがすごいなぁ、て感じです。

さて、メインのスクリプトをコピーします。
# cp smbldap-* /usr/local/sbin
# cp smbldap_conf.pm /usr/local/sbin
# chmod 755 /usr/local/sbin/smbldap*
設定ファイルを/etc/smbldap-toolsに作ります。
# mkdir /etc/smbldap-tools
次に、ここに設定ファイルを書きます。テンプレートはアーカイブの中に入っています。
smbldap.confには、エントリに関する情報を書きます。
/etc/smbldap-tools/smbldap.conf
SID="S-1-5-21-..."
masterLDAP="127.0.0.1"
masterPort="389"
suffix="o=funini"
usersdn="ou=People,${suffix}"
computersdn="ou=Machine,${suffix}"
groupsdn="ou=Group,${suffix}"
userSmbHome="\\funini\%U"
userProfile="\\funini\profiles\%U"
userHomeDirectoryMode="700"
defaultUserGid="100"
smbldap_bind.confはLDAPサーバーにつなぐための設定です。
/etc/smbldap-tools/smbldap_bind.conf
masterDN="cn=root,o=funini"
masterPw="パスワード"
パスワードが見られないように、パーミッションを設定します。
# chmod 644 /etc/smbldap-tools/smbldap.conf
# chmod 600 /etc/smbldap-tools/smbldap_bind.conf
設定ができたら、/usr/local/sbin/smbldap_tools.pmにこれらの設定ファイルへのパスを設定しておきます。
my $smbldap_conf="/etc/smbldap-tools/smbldap.conf";
my $smbldap_bind_conf="/etc/smbldap-tools/smbldap_bind.conf";
これでインストールは完了です。
ユーザー管理
まずは、Windowsのいろんなユーザーを作ったり、基本になるオブジェクトを作ったりします。
# smbldap-populate
これで、いろんなエントリがLDAPに出来ます。 出来たエントリを確認するには、
# slapcat
とか、
# getent passwd
とかします。

一通りエントリが出来ているようなら、
# smbldap-useradd -a -m mei
# smbldap-passwd mei
などとしてユーザーを作成してみましょう。 このユーザーでログインが出来て、windowsから\\ホスト名\meiにアクセスが出来れば成功です。
試しに作ったユーザーを消すときには、
# smbldap-userdel mei
です。
さらに、実はswatの画面からログイン / sambaのパスワードが正しく変更できるようです。