最近になって(記事を下書きのまま寝かせていたので結構前)部活の部員向けシステムを再構築したのでその時のメモをすこし。
うちの部活ではこれまで約1年間,LinuxのSambaを使ったファイルサーバを構築して部員同士のファイル共有を行っていました。学年やグループでフォルダ(ディレクトリ)を作成して読み取りや書き込みの権限を細かくグループ管理してきました。もちろんACLも使ってきました。
これまでのシステムはLinuxにユーザを追加し,その後Sambaにユーザを追加する方法をとってきました。これまではファイルサーバが主な用途であった為,問題はありませんでした。パスワード変更はUserminで行ってSambaのunix password syncもONにしてありました。
しかし,既存のシステムではユーザ管理が一括で行えない(OSとSambaでのユーザ管理)であるのと,ユーザ情報とサービスとの連携が行いにくいため新たなシステムを再構築することにしました。
環境
- 物理サーバ 2台
- CentOS6.6 32bit
OpenLDAPの構築
これまでのシステムの課題であったユーザ管理をLDAPサーバを使って一元化することにしました。LDAPソフトウェアはOSSであるOpenLDAPを利用しました。OpenLDAPに関する情報が日本語では少ないので以下の2冊の書籍やこのサイトの情報を参考にして構築しました。
- Samba+LDAPで ドメインコントローラーを 構築してみよう
- 入門LDAP/OpenLDAP ディレクトリサービス導入・運用ガイド
- プロのための Linuxシステム・ネットワーク管理技術 (Software Design plus)
インストールはソースコートをダウンロードして解凍後,コンパイルしてインストールしました。起動スクリプトは1冊目の本に掲載されているものを参考に作成しました。構築はスムーズに進んだのですが,途中で権限の設定に不備があったらしくエラーが出力されました。それをもとに設定ファイルであるslapd.confを編集してLDAPを再起動するも同じエラーが出力されてしまいます。このエラーで2週間近く費やしました。
調べて分かったことですが,slapd.confを編集後は一度slapd.dの中身を空にしてslaptestコマンドで再生成しなければならないとのことでした。一度,設定ファイルを書いた後は設定を変更することが無かったので気が付かなかったのかもしれません。(基本的なことなので知らずに構築していた自分が恥ずかしい。。)
[root@localhost:~]# mv /usr/local/etc/openldap/slapd.d/* /tmp/work01
[root@localhost:~]# slaptest -f /usr/local/etc/openldap/slapd.conf -F /usr/local/etc/openldap/slapd.d
ついでに,動作テストとLDAPの構造を確認する用にphpldapadminをインストールしてみました。
Sambaの構築とsmbldap-tools
これまではパッケージのSambaを導入していましたが,システム再構築に合わせてソースから再インストール(LDAPをコンパイルオプションに設定)することにしました。設定ファイルsmb.confを適当に60行くらい書いて一旦は終了。
次にLDAPとの連携設定。Sambaの日本語サイトからsmbldap-toolsをダウンロードして展開してインストール。nss_ldapとpam_ldapもここのサイトからダウンロードして展開してインストール。設定するファイルが似たような名前が多すぎて混乱します。samba設定にLDAPの設定項目を追加置くことも忘れずに。
nss_ldapの設定をauthconfigで設定しているサイトもありますが個人的には書いたほうが理解が深まるのでお勧めではあります。以下の設定ファイルを書き換えて設定を変更しました。各ファイルの役割は理解しておかないと混同します。
- /etc/openldap/ldap.conf
- /etc/nsswitch.conf
- /etc/ldap.conf
- /etc/pam.d/login
- /etc/pam.d/sshd
- /etc/smbldap-tools/smb.conf
- /etc/smbldap-tools/smb_bind.conf
smbldap-toolsは, smbldap-populateコマンドで細かい設定を対話型でやってくれるので楽でした。
パスワード変更システムの構築
パスワード変更システムを作るにあたって当初は、phpldappasswdを利用しようと考えていました。しかし、LDAPサーバのパスワードだけでなくSambaのsecret.tdbも同時に更新しないとSambaだけ古いパスワードのままになってしまうことに気が付きました。当初、考えていたphpldappasswdはSambaのパスワード変更には対応していない為、今回は導入を見送りました。
SambaとLDAPを同時変更するという点を考慮した結果、smbldap-toolsコマンドを自作プログラムから実行して変更することにしました。作成したプログラムはGithubにあります。
構築した後からSambaに対応していると思われるphp-smbldap-adduserというものを見つけました。フランス語なので翻訳する必要があります。
自作のツールにはログ機能が無いので今後、実装する必要があると思われます。パスワード変更ページのユーザ認証にはApacheのBasic認証をLDAP連携することで実装しました。LDAP連携はこのサイトを参考にしました。
apacheのユーザディレクトリ設定
大学の研究室や研究者プロフィールなどで見かけるyourdomain.jp/~USERの形式で個人ディレクトリを提供するべく/etc/httpd/conf.dの設定ファイルを変更しました。初期からディレクトリが存在するように/etc/skelにpublic_htmlを作成しておきます。USERディレクトリ内でphpとperl、ruby、pythonの動作環境を整えました。
Dokuwikiの設定
LDAPに対応しているWikiシステムを探したところDokuWikiがHitした。また、MediaWiki等でも同様に連携は可能である。しかし、その中でもDokuWikiはプラグインが豊富でありLDAP認証の情報を細かく設定できる。こうしたことからDokuWikiをインストールした。LDAPとの連携は公式サイトのドキュメントを読みながら設定したところ成功しました。
制限シェル(rbash)の構築
SSHで利用できるシェル環境が便利だと思い構築しました。システムに影響を与えない方法で実装するには、システムと切り離して自由度を維持するか、システム内部で利用範囲を制限をするかの2つが考えられました。今回はリソースとの関係で後者のタイプで構築しました。
bashの制限付きシェルrbashというものが使えることを知り、このサイトを見ながら構築しました。シェルで利用可能なコマンドはシンボリックリンクで全ユーザの参照先を揃えておくと管理しやすいです。ユーザの要望や利用状況に応じて利用可能なコマンドは増やしていけば良いかと思われます。
まとめ
- LDAPを利用することで認証情報に関して一元管理できる。
- サービスをLDAPと連携することでアカウント情報を個々で管理する手間がかからない。
- samba, dokuwiki, apache-basicはLDAPとの連携により統一の資格情報で利用可能になる。
コメントを残す