Samba 4.0.0が先月リリースされました。本日時点では4.0.1が最新です。
Samba 4.0は、WindowsのActive Directory機能(ドメインコントローラ)が搭載されたので、LinuxマシンでWindowsのドメインユーザーを管理することができるようになりました。
SambaでActive Directoryを立てるとうれしいこと
以前の日記に書いた、開発環境の構築とソフトウェアエンジニア考 - torutkの日記と関連しますが、複数の開発者が共同で作業するソフトウェア開発環境では、ユーザー管理(ユーザー認証)がネックになります。
ケーススタディとして、とある開発環境を想定します。そこでは、構成管理/不具合管理/ビルド環境/情報共有環境があるものとします。ツールとして、
- 各自使用するPC(Windows 7)
- Subversion(BazaarでもMercurialでも、Gitでもいいですが)
- Redmine(TracでもMantisでもいいですが)
- Jenkins
- 電子メール(サーバーはpostfix、メーラーはThunderbirdなど)
- ファイル共有(Samba)
- 試験用のサーバー(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数が増え、コストが数十万になってしまいます*2。Active 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がいくつか見つかりました。
- http://d.hatena.ne.jp/suddenkame/20120930/1349019011
- いろいろ修正したが、filesセクションの不整合が解消できず挫折
- http://pkgs.org/centos-6-rhel-6/centos-rhel-i386/samba4-4.0.0-23.alpha11.el6.i686.rpm.html
- 初期段階で躓きあきらめ
- http://www.sogo.nu/files/downloads/SOGo/RHEL6/x86_64/RPMS/
- ビルドが通った
ということで、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 $? }
Active Directoryの設定など
以下参考ドキュメントを参考に