torutkのブログ

ソフトウェア・エンジニアのブログ

Samba 4.0.1でActive Directoryを立てる試み

Samba 4.0.0が先月リリースされました。本日時点では4.0.1が最新です。
Samba 4.0は、WindowsActive Directory機能(ドメインコントローラ)が搭載されたので、LinuxマシンでWindowsドメインユーザーを管理することができるようになりました。

SambaでActive Directoryを立てるとうれしいこと

以前の日記に書いた、開発環境の構築とソフトウェアエンジニア考 - torutkの日記と関連しますが、複数の開発者が共同で作業するソフトウェア開発環境では、ユーザー管理(ユーザー認証)がネックになります。

ケーススタディとして、とある開発環境を想定します。そこでは、構成管理/不具合管理/ビルド環境/情報共有環境があるものとします。ツールとして、

  1. 各自使用するPC(Windows 7
  2. Subversion(BazaarでもMercurialでも、Gitでもいいですが)
  3. RedmineTracでもMantisでもいいですが)
  4. Jenkins
  5. 電子メール(サーバーはpostfixメーラーThunderbirdなど)
  6. ファイル共有(Samba)
  7. 試験用のサーバー(Windows ServerとLinuxとがある)

があったとします。

開発者は、自分のPCを立ち上げローカルのWindows 7にログインし(1個目の認証行為)、メーラーを立ち上げログインし(2個目の認証)、ネットワークドライブの接続にパスワードを入力し(3個目の認証)、最新のソースコードに更新するためSubversionにログインし(4個目の認証)、Webブラウザを立ち上げRedmineページを開きログインし(5個目の認証)、昨晩のビルド結果を見るためJenkinsにログインし(6個目の認証)、ビルド結果を展開するため試験用サーバーにログインし(7個目の認証)、といった具合になります。

開発者が数人でセキュリティが緩い組織であれば、それぞれのツールで個別にユーザーを作成して使ってもらってもいいのですが、共通アカウントなるものを作ってみんながそれを使う推奨できない環境になってしまいがちです。

また、開発者が100人規模になってきたり、セキュリティが厳しいので定期的にパスワードを変更するといった環境では、とてもじゃないですが対応しきれません。

なので、ユーザー認証の一元化は開発環境を(片手間で)構築する身にとっては悲願ともいえるものですが、いままでそこにたどり着けませんでした。耳学問としてLDAPは知ってますが、LDAPを立てることに過去幾度かトライして挫折してきた身には、そこまでたどり着ける力量がありません。

Windows以外の仕事はしない、かつ、開発インフラに予算が組まれている(Windows ServerやExchange、Sharepoint、TFSなどの費用/構築ができる)組織なら一元化できるかもしれませんが、プロジェクト毎に集散離合を繰り返すような現場ではそれも望めません*1

さて、Active Directoryは今まではWindows Serverを開発環境に導入する必要がありましたが、開発者が多数になると必要なCAL数が増え、コストが数十万になってしまいます*2Active DirectoryだけのためにWindows Serverを立ててこれだけの費用を出すのは・・・という状況でしたので、SambaでActive Directoryをサポートした意義は大きいと思います。

Windows OSのユーザー認証と各ツールの認証をActive Directoryに集約できればユーザー認証の一元化につながります。

CentOS 6でSamba 4.0を立ててみる

RHEL 6/CentOS 6の標準パッケージではSambaのバージョンは3.5.10です。
Samba 4.0が標準パッケージとして搭載されるのは次バージョン以降になるので、自分でビルドして入れることになります。

ソースを野良ビルド

Sambaの公式サイトからSamba 4.0のソースをダウンロードします。本日時点ではsamba-4.0.1.tar.gzでした。

野良ビルド手順でビルド&インストールします。とりあえず試しに動かす目的なので、configureオプションは一切省略としました。インストール先は簡単に削除できるようデフォルトの/usr/localではなく、/opt/samba4としました。

$ tar xzf samba-4.0.1.tar.gz
$ cd samba-4.0.1
$ ./configure --prefix=/opt/samba4
$ make
# make install
  • sambaの起動
# /opt/samba4/sbin/samba
#
  • sambaの終了
# killall samba
# rm -f /opt/samba4/var/run/samba.pid
#
RPMパッケージ作成

世の中で公開されているrhel6またはcentos6用のRPMを探し、そのソースRPMを入手します。ビルド対象ソースを4.0.1に差し替えて、必要な修正をしてビルドします。samba4 は、アルファ版、ベータ版、RC版あたりのRPMがいくつか見つかりました。

ということで、3番目のところからソースRPMを入手し、samba-4.0.1に差し替えてrpmbuildしました。

入手したsamba4-4.0.0beta5-4.centos6.1.src.rpmを作業ディレクトリに展開します。

$ rpm2cpio samba4-4.0.0beta5-4.centos6.1.src.rpm | cpio -i
...
$ ls
samba-4.0.0beta5.tar.gz       samba4.init  samba4.sysconfig
samba4-beta-ndr-fixes.diff    samba4.log
samba4-tdb_jenkins_hash.diff  samba4.spec
$

samba4.specファイルの修正は、バージョン番号、patchの削除です。

--- samba4.spec 2013-01-20 19:24:12.528633148 +0900
+++ /home/torutk/rpm/SPECS/samba4.spec    2013-01-20 21:45:02.855645033 +0900
@@ -1,9 +1,9 @@
-%define main_release 4
-%define samba4_version 4.0.0beta5
+%define main_release 1
+%define samba4_version 4.0.1

 %define tarball_name samba-%{samba4_version}

-%define samba4_release %{main_release}%{?dist}.1
+%define samba4_release %{main_release}%{?dist}

 %define waf_options --verbose -j 4
 # We need a higher talloc release to address previous releases done as
@@ -40,8 +40,6 @@
 Source1: %{name}.log
 Source4: %{name}.sysconfig
 Source5: %{name}.init
-Patch0: %{name}-tdb_jenkins_hash.diff
-Patch1: %{name}-beta-ndr-fixes.diff

 Requires(pre): /usr/sbin/groupadd

@@ -92,8 +90,6 @@

 %prep
 %setup -q -n %{tarball_name}
-%patch0 -p1
-%patch1 -p0

 # copy Red Hat specific scripts

samba4.initにも修正が必要です。起動するプロセス名をsmbdからsambaに変更する必要があります。詳細は次のURLにあります。

rpmbuild用ディレクトリツリーに必要なファイルを配置します。

$ cp samba4.spec ~/rpm/SPECS
$ cp samba4.{init,log,sysconfig} ~/rpm/SOURCES

rpmbuildを実行します。

$ rpmbuild -ba ~/rpm/SPECS/samba4.spec
...(小1時間くらい)
$ ls ~/rpm/RPMS/x86_64/
samba4-4.0.1-1.el6.x86_64.rpm  samba4-debuginfo-4.0.1-1.el6.x86_64.rpm
$

ビルドに必要なパッケージが不足しているとエラーになるので都度パッケージをyumインストールします。

生成されたrpmをインストールします。なお、rpmbuild時に必要だったパッケージが、生成されたrpmをインストールするときは邪魔になってエラーになってしまいました(libtalloc、libtdb)。いったんアンインストール(yum erase)してから生成されたrpmをインストールしました。
ビルドマシンと実行マシンは別にしたほうがよさそうです。

smb.conf

起動用のサービススクリプトは、/etc/samba4/smb.confがないとエラー終了してしまいます。
smb.confは、samba-toolでドメインコントローラ設定をすると生成されます。

# samba-tool domain provision
Realm: CYMRU.LOCAL
 Domain [CYMRU]:
 Server Role (dc, member, standalone) [dc]:
 DNS backend (SAMBA_INTERNAL, BIND9_FLATFILE, BIND9_DLZ, NONE) [SAMBA_INTERNAL]:
 DNS forwarder IP address (write 'none' to disable forwarding) [192.168.1.254]: 
Administrator password: P@ssWord
Retype password: 
...(以下略)
#

【追記】起動プロセス(Active Directory)として起動

Active Directoryドメインコントローラとして起動するときは、smbdプロセスではなく、sambaプロセスを起動します。
上述のRPMでは、/etc/init.d/samba4 にsmbdプロセスを起動するよう記述されるので、そこをsambaに修正する必要があります。

  • /etc/init.d/samba4
--- samba4.1    2013-02-11 19:27:28.000000000 +0900
+++ samba4      2013-02-11 20:57:11.427324176 +0900
@@ -39,7 +39,7 @@

 start() {
        echo -n $"Starting Samba services: "
-       daemon smbd $SMBDOPTIONS
+       daemon samba $SMBDOPTIONS
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$SAMBA_NAME || \
@@ -49,7 +49,7 @@

 stop() {
        echo -n $"Shutting down Samba services: "
-       killproc smbd
+       killproc samba
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$SAMBA_NAME
@@ -63,14 +63,14 @@

 reload() {
         echo -n $"Reloading smb.conf file: "
-       killproc smbd -HUP
+       killproc samba -HUP
        RETVAL=$?
        echo
        return $RETVAL
 }

 rhstatus() {
-       status smbd
+       status samba
        return $?
 }

*1:Windows一色を望んでいるわけではありません。

*2:1CAL 4-5千円として40-50万円。