月別アーカイブ: 2018年1月

NISの環境からLDAPへの移行

今まで研究室のアカウント管理はNISで行っていましたが,やはり様々なサービスを一元管理できるLDAPの方が良いのではないかということで,LDAPに移行することにしました.研究室内のドキュメントはCrowiで管理しているためマークダウンで記述可能であり,ブログにそのまま投稿できます.そこでこちらのブログにも備忘録として残しておこうと思います.

LDAPの仕組み

NISとくらべてLDAPは様々なことが出来ますが,その代わり比較的複雑です.そこで簡単にですがLDAPを俯瞰することから始めてみようと思います.

基本的な考え方

LDAP (Lightweight Directory Access Protocol)とはディレクトリのように階層構造をなした,データベースのようなものです.一般的なデータベースと言えばSQLなどを指しますが,階層構造があるという点が大きく異なります.わかりやすく説明するのが難しいのですが,素晴らしい参考資料がネットの海に漂っていましたので,ここに挙げておきます.
LDAPの基礎知識
20070423odagiri2.pdf

一応簡単に説明すると,エントリーと呼ばれるノードが階層構造をなして木構造的になったようなものがLDAPで扱うデータです.

上の図では,comが一番根本のエントリーで,そこからpeopleまで枝が伸びています.これをlinux的なディレクトリ構造では/com/test/www/peopleと表現することになるわけですが,LDAPではou=people,dc=www,dc=test,dc=comという長ったらしい表現で表します.ここでouとかdcは属性と言って,それが一体どんなエントリーであるか(linuxで言えばどんなデータが入ったディレクトリなのか)を説明し,イコールで結ばれた右辺はその値(属性値)を表します.属性には主に次のような種類があります.

属性名 属性表記 意味
cn common name 人やモノの名前など
dc domain component ドメイン名
ou organization unit name 組織単位
o organization 組織名

したがって,ou=people,dc=www,dc=test,dc=comは,dc=www,dc=test,dc=comというドメイン配下のpeopleという組織単位のエントリーであるということを意味します.例えばpeopleにTanakaという人を追加したいときには,uid=Tanaka,ou=people,dc=www,dc=test,dc=comというエントリーを作成すれば良いわけです.また,エントリーは木構造をなしているので,枝分かれをしてもかまいません.例えば,dc=www,dc=test,dc=comだけでなく,dc=mail,dc=test,dc=comというドメインを同時に作ることが出来ます.この場合は,どちらもdc=test,dc=comの下に作成されることになります.

ドメインはあたかもネットワークのFQDNのような形をしていますが(例えばこの場合,www.test.com),必ずしも現実のFQDNに従う必要はありません(おそらく).単にそういう習慣付けが行われているだけだと思います.

ある団体があって,それがdc=www,dc=test,dc=com以下にエントリーとしてデータを持っている場合を考えましょう.このとき,例えば組織内のグループを表現するエントリーou=Group,dc=www,dc=test,dc=comの配下にあるkame_sann_teamにアクセスするためには,cn=kame_sann_team,ou=Group,dc=www,dc=test,dc=comと書かなければなりません.これがまた別のグループにアクセスする場合も同様に,ドメイン名dc=www,dc=test,dc=comをつけて表現しなければいけないわけです.これは使用するエントリーの基準(すなわちdc=www,dc=test,dc=com)が決まっているのなら冗長です.できればlinuxで言うところのカレントディレクトリからの相対アドレスのようにエントリーを表現できると嬉しいわけですが,当然LDAPにもそのような仕組みが備わっています.LDAPに於けるカレントディレクトリはベースサフィックスと呼ばれ,そこから相対的なエントリーをrdn (relative distinguish name)によって指定します.例えば,ベースサフィックスがdc=www,dc=test,dc=comで,rdnがou=peopleであれば,ou=people,dc=www,dc=test,dc=comを表現していることになります.

さてここでは,ベースサフィックスがdc=www,dc=test,dc=comのときに,rdnとしてuid=Tanaka,ou=peopleというエントリーがあった場合を考えましょう.LDAPはNISの代わりとして使用できるので,このuid=Tanaka,ou=peopleはlinuxのアカウント情報を内包することもできるはずです.linuxにログインするために必要な情報はいくつかありますが,ここではログインシェルの情報を例にとってどのように格納されるを説明します.

先程も言いましたが,それぞれのエントリーはディレクトリのようなものを表しています.したがって各ディレクにおけるファイルのようなものがあります.LDAPに於けるファイルとは,属性と属性値の組を指します.ここでややこしいのは,すでに出てきているou=peopleなども属性と属性値の組であるという点です.普通のLinuxのディレクトリ構造ではディレクトリとその中身が同一であるということはありえません.しかし,LDAPでは各ディレクトリの識別子としてディレクトリ内の要素が使用されるのです.

正しい理解のためにこれらは次のように説明できます.

図に示した通り,一番下のエントリ(ここではTanakaと書かれたやつ)は複数の属性と属性値を持ちますが,この内,識別子(dn:distinguish name)として使用されるのは,cn=Tanakaとなります.これはlinuxのユーザ管理では同じ名前のユーザ名が存在してはいけないということを考えれば非常に合理的であることがわかります.ここでdnとしてloginShellを使用してしまっては,同じシェルを使ってる人どうして区別できなくなり困ることが予想されます.

さて,各エントリーは属性と属性値を持つことはすでに説明しましたが,実際に使える属性にはどのようなものがあるのかはまだ説明していませんでした.LDAPでは,エントリーに割り当てることがかのうな属性は決まっており,ユーザが自由に決めることは出来ません.使える属性はエントリーに与えるobjectClassによって指定されます.objectClassはSQLなどにおけるスキーマを表しますが,LDAPの特徴としてobjectClass自体も属性として表現されます.例えば,先程cn=Tanaka,ou=peopleにはloginShellという属性がありましたが,これはデフォルトでは使用できません.cn=Tanaka,ou=peopleのエントリーのobjectClass属性に属性値としてposixAccountを指定する必要があります.これは裏を返せば,linuxのアカウント情報を表現する属性が一意に定まることになるので,LDAPによって認証する側にとっても都合がいい事が分かります.

使い方

すでに説明したとおり,結局はエントリーの属性値を追加したり変更することがLDAPにおける処理の殆どになります.ldapにはエントリーについて記述したldifというファイルを元にデータベースの編集を行います.例えば,ou=People,dc=www,dc=test,dc=comにuid=tanakaを追加したい場合には次のような内容のldifファイル作ります.

一番上のdnは識別子を表します.これは追加したいエントリーの名前を表しているわけです.またその後uid: tanakaからhomeDirectory: /home/tanakaまでの行は,エントリーの中身(各属性とその属性値)を表しています.見ればだいたい何を表しているかわかると思いますが,userPasswordだけは不思議な記号になっており,パスワードのようには見えません.これは元のパスワードがわからないようにハッシュ化されているためです.このようなldifファイルを作成してあとは,

とすればtanakaというユーザを追加できます.ここで,test.ldifは先ほど作成したldifファイルを表しています.あと,まだ説明していませんでしたが,LDAPには管理用ユーザが存在します.この管理用ユーザもLDAPによって管理され,ここではcn=admin,dc=www,dc=test,dc=comというエントリーで表されています(-Dオプションの引数).LDAPのデータベースを自由に改変できては困るので,この管理用ユーザを介してエントリの変更を行うことが決まっています.

NISからの移行方法(サーバ編)

LDAPからNISへの移行方法を説明します.ここではOSはdebianとし,すでに運用しているNISが存在しているとします.ここで説明する方法はローカルのユーザ(/etc/passwd)の情報を用いても同様に使えるので,特別NISに限った方法ではないことを断っておきます.

まず必要なパッケージをインストールします.

すると色々聞かれますが,とりあえず今ここでちゃんと設定してもしょうがないので,エンターを連打します.質問をやり過ごしたら,

で編集画面に入り,

を追加してください.ここで,BASEのところは上で説明したベースサフィックスになります.自分の設定したいようにドメインを指定してください.URIのところは自分のipアドレスを指定する必要があります.ネットワークのドメイン名でもいいですが,名前解決が正常に行われてるのかどうか確認するのがめんどくさいのでipのほうが楽です.

次に

とします.すると色々聞かれるのでここ適切に答えます.
– OpenLDAPサーバの設定を省略しますか? → いいえ
– DNSドメイン名は? → ドメイン名を入力
– 組織名は? → これはベースdnの属性oの属性値になります
– 管理者用パスワード → 適当に決めてください
– 利用するデータベース → なんでも大丈夫です
– slapdをパージ(削除)した時に,データベースも消しますか? → はい(残す意味はあんまりない気がする)
– 古いデータベースを残しますか? → お好きで
– LDAPのv2を使いますか? → 古いマシンがあれば「はい」.一新するなら「いいえ」

以上で,LDAPの下地は出来たはずです.つぎに,linuxのユーザを管理するためのou=People,dc=www,dc=test,dc=com(dc=www,dc=test,dc=comは自分のさっき設定したやつに合わせて)とグループ用のou=Group,dc=www,dc=test,dc=comを作ります.そのために次のbase.ldifを作成します.

これを

で適用します.この時,LDAPのパスワードを聞かれますが,これは先程のLDAP用の管理者パスワードになります.またcn=admin,dc=www,dc=test,dc=comはdpkg-reconfigureのときに,自動で作られています.

次に,NISのユーザとgroupからldifを作る必要があります.ただしこれは数が膨大で大変です.そこで,自動生成するためのツールであるmigrationtoolsを使います.そのために

として,

の部分を

に変更してください.その後は,

としてください.すると/tmp/ldap_workにpasswd.ldifとgroup.ldifが作成されるはずです.ここで,sudoがないとパスワードがちゃんと書き込まれないので注意してください(/etc/shadowや/etc/gshadowがルート権限がないとアクセス出来ないため).あとは,これらを先程と同様に

で適用すれば終わりです.

NISからの移行方法(クライアント編)

まず必要なパッケージをインストールします.

すると色々聞かれますが,とりあえず今回は無視して適当にエンターを連打してください.これは,初回のインストール時での質問ではうまく設定してくれないという既知の問題があるため,エンターを連打してやり過ごします.二回目以降ではうまくいくことがわかっているので

を実行して,もう一度質問してもらいます.以下のように答えてください.
– LDAPサーバのURI: ldap://サーバのIPアドレス
– 検索ベースの識別名: dc=www,dc=test,dc=com
– LDAPプロトコルのバージョン: さっきサーバで指定したやつ
– LDAPデータベースはログインを必要としますか?:いいえ
– rootへの特別なLDAP権限?:はい
– オーナのみ設定ファイルの読み書きができるようにしますか?:はい
– rootのLDAPアカウント:cn=admin,dc=www,dc=test,dc=com
– 管理用パスワード:さっき設定したパスワード
– LDAPサーバのURI: ldap://サーバのIPアドレス
– 検索ベースの識別名: dc=www,dc=test,dc=com
– LDAPプロトコルのバージョン: さっきサーバで指定したやつ
– LDAP管理アカウントがローカルのrootのように振る舞うことを許しますか?:はい
– LDAPデータベースはログインを必要としますか?:いいえ
– rootのLDAPアカウント:cn=admin,dc=www,dc=test,dc=com
– 管理用パスワード:さっき設定したパスワード
– 使用するハッシュ:crypt
– 有効化するPAMプロファイル:必要なものを選択して了解
答え終わると色々設定してくれますが,重要なファイルである/etc/ldap/ldap.confがうまくやってくれていないので,これを編集して

を加えます.
次に/etc/nsswitch.confを編集します.

最後に/etc/pam.d/common-password を開いて,

のuse_authtokを削除します.これで設定完了です.

内容についてどう思いますか?
  • いいね (3)
  • だめ (0)