認証方式とディレクトリサービス

目次

htpasswdやsmbpasswdからネットワーク上のユーザーまでを前回紹介したNISで一括管理することは不可能です。なぜならアプリケーションのユーザー認証はアプリケーションに委ねられているからです。それらのユーザー情報を共有管理するにはアプリケーションに対応した認証方式を採用しなければなりません。多くのアプリケーションはその認証方式にNISはあまり採用せずに、ネットワーク認証も可能にしたKerberosやLDAP、小規模システムではPAM認証を採用しています。ここではそのLDAPをはじめ、各認証方式について説明していきます。

ディレクトリサービス
LDAPの基本設定
ローカルユーザーのLDAP認証
ネットワークユーザーのLDAP認証
LDAPユーザーの管理

戻る

ディレクトリサービス

LDAPの構造>
LDAPはクライアント/サーバーシステムとなっています。サーバーにディレクトリ構造を格納しておき、クライアントはそれを検索や登録、修正することができます。LDAPはディレクトリ内の情報を「識別名」DNと表現します。識別名DNは相対識別名RDNを「,」で区切ります。相対識別名RDNは
属性名=属性値
という形式で表現します。例えば 「dc=syns」 などと表記します。識別 名はDNSと同じ後ろから構成されていますので、階層構造のトップからツリーをたどるごとに後ろから表現していきます。

LDIF
識別名のディレクトリには、属性の集合であるディレクトリエントリというものがあります。それを表現する場合は次の様に記述します。
属性名: 値
この記述方法をLDIFと呼びます。 LDIFの設定例を次に記します。

dn: uid=hoge,ou=People,dc=syns,dc=net
uid: hoge
objectclass: posixAccount
uidNumber: 3001
gidNumber: 3001
homeDirectory: /home/hoge
loginShell: /bin/tcsh
cn: hoge
 

dn
識別名であり、見出しに相当する部分です。後ろから構成されているのでhoge@People@syns.netという意味を持ちます。ouとは部局を意味し、今回は人に関する情報を格納しているのでou=Peopleとしました。

uid
LDAPでは検索する時にディレクトリの情報しか検索しないので、uidの値をセットしておかなければuidがhogeであるディレクトリエントリが見つけられません。

objectclass
どの様な情報をもたなければならないかをここで定義する特別な属性です。posixAccountというobjectAccountは cn,uid,uidNumber,gidNumber,homeDirectoryの属性をもたなければならないように定義されています。従ってposixAccountであることはこれらの属性が必ず格納されていることを意味します。

検索フィルタ
一致 uid=hoge
部分一致 uid=*o*
存在の確認 uid=*
類似 uid~=hoge
順序比較 uidNumber>=3000
否定 (!(uidNumber>=3000))
論理積 (&(cn=*hoge*)(uidNumber>=3000))
論理和 (|(cn=*hoge*)(uid~=hoge))

LDAPの基本設定

OpenLDAPのインストールが済めば/usr/local/etc/openldap以下のslapd.confの編集を行ってください。slapd.conf.defaultファイルを参考にすると良いでしょう。

include /usr/local/etc/openldap/schema/core.schema
pidfile /usr/local/var/slapd.pid
argsfile /usr/local/var/slapd.args
database bdb
suffix "dc=syns,dc=net"
rootdn "cn=Manager,dc=syns,dc=net"
rootpw [パスワード]
directory /usr/local/var/openldap-data
index objectClass eq
 

database データの範囲定義 OpenLDAP2.0の場合はldbm 又はOpenLDAP2.1の場合はbdbを指定して下さい。
rootdn 特権ユーザーの設定
rootpw 特権ユーザーのパスワード
directory データベースの位置 OpenLDAP2.0の場合はopenldap-ldbmを指定して下さい。OpenLDAP2.1の場合はopenldap-dataを指定して下さい。
index インデックスの生成(検索が速くなります)

このファイルには特権ユーザーのパスワードが記述されていますのでパーミッションを変更します。

# chown root slapd.conf
# chmod 600 slapd.conf

これらの設定が終わればLDAPを起動してください。LDAPサーバーはslapdというプロセスです。

# /usr/local/libexec/slapd

何もエラーが出なければバックグラウンドで動作しているはずです。slapdデーモンが動作しているのか確認してみましょう。

# /usr/local/bin/ldapsearch -h localhost -x -b '' -s base '(objectclass=*)' namingContexts 

尚、もちろんpsコマンドでも動作の確認はできます。このldapserchコマンドの-xはローカルのslapdにSASLを使用しないで接続しています。検索結果 がsuffixの値であれば問題ありません。ここでの設定ではドメインがsyns.netですからdc=syns,dc=net と出力されます。

<データの登録>
LDAPのデータはLFIFで記述します。

dn: dc=syns,dc=net (suffixの内容)
objectclass: dcObject
objectclass: organization
o: SYNS Organization
dc: syns

dn: cn=hoge, dc=syns,dc=net (rootdnの内容)
objectclass: organizationalRole
cn:hoge

これはdnとcnの識別名に対するディレクトリエントリを示しています。このようにディレクトリエントリ間(dnとcn)は空行で区切り、ディレクトリエントリの最初は識別名を指定したdn:の行で始まっています。

dc=syns,dc=netという識別名のディレクトリエントリは、objectclass属性、o属性、dc属性をもっていることが分かります。objectclass属性にはdcObjectとorganizationという値がはいります。o属性は組織をあらわすもので、ここではSYNS Oraganizationという値を指定しています。最後のdcにはdc=syns.netという識別名を作る最後の相対識別名(RDN)であるdc=synsを指定しています。
cn=hoge,dc=syns,dc=netという識別名のディレクトリエントリはobjectclass属性とcn属性をもっていることが分かります。objectclass属性としてはorganizationalRoleという役割があり、cn属性は人などの一般名を表す時によく使用されます。

このLDAPデータを登録するためにはldapaddコマンドを使用してslapdに追加します。上記のLFIFファイルを適当なファイル名に記述して以下の様に実行してください。今回はsyns.ldifファイルに記述しました。

$ ldapadd -h localhost -x -D 'cn=hoge,dc=syns,dc=net' -W -f syns.ldif

-DオプションによりLDAPサーバーの管理ユーザーを定義できます。今回は上記よりhogeユーザーが管理することを定義していることになります。管理者をldapaddコマンドで定義していない場合はslapd.confで指定したユーザーが管理者になります。
-Wオプションはパスワードを入力するためのもので-Dオプションで指定した管理ユーザーのパスワードを用います。
-fオプションは先ほどのファイルを定義します。

<登録データの検索>
登録したデータはldapserchコマンドで検索します。

# ldapsearch -h localhost -x -b 'dc=syns,dc=net' '(objectclass=*)'

-bオプションでこのLDAPサーバーのディレクトリエントリのトップから検索することになります。また-sオプションを省略したことによりsubになります。はじめに紹介した動作確認ではbaseを定義しました。subにすることによりLDAPサーバーの全てのツリー上から検索をすることになります。

ldapserchコマンドは-hオプションでホストを定義し、ネットワーク上のLDAPサーバーをLDAPプロトコルをつかって検索します。しかしLDAPプロトコルを使わないで直接ローカルのディレクトリエントリを検索したい場合もあります。このときは/usr/local/sbinにインストールされたslapcatコマンドを使って下さい。このコマンドは直接ディレクトリエントリにアクセスするためldapserchコマンドとは違いroot権限が必要です。

# /usr/local/sbin/slapcat

ローカルユーザーのLDAP認証

ユーザーごとにディレクトリエントリを作成していきます。hogeユーザーの/etc/passwdエントリをLDIFで記述すると次の様になります。
hogeユーザーの/etc/passwdファイルの記述

hoge:x:3001:3001:LDAPuser:/home/hoge:/bin/tcsh

hogeユーザーのLDIFの記述

dn: uid=hoge,ou=people,dc=example,dc=jp
uid: hoge
objectclass: posixAccount
uidNumber: 3001
gidNumber: 3001
gecos: LDAPuser
homeDirectory: /home/hoge
loginShell: /bin/tcsh
cn: hoge

識別名を構成する相対識別にどの属性をつかってもかまいませんが、識別名が一意になるような属性を使う必要があります。ここではユーザー名が一意なものであり、データベースで言う主キーになるわけです。ですからユーザー名ではなくユーザーID(uidNumber)であってもかまいません。/etc/passwdと照らし合わせると、ほぼ1対1で対応していますが、LDIFにはobjectclassやcnの様な特別なディレクトリエントリが付属しています。objectclassは前章で説明したとうり、このディレクトリエントリがどの様な情報を格納しているのか定義するために用いられます。この定義によりcn属性(一般名)を持たなければなりません。

</etc/shadowをLDIFで表記する>
続いて暗号化ファイルをLDIFで記述します。
hogeユーザーの/etc/shadowファイルの記述

hoge:**************: [変更日時] : [変更不能日数] : [変更要求日数] : [期限満了警告日数] :::

shadowファイルを扱う場合はobjectclassにshadowAccountを使って下さい。shadowAccountもnis.schemaに定義されています。

dn: uid=hoge,ou=people,dc=example,dc=jp
uid: hoge
objectclass: posixAccount
objectclass: shadowAccount
uidNumber: 3001
gidNumber: 3001
gecos: LDAPuser
homeDirectory: /home/hoge
loginShell: /bin/tcsh
cn: hoge
userPassword: {CRYPT}**************
shadowLastChange: [変更日時]
shadowMin: [変更不能日数]
shadowMax: [変更要求日数]
shadowWarning:
[期限満了警告日数]

userPassword属性を確認してくだい。{CRYPT}と付いています。これはどの方法で暗号化されているのかを示すものです。他に{MD5} {SMD5} {SSHA}などがあります。先頭に{}で暗号化方式を指定しないと平文と解釈されて正しく認証されませんので気をつけてください。また平文の文字列を暗号化するツールもOpenLDAPには実装されていますので、必要ならばそれを使ってuserPasswordの値にセットしてください。

/usr/local/sbin/slappasswd -h '{CRYPT}' -s [平文] -c "%s"

<アカウントの登録>
インストール直後では、schemaとしてcore.schemaしか組み込まれていませんので、そのままではposixAccountなどが利用できません。まずはslapd.confでnis.schemaを組み込みます。またnis.schemaはcosine.schemaで定義している属性も参照するのでcosine.schemaも組み込む必要があります。さらにLDAPでのパスワード変更でもCRYPT暗号方式を利用できるようにしておきます。

include /usr/local/etc/openldap/schema/cosine.schema
include /usr/local/etc/openldap/schema/nis.schema
password-hash {CRYPT}

slapd.confの編集が終わればslapdを再起動してください。準備が整えばアカウントの登録です。
「dc=syns,dc=net」はすでに登録していますが「ou=people,dc=syns,dc=net」はまだ登録していませんので、まずはこれから登録します。

ldapadd -x -D 'cn=Manager,dc=syns,dc,net' -W -f people.ldif

people.ldifは次のようなファイルになります。

dn: ou=People,dc=syns,dc=net
ou: people
objectclass: organizationalUnit

このように「ou=People,dc=syns,dc=net」を追加してから「uid=hoge,ou=People,dc=syns,dc=net」を登録します。

ldapadd -x -D 'cn=Manager,dc=syns,dc,net' -W -f hoge.ldif

登録ができたが確認する場合はldapserchコマンドを使ってください。

ldapserch -x -b 'dc=syns,dc=net' uid=hoge

LDAPにデータを格納すれば、セキュリティー面にも気をくばらなければなりません。slapd.confにはアクセス制限をする機能がありますので次を参考に編集してください。

acess to *
by self write
by * read

上の記述では自分は書き込み可能、他の人でも読み込み可能(書き込み不可)になります。

acess to *
by dn="cn=Manager,dc=syns,dc=net" write
by self write
by * read

上の記述ではcn=Manager,dc=syns,dc=netが特権的に書き込めるようになります。

access to attibute=userPasswork
by self write
by dn="cn=Manager,dc=syns,dc=net" write
by anonymous auth
by * none

acess to *
by dn="cn=Manager,dc=syns,dc=net" write
by self write
by * read

一般にuserPassword属性はそのユーザーだけが読み下記でき他の人には何もできない様にしておくのが望ましいでしょう。ですから基本的なアクセス制御は上の様な記述で問題ありません。

(注意)
LDAPの場合、書き込み権限が一番強くこの権限があれば読み込み権限も持つ事になります。UNIXのパーミッションと違い書き込みはできて読み込めないという設定はできません。

データを登録すれば実際にnssを使ってユーザー情報を参照できるか確認してみてください。(テンプレートは/etc/nsswitch.ldapです。)

ネットワークユーザーのLDAP認証

前書きにも述べた様にLDAPはTCP/IP上のプロトコルなのでネットワークでの認証に向いています。ここで1台のLDAPサーバーを複数のクライアントが参照する場合を考えてみましょう。各プラットフォームが参照する場合は各々にnss_ldapを用意してください。LDAP認証サーバーを192.169.10.5とすると/etc/libnss-ldap.confは次の様になります。

host 192.169.10.5
base dc=syns,dc=net
rootbinddn cn=manager,dc=syns,dc=net

またrootbinddnで指定した識別名のパスワードを/etc/ldap.secretに記述しroot所有の600パーミッションにセットしてください。

chown root /etc/ldap.secret
chmod 600 /etc/ldap.sercret

これら基本的な設定でLDAPサーバーに簡単に接続する事は出来ると思います。さらにpasswdやshadowでもLDAPを利用する様に/etc/nsswitch.confを修正します。またpasswdコマンドでパスワードを変更できる様にしたり、ホームディレクトリを自動で作成されるように/etc/pam.d/loginや/etc/pam.d/sshdを修正します。

password sufficient pam_ldap.so
password required pam_unix.so nullok obscure min=4 max8
session required pam_mkhomedir.so skel=/etc/skel umask=0222

 

LDAPユーザーの管理

ネームサービスをLDAPにセットすれば一度/etc/passwdには存在せずLDAPに存在するユーザーでidコマンドを実行してみて下さい。もしも上手くユーザー情報が引いてこれないのであれば、nsswitch.confを確認してみましょう。上手くLDAPユーザーが引けた場合はNSSを介して様々な検索が可能になっているはずです。

<LDAPユーザーを公開する前に>
一般ユーザーにLDAP認証を公開するにはユーザーからの変更操作を可能にする必要があります。パスワードの変更をpasswdからも行える様にするいはLDAPのPAMモジュールが必要です。これは ftp://ftp.padl.com/pub/pam_ldap.tar.gzから入手できます。nss_ldapの設定はそのまま動作しますが暗号化方式を加えておきましょう。修正したldap.confは次の様になります。

host 127.0.0.1
base dc=example,dc=jp
pam_password crypt

一方で、LDAP用PAMモジュールを有効にするためにはPAMを必要としているアプリケーションことに設定が必要です。passwdのPAMは、基本的に/etc/pam.d/passwdに置いて、即存のpasswd行の上に以下の記述があれば動作します。

password sufficient pam_ldap.so

 


<参考>
http://www.openldap.org/doc/admin21/

<戻る>