●ディレクトリサーバとは
ディレクトリサーバとは、ネットワーク上でユーザ情報、組織情報などを保存、管理し、分散しているクライアントに対しこれらの情報を提供するサーバです。また、管理する情報に対するアクセスコントロールも提供します。
したがって、クライアントはディレクトリサーバでの認証後、許可された操作を行うことになります。このため、サーバ/クライアント間でのプロトコルが必要ですが、現在主に使われているのがLDAP(Lightweight Directory Access Protocol)です。
LDAPサーバは、商用製品ではマイクロソフトのActive Directory、サン・マイクロシステムズのSun Java System Directory Server、ノベルのeDirectoryなどが有名です。オープンソースでは、OpenLDAPのほか、Fedora Directory Server、Apache Directory、OpenDSなどがあります。
OpenLDAPの情報は下記URLを参照してください。
OpenLDAP 情報
ディレクトリサーバのメリット
個人で利用するコンピュータや、比較的小規模のオフィスにおいては、ユーザ情報はそれぞれのコンピュータで管理されることが多いでしょう。
しかし、例えば数十人、またはそれを超える大規模の組織でユーザ情報を管理する場合は、それぞれのコンピュータで個別に管理するよりも、専用サーバ上で管理する方が、都合がよいでしょう。
また、ディレクトリサービスを活用することでアプリケーションサーバやWebサーバと連携させてシングルサインオン環境や、Active Directoryで管理されるWindowsユーザを統合したアカウント管理へと発展させることも可能です。
逆に、管理情報が各コンピュータに分散していれば、その数だけメンテナンスに掛かる手間が増えることになります。
●ディレクトリサーバ設計のポイント
スキーマ設計
「ディレクトリ情報を集中管理できる」というメリットを持つディレクトリサーバですが、利用に当たってはディレクトリ情報として格納する各エントリに、どのような情報を持たせるかを定義する必要があります。
この定義には、ディレクトリサービスを利用するクライアント側の用途に基づいて、ディレクトリサーバに蓄積する必要があるデータを選定し、そのデータをディレクトリサーバが扱うことのできるデータ型へと落としていく作業が必要になります。
ディレクトリサーバが扱うデータ型としては、標準的に利用されるものがあらかじめRFCに定義されています。OpenLDAPでは[OpenLDAPインストールDir]/etc/openldap/schema/ディレクトリにこれらのデータ型を定義したファイルが用意されています。
オブジェクトクラスの設計
例えば、Linuxクライアントからのユーザ認証に、/etc/passwdファイルではなくディレクトリサーバを利用する場合、LinuxはPAM(pam_ldap.so)を利用します。
PAMは、認証対象のユーザがディレクトリサーバに存在することを確認するため、サーバ内の「posixAccount」オブジェクトクラスの「uid」属性を検索します。この「posixAccount」オブジェクトクラスの利用には、OpenLDAPが提供するnis.schemaファイルにあらかじめ用意されている定義を利用することができます。
このオブジェクトクラスは、構造型(STRUCTURAL)、補助型(AUXILIARY)、抽象型(ABSTRACT)の3つに分類され、各エントリには構造型のオブジェクトクラスを必ず含めるという制約があります。
このため、Linuxのユーザ認証という用途で利用する場合、ユーザエントリには、構造型のオブジェクトクラス、例えばcosine.schemaファイルにあらかじめ用意された「account」オブジェクトクラスなどを加えることになります。次のLDIFファイル(LDAP Data Interchange Format: LDAPエントリをテキスト形式で表現したファイル)は、posixAccountオブジェクトクラスを利用する場合に必要となる定義を行った例です。
●「継承」の概念
このほか、オブジェクトクラスには継承という概念があります。構造型のオブジェクトクラスとして「account」オブジェクトクラスではなく、例えばinetorgperson.schemaファイルに用意された「inetOrgPerson」オブジェクトクラスを追加することを選択した場合、ユーザエントリには、「account」オブジェクトクラスを選択した場合のエントリと比較し、「sn」属性が追加で必要になります。
次のLDIFファイルは、inetOrgPersonオブジェクトクラスを利用する場合に必要となる定義を行った例です。
図1 オブジェクトクラスの継承
属性設計
オブジェクトクラスに任意属性、必須属性として定義された各属性もそれぞれがオブジェクトIDを持ち、属性値を比較するルール、属性値が取り得る構文(いわゆる型)などが定められています。
例えば、posixAccountオブジェクトクラスに必須属性として定義されたuidNumber属性は、
このほか、属性もオブジェクトクラスと同様に、上位の属性の持つ性質を継承することができます。例えば、core.schemaファイルで定義される属性cn、snは、属性nameの持つ、
●そのほかの留意事項
DIT(Directory Information Tree)設計
ディレクトリ情報を集中管理できるディレクトリサーバですが、一方でデメリットもあります。
ディレクトリサーバは、ユーザID、パスワードなどのユーザ情報を一元管理しているため、ディレクトリサーバそのものに障害が発生した場合、組織内のユーザはコンピュータにログインすることすらできなくなる可能性があります。コンピュータを中心にして活動している企業では、企業活動が停止してしまいかねません。
この問題に対して、OpenLDAPはレプリケーションによるディレクトリ情報の冗長化を提供しています。
OpenLDAPのレプリケーション機能は、DIT(Directory Information Tree:ディレクトリ情報ツリー)の特定の階層以下を指定して、レプリケーションできるというものです。このため、ディレクトリ全体でなく特定の階層から下のみを冗長化させることを予定している場合、DITの設計時には、レプリケーションさせるディレクトリ情報の階層を意識して設計を進める必要があります。
図2 レプリケーションのイメージ
また、OpenLDAPはディレクトリ情報の一部の管理を、ほかのサーバへ委譲する機能を持ちます。この機能を利用することによりサーバ管理者はディレクトリ情報の管理を分担して行えることができるようになります。
ディレクトリ情報を切り分ける単位はDITのサブツリーとなるため、この機能を利用する場合も、DITの設計時に、権限を委譲しディレクトリ情報を分散させる階層を意識して設計を進める必要があります。
図2 レプリケーションのイメージ
レプリケーション設計
多くの商用ディレクトリサーバが、マスタ兼スレーブサーバとして動作することができるマルチマスタレプリケーションをサポートしているのに対し、 OpenLDAPは最新のメジャーバージョンである2.4系まで、マルチマスタを正規の機能としてサポートしていませんでした。
現時点でStable版とされている2.3.xでは、マルチマスタ機能は試験的なサポートにとどまっています。また、2.4系でのマルチマスタ構成はまだ実績が少ないことから、現時点においてのOpenLDAPでのレプリケーション構成はシングルマスタの採用が堅実と考えられます。
また、OpenLDAPのレプリケーション方式には、slurpd方式とsyncrepl方式の2つがあります。slurpd方式は、信頼性が低く、同期が取れなくなることがあり、その場合は手動での同期が必要になるといった理由で2.4系では削除されています。反対に、syncrepl方式は同期を取るために必要な手間が少ないというメリットがあるため、今後はこちらが主要なレプリケーション方式としての利用、開発が進むことになります。
さらに、syncrepl方式には非同期的なタイミングで複製を行うrefreshOnlyモードと、同期的なタイミングで複製を行うrefreshAndPersistモードがあります。マスタ-スレーブ間で更新データの複製タイミングの遅れが問題となり得る場合は、refreshAndPersistモードの採用を検討することになります。
負荷への対策
ディレクトリサーバはディレクトリ情報を一元管理しているため、導入前には個々のコンピュータで行われていたユーザID、パスワードを用いた認証要求や、ユーザ名、グループ名、メールアドレスといったディレクトリ情報の検索要求が集中することになります。この結果、サーバ負荷が増大する可能性もあります。
この問題に対してOpenLDAPは、レプリケーション機能による冗長化構成を用いてのアクセス負荷の分散や、バックエンドデータベースにIndexを作成したバックエンドデータベース自体の検索処理の高速化といった対策を用意しています(このほか、LDAPクライアント側では、一度取得したディレクトリ情報を一定時間キャッシュすることにより、ディレクトリサーバへのアクセス数を抑制するといった対処が可能です)。
クライアント数が多く、ディレクトリサーバへのアクセスが多い大規模な組織で利用する場合や、特定時間内でのアクセスが極端に多くなるような利用が見込まれる場合は、ディレクトリサーバに掛かる負荷への対策には特に注意が必要です。
セキュリティ
ディレクトリサーバは情報を一元管理するため、導入前には個々のコンピュータで管理されていたパスワードなどの情報を、ディレクトリサーバは組織内のユーザ数の分、まとめて管理することになります。万が一、ディレクトリサーバが侵入を受けてしまうと、組織内のさまざまな情報がまとめて流出することになりかねません。
このリスクに対して、OpenLDAPはパスワードを平文で保存せずに、ハッシュ関数などで暗号化した状態で保存する機能を提供しています。また、OpenLDAPはクライアントからの通信経路をSSL/TLSで暗号化する機能も備えています。暗号化された経路より受け取ったパスワードを、同じハッシュ関数を利用し比較することで、すでにハッシュ化されて保存されたパスワードと一致するかを確認することができます。
このほか、OpenLDAPでは、認証に必要な情報をOpenLDAPが持つバックエンドデータベース内に保存せずに、外部のSASL(Simple Authentication and Security Layer)データベースやKerberosデータベースに保存し、利用する機能を提供しています。ディレクトリサーバの設計時には、アクセスコントロールリストの設定も含め、他人に知られたくないパスワードなどの情報をどのように扱うかを検討する必要があります。
運用管理
前述したとおり、組織内のディレクトリ情報を一元管理するため、万が一、ディレクトリサーバに障害が発生するとその影響は甚大です。管理者はサーバの運用に問題が生じていないかを把握し、問題が発生した場合にはその原因を早急に特定し、障害から復旧させるよう努める必要があります。
一般のサーバプログラムと同様、OpenLDAPにも動作ログをsyslogへ送る機能があり、ログレベルを指定することができます。健全なディレクトリサーバの運用のため、必要な範囲のログを出力させ、管理する必要があります。
また、一般に更新頻度が少ない情報が格納されるディレクトリサーバですが、管理者は、万が一の場合に備えてディレクトリ情報のバックアップを取得する必要があります。データの保全作業は、ディレクトリサーバを適用する組織が大きくなればなるほど重要性も増す作業です。
OpenLDAPにもバックアップ、リストアを行うコマンドが付属しています。実運用を開始する前に定期的なバックアップのスケジュールを計画し、運用条件に合わせ、これらのコマンドを利用したデータの保全策を確認しておく必要があります。
●OpenLDAPのインストール及び設定(CentOS 6、7編)推奨版
OpenLDAPのサーバとクライアントをインストールします。
またこれ以降の作業でldapaddまたはldapmodifyコマンドを実行後、下記のようなエラーが表示される場合があります。
ベースドメインの登録を実施します。
●ldapviを使用した編集
OpenLDAP 2.4からは自身の設定ファイルもLDAPデータベースで管理されており、設定を修正するたびにLDIFを作成しldapmodifyして……というのが非常に面倒なので、viでファイルを編集する感覚で使えるldapviというコマンドがEPELにあるので、合わせてインストールしておきます。
●OpenLDAPのインストール及び設定(CentOS 6、Fedora 15編)
●OpenLDAPのインストール及び調整(通常の方法)以降に記載されている方法ではLDAPユーザ権限でldappasswd等を実行した場合にResult: Insufficient access (50)等が表示されてしまいます。
下記の方法によりインストールすると問題が解消されました。
参照先
LDAPサーバー構築(CentOS 6)
LDAPクライアントの設定(CentOS 6)
openldap-servers、openldap-clientsをインストールします。
●LDAPのマルチマスターレプリケーションの設定
参考にしたページ
OpenLDAP マルチマスターレプリケーション
OpenLDAPの構築
OpenLDAPマルチマスタ(ミラーモード)
mod_syncprovを設定します。syncporv.laが存在しているディレクトリーのPATHを設定します。PATHはOSによって異なりますので確認しながら設定してください。すべてのサーバで設定します。
●LDAPのマルチマスターレプリケーションの設定(3台)
3台でマルチマスターレプリケーションできるかどうか実験してみます。
パターンA(1台をハブとする方法)
・サーバ情報
サーバA(rid: 001、olcServerID: 1)
サーバB(rid: 001、olcServerID: 2)
サーバC(rid: 001、olcServerID: 3)
サーバAはサーバB及びサーバCと双方向で同期するように設定します。
ただし、サーバBとサーバCは双方向で同期しません。
同期設定内容は下記コマンドで確認します。
この条件のもと、あるユーザのパスワードを変更し同期するかどうか確認します。
サーバAでパスワード変更を実施。
同様に、サーバB、サーバCの順にパスワードを変更し他のサーバでパスワードが変更されていることを確認しました。
パターンB(3台ともハブとする方法)
・サーバ情報
サーバA(rid: 001、olcServerID: 1)
サーバB(rid: 001、olcServerID: 2)
サーバC(rid: 001、olcServerID: 3)
サーバA、サーバB、サーバCの各サーバで双方向で同期するように設定します。
同期設定内容は下記コマンドで確認します。
この条件のもと、あるユーザのパスワードを変更し同期するかどうか確認します。
サーバA(サーバB、サーバC)でパスワード変更を実施。
●LDAPクライアントのセットアップ(CentOS 7)
openldap-clients及びnss-pam-ldapdをインストールします。
これで設定はほぼ完了です。内容を確認するには下記コマンドを実行します。
情報が表示されない場合の対処
/etc/openldap/ldap.confファイルを編集します。
/etc/pam.d/system-authファイルにpam_ldap.soがあるか確認します。
/etc/pam.d/password-authファイルにpam_ldap.soがあるか確認します。
確認方法は「●SSHでログインできるか確認する」を参考にしてください。
再度、LDAPクライアントとしての動作確認をします。
以下作業は、CentOS 6、CentOS 7で不要。
参照URL:LDAP 認証 - クライアントのセットアップ
SSSDで基本的な認証を実施しない場合
/etc/pam.d/su及び/etc/pam.d/su-lでsufficientのpam_ldap.soを下記のように追加します。
pam_ldap.soを下記の位置に記載しない場合、rootからsuする場合もパスワードの入力を催促されるようになります。
su-lファイルはユーザがsu --loginを実行したときに使用されます。authセクションにpam_unixの記載がある場合は、use_first_passを追加してください。
SSSDで基本的な認証を有効にする方法
●「su: 警告: ディレクトリを /home/sato に変更できません」と表示される
●LDAPクライアントのセットアップ(CentOS 7)に記載してあるとおりauthconfigコマンドを実行しましたがFedora 22が動作しているサーバで下記のようなエラーが表示されました。
●LDAPユーザでSSHログインできない
Fedora 22が動作しているサーバで下記のようなエラーが表示されました。
上記の方法で問題なくSSHログインできるようになりました。
●LDAPクライアントのインストール及び設定(CentOS 6、Fedora 15編)
openldap-clients及びnss-pam-ldapdをインストールします。
下記コマンドを実行します。
下記はこれまで各ファイルを手動で編集した方法です。斜字体は読み飛ばしてください。
ldap.confを編集します。
今まで、使用していた/etc/ldap.confは存在しないようです。
skel=/etc/skel umask=077はLDAPサーバがリモートである場合、ローカル側で自動作成されるホームディレクトリではumaskが有効にならない。ホームディレクトリのアクセス権が700ではなく755になってしまう。
nsswitch.confを編集します。
サーバを再起動します。(Cent OS 7でサーバを再起動しなくても動作することを確認)
この時の/etc/openldap/slapd.dディレクトリ以下は下記のとおりです。
設定を確認します。
LDAPクライアントからLDAPにあるアカウントで接続しようとしたら接続出来ませんでした。ログを確認すると下記のようなエラーが記録されていました。
●LDAPクライアントのインストール及び設定(CentOS 5編)
「CentOS5での設定」を参照しました。
下記パッケージが必要となります。
・nss_ldap
・php-ldap
・nss_ldap
・openldap-clients
・openldap
・openldap-devel
CentOSでは、ログイン認証の方式を容易に変更できるauthconfigというツールが用意されているのそれを利用してLDAPのための基本的な設定を実施します。
なお、authconfigはGUI(X Window:authconfig-gui)用とCUI(テキストコンソール: authconfig-tui)用の2つが用意されているで、実行環境に合わせて選択してください。ここでは、authconfig-tuiを使った設定を説明します。
コンソール画面を起動したら
ここで、下記の項目を有効にします。
[Next]をクリックすると、次の画面が表示されます。
ここで入力するのは、下記のような内容になります。
/etc/openldap/ldap.conf は、LDAPクライアント(ex. ldapsearchなど)で使用されるファイルで、LDAPサーバの情報を定義しています。このファイルが上記で設定した内容となっていることを確認してください。
●OpenLDAPのインストール及び調整(通常の方法)
この情報は古いです(2016.04.13)
OSはCentOS 6.0です。OpenLDAP関連のパッケージで何がインストール済みなのか確認します。
OpenLDAPのバージョンが2.4.19から2.4.23に変更(2011.12.11、CenOS6)となり挙動が変わったようです。
赤字で示しているのがその箇所です。
不足のパッケージがある場合は、下記のようにインストールします。
openldap-serversのインストール直後の/etc/openldap/slapd.d等の状態は下記のようになっています。
openldap-serversパッケージにサンプルとして付属する「DB_CONFIGファイル」をOpenLDAPサーバのデータディレクトリにコピーします。DB_CONFIGの詳細については●DB_CONFIGを参照してください。
この時、/var/lib/ldapフォルダにデータベースが作成されます。
slapdデーモンが起動しているか確認します。
slapd.confをバックアップからコピーします。
/etc/openldap/slapd.confのsuffix、rootdn、rootpwを設定します。rootdnはcn=Managerが一般的です。セキュリティ上、心配な場合は変更してもかまいません。
slapd.confを編集します。
slapdデーモンを再起動します。
次のコマンド例では、"-x"オプションのみを利用して匿名ユーザでの簡易認証を行い、"-h"オプションにてローカルホスト上のOpenLDAPサーバに対し、"-b"オプションでディレクトリツリーの検索ベースを「dc=bigbang,dc=dyndns,dc=org」と指定した検索を行い、"-LLL"で最もシンプルなLDIFフォーマットへ出力を整形させています。
ldapsearchコマンド実行時に下記のようなエラーが表示されました。
●自己環境用のLDAPサーバの構築
この情報は古いです(2016.04.13)
自己環境用にLDAPサーバの構築するには、下記作業を実施します。
OpenLDAPのバージョンが2.4.19から2.4.23にアップデート後(2011.12.11、CenOS6)、LDAPサーバが起動しなくなりました。その時にこの項目を応用しました。
slapdを停止します。
赤字はその時に参考とした箇所です。
/etc/openldap/slapd.confのsuffix、rootdn、rootpw及びアクセス権を設定します。rootdnはcn=Managerが一般的です。セキュリティ上、問題がある場合は変更して問題ありません。
openldap-serversを再インストールします。
/etc/openldap/slapd.d/cn=config/olcDatabase={1}bdb.ldifのolcSuffixが更新されています。デフォルトでは追加出来なかったエントリが、この状態でエントリを追加することができるようになります。
以降、slapd.d以下がメインで使われるので、slapd.confは不要…になります。
slapd起動します。
データベースが更新されていることが分かります。
これで問題なくLDAPを利用することができるようになる場合があります。
上記の方法、うまくいかなかったが判明したのは●ldifの作成の時でした。何度やっても登録することが出来ません。
この時のolcDatabase\=\{2\}hdb.ldifでおかしかった点は下記のとおりです。
LDAPクライアントの設定を行っていない場合は●LDAPクライアントのインストール及び設定(CentOS 6、Fedora 15編)を参照して設定してください。
●SSSD+LDAP+SUDOの構築
参照URL:認証システムSSSD+LDAP+SUDOの構築手順
LDAPサーバとユーザーデータは既にあるものとします。
まず、SSSDをインストールします。nscdは共存できない(するべきではない)ので、削除しておきます。
また、必要に応じて/etc/sudoersを編集します。
アンコメント or 追記します。
●SSHでログインできるか確認する
接続先のOSがCentOS 6でsshd_configの設定でRSAAuthentication yesが有効になっている場合、すんなりログインできました。
ところが接続先のOSがCentOS 7の場合、RSAAuthentication yesが有効になっていてもログインすることができませんでした。もちろんパスワードの間違いではありません。
/etc/pam.d/system-authでところどころに記載されている「sss」を「ldap」へ修正します。
●passwdコマンドでLDAPユーザのパスワードを変更することが出来ない
後で分かったことですが、passwdコマンドでLDAPユーザのパスワードを変更することが出来ない現象が発生しました。
CentOS 7でも、passwdコマンドでLDAPユーザのパスワードを変更することが出来ない現象が発生しました。(2016.04)
調べたところ、/etc/openldap/slapd.d/cn\=config/olcDatabase\=\{1\}bdb.ldifの設定が問題なく動作するものとは異なっていました。下記を追加し、LDAPサーバを再起動後、passwdコマンドで変更出来るようになりました。
CentOS 7の場合の対応方法は「●LDAPクライアントのセットアップ(CentOS 7)を参照してください。
2016年4月現在、この原因は解決していません。
●OpenLDAPサーバのログ出力
OpenLDAPサーバは、インストールしたそのままの状態でログを記録するようには設定されていません。これは、肥大化するログがディスク領域を圧迫したり、パフォーマンスに影響を与えやすいディスクへの書き込みが少ない設定でもあります。
しかしながらこのままの設定では、日々起こり得る、OpenLDAPサーバにとって不都合な事象を見逃して、不安定な運用にもつながりかねません。また、いざ障害が発生したときに、その原因を追究し、再発防止を検討する糸口を得られなかったりする可能性もあります。このため、管理上有効な情報はログとして記録し、定期的に古いログを削除できる設定が必要になります。
OpenLDAPサーバは、デフォルトでsyslogのLOCAL4ファシリティにログを送付しています。このため、syslog.conf(またはrsyslog.conf)ファイルの設定を変更することで、syslogがOpenLDAPサーバのログを受けて記録できるようになります。
出力するログの内容を変更するには「●ログレベルの変更 」を参照してください。
ログローテーションさせるには下記のように設定します。
●ldifの作成及びエントリの追加
日本語が含まれているLDIFファイルを登録する場合には、LDIFファイルがUTF-8エンコーディングされている必要があります。
OpenLDAPのバージョンが2.4.19から2.4.23に変更後、起動しなくなりました。その際の内容は下記のとおりです。
次のようなldifファイルおよびldif作成用のスクリプトを用います。
●移行ツールを用いたエントリの追加
LDAPサーバへのエントリ登録については、これまでに説明したスクリプトなどを用いて新規アカウントを作成する方法のほか、PADLソフトウェアが配布する「MigrationTools」というスクリプトセットを用いて、既存アカウント(/etc/passwdファイルに存在するアカウント情報)を移行することも可能です。
CentOSに付属するopenldap-serversパッケージには、Perlで記述されたこの移行スクリプトセットが含まれています。これを利用すると、OpenLDAPサーバのインストール後、すぐに既存アカウントの移行が行えるようになっています。
移行ツールをインストールします。
●LDAPコマンド
LDAPコマンドの使用方法を記載します。
ユーザまたはグループの追加
ldapadd [オプションその1] [DN] [オプションその2] [ファイル名]
[オプションその1]
-h LDAPサーバを指定する(省略時はローカルホスト)
-x SASLを使わず簡易認証を用いる
-D 認証に利用するDNを指定する
[オプションその2]
-W 認証時のパスワードを対話的に入力する
-w 認証時のパスワードをコマンドラインで指定する
-f LDIFファイルを指定する
例は下記のとおりです。
ユーザまたはグループの削除
ldapdelete [オプションその1] [DN] [オプションその2] [ユーザ・グループDN]
[オプションその1]
-h LDAPサーバを指定する(省略時はローカルホスト)
-x SASLを使わず簡易認証を用いる
-D 認証に利用するDNを指定する
[オプションその2]
-W 認証時のパスワードを対話的に入力する
-w 認証時のパスワードをコマンドラインで指定する
-f LDIFファイルを指定する
例は下記のとおりです。
検索
ldapsearch [オプション] [DN] [検索条件]
[オプション]
-h LDAPサーバを指定する(省略時はローカルホスト)
-x SASLを使わず簡易認証を用いる
-D 認証に利用するDNを指定する
-W 認証時のパスワードを対話的に入力する
-w 認証時のパスワードをコマンドラインで指定する
-L 検索結果をLDIFv1形式で表示する
-LL 検索結果をコメントなしの形式で表示する
-LLL 検索結果をコメントとLDAPバージョン表示なしで表示する
例は下記のとおりです。
パスワードの変更
ldappasswd [オプションその1] [DN] [オプションその2] [ユーザDN]
[オプションその1]
-h LDAPサーバを指定する(省略時はローカルホスト)
-x SASLを使わず簡易認証を用いる
-D 認証に利用するDNを指定する
[オプションその2]
-W 現在のパスワードを対話的に入力する
-w 現在のパスワードをコマンドラインから入力する
-S 新しいパスワードを対話的に入力する
-s 新しいパスワードをコマンドラインから入力する
注:-sも-Sオプションも付けないとパスワードが自動的に生成される
例は下記のとおりです。補足(20150108問題解消)
●LDAPクライアントのインストール及び設定(CentOS 6、Fedora 15編)に
記載されているとおり、「pam_ldap.so」の記載位置を買えることにより解消しました。
CentOS 6で下記のとおり変更しようとしてもエラーが表示される。
$ ldappasswd -x -D "uid=test1000,ou=People,dc=bigbang,dc=dyndns,dc=org" -W -S
New password:
Re-enter new password:
Enter LDAP Password:
Result: Insufficient access (50)
passwdコマンドを使用してLDAPパスワードを変更した場合、
CentOS 5では成功するがCentOS 6では失敗する。
アカウントのロック
ロックするためのldifを作成します。
LDIFによるエントリの追加・削除・更新・識別名変更と未サポートのLDIF記述(詳細)
・エントリの追加
changetype行に“add”を指定し、次行から属性定義を記述します。
changetype行に“delete”を指定します。
エントリの属性、属性値に対して、追加、削除、置換を行うには、changetype行に“modify”を指定します。さらに、次行に変更方法を示す種別を指定します。
属性の変更種別は、以下の3つの中からどれか1つを指定します。
add: 属性名
dn行で指定したエントリに属性を追加します。その属性型がすでにエントリにある場合は、属性値を追加します。
delete: 属性名
dn行で指定したエントリから属性を削除します。その属性型に複数の属性値がある場合は、属性値すべてを削除します。複数の属性値のうち1つだけを削除する場合は、delete行の次の行で、属性名と属性値を記述します。
replace: 属性名
dn行で指定したエントリの属性を、指定した値で置き換えます。指定したエントリが指定した属性を持たない場合、その属性を作成します。
属性の変更種別を省略した場合、次のように解釈されます。
ldapmodifyコマンドで-rオプションを指定している場合:replace
ldapmodifyコマンドで-rオプションを指定していない場合:add
属性の変更種別の次の行には、変更する属性の内容を指定します。続けて複数の変更を記述する場合は、“-”(マイナス)で区切ります。次の書式で記述します。
属性の変更種別に“add”を指定します。
mail属性を追加する場合
属性の変更種別に“delete”を指定します。
description属性を削除する場合
属性の変更種別に“delete”を指定します。
User001のエントリ情報が次の状態であるとします。
属性の変更種別に“replace”を指定します。
mail を user001@mail.bigbang.mydns.jp から user777@mail.bigbang.mydns.jp に変更する場合
対象の属性値を削除してから、置き換える値で追加します。
User001のエントリ情報が次の状態であるとします。
changetype行に“modrdn”を指定します。さらに、次行にエントリの識別名変更の詳細方法を指定します。識別名変更の詳細方法は、以下の2つです。この順序で指定します。
1.newrdn: 新しいRDN
2.deleteoldrdn: (1|0)
新しいRDNに変更した後、古いRDNを削除する場合は“1”、属性値として残す場合は“0”を指定します。
“deleteoldrdn”は省略できます。省略すると古いRDNを削除します。次の書式で記述します。
●ldapsearchによる表示結果の違い
slapd.confの設定は下記のとおりです。
●slapcat
ユーザの登録や削除等はslapcatでも確認できます。
●slapd.conf
2016.4.21現在、slapd.confを直接編集するようなことはしません。
参照ページ:slapdの設定
2016.4.21現在、slapd.confを直接編集するようなことはしません。
/etc/openldap/slapd.confはサーバデーモンの設定ファイルです。OpenLDAPサーバの実行プログラムであるslapdの起動時に解析されるファイルであり、このファイルに記述された設定は、slapdのみでなく、slapadd、slapcat、slapindex……といった各SLAPDツールコマンドの実行時にも参照されています。
slapd.confファイルは、前半のOpenLDAPサーバ全体に適用される設定を記述する「グローバルセクション」と、それに続く後半のバックエンドデータベースに適用される「データベースセクション」より構成されています。後半のデータベースセクションは、「suffix」オプションを変えることで複数記述できるようになっています。
とりあえず試験として動作させるだけなら、ほとんど触る箇所はありません。最低限調整の必要な項目は下の数カ所だけです。
include
slapd.confファイル以外に読み込むファイルを指定します。前半のグローバルセクションにある「include」オプションには、core.schemaに加え、cosine.schema、nis.schemaが含まれている必要があります。これは、ユーザ認証に必要な「accountオブジェクトクラス」「posixAccountオブジェクトクラス」などを追加するために必要なスキーマが定義されているためです。
pidfile、argsfile
/etc/init.d/ldapでslapdはユーザldapの権限で動作します。/var/run/openldapディレクトリはオーナー、グループ共にldapである必要があり、755で設定します。
データベースの位置とスーパーユーザの指定
rootdnはLDAPの読み書き全ての権限を持つスーパーユーザのことで、上記のようにManagerというcnを指定する例が多いですが、adminやAdminも問題ありません。実際の認証の際には、大文字小文字は全く無視されますので、例えばldapdelete -x -D "cn=Admin,dc=bigbang,dc=dyndns,dc=org" ... としても認証はとおります。rootdnもsuffixの名前空間に必ず属していなければなりません(最近はそうでもようです。man slapd.confで確認してください)。スーパーユーザはデータベース上に実際に作成する必要はありません。
rootpwはrootdnのパスワードとなります。テキストでの記載はセキュリティ上、非推奨です。上記は"secret"という文字列をSSHA(ソルト付きSHA:デフォルト)でハッシュした文字列。こうしたハッシュを作成するためのツールはOpenLDAPに付属していて、
ただし、インデックスを作成するとその分ディスク容量が必要になるので必要に応じて作成するようにします。
書式は以下のとおりです。
最大の注意点は、この機構は、フロントエンドがLDAP Password Modify Extended Operation (RFC3062)に則って通信を行う場合にだけ働くということです。そうしたものには、例えば、ユーザ情報を一括管理するために利用するnss_ldap + PAMモジュールなどがあります。しかし、 OpenLDAPパッケージ付属ユーティリティのldapaddやldapmodifyはパスワード変更拡張手順を使しませんので、専らそれらを使ってデータを登録/変更するつもりであるのなら、このパラメータを{CRYPT}や{SSHA}に設定したとしても全く無駄ということになります。
つまり、ハッシュは行われず、元のテキストがBase64エンコードされた状態でuserPasswordに格納されます。逆に、フロントエンドアプリケーション自体がハッシュ機能を備えていてそれを有効にしている場合には、こちらのパラメータは{CLEARTEXT}にしておく必要があります。
最後に、このままの設定ではすべてのユーザがすべてのデータを読み書きできてしまいます。そのためユーザ自身のデータはすべて変更可能、匿名ユーザはすべてのuserPasswordをバインド可能、すべてのユーザはuserPassword以外のすべてのデータを読取り可能という設定をしました。
なお、rootdnはこのアクセス権限設定を無視してすべてのデータを変更可能です。
CentOS 5の場合(ここから)
CentOS 6の場合(ここから)
CentOS 6の場合(ここまで)
新しい設定を読み込ませるため、LDAPサーバを再起動します。
●slapd.conf設定内容の確認
2016.4.21現在、slapd.confを直接編集するようなことはしません。
slapd.confファイルに問題がある場合は、下記の例のように「config file testing succeeded」と表示されて終了するのではなく、問題の行まで解析が行われたところで、問題がある旨を示すメッセージが表示されます。slapd.confファイルに問題がある場合は、このメッセージを参考に問題点を修正することができます。
●ユーザ認証の設定
2016.4.21現在、slapd.conf等を直接編集するようなことはしません。
ここまでの設定で、ユーザ認証に必要なエントリがOpenLDAPサーバに登録されました。ここからは、LDAP認証を行うクライアント側の設定を説明していきます。
LDAPクライアントからOpenLDAPサーバに対してユーザ認証を行うには、LDAPクライアントとなるコンピュータ側で、どのLDAPサーバに対し、どのように問い合わせるかの設定が必要になります。具体的には、以下のファイルを変更する必要があります。
NSSの設定ファイルは/etc/nsswitch.confで、さまざまな「名前解決」に関する情報をどこから得るのかを設定します。
例えば、以下のような記述があったとします。
nss_ldapをインストールした際に作成された/etc/nsswitch.ldapは、以下のようにユーザやグループ情報をローカルファイル、LDAPサーバの順で検索するように設定された/etc/nsswitch.confのひな型です。
必要なパッケージをインストールします。
なお、PAMの設定を変更する場合は、必ず現在の設定ファイルをバックアップしてから行ってください。PAMの設定ファイルを間違って編集すると、ログインすらできなくなってしまう可能性があります。設定を変更する場合は、LDAP認証の動作確認が取れるまで、必ず1つはroot権限でログインした端末を残しておくことをお勧めします。万が一ログインできなくなった場合は、システムをシングルユーザモードで起動して設定を修正します。
CentOS 6の場合(ここから)
必要なパッケージをインストールします。
今まで、使用していた/etc/ldap.confは存在しないようです。
なお、PAMの設定を変更する場合は、必ず現在の設定ファイルをバックアップしてから行ってください。PAMの設定ファイルを間違って編集すると、ログインすらできなくなってしまう可能性があります。設定を変更する場合は、LDAP認証の動作確認が取れるまで、必ず1つはroot権限でログインした端末を残しておくことをお勧めします。万が一ログインできなくなった場合は、システムをシングルユーザモードで起動して設定を修正します。
これらの設定ファイルは、viなどのエディタを用いて1つ1つ手動で変更することも可能ですが、GUIツールを通して変更するほうが便利です。GUIツールを用いて変更作業を行うには、以下のコマンドを実行します。
system-config-authenticationコマンドの実行後に起動するGUI画面では、ユーザ情報タブ(画面1)で、LDAPサポートを有効にする(L)のチェックを選択します。
画面1 system-config-authenticationコマンドで起動するGUI画面
次に、LDAPの設定(D)ボタンをクリックして表示される画面(画面2)では、
画面2 LDAPの設定(D)ボタンをクリックして表示される画面
続いて、認証タブ(画面3)に移動し、ユーザ情報タブでの設定と同様に、LDAPサポートを有効にする(L)を選択します。LDAPの設定(D)ボタンをクリックして現れる画面には先に入力した情報が保持されているので、ここではそのままOK(O)をクリックし、GUIツールを終了します。
画面3 認証タブ画面
以上で、LDAPクライアントとなるコンピュータ上のPAMおよびNSS関連の設定ファイルの変更が完了しました。これで、LDAPサーバへ接続し、ユーザ認証ができるようになります。
●PAMを利用した認証
LDAP認証の設定が完了すると、PAMを利用するさまざまなプログラムからのLDAP認証が可能になります。これは、先ほど変更した/etc/pam.d/system-authファイルが、多くのプログラムから認証処理時に参照されているためです。例えば、以下のようなプログラムからも、/etc/pam.d/system-authファイルが参照されています。
それでは、OpenLDAPサーバに登録したユーザエントリを用いて、suコマンド、sshコマンドなどを用いてLDAP認証を行ってみましょう(注)。
●PAMを利用しないLDAP認証
このほか、PAMを経由したLDAP認証が実装されていないプログラムについては、別途、LDAPサーバへの接続方法を確認する必要があります。例えばApacheの場合は、Apache側で個別にLDAP認証のための設定を行う必要があります。●Apacheで作るファイルサーバ(LDAP認証編)を参照してください。
●PAM認証とは
ユーザにアクセス特権を与えるようなプログラムは、必ずと言っていいほどユーザの認証機能を有します。システムにログインする際に、ユーザはユーザ名とパスワードを提供し、ログインプロセスがその情報を使用してログインの認証、すなわちユーザが申請した身元が本人のものであることを検証します。パスワード以外の認証形式も可能であり、異なる方法でパスワードを格納することもできます。
PAM(Pluggable Authentication Modules)は認証プログラムをリコンパイルしなくても、システム管理者が認証ポリシーを設定できるようにする一つの方法です。PAMを使用する場合は、設定ファイルを編集することによってプログラムにモジュールをプラグインする方法を制御します。
login認証をLDAP認証に対応させた場合の認証処理の流れは下記のようになります。
PAMモジュールのタイプ
PAMには4つのタイプのモジュールがあります。
いつでも新しいモジュールを追加することができます。その場合、PAMを認識するアプリケーションにそれらのモジュールを使用させることができます。例えば、ワンタイムパスワードシステムを使用しており、かつそのシステムをサポートするようなモジュールを作成することができる場合 (モジュールの作成方法に関するドキュメントは、/usr/doc/pam* に含まれています)、リコンパイルや修正を実行しなくても、PAMを認識するプログラムは、新しいモジュールを使用し、新しいワンタイムパスワードシステムと連動することができるようになります。
PAMモジュールの制御フラグ
PAM設定ファイルの第2パラメータは、制御フラグをあわらしています。これは、モジュールタイプ別に、認証に関する制御の度合いを設定するためのフラグです。
ライブラリの種類
CentOS6のライブラリ。
サービス
PAMを使用する各プログラムは、独自の「サービス」名を定義します。loginプログラムはサービスタイプloginを定義し、ftpdはサービスタイプ ftpを定義します。等々。一般に、サービスタイプはサービスにアクセスするために使用されるプログラムの名前であり、サービスを提供するために使用されるプログラムの名前ではありません (違いがある場合)。
設定ファイル
ディレクトリ/etc/pam.dはすべてのPAMアプリケーションを設定するために使用されます。(以前のバージョンでは、これは/etc/pam.confでした。)各アプリケーション(実際は、各サービス)は独自のファイルを持っています。ファイルは以下のようになります。以下はCentOS6の例です。
最初のモジュールが失敗した場合であっても3つのモジュールのすべてがチェックされることに注意してください。これはセキュリティの決定です - 認証が拒否された理由をユーザに悟られないように設計されています。なぜならば、拒否された理由を知ることによって認証を突破することが容易になる可能性があるからです。この動きを変更するには、requiredをrequisiteに変更します。requisiteモジュールから失敗という結果が返された場合、その他のモジュールをコールすることなく、PAM認証は即座に失敗します。
5行目によって必要なアカウント処理が実行されます。たとえば、シャドウパスワードが有効な場合、pam_pwdb.soモジュールは、アカウントの期限が切れていないか、またはユーザがパスワードを変更していないか、およびパスワード変更に関する猶予期間が切れていないか、をチェックします。
6行目は新規に変更されたパスワードに対して一連のテストを実行することにより、そのパスワードがパスワードに対する辞書型攻撃プログラムによって簡単に判明するものでないこと、などを確認します。
7行目(複数行になることもあります)によって、loginプログラムがユーザのパスワードを変更する際には、pam_pwdb.soモジュールを使用させることを指定しています(そのようなことが行われるのは、シャドウパスワードの期限が切れた場合などに、authモジュールがパスワードを変更する必要があると判断した場合に限られます)。
最後の8行目は、pam_pwdb.soモジュールを使用してセッションを管理することを指定しています。現在のところ、このモジュールは何も行いません。したがって、必要なモジュールと置き換える(またはスタックすることで補足する。)ことができます。
各ファイル内の行の順序が重要であることに注意してください。実際にはrequiredモジュールのコール順序はさして重要ではない一方で、その他の制御フラグを利用することができます。optionalが使用されることはめったになく、Linuxシステムでデフォルトで使用されることはまったくありません。sufficientおよびrequisiteでは順序が重要になります。
例として、rlogin用のauth設定を見てみましょう。
まず、pam_securetty.soは、安全ではないターミナルからrootのログインが行われないようにします。これにより、rootによるrlogin試行のすべてが効果的に拒否されます。許可したい場合(その場合には、インターネットに接続しないか、または優れたファイアウォールを設置することをお奨めします) には、この行を削除するだけで済みます。
第二に、pam_rhosts_auth.soによるユーザ認証が成功した場合、PAMはパスワードチェックを実行せずに、ただちにrloginに対して成功という結果を返します。pam_rhosts_auth.soによるユーザ認証が失敗した場合、その失敗した認証は無視されます。
第三に、pam_rhosts_auth.soによるユーザの認証が失敗した場合には、pam_pwdb.soモジュールによる通常のパスワード認証が実行されます。
最後に、上記で指定したようにしてpam_nologin.soが/etc/nologinをチェックします。
securettyチェックが失敗した場合にパスワードの入力を要求したくない場合には、pam_securetty.soモジュールをrequiredから requisiteに変更すれば良いことに注意してください。
シャドウパスワード
pam_pwdb.soモジュールはシャドウパスワードが使用されていることを自動的に検出し、必要な調整処理をすべて実行します。
●SSHの公開鍵をLDAPで管理する(ソース編)
参照したページは下記のとおりです。
第6回 OpenSSHの公開鍵をLDAPで管理
LDAPでSSHの鍵認証を利用してみる
OpenSSH の公開鍵を LDAP で管理
SSHの公開鍵をLDAPで管理
このページにも記載されているとおり、公開鍵認証方式を使用することが当たり前になってきた昨今、管理対象マシンが2、3台のうちならいいのですが、これが10台、20台となってきた場合、これまでの方法では1台1台に公開鍵を登録しては削除すると言う作業が非常に煩雑となります。
これを解消する方法がLDAPによる公開鍵管理手法です。
しかし、RPMパッケージで配布されているものはLDAPに対応していません。そこでOpenSSHのソースをダウンロードし、それにlpkのパッチ(OpenSSH LDAP Public Keys)を適用しLDAP上に格納されている公開鍵をsshdプロセスから参照させるようにします。
今回はソース・パッチ共に5.8p1を使用します。
次にLDAPサーバ側での操作です。既に登録してあるtest1001というユーザを利用し、次のように、公開鍵用の属性とオブジェクトクラスを追加します。変更部分はldapPublicKeyというオブジェクトクラスとsshPublicKeyという公開鍵用の属性です。この中にはid_rsa.pubやauthorized_keys2の中に1行で記録されている鍵情報をそのまま登録します。
このエントリをLDAP上に登録します。
●自己環境用のLDAPサーバの構築を参照してください。
次にsshdプロセスがLDAPサーバを検索できるよう、/etc/ssh/sshd_config(上書きしなかった場合は/usr/local/etc/sshd_config)を修正します。下記のようにLDAP関連のオプションを有効にします。
準備ができたら、sshdプロセスを起動させ、クライアントから接続を行ってみます。
あとは秘密鍵をクライアント側にコピーし、鍵認証で接続できるか確認してみましょう。.sshディレクトリがなくても接続できるはずです。
ただし、ログイン時にサーバ側に該当ユーザのホームディレクトリが無い場合は、下記のようなエラーが表示されます。
ここで忘れてはならないのは「yum」によるopensshの自動更新の除外設定です。
●SSHの公開鍵をLDAPで管理する(RPM編)
OpenSSHサーバのインストールは済んでいるものとします。
サーバ側の作業として下記を実施します。
1.OpenSSHのLDAPサポートパッケージのインストール
2.OpenLDAP設定ファイル編集
3.LDAP情報の更新
4.LDAPサーバに各ユーザの公開鍵を登録
OpenSSHのLDAPサポートパッケージをインストールします。
必要であればLDAP情報を更新します。
準備ができたら、sshdプロセスを起動させ、クライアントから接続を行ってみます。
あとは秘密鍵をクライアント側にコピーし、鍵認証で接続できるか確認してみましょう。.sshディレクトリがなくても接続できるはずです。
ただし、ログイン時にサーバ側に該当ユーザのホームディレクトリが無い場合は、下記のようなエラーが表示されます。
●LDAPのレプリケーション
LDAP Syncレプリケーションは、現在OpenLDAPの標準として開発が進められているレプリケーション方式です。LDAP SyncレプリケーションにはrefreshOnlyとrefreshAndPersistの2つのモードがあります。
参照ページ:LDAP Sync 複製
LDAP Syncレプリケーション
LDAP Syncレプリケーションは、コンシューマ(スレーブサーバ)からプロバイダ(マスタサーバ)にレプリケーションの要求を送信するPULL型の仕組みを採用しています。
LDAP Syncレプリケーションには「refreshOnly」と「refreshAndPersist」という2つのモードがあります。
refreshOnlyモードは、コンシューマが同期要求をプロバイダに送信します。プロバイダはコンシューマとの間で更新差分があるエントリの情報を、コンシューマに対して送信します。コンシューマは、プロバイダから送信されたエントリ情報を受け取り、自身のデータに反映します。後は、この処理を定期的に繰り返すことで、データの同期を行います。
refreshOnlyモードでの処理の流れ
refreshAndPersistモードでは、最初にコンシューマがrefreshOnlyモードと同様の方法で自身のデータとプロバイダのデータを同期させます。データの同期が完了した後、プロバイダは更新要求を受け付けるごとに、更新したエントリの情報をコンシューマに送信します。
そして、コンシューマは受け取ったエントリ情報を自身のデータに反映します。以上のことから、refreshAndPersistモードのレプリケーションは同期的なタイミングのレプリケーションであるといえます。
refreshAndPersistモードでの処理の流れ
LDAP Syncレプリケーションは、現在OpenLDAPの標準として開発が進められているレプリケーション方式です。LDAP SyncレプリケーションにはrefreshOnlyとrefreshAndPersistの2つのモードがありますが、今回はrefreshAndPersistモードの設定を行います。
プロバイダ、コンシューマの「slapd.conf」に、前項で解説したBDBバックエンドの設定を行います。ここではindexにentryCSN、entryUUIDを設定しています。LDAP Syncレプリケーションでは内部処理として、entryCSNおよびentryUUIDの検索を頻繁に行うため、インデックスを作成することで、レプリケーションの性能向上をはかっています。
さらに、プロバイダ、コンシューマのslapd.confに次の設定をそれぞれ追加します。
上記の例での同期検索は、dc=bigbang,dc=dyndns,dc=orgをベースとしたサブツリー全体に対し、objectClassがorganizationalPersonであるエントリを検索します。取得する属性はcn、sn、ou、telephoneNumber、title、lです。スキーマ検査は無効にしてあるので、コンシューマslapd(8)はプロバイダslapd(8)から得た更新情報の処理時にエントリのスキーマ検査を行いません。コンシューマでは、syncprovオーバーレイを有効にしています。オーバーレイとは、OpenLDAPの機能拡張モジュールのことで、syncprovはLDAP Syncレプリケーションにおけるコンシューマの機能を追加します。
コンシューマでは、searchbaseにsuffixで指定した「dc=bigbang,dc=dyndns,dc=org」を設定しています。レプリケーションの対象は、searchbaseで設定したDN(Distinguished Name)配下のエントリになるので、「dc=bigbang,dc=dyndns,dc=org」を設定することで、LDAPサーバの全エントリをレプリケーションするようにしています。
syncrepl
●DB_CONFIG
データベースのパラメータファイルをコピーします。
●ログレベルの選択
必要なログのみを出力するようにログレベルをカスタマイズする方法を説明します。OpenLDAPサーバのログは、次の一覧に示す値を用いて、1つまたは複数のログ出力内容を選択できます。
デフォルトでは10進数で"256"、または文字列で"stats"に当たるログがsyslogに送付されています。デフォルト設定では、基本的なOpenLDAPサーバの管理に有効な
実運用時のログレベルの選択は、例えばデフォルトのログレベルなど、必要最低限の内容に絞っておくとよいでしょう。これは、ログの出力が、性能劣化やディスク領域の圧迫につながるからです。さらに、出力量が多くなる詳細なログを取得している場合は、多くの情報に埋もれ、かえって問題の概要がつかみにくくなってしまうという理由もあります。
もちろん、すでに問題が発生している状況では、より詳細なログを取得し調査する必要があります。
●ログレベルの変更
これまで使用されていたsldap.confは利用されなくなりました。これに代わり、olc*****のようなものを使用し設定することになっています。
ログレベルの変更は下記のように実施します。
ただし、statsを有効にするとログサイズが1日で数Gbyteになってしまうこともありますので注意が必要です。
ログレベルの指定は、次のように、slapd.confのグローバルセクションにloglevelディレクティブを用いて行うことができます。
●ログの削除
次は、ログの削除について説明します。このログ削除を怠って運用を続けていると、肥大化したログがディスク領域を圧迫しかねないので注意が必要です。
最も簡単なOpenLDAPサーバのログ削除は、ログローテートを利用する方法です。
●Berkeley DBのトランザクションログファイル
実際のOpenLDAPサーバの運用においては、OpenLDAPサーバが出力するログのほか、エントリ情報を蓄積するバックエンドデータベースのログファイルについても考慮しておく必要があります。ここでは、OpenLDAPサーバがデフォルトで採用するバックエンドデータベースBerkeley DBを対象にして、ログファイルの管理方法を説明します。
次の表は、OpenLDAPサーバのデータディレクトリに作成されるファイル一覧です。
上記一覧中の、ファイル名が「log.」で始まり連番が付与されるファイルが、管理対象となるBerkeley DBのトランザクションログファイルです。
●トランザクションログファイルの削除
Berkeley DBのトランザクションログファイルの削除方法は、大きく分けて、
管理者が手動で削除を行う方法では、db_archive -dコマンドを利用します。
定期的にトランザクションログファイルをバックアップディレクトリに退避するような運用を行っている場合は、退避する前に削除してしまわないよう、db_archive -dコマンドを実行するタイミングに注意が必要です。
一方のBerkeley DBに自動で削除を行わせる方法では、Berkeley DBの設定ファイルであるDB_CONFIGファイルに"DB_LOG_AUTOREMOVE"フラグを指定します。
●OpenLDAPサーバのアクセスログ
アクセスログとは、OpenLDAPサーバにモジュールを追加することで利用可能となる機能であり、アクセス状況を把握する目的で利用されます。このアクセスログは、指定するバックエンドデータベースに対して行われたbind(認証)、add(追加)、modify(変更)といった指定する操作を、ファイルではなく別のバックエンドデータベースへ記録することができます。また、記録したログはldapsearchにて条件を絞り込んで参照できます。
CentOSにバンドルされるOpenLDAPサーバ(openldap-serversパッケージ)には、アクセスログモジュールが含まれていません。CentOS 5.3以降、アクセスログなどのオーバレイ機能は、openldap-servers-overlaysパッケージとして、別途、提供されています。
また、アクセスログは、OpenLDAPサーバのコンパイル時にも、デフォルトでは含まれないオプションです。この機能を利用するには、コンパイルの過程で"--enable-accesslog=yes"または"--enable-overlays=yes"など、明示的にオプションを追加する必要があります(注)。
ここでは、OpenLDAPサーバ側の設定を行う前に、アクセスログを記録するバックエンドデータベースを配置するディレクトリを"var/openldap-accesslog"として準備します。
上記の設定例では、「あるエントリのユーザが、直近の1週間で、このOpenLDAPサーバを認証に利用できているか」を確認するアクセスログを取得することを目的としています。このような設定は、例えば、不要なエントリをクリーンアップする際に、現在もシステムを利用しているのか、それとも長くシステムを利用しておらず削除候補となるユーザのエントリであるのかの判定に応用することができます。
設定変更後は、OpenLDAPサーバを再起動してアクセスログへの記録を開始します。
次のコマンド例では、ここまでに説明したアクセスログ設定を行い、アクセスログが蓄積された後、特定エントリ(uid=test1000,ou=People,dc=bigbang,dc=dyndns,dc=org)の認証が成功した記録を確認するため、reqDN属性を条件に検索を行っています。
●アクセスログに設定可能なディレクティブ一覧
アクセスログモジュールでは、次のディレクティブが利用可能です。
●バックアップ
データのバックアップにはオンラインバックアップが可能なslapcatコマンド(データをLDIFファイル形式で出力)を利用します。
全データをバックアップする場合は以下のようになります。
●phpLDAPadminのインストール
まず、次のコマンドを実行してみます。
そこで、この問題を避けるために、yum-plugin-prioritiesを導入します。
phpLDAPadminの設定ファイルを編集します。
rewriteを有効にする。
・RewriteLog "logs/rewrite_log"(参考)
rewrite動作のログファイル指定。Windowsなら"logs/rewrite.log"の方が扱いやすい。
・RewriteLogLevel 0(参考)
rewriteのログレベル指定。「1」にするだけで膨大なログが出るので、デバッグが終わったら「0」にしないと大変なことになる
・RewriteCond %{SERVER_PORT} !^443$
サーバ(apache)へのアクセスポートが443番では無かったら(即ち、httpsでのアクセスではなかったら)、以下のルールを適用するという意味。
・RewriteRule
必要な分を1行づつ記述していくが、基本は正規表現でマッチングをとり、一致したらHTTPSにrewriteさせる
●Postfixとの連携
LDAPを利用するので、以下の項目に関して事前に決めておきます。
OpenLDAPの設定を行います。LDAP標準のschemaではpostfixを使う際に色々不足しているので、新たにschemaを作成します。
ページに提示しているmail.schemaの場合、既存のLDAPツリーにぶら下がっている各スタッフのエントリーにmailUserやmailGroup objectClassを追加することができませんので、これらを追加できるようにする変更を行います。また、attributeにて定義してあったhomeDirectoryは既に別の用途に利用しているため、これをメール配信用のディレクトリにするのもよくありません。したがって、新たにmailDirectoryというattributeを追加することにしました。そのため、メールボックスはこの属性で指定することになります。
●root によるパスワードのリセットはサポートされません。
CentOS 7でpasswdでLDAPユーザのパスワードを変更しようとすると、「root によるパスワードのリセットはサポートされません。」と表示されパスワードの変更ができません。
/var/log/secureに下記のようなログが記録されていました。
●getent passwdで表示されない
CentOS 7でgetent passwdを実行してもLDAPユーザが表示されなくなってしまいました。/etc/pam.d以下をいろいろ変更していたのが原因かもしれません。
原因は/etc/nsswitch.confを変更したことでした。このファイルを下記のとおり修正したところ表示されるようになりました。
●LDAPユーザで登録されているユーザでpasswdでパスワードが変更できない
それぞれのサーバの環境は下記のとおりです。
1 サーバ情報
サーバ#1:nezumi、192.168.0.4
サーバ#2:centos6、192.168.0.12
2 共通点
3 異なる点
sssdはcentos6のみで動作。サーバnezumiでのpasswdよるLDAPパスワード変更は可能ですが、サーバcentos6では変更できません。
●Suppressed ???? messages from /system.slice/slapd.serviceが/var/log/messagesに記録される
参考URL:syslogの溢れ対策
5分毎に/var/log/messagesに「Suppressed 5768 messages from /system.slice/slapd.service」が記録されていることに気がつきました。
5758件のメッセージが溢れたことを意味しています。
この溢れを対処するため、journald.conf及びrsyslog.confを編集します。
●「bdb_equality_candidates: (uid) not indexed」が/var/log/slapd.logに頻繁に記録される
参考URL:OpenLDAP - 「bdb_equality_candidates」エラーの対応方法
「bdb_equality_candidates: (uid) not indexed」が/var/log/slapd.logに頻繁に記録されることに気がつきました。
下記のように対処することにより、記録されなくなりました。
この作業後、ログサイズが非常に小さくなりました。
ディレクトリサーバとは、ネットワーク上でユーザ情報、組織情報などを保存、管理し、分散しているクライアントに対しこれらの情報を提供するサーバです。また、管理する情報に対するアクセスコントロールも提供します。
したがって、クライアントはディレクトリサーバでの認証後、許可された操作を行うことになります。このため、サーバ/クライアント間でのプロトコルが必要ですが、現在主に使われているのがLDAP(Lightweight Directory Access Protocol)です。
LDAPサーバは、商用製品ではマイクロソフトのActive Directory、サン・マイクロシステムズのSun Java System Directory Server、ノベルのeDirectoryなどが有名です。オープンソースでは、OpenLDAPのほか、Fedora Directory Server、Apache Directory、OpenDSなどがあります。
OpenLDAPの情報は下記URLを参照してください。
OpenLDAP 情報
ディレクトリサーバのメリット
個人で利用するコンピュータや、比較的小規模のオフィスにおいては、ユーザ情報はそれぞれのコンピュータで管理されることが多いでしょう。
しかし、例えば数十人、またはそれを超える大規模の組織でユーザ情報を管理する場合は、それぞれのコンピュータで個別に管理するよりも、専用サーバ上で管理する方が、都合がよいでしょう。
また、ディレクトリサービスを活用することでアプリケーションサーバやWebサーバと連携させてシングルサインオン環境や、Active Directoryで管理されるWindowsユーザを統合したアカウント管理へと発展させることも可能です。
逆に、管理情報が各コンピュータに分散していれば、その数だけメンテナンスに掛かる手間が増えることになります。
●ディレクトリサーバ設計のポイント
スキーマ設計
「ディレクトリ情報を集中管理できる」というメリットを持つディレクトリサーバですが、利用に当たってはディレクトリ情報として格納する各エントリに、どのような情報を持たせるかを定義する必要があります。
この定義には、ディレクトリサービスを利用するクライアント側の用途に基づいて、ディレクトリサーバに蓄積する必要があるデータを選定し、そのデータをディレクトリサーバが扱うことのできるデータ型へと落としていく作業が必要になります。
ディレクトリサーバが扱うデータ型としては、標準的に利用されるものがあらかじめRFCに定義されています。OpenLDAPでは[OpenLDAPインストールDir]/etc/openldap/schema/ディレクトリにこれらのデータ型を定義したファイルが用意されています。
# less [OpenLDAPインストールDir]/etc/openldap/schema/README File Description ---- ----------- corba.schema Corba Object core.schema OpenLDAP "core" cosine.schema COSINE Pilot dyngroup.schema Dynamic Group (experimental) inetorgperson.schema InetOrgPerson java.schema Java Object misc.schema Miscellaneous Schema (experimental) nis.schema Network Information Service (experimental) openldap.schema OpenLDAP Project (FYI) ppolicy.schema Password Policy Schema (work in progress)
オブジェクトクラスの設計
例えば、Linuxクライアントからのユーザ認証に、/etc/passwdファイルではなくディレクトリサーバを利用する場合、LinuxはPAM(pam_ldap.so)を利用します。
PAMは、認証対象のユーザがディレクトリサーバに存在することを確認するため、サーバ内の「posixAccount」オブジェクトクラスの「uid」属性を検索します。この「posixAccount」オブジェクトクラスの利用には、OpenLDAPが提供するnis.schemaファイルにあらかじめ用意されている定義を利用することができます。
# less [OpenLDAPインストールDir]/etc/openldap/schema/nis.schema objectclass ( 1.3.6.1.1.1.2.0 NAME 'posixAccount' DESC 'Abstraction of an account with POSIX attributes' SUP top AUXILIARY MUST ( cn $ uid $ uidNumber $ gidNumber $ homeDirectory ) MAY ( userPassword $ loginShell $ gecos $ description ) )上記のnis.schemaファイルの内容から、「posixAccount」オブジェクトクラスは
- オブジェクトIDは、"1.3.6.1.1.1.2.0"
- "top"という上位クラスから派生した補助型(AUXILIARY)のオブジェクトクラス
- cn、uid、uidNumber、gidNumber、homeDirectoryの各属性を必須で備える
- userPassword、loginShell、gecos、descriptionの各属性を任意に備えることができる
このオブジェクトクラスは、構造型(STRUCTURAL)、補助型(AUXILIARY)、抽象型(ABSTRACT)の3つに分類され、各エントリには構造型のオブジェクトクラスを必ず含めるという制約があります。
このため、Linuxのユーザ認証という用途で利用する場合、ユーザエントリには、構造型のオブジェクトクラス、例えばcosine.schemaファイルにあらかじめ用意された「account」オブジェクトクラスなどを加えることになります。次のLDIFファイル(LDAP Data Interchange Format: LDAPエントリをテキスト形式で表現したファイル)は、posixAccountオブジェクトクラスを利用する場合に必要となる定義を行った例です。
# less sample_1.ldif dn: uid=test1,ou=People,dc=bigbang,dc=dyndns,dc=org objectClass: account objectClass: posixAccount objectClass: shadowAccount uid: test1 cn: test1 uidNumber:5001 gidNumber:5001 homeDirectory: /home/test1 userPassword: password ...[略]
●「継承」の概念
このほか、オブジェクトクラスには継承という概念があります。構造型のオブジェクトクラスとして「account」オブジェクトクラスではなく、例えばinetorgperson.schemaファイルに用意された「inetOrgPerson」オブジェクトクラスを追加することを選択した場合、ユーザエントリには、「account」オブジェクトクラスを選択した場合のエントリと比較し、「sn」属性が追加で必要になります。
次のLDIFファイルは、inetOrgPersonオブジェクトクラスを利用する場合に必要となる定義を行った例です。
# less sample_2.ldif dn: uid=test2,ou=People,dc=bigbang,dc=dyndns,dc=org objectClass: inetOrgPerson objectClass: posixAccount objectClass: shadowAccount uid: test2 cn: test2 sn: test2 uidNumber:5002 gidNumber:5002 homeDirectory: /home/test2 userPassword: password ...[略]これは、「inetOrgPerson」オブジェクトクラスが「organizationalPerson」オブジェクトクラスを継承し、さらにその「organizationalPerson」オブジェクトクラスが継承する「person」オブジェクトクラスにおいて、「sn」を必須の属性として定義しているためです。

図1 オブジェクトクラスの継承
# less [OpenLDAPインストールDir]/etc/openldap/schema/inetorgperson.schema objectclass ( 2.16.840.1.113730.3.2.2 NAME 'inetOrgPerson' DESC 'RFC2798: Internet Organizational Person' SUP organizationalPerson STRUCTURAL MAY ( ...[略] ) # less [OpenLDAPインストールDir]/etc/openldap/schema/core.schema objectclass ( 2.5.6.7 NAME 'organizationalPerson' → inetOrgPersonはorganizationalPersonを継承 DESC 'RFC2256: an organizational person' SUP person STRUCTURAL MAY ( title $ x121Address $ registeredAddress $ destinationIndicator $ ...[略] ) objectclass ( 2.5.6.6 NAME 'person' → organizationalPersonはpersonを継承 DESC 'RFC2256: a person' SUP top STRUCTURAL MUST ( sn $ cn ) ← personhaはsn、cnを必須属性として持つ MAY ( userPassword $ telephoneNumber $ seeAlso $ description ) ) ...[略] )このように、スキーマを設計する作業においては、LDAPクライアントが必要とする情報を、ディレクトリサーバが扱うデータ型へと落としていくことになりますが、その過程ではオブジェクトクラスの持つ制約にも注意しながら作業を進める必要があります。
属性設計
オブジェクトクラスに任意属性、必須属性として定義された各属性もそれぞれがオブジェクトIDを持ち、属性値を比較するルール、属性値が取り得る構文(いわゆる型)などが定められています。
例えば、posixAccountオブジェクトクラスに必須属性として定義されたuidNumber属性は、
- オブジェクトIDは、"1.3.6.1.1.1.1.0"
- 等価比較する場合のルール(EQUALITY)は、数値の一致
- 属性値は、数値型(Integer)で構成される(SYNTAX)
- 複数の値は取らない(SINGLE-VALUE)
# less [OpenLDAPインストールDir]/etc/openldap/schema/core.schema # Attribute Type Definitions # builtin #attributetype ( 1.3.6.1.1.1.1.0 NAME 'uidNumber' # DESC 'An integer uniquely identifying a user in an administrative domain' # EQUALITY integerMatch # SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )また、同じくposixAccountオブジェクトクラスに必須属性として定義されたhomeDirectory属性は、
- オブジェクトIDは、"1.3.6.1.1.1.1.3"
- 等価比較する場合のルール(EQUALITY)は、大文字/小文字を区別する
- 属性値は、International Alphabet 5(ASCII文字列)で構成される(SYNTAX)
- 複数の値は取らない(SINGLE-VALUE)
# less [OpenLDAPインストールDir]/etc/openldap/schema/core.schema attributetype ( 1.3.6.1.1.1.1.3 NAME 'homeDirectory' DESC 'The absolute path to the home directory' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )このような属性の定義を把握することで、対象となる属性にはどのような値の設定が可能か、検索時にはどのような比較が行われ、どのようなタイプのIndexを作成するべきかの判断が容易になります。
このほか、属性もオブジェクトクラスと同様に、上位の属性の持つ性質を継承することができます。例えば、core.schemaファイルで定義される属性cn、snは、属性nameの持つ、
- 等価比較する場合のルール(EQUALITY)は、大文字/小文字を無視する
- 部分文字列を比較する場合のルール(SUBSTR)は、大文字/小文字を無視する
- 属性値は、Directory String(UTF8文字列)で構成され(SYNTAX)32768文字まで
# less [OpenLDAPインストールDir]/etc/openldap/schema/core.schema # system schema #attributetype ( 2.5.4.3 NAME ( 'cn' 'commonName' ) # DESC 'RFC2256: common name(s) for which the entity is known by' # SUP name ) attributetype ( 2.5.4.4 NAME ( 'sn' 'surname' ) DESC 'RFC2256: last (family) name(s) for which the entity is known by' SUP name ) ...[略] # system schema #attributetype ( 2.5.4.41 NAME 'name' ← 7行上、3行上から継承 # EQUALITY caseIgnoreMatch # SUBSTR caseIgnoreSubstringsMatch # SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} )このように、各属性の持つ定義に加え、継承という概念を理解することで、属性の拡張が必要となった場合の作業を容易に進めることができるようになります。
●そのほかの留意事項
DIT(Directory Information Tree)設計
ディレクトリ情報を集中管理できるディレクトリサーバですが、一方でデメリットもあります。
ディレクトリサーバは、ユーザID、パスワードなどのユーザ情報を一元管理しているため、ディレクトリサーバそのものに障害が発生した場合、組織内のユーザはコンピュータにログインすることすらできなくなる可能性があります。コンピュータを中心にして活動している企業では、企業活動が停止してしまいかねません。
この問題に対して、OpenLDAPはレプリケーションによるディレクトリ情報の冗長化を提供しています。
OpenLDAPのレプリケーション機能は、DIT(Directory Information Tree:ディレクトリ情報ツリー)の特定の階層以下を指定して、レプリケーションできるというものです。このため、ディレクトリ全体でなく特定の階層から下のみを冗長化させることを予定している場合、DITの設計時には、レプリケーションさせるディレクトリ情報の階層を意識して設計を進める必要があります。

図2 レプリケーションのイメージ
また、OpenLDAPはディレクトリ情報の一部の管理を、ほかのサーバへ委譲する機能を持ちます。この機能を利用することによりサーバ管理者はディレクトリ情報の管理を分担して行えることができるようになります。
ディレクトリ情報を切り分ける単位はDITのサブツリーとなるため、この機能を利用する場合も、DITの設計時に、権限を委譲しディレクトリ情報を分散させる階層を意識して設計を進める必要があります。

図2 レプリケーションのイメージ
レプリケーション設計
多くの商用ディレクトリサーバが、マスタ兼スレーブサーバとして動作することができるマルチマスタレプリケーションをサポートしているのに対し、 OpenLDAPは最新のメジャーバージョンである2.4系まで、マルチマスタを正規の機能としてサポートしていませんでした。
現時点でStable版とされている2.3.xでは、マルチマスタ機能は試験的なサポートにとどまっています。また、2.4系でのマルチマスタ構成はまだ実績が少ないことから、現時点においてのOpenLDAPでのレプリケーション構成はシングルマスタの採用が堅実と考えられます。
また、OpenLDAPのレプリケーション方式には、slurpd方式とsyncrepl方式の2つがあります。slurpd方式は、信頼性が低く、同期が取れなくなることがあり、その場合は手動での同期が必要になるといった理由で2.4系では削除されています。反対に、syncrepl方式は同期を取るために必要な手間が少ないというメリットがあるため、今後はこちらが主要なレプリケーション方式としての利用、開発が進むことになります。
さらに、syncrepl方式には非同期的なタイミングで複製を行うrefreshOnlyモードと、同期的なタイミングで複製を行うrefreshAndPersistモードがあります。マスタ-スレーブ間で更新データの複製タイミングの遅れが問題となり得る場合は、refreshAndPersistモードの採用を検討することになります。
負荷への対策
ディレクトリサーバはディレクトリ情報を一元管理しているため、導入前には個々のコンピュータで行われていたユーザID、パスワードを用いた認証要求や、ユーザ名、グループ名、メールアドレスといったディレクトリ情報の検索要求が集中することになります。この結果、サーバ負荷が増大する可能性もあります。
この問題に対してOpenLDAPは、レプリケーション機能による冗長化構成を用いてのアクセス負荷の分散や、バックエンドデータベースにIndexを作成したバックエンドデータベース自体の検索処理の高速化といった対策を用意しています(このほか、LDAPクライアント側では、一度取得したディレクトリ情報を一定時間キャッシュすることにより、ディレクトリサーバへのアクセス数を抑制するといった対処が可能です)。
クライアント数が多く、ディレクトリサーバへのアクセスが多い大規模な組織で利用する場合や、特定時間内でのアクセスが極端に多くなるような利用が見込まれる場合は、ディレクトリサーバに掛かる負荷への対策には特に注意が必要です。
セキュリティ
ディレクトリサーバは情報を一元管理するため、導入前には個々のコンピュータで管理されていたパスワードなどの情報を、ディレクトリサーバは組織内のユーザ数の分、まとめて管理することになります。万が一、ディレクトリサーバが侵入を受けてしまうと、組織内のさまざまな情報がまとめて流出することになりかねません。
このリスクに対して、OpenLDAPはパスワードを平文で保存せずに、ハッシュ関数などで暗号化した状態で保存する機能を提供しています。また、OpenLDAPはクライアントからの通信経路をSSL/TLSで暗号化する機能も備えています。暗号化された経路より受け取ったパスワードを、同じハッシュ関数を利用し比較することで、すでにハッシュ化されて保存されたパスワードと一致するかを確認することができます。
このほか、OpenLDAPでは、認証に必要な情報をOpenLDAPが持つバックエンドデータベース内に保存せずに、外部のSASL(Simple Authentication and Security Layer)データベースやKerberosデータベースに保存し、利用する機能を提供しています。ディレクトリサーバの設計時には、アクセスコントロールリストの設定も含め、他人に知られたくないパスワードなどの情報をどのように扱うかを検討する必要があります。
運用管理
前述したとおり、組織内のディレクトリ情報を一元管理するため、万が一、ディレクトリサーバに障害が発生するとその影響は甚大です。管理者はサーバの運用に問題が生じていないかを把握し、問題が発生した場合にはその原因を早急に特定し、障害から復旧させるよう努める必要があります。
一般のサーバプログラムと同様、OpenLDAPにも動作ログをsyslogへ送る機能があり、ログレベルを指定することができます。健全なディレクトリサーバの運用のため、必要な範囲のログを出力させ、管理する必要があります。
また、一般に更新頻度が少ない情報が格納されるディレクトリサーバですが、管理者は、万が一の場合に備えてディレクトリ情報のバックアップを取得する必要があります。データの保全作業は、ディレクトリサーバを適用する組織が大きくなればなるほど重要性も増す作業です。
OpenLDAPにもバックアップ、リストアを行うコマンドが付属しています。実運用を開始する前に定期的なバックアップのスケジュールを計画し、運用条件に合わせ、これらのコマンドを利用したデータの保全策を確認しておく必要があります。
●OpenLDAPのインストール及び設定(CentOS 6、7編)推奨版
OpenLDAPのサーバとクライアントをインストールします。
CentOS 6の場合 # yum -y install openldap-servers openldap-clients # cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG # chown ldap. /var/lib/ldap/DB_CONFIG # /etc/rc.d/init.d/slapd start # chkconfig slapd on CentOS 7の場合 # yum -y install openldap-servers openldap-clients # cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG # chown ldap. /var/lib/ldap/DB_CONFIG # systemctl start slapd # systemctl enable slapdOpenLDAPの管理者パスワードを設定します。
# slappasswd New password: Re-enter new password: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxx # vi chrootpw.ldif dn: olcDatabase={0}config,cn=config changetype: modify add: olcRootPW olcRootPW: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxx # ldapadd -Y EXTERNAL -H ldapi:/// -f chrootpw.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry "olcDatabase={0}config,cn=config"ldapsearchで先ほどのパスワードが設定されているか確認します。
# ldapsearch -x -LLL -D "cn=config" -W -b "cn=config" '(objectClass=*)' Enter LDAP Password: dn: cn=config objectClass: olcGlobal cn: config olcConfigFile: /usr/share/openldap-servers/slapd.conf.obsolete olcConfigDir: /etc/openldap/slapd.d olcAllows: bind_v2 olcArgsFile: /var/run/openldap/slapd.args ~以下、省略~ パスワードを間違えると下記のように出力されます。 ldap_bind: Invalid credentials (49)CentOS 7の場合、基本的なスキーマを読み込ませます。
# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "cn=cosine,cn=schema,cn=config" # ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "cn=nis,cn=schema,cn=config" # ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "cn=inetorgperson,cn=schema,cn=config"インストールした状態ではDNがdc=my-domain,dc=comで設定されていますので、これを自分のドメインに修正します(dc=bigbang,dc=dyndns,dc=org部分を適宜修正)。
またこれ以降の作業でldapaddまたはldapmodifyコマンドを実行後、下記のようなエラーが表示される場合があります。
ldap_modify: Inappropriate matching (18) additional info: modify/add: olcRootPW: no equality matching rule ldapmodify: modify operation type is missing at line 2, entry "**********"このようにどうしようもなくなった場合、一度OpenLDAP等をアンインストールする、所定のフォルダを削除する等の作業を実施して、再度OpenLDAP等をインストールしてください。
# yum -y remove openldap-servers openldap-clients # rm -rf /var/lib/ldap # rm -rf /etc/openldap # yum -y install openldap-*このように最初から作業をやり直すことをおすすめします。
# vi chdomain.ldif dn: olcDatabase={1}monitor,cn=config changetype: modify replace: olcAccess olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read by dn.base="cn=Manager,dc=bigbang,dc=dyndns,dc=org" read by * none dn: olcDatabase={2}bdb,cn=config changetype: modify replace: olcSuffix olcSuffix: dc=bigbang,dc=dyndns,dc=org dn: olcDatabase={2}bdb,cn=config changetype: modify replace: olcRootDN olcRootDN: cn=Manager,dc=bigbang,dc=dyndns,dc=org dn: olcDatabase={2}bdb,cn=config changetype: modify add: olcRootPW olcRootPW: {SSHA}******************************** dn: olcDatabase={2}bdb,cn=config changetype: modify replace: olcAccess olcAccess: {0}to attrs=userPassword by self write by dn="cn=Manager,dc=bigbang,dc=dyndns,dc=org" write by anonymous auth by * none olcAccess: {1}to attrs=shadowLastChange by self write by * read olcAccess: {2}to dn.base="" by * read olcAccess: {3}to * by dn="cn=Manager,dc=bigbang,dc=dyndns,dc=org" write by self write by * read # ldapmodify -x -D cn=config -W -f chdomain.ldif Enter LDAP Password: modifying entry "olcDatabase={1}monitor,cn=config" modifying entry "olcDatabase={2}bdb,cn=config" modifying entry "olcDatabase={2}bdb,cn=config" modifying entry "olcDatabase={2}bdb,cn=config" modifying entry "olcDatabase={2}bdb,cn=config"アクセスコントロールリストについては、「ディレクトリサービス OpenLDAP」を参照してください。
ベースドメインの登録を実施します。
# vi base.ldif dn: dc=bigbang,dc=dyndns,dc=org objectClass: dcObject objectClass: organization dc: BIGBANG o: BIGBANG dn: cn=Manager,dc=bigbang,dc=dyndns,dc=org objectclass: organizationalRole cn: Manager dn: ou=People,dc=bigbang,dc=dyndns,dc=org objectClass: organizationalUnit ou: People dn: ou=Group,dc=bigbang,dc=dyndns,dc=org objectClass: organizationalUnit ou: Group dn: ou=Services,dc=bigbang,dc=dyndns,dc=org objectClass: organizationalUnit ou: Services dn: ou=Machines,dc=bigbang,dc=dyndns,dc=org objectClass: organizationalUnit ou: Machines # ldapadd -x -D "cn=Manager,dc=bigbang,dc=dyndns,dc=org" -W -f base.ldif Enter LDAP Password: adding new entry "dc=bigbang,dc=dyndns,dc=org" adding new entry "cn=Manager,dc=bigbang,dc=dyndns,dc=org" adding new entry "ou=People,dc=bigbang,dc=dyndns,dc=org" adding new entry "ou=Group,dc=bigbang,dc=dyndns,dc=org" adding new entry "ou=Services,dc=bigbang,dc=dyndns,dc=org" adding new entry "ou=Machines,dc=bigbang,dc=dyndns,dc=org"登録情報を確認します。
# ldapsearch -x -LLL -H ldap:/// -b dc=bigbang,dc=dyndns,dc=org dn: dc=bigbang,dc=dyndns,dc=org objectClass: dcObject objectClass: organization dc: BIGBANG o: BIGBANG dn: cn=Manager,dc=bigbang,dc=dyndns,dc=org objectClass: organizationalRole cn: Manager dn: ou=People,dc=bigbang,dc=dyndns,dc=org objectClass: organizationalUnit ou: People dn: ou=Group,dc=bigbang,dc=dyndns,dc=org objectClass: organizationalUnit ou: Group dn: ou=Services,dc=bigbang,dc=dyndns,dc=org objectClass: organizationalUnit ou: Services dn: ou=Machines,dc=bigbang,dc=dyndns,dc=org objectClass: organizationalUnit ou: Machines
●ldapviを使用した編集
OpenLDAP 2.4からは自身の設定ファイルもLDAPデータベースで管理されており、設定を修正するたびにLDIFを作成しldapmodifyして……というのが非常に面倒なので、viでファイルを編集する感覚で使えるldapviというコマンドがEPELにあるので、合わせてインストールしておきます。
# yum --enablerepo=epel install ldapviデフォルトのDCがサンプルのdc=my-domain,dc=comになっているので、まずはこれを自分のドメインに変更します。ldapviの引数はホスト名のキーが-hで、ldapsearchの-Hと微妙に違う点だけ注意してください。
# ldapvi -Y EXTERNAL -h ldapi:/// -b cn=config (変更箇所のみ記載) olcAccess: {0}to * \ by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" \ read by dn.base="cn=Manager,dc=bigbang,dc=dyndns,dc=org" read by * none olcSuffix: dc=bigbang,dc=dyndns,dc=org olcRootDN: cn=Manager,dc=bigbang,dc=dyndns,dc=org olcLogLevel statsviを保存して閉じると、以下のようなプロンプトが表示されます。yで「変更を保存」、eで「編集状態に戻る」、Qで「編集を破棄して終了」、vで「変更をLDIFで表示」です。
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
21 entries read
add: 0, rename: 0, modify: 1, delete: 0
Action? [yYqQvVebB*rsf+?] v
Action? [yYqQvVebB*rsf+?] y
Done.
管理者のパスワード変更するには下記のようにします。
# ldapvi -Y EXTERNAL -h ldapi:/// -b olcDatabase={2}hdb,cn=config olcRootPW: {SSHA}********************************LDAPデータベースのアクセス権限を変更するには下記のようにします。
# ldapvi -Y EXTERNAL -h ldapi:/// -b olcDatabase={1}monitor,cn=configDbIndexを変更するには下記のようにします。
# ldapvi -Y EXTERNAL -h ldapi:/// -b olcDatabase={2}hdb,cn=config
●OpenLDAPのインストール及び設定(CentOS 6、Fedora 15編)
●OpenLDAPのインストール及び調整(通常の方法)以降に記載されている方法ではLDAPユーザ権限でldappasswd等を実行した場合にResult: Insufficient access (50)等が表示されてしまいます。
下記の方法によりインストールすると問題が解消されました。
参照先
LDAPサーバー構築(CentOS 6)
LDAPクライアントの設定(CentOS 6)
openldap-servers、openldap-clientsをインストールします。
# yum -y install openldap-servers openldap-clientsldapを編集します。
# vi /etc/sysconfig/ldap
SLAPD_LDAPI=yes ← 変更
slapd.confを作成します。
# vi /etc/openldap/slapd.conf pidfile /var/run/openldap/slapd.pid ← 追加 argsfile /var/run/openldap/slapd.args ← 追加/etc/openldap/slapd.dディレクトリ以下を削除し、再作成します。
# rm -rf /etc/openldap/slapd.d/* # slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d config file testing succeededcn=config/olcDatabase\={0}config.ldifを変更します。
# vi /etc/openldap/slapd.d/cn=config/olcDatabase\={0}config.ldif
olcAccess:{0}to * by dn.exact=gidNumber=0+uidNumber=0,
\ cn=peercred,cn=external,cn=auth manage by * break ← 変更
cn=config/olcDatabase\={1}monitor.ldifを作成します。
# vi /etc/openldap/slapd.d/cn=config/olcDatabase\={1}monitor.ldif dn: olcDatabase={1}monitor objectClass: olcDatabaseConfig olcDatabase: {1}monitor olcAccess: {1}to * by dn.exact=gidNumber=0+uidNumber=0, \ cn=peercred,cn=external,cn=auth manage by * break olcAddContentAcl: FALSE olcLastMod: TRUE olcMaxDerefDepth: 15 olcReadOnly: FALSE olcMonitoring: FALSE structuralObjectClass: olcDatabaseConfig creatorsName: cn=config modifiersName: cn=config/etc/openldap/slapd.dディレクトリ以下の所有者及びアクセス権を変更します。
# chown -R ldap. /etc/openldap/slapd.d # chmod -R 700 /etc/openldap/slapd.dLDAPの起動させ、また、自動起動を有効にします。
# service slapd start
Starting slapd: [ OK ]
# chkconfig slapd on
初期設定を行います。
# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/core.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "cn=core,cn=schema,cn=config" # ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "cn=cosine,cn=schema,cn=config" # ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "cn=nis,cn=schema,cn=config" # ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "cn=inetorgperson,cn=schema,cn=config"LDAP管理者用のパスワードを作成します。
# slappasswd New password: ← 入力 Re-enter new password: ← 再入力 {SSHA}xxxxxxxxxxxxxxxxxxxxxxxxbackend.ldifとfrontend.ldifを作成します。
# vi backend.ldif # 「dc=***,dc=***」には自己環境に合わせてsuffixに置き換えてください # 「olcRootPW: ***」にはslappasswdで生成したパスワードに置き換えてください dn: cn=module,cn=config objectClass: olcModuleList cn: module olcModulepath: /usr/lib64/openldap olcModuleload: back_hdb dn: olcDatabase=hdb,cn=config objectClass: olcDatabaseConfig objectClass: olcHdbConfig olcDatabase: {2}hdb olcSuffix: dc=bigbang,dc=dyndns,dc=org olcDbDirectory: /var/lib/ldap olcRootDN: cn=admin,dc=bigbang,dc=dyndns,dc=org olcRootPW: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxx olcDbConfig: set_cachesize 0 2097152 0 olcDbConfig: set_lk_max_objects 1500 olcDbConfig: set_lk_max_locks 1500 olcDbConfig: set_lk_max_lockers 1500 olcDbIndex: objectClass eq olcLastMod: TRUE olcMonitoring: TRUE olcDbCheckpoint: 512 30 olcAccess: to attrs=userPassword by dn="cn=admin,dc=bigbang,dc=dyndns,dc=org" _ write by anonymous auth by self write by * none olcAccess: to attrs=shadowLastChange by self write by * read olcAccess: to dn.base="" by * read olcAccess: to * by dn="cn=admin,dc=bigbang,dc=dyndns,dc=org" write by * read #ldapadd -Y EXTERNAL -H ldapi:/// -f backend.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "cn=module,cn=config" adding new entry "olcDatabase=hdb,cn=config" # vi frontend.ldif # 「dc=***,dc=***」には自己環境に合わせてsuffixに置き換えてください # 「userPassword: ***」にはslappasswdで生成したパスワードに置き換えてください dn: dc=bigbang,dc=dyndns,dc=org objectClass: top objectClass: dcObject objectclass: organization o: BIGBANG ← 自己環境に合わせる dc: BIGBANG ← 自己環境に合わせる dn: cn=admin,dc=bigbang,dc=dyndns,dc=org objectClass: simpleSecurityObject objectClass: organizationalRole cn: admin userPassword: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxx dn: ou=People,dc=bigbang,dc=dyndns,dc=org objectClass: organizationalUnit ou: People dn: ou=Group,dc=bigbang,dc=dyndns,dc=org objectClass: organizationalUnit ou: Group # ldapadd -x -D cn=admin,dc=bigbang,dc=dyndns,dc=org -W -f frontend.ldif Enter LDAP Password: ← 入力 adding new entry "dc=bigbang,dc=dyndns,dc=org" adding new entry "cn=admin,dc=bigbang,dc=dyndns,dc=org" adding new entry "ou=People,dc=bigbang,dc=dyndns,dc=org" adding new entry "ou=Group,dc=bigbang,dc=dyndns,dc=org"ローカルユーザを登録します。
# vi ldapuser.sh # ローカルのUIDが500-999番のユーザを抽出 # 「SUFFIX=***」には自身のsuffixに置き換えてください #!/bin/bash SUFFIX='dc=bigbang,dc=dyndns,dc=org' LDIF='ldapuser.ldif' echo -n > $LDIF for line in `grep "x:[5-9][0-9][0-9]:" /etc/passwd | sed -e "s/ /%/g"` do UID1=`echo $line | cut -d: -f1` NAME=`echo $line | cut -d: -f5 | cut -d, -f1` if [ ! "$NAME" ] then NAME=$UID1 else NAME=`echo $NAME | sed -e "s/%/ /g"` fi SN=`echo $NAME | awk '{print $2}'` if [ ! "$SN" ] then SN=$NAME fi GIVEN=`echo $NAME | awk '{print $1}'` UID2=`echo $line | cut -d: -f3` GID=`echo $line | cut -d: -f4` PASS=`grep $UID1: /etc/shadow | cut -d: -f2` SHELL=`echo $line | cut -d: -f7` HOME=`echo $line | cut -d: -f6` EXPIRE=`passwd -S $UID1 | awk '{print $7}'` FLAG=`grep $UID1: /etc/shadow | cut -d: -f9` if [ ! "$FLAG" ] then FLAG="0" fi WARN=`passwd -S $UID1 | awk '{print $6}'` MIN=`passwd -S $UID1 | awk '{print $4}'` MAX=`passwd -S $UID1 | awk '{print $5}'` LAST=`grep $UID1: /etc/shadow | cut -d: -f3` echo "dn: uid=$UID1,ou=People,$SUFFIX" >> $LDIF echo "objectClass: inetOrgPerson" >> $LDIF echo "objectClass: posixAccount" >> $LDIF echo "objectClass: shadowAccount" >> $LDIF echo "uid: $UID1" >> $LDIF echo "sn: $SN" >>$LDIF echo "givenName: $GIVEN" >> $LDIF echo "cn: $NAME" >> $LDIF echo "displayName: $NAME" >> $LDIF echo "uidNumber: $UID2" >> $LDIF echo "gidNumber: $GID" >> $LDIF echo "userPassword: {crypt}$PASS" >> $LDIF echo "gecos: $NAME" >> $LDIF echo "loginShell: $SHELL" >> $LDIF echo "homeDirectory: $HOME" >> $LDIF echo "shadowExpire: $EXPIRE" >> $LDIF echo "shadowFlag: $FLAG" >> $LDIF echo "shadowWarning: $WARN" >> $LDIF echo "shadowMin: $MIN" >> $LDIF echo "shadowMax: $MAX" >> $LDIF echo "shadowLastChange: $LAST" >> $LDIF echo >> $LDIF done # sh ldapuser.sh ← ldapuser.shを実行 ldapuser.ldifが作成される # ldapadd -x -D cn=admin,dc=bigbang,dc=dyndns,dc=org -W -f ldapuser.ldif Enter LDAP Password: ← 入力 adding new entry "uid=centos5,ou=People,dc=bigbang,dc=dyndns,dc=org" adding new entry "uid=centos6,ou=People,dc=bigbang,dc=dyndns,dc=org" adding new entry "uid=fedora14,ou=People,dc=bigbang,dc=dyndns,dc=org" adding new entry "uid=fedora15,ou=People,dc=bigbang,dc=dyndns,dc=org"ローカルグループを登録
# vi ldapgroup.sh # ローカルのGIDが500-999番のグループを抽出する # 「SUFFIX=***」には自身の suffix に置き換えてください #!/bin/bash SUFFIX='dc=bigbang,dc=dyndns,dc=org' LDIF='ldapgroup.ldif' echo -n > $LDIF for line in `grep "x:[5-9][0-9][0-9]:" /etc/group` do CN=`echo $line | cut -d: -f1` GID=`echo $line | cut -d: -f3` echo "dn: cn=$CN,ou=Group,$SUFFIX" >> $LDIF echo "objectClass: posixGroup" >> $LDIF echo "cn: $CN" >> $LDIF echo "gidNumber: $GID" >> $LDIF users=`echo $line | cut -d: -f4 | sed "s/,/ /g"` for user in ${users} ; do echo "memberUid: ${user}" >> $LDIF done echo >> $LDIF done # sh ldapgroup.sh ← ldapuser.shを実行 ldapgroup.ldifが作成される # ldapadd -x -D cn=admin,dc=bigbang,dc=dyndns,dc=org -W -f ldapgroup.ldif Enter LDAP Password: ← 入力 adding new entry "cn=centos5,ou=Group,dc=bigbang,dc=dyndns,dc=org" adding new entry "cn=centos6,ou=Group,dc=bigbang,dc=dyndns,dc=org" adding new entry "cn=fedora14,ou=Group,dc=bigbang,dc=dyndns,dc=org" adding new entry "cn=fedora15,ou=Group,dc=bigbang,dc=dyndns,dc=org"登録したユーザとグループを削除する場合は以下のようにします。
# ldapdelete -x -W -D 'cn=admin,dc=bigbang,dc=dyndns,dc=org' \ "uid=centos5,ou=People,dc=bigbang,dc=dyndns,dc=org" Enter LDAP Password: ← 入力 # ldapdelete -x -W -D 'cn=admin,dc=bigbang,dc=dyndns,dc=org' \ "cn=centos5,ou=Group,dc=bigbang,dc=dyndns,dc=org" Enter LDAP Password: ← 入力
●LDAPのマルチマスターレプリケーションの設定
参考にしたページ
OpenLDAP マルチマスターレプリケーション
OpenLDAPの構築
OpenLDAPマルチマスタ(ミラーモード)
mod_syncprovを設定します。syncporv.laが存在しているディレクトリーのPATHを設定します。PATHはOSによって異なりますので確認しながら設定してください。すべてのサーバで設定します。
# vi mod_syncprov.ldif
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulePath: /usr/lib64/openldap
olcModuleLoad: syncprov.la
# ldapadd -Y EXTERNAL -H ldapi:/// -f mod_syncprov.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=module,cn=config"
syncprovを設定します。syncporv.laが存在しているディレクトリーのPATHを設定します。すべてのサーバで設定します。
# vi syncprov.ldif dn: olcOverlay=syncprov,olcDatabase={2}hdb,cn=config objectClass: olcOverlayConfig objectClass: olcSyncProvConfig olcOverlay: syncprov olcSpSessionLog: 100 # ldapadd -Y EXTERNAL -H ldapi:/// -f syncprov.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "olcOverlay=syncprov,olcDatabase={2}hdb,cn=config"olcServerIDを設定します。LDAPマスターとする全てのサーバで設定をします。ただし、olcServerIDの番号は、サーバごとにことなるものを指定します。
# vi olcServerID.ldif dn: cn=config changetype: modify replace: olcServerID olcServerID: 2 # ldapmodify -Y EXTERNAL -H ldapi:/// -f olcServerID.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry "cn=config"olcModuleLoadを設定します。syncporv.laが存在しているディレクトリーのPATHを設定します。LDAPマスターとする全てのサーバで設定をします。
# vi olcModuleLoad.ldif dn: cn=module{0},cn=config changetype: modify add: olcModuleLoad olcModuleLoad: syncprov # ldapmodify -Y EXTERNAL -H ldapi:/// -f olcModuleLoad.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry "cn=module{0},cn=config"olcDbIndexを設定します。LDAPマスターとする全てのサーバで設定をします。
# vi olcDbIndex.ldif dn: olcDatabase={2}hdb,cn=config changetype: modify add: olcDbIndex olcDbIndex: entryCSN eq - add: olcDbIndex olcDbIndex: entryUUID eq # ldapmodify -Y EXTERNAL -H ldapi:/// -f olcDbIndex.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry "olcDatabase={2}hdb,cn=config" 下記はCentOS 6での失敗例です。 # ldapmodify -Y EXTERNAL -H ldapi:/// -f olcDbIndex.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry "olcDatabase={2}hdb,cn=config" ldap_modify: No such object (32) matched DN: cn=config # ldapmodify -Y EXTERNAL -H ldapi:/// -f olcDbIndex.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry "olcDatabase={1}hdb,cn=config" ldap_modify: No such object (32) matched DN: cn=config 下記はCentOS 6での成功例です。 # ldapmodify -Y EXTERNAL -H ldapi:/// -f olcDbIndex.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry "olcDatabase={2}bdb,cn=config"レプリケーション用ユーザを作成します。レプリケーションは参照さえできれば良いためRootDN(Manager)とは別にユーザを作成します。
# vi user_Replication.ldif dn: cn=Replication,dc=bigbang,dc=dyndns,dc=org cn: Replication objectClass: organizationalRole objectClass: simpleSecurityObject userPassword: {SSHA}********************************** # ldapadd -x -D "cn=Manager,dc=bigbang,dc=dyndns,dc=org" -W -f user_Replication.ldifolcSyncReplを設定します。ミラーモードの設定を含みます。LDAPマスターとする全てのサーバで設定をします。ただし、それぞれのサーバーで「olcServerID」は一意の ID を、「provider=***」には相手側のサーバーを指定してください。
# vi olcSyncRepl.ldif dn: olcDatabase={2}hdb,cn=config changetype: modify add: olcSyncRepl olcSyncRepl: rid=001 provider=ldap://192.168.0.1 bindmethod=simple binddn="cn=Replication,dc=bigbang,dc=dyndns,dc=org" credentials=password scope=sub searchbase="dc=bigbang,dc=dyndns,dc=org" schemachecking=on type=refreshAndPersist retry="30 5 300 3" interval=00:00:05:00 - add: olcMirrorMode olcMirrorMode: TRUE # ldapmodify -Y EXTERNAL -H ldapi:/// -f olcSyncRepl.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry "olcDatabase={2}hdb,cn=config" 下記はCentOS 6での失敗例です。 # ldapmodify -Y EXTERNAL -H ldapi:/// -f olcSyncRepl.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry "olcDatabase={2}hdb,cn=config" ldap_modify: No such object (32) matched DN: cn=config 下記はCentOS 6での成功例です。 # ldapmodify -Y EXTERNAL -H ldapi:/// -f olcSyncRepl.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry "olcDatabase={2}bdb,cn=config" ※設定値の意味 # リトライ間隔 リトライ回数 再リトライまでの間隔 再リトライ回数 retry="30 5 300 3" # レプリケーションの間隔 interval=00:00:05:00 下記はCentOS 7での失敗例です。 # ldapmodify -Y EXTERNAL -H ldapi:/// -f olcSyncRepl.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry "olcDatabase={1}hdb,cn=config" ldap_modify: No such object (32) matched DN: cn=config # ldapmodify -Y EXTERNAL -H ldapi:/// -f olcSyncRepl.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry "olcDatabase={2}bdb,cn=config" ldap_modify: No such object (32) matched DN: cn=configolcOverlayを設定します。LDAPマスターとする全てのサーバで設定をします。
# vi olcOverlay.ldif dn: olcOverlay=syncprov,olcDatabase={2}hdb,cn=config changetype: add objectClass: olcOverlayConfig objectClass: olcSyncProvConfig olcOverlay: syncprov # ldapmodify -Y EXTERNAL -H ldapi:/// -f olcOverlay.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "olcOverlay=syncprov,olcDatabase={2}hdb,cn=config" 下記はCentOS 6での失敗例です。 # ldapmodify -Y EXTERNAL -H ldapi:/// -f olcOverlay.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "olcOverlay=syncprov,olcDatabase={2}hdb,cn=config" ldap_add: No such object (32) matched DN: cn=config 下記はCentOS 6での成功例です。 # ldapmodify -Y EXTERNAL -H ldapi:/// -f olcOverlay.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "olcOverlay=syncprov,olcDatabase={2}bdb,cn=config"LDAP クライアント側で全てのマスターを参照先として設定します。以上で設定完了です。データの登録はいずれのサーバからでも可能となっています。
# authconfig --enableldapauth --ldapserver=192.168.0.1,192.168.0.2 \ --ldapbasedn="dc=bigbang,dc=dyndns,dc=org" --enablemkhomedir --disableldaptls --update
●LDAPのマルチマスターレプリケーションの設定(3台)
3台でマルチマスターレプリケーションできるかどうか実験してみます。
パターンA(1台をハブとする方法)
・サーバ情報
サーバA(rid: 001、olcServerID: 1)
サーバB(rid: 001、olcServerID: 2)
サーバC(rid: 001、olcServerID: 3)
サーバAはサーバB及びサーバCと双方向で同期するように設定します。
ただし、サーバBとサーバCは双方向で同期しません。
同期設定内容は下記コマンドで確認します。
# ldapsearch -x -LLL -D "cn=config" -W -b "cn=config" '(objectClass=*)' > /tmp/ldap.txt Enter LDAP Password: # less /tmp/ldap.txt
この条件のもと、あるユーザのパスワードを変更し同期するかどうか確認します。
サーバAでパスワード変更を実施。
# ldappasswd -x -D "cn=Manager,dc=bigbang,dc=dyndns,dc=org" \ -W -S "uid=sato,ou=People,dc=bigbang,dc=dyndns,dc=org";date New password: Re-enter new password: Enter LDAP Password:サーバB、サーバCでパスワードが変更されていることを確認しました。
# ldapsearch -x -D "uid=sato,ou=People,dc=bigbang,dc=dyndns,dc=org" \ -W -b "dc=bigbang,dc=dyndns,dc=org" "(uid=sato)";date上記で表示されるuserPassword::部分を比較します。
同様に、サーバB、サーバCの順にパスワードを変更し他のサーバでパスワードが変更されていることを確認しました。
パターンB(3台ともハブとする方法)
・サーバ情報
サーバA(rid: 001、olcServerID: 1)
サーバB(rid: 001、olcServerID: 2)
サーバC(rid: 001、olcServerID: 3)
サーバA、サーバB、サーバCの各サーバで双方向で同期するように設定します。
同期設定内容は下記コマンドで確認します。
# ldapsearch -x -LLL -D "cn=config" -W -b "cn=config" '(objectClass=*)' > /tmp/ldap.txt Enter LDAP Password: # less /tmp/ldap.txt
この条件のもと、あるユーザのパスワードを変更し同期するかどうか確認します。
サーバA(サーバB、サーバC)でパスワード変更を実施。
# ldappasswd -x -D "cn=Manager,dc=bigbang,dc=dyndns,dc=org" \ -W -S "uid=sato,ou=People,dc=bigbang,dc=dyndns,dc=org";date New password: Re-enter new password: Enter LDAP Password:サーバB(サーバA、サーバC)、サーバC(サーバA、サーバ)でパスワードが変更されていることを確認しました。
# ldapsearch -x -D "uid=sato,ou=People,dc=bigbang,dc=dyndns,dc=org" \ -W -b "dc=bigbang,dc=dyndns,dc=org" "(uid=sato)";date上記で表示されるuserPassword::部分を比較します。
●LDAPクライアントのセットアップ(CentOS 7)
openldap-clients及びnss-pam-ldapdをインストールします。
# yum -y install openldap-clients nss-pam-ldapdnslcdを自動起動するようにします。
# systemctl enable nslcd # systemctl start nslcdauthconfigコマンドを実行します。
# authconfig --enableldapauth --ldapserver=192.168.0.1,192.168.0.2 \ --ldapbasedn="dc=bigbang,dc=dyndns,dc=org" --enablemkhomedir --disableldaptls --update「--ldapserver」で設定するサーバはldapsearch等の実行時にアクセスする順番となります。ローカルサーバ上でLDAPサーバが動作している時はローカルサーバを先頭に記載してください。
これで設定はほぼ完了です。内容を確認するには下記コマンドを実行します。
# authconfig --testLDAPクライアントとしての動作確認をします。
$ getent passwd $ getent shadow $ getent group $ id (LDAPアカウント)LDAPに登録されている情報が表示されればOKです。
情報が表示されない場合の対処
/etc/openldap/ldap.confファイルを編集します。
# vi /etc/openldap/ldap.conf URI ldap://192.168.0.1/ BASE dc=bigbang,dc=dyndns,dc=org/etc/nsswitch.confファイルを編集します。
# vi /etc/nsswitch.conf passwd: files sss ldap shadow: files sss ldap group: files sss ldapこれでも情報が表示されなければ、LDAPサーバでldapのポートが開放されているかどうか確認します。
# firewall-cmd --list-service dns http https sshldapのポートを開放します。
# firewall-cmd --add-service=ldap --permanent
success
# firewall-cmd --reload
success
# firewall-cmd --list-service
dns http https ldap ssh
これでも表示されなければ、下記ファイルを確認します。
/etc/pam.d/system-authファイルにpam_ldap.soがあるか確認します。
/etc/pam.d/password-authファイルにpam_ldap.soがあるか確認します。
確認方法は「●SSHでログインできるか確認する」を参考にしてください。
再度、LDAPクライアントとしての動作確認をします。
$ getent passwd $ getent shadow $ getent group $ id (LDAPアカウント)LDAPに登録されている情報が表示されればOKです。
以下作業は、CentOS 6、CentOS 7で不要。
参照URL:LDAP 認証 - クライアントのセットアップ
SSSDで基本的な認証を実施しない場合
/etc/pam.d/su及び/etc/pam.d/su-lでsufficientのpam_ldap.soを下記のように追加します。
pam_ldap.soを下記の位置に記載しない場合、rootからsuする場合もパスワードの入力を催促されるようになります。
su-lファイルはユーザがsu --loginを実行したときに使用されます。authセクションにpam_unixの記載がある場合は、use_first_passを追加してください。
# vi /etc/pam.d/su #%PAM-1.0 auth sufficient pam_rootok.so auth sufficient pam_ldap.so # Uncomment the following line to implicitly trust users in the "wheel" group. #auth sufficient pam_wheel.so trust use_uid # Uncomment the following line to require a user to be in the "wheel" group. #auth required pam_wheel.so use_uid auth substack system-auth auth include postlogin account sufficient pam_ldap.so account sufficient pam_succeed_if.so uid = 0 use_uid quiet account include system-auth password include system-auth session sufficient pam_ldap.so session include system-auth session include postlogin session optional pam_xauth.so
# vi /etc/pam.d/su-l #%PAM-1.0 auth sufficient pam_ldap.so auth include su account sufficient pam_ldap.so account include su password include su session sufficient pam_ldap.so session optional pam_keyinit.so force revoke session include suユーザが自分のパスワードを編集できるように、/etc/pam.d/passwdを編集します。
# vi /etc/pam.d/passwd
#%PAM-1.0
auth include system-auth
account include system-auth
password sufficient pam_ldap.so
password substack system-auth
-password optional pam_gnome_keyring.so use_authtok
password substack postlogin
ログイン時にホームフォルダを作成したい場合(例:ホームフォルダを共有するのにNFSを使わない場合)、/etc/pam.d/loginを編集して pam_mkhomedir.soをsessionセクションの「sufficient」アイテムの上に追加してください。ssh、xdm、kdm、gdmなどからttyにログインしたときにホームフォルダが作成されるようになります。同じように/etc/pam.d/suや/etc/pam.d/su-lなどのファイルも編集することで、suやsu --loginでもホームフォルダの作成を有効にできます。sshログインの場合はホームフォルダを作成して欲しくないときはloginなどのかわりにlocal-loginを編集してください。
# vi /etc/pam.d/su #%PAM-1.0 (途中省略) password include system-auth session required pam_mkhomedir.so skel=/etc/skel umask=077 session sufficient pam_ldap.so session include system-auth session include postlogin session optional pam_xauth.so # vi /etc/pam.d/su-l #%PAM-1.0 (途中省略) session include su session required pam_mkhomedir.so skel=/etc/skel umask=077 session sufficient pam_ldap.soLDAPユーザからsudoを使用できるするには、/etc/pam.d/sudoを編集します。sudoersもあわせて編集する必要があります。
# vi /etc/pam.d/sudo
#%PAM-1.0
auth sufficient pam_ldap.so
auth required pam_unix.so try_first_pass
auth required pam_nologin.so
また、/etc/openldap/ldap.conf に以下を追加してください:
# vi /etc/openldap/ldap.conf sudoers_base ou=sudoers,dc=AFOLA
SSSDで基本的な認証を有効にする方法
●「su: 警告: ディレクトリを /home/sato に変更できません」と表示される
●LDAPクライアントのセットアップ(CentOS 7)に記載してあるとおりauthconfigコマンドを実行しましたがFedora 22が動作しているサーバで下記のようなエラーが表示されました。
[user@m-server ~]$ su - sato パスワード: su: 警告: ディレクトリを /home/sato に変更できません: そのようなファイルやディレクトリはありません -bash-4.3$ます、/etc/pam.d/suを編集しログイン後にホームディレクトリが作成されるかどうか確認します。
# vi /etc/pam.d/su
#%PAM-1.0
auth sufficient pam_rootok.so
auth sufficient pam_ldap.so
# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth sufficient pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be in the "wheel" group.
#auth required pam_wheel.so use_uid
auth substack system-auth
auth include postlogin
account sufficient pam_ldap.so
account sufficient pam_succeed_if.so uid = 0 use_uid quiet
account include system-auth
password include system-auth
session required pam_mkhomedir.so skel=/etc/skel umask=077
session sufficient pam_ldap.so
session include system-auth
session include postlogin
session optional pam_xauth.so
残念ながら想定したとおりとなりませんでした。
$ su - sato パスワード: su: 警告: ディレクトリを /home/sato に変更できません: そのようなファイルやディレクトリはありません -bash-4.3$次に、/etc/pam.d/su-lを編集しログイン後にホームディレクトリが作成されるかどうか確認します。
# vi /etc/pam.d/su-l
#%PAM-1.0
auth sufficient pam_ldap.so
auth include su
account sufficient pam_ldap.so
account include su
password include su
session required pam_mkhomedir.so skel=/etc/skel umask=077
session sufficient pam_ldap.so
session optional pam_keyinit.so force revoke
session include su
今度は想定とおりホームディレクトリが作成されました。
$ su - sato パスワード: ディレクトリ '/home/sato' を作成中 [sato@m-server ~]$
●LDAPユーザでSSHログインできない
Fedora 22が動作しているサーバで下記のようなエラーが表示されました。
[user@n-server ~]$ ssh sato@mercury sato@mercury's password: Permission denied, please try again. sato@mercury's password: Permission denied, please try again. sato@mercury's password: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password)./var/log/secureには下記のようなログが記録されていました。
May 2 10:43:04 mercury sshd[28713]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.0.4 user=sato
May 2 10:43:04 mercury sshd[28713]: pam_sss(sshd:auth): Request to sssd failed. Connection refused
May 2 10:43:06 mercury sshd[28713]: Failed password for sato from 192.168.0.4 port 46053 ssh2
May 2 10:43:10 mercury sshd[28713]: pam_sss(sshd:auth): Request to sssd failed. Connection refused
May 2 10:43:10 mercury sshd[28713]: pam_reauthorize: couldn't set permissions on kernel key: reauthorize/secret/sato: Permission denied
May 2 10:43:11 mercury sshd[28713]: Failed password for sato from 192.168.0.4 port 46053 ssh2
May 2 10:43:14 mercury sshd[28713]: pam_sss(sshd:auth): Request to sssd failed. Connection refused
May 2 10:43:14 mercury sshd[28713]: pam_reauthorize: couldn't set permissions on kernel key: reauthorize/secret/sato: Permission denied
May 2 10:43:15 mercury sshd[29011]: Connection closed by 192.168.0.12 [preauth] May 2 10:43:17 mercury sshd[28713]: Failed password for sato from 192.168.0.4 port 46053 ssh2
May 2 10:43:17 mercury sshd[28713]: Connection closed by 192.168.0.4 [preauth]
May 2 10:43:17 mercury sshd[28713]: PAM 2 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.0.4 user=sato
●SSHでログインできるか確認するを参考にして設定します。
May 2 10:43:04 mercury sshd[28713]: pam_sss(sshd:auth): Request to sssd failed. Connection refused
May 2 10:43:06 mercury sshd[28713]: Failed password for sato from 192.168.0.4 port 46053 ssh2
May 2 10:43:10 mercury sshd[28713]: pam_sss(sshd:auth): Request to sssd failed. Connection refused
May 2 10:43:10 mercury sshd[28713]: pam_reauthorize: couldn't set permissions on kernel key: reauthorize/secret/sato: Permission denied
May 2 10:43:11 mercury sshd[28713]: Failed password for sato from 192.168.0.4 port 46053 ssh2
May 2 10:43:14 mercury sshd[28713]: pam_sss(sshd:auth): Request to sssd failed. Connection refused
May 2 10:43:14 mercury sshd[28713]: pam_reauthorize: couldn't set permissions on kernel key: reauthorize/secret/sato: Permission denied
May 2 10:43:15 mercury sshd[29011]: Connection closed by 192.168.0.12 [preauth] May 2 10:43:17 mercury sshd[28713]: Failed password for sato from 192.168.0.4 port 46053 ssh2
May 2 10:43:17 mercury sshd[28713]: Connection closed by 192.168.0.4 [preauth]
May 2 10:43:17 mercury sshd[28713]: PAM 2 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.0.4 user=sato
上記の方法で問題なくSSHログインできるようになりました。
●LDAPクライアントのインストール及び設定(CentOS 6、Fedora 15編)
openldap-clients及びnss-pam-ldapdをインストールします。
# yum -y install openldap-clients nss-pam-ldapd依存性関係でnscd-2.14-5.i686、pam_ldap-185-9.fc15.i686もインストールされました。
下記コマンドを実行します。
# authconfig --enableldapauth --ldapserver=192.168.0.1,192.168.0.2 \ --ldapbasedn="dc=bigbang,dc=dyndns,dc=org" --enablemkhomedir --disableldaptls --updateこれで設定はほぼ完了です。内容を確認するには下記コマンドを実行します。
# authconfig --test
下記はこれまで各ファイルを手動で編集した方法です。斜字体は読み飛ばしてください。
ldap.confを編集します。
# vi /etc/openldap/ldap.conf URI ldap://127.0.0.1/ ← LDAPサーバの指定 BASE dc=bigbang,dc=dyndns,dc=org ← 自己環境に合わせる TLS_CACERTDIR /etc/openldap/certsLDAPサーバの指定及びLDAPベースDN設定は以下のコマンドでも可能です。
# authconfig --ldapserver=<デフォルトのLDAPサーバ> --update # authconfig --ldapbasedn=<デフォルトのLDAPベースDN> --updatenslcd.confを編集します。
# vi /etc/nslcd.conf uri ldap://127.0.0.1/ ← LDAPサーバの指定 base dc=bigbang,dc=dyndns,dc=org ← 自己環境に合わせる ssl no tls_cacertdir /etc/openldap/certspam_ldap.confを編集します。
今まで、使用していた/etc/ldap.confは存在しないようです。
# vi /etc/pam_ldap.conf # host 127.0.0.1 ← コメントアウト base dc=bigbang,dc=dyndns,dc=org ← 自己環境に合わせる uri ldap://127.0.0.1/ ← LDAPサーバの指定 ssl no tls_cacertdir /etc/openldap/certs pam_password md5以下のコマンドでも可能です。
# authconfig --enableldapauth --updatesystem-authを編集します。
# vi /etc/pam.d/system-auth # 以下のように追記 #%PAM-1.0 # This file is auto-generated. # User changes will be destroyed the next time authconfig is run. auth required pam_env.so auth sufficient pam_fprintd.so auth sufficient pam_unix.so nullok try_first_pass auth requisite pam_succeed_if.so uid >= 500 quiet auth sufficient pam_ldap.so use_first_pass ↑ pam_sss.soやpam_krb5.soより先に記載しないと、LDAPでログインできない auth sufficient pam_sss.so use_first_pass auth sufficient pam_krb5.so use_first_pass auth required pam_deny.so account required pam_unix.so account sufficient pam_localuser.so account sufficient pam_succeed_if.so uid < 500 quiet account [default=bad success=ok user_unknown=ignore] pam_ldap.so ↑ pam_sss.soやpam_krb5.soより先に記載しないと、LDAPでログインできない account [default=bad success=ok user_unknown=ignore] pam_sss.so account [default=bad success=ok user_unknown=ignore] pam_krb5.so account required pam_permit.so password requisite pam_cracklib.so try_first_pass retry=3 type= password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok password sufficient pam_ldap.so use_authtok ↑ pam_sss.soやpam_krb5.soより先に記載しないと、LDAPでログインできない password sufficient pam_sss.so use_authtok password sufficient pam_krb5.so use_authtok password required pam_deny.so session optional pam_keyinit.so revoke session required pam_limits.so session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid session required pam_unix.so session optional pam_ldap.so ↑ pam_sss.soやpam_krb5.soより先に記載しないと、LDAPでログインできない session optional pam_sss.so session optional pam_krb5.so # 必要であれば追記(ログイン時にホームディレクトリを自動作成) session optional pam_mkhomedir.so skel=/etc/skel umask=077*補足
skel=/etc/skel umask=077はLDAPサーバがリモートである場合、ローカル側で自動作成されるホームディレクトリではumaskが有効にならない。ホームディレクトリのアクセス権が700ではなく755になってしまう。
nsswitch.confを編集します。
# vi /etc/nsswitch.conf passwd: files ldap ← 追記 shadow: files ldap ← 追記 group: files ldap ← 追記 netgroup: ldap ← 変更 automount: files ldap ← 変更LDAP認証の有効化は下記コマンドで可能です。
# authconfig --enableldapauth --updateauthconfigを編集します。
# vi /etc/sysconfig/authconfig
USELDAP=yes ← 変更
nslcdを自動起動するようにします
# chkconfig nslcd on # service nslcd start または # systemctl enable nslcd # systemctl start nslcd全ての設定内容は「authconfig --test」にて確認できます。また、getent passwdを実行することにより登録されているLDAPユーザを確認することができるはずです。
サーバを再起動します。(Cent OS 7でサーバを再起動しなくても動作することを確認)
# shutdown -r now login: test5000 ← LDAPに登録されているユーザ Password: ディレクトリ '/home/test5000' を作成中 $ ← ログインできた $ passwd ← LDAPパスワードを変更してみる Changing password for user test5000. Enter login(LDAP) password: ← 該当ユーザのLDAPパスワードを入力 新しいパスワード ← 新しいLDAPパスワードを入力 新しいパスワードを再入力してください: ← 新しいLDAPパスワードを再入力 LDAP password information changed for test5000 passwd: 全ての認証トークンが正しく更新できました。
# ls -l /etc/openldap/slapd.d drwx------ 3 ldap ldap 4096 10月 22 22:25 2011 cn=config -rwx------ 1 ldap ldap 988 10月 22 22:16 2011 cn=config.ldif # ls -l /etc/openldap/slapd.d/cn\=config -rw------- 1 ldap ldap 463 10月 22 22:25 2011 cn=module{0}.ldif drwxr-x--- 2 ldap ldap 4096 10月 22 22:20 2011 cn=schema -rwx------ 1 ldap ldap 50253 10月 22 22:16 2011 cn=schema.ldif -rwx------ 1 ldap ldap 499 10月 22 22:16 2011 olcDatabase={-1}frontend.ldif -rwx------ 1 ldap ldap 562 10月 22 22:17 2011 olcDatabase={0}config.ldif -rwx------ 1 ldap ldap 379 10月 22 22:17 2011 olcDatabase={1}monitor.ldif -rw------- 1 ldap ldap 1193 10月 22 22:25 2011 olcDatabase={2}hdb.ldif
$ getent passwd $ getent shadow $ getent group $ id (LDAPアカウント)LDAPに登録されている情報が表示されればOKです。
LDAPクライアントからLDAPにあるアカウントで接続しようとしたら接続出来ませんでした。ログを確認すると下記のようなエラーが記録されていました。
Dec 18 10:29:09 serverA slapd[4481]: \ conn=1414 fd=27 ACCEPT from IP=192.168.0.1:49215 (IP=0.0.0.0:389) Dec 18 10:29:09 serverA slapd[4481]: \ conn=1414 op=0 EXT oid=1.3.6.1.4.1.1466.20037 Dec 18 10:29:09 serverA slapd[4481]: \ conn=1414 op=0 do_extended: unsupported operation "1.3.6.1.4.1.1466.20037" Dec 18 10:29:09 serverA slapd[4481]: \ conn=1414 op=0 RESULT tag=120 err=2 text=unsupported extended operation Dec 18 10:29:09 serverA slapd[4481]: conn=1414 op=1 UNBIND Dec 18 10:29:09 serverA slapd[4481]: conn=1414 fd=27 closedこれはLinuxクライアント上でLDAP+TLS併用機能を有効化しているために発生する要求です。サーバに対して正しいSSL要求を行うか、以下の手順でLDAP+TLS併用機能を無効化します。
# authconfig --disableldaptls --update
●LDAPクライアントのインストール及び設定(CentOS 5編)
「CentOS5での設定」を参照しました。
下記パッケージが必要となります。
・nss_ldap
・php-ldap
・nss_ldap
・openldap-clients
・openldap
・openldap-devel
CentOSでは、ログイン認証の方式を容易に変更できるauthconfigというツールが用意されているのそれを利用してLDAPのための基本的な設定を実施します。
なお、authconfigはGUI(X Window:authconfig-gui)用とCUI(テキストコンソール: authconfig-tui)用の2つが用意されているで、実行環境に合わせて選択してください。ここでは、authconfig-tuiを使った設定を説明します。
コンソール画面を起動したら
# LANG=C; authconfig-tuiを実行します。すると、下記のような画面が表示されます。

ここで、下記の項目を有効にします。
LDAPの利用項目 | パラメータ | 状態 | 意味 |
---|---|---|---|
User Information | Cache Information | 有効 | 情報をLDAPキャッシュを経由して検索する |
Use LDAP | 有効 | ユーザ情報の取得をLDAPから取得する | |
Authentication | Use MD5 Passwords | 有効 | パスワードにMD5暗号を利用する |
Use Shadow Passwords | 有効 | シャドーパスワードを利用する | |
Use LDAP Authntication | 有効 | LDAPを使った認証を有効にする |
[Next]をクリックすると、次の画面が表示されます。

ここで入力するのは、下記のような内容になります。
パラメータ | 意味 |
---|---|
Use TLS | SSL暗号でLDAPサーバと通信する場合に有効にします。 ただし、Active Directoryとの間ではSSLは使えないので無効にしておきます。 |
Server | LDAPサーバのアドレスを指定します。サーバアドレスは、DNSなどに障害があった場合でも認証が受けられるようにするため、IPアドレスで指定するほうが良いと思われます。 |
Base DN | LDAPの検索を行う場合にどのDN名をベースにするかを選択します。ベースの範囲を狭めることで検索に必要な時間が短縮可能です。例えば、ADの標準ユーザ情報コンテナである「CN=Users,DC=xxx,DC=xxx)を指定すれば、LDAP情報はこのコンテナに登録されているものだけを検索します。また、自分でADに専用のオブジェクトコンテナを作成した場合には、それを使うようにすることも可能です(ex. OU=Users,OU=Unix,DC=xxx,DC=xxx)。ADのLDAPにどんなコンテナがあるかは、AD上にてmmcを起動して"ADSI Editスナップイン"を追加してドメインの情報に接続すれば、内容を表示・編集が可能になります。 |
/etc/openldap/ldap.conf は、LDAPクライアント(ex. ldapsearchなど)で使用されるファイルで、LDAPサーバの情報を定義しています。このファイルが上記で設定した内容となっていることを確認してください。
# # LDAP Defaults # # See ldap.conf(5) for details # This file should be world readable but not world writable. #BASE dc=example, dc=com #URI ldap://ldap.example.com ldap://ldap-master.example.com:666 #SIZELIMIT 12 #TIMELIMIT 15 #DEREF never URI ldap://192.168.100.30/ BASE dc=robata,dc=org TLS_CACERTDIR /etc/openldap/certsこれらの設定は、authconfig ツールを使うと書き換えられてしまいますのでご注意ください。
●OpenLDAPのインストール及び調整(通常の方法)
この情報は古いです(2016.04.13)
OSはCentOS 6.0です。OpenLDAP関連のパッケージで何がインストール済みなのか確認します。
OpenLDAPのバージョンが2.4.19から2.4.23に変更(2011.12.11、CenOS6)となり挙動が変わったようです。
赤字で示しているのがその箇所です。
# yum list installed '*ldap*' Installed Packages apr-util-ldap.i686 1.3.9-3.el6_0.1 @updates bind-dyndb-ldap.i686 0.1.0-0.9.b.el6 @anaconda-centos-201106051823.i386/6.0 krb5-server-ldap.i686 1.8.2-3.el6_0.7 @updates mod_authz_ldap.i686 0.26-15.el6 @anaconda-centos-201106051823.i386/6.0 nss-pam-ldapd.i686 0.7.5-3.el6 @anaconda-centos-201106051823.i386/6.0 openldap.i686 2.4.19-15.el6_0.2 @updates openldap-clients.i686 2.4.19-15.el6_0.2 @updates openldap-devel.i686 2.4.19-15.el6_0.2 @updates openldap-servers.i686 2.4.19-15.el6_0.2 @updates pam_ldap.i686 185-5.el6 @anaconda-centos-201106051823.i386/6.0 php-ldap.i686 5.3.2-6.el6_0.1 @updates python-ldap.i686 2.3.10-1.el6 @anaconda-centos-201106051823.i386/6.0少なくともopenldapパッケージ、openldap-clientsパッケージ、openldap-serversパッケージおよびnss_ldapパッケージがインストールされています。以上で、OpenLDAPサーバおよびクライアントツールが利用可能となります。
不足のパッケージがある場合は、下記のようにインストールします。
# yum -y install openldap-clients.i686 # yum -y install openldap-servers.i686上記は、openldap-clientsパッケージ、openldap-serversパッケージをインストールする場合の例です。
# ls -l /etc/openldap/ drwxr-xr-x 3 root root 4096 10月 19 00:01 2011 schema drwx------ 3 ldap ldap 4096 10月 19 00:01 2011 slapd.d # ls -l /etc/openldap/slapd.d drwx------ 3 ldap ldap 4096 10月 19 00:01 2011 cn=config -rw------- 1 ldap ldap 1007 10月 19 00:01 2011 cn=config.ldif # ls -l /etc/openldap/slapd.d/cn\=config drwx------ 2 ldap ldap 4096 10月 19 00:01 2011 cn=schema -rw------- 1 ldap ldap 51236 10月 19 00:01 2011 cn=schema.ldif -rw------- 1 ldap ldap 499 10月 19 00:01 2011 olcDatabase={-1}frontend.ldif -rw------- 1 ldap ldap 496 10月 19 00:01 2011 olcDatabase={0}config.ldif -rw------- 1 ldap ldap 1176 10月 19 00:01 2011 olcDatabase={1}bdb.ldif -rw------- 1 ldap ldap 521 10月 19 00:01 2011 olcDatabase={2}monitor.ldif
# cp /usr/share/doc/openldap-servers-2.4.19/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
slapdデーモンを起動します。
# service slapd start
slapd を起動中: [ OK ]
# ls -l /var/lib/ldap
合計 808
-rw------- 1 ldap ldap 24576 9月 30 01:05 2011 __db.001
-rw------- 1 ldap ldap 180224 9月 30 01:05 2011 __db.002
-rw------- 1 ldap ldap 270336 9月 30 01:05 2011 __db.003
-rw------- 1 ldap ldap 163840 9月 30 01:05 2011 __db.004
-rw------- 1 ldap ldap 548864 9月 30 01:05 2011 __db.005
-rw------- 1 ldap ldap 32768 9月 30 01:05 2011 __db.006
-rw-r--r-- 1 ldap ldap 2048 9月 30 01:05 2011 alock
-rw------- 1 ldap ldap 8192 9月 30 01:05 2011 dn2id.bdb
-rw------- 1 ldap ldap 32768 9月 30 01:05 2011 id2entry.bdb
-rw------- 1 ldap ldap 10485760 9月 30 01:05 2011 log.0000000001
# service slapd status
slapd (pid 19309) を実行中...
openldap-serversパッケージをインストールしているにもかかわらずslapd.confが存在していません。
slapd.confをバックアップからコピーします。
# cp /etc/openldap/slapd.conf.bak /etc/openldap/slapd.conf
# cp /usr/share/openldap-servers/slapd.conf.obsolete /etc/openldap/slapd.conf
所有者及びアクセス権を変更します。
# chown ldap.ldap /etc/openldap/slapd.conf # chmod 640 /etc/openldap/slapd.confslapd.confファイルの編集前に、OpenLDAPの管理者パスワードを決め、パスワードの暗号化を行います。
# slappasswd
New password:
Re-enter new password:
{SSHA}******************************** ← 暗号化されたパスワード
上記は、SSHAハッシュとして作成しています。
/etc/openldap/slapd.confのsuffix、rootdn、rootpwを設定します。rootdnはcn=Managerが一般的です。セキュリティ上、心配な場合は変更してもかまいません。
slapd.confを編集します。
# vi /etc/openldap/slapd.conf
suffix "dc=bigbang,dc=dyndns,dc=org"
rootdn "cn=Manager,dc=bigbang,dc=dyndns,dc=org"
rootpw {SSHA}********************************
↑ slappasswdコマンドで得られたパスワード
slapd.confの詳細については、●slapd.confを参照してください。
slapdデーモンを再起動します。
# service slapd restart slapd を停止中: [ OK ] slapd を起動中: [ OK ]OpenLDAPサーバが正しく起動していることが確認できたならば、LDAPプロトコルを用いてOpenLDAPサーバからの応答を確認します。
次のコマンド例では、"-x"オプションのみを利用して匿名ユーザでの簡易認証を行い、"-h"オプションにてローカルホスト上のOpenLDAPサーバに対し、"-b"オプションでディレクトリツリーの検索ベースを「dc=bigbang,dc=dyndns,dc=org」と指定した検索を行い、"-LLL"で最もシンプルなLDIFフォーマットへ出力を整形させています。
# ldapsearch -x -h localhost -b dc=bigbang,dc=dyndns,dc=org -LLL No such object (32)上記の例では、起動したばかりのOpenLDAPサーバからは、「検索条件に一致する結果はなし」との応答が返りました。現時点ではまだエントリを登録していないため、これが正しい結果です。
ldap_result: Can't contact LDAP server (-1)これは、/etc/hosts.allowで制限をかけていたためでした。
# vi /etc/hosts.allow slapd:All上記のように「slapd:All」追記してください。
●自己環境用のLDAPサーバの構築
この情報は古いです(2016.04.13)
自己環境用にLDAPサーバの構築するには、下記作業を実施します。
OpenLDAPのバージョンが2.4.19から2.4.23にアップデート後(2011.12.11、CenOS6)、LDAPサーバが起動しなくなりました。その時にこの項目を応用しました。
slapdを停止します。
赤字はその時に参考とした箇所です。
# service slapd stop slapd を停止中: [ OK ]この時点で自己環境に合わせ、新しいLDAP情報に書き換える作業を実施します。
/etc/openldap/slapd.confのsuffix、rootdn、rootpw及びアクセス権を設定します。rootdnはcn=Managerが一般的です。セキュリティ上、問題がある場合は変更して問題ありません。
# vi /etc/openldap/slapd.conf suffix "dc=bigbang,dc=dyndns,dc=org" ← 自分の環境用に書き換える rootdn "cn=Manager,dc=bigbang,dc=dyndns,dc=org" ← 自分の環境用に書き換える rootpw {SSHA}******************************** ↑ slappasswdコマンドで得られたパスワード # ユーザ自身のuserPassword属性は読み書き可能 access to attrs=userPassword by self write by dn="cn=Manager,dc=bigbang,dc=dyndns,dc=org" write by anonymous auth by * none # access to attrs=shadowLastChange by self write by * read # ベースDN管理者(cn=Manager,dc=bigbang,dc=dyndns,dc=org)は全属性を読み書き可能 # 全ての人はuserPassword属性を除いた属性の読み込み可能 access to * by dn="cn=Manager,dc=bigbang,dc=dyndns,dc=org" write by self write by * readこの編集したslapd.confを適当な場所へバックアップします。
# cp /etc/openldap/slapd.conf.bak /tmp/slapd.conf作成されたデータベースを削除します。
# rm -f /vat/lib/ldap/*/etc/openldap/slapd.dフォルダに作成されてしまう設定データベースを削除します(rpmインストール時のデフォルトが書き込まれる)。
# rm -rf /etc/openldap/slapd.d/*
バージョンが2.4.23に変更になったときに、この後
# yum -y install openldap-servers を実行しました。
openldap-serversを削除します。
# yum -y remove openldap-servers/etc/openldap/slapd.confが存在しないことを確認します。もし存在している場合は削除してください。
openldap-serversを再インストールします。
# yum -y install openldap-serversDB_CONFIGを元に戻します。
# cp /etc/openldap/DB_CONFIG.example /var/lib/ldap/DB_CONFIG ← CentOS 5の場合 # cp /usr/share/doc/openldap-servers-2.4.19/DB_CONFIG.example /var/lib/ldap/DB_CONFIG # cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG ↑ CentOS 6の場合 # chown ldap.ldap /var/lib/ldap/DB_CONFIG先ほどバックアップしたslapd.confを戻します。所有者及びアクセス権を変更します。
# mv /tmp/slapd.conf /etc/openldap/slapd.conf # chown ldap.ldap /etc/openldap/slapd.conf # chmod 640 /etc/openldap/slapd.conf設定データベースを再構築。
# sudo -u ldap slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d bdb_db_open: database "dc=bigbang,dc=dyndns,dc=org": db_open(/var/lib/ldap/id2entry.bdb) \ failed: No such file or directory (2). backend_startup_one (type=bdb, suffix="dc=bigbang,dc=dyndns,dc=org"): bi_db_open failed! (2) slap_startup failed (test would succeed using the -u switch)
# ls -l /var/lib/ldap -rw-r--r-- 1 ldap ldap 921 10月 21 00:41 2011 DB_CONFIG -rw------- 1 ldap ldap 24576 10月 21 00:43 2011 __db.001 -rw------- 1 ldap ldap 14852096 10月 21 00:43 2011 __db.002 -rw------- 1 ldap ldap 335552512 10月 21 00:43 2011 __db.003 -rw------- 1 ldap ldap 2359296 10月 21 00:43 2011 __db.004 -rw------- 1 ldap ldap 548864 10月 21 00:43 2011 __db.005 -rw------- 1 ldap ldap 32768 10月 21 00:43 2011 __db.006 -rw-r--r-- 1 ldap ldap 2048 10月 21 00:43 2011 alock # ls -l /etc/openldap/slapd.d drwxr-x--- 3 ldap ldap 4096 10月 21 00:43 2011 cn=config -rw------- 1 ldap ldap 1007 10月 21 00:43 2011 cn=config.ldif # ls -l /etc/openldap/slapd.d/cn\=config drwxr-x--- 2 ldap ldap 4096 10月 21 00:43 2011 cn=schema -rw------- 1 ldap ldap 51236 10月 21 00:43 2011 cn=schema.ldif -rw------- 1 ldap ldap 499 10月 21 00:43 2011 olcDatabase={-1}frontend.ldif -rw------- 1 ldap ldap 487 10月 21 00:43 2011 olcDatabase={0}config.ldif -rw------- 1 ldap ldap 2698 10月 21 00:43 2011 olcDatabase={1}bdb.ldif -rw------- 1 ldap ldap 687 10月 21 00:43 2011 olcDatabase={2}monitor.ldif
以降、slapd.d以下がメインで使われるので、slapd.confは不要…になります。
slapd起動します。
# service slapd start
slapd を起動中: [ OK ]
slapd自動起動するようにします。
# chkconfig slapd on
ls -l /var/lib/ldap -rw------- 1 ldap ldap 24576 10月 21 00:47 2011 __db.001 -rw------- 1 ldap ldap 14852096 10月 21 00:47 2011 __db.002 -rw------- 1 ldap ldap 335552512 10月 21 00:47 2011 __db.003 -rw------- 1 ldap ldap 2359296 10月 21 00:47 2011 __db.004 -rw------- 1 ldap ldap 548864 10月 21 00:47 2011 __db.005 -rw------- 1 ldap ldap 32768 10月 21 00:47 2011 __db.006 -rw-r--r-- 1 ldap ldap 2048 10月 21 00:47 2011 alock -rw------- 1 ldap ldap 8192 10月 21 00:47 2011 dn2id.bdb -rw------- 1 ldap ldap 32768 10月 21 00:47 2011 id2entry.bdb -rw------- 1 ldap ldap 10485760 10月 21 00:47 2011 log.0000000001
上記の方法、うまくいかなかったが判明したのは●ldifの作成の時でした。何度やっても登録することが出来ません。
# ldapadd -x -D cn=Manager,dc=bigbang,dc=dyndns,dc=org -W -f test1.ldif Enter LDAP Password: ldap_bind: Invalid credentials (49)ここで取った方法は/etc/openldap/slapd.d以下を一旦削除し、openldap-serversをreinstallしました。
この時のolcDatabase\=\{2\}hdb.ldifでおかしかった点は下記のとおりです。
修正前 # cat /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}hdb.ldif # AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify. # CRC32 ddef6772 dn: olcDatabase={2}hdb objectClass: olcDatabaseConfig objectClass: olcHdbConfig olcDatabase: {2}hdb olcSuffix: dc=my-domain,dc=com olcAddContentAcl: FALSE olcLastMod: TRUE olcMaxDerefDepth: 15 olcReadOnly: FALSE olcRootDN: cn=Manager,dc=my-domain,dc=com olcSyncUseSubentry: FALSE olcMonitoring: TRUE olcDbDirectory: /var/lib/ldap olcDbCacheSize: 1000 olcDbCheckpoint: 1024 15 olcDbNoSync: FALSE olcDbDirtyRead: FALSE olcDbIDLcacheSize: 0 olcDbIndex: objectClass pres,eq olcDbIndex: cn pres,eq,sub olcDbIndex: uid pres,eq,sub olcDbIndex: uidNumber pres,eq olcDbIndex: gidNumber pres,eq olcDbIndex: ou pres,eq,sub olcDbIndex: mail pres,eq,sub olcDbIndex: loginShell pres,eq olcDbIndex: sn pres,eq,sub olcDbIndex: givenName pres,eq,sub olcDbIndex: memberUid pres,eq,sub olcDbIndex: nisMapName pres,eq,sub olcDbIndex: nisMapEntry pres,eq,sub olcDbLinearIndex: FALSE olcDbMode: 0600 olcDbSearchStack: 16 olcDbShmKey: 0 olcDbCacheFree: 1 olcDbDNcacheSize: 0 structuralObjectClass: olcHdbConfig entryUUID: 5f484368-c32c-1030-909e-b59d390b637e creatorsName: cn=config createTimestamp: 20111225101010Z entryCSN: 20111225101010.160563Z#000000#000#000000 modifiersName: cn=config modifyTimestamp: 20111225101010Z 修正後 # cat /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{1\}hdb.ldif # AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify. # CRC32 19eac940 dn: olcDatabase={1}hdb objectClass: olcDatabaseConfig objectClass: olcHdbConfig olcDatabase: {1}hdb olcSuffix: dc=bigbang,dc=dyndns,dc=org olcAccess: {0}to attrs=userPassword by self write by dn.base="cn=Manager,dc= \ bigbang,dc=dyndns,dc=org" write by anonymous auth by * none olcAccess: {1}to attrs=shadowLastChange by self write by * read olcAccess: {2}to * by dn.base="cn=Manager,dc=bigbang,dc=dyndns,dc=org" write by self write by * read olcAddContentAcl: FALSE olcLastMod: TRUE olcMaxDerefDepth: 15 olcReadOnly: FALSE olcRootDN: cn=Manager,dc=bigbang,dc=dyndns,dc=org olcRootPW:: 98hiufadohnignsirouhgouwnrijoIUHunrufhosuGBUyebaief olcSyncUseSubentry: FALSE olcMonitoring: TRUE olcDbDirectory: /var/lib/ldap olcDbCacheSize: 1000 olcDbCheckpoint: 1024 15 olcDbConfig: {0}# $OpenLDAP$ olcDbConfig: {1}# Example DB_CONFIG file for use with slapd(8) BDB/HDB databas es. olcDbConfig: {2}# olcDbConfig: {3}# See the Oracle Berkeley DB documentation olcDbConfig: {4}# <http://www.oracle.com/technology/documentation/berkeley-d b/db/ref/env/db_config.html> olcDbConfig: {5}# for detail description of DB_CONFIG syntax and semantics. olcDbConfig: {6}# olcDbConfig: {7}# Hints can also be found in the OpenLDAP Software FAQ olcDbConfig:: ezh9Iwk8aHR0cDovL3d3dy5vcGVubGRhcC5vcmcvZmFxL2luZGV4LmNnaT9maWxl PTI+ olcDbConfig: {9}# in particular: olcDbConfig: {10}# <http://www.openldap.org/faq/index.cgi?file=1075> olcDbConfig: {11} olcDbConfig: {12}# Note: most DB_CONFIG settings will take effect only upon re building olcDbConfig: {13}# the DB environment. olcDbConfig: {14} olcDbConfig: {15}# one 0.25 GB cache olcDbConfig: {16}set_cachesize 0 268435456 1 olcDbConfig: {17} olcDbConfig: {18}# Data Directory olcDbConfig: {19}#set_data_dir db olcDbConfig: {20} olcDbConfig: {21}# Transaction Log settings olcDbConfig: {22}set_lg_regionmax 262144 olcDbConfig: {23}set_lg_bsize 2097152 olcDbConfig: {24}#set_lg_dir logs olcDbConfig: {25} olcDbConfig: {26}# Note: special DB_CONFIG flags are no longer needed for "qui ck" olcDbConfig:: ezI3fSMgc2xhcGFkZCg4KSBvciBzbGFwaW5kZXgoOCkgYWNjZXNzIChzZWUgdGhl aXIgLXEgb3B0aW9uKS4g olcDbNoSync: FALSE olcDbDirtyRead: FALSE olcDbIDLcacheSize: 0 olcDbIndex: objectClass pres,eq olcDbIndex: cn pres,eq,sub olcDbIndex: uid pres,eq,sub olcDbIndex: uidNumber pres,eq olcDbIndex: gidNumber pres,eq olcDbIndex: ou pres,eq,sub olcDbIndex: mail pres,eq,sub olcDbIndex: loginShell pres,eq olcDbIndex: sn pres,eq,sub olcDbIndex: givenName pres,eq,sub olcDbIndex: memberUid pres,eq,sub olcDbIndex: nisMapName pres,eq,sub olcDbIndex: nisMapEntry pres,eq,sub olcDbLinearIndex: FALSE olcDbMode: 0600 olcDbSearchStack: 16 olcDbShmKey: 0 olcDbCacheFree: 1 olcDbDNcacheSize: 0 structuralObjectClass: olcHdbConfig entryUUID: af795c3a-c338-1030-88dd-8533e369faf3 creatorsName: cn=config createTimestamp: 20111225113818Z entryCSN: 20111225113818.660555Z#000000#000#000000 modifiersName: cn=config modifyTimestamp: 20111225113818Z
LDAPクライアントの設定を行っていない場合は●LDAPクライアントのインストール及び設定(CentOS 6、Fedora 15編)を参照して設定してください。
●SSSD+LDAP+SUDOの構築
参照URL:認証システムSSSD+LDAP+SUDOの構築手順
LDAPサーバとユーザーデータは既にあるものとします。
まず、SSSDをインストールします。nscdは共存できない(するべきではない)ので、削除しておきます。
# yum erase nscd # yum install sssd sssd-client sssd-common sssd-ldap openldap-clients # systemctl enable sssd # systemctl status sssd自動設定をします。しかい、設定内容がぐちゃぐちゃであるのとsudo関連での設定が不足しているので、直接作成した方がいいかもしれません。
authconfigで設定 # authconfig --test # authconfig \ --enablesssd --enablesssdauth --enablelocauthorize \ --enableldap --enableldapauth --disableldaptls \ --ldapserver=ldap://192.168.0.1,192.168.0.2 \ --ldapbasedn="dc=bigbang,dc=dyndns,dc=org" --enablemkhomedir \ --update/etc/sssd/sssd.confを編集します。ファイルが存在しない(CentOS 6では新規作成しました。)場合は作成してください。
# vi /etc/sssd/sssd.conf [sssd] debug_level = 0 config_file_version = 2 services = nss, pam, ssh, sudo domains = default [domain/default] id_provider = ldap auth_provider = ldap chpass_provider = ldap sudo_provider = ldap ldap_uri = ldap://192.168.0.1/,ldap://192.168.0.2/ ldap_search_base = dc=bigbang,dc=dyndns,dc=org ldap_sudo_search_base = ou=SUDOers,dc=bigbang,dc=dyndns,dc=org ldap_id_use_start_tls = False ldap_search_timeout = 3 ldap_network_timeout = 3 ldap_opt_timeout = 3 ldap_enumeration_search_timeout = 60 ldap_enumeration_refresh_timeout = 300 ldap_connection_expire_timeout = 600 ldap_sudo_smart_refresh_interval = 600 ldap_sudo_full_refresh_interval = 10800 entry_cache_timeout = 1200 cache_credentials = True [nss] homedir_substring = /home entry_negative_timeout = 20 entry_cache_nowait_percentage = 50 [pam] [sudo] [autofs] [ssh] [pac] [ifp]直接ファイルを作成した場合は、権限を設定します。
# chmod 600 /etc/sssd/sssd.conf # chown root:root /etc/sssd/sssd.conf/etc/nsswitch.confを編集します(authconfigではsudoersを設定することはできません)。
また、必要に応じて/etc/sudoersを編集します。
# /etc/nsswitch.conf passwd: files sss shadow: files sss group: files sss sudoers: files sss # visudo sato ALL=(ALL) ALL再起動してデータの確認をします。
# systemctl restart sssd # id example_user # su - example_user # sudo ls /rootキャッシュ周りの確認をしたいときなどはキャッシュデータを削除しつつ再起動します。nscd -i passwdのようなクリーンアップツールsss_cacheもあります。
キャッシュの削除 # rm /var/lib/sss/db/cache_default.ldb # systemctl restart sssd古いOpenSSHだと、OpenSSH-LPKというパッチを当ててコンパイルすることでSSHとLDAPを連携していましたが、v6.2 からはAuthorizedKeysCommandという設定で連携できるようになりました。
アンコメント or 追記します。
# vi /etc/ssh/sshd_config AuthorizedKeysCommand /usr/bin/sss_ssh_authorizedkeys AuthorizedKeysCommandUser root #UsePAM yes再起動し、他のクライアントからSSHで接続してみます。
# systemctl restart sssd # systemctl restart sshd失敗したら、sss_ssh_authorizedkeys example_userでLDAPの公開鍵を標準出力できているかの確認やsshd, sssdのログを確認します。
●SSHでログインできるか確認する
接続先のOSがCentOS 6でsshd_configの設定でRSAAuthentication yesが有効になっている場合、すんなりログインできました。
ところが接続先のOSがCentOS 7の場合、RSAAuthentication yesが有効になっていてもログインすることができませんでした。もちろんパスワードの間違いではありません。
[user@centos6 ~]$ ssh -l sato n-server sato@n-server's password: Permission denied, please try again. sato@n-server's password: Permission denied, please try again. sato@n-server's password: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).この問題を解消するために下記の設定変更を実施しました。
/etc/pam.d/system-authでところどころに記載されている「sss」を「ldap」へ修正します。
#%PAM-1.0 # This file is auto-generated. # User changes will be destroyed the next time authconfig is run. auth required pam_env.so auth sufficient pam_fprintd.so auth [default=1 success=ok] pam_localuser.so auth [success=done ignore=ignore default=die] pam_unix.so nullok try_first_pass auth requisite pam_succeed_if.so uid >= 1000 quiet_success #auth sufficient pam_sss.so forward_pass auth sufficient pam_ldap.so forward_pass auth required pam_deny.so account required pam_unix.so broken_shadow account sufficient pam_localuser.so account sufficient pam_succeed_if.so uid < 1000 quiet #account [default=bad success=ok user_unknown=ignore] pam_sss.so account [default=bad success=ok user_unknown=ignore] pam_ldao.so account required pam_permit.so password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok #password sufficient pam_sss.so use_authtok password sufficient pam_ldap.so use_authtok password required pam_deny.so session optional pam_keyinit.so revoke session required pam_limits.so -session optional pam_systemd.so session optional pam_oddjob_mkhomedir.so skel=/etc/skel umask=077 session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid session required pam_unix.so #session optional pam_sss.so session optional pam_ldap.so/etc/pam.d/password-authでところどころに記載されている「sss」を「ldap」へ修正します。
#%PAM-1.0 # This file is auto-generated. # User changes will be destroyed the next time authconfig is run. auth required pam_env.so auth [default=1 success=ok] pam_localuser.so auth [success=done ignore=ignore default=die] pam_unix.so nullok try_first_pass auth requisite pam_succeed_if.so uid >= 1000 quiet_success #auth sufficient pam_sss.so forward_pass auth sufficient pam_ldap.so forward_pass auth required pam_deny.so account required pam_unix.so broken_shadow account sufficient pam_localuser.so account sufficient pam_succeed_if.so uid < 1000 quiet #account [default=bad success=ok user_unknown=ignore] pam_sss.so account [default=bad success=ok user_unknown=ignore] pam_ldap.so account required pam_permit.so password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok #password sufficient pam_sss.so use_authtok password sufficient pam_ldap.so use_authtok password required pam_deny.so session optional pam_keyinit.so revoke session required pam_limits.so -session optional pam_systemd.so session optional pam_oddjob_mkhomedir.so skel=/etc/skel umask=077 session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid session required pam_unix.so #session optional pam_sss.so session optional pam_ldap.so/etc/nsswitch.confでところどころに記載されている「sss」を「ldap」へ修正します。
(・・・途中省略・・・) #passwd: files sss #shadow: files sss #group: files sss passwd: files ldap shadow: files ldap group: files ldap ・・・ rpc: files #services: files sss services: files ldap #netgroup: files sss netgroup: files ldap (・・・途中省略・・・)nslcdを再起動します。
# systemctl restart nslcdローカルでSSHログインできるかどうか確認します。
$ ssh sato@localhost sato@localhost's password: Creating home directory for sato. Attempting to create directory /home/sato/perl5リモートでSSHログインできるかどうか確認します。
$ ssh sato@n-server sato@n-server's password: Creating home directory for sato. Attempting to create directory /home/sato/perl5無事ログインすることができました。
●passwdコマンドでLDAPユーザのパスワードを変更することが出来ない
後で分かったことですが、passwdコマンドでLDAPユーザのパスワードを変更することが出来ない現象が発生しました。
CentOS 7でも、passwdコマンドでLDAPユーザのパスワードを変更することが出来ない現象が発生しました。(2016.04)
※CentOS 6の場合
$ passwd
ユーザ test1000 のパスワードを変更。
Enter login(LDAP) password:
新しいパスワード:
新しいパスワードを再入力してください:
LDAP password information update failed: Insufficient access
passwd: 認証トークン操作エラー
その時のログは下記のとおりです。
Dec 21 13:22:36 serverA slapd[21466]: conn=1000 op=12 SRCH base="dc=bigbang,dc=dyndns,dc=org" scope=2 deref=0 filter="(&(objectClass=posixAccount)(uidNumber=1000))"
Dec 21 13:22:36 serverA slapd[21466]: conn=1000 op=12 SRCH attr=userPassword cn gidNumber uidNumber
loginShell objectClass gecos uid homeDirectory
Dec 21 13:22:36 serverA slapd[21466]: conn=1000 op=12 SEARCH RESULT tag=101 err=0 nentries=1 text=
Dec 21 13:22:36 serverA slapd[21466]: conn=1001 op=10 SRCH base="dc=bigbang,dc=dyndns,dc=org" scope=2 deref=0 filter="(&(objectClass=posixAccount)(uid=test1000))"
Dec 21 13:22:36 serverA slapd[21466]: conn=1001 op=10 SRCH attr=userPassword cn gidNumber uidNumber loginShell objectClass gecos uid homeDirectory
Dec 21 13:22:36 serverA slapd[21466]: conn=1001 op=10 SEARCH RESULT tag=101 err=0 nentries=1 text=
Dec 21 13:22:36 serverA slapd[21466]: conn=1016 fd=27 ACCEPT from IP=127.0.0.1:36043 (IP=0.0.0.0:38
9) Dec 21 13:22:36 serverA slapd[21466]: conn=1016 op=0 BIND dn="" method=128
Dec 21 13:22:36 serverA slapd[21466]: conn=1016 op=0 RESULT tag=97 err=0 text=
Dec 21 13:22:36 serverA slapd[21466]: conn=1016 op=1 SRCH base="dc=bigbang,dc=dyndns,dc=org" scope=2 deref=0 filter="(uid=test1000)"
Dec 21 13:22:36 serverA slapd[21466]: conn=1016 op=1 SRCH attr=host authorizedService shadowExpire shadowFlag shadowInactive shadowLastChange shadowMax shadowMin shadowWarning uidNumber
Dec 21 13:22:36 serverA slapd[21466]: conn=1016 op=1 SEARCH RESULT tag=101 err=0 nentries=1 text=
Dec 21 13:22:40 serverA slapd[21466]: conn=1016 op=2 BIND dn="uid=test1000,ou=people,dc=bigbang,dc=dyndns,dc=org" method=128
Dec 21 13:22:40 serverA slapd[21466]: conn=1016 op=2 BIND dn="uid=test1000,ou=people,dc=bigbang,dc=dyndns,dc=org" mech=SIMPLE ssf=0
Dec 21 13:22:40 serverA slapd[21466]: conn=1016 op=2 RESULT tag=97 err=0 text=
Dec 21 13:22:40 serverA slapd[21466]: conn=1016 op=3 BIND anonymous mech=implicit ssf=0
Dec 21 13:22:40 serverA slapd[21466]: conn=1016 op=3 BIND dn="" method=128
Dec 21 13:22:40 serverA slapd[21466]: conn=1016 op=3 RESULT tag=97 err=0 text=
Dec 21 13:22:40 serverA slapd[21466]: conn=1002 op=11 SRCH base="dc=bigbang,dc=dyndns,dc=org" scope=2 deref=0 filter="(&(objectClass=posixAccount)(uid=test1000))"
Dec 21 13:22:40 serverA slapd[21466]: conn=1002 op=11 SRCH attr=userPassword cn gidNumber uidNumber loginShell objectClass gecos uid homeDirectory
Dec 21 13:22:40 serverA slapd[21466]: conn=1002 op=11 SEARCH RESULT tag=101 err=0 nentries=1 text=
Dec 21 13:22:44 serverA slapd[21466]: conn=1003 op=14 SRCH base="dc=bigbang,dc=dyndns,dc=org" scope=2 deref=0 filter="(&(objectClass=posixAccount)(uidNumber=1000))"
Dec 21 13:22:44 serverA slapd[21466]: conn=1003 op=14 SRCH attr=userPassword cn gidNumber uidNumber loginShell objectClass gecos uid homeDirectory
Dec 21 13:22:44 serverA slapd[21466]: conn=1003 op=14 SEARCH RESULT tag=101 err=0 nentries=1 text=
Dec 21 13:22:47 serverA slapd[21466]: conn=1016 op=4 BIND dn="uid=test1000,ou=people,dc=bigbang,dc=dyndns,dc=org" method=128
Dec 21 13:22:47 serverA slapd[21466]: conn=1016 op=4 BIND dn="uid=test1000,ou=people,dc=bigbang,dc=dyndns,dc=org" mech=SIMPLE ssf=0 Dec 21 13:22:47 serverA slapd[21466]: conn=1016 op=4 RESULT tag=97 err=0 text=
Dec 21 13:22:47 serverA slapd[21466]: conn=1016 op=5 MOD dn="uid=test1000,ou=people,dc=bigbang,dc=dyndns,dc=org"
Dec 21 13:22:47 serverA slapd[21466]: conn=1016 op=5 MOD attr=userPassword
Dec 21 13:22:47 serverA slapd[21466]: conn=1016 op=5 RESULT tag=103 err=50 text=
Dec 21 13:22:47 serverA slapd[21466]: conn=1004 op=12 SRCH base="dc=bigbang,dc=dyndns,dc=org" scope=2 deref=0 filter="(&(objectClass=posixAccount)(uid=test1000))"
Dec 21 13:22:47 serverA slapd[21466]: conn=1004 op=12 SRCH attr=userPassword cn gidNumber uidNumber loginShell objectClass gecos uid homeDirectory
Dec 21 13:22:47 serverA slapd[21466]: conn=1004 op=12 SEARCH RESULT tag=101 err=0 nentries=1 text=
Dec 21 13:22:47 serverA slapd[21466]: conn=1000 op=13 SRCH base="dc=bigbang,dc=dyndns,dc=org" scope=2 deref=0 filter="(&(objectClass=posixAccount)(uidNumber=1000))"
Dec 21 13:22:47 serverA slapd[21466]: conn=1000 op=13 SRCH attr=userPassword cn gidNumber uidNumber loginShell objectClass gecos uid homeDirectory
Dec 21 13:22:47 serverA slapd[21466]: conn=1000 op=13 SEARCH RESULT tag=101 err=0 nentries=1 text=
Dec 21 13:22:49 serverA slapd[21466]: conn=1016 op=6 UNBIND
Dec 21 13:22:49 serverA slapd[21466]: conn=1016 fd=27 closed
Dec 21 13:22:36 serverA slapd[21466]: conn=1000 op=12 SRCH attr=userPassword cn gidNumber uidNumber
loginShell objectClass gecos uid homeDirectory
Dec 21 13:22:36 serverA slapd[21466]: conn=1000 op=12 SEARCH RESULT tag=101 err=0 nentries=1 text=
Dec 21 13:22:36 serverA slapd[21466]: conn=1001 op=10 SRCH base="dc=bigbang,dc=dyndns,dc=org" scope=2 deref=0 filter="(&(objectClass=posixAccount)(uid=test1000))"
Dec 21 13:22:36 serverA slapd[21466]: conn=1001 op=10 SRCH attr=userPassword cn gidNumber uidNumber loginShell objectClass gecos uid homeDirectory
Dec 21 13:22:36 serverA slapd[21466]: conn=1001 op=10 SEARCH RESULT tag=101 err=0 nentries=1 text=
Dec 21 13:22:36 serverA slapd[21466]: conn=1016 fd=27 ACCEPT from IP=127.0.0.1:36043 (IP=0.0.0.0:38
9) Dec 21 13:22:36 serverA slapd[21466]: conn=1016 op=0 BIND dn="" method=128
Dec 21 13:22:36 serverA slapd[21466]: conn=1016 op=0 RESULT tag=97 err=0 text=
Dec 21 13:22:36 serverA slapd[21466]: conn=1016 op=1 SRCH base="dc=bigbang,dc=dyndns,dc=org" scope=2 deref=0 filter="(uid=test1000)"
Dec 21 13:22:36 serverA slapd[21466]: conn=1016 op=1 SRCH attr=host authorizedService shadowExpire shadowFlag shadowInactive shadowLastChange shadowMax shadowMin shadowWarning uidNumber
Dec 21 13:22:36 serverA slapd[21466]: conn=1016 op=1 SEARCH RESULT tag=101 err=0 nentries=1 text=
Dec 21 13:22:40 serverA slapd[21466]: conn=1016 op=2 BIND dn="uid=test1000,ou=people,dc=bigbang,dc=dyndns,dc=org" method=128
Dec 21 13:22:40 serverA slapd[21466]: conn=1016 op=2 BIND dn="uid=test1000,ou=people,dc=bigbang,dc=dyndns,dc=org" mech=SIMPLE ssf=0
Dec 21 13:22:40 serverA slapd[21466]: conn=1016 op=2 RESULT tag=97 err=0 text=
Dec 21 13:22:40 serverA slapd[21466]: conn=1016 op=3 BIND anonymous mech=implicit ssf=0
Dec 21 13:22:40 serverA slapd[21466]: conn=1016 op=3 BIND dn="" method=128
Dec 21 13:22:40 serverA slapd[21466]: conn=1016 op=3 RESULT tag=97 err=0 text=
Dec 21 13:22:40 serverA slapd[21466]: conn=1002 op=11 SRCH base="dc=bigbang,dc=dyndns,dc=org" scope=2 deref=0 filter="(&(objectClass=posixAccount)(uid=test1000))"
Dec 21 13:22:40 serverA slapd[21466]: conn=1002 op=11 SRCH attr=userPassword cn gidNumber uidNumber loginShell objectClass gecos uid homeDirectory
Dec 21 13:22:40 serverA slapd[21466]: conn=1002 op=11 SEARCH RESULT tag=101 err=0 nentries=1 text=
Dec 21 13:22:44 serverA slapd[21466]: conn=1003 op=14 SRCH base="dc=bigbang,dc=dyndns,dc=org" scope=2 deref=0 filter="(&(objectClass=posixAccount)(uidNumber=1000))"
Dec 21 13:22:44 serverA slapd[21466]: conn=1003 op=14 SRCH attr=userPassword cn gidNumber uidNumber loginShell objectClass gecos uid homeDirectory
Dec 21 13:22:44 serverA slapd[21466]: conn=1003 op=14 SEARCH RESULT tag=101 err=0 nentries=1 text=
Dec 21 13:22:47 serverA slapd[21466]: conn=1016 op=4 BIND dn="uid=test1000,ou=people,dc=bigbang,dc=dyndns,dc=org" method=128
Dec 21 13:22:47 serverA slapd[21466]: conn=1016 op=4 BIND dn="uid=test1000,ou=people,dc=bigbang,dc=dyndns,dc=org" mech=SIMPLE ssf=0 Dec 21 13:22:47 serverA slapd[21466]: conn=1016 op=4 RESULT tag=97 err=0 text=
Dec 21 13:22:47 serverA slapd[21466]: conn=1016 op=5 MOD dn="uid=test1000,ou=people,dc=bigbang,dc=dyndns,dc=org"
Dec 21 13:22:47 serverA slapd[21466]: conn=1016 op=5 MOD attr=userPassword
Dec 21 13:22:47 serverA slapd[21466]: conn=1016 op=5 RESULT tag=103 err=50 text=
Dec 21 13:22:47 serverA slapd[21466]: conn=1004 op=12 SRCH base="dc=bigbang,dc=dyndns,dc=org" scope=2 deref=0 filter="(&(objectClass=posixAccount)(uid=test1000))"
Dec 21 13:22:47 serverA slapd[21466]: conn=1004 op=12 SRCH attr=userPassword cn gidNumber uidNumber loginShell objectClass gecos uid homeDirectory
Dec 21 13:22:47 serverA slapd[21466]: conn=1004 op=12 SEARCH RESULT tag=101 err=0 nentries=1 text=
Dec 21 13:22:47 serverA slapd[21466]: conn=1000 op=13 SRCH base="dc=bigbang,dc=dyndns,dc=org" scope=2 deref=0 filter="(&(objectClass=posixAccount)(uidNumber=1000))"
Dec 21 13:22:47 serverA slapd[21466]: conn=1000 op=13 SRCH attr=userPassword cn gidNumber uidNumber loginShell objectClass gecos uid homeDirectory
Dec 21 13:22:47 serverA slapd[21466]: conn=1000 op=13 SEARCH RESULT tag=101 err=0 nentries=1 text=
Dec 21 13:22:49 serverA slapd[21466]: conn=1016 op=6 UNBIND
Dec 21 13:22:49 serverA slapd[21466]: conn=1016 fd=27 closed
調べたところ、/etc/openldap/slapd.d/cn\=config/olcDatabase\=\{1\}bdb.ldifの設定が問題なく動作するものとは異なっていました。下記を追加し、LDAPサーバを再起動後、passwdコマンドで変更出来るようになりました。
olcAccess: {0}to attrs=userPassword by dn="cn=Manager,dc=bigbang,dc=dyndns,dc=org" \ write by anonymous auth by self write by * none olcAccess: {1}to attrs=shadowLastChange by self write by * read olcAccess: {2}to dn.base="" by * read olcAccess: {3}to * by dn="cn=Manager,dc=bigbang,dc=dyndns,dc=org" write by * read
※CentOS 7の場合(rootでのpasswd実行が不可。一般ユーザは問題無し。)
# passwd test5001
ユーザ test5001 のパスワードを変更。
LDAP administrator password:
root によるパスワードのリセットはサポートされません。
passwd: 認証トークン操作エラー
その時のログは下記のとおりです。
Apr 13 14:27:24 serverA passwd: pam_unix(passwd:chauthtok): user "test5001" does not exist in /etc/passwd
Apr 13 14:27:24 serverA passwd: pam_sss(passwd:chauthtok): Authentication failed for user test5001: 6 (拒否されたパーミッション)
Apr 13 14:27:24 serverA passwd: pam_sss(passwd:chauthtok): User info message: root によるパスワードのリセットはサポートされません。
Apr 13 14:27:24 serverA passwd: pam_sss(passwd:chauthtok): Authentication failed for user test5001: 6 (拒否されたパーミッション)
Apr 13 14:27:24 serverA passwd: pam_sss(passwd:chauthtok): User info message: root によるパスワードのリセットはサポートされません。
CentOS 7の場合の対応方法は「●LDAPクライアントのセットアップ(CentOS 7)を参照してください。
2016年4月現在、この原因は解決していません。
●OpenLDAPサーバのログ出力
OpenLDAPサーバは、インストールしたそのままの状態でログを記録するようには設定されていません。これは、肥大化するログがディスク領域を圧迫したり、パフォーマンスに影響を与えやすいディスクへの書き込みが少ない設定でもあります。
しかしながらこのままの設定では、日々起こり得る、OpenLDAPサーバにとって不都合な事象を見逃して、不安定な運用にもつながりかねません。また、いざ障害が発生したときに、その原因を追究し、再発防止を検討する糸口を得られなかったりする可能性もあります。このため、管理上有効な情報はログとして記録し、定期的に古いログを削除できる設定が必要になります。
OpenLDAPサーバは、デフォルトでsyslogのLOCAL4ファシリティにログを送付しています。このため、syslog.conf(またはrsyslog.conf)ファイルの設定を変更することで、syslogがOpenLDAPサーバのログを受けて記録できるようになります。
# vi /etc/syslog.conf または # vi /etc/rsyslog.conf
[...略...]
local4.* /var/log/slapd.log ← を追加
# service syslog restart
syslogd(またはrsyslogd)とslapdを再起動します。これでLDAPのログを取ることができます。
出力するログの内容を変更するには「●ログレベルの変更 」を参照してください。
ログローテーションさせるには下記のように設定します。
# vi /etc/logrotate.d/syslog
/var/log/cron
/var/log/iptables.log
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/slapd.log
/var/log/spooler
{
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}
●ldifの作成及びエントリの追加
日本語が含まれているLDIFファイルを登録する場合には、LDIFファイルがUTF-8エンコーディングされている必要があります。
OpenLDAPのバージョンが2.4.19から2.4.23に変更後、起動しなくなりました。その際の内容は下記のとおりです。
# ldapadd -x -D cn=Manager,dc=bigbang,dc=dyndns,dc=org -W -f test1.ldif Enter LDAP Password: ldap_bind: Invalid credentials (49)その後、エントリ追加できました。
次のようなldifファイルおよびldif作成用のスクリプトを用います。
# mkdir /var/lib/ldap/ldif # vi /var/lib/ldap/ldif/test1.ldif dn: dc=bigbang,dc=dyndns,dc=org objectClass: dcObject objectClass: organization dc: BIGBANG o: BIGBANG dn: cn=Manager,dc=bigbang,dc=dyndns,dc=org objectclass: organizationalRole cn: Manager dn: ou=People,dc=bigbang,dc=dyndns,dc=org objectClass: organizationalUnit ou: People dn: ou=Group,dc=bigbang,dc=dyndns,dc=org objectClass: organizationalUnit ou: Group dn: ou=Services,dc=bigbang,dc=dyndns,dc=org objectClass: organizationalUnit ou: Services dn: ou=Machines,dc=bigbang,dc=dyndns,dc=org objectClass: organizationalUnit ou: Machines/var/lib/ldap/ldif以下にldifを保存しておくのであれば、下記のように実行しよう。
# chmod -R 600 /var/lib/ldap/ldif ← 念のための設定
下記コマンドで追加します。
# ldapadd -x -D cn=Manager,dc=bigbang,dc=dyndns,dc=org -W -f test1.ldif
- 上記test2.ldifで登録した情報を削除するには下記のようにします。
# ldapdelete -x -D "cn=Manager,dc=bigbang,dc=dyndns,dc=org" -W -f "test1_del.ldif" Enter LDAP Password: test1_del.ldifの内容 ou=People,dc=bigbang,dc=dyndns,dc=org ou=Group,dc=bigbang,dc=dyndns,dc=org ou=Services,dc=bigbang,dc=dyndns,dc=org ou=Machines,dc=bigbang,dc=dyndns,dc=org cn=Manager,dc=bigbang,dc=dyndns,dc=org dc=bigbang,dc=dyndns,dc=org
このようにすることにより、容易に登録情報を削除することが出来ます。
- 補足
# vi /var/lib/ldap/ldif/test2.sh #!/bin/bash SUFFIX="dc=bigbang,dc=dyndns,dc=org" OU_USERS="ou=People" OU_Group="ou=Group" BASE_NUM=1000 MAX_USERS=10 COUNTER=0 while [ $COUNTER -lt $MAX_USERS ] do echo dn: uid=test$BASE_NUM,$OU_USERS,$SUFFIX echo uid: test$BASE_NUM echo cn: test$BASE_NUM echo objectClass: account echo objectClass: posixAccount echo objectClass: shadowAccount echo userPassword: `slappasswd -s test$BASE_NUM` echo shadowLastChange: $((`date +%s`/(60*60*24))) echo shadowMax: 99999 echo shadowWarning: 7 echo loginShell: /bin/bash echo uidNumber: $BASE_NUM echo gidNumber: $BASE_NUM echo homeDirectory: /home/test$BASE_NUM echo gecos: test$BASE_NUM; echo echo dn: cn=test$BASE_NUM,$OU_Group,$SUFFIX echo objectClass: posixGroup echo cn: test$BASE_NUM echo userPassword: ! echo gidNumber: $BASE_NUM; echo BASE_NUM=`expr $BASE_NUM + 1` COUNTER=`expr $COUNTER + 1` done # sh test2.sh > test2.ldif/var/lib/ldap/ldif以下にldifを保存しておくのであれば、下記のように実行しよう。
# chmod -R 600 /var/lib/ldap/ldif ← 念のための設定
下記コマンドで追加します。
# ldapadd -x -D cn=Manager,dc=bigbang,dc=dyndns,dc=org -W -f test2.ldif追加されたエントリを確認します。
# ldapsearch -x -h localhost -b dc=bigbang,dc=dyndns,dc=org -LLL
- 上記test2.ldifで登録した情報を削除するには下記のようにします。
# ldapdelete -x -D "cn=Manager,dc=bigbang,dc=dyndns,dc=org" -W -f "test2_del.ldif" Enter LDAP Password: test2_del.ldifの内容 uid=test1000,ou=People,dc=bigbang,dc=dyndns,dc=org cn=test1000,ou=Group,dc=bigbang,dc=dyndns,dc=org uid=test1001,ou=People,dc=bigbang,dc=dyndns,dc=org cn=test1001,ou=Group,dc=bigbang,dc=dyndns,dc=org uid=test1002,ou=People,dc=bigbang,dc=dyndns,dc=org cn=test1002,ou=Group,dc=bigbang,dc=dyndns,dc=org uid=test1003,ou=People,dc=bigbang,dc=dyndns,dc=org cn=test1003,ou=Group,dc=bigbang,dc=dyndns,dc=org uid=test1004,ou=People,dc=bigbang,dc=dyndns,dc=org cn=test1004,ou=Group,dc=bigbang,dc=dyndns,dc=org uid=test1005,ou=People,dc=bigbang,dc=dyndns,dc=org cn=test1005,ou=Group,dc=bigbang,dc=dyndns,dc=org uid=test1006,ou=People,dc=bigbang,dc=dyndns,dc=org cn=test1006,ou=Group,dc=bigbang,dc=dyndns,dc=org uid=test1007,ou=People,dc=bigbang,dc=dyndns,dc=org cn=test1007,ou=Group,dc=bigbang,dc=dyndns,dc=org uid=test1008,ou=People,dc=bigbang,dc=dyndns,dc=org cn=test1008,ou=Group,dc=bigbang,dc=dyndns,dc=org uid=test1009,ou=People,dc=bigbang,dc=dyndns,dc=org cn=test1009,ou=Group,dc=bigbang,dc=dyndns,dc=org
このようにすることにより、容易に登録情報を削除することが出来ます。
- 補足
●移行ツールを用いたエントリの追加
LDAPサーバへのエントリ登録については、これまでに説明したスクリプトなどを用いて新規アカウントを作成する方法のほか、PADLソフトウェアが配布する「MigrationTools」というスクリプトセットを用いて、既存アカウント(/etc/passwdファイルに存在するアカウント情報)を移行することも可能です。
CentOSに付属するopenldap-serversパッケージには、Perlで記述されたこの移行スクリプトセットが含まれています。これを利用すると、OpenLDAPサーバのインストール後、すぐに既存アカウントの移行が行えるようになっています。
移行ツールをインストールします。
# yum -y install migrationtools/etc/passwdから抽出したファイルを元に、登録用のLDIFファイルを作成する。作成にはmigrate_passwd.plを使用しますが、その前に/usr/share/migrationtools/migrate_common.phの以下の個所を修正します。
# cd /usr/share/migrationtools # vi migrate_common.ph $DEFAULT_MAIL_DOMAIN = "padl.com"; $DEFAULT_BASE = "dc=padl,dc=com"; ↓ のように変更 $DEFAULT_MAIL_DOMAIN = "dc=bigbang,dc=dyndns,dc=org"; $DEFAULT_BASE = "dc=bigbang,dc=dyndns,dc=org"; # diff migrate_common.ph migrate_common.ph.org 71c71 < $DEFAULT_MAIL_DOMAIN = "padl.com"; --- > $DEFAULT_MAIL_DOMAIN = "dc=bigbang,dc=dyndns,dc=org; 74c74 < $DEFAULT_BASE = "dc=bigbang,dc=dyndns,dc=org"; --- > $DEFAULT_BASE = "dc=padl,dc=com";移行登録用のLDIFを作成します。/etc/passwdファイルからユーザ情報を抽出します。数が少なければ、テキストエディタでも十分可能です。多い場合は、grepコマンドなどで抽出します。一般ユーザ及びグループは各IDは500番から始まるため、以下のように実行します。
# grep :5[0-9][0-9] /etc/passwd > user.list # grep :5[0-9][0-9] /etc/group > group.listmigrate_passwd.pl及びmigrate_group.plを実行します。
# /usr/share/migrationtools/migrate_passwd.pl user.list > user.ldif # /usr/share/migrationtools/migrate_group.pl group.list > group.ldif作成したuser.ldifとgroup.ldifをldapaddコマンドで追加します。
# ldapadd -f user.ldif -x -D "cn=Manager,dc=bigbang,dc=dyndns,dc=org" -W Enter LDAP Password: adding new entry "uid=user1,ou=People,dc=bigbang,dc=dyndns,dc=org" adding new entry "uid=user2,ou=People,dc=bigbang,dc=dyndns,dc=org" adding new entry "uid=user3,ou=People,dc=bigbang,dc=dyndns,dc=org" # ldapadd -f group.ldif -x -D "cn=Manager,dc=bigbang,dc=dyndns,dc=org" -W Enter LDAP Password: adding new entry "cn=user1,ou=Group,dc=bigbang,dc=dyndns,dc=org" adding new entry "cn=user2,ou=Group,dc=bigbang,dc=dyndns,dc=org" adding new entry "cn=user3,ou=Group,dc=bigbang,dc=dyndns,dc=org"以上で、ユーザアカウントのLDAPサーバへの移行は完了です。念のため、追加されたエントリを確認します。
# ldapsearch -x -h localhost -b dc=bigbang,dc=dyndns,dc=org -LLL追加されていればOKです。
●LDAPコマンド
LDAPコマンドの使用方法を記載します。
ユーザまたはグループの追加
ldapadd [オプションその1] [DN] [オプションその2] [ファイル名]
[オプションその1]
-h LDAPサーバを指定する(省略時はローカルホスト)
-x SASLを使わず簡易認証を用いる
-D 認証に利用するDNを指定する
[オプションその2]
-W 認証時のパスワードを対話的に入力する
-w 認証時のパスワードをコマンドラインで指定する
-f LDIFファイルを指定する
例は下記のとおりです。
$ ldapadd -x -D "cn=Manager,dc=bigbang,dc=dyndns,dc=org" -W -f users.ldif $ ldapadd -x -D "cn=Manager,dc=bigbang,dc=dyndns,dc=org" -W -f group.ldif
ユーザまたはグループの削除
ldapdelete [オプションその1] [DN] [オプションその2] [ユーザ・グループDN]
[オプションその1]
-h LDAPサーバを指定する(省略時はローカルホスト)
-x SASLを使わず簡易認証を用いる
-D 認証に利用するDNを指定する
[オプションその2]
-W 認証時のパスワードを対話的に入力する
-w 認証時のパスワードをコマンドラインで指定する
-f LDIFファイルを指定する
例は下記のとおりです。
$ ldapdelete -x -D "cn=Manager,dc=bigbang,dc=dyndns,dc=org" \ -W "uid=testuser,ou=People,dc=bigbang,dc=dyndns,dc=org" $ ldapdelete -x -D "cn=Manager,dc=bigbang,dc=dyndns,dc=org" \ -W "cn=testgrp,ou=Group,dc=bigbang,dc=dyndns,dc=org" $ ldapdelete -x -D "cn=Manager,dc=bigbang,dc=dyndns,dc=org" -W -f user_del.ldif
検索
ldapsearch [オプション] [DN] [検索条件]
[オプション]
-h LDAPサーバを指定する(省略時はローカルホスト)
-x SASLを使わず簡易認証を用いる
-D 認証に利用するDNを指定する
-W 認証時のパスワードを対話的に入力する
-w 認証時のパスワードをコマンドラインで指定する
-L 検索結果をLDIFv1形式で表示する
-LL 検索結果をコメントなしの形式で表示する
-LLL 検索結果をコメントとLDAPバージョン表示なしで表示する
例は下記のとおりです。
ldapsearch -x -LLL -b "dc=bigbang,dc=dyndns,dc=org" "(uid=testuser)"
パスワードの変更
ldappasswd [オプションその1] [DN] [オプションその2] [ユーザDN]
[オプションその1]
-h LDAPサーバを指定する(省略時はローカルホスト)
-x SASLを使わず簡易認証を用いる
-D 認証に利用するDNを指定する
[オプションその2]
-W 現在のパスワードを対話的に入力する
-w 現在のパスワードをコマンドラインから入力する
-S 新しいパスワードを対話的に入力する
-s 新しいパスワードをコマンドラインから入力する
注:-sも-Sオプションも付けないとパスワードが自動的に生成される
例は下記のとおりです。
自分自身で変更する場合(ldappasswd) $ ldappasswd -x -D "uid=test1000,ou=People,dc=bigbang,dc=dyndns,dc=org" -W -S
自分自身で変更する場合(passwd) ※CentOS 6の場合 $ passwd ユーザ hoge のパスワードを変更。 Enter login(LDAP) password: (現在のパスワードを入力) 新しいパスワード: 新しいパスワードを再入力してください: LDAP password information changed for hoge passwd: 全ての認証トークンが正しく更新できました。 ※CentOS 7の場合 $ passwd ユーザ hoge のパスワードを変更。 (current) LDAP Password: (現在のパスワードを入力) 新しいパスワード: 新しいパスワードを再入力してください: passwd: 全ての認証トークンが正しく更新できました。passwdによりLDAPパスワードが変更できない場合、LDAPサーバ側でパスワード変更権限を追加します。
管理者が変更する場合 $ ldappasswd -x -D "cn=Manager,dc=bigbang,dc=dyndns,dc=org" -W -S \ "uid=test1000,ou=People,dc=bigbang,dc=dyndns,dc=org" New password:(新しいパスワード) Re-enter new password:(新しいパスワード:再入力) Enter LDAP Password:(管理者のパスワード) Result: Success (0)パスワードポリシーが「pwdInHistory: 5」のように設定されている場合、LDAPはパスワード履歴を参照します。
$ ldappasswd -x -D "uid=test1000,ou=People,dc=bigbang,dc=dyndns,dc=org" -W -S New password:(履歴にあるパスワード) Re-enter new password:(履歴にあるパスワード:再入力) Enter LDAP Password:(現在のパスワード) Result: Constraint violation (19) Additional info: Password is in history of old passwords
アカウントのロック
ロックするためのldifを作成します。
# vi test1001_modify_lock.ldif dn: uid=test1001,ou=People,dc=bigbang,dc=dyndns,dc=org changetype: modify replace: loginShell loginShell: /bin/falseldapmodifyコマンドを実行します。
# ldapmodify -x -D cn=Manager,dc=bigbang,dc=dyndns,dc=org \ -W -f test1001_modify_lock.ldifldapsearchコマンドで確認します。
# ldapsearch -x -LLL -b "dc=bigbang,dc=dyndns,dc=org" "(uid=test1001)"
dn: uid=test1001,ou=People,dc=bigbang,dc=dyndns,dc=org
uid: test1001
cn: test1001
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
shadowMax: 99999
shadowWarning: 7
uidNumber: 1001
gidNumber: 1001
homeDirectory: /home/test1001
gecos: test1001
shadowLastChange: 15425
loginShell: /bin/false
loginShellが『/bin/false』に変更されていればOKです。
LDIFによるエントリの追加・削除・更新・識別名変更と未サポートのLDIF記述(詳細)
・エントリの追加
changetype行に“add”を指定し、次行から属性定義を記述します。
dn: cn=User002,ou=User,dc=bigbang,dc=mydns,dc=jp changetype: add objectclass: top objectclass: person objectclass: organizationalPerson cn: User002 sn: BIGBANG・エントリの削除
changetype行に“delete”を指定します。
dn: cn=User003,ou=User,dc=bigbang,dc=mydns,dc=jp changetype: delete・エントリの更新
エントリの属性、属性値に対して、追加、削除、置換を行うには、changetype行に“modify”を指定します。さらに、次行に変更方法を示す種別を指定します。
属性の変更種別は、以下の3つの中からどれか1つを指定します。
add: 属性名
dn行で指定したエントリに属性を追加します。その属性型がすでにエントリにある場合は、属性値を追加します。
delete: 属性名
dn行で指定したエントリから属性を削除します。その属性型に複数の属性値がある場合は、属性値すべてを削除します。複数の属性値のうち1つだけを削除する場合は、delete行の次の行で、属性名と属性値を記述します。
replace: 属性名
dn行で指定したエントリの属性を、指定した値で置き換えます。指定したエントリが指定した属性を持たない場合、その属性を作成します。
属性の変更種別を省略した場合、次のように解釈されます。
ldapmodifyコマンドで-rオプションを指定している場合:replace
ldapmodifyコマンドで-rオプションを指定していない場合:add
属性の変更種別の次の行には、変更する属性の内容を指定します。続けて複数の変更を記述する場合は、“-”(マイナス)で区切ります。次の書式で記述します。
dn: エントリのDN changetype: modify 属性の変更種別(add|delete|replace): 属性型 属性型: 属性値・属性値の追加
属性の変更種別に“add”を指定します。
mail属性を追加する場合
dn: cn=User001,ou=User,dc=bigbang,dc=mydns,dc=jp changetype: modify add: mail mail: user001@mail.bigbang.mydns.jp2つのtelephonenumber属性と1つのjpegPhoto属性を追加する場合
dn: cn=User001,ou=User,dc=bigbang,dc=mydns,dc=jp changetype: modify add: telephonenumber telephonenumber: 1111-1111 telephonenumber: 2222-2222 - add: jpegPhoto jpegPhoto:< file:///data/photo/user001.jpg・属性値の削除
属性の変更種別に“delete”を指定します。
description属性を削除する場合
n: cn=User001,ou=User,dc=bigbang,dc=mydns,dc=jp changetype: modify delete: description・複数の属性値から特定の属性値の削除
属性の変更種別に“delete”を指定します。
User001のエントリ情報が次の状態であるとします。
dn: cn=User001,ou=User,dc=bigbang,dc=mydns,dc=jp objectclass: top objectclass: person objectclass: organizationalPerson cn: User001 sn: BIGBANG telephonenumber: 1111-1111 telephonenumber: 2222-2222telephonenumber 1111-1111を削除する場合
dn: cn=User001,ou=User,dc=bigbang,dc=mydns,dc=jp changetype: modify delete: telephonenumber telephonenumber: 1111-1111この結果、User001のエントリ情報は次のようになります。
dn: cn=User001,ou=User,dc=bigbang,dc=mydns,dc=jp objectclass: top objectclass: person objectclass: organizationalPerson cn: User001 sn: BIGBANG telephonenumber: 2222-2222・属性値の置換
属性の変更種別に“replace”を指定します。
mail を user001@mail.bigbang.mydns.jp から user777@mail.bigbang.mydns.jp に変更する場合
dn: cn=User001,ou=User,dc=bigbang,dc=mydns,dc=jp changetype: modify replace: mail mail: user777@mail.bigbang.mydns.jp・複数の属性値から特定の属性値の置換え
対象の属性値を削除してから、置き換える値で追加します。
User001のエントリ情報が次の状態であるとします。
dn: cn=User001,ou=User,dc=bigbang,dc=mydns,dc=jp objectclass: top objectclass: person objectclass: organizationalPerson cn: User001 sn: BIGBANG telephonenumber: 1111-1111 telephonenumber: 2222-2222telephonenumber 1111-1111 を 3333-3333 で置き換える場合
dn: cn=User001,ou=User,dc=bigbang,dc=mydns,dc=jp changetype: modify delete: telephonenumber telephonenumber: 1111-1111 - add: telephonenumber telephonenumber: 3333-3333この結果、User001のエントリ情報は次のようになります。
dn: cn=User001,ou=User,dc=bigbang,dc=mydns,dc=jp objectclass: top objectclass: person objectclass: organizationalPerson cn: User001 sn: BIGBANG telephonenumber: 2222-2222 telephonenumber: 3333-3333・エントリの識別名変更
changetype行に“modrdn”を指定します。さらに、次行にエントリの識別名変更の詳細方法を指定します。識別名変更の詳細方法は、以下の2つです。この順序で指定します。
1.newrdn: 新しいRDN
2.deleteoldrdn: (1|0)
新しいRDNに変更した後、古いRDNを削除する場合は“1”、属性値として残す場合は“0”を指定します。
“deleteoldrdn”は省略できます。省略すると古いRDNを削除します。次の書式で記述します。
dn: エントリのDN changetype: modrdn newrdn: 新しいRDN deleteoldrdn: (1|0)User002のエントリのRDNを、user888に変更する場合
dn: cn=User002,ou=User,dc=bigbang,dc=mydns,dc=jp changetype: modrdn newrdn: cn=user888 deleteoldrdn: 1
●ldapsearchによる表示結果の違い
slapd.confの設定は下記のとおりです。
access to attrs=userPassword by self write by dn="cn=Manager,dc=bigbang,dc=dyndns,dc=org" write by anonymous auth by * none access to * by dn="cn=Manager,dc=bigbang,dc=dyndns,dc=org" write by self write by * read検索語の表示。
特段の権限を使用せずに検索(その1) [test1000@localhost ~]$ ldapsearch -x -LLL \ -b "dc=bigbang,dc=dyndns,dc=org" "(uid=test1000)" dn: uid=test1000,ou=People,dc=bigbang,dc=dyndns,dc=org uid: test1000 cn: test1000 objectClass: account objectClass: posixAccount objectClass: shadowAccount shadowMax: 99999 shadowWarning: 7 loginShell: /bin/bash uidNumber: 1000 gidNumber: 1000 homeDirectory: /home/test1000 gecos: test1000 shadowLastChange: 15262 この場合、「-D」を使用して認証していないので自分自身を参照してもuserPasswordは表示されない。 自分自身の権限で検索(その1) [test1000@localhost ~]$ ldapsearch -x \ -D "uid=test1000,ou=People,dc=bigbang,dc=dyndns,dc=org" \ -W -LLL -b "dc=bigbang,dc=dyndns,dc=org" "(uid=test1000)" Enter LDAP Password: dn: uid=test1000,ou=People,dc=bigbang,dc=dyndns,dc=org uid: test1000 cn: test1000 objectClass: account objectClass: posixAccount objectClass: shadowAccount shadowMax: 99999 shadowWarning: 7 loginShell: /bin/bash uidNumber: 1000 gidNumber: 1000 homeDirectory: /home/test1000 gecos: test1000 shadowLastChange: 15262 ↓ userPasswordは表示される userPassword:: e1NTSEF9b1FyeUZZUWRTM3R0ZnMvUnEvVFErSmo3R3hzcHlyemk= 自分自身の権限で検索(その2) [user@serverA ~]$ ldapsearch -x \ -D "uid=test1000,ou=People,dc=bigbang,dc=dyndns,dc=org" \ -W "(uid=test1000)" Enter LDAP Password: # extended LDIF # # LDAPv3 # base <dc=bigbang,dc=dyndns,dc=org> (default) with scope subtree # filter: (uid=test1000) # requesting: ALL # # test1000, people, bigbang.dyndns.org dn: uid=test1000,ou=people,dc=bigbang,dc=dyndns,dc=org uid: test1000 cn: test1000 objectClass: account objectClass: posixAccount objectClass: shadowAccount shadowMax: 99999 shadowWarning: 7 loginShell: /bin/bash uidNumber: 1000 gidNumber: 1000 homeDirectory: /home/test1000 gecos: test1000 shadowLastChange: 15339 ↓ userPasswordは表示される userPassword:: e1NTSEF9SU5PU29DWmVxckVVdDliQ3kxQmhJcG5PTHdkaWg4Uko= # search result search: 2 result: 0 Success # numResponses: 2 # numEntries: 1 管理者の権限で検索 [test1000@localhost ~]$ ldapsearch -x -D "cn=Manager,dc=bigbang,dc=dyndns,dc=org" \ -W -LLL -b "dc=bigbang,dc=dyndns,dc=org" "(uid=test1000)" Enter LDAP Password: dn: uid=test1000,ou=People,dc=bigbang,dc=dyndns,dc=org uid: test1000 cn: test1000 objectClass: account objectClass: posixAccount objectClass: shadowAccount shadowMax: 99999 shadowWarning: 7 loginShell: /bin/bash uidNumber: 1000 gidNumber: 1000 homeDirectory: /home/test1000 gecos: test1000 ↓ userPasswordは表示される userPassword:: e2NyeXB0fSQxJDhodGpMYmtjJFFSSWpNLkkyOG90dDEyajN5LnBkYi4= shadowLastChange: 15262
●slapcat
ユーザの登録や削除等はslapcatでも確認できます。
●slapd.conf
2016.4.21現在、slapd.confを直接編集するようなことはしません。
参照ページ:slapdの設定
2016.4.21現在、slapd.confを直接編集するようなことはしません。
/etc/openldap/slapd.confはサーバデーモンの設定ファイルです。OpenLDAPサーバの実行プログラムであるslapdの起動時に解析されるファイルであり、このファイルに記述された設定は、slapdのみでなく、slapadd、slapcat、slapindex……といった各SLAPDツールコマンドの実行時にも参照されています。
slapd.confファイルは、前半のOpenLDAPサーバ全体に適用される設定を記述する「グローバルセクション」と、それに続く後半のバックエンドデータベースに適用される「データベースセクション」より構成されています。後半のデータベースセクションは、「suffix」オプションを変えることで複数記述できるようになっています。
とりあえず試験として動作させるだけなら、ほとんど触る箇所はありません。最低限調整の必要な項目は下の数カ所だけです。
include
slapd.confファイル以外に読み込むファイルを指定します。前半のグローバルセクションにある「include」オプションには、core.schemaに加え、cosine.schema、nis.schemaが含まれている必要があります。これは、ユーザ認証に必要な「accountオブジェクトクラス」「posixAccountオブジェクトクラス」などを追加するために必要なスキーマが定義されているためです。
include /etc/openldap/schema/core.schema include /etc/openldap/schema/cosine.schema include /etc/openldap/schema/inetorgperson.schema include /etc/openldap/schema/nis.schema
pidfile、argsfile
/etc/init.d/ldapでslapdはユーザldapの権限で動作します。/var/run/openldapディレクトリはオーナー、グループ共にldapである必要があり、755で設定します。
pidfile /var/run/openldap/slapd.pid argsfile /var/run/openldap/slapd.args
データベースの位置とスーパーユーザの指定
database bdb後半のデータベースセクションには、databaseオプションとして最も実績のあるバックエンドデータベースであるBerkeley DBを示す「bdb」が指定されています。「LDAPはデータベース」と言いながら、実はOpenLDAPはデータベースファイルの読み書きを外部の仕組みに頼っています。bdb以外のデータベースであるSQLサーバでデータを管理することもできます。
- BDB
- OpenLDAPで標準的に使用されるバックエンドデータベースであり、Berkeley DBを使ってデータを管理しています。BDBは内部的にBerkeley DBのトランザクション機能を使用しており、データの安全性が向上しています。また、データの復旧をはじめ、データを管理するにあたっては、Berkeley DBのユーティリティが利用されています。
- HDB
- BDBを改良したバックエンドデータベースで、ディレクトリツリーの階層構造についての情報をデータベース内に持つことで、更新性能が向上しています。
- LDBM
- OpenLDAPのバージョン2.0までの間、標準として使用されていたバックエンドデータベースです。LDBMはBerkeley DBまたはgdbmを利用してデータを管理しています。BDBのように、内部的なトランザクション機能を持っていないため、BDB、HDBと比較してデータの安全性は劣ります。
- SQL
- OpenLDAPはバックエンドデータベースとしてRDBMSを使用することもできます。このSQLバックエンドは、Berkeley DBの代替としてRDBMSを使用するというよりは、既存のRDBMSのデータに対してLDAP経由でアクセスすることを目的として設計されています。SQLバックエンドを使用するには、エントリのDN(Distinguished Name)やスキーマに関する情報を別途RDBMS内に格納しておく必要があります。
- LDAP
- バックエンドデータベースとしてLDAPサーバを使用します。このLDAPバックエンドはLDAPのプロキシサーバとして動作し、クライアントから受け付けた要求を指定したLDAPサーバに送信して、その結果をクライアントに返します。
- meta
- metaバックエンドは、LDAPバックエンド同様にLDAPサーバのプロキシサーバとして動作しますが、LDAPバックエンドと異なるのは、複数のLDAPサーバに対してプロキシを行い、それらのディレクトリツリーを単一のディレクトリツリーとして見せるということです。
- Perl
- Perlバックエンドは、Perlインタプリタとして動作し、設定ファイルで指定したPerlモジュールをバックエンド上で実行します。Perlバックエンドは、クライアントからの要求を受け付けると、その内容をPerlモジュールに引き渡し、その処理結果をクライアントに返します。
- LDIF
- LDIFバックエンドは、テキストファイルにLDIF形式でデータを格納します。LDIFバックエンドは、性能は低くとも、簡易に扱えるバックエンドデータベースとして設計されており、規模が小さく、更新頻度の少ないデータの管理に向いています。
- monitor
- moninorバックエンドは、サーバデーモンの動作状態に関する情報をクライアントに返します。
suffix "dc=bigbang,dc=dyndns,dc=org"また、suffixオプションにはDIT(Directory Information Tree)のトップとなる「dc=bigbang,dc=dyndns,dc=org」が指定されていることを確認します。 suffixは、管理するデータベースの「名前空間 (namingContext)」の基底を定義します。これから作ろうとするデータベースはこの名前空間に属さなければなりません。別の名前空間のデータベースも作りたい場合には、 suffix "..." "..." のように複数定義することも可能です。
rootdn "cn=Manager,dc=bigbang,dc=dyndns,dc=org" rootpw {SSHA}*************************さらに、エントリ登録時の認証に必要となるrootdnおよびrootpwオプションには、管理者用dnとしてcn=Manager,dc=bigbang,dc=dyndns,dc=orgおよび適切なパスワードを指定します。
rootdnはLDAPの読み書き全ての権限を持つスーパーユーザのことで、上記のようにManagerというcnを指定する例が多いですが、adminやAdminも問題ありません。実際の認証の際には、大文字小文字は全く無視されますので、例えばldapdelete -x -D "cn=Admin,dc=bigbang,dc=dyndns,dc=org" ... としても認証はとおります。rootdnもsuffixの名前空間に必ず属していなければなりません(最近はそうでもようです。man slapd.confで確認してください)。スーパーユーザはデータベース上に実際に作成する必要はありません。
rootpwはrootdnのパスワードとなります。テキストでの記載はセキュリティ上、非推奨です。上記は"secret"という文字列をSSHA(ソルト付きSHA:デフォルト)でハッシュした文字列。こうしたハッシュを作成するためのツールはOpenLDAPに付属していて、
slappasswd -h '{<暗号化方式>}' -s <パスワード> # slappasswd -h {SSHA} -s secretと実行すれば標準出力に出力されます。ハッシュ方法は{SSHA}の他、{SHA}、{MD5}、{SMD5}、{CRYPT}がサポートされています。-sで元文字列を指定しなければ、slappasswd プログラムが対話的に質問します。
directory /var/lib/ldapdirectoryはBerkeley DB関連のファイルを作成するディレクトリを指定するオプションです。OSやOpenLDAPのパッケージによっても場所は異なりますが、たいていデフォルトのままでかまいません。ただし、初めてslapdデーモンを起動する前に、確かにそのディレクトリが存在し、パーミションがslapdサービス実行ユーザ(通常はldap)所有の700または770であることを確認した方がよいでしょう。データベースが壊れてslapdが固まったりするようになった際には、slapdデーモンを止めてからこのディレクトリを物理的に空にすれば、データは戻ってきませんがサービスは起動するようになります。
index objectClass eq,pres index ou,cn,mail,surname,givenname eq,pres,sub index uidNumber,gidNumber,loginShell eq,pres index uid,memberUid eq,pres,sub index nisMapName,nisMapEntry eq,pres,subindexは属性毎に管理するインデックスを指定します。ユーザ情報を扱うposixAccountのように検索キーとして頻繁に使用する属性(uid、uidNumber等)とほとんど使用しない属性(gecos等)がはっきりしている場合には検索キーにインデックスを作成しておくと検索速度が早くなります。
ただし、インデックスを作成するとその分ディスク容量が必要になるので必要に応じて作成するようにします。
書式は以下のとおりです。
index {<属性リスト>|default} [<インデックス設定>]<属性リスト>だけが指定された場合、デフォルトのインデックス(eq,pres)が指定されたものとみなされます。
- pres(存在)
- 検索例:uid=*
- eq(等価)
- 検索例:uid=ldapuser
- approx(近似)
- 検索例:uid=ldapusr
- sub(部分一致)
- 検索例:uid=ldap*
- none(無し)
- 例:インデックスのデフォルトセットを存在(presence)と等価性(equality)を管理するように設定
index default eq,pres
例:objectClassとuid属性型についてデフォルトのインデックス(eq,pres)を管理すように設定
index objectClass,uid
例:cnとsn属性型について等価性(equality)、部分文字列(substring)、近似(approximate)のインデックスを管理するように設定
index cn,sn eq,sub,approx
# service slapd stop # /usr/local/sbin/slapindex # service slapd startなお、インデックスはslapd.confのdirectoryで指定されたディレクトリ配下に格納されます。
password-hashデータの属性のひとつに、ユーザのパスワードの格納に使うuserPasswordというエントリがあります。slapd.confのpassword-hashディレクティブは、フロントエンドアプリケーションからのデータ作成/更新要求で値をuserPassword エントリへ格納する際に、サーバ側で行うハッシュの方式を指定します。指定可能なハッシュ方式の種類は前で説明しましたslappasswdコマンドで使用可能なものと、ハッシュしないことを示す{CLEARTEXT}です。
最大の注意点は、この機構は、フロントエンドがLDAP Password Modify Extended Operation (RFC3062)に則って通信を行う場合にだけ働くということです。そうしたものには、例えば、ユーザ情報を一括管理するために利用するnss_ldap + PAMモジュールなどがあります。しかし、 OpenLDAPパッケージ付属ユーティリティのldapaddやldapmodifyはパスワード変更拡張手順を使しませんので、専らそれらを使ってデータを登録/変更するつもりであるのなら、このパラメータを{CRYPT}や{SSHA}に設定したとしても全く無駄ということになります。
つまり、ハッシュは行われず、元のテキストがBase64エンコードされた状態でuserPasswordに格納されます。逆に、フロントエンドアプリケーション自体がハッシュ機能を備えていてそれを有効にしている場合には、こちらのパラメータは{CLEARTEXT}にしておく必要があります。
最後に、このままの設定ではすべてのユーザがすべてのデータを読み書きできてしまいます。そのためユーザ自身のデータはすべて変更可能、匿名ユーザはすべてのuserPasswordをバインド可能、すべてのユーザはuserPassword以外のすべてのデータを読取り可能という設定をしました。
なお、rootdnはこのアクセス権限設定を無視してすべてのデータを変更可能です。
CentOS 5の場合(ここから)
# パスワード変更に関する最低限のアクセス制御 # # userPassword属性に対する設定 # ・LDAP管理者(cn=Manager,dc=bigbang,dc=dyndns,dc=org)は書込可能(write) # ・自分自身(self)は書込可能(write) # ・匿名接続(anonymous)した場合は 認証時のみuserPasswordを利用できる # ・そのほかのユーザ(*)は何もできない(none) access to attrs=userPassword by self write by dn="cn=Manager,dc=bigbang,dc=dyndns,dc=org" write by anonymous auth by * none # userPassword属性以外(*)に対する設定------- # ・LDAP管理者(cn=Manager,dc=bigbang,dc=dyndns,dc=org)は書込可能(write) # ・自分自身(self)は書込可能(write) # ・そのほかのユーザ(*)は読取は可能(read) access to * by dn="cn=Manager,dc=bigbang,dc=dyndns,dc=org" write by self write by * readCentOS 5の場合(ここまで)
CentOS 6の場合(ここから)
# vi /etc/openldap/slapd.conf # パスワード変更に関する最低限のアクセス制御 # # userPassword属性に対する設定 # ・LDAP管理者(cn=Manager,dc=bigbang,dc=dyndns,dc=org)は書込可能(write) # ・自分自身(self)は書込可能(write) # ・匿名接続(anonymous)した場合は 認証時のみuserPasswordを利用できる # ・そのほかのユーザ(*)は何もできない(none) access to attrs=userPassword by self =rwcsx by anonymous auth by * none # userPassword属性以外(*)に対する設定------- # ・LDAP管理者(cn=Manager,dc=bigbang,dc=dyndns,dc=org)は書込可能(write) # ・自分自身(self)は書込可能(write) # ・そのほかのユーザ(*)は読取は可能(read) access to * by self =rwcsx by * read
CentOS 6の場合(ここまで)
新しい設定を読み込ませるため、LDAPサーバを再起動します。
# service slapd restart slapd を停止中: [ OK ] slapd を起動中: [ OK ]
●slapd.conf設定内容の確認
2016.4.21現在、slapd.confを直接編集するようなことはしません。
slapd.confファイルに問題がある場合は、下記の例のように「config file testing succeeded」と表示されて終了するのではなく、問題の行まで解析が行われたところで、問題がある旨を示すメッセージが表示されます。slapd.confファイルに問題がある場合は、このメッセージを参考に問題点を修正することができます。
# slaptest -u -d 64 -f /etc/openldap/slapd.conf reading config file /etc/openldap/slapd.conf line 5 (include /etc/openldap/schema/core.schema) reading config file /etc/openldap/schema/core.schema ……[略]…… config file testing succeeded
●ユーザ認証の設定
2016.4.21現在、slapd.conf等を直接編集するようなことはしません。
ここまでの設定で、ユーザ認証に必要なエントリがOpenLDAPサーバに登録されました。ここからは、LDAP認証を行うクライアント側の設定を説明していきます。
LDAPクライアントからOpenLDAPサーバに対してユーザ認証を行うには、LDAPクライアントとなるコンピュータ側で、どのLDAPサーバに対し、どのように問い合わせるかの設定が必要になります。具体的には、以下のファイルを変更する必要があります。
ファイル名 | 説明 |
---|---|
/etc/nsswitch.conf | NSS(Name Service Switch)の設定ファイルです。 |
/etc/pam.d/system-auth | PAM(Pluggable Authentication Modules)がアプリケーションへ共通設定を提供するためのファイルであり、認証時に多くのプログラムから参照されます。PAM自体の概要は、/usr/share/doc/pam-X.XX……/以下のドキュメントを参考にしてください。 |
/etc/ldap.conf | NSS、PAMがLDAPサーバへアクセスする際に利用するモジュール、nss_ldap.so、pam_ldap.so共通の設定ファイルです。このファイルの記述方法は、man nss_ldap、man pam_ldapで確認できます。今はこのファイルを利用せず、pam_ldap.confを利用します。 |
/etc/openldap/ldap.conf | ldapadd、ldapmodifyなど、OpenLDAPのクライアントコマンドが参照する設定ファイルです。このファイルの記述方法は、man ldap.confで確認できます。 |
NSSの設定ファイルは/etc/nsswitch.confで、さまざまな「名前解決」に関する情報をどこから得るのかを設定します。
例えば、以下のような記述があったとします。
passwd: files nisplusこの場合、passwd(ユーザ情報)はローカルの/etc/passwd(files)、NIS+サーバ(nisplus)の順番で検索されます。
nss_ldapをインストールした際に作成された/etc/nsswitch.ldapは、以下のようにユーザやグループ情報をローカルファイル、LDAPサーバの順で検索するように設定された/etc/nsswitch.confのひな型です。
passwd: files ldap group: files ldapCentOS 5の場合(ここから)
必要なパッケージをインストールします。
# yum -y install openldap-clients nss_ldapldap.confを編集します。
# vi /etc/openldap/ldap.conf uri ldap://127.0.0.1/ ← LDAPサーバのURI base dc=bigbang,dc=dyndns,dc=org ← Suffix指定 ssl on ← 追記 tls_cacertdir /etc/openldap/certs pam_password md5 ← 最終行に追記system-auth-acを編集します。
なお、PAMの設定を変更する場合は、必ず現在の設定ファイルをバックアップしてから行ってください。PAMの設定ファイルを間違って編集すると、ログインすらできなくなってしまう可能性があります。設定を変更する場合は、LDAP認証の動作確認が取れるまで、必ず1つはroot権限でログインした端末を残しておくことをお勧めします。万が一ログインできなくなった場合は、システムをシングルユーザモードで起動して設定を修正します。
# vi /etc/pam.d/system-auth-ac #%PAM-1.0 # This file is auto-generated. # User changes will be destroyed the next time authconfig is run. auth required pam_env.so #auth sufficient pam_unix.so nullok try_first_pass ← コメントアウト auth sufficient pam_ldap.so nullok try_first_pass ← 変更 auth requisite pam_succeed_if.so uid >= 500 quiet auth required pam_deny.so account required pam_unix.so account sufficient pam_succeed_if.so uid < 500 quiet account required pam_permit.soaccount [default=bad success=ok user_unknown=ignore] pam_ldap.so ← 追記 password requisite pam_cracklib.so try_first_pass retry=3 ↓ コメントアウト #password sufficient pam_unix.so md5 shadow nullok try_first_pass use_authtok password sufficient pam_ldap.so md5 shadow nullok try_first_pass use_authtok ← 変更 password required pam_deny.so session optional pam_keyinit.so revoke session required pam_limits.so session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid session required pam_unix.so session optional pam_ldap.so ← 追記 ↓ 必要であれば追記(ログイン時にホームディレクトリを自動作成) session optional pam_mkhomedir.so skel=/etc/skel umask=077 nsswitch.confを編集します。
# vi /etc/nsswitch.conf passwd: files ldap ← 変更 shadow: files ldap ← 変更 group: files ldap ← 変更 netgroup: ldap ← 変更 automount: files ldap ← 変更authconfigを編集します。
# vi /etc/sysconfig/authconfig
USELDAP=yes ← 変更
# shutdown -r now # su - test1000 ← LDAPに登録されているユーザ Creating directory '/home/test1000'. Creating directory '/home/test1000/.kde'. Creating directory '/home/test1000/.kde/Autostart'. Creating directory '/home/test1000/.mozilla'. Creating directory '/home/test1000/.mozilla/extensions'. Creating directory '/home/test1000/.mozilla/plugins'. $ ← ログインできた $ pwd /home/test1000 ← ホームディレクトリが作成される $ ls -ld drwx------ 4 test1000 test1000 4096 10月 14 20:14 . ← umaskも反映された $ passwd ← LDAPパスワードを変更してみる Changing password for user test1000. Enter login(LDAP) password: New password: Retype new password: LDAP password information changed for test1000 passwd: all authentication tokens updated successfully.CentOS 5の場合(ここまで)
CentOS 6の場合(ここから)
必要なパッケージをインストールします。
# yum -y install openldap-clients nss-pam-ldapdldap.confを編集します。
# vi /etc/openldap/ldap.conf URI ldap://127.0.0.1/ ← LDAPサーバのURI BASE dc=bigbang,dc=dyndns,dc=org ← Suffix指定 TLS_CACERTDIR /etc/openldap/certsnslcd.confを編集します。
# vi /etc/nslcd.conf ##### 131行目付近 uri ldap://127.0.0.1/ ← LDAPサーバのURI base dc=bigbang,dc=dyndns,dc=org ← Suffix指定 ssl no tls_cacertdir /etc/openldap/certspam_ldap.confを編集します。
今まで、使用していた/etc/ldap.confは存在しないようです。
# vi /etc/pam_ldap.conf ##### 17行目 #host 127.0.0.1 ← コメントアウト ##### 20行目 base dc=bigbang,dc=dyndns,dc=org ← Suffix指定 ##### 最終行に追記 uri ldap://127.0.0.1/ ssl no tls_cacertdir /etc/openldap/certs pam_password md5system-authを編集します。実際にはsystem-auth-acへのリンクとなっています。
なお、PAMの設定を変更する場合は、必ず現在の設定ファイルをバックアップしてから行ってください。PAMの設定ファイルを間違って編集すると、ログインすらできなくなってしまう可能性があります。設定を変更する場合は、LDAP認証の動作確認が取れるまで、必ず1つはroot権限でログインした端末を残しておくことをお勧めします。万が一ログインできなくなった場合は、システムをシングルユーザモードで起動して設定を修正します。
# vi /etc/pam.d/system-auth #%PAM-1.0 # This file is auto-generated. # User changes will be destroyed the next time authconfig is run. auth required pam_env.so auth sufficient pam_unix.so nullok try_first_pass auth requisite pam_succeed_if.so uid >= 500 quiet #auth sufficient pam_sss.so use_first_pass ← コメントアウト auth sufficient pam_ldap.so use_first_pass ← 変更 auth required pam_deny.so account required pam_unix.so broken_shadow account sufficient pam_localuser.so account sufficient pam_succeed_if.so uid < 500 quiet #account [default=bad success=ok user_unknown=ignore] pam_sss.so ← コメントアウト account [default=bad success=ok user_unknown=ignore] pam_ldap.so ← 変更 account required pam_permit.so password requisite pam_cracklib.so try_first_pass retry=3 type= password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok #password sufficient pam_sss.so use_authtok ← コメントアウト password sufficient pam_ldap.so use_authtok ← 変更 password required pam_deny.so session optional pam_keyinit.so revoke session required pam_limits.so ↓ 必要であれば追記(ログイン時にホームディレクトリを自動作成) # session optional pam_oddjob_mkhomedir.so skel=/etc/skel umask=077 ↓ 上記の方法ではumaskが有効にならないので下記に変更 session optional pam_mkhomedir.so skel=/etc/skel umask=077 session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid session required pam_unix.so #session optional pam_sss.so ← コメントアウト session optional pam_ldap.so ← 変更nsswitch.confを編集します。
# vi /etc/nsswitch.conf passwd:files ldap shadow:files ldap group:files ldap netgroup:ldap automount: files ldapauthconfigを編集します・
# vi /etc/sysconfig/authconfig USELDAP=yes
# chkconfig nslcd on # shutdown -r now login:test1000 ← LDAPに登録されているユーザ Password: Creating directory '/home/test1000'. $ ← ログインできた $ passwd ← LDAPパスワードを変更してみる Changing password for user test1000. Enter login(LDAP) password: New password: Retype new password: LDAP password information changed for test1000 passwd: all authentication tokens updated successfully.CentOS 6の場合(ここまで)
これらの設定ファイルは、viなどのエディタを用いて1つ1つ手動で変更することも可能ですが、GUIツールを通して変更するほうが便利です。GUIツールを用いて変更作業を行うには、以下のコマンドを実行します。
# system-config-authenticationまたは、[システム]-[管理]-[認証]を選択します。
system-config-authenticationコマンドの実行後に起動するGUI画面では、ユーザ情報タブ(画面1)で、LDAPサポートを有効にする(L)のチェックを選択します。

画面1 system-config-authenticationコマンドで起動するGUI画面
次に、LDAPの設定(D)ボタンをクリックして表示される画面(画面2)では、
- エントリを検索するベースとなるDITの位置(今回は"dc=bigbang,dc=dyndns,dc=org")
- 接続するLDAPサーバのURL(今回はローカルホストを示す"ldap://127.0.0.1/")

画面2 LDAPの設定(D)ボタンをクリックして表示される画面
続いて、認証タブ(画面3)に移動し、ユーザ情報タブでの設定と同様に、LDAPサポートを有効にする(L)を選択します。LDAPの設定(D)ボタンをクリックして現れる画面には先に入力した情報が保持されているので、ここではそのままOK(O)をクリックし、GUIツールを終了します。

画面3 認証タブ画面
以上で、LDAPクライアントとなるコンピュータ上のPAMおよびNSS関連の設定ファイルの変更が完了しました。これで、LDAPサーバへ接続し、ユーザ認証ができるようになります。
●PAMを利用した認証
LDAP認証の設定が完了すると、PAMを利用するさまざまなプログラムからのLDAP認証が可能になります。これは、先ほど変更した/etc/pam.d/system-authファイルが、多くのプログラムから認証処理時に参照されているためです。例えば、以下のようなプログラムからも、/etc/pam.d/system-authファイルが参照されています。
プログラム名 | system-authを参照する設定ファイル |
---|---|
su | /etc/pam.d/su |
sshd | /etc/pam.d/sshd |
telnetd | /etc/pam.d/remote |
vsftpd | /etc/pam.d/vsftpd |
cvs | /etc/pam.d/cvs |
それでは、OpenLDAPサーバに登録したユーザエントリを用いて、suコマンド、sshコマンドなどを用いてLDAP認証を行ってみましょう(注)。
# su - test1001 $ # ssh test1001@localhost test1001@localhost's password:test1001 Last login: Sat Sep 20 18:13:57 2008 from hostname $OpenLDAPサーバでのユーザ認証は成功したでしょうか。もしユーザ認証に失敗する場合は、syslogdに送付されるOpenLDAPサーバのアクセスログを確認し、問題を修正してください。
注:各ユーザエントリのhomedir属性に指定したホームディレクトリを事前に作成していない場合、プログラムによって警告メッセージが表示されたり、またはエラーが発生することがあります。ここでの認証例は、ホームディレクトリをあらかじめ作成している場合の例です。
●PAMを利用しないLDAP認証
このほか、PAMを経由したLDAP認証が実装されていないプログラムについては、別途、LDAPサーバへの接続方法を確認する必要があります。例えばApacheの場合は、Apache側で個別にLDAP認証のための設定を行う必要があります。●Apacheで作るファイルサーバ(LDAP認証編)を参照してください。
●PAM認証とは
ユーザにアクセス特権を与えるようなプログラムは、必ずと言っていいほどユーザの認証機能を有します。システムにログインする際に、ユーザはユーザ名とパスワードを提供し、ログインプロセスがその情報を使用してログインの認証、すなわちユーザが申請した身元が本人のものであることを検証します。パスワード以外の認証形式も可能であり、異なる方法でパスワードを格納することもできます。
PAM(Pluggable Authentication Modules)は認証プログラムをリコンパイルしなくても、システム管理者が認証ポリシーを設定できるようにする一つの方法です。PAMを使用する場合は、設定ファイルを編集することによってプログラムにモジュールをプラグインする方法を制御します。
login認証をLDAP認証に対応させた場合の認証処理の流れは下記のようになります。
- ユーザ(test1001)からloginサービスにアクセスがあります。
この時、ユーザはユーザIDとパスワードを入力します。 - loginサービスはPAMライブラリの認証処理を呼び出します。
- 認証処理のために呼び出されたPAMライブラリは、loginサービスのPAM設定ファイル(/etc/pam.d/login)に記載された情報により、認証方法を判断します。
- PAM設定ファイルに記載されている認証方法にしたがい、PAMモジュールに渡して認証処理を行います(下図では「LDAPで認証」を行う設定となっていますので、pam_ldapモジュールを呼び出します)。
- 処理を受け取ったPAMモジュール(下図では、pam_ldapモジュール)は、該当ユーザ(下図では、test1001)を検索します。
- 検索に成功し、パスワードが正しければ「認証OK」という返事を、loginサービスに返します。
- 「認証OK」の返答を受けたloginサービスは、ユーザのログインを許可します。

PAMモジュールのタイプ
PAMには4つのタイプのモジュールがあります。
- authモジュールは、おそらくパスワードを要求しチェックすることで実際の認証を行ない、グループの所属権やkerberosの「ticket」のような「証明書」を設定します。
- accountモジュールは、認証が許可されること(カウントの期限が切れていないこと、ユーザがその時刻におけるログインを許されること、など)確認するためのチェックを行ないます。
- passwordモジュールはパスワードを設定するために使用されます。
- sessionモジュールは、ユーザのホームディレクトリをマウントしたり、メールボックスを利用可能にするなどして、認証されたユーザがアカウントを利用できるようにするために使用されます。
いつでも新しいモジュールを追加することができます。その場合、PAMを認識するアプリケーションにそれらのモジュールを使用させることができます。例えば、ワンタイムパスワードシステムを使用しており、かつそのシステムをサポートするようなモジュールを作成することができる場合 (モジュールの作成方法に関するドキュメントは、/usr/doc/pam* に含まれています)、リコンパイルや修正を実行しなくても、PAMを認識するプログラムは、新しいモジュールを使用し、新しいワンタイムパスワードシステムと連動することができるようになります。
PAMモジュールの制御フラグ
PAM設定ファイルの第2パラメータは、制御フラグをあわらしています。これは、モジュールタイプ別に、認証に関する制御の度合いを設定するためのフラグです。
- requiredは、許可される認証の順序で完全にチェックが行われていなければならないモジュールで、同タイプの他のモジュールがチェックされるまで、ユーザには何も通知しないことを表しています。
- requisiteは、許可される認証の順序で完全にチェックが行われていなければならないモジュールで、認証に失敗したメッセージをユーザに通知することを表しています。
- sufficientは、チェックが失敗した場合は、無視されるにモジュールを表しています。ただし、sufficientを利用したモジュールのの認証が成功し、さらにrequiredを利用したモジュールが全て認証に成功した場合は、同タイプの他のモジュールはチェックせず、認証が終了します。
- optionalは、チェックが失敗した場合は、無視されるにモジュールを表しています。optionalのモジュールが全て成功/失敗した場合のみモジュールタイプ全てのPAM認証が決定されます。
ライブラリの種類
CentOS6のライブラリ。
# ls /lib/security/ pam_access.so pam_gnome_keyring.so pam_nologin.so pam_tally2.so pam_cap.so pam_group.so pam_oddjob_mkhomedir.so pam_time.so pam_chroot.so pam_issue.so pam_passwdqc.so pam_timestamp.so pam_ck_connector.so pam_keyinit.so pam_permit.so pam_tty_audit.so pam_console.so pam_krb5 pam_postgresok.so pam_umask.so pam_cracklib.so pam_krb5.so pam_pwhistory.so pam_unix.so pam_debug.so pam_krb5afs.so pam_rhosts.so pam_unix_acct.so pam_deny.so pam_lastlog.so pam_rootok.so pam_unix_auth.so pam_echo.so pam_ldap.so pam_securetty.so pam_unix_passwd.so pam_env.so pam_limits.so pam_selinux.so pam_unix_session.so pam_exec.so pam_listfile.so pam_selinux_permit.so pam_userdb.so pam_faildelay.so pam_localuser.so pam_sepermit.so pam_warn.so pam_faillock.so pam_loginuid.so pam_shells.so pam_wheel.so pam_filter pam_mail.so pam_smbpass.so pam_winbind.so pam_filter.so pam_mkhomedir.so pam_sss.so pam_xauth.so pam_fprintd.so pam_motd.so pam_stress.so pam_ftp.so pam_namespace.so pam_succeed_if.so
サービス
PAMを使用する各プログラムは、独自の「サービス」名を定義します。loginプログラムはサービスタイプloginを定義し、ftpdはサービスタイプ ftpを定義します。等々。一般に、サービスタイプはサービスにアクセスするために使用されるプログラムの名前であり、サービスを提供するために使用されるプログラムの名前ではありません (違いがある場合)。
設定ファイル
ディレクトリ/etc/pam.dはすべてのPAMアプリケーションを設定するために使用されます。(以前のバージョンでは、これは/etc/pam.confでした。)各アプリケーション(実際は、各サービス)は独自のファイルを持っています。ファイルは以下のようになります。以下はCentOS6の例です。
# ls /etc/pam.d/ atd halt ricci system-auth authconfig kcheckpass run_init system-auth-ac authconfig-gtk kdm runuser system-config-authentication authconfig-tui kdm-np runuser-l system-config-date chfn kppp samba system-config-kdump chsh kscreensaver screen system-config-keyboard config-util ksu setup system-config-network crond login smartcard-auth system-config-network-cmd cups newrole smartcard-auth-ac system-config-users cvs other smtp tuned-adm dovecot passwd smtp.postfix vlock eject password-auth smtp.sendmail webmin fingerprint-auth password-auth-ac squid wireshark fingerprint-auth-ac polkit-1 ssh-keycat xdm gdm postgresql sshd xserver gdm-autologin poweroff su gdm-fingerprint ppp su-l gdm-password reboot sudo gnome-screensaver remote sudo-i内容の例を下記に示します。
#%PAM-1.0 auth required /lib/security/pam_securetty.so auth required /lib/security/pam_pwdb.so shadow nullok auth required /lib/security/pam_nologin.so account required /lib/security/pam_pwdb.so password required /lib/security/pam_cracklib.so password required /lib/security/pam_pwdb.so shadow nullok use_authtok session required /lib/security/pam_pwdb.so先頭行はコメントです。2行目から4行目ではログイン認証で使用するモジュールを列挙しています。2行目は、ユーザがrootとしてのログインを試行したならば、かつ /etc/securettyファイルが存在するならば、ログイン試行時に使用されたttyがこのファイルにリストされていることを確認します。3行目によって、ユーザはパスワードを要求され、そのパスワードがチェックされます。4行目は/etc/nologinファイルが存在するか否かをチェックし、存在する場合にはそのファイルの内容を表示し、ユーザがrootでない場合には、そのユーザをログインさせません。
最初のモジュールが失敗した場合であっても3つのモジュールのすべてがチェックされることに注意してください。これはセキュリティの決定です - 認証が拒否された理由をユーザに悟られないように設計されています。なぜならば、拒否された理由を知ることによって認証を突破することが容易になる可能性があるからです。この動きを変更するには、requiredをrequisiteに変更します。requisiteモジュールから失敗という結果が返された場合、その他のモジュールをコールすることなく、PAM認証は即座に失敗します。
5行目によって必要なアカウント処理が実行されます。たとえば、シャドウパスワードが有効な場合、pam_pwdb.soモジュールは、アカウントの期限が切れていないか、またはユーザがパスワードを変更していないか、およびパスワード変更に関する猶予期間が切れていないか、をチェックします。
6行目は新規に変更されたパスワードに対して一連のテストを実行することにより、そのパスワードがパスワードに対する辞書型攻撃プログラムによって簡単に判明するものでないこと、などを確認します。
7行目(複数行になることもあります)によって、loginプログラムがユーザのパスワードを変更する際には、pam_pwdb.soモジュールを使用させることを指定しています(そのようなことが行われるのは、シャドウパスワードの期限が切れた場合などに、authモジュールがパスワードを変更する必要があると判断した場合に限られます)。
最後の8行目は、pam_pwdb.soモジュールを使用してセッションを管理することを指定しています。現在のところ、このモジュールは何も行いません。したがって、必要なモジュールと置き換える(またはスタックすることで補足する。)ことができます。
各ファイル内の行の順序が重要であることに注意してください。実際にはrequiredモジュールのコール順序はさして重要ではない一方で、その他の制御フラグを利用することができます。optionalが使用されることはめったになく、Linuxシステムでデフォルトで使用されることはまったくありません。sufficientおよびrequisiteでは順序が重要になります。
例として、rlogin用のauth設定を見てみましょう。
auth required /lib/security/pam_securetty.so auth sufficient /lib/security/pam_rhosts_auth.so auth required /lib/security/pam_pwdb.so shadow nullok auth required /lib/security/pam_nologin.soこれはほとんどloginのエントリと同じですが、特別のモジュールを指定するための特別な行があり、かつモジュールの指定順序が異なっています。
まず、pam_securetty.soは、安全ではないターミナルからrootのログインが行われないようにします。これにより、rootによるrlogin試行のすべてが効果的に拒否されます。許可したい場合(その場合には、インターネットに接続しないか、または優れたファイアウォールを設置することをお奨めします) には、この行を削除するだけで済みます。
第二に、pam_rhosts_auth.soによるユーザ認証が成功した場合、PAMはパスワードチェックを実行せずに、ただちにrloginに対して成功という結果を返します。pam_rhosts_auth.soによるユーザ認証が失敗した場合、その失敗した認証は無視されます。
第三に、pam_rhosts_auth.soによるユーザの認証が失敗した場合には、pam_pwdb.soモジュールによる通常のパスワード認証が実行されます。
最後に、上記で指定したようにしてpam_nologin.soが/etc/nologinをチェックします。
securettyチェックが失敗した場合にパスワードの入力を要求したくない場合には、pam_securetty.soモジュールをrequiredから requisiteに変更すれば良いことに注意してください。
シャドウパスワード
pam_pwdb.soモジュールはシャドウパスワードが使用されていることを自動的に検出し、必要な調整処理をすべて実行します。
●SSHの公開鍵をLDAPで管理する(ソース編)
参照したページは下記のとおりです。
第6回 OpenSSHの公開鍵をLDAPで管理
LDAPでSSHの鍵認証を利用してみる
OpenSSH の公開鍵を LDAP で管理
SSHの公開鍵をLDAPで管理
このページにも記載されているとおり、公開鍵認証方式を使用することが当たり前になってきた昨今、管理対象マシンが2、3台のうちならいいのですが、これが10台、20台となってきた場合、これまでの方法では1台1台に公開鍵を登録しては削除すると言う作業が非常に煩雑となります。
これを解消する方法がLDAPによる公開鍵管理手法です。
しかし、RPMパッケージで配布されているものはLDAPに対応していません。そこでOpenSSHのソースをダウンロードし、それにlpkのパッチ(OpenSSH LDAP Public Keys)を適用しLDAP上に格納されている公開鍵をsshdプロセスから参照させるようにします。
今回はソース・パッチ共に5.8p1を使用します。
# cd /usr/local/src # wget http://www.ftp.ne.jp/OpenBSD/OpenSSH/portable/openssh-5.8p1.tar.gz # wget http://jfut.integ.jp/linux/openssh/openssh-lpk-5.8p1-0.3.13.patch # tar zxvf openssh-5.8p1.tar.gz # cd openssh-5.8p1 # patch -p0 < ../openssh-lpk-5.8p1-0.3.13.patch ↑ うまくパッチを適用できない場合は、「-p1」または「-p2」で実行してください。 # ./configure --with-ldap ↑ 上記より下記の方がいいかも # ./configure -prefix=/usr \ --sysconfdir=/etc/ssh --with-tcp-wrappers \ --with-pam --with-ldap --with-md5-passwords ↑ yumでインストールされているsshを流用する場合は上記のようにする。 ↑ この方がstart、stop等のオプションを流用出来る。
- onfigure: error: PAM headers not found
- 上記のように表示された場合は「pam-devel」をインストールしてください。
# make # make install下記のように表示された場合は、/etc/ssh以下のファイルを全て削除してから「make install」してください。
- if [ ! -d /etc/ssh ]; then \
./mkinstalldirs /etc/ssh; \
fi
/etc/ssh/ssh_config already exists, install will not overwrite
/etc/ssh/sshd_config already exists, install will not overwrite
/etc/ssh/moduli already exists, install will not overwrite
/etc/ssh/ssh_host_key already exists, skipping.
/etc/ssh/ssh_host_dsa_key already exists, skipping.
/etc/ssh/ssh_host_rsa_key already exists, skipping.
/usr/sbin/sshd -t -f /etc/ssh/sshd_config
/etc/ssh/sshd_config line 80: Unsupported option GSSAPIAuthentication
/etc/ssh/sshd_config line 82: Unsupported option GSSAPICleanupCredentials
lddコマンドによるライブラリの確認 # ldd /usr/local/sbin/sshd | egrep '(ldap|lber)' ↑ デフォルトのままインストールした場合 # ldd /usr/bin/ssh | egrep '(ldap|lber)' ↑ 「-prefix=/usr」を指定した場合 libldap-2.4.so.2 => /usr/lib/libldap-2.4.so.2 (0x00e6f000) liblber-2.4.so.2 => /usr/lib/liblber-2.4.so.2 (0x00b64000) 設定ファイルの確認 # grep -i ldap /usr/local/etc/sshd_config ↑ デフォルトのままインストールした場合 # grep -i ldap /etc/ssh/sshd_config ↑ 「--sysconfdir=/etc/ssh」を指定した場合 # here are the new patched ldap related tokens # entries in your LDAP must have posixAccount & ldapPublicKey objectclass # LpkLdapConf /etc/ldap.conf # LpkServers ldap://10.1.7.1/ ldap://10.1.7.2/次にOpenLDAPの公開鍵用スキーマをコピーします。
# cp /usr/local/src/openssh-5.8p1/openssh-lpk_openldap.schema /etc/openldap/schema/このスキーマを読み込むようにslapd.confに下記を追加します。
# vi /etc/openldap/slapd.conf
include /etc/openldap/schema/openssh-lpk_openldap.schema
- 既にLDAPが構築されている場合の対処
- まず、LDAPサービスを停止します。
# service slapd stop
lpk用の新たにスキーマを読み込ませるため下記のようにします。# sudo -u ldap slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
「config file testing succeeded」と表示されればOKです。LDAPサービスを開始します。# service slapd start
問題なくLDAPサービスが起動することを確認します。
$ ssh-keygen -t dsa Generating public/private dsa key pair. Enter file in which to save the key (/home/test1001/.ssh/id_dsa): そのままリターン押下 Created directory '/home/test1001/.ssh'. Enter passphrase (empty for no passphrase): パスフレーズを入力 Enter same passphrase again: パスフレーズを再入力 Your identification has been saved in /home/test1001/.ssh/id_dsa. Your public key has been saved in /home/test1001/.ssh/id_dsa.pub. The key fingerprint is: 97:4d:8a:32:b3:f3:0d:62:06:92:5b:e4:79:07:46:35 test1001@fedora-star.bigbang.dyndns.orgこの操作で作成される~/.ssh/id_dsaが秘密鍵、~/.ssh/id_dsa.pubが公開鍵です。秘密鍵は途中で入力されるパスフレーズにより暗号化された状態で保存されます。後者の公開鍵は文字通り公開する鍵なので、他人に見られても問題ありません。
次にLDAPサーバ側での操作です。既に登録してあるtest1001というユーザを利用し、次のように、公開鍵用の属性とオブジェクトクラスを追加します。変更部分はldapPublicKeyというオブジェクトクラスとsshPublicKeyという公開鍵用の属性です。この中にはid_rsa.pubやauthorized_keys2の中に1行で記録されている鍵情報をそのまま登録します。
dn: uid=test1001,ou=People,dc=bigbang,dc=dyndns,dc=org
uid: test1001
cn: test1001
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
objectClass: ldapPublicKey
userPassword:: e1NTSEF9MDlJNGQ2SzFNenhsKzlxZ0lIMmpuZGZPbEl6YXU2REI=
shadowLastChange: 15269
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 1001
gidNumber: 1001
homeDirectory: /home/test1001
gecos: test1001
sshPublicKey: ssh-dss AAAAB3NzaC1kc3MAAACBAJ98cnqjoeNQTS53Fdp8E6K+aEhOaEsy5mvjGNod+dRNJbaL8kAyzhjxvrU0Bl45Q1dgHDTlRZcUXTi6kqEaVROQuuyGROSHTo /
KOwqqmnP02pCfzQ2712PzVPhk63bpQc01KUMKI4N291L8Q17Xe3VA7pisj9y410ooBAzRZk9vAAAAFQCE8E3v3RPmYib8IoBXtgFVezVzzwAAAIAjayYQ /
sC52THgfL614Gbe+6KXGJlMlVPSM8o8zRwfR/mE97aLNo66254m1i7Ko2I33wOQB0rnAlobdN01MJ+ySyTu /
TKytLR6M9746vLWRYN0JfQorT8gxoZHlfV1+xERBF435HFYZpNXtAFff6Xej2dwYPuy9rATYxmhoQXf0gAAAIB1gdM62AtMhXViLaaHBOINUGq5a464uat8 /
zgZHgsZ3D+P0DumLGrWcEPHxsELcCKTETRw6fhdoZUIilYVCiV16fCt9 Wx1ZdvCrVF3EHmWS4r05iSdTHoKlQzHpuBpditZI2Np/XWDBW+ceO3az7ogV7w /
Zx+wuyDfHbbGNuSKbjA== /
test1001@fedora-star.bigbang.dyndns.org
dn: cn=test1001,ou=Group,dc=bigbang,dc=dyndns,dc=org
objectClass: posixgroup
cn: test1001
userPassword: !
gidNumber: 1001
uid: test1001
cn: test1001
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
objectClass: ldapPublicKey
userPassword:: e1NTSEF9MDlJNGQ2SzFNenhsKzlxZ0lIMmpuZGZPbEl6YXU2REI=
shadowLastChange: 15269
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 1001
gidNumber: 1001
homeDirectory: /home/test1001
gecos: test1001
sshPublicKey: ssh-dss AAAAB3NzaC1kc3MAAACBAJ98cnqjoeNQTS53Fdp8E6K+aEhOaEsy5mvjGNod+dRNJbaL8kAyzhjxvrU0Bl45Q1dgHDTlRZcUXTi6kqEaVROQuuyGROSHTo /
KOwqqmnP02pCfzQ2712PzVPhk63bpQc01KUMKI4N291L8Q17Xe3VA7pisj9y410ooBAzRZk9vAAAAFQCE8E3v3RPmYib8IoBXtgFVezVzzwAAAIAjayYQ /
sC52THgfL614Gbe+6KXGJlMlVPSM8o8zRwfR/mE97aLNo66254m1i7Ko2I33wOQB0rnAlobdN01MJ+ySyTu /
TKytLR6M9746vLWRYN0JfQorT8gxoZHlfV1+xERBF435HFYZpNXtAFff6Xej2dwYPuy9rATYxmhoQXf0gAAAIB1gdM62AtMhXViLaaHBOINUGq5a464uat8 /
zgZHgsZ3D+P0DumLGrWcEPHxsELcCKTETRw6fhdoZUIilYVCiV16fCt9 Wx1ZdvCrVF3EHmWS4r05iSdTHoKlQzHpuBpditZI2Np/XWDBW+ceO3az7ogV7w /
Zx+wuyDfHbbGNuSKbjA== /
test1001@fedora-star.bigbang.dyndns.org
dn: cn=test1001,ou=Group,dc=bigbang,dc=dyndns,dc=org
objectClass: posixgroup
cn: test1001
userPassword: !
gidNumber: 1001
このエントリをLDAP上に登録します。
$ ldapadd -x -D "cn=Manager,dc=bigbang,dc=dyndns,dc=org" -W -f test1001.ldif既にエントリが存在する場合は下記のような変更用のldifを作成し、登録します。
$ test1001_ssh_modify.ldif
dn: uid=test1001, ou=People,dc=bigbang,dc=dyndns,dc=org
changetype: modify
add: objectClass
objectClass: ldapPublickey
-
add: sshPublickey
sshPublickey: ssh-dss AAAAB3NzaC1kc3MAAACBAPRXd1S5gkahmbEoUIVEOGA17pIpFwLZsCU44cfqMxLqTZ9kimftK2cr++rI2VCQ87tr1BPBIRP3t /
Viojitkj8Qi+0bq6Uw8BXfLUFWlDWP7FgRkOdYEZBtdNNejfujuuWh2vpD4t3L+69VpvnSBV9svhakkIT0FVVocrgRylJAAAAFQDnC1RmbNMPhAZIuY0Tll /
7yEZNLkwAAAIEAp5JEo0Uh0O1WQ8Mr1lLql1gy8R61emsx2LhQmrU/qJT2shlWB8L6WBtjW6UI81b2Q76ByN9N8ISgxHcvShi1QuEvxCcBR85c3HtTJ77qy /
TY3okiiaKDx9+6Vj4fBnm0RUavmVIH8sGt9JK8FgYcSEgdAWiZPsq9xMWI5FsD8AAACBAKnZLMTJwG2dkzWSrjFpVJheFsDsdz1c1MinilwkALJ+RouQqhG /
3eQ63YOvhRRvEPkJHO+1t+ABxCTBP4Y5lv7aZqH+2ct0amxVy/E+6ejqQKLuoYkDvslPyk+HQmIaP4jaBCKuxHcR7bf+ArBKdWdf3bJ4QRHcO/QB3DiKm9Rp /
test1001@fedora-star.bigbang.dyndns.org
dn: uid=test1001, ou=People,dc=bigbang,dc=dyndns,dc=org
changetype: modify
add: objectClass
objectClass: ldapPublickey
-
add: sshPublickey
sshPublickey: ssh-dss AAAAB3NzaC1kc3MAAACBAPRXd1S5gkahmbEoUIVEOGA17pIpFwLZsCU44cfqMxLqTZ9kimftK2cr++rI2VCQ87tr1BPBIRP3t /
Viojitkj8Qi+0bq6Uw8BXfLUFWlDWP7FgRkOdYEZBtdNNejfujuuWh2vpD4t3L+69VpvnSBV9svhakkIT0FVVocrgRylJAAAAFQDnC1RmbNMPhAZIuY0Tll /
7yEZNLkwAAAIEAp5JEo0Uh0O1WQ8Mr1lLql1gy8R61emsx2LhQmrU/qJT2shlWB8L6WBtjW6UI81b2Q76ByN9N8ISgxHcvShi1QuEvxCcBR85c3HtTJ77qy /
TY3okiiaKDx9+6Vj4fBnm0RUavmVIH8sGt9JK8FgYcSEgdAWiZPsq9xMWI5FsD8AAACBAKnZLMTJwG2dkzWSrjFpVJheFsDsdz1c1MinilwkALJ+RouQqhG /
3eQ63YOvhRRvEPkJHO+1t+ABxCTBP4Y5lv7aZqH+2ct0amxVy/E+6ejqQKLuoYkDvslPyk+HQmIaP4jaBCKuxHcR7bf+ArBKdWdf3bJ4QRHcO/QB3DiKm9Rp /
test1001@fedora-star.bigbang.dyndns.org
$ ldapmodify -x -D cn=Manager,dc=bigbang,dc=dyndns,dc=org -W -f test1000_ssh_modify.ldifやっぱりLDAP2.4ではすんなり登録できず、データベースを再作成するハメになりました。
●自己環境用のLDAPサーバの構築を参照してください。
次にsshdプロセスがLDAPサーバを検索できるよう、/etc/ssh/sshd_config(上書きしなかった場合は/usr/local/etc/sshd_config)を修正します。下記のようにLDAP関連のオプションを有効にします。
UseLPK yes LpkServers ldap://127.0.0.1 LpkLdapConf /etc/ldap.conf LpkUserDN ou=People,dc=bigbang,dc=dyndns,dc=org LpkGroupDN ou=Group,dc=bigbang,dc=dyndns,dc=org LpkForceTLS no/etc/ssh/ldap.confを編集します。存在しない場合は、新規作成します。
# vi /etc/ssh/ldap.conf uri ldap://127.0.0.1/ base dc=bigbang,dc=dyndns,dc=org host server.bigbang.dyndns.org ssl no #ssl start_tls #tls_cacertdir /etc/openldap/cacerts #tls_cacertfile /etc/pki/tls/certs/ca-bundle.crt #tls_checkpeer no/etc/ssh/ldap.confの設定が完了すると/usr/libexec/openssh/ssh-ldap-wrapperコマンドを使ってユーザのRSA(またはDSA)鍵が取得できるようになります。下記コマンドを実行し、RSA(またはDSA)鍵が返ってくればOK。返ってこない場合は ldap.confまたはLDAPサーバ側の設定を見直します。
# /usr/libexec/openssh/ssh-ldap-wrapper username次に、/etc/ssh/sshd_configに下記2行を追加します。
AuthorizedKeysCommand /usr/libexec/openssh/ssh-ldap-wrapper AuthorizedKeysCommandRunAs rootRSA鍵を使用する場合は、RSAAuthenticationおよびPubkeyAuthenticationがyesである必要があります。
準備ができたら、sshdプロセスを起動させ、クライアントから接続を行ってみます。
# service sshd restart問題なく起動することを確認します。
あとは秘密鍵をクライアント側にコピーし、鍵認証で接続できるか確認してみましょう。.sshディレクトリがなくても接続できるはずです。
ただし、ログイン時にサーバ側に該当ユーザのホームディレクトリが無い場合は、下記のようなエラーが表示されます。
Could not chdir to home directory /home/test1001: No such file or directoryこの対処方法は下記のようにしてください。
# vi /etc/ssh/sshd_config
UsePAM yes
sshdを再起動します。
# service sshd restartこれで、Windows上のTeraTermやPuTTYで初めてアクセスした場合に自動的にホームディレクトリが作成されます。
ここで忘れてはならないのは「yum」によるopensshの自動更新の除外設定です。
# vi /etc/yum.conf exclude= openssh*exclude行にopenssh*を追記すれば、自動更新対象外となります。
●SSHの公開鍵をLDAPで管理する(RPM編)
OpenSSHサーバのインストールは済んでいるものとします。
サーバ側の作業として下記を実施します。
1.OpenSSHのLDAPサポートパッケージのインストール
2.OpenLDAP設定ファイル編集
3.LDAP情報の更新
4.LDAPサーバに各ユーザの公開鍵を登録
OpenSSHのLDAPサポートパッケージをインストールします。
# yum -y install openssh-ldap # cp -a /usr/share/doc/openssh-ldap-5.8p1/openssh-lpk-openldap.schema \ /etc/openldap/schema/openssh.schema上記ファイルにinclude /etc/openldap/schema/openssh.schemaを追記します。
必要であればLDAP情報を更新します。
# /etc/init.d/slapd stop # rm -rf /etc/openldap/slapd.d/* # sudo -u ldap slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d # /etc/init.d/slapd startLDAPサーバに各ユーザの公開鍵を登録します。
# vi hoge_ssh_modify.ldif dn: uid=hoge,ou=People,dc=bigbang,dc=dyndns,dc=org changetype: modify add: objectClass objectClass: ldapPublicKey - add: sshPublicKey sshPublicKey: ssh-dss AAAAB3NzaC1kc3MAAACBAO6hNHcYgtncZrUtExcFwOvkv0pUrBacBg \ 637LAaXpozjD8HLgOgnmLF01wYbRaP1outQzdDcpWyVZDH29hQwNGgROI4DIdG29EYZ8kHfPa4/G \ OXqi/XeEm9VemRyRhbaWBikrFEJrVSrV9T2D8LgFF654JUMsNSloQ37j5D4E6DAAAAFQD9t4AY+b \ Tx9KbzCxHLuO9aN9EbiQAAAIAUOw1AykiRAfJpNDRSqh4sRQVnaWyQuuwDwOYxD4Z1a2MjmOJ7qd \ qFjJ9MJrp2cY4kEUSiZP7u7sQirTIpl+ANKHP/0kxBojc7glTcxEieb87ChM2myM2QyCqgqRyipv \ u43vAhag85PnA3kHEkJ04zsc7BT4wpsFZGmK974lWF0gAAAIA3McRUTBDYJOIA9MEaw3btnVmNKd \ RNpYeLN8VbZoVYTKZwHVxO4qvDr3ooWnOxdmvM9QhuxPD1l1dwkshwHOID9mSua+YdJ+lz4fIPFT \ 07+Wyk/z4NVREkYkK32xnsWNfIPGVOsDdEcr6LNvQaGMXHPbgLNE+bZELsBl59KyfTqg== # ldapmodify -x -D "cn=Manager,dc=bigbang,dc=dyndns,dc=org" \ -W -f /etc/openldap/ldif/hoge_ssh_modify.ldif/etc/ssh/ldap.confを編集します。存在しない場合は、新規作成します。
# vi /etc/ssh/ldap.conf uri ldap://127.0.0.1/ base dc=bigbang,dc=dyndns,dc=org host server.bigbang.dyndns.org ssl no #ssl start_tls #tls_cacertdir /etc/openldap/cacerts #tls_cacertfile /etc/pki/tls/certs/ca-bundle.crt #tls_checkpeer no/etc/ssh/ldap.confの設定が完了すると/usr/libexec/openssh/ssh-ldap-wrapperコマンドを使ってユーザのRSA(またはDSA)鍵が取得できるようになります。下記コマンドを実行し、RSA(またはDSA)鍵が返ってくればOK。返ってこない場合は ldap.confまたはLDAPサーバ側の設定を見直します。
# /usr/libexec/openssh/ssh-ldap-wrapper username次に、/etc/ssh/sshd_configに下記2行を追加します。
AuthorizedKeysCommand /usr/libexec/openssh/ssh-ldap-wrapper AuthorizedKeysCommandRunAs rootRSA鍵を使用する場合は、RSAAuthenticationおよびPubkeyAuthenticationがyesである必要があります。
準備ができたら、sshdプロセスを起動させ、クライアントから接続を行ってみます。
# service sshd restart問題なく起動することを確認します。
あとは秘密鍵をクライアント側にコピーし、鍵認証で接続できるか確認してみましょう。.sshディレクトリがなくても接続できるはずです。
ただし、ログイン時にサーバ側に該当ユーザのホームディレクトリが無い場合は、下記のようなエラーが表示されます。
Could not chdir to home directory /home/test1001: No such file or directoryこの対処方法は下記のようにしてください。
# vi /etc/ssh/sshd_config
UsePAM yes
sshdを再起動します。
# service sshd restartこれで、Windows上のTeraTermやPuTTYで初めてアクセスした場合に自動的にホームディレクトリが作成されます。
●LDAPのレプリケーション
LDAP Syncレプリケーションは、現在OpenLDAPの標準として開発が進められているレプリケーション方式です。LDAP SyncレプリケーションにはrefreshOnlyとrefreshAndPersistの2つのモードがあります。
参照ページ:LDAP Sync 複製
LDAP Syncレプリケーション
LDAP Syncレプリケーションは、コンシューマ(スレーブサーバ)からプロバイダ(マスタサーバ)にレプリケーションの要求を送信するPULL型の仕組みを採用しています。
LDAP Syncレプリケーションには「refreshOnly」と「refreshAndPersist」という2つのモードがあります。
refreshOnlyモードは、コンシューマが同期要求をプロバイダに送信します。プロバイダはコンシューマとの間で更新差分があるエントリの情報を、コンシューマに対して送信します。コンシューマは、プロバイダから送信されたエントリ情報を受け取り、自身のデータに反映します。後は、この処理を定期的に繰り返すことで、データの同期を行います。

refreshOnlyモードでの処理の流れ
refreshAndPersistモードでは、最初にコンシューマがrefreshOnlyモードと同様の方法で自身のデータとプロバイダのデータを同期させます。データの同期が完了した後、プロバイダは更新要求を受け付けるごとに、更新したエントリの情報をコンシューマに送信します。
そして、コンシューマは受け取ったエントリ情報を自身のデータに反映します。以上のことから、refreshAndPersistモードのレプリケーションは同期的なタイミングのレプリケーションであるといえます。

refreshAndPersistモードでの処理の流れ
LDAP Syncレプリケーションは、現在OpenLDAPの標準として開発が進められているレプリケーション方式です。LDAP SyncレプリケーションにはrefreshOnlyとrefreshAndPersistの2つのモードがありますが、今回はrefreshAndPersistモードの設定を行います。
プロバイダ、コンシューマの「slapd.conf」に、前項で解説したBDBバックエンドの設定を行います。ここではindexにentryCSN、entryUUIDを設定しています。LDAP Syncレプリケーションでは内部処理として、entryCSNおよびentryUUIDの検索を頻繁に行うため、インデックスを作成することで、レプリケーションの性能向上をはかっています。
さらに、プロバイダ、コンシューマのslapd.confに次の設定をそれぞれ追加します。
プロバイダ index objectclass,entryCSN,entryUUID eq overlay syncprov syncprov-checkpoint 100 10 syncprov-sessionlog 100 (以下のような記載方法もありました) index entryCSN,entryUUID eq overlay syncprov syncprov-checkpoint 100 10 syncprov-sessionlog 100 コンシューマ index objectclass,entryCSN,entryUUID eq syncrepl rid=123 provider=ldap://provider.bigbang.dyndns.org:389 type=refreshOnly interval=01:00:00:00 searchbase="dc=bigbang,dc=dyndns,dc=org" filter="(objectClass=organizationalPerson)" scope=sub attrs="cn,sn,ou,telephoneNumber,title,l" schemachecking=off bindmethod=simple binddn="cn=Manager,dc=bigbang,dc=dyndns,dc=org" credentials=secret (以下のような記載方法もありました) syncrepl rid=123 provider=ldap://<コンシューマのホスト名> type=refreshAndPersist retry=”5 10 60 +” searchbase="dc=bigbang,dc=dyndns,dc=org" bindmethod=simple binddn="cn=Manager,dc=bigbang,dc=dyndns,dc=org" credentials=secret上記の例で、コンシューマはプロバイダslapd ldap://provider.bigbang.dyndns.orgにポート389で接続し、1日に1度pollingモード(refreshOnly)の同期を行います。バインドは簡易認証で行い、その際のDNはcn=Manager,dc=bigbang,dc=dyndns,dc=orgでパスワードは"secret"です。cn=Manager,dc=bigbang,dc=dyndns,dc=orgのアクセス権は、複製対象を期待するどおりに取得するために、プロバイダに適切な設定にしておかなければなりません。また、プロバイダに対する検索に関する制限は、要求した内容を完全に取り込めるよう十分に大きくしておく必要があります。コンシューマは自分のデータベースへの書込みにrootdnを使うので、あやゆる書込みに対して全権限を持ちます。
上記の例での同期検索は、dc=bigbang,dc=dyndns,dc=orgをベースとしたサブツリー全体に対し、objectClassがorganizationalPersonであるエントリを検索します。取得する属性はcn、sn、ou、telephoneNumber、title、lです。スキーマ検査は無効にしてあるので、コンシューマslapd(8)はプロバイダslapd(8)から得た更新情報の処理時にエントリのスキーマ検査を行いません。コンシューマでは、syncprovオーバーレイを有効にしています。オーバーレイとは、OpenLDAPの機能拡張モジュールのことで、syncprovはLDAP Syncレプリケーションにおけるコンシューマの機能を追加します。
コンシューマでは、searchbaseにsuffixで指定した「dc=bigbang,dc=dyndns,dc=org」を設定しています。レプリケーションの対象は、searchbaseで設定したDN(Distinguished Name)配下のエントリになるので、「dc=bigbang,dc=dyndns,dc=org」を設定することで、LDAPサーバの全エントリをレプリケーションするようにしています。
syncrepl
syncrepl rid=<replica ID> provider=ldap[s]://<hostname>[:port] [type=refreshOnly|refreshAndPersist] [interval=dd:hh:mm:ss] [retry=[<retry interval> <# of retries>]+] [searchbase=<base DN>] [filter=<filter str>] [scope=sub|one|base] [attrs=<attr list>] [attrsonly] [sizelimit=<limit>] [timelimit=<limit>] [schemachecking=on|off] [bindmethod=simple|sasl] [binddn=<DN>] [saslmech=<mech>] [authcid=<identity>] [authzid=<identity>] [credentials=<passwd>] [realm=<realm>] [secprops=<properties>]
ディレクティブ | デフォルト値 | 説明 |
---|---|---|
overlay | - | 指定したオーバーレイを有効にします。 |
syncrepl | - | 現在のデータベースをマスタの複製であることを指定します。つまり、syncrepl複製エンジンを動かして複製コンシューマとなります。マスタデータベースはproviderパラメータに指定した複製プロバイダにあることになります。 |
rid | - | ridは複製コンシューマサーバの設定の中のsyncreplディレクティブの識別子として利用されます。 <replica ID>は現在のsyncreplディレクティブによって記述される指定が一意に識別されるようにします。<replica ID>には0以上で3桁以内の整数値を指定してください。 |
provider | - | プロバイダのサイトのスキーム、ホスト、ポート(オプション)を指定します。ホスト指定<hostname>はドメイン名でもIPアドレスでもかまいません。たとえばldap://provider.bigbang.dyndns.org:389やldaps://192.168.1.1:636 のように指定します。ポート指定を省略した場合には標準LDAPポート番号(389または636)が使われます。syncreplはコンシューマ主動のプロトコルを使うので、その指定はコンシューマサイトにあるという点で、プロバイダサイトに指定のあるreplicaとは異なっています。 |
type | - | レプリケーションのモードとして、refreshOnlyまたはrefreshAndPersistを指定します。 |
interval | - | refreshOnly操作では定期的に同期検索操作を行います。それぞれの同期検索操作が終わった後に、次の同期検索操作を再スケジューリングします。この時間隔はintervalパラメータに指定します。時間隔のデフォルトは1日に設定されています。refreshAndPersist操作では、同期検索がプロバイダで継続されます。プロバイダに更新があると、継続している同期検索のレスポンスとしてコンシューマにsearchResultEntryを返します。 |
retry | - | 複製中にエラーが起きると、コンシューマは再トライパラーメータにしたがって再接続を試みます。再トライパラメータは <retry interval>と<# of retries>のペアのリストです。たとえばretry="60 10 300 3"という指定は、最初の10回の再トライが60秒おきに、続く3回が300秒ごとであることを意味します。<# of retries>に+を指定すると、成功するまで限りなく再トライすることを意味します。 |
searchbase | - | syncreplの複製対象は、検索指定を使って定義します。コンシューマは検索指定にしたがってプロバイダに検索要求を送ります。検索指定は、通常の検索指定と同様にsearchbase、scope、filter、attrs、attrsonly、sizelimit、timelimitパラメータを持ちます。syncreplの検索指定はldapsearchクライアント検索ツールのパラメータと同じ値の形式と同じデフォルト値を持ちます。 |
schemachecking | - | schemacheckingパラメータの切替えにより、LDAP Syncコンシューマサイトでスキーマ検査を行うかを指定できます。このパラメータをonにすると、複製に格納されるエントリすべてのスキーマがチェックされます。複製に格納するエントリはどれも、スキーマ定義の要求する属性を持っているべきです。このパラメータをoffにすると、エントリがスキーマの適合性の検査なしに格納されます。デフォルトはoffです。 |
bindmethod saslmech authcid authzid credentials |
- | bindmethodには、プロバイダに接続する際の認証方式を指定します。パスワードベースの簡易認証を利用するなら simple、SASL認証を利用するならsaslを指定します。簡易認証は、十分なデータの完全性と機密性の保護(TLSやIPSECなど)が無ければ使うべきではありません。簡易認証はbinddnとcredentialsパラメータの指定を必要とします。一般にはSASL認証を推奨します。SASL認証を行うにはsaslmechパラメータに機構の指定が必要です。指定する機構に依存して、認証IDや認証情報をauthcidやcredentialsに指定できます。パラメータ authzidは認可IDを指定するのに使います。 |
binddn | - | binddnパラメータには、プロバイダに対して syncrepl検索を行う際のbindに使うDNを指定します。このDNはマスタデータベースの複製対象に対してreadアクセス権を持っているべきです。 |
●DB_CONFIG
データベースのパラメータファイルをコピーします。
# cp /usr/share/doc/openldap-servers-2.4.19/DB_CONFIG.example /var/lib/ldap/DB_CONFIGパラメータは以下のようなものがあります。
# set_cachesize <GigaBytes> <Bytes> <ncache> # 物理メモリ上にキャッシュするサイズを指定します。 # <GigaBytes>GB + <Bytes> のメモリを確保します。 # <ncache> が 0または1の場合は、連続したメモリ領域を確保します。 # <ncache> が 1より大きい場合は、<ncache>の数だけ分割して確保します。 # デフォルトは 0 262144 0 のため、指定がない場合に応答が遅くなる可能性があります。 # 推奨値は4MB以上。最大は4GBまでです。実際には物理メモリの25~50%を確保するようです。 # 64bit版に関しては不明です。 set_cachesize 0 268435456 1 # set_lg_regionmax <Bytes> # データベースファイル名を物理メモリにキャッシュする最大サイズを指定します。 # ファイル数(テーブル、インデックス)の増加にあわせて値を増やすほうが良いでしょう。 # デフォルトは約60KB # 推奨値は set_cachesize の 1/1024 です。 set_lg_regionmax 262144 # set_lg_bsize <Bytes> # トランザクションログへの書き込みバッファサイズを指定します。 set_lg_bsize 2097152 # set_flags # フラグを指定します。 # DB_LOG_AUTOREMOVE 不要になったトランザクションログを自動的に削除します # DB_TXN_NOSYNC ディスクに直ちに書き込まないことでパフォーマンスを上げます set_flags DB_LOG_AUTOREMOVE
●ログレベルの選択
必要なログのみを出力するようにログレベルをカスタマイズする方法を説明します。OpenLDAPサーバのログは、次の一覧に示す値を用いて、1つまたは複数のログ出力内容を選択できます。
ログレベル(10進数) | ログレベル(16進数) | ログレベル(文字列) | ログ出力内容 |
---|---|---|---|
-1 | - | any | すべてのログを出力 |
0 | - | - | まったくログを出力しない |
1 | 0x1 | trace | 内部の関数呼び出し |
2 | 0x2 | packets | パケット操作 |
4 | 0x4 | args | 処理の詳細なトレース |
8 | 0x8 | conns | コネクション管理 |
16 | 0x10 | BER | パケット送受信 |
32 | 0x20 | filter | 検索フィルタ処理 |
64 | 0x40 | config | 設定ファイルの処理 |
128 | 0x80 | ACL | アクセス制御リストの処理 |
256 | 0x100 | stats | ステータスログ(デフォルト) |
512 | 0x200 | stats2 | ステータスログ2 |
1024 | 0x400 | shell | シェルバックエンドとの通信 |
2048 | 0x800 | parse | エントリの解析 |
16384 | 0x4000 | sync | syncrepl コンシューマ処理 |
32768 | 0x8000 | none | 設定に依存しない最低限の出力のみ |
デフォルトでは10進数で"256"、または文字列で"stats"に当たるログがsyslogに送付されています。デフォルト設定では、基本的なOpenLDAPサーバの管理に有効な
- クライアントからどのような接続要求があり、それは成功/またはなぜ失敗したか
- どのようなLDAPの操作が行われ、それは成功/またはなぜ失敗したか
実運用時のログレベルの選択は、例えばデフォルトのログレベルなど、必要最低限の内容に絞っておくとよいでしょう。これは、ログの出力が、性能劣化やディスク領域の圧迫につながるからです。さらに、出力量が多くなる詳細なログを取得している場合は、多くの情報に埋もれ、かえって問題の概要がつかみにくくなってしまうという理由もあります。
もちろん、すでに問題が発生している状況では、より詳細なログを取得し調査する必要があります。
●ログレベルの変更
これまで使用されていたsldap.confは利用されなくなりました。これに代わり、olc*****のようなものを使用し設定することになっています。
ログレベルの変更は下記のように実施します。
# vi olcLogChange.ldif dn: cn=config changetype: modify replace: olcLogLevel olcLogLevel: filter config ACL stats sync ldapmodify -x -D cn=config -W -f ldapWork/olcLogChange.ldif Enter LDAP Password: modifying entry "cn=config"これにより、設定したレベルのログが出力されるようになります。
ただし、statsを有効にするとログサイズが1日で数Gbyteになってしまうこともありますので注意が必要です。
ログレベルの指定は、次のように、slapd.confのグローバルセクションにloglevelディレクティブを用いて行うことができます。
# vi /etc/openldap/slapd.conf ↓ 以下のどれか1行を設定 loglevel 129 ← 10進数の128と、1を組み合わせて指定した例 loglevel 0x81 ← 上記の設定を、16進数で指定した例 loglevel trace,ACL ← 上記の設定を、文字列で指定した例slapd.confファイルへの変更後は、OpenLDAPサーバを再起動する必要があります。
# service slapd restart再起動後は、LDAPクライアントからの接続を行いながら、syslog.confファイルに指定した出力先に、指定した内容のログが記録されることを確認しておきましょう。
# tail -f /var/log/slapd.log
●ログの削除
次は、ログの削除について説明します。このログ削除を怠って運用を続けていると、肥大化したログがディスク領域を圧迫しかねないので注意が必要です。
最も簡単なOpenLDAPサーバのログ削除は、ログローテートを利用する方法です。
# vi /etc/logrotate.d/syslog
/var/log/slapd.log /var/log/messages [...略...] { ← ログファイルslapd.logを追加
sharedscripts
postrotate
/bin/kill -HUP [...略...]
/bin/kill -HUP [...略...]
endscript
}
例えば、上記の例のように、/etc/logrotate.d/syslogファイルにローテーション対象としてOpenDLAPサーバのログファイル(ここでは、/var/log/slapd.log)を追加することで、CentOSでは、「毎週日曜日の朝4時前後に現行のファイルがローテーションされ、過去4世代分のファイルを保持し、それより古い世代のファイルは削除される」ようになります。
# date 2011年 9月 25日 月曜日 09:46:15 JST ← いまの時刻 # ls -l /var/log/ldap.log* ↓ ローテートされたログファイル -rw------- 1 root root 3308 9月 25 09:41 /var/log/slapd.log -rw------- 1 root root 17002 9月 18 04:02 /var/log/slapd.log.1 -rw------- 1 root root 27434 9月 11 04:02 /var/log/slapd.log.2 -rw------- 1 root root 45150 9月 4 04:02 /var/log/slapd.log.3
●Berkeley DBのトランザクションログファイル
実際のOpenLDAPサーバの運用においては、OpenLDAPサーバが出力するログのほか、エントリ情報を蓄積するバックエンドデータベースのログファイルについても考慮しておく必要があります。ここでは、OpenLDAPサーバがデフォルトで採用するバックエンドデータベースBerkeley DBを対象にして、ログファイルの管理方法を説明します。
次の表は、OpenLDAPサーバのデータディレクトリに作成されるファイル一覧です。
ファイル名 | 役割 |
---|---|
DB_CONFIG | Berkeley DBの設定ファイル。Berkeley DBのホームディレクトリ(OpenLDAPの「datadir」以下)に配置する |
__db.[00X] | Berkeley DBのプロセス、スレッドが共有利用するメモリ領域(shared memory regions)を記録するファイル |
alock | OpenLDAPがBerkeley DBの重複利用や正常停止を管理するために利用するアクセスロック(Access LOCK)ファイル |
log.[000000000X] | Berkeley DBのトランザクションログファイル。データの更新量に依存して増加。デフォルトのサイズは10Mbytes |
[インデックス指定属性名].bdb | OpenLDAPのインデックス情報を蓄積するデータファイル。インデックスを指定した属性ごとに作成される |
上記一覧中の、ファイル名が「log.」で始まり連番が付与されるファイルが、管理対象となるBerkeley DBのトランザクションログファイルです。
●トランザクションログファイルの削除
Berkeley DBのトランザクションログファイルの削除方法は、大きく分けて、
- 管理者が手動で行う方法
- Berkeley DBが自動で行う方法
管理者が手動で削除を行う方法では、db_archive -dコマンドを利用します。
# cd /usr/local/openldap-2.4.19/var/openldap-data ← ソースからインストールした場合 # PATH=$PATH:/usr/local/BerkeleyDB.4.7/bin ソースからインストールした場合 # db_checkpoint -h . -1 ← チェックポイントの明示的な実行 # db_archive -h . -d ← 不要なログファイルの削除トランザクションログファイルは、次の3つの条件を満たしている場合に削除が可能となります。ここで説明したdb_archive -dコマンドは、これら3つの条件を満たすファイルを選択したうえで削除できるコマンドです。
- 実行中のトランザクションに関連していない
- 新しいトランザクションログファイルが作成され、チェックポイントが実行されている
- Berkeley DBの実行環境で、唯一のトランザクションログファイルでない
定期的にトランザクションログファイルをバックアップディレクトリに退避するような運用を行っている場合は、退避する前に削除してしまわないよう、db_archive -dコマンドを実行するタイミングに注意が必要です。
一方のBerkeley DBに自動で削除を行わせる方法では、Berkeley DBの設定ファイルであるDB_CONFIGファイルに"DB_LOG_AUTOREMOVE"フラグを指定します。
# cd /usr/local/openldap-2.4.19 ← ソースからインストールした場合 # vi var/openldap-data/DB_CONFIG ← ソースからインストールした場合 # vi /var/lib/ldap/DB_CONFIG ← yumでのインストール時 set_flags DB_LOG_AUTOREMOVE ← 不要なログの自動削除を指定 # kill -INT `cat var/run/slapd.pid` ← ソースからインストールした場合 # ./libexec/slapd -u ldap ← ソースからインストールした場合 # service slapd restart ← yumでのインストール時この方法では、Berkeley DBへ更新が発生し、トランザクションログファイルへの書き込みが行われた時点で、削除可能なファイルがあるかどうかの判断が行われます。この方法は、定期的にトランザクションログファイルを退避させる運用には向かないことに注意してください
●OpenLDAPサーバのアクセスログ
アクセスログとは、OpenLDAPサーバにモジュールを追加することで利用可能となる機能であり、アクセス状況を把握する目的で利用されます。このアクセスログは、指定するバックエンドデータベースに対して行われたbind(認証)、add(追加)、modify(変更)といった指定する操作を、ファイルではなく別のバックエンドデータベースへ記録することができます。また、記録したログはldapsearchにて条件を絞り込んで参照できます。
CentOSにバンドルされるOpenLDAPサーバ(openldap-serversパッケージ)には、アクセスログモジュールが含まれていません。CentOS 5.3以降、アクセスログなどのオーバレイ機能は、openldap-servers-overlaysパッケージとして、別途、提供されています。
また、アクセスログは、OpenLDAPサーバのコンパイル時にも、デフォルトでは含まれないオプションです。この機能を利用するには、コンパイルの過程で"--enable-accesslog=yes"または"--enable-overlays=yes"など、明示的にオプションを追加する必要があります(注)。
$ CPPFLAGS=-I/usr/local/BerkeleyDB.4.7/include \ > LDFLAGS=-L/usr/local/BerkeleyDB.4.7/lib \ > ./configure --prefix=/usr/local/openldap-2.4.19 --enable-accesslog=yes
注:"enable-accesslog"はアクセスログモジュールのみ、"enable-overlays"はすべての追加モジュールを含めてコンパイルすることを指定するオプションです。●アクセスログの出力
ここでは、OpenLDAPサーバ側の設定を行う前に、アクセスログを記録するバックエンドデータベースを配置するディレクトリを"var/openldap-accesslog"として準備します。
# cd /usr/local/openldap-2.4.19 # mkdir var/openldap-accesslog # cp etc/openldap/DB_CONFIG.example var/openldap-accesslog/ # chown -R ldap.ldap var/openldap-accesslog # chmod 700 var/openldap-accesslog次の例では、OpenLDAPサーバの設定ファイルslapd.confに、アクセスログの調査対象とするバックエンドデータベースをsuffix"dc=bigbang,dc=dyndns,dc=org"、またアクセスログを蓄積するバックエンドデータベースをsuffix"cn=accesslog"としてディレクティブを設定しています。
# cd /usr/local/openldap-2.4.19 # vi etc/openldap/slapd.conf ...[略]... # 監査対象のバックエンドデータベース database bdb suffix "dc=bigbang,dc=dyndns,dc=org" rootdn "cn=Manager,dc=bigbang,dc=dyndns,dc=org" rootpw secret directory /usr/local/openldap-2.4.19/var/openldap-data index objectClass eq ...[略]... ↓ 監査対象のDB "dc=bigbang,dc=dyndns,dc=org"への設定 overlay accesslog ← アクセスログモジュールを利用 logdb cn=accesslog ← アクセスログ用のデータベースを指定 logops bind ← 記録対象のLDAPの操作を指定 logpurge 7+00:00 1+00:00 ← 毎日チェックし、7日以前の記録は削除 logsuccess TRUE ← 記録対象であっても失敗した操作は記録しない # アクセスログ用のデータベースの設定 database bdb suffix "cn=accesslog" directory /usr/local/openldap-2.4.19/var/openldap-accesslog index objectClass,reqStart,reqDN eq ← 検索対象の属性 注 access to * by dn.base="cn=Manager,dc=bigbang,dc=dyndns,dc=org" read ← 管理者のみ参照可注2:アクセスログで利用するスキーマ情報は、アクセスログモジュール内(overlays/accesslog.c)に実装されています。このため、設定ファイル内で、明示的にスキーマファイルを読み込む必要はありません。また、ここでのobjectClassはフィルタなしでの検索に備えるため、reqStartはlogpurge機能が利用するため、reqDNは後述の検索例でフィルタ条件に利用しているため、等価インデックス(eq)を指定しています。
上記の設定例では、「あるエントリのユーザが、直近の1週間で、このOpenLDAPサーバを認証に利用できているか」を確認するアクセスログを取得することを目的としています。このような設定は、例えば、不要なエントリをクリーンアップする際に、現在もシステムを利用しているのか、それとも長くシステムを利用しておらず削除候補となるユーザのエントリであるのかの判定に応用することができます。
設定変更後は、OpenLDAPサーバを再起動してアクセスログへの記録を開始します。
# cd /usr/local/openldap-2.4.19 # kill -INT `cat var/run/slapd.pid` # ./sbin/slapindex -b cn=accesslog ← すでにアクセスログが記録された状態で # chown -R ldap.ldap var/openldap-accesslog ← indexを変更した場合に実行が必要 # ./libexec/slapd -u ldap
注:アクセスログで利用するスキーマ情報は、アクセスログモジュール内(overlays/accesslog.c)に実装されています。このため、設定ファイル内で、明示的にスキーマファイルを読み込む必要はありません。また、ここでのobjectClassはフィルタなしでの検索に備えるため、reqStartはlogpurge機能が利用するため、reqDNは後述の検索例でフィルタ条件に利用しているため、等価インデックス(eq)を指定しています。●アクセスログの確認
次のコマンド例では、ここまでに説明したアクセスログ設定を行い、アクセスログが蓄積された後、特定エントリ(uid=test1000,ou=People,dc=bigbang,dc=dyndns,dc=org)の認証が成功した記録を確認するため、reqDN属性を条件に検索を行っています。
# cd /usr/local/openldap-2.4.19
# ./bin/ldapsearch -x -b cn=accesslog -D cn=Manager,dc=bigbang,dc=dyndns,dc=org -W
\ > reqDN=uid=test1000,ou=People,dc=bigbang,dc=dyndns,dc=org -LLL
Enter LDAP Password: ← 管理者ユーザのパスワードを入力(ここでは"secret")
●アクセスログに設定可能なディレクティブ一覧
アクセスログモジュールでは、次のディレクティブが利用可能です。
ディレクティブ | 説明 |
---|---|
logdb | アクセスログを蓄積するバックエンドデータベースのsuffixを指定 例)logdb cn=accesslog |
logops | 記録対象とする操作(add、delete、modify、modrdn、compare、search、bind、unbind、abandon)を指定。次のエイリアス利用も可能。 writes:add、delete、modify、modrdnを含む reads:compare、searchを含む session:bind、unbind、abandonを含む all:すべての操作を含む 例)logops bind writes |
logold | 削除(delete)、変更(modify)処理にて、変更前のエントリ情報を記録する対象エントリを特定するために、マッチさせるフィルタを指定 例)logold uid=test* |
logoldattr | 変更処理(modifyおよびmodrdn)にて、変更前の値も記録対象とする属性を指定 例)logoldattr cn uid uidNumber |
logpurge | ログを保持する期間および削除可能かどうかの確認を行う間隔を指定。時間の指定に利用するフォーマットは[ddd+]hh:mm[:ss]。日数、秒は省略可能 例)logpurge 7+00:00 1+00:00 |
logsuccess | TRUEを設定した場合は、成功した操作のみを記録。デフォルトはFALSEであり、成功、失敗に関わらずlogopsで指定された操作を記録 例)logsuccess TRUE |
●バックアップ
データのバックアップにはオンラインバックアップが可能なslapcatコマンド(データをLDIFファイル形式で出力)を利用します。
全データをバックアップする場合は以下のようになります。
# slapcat -l backup.ldif特定のサブディレクトリ配下をバックアップする場合は-sオプションを利用します。Users配下のバックアップを取る場合は以下のように指定します。
# slapcat -s "ou=Users,dc=oss-d,dc=net" -l backup.ldif
●phpLDAPadminのインストール
まず、次のコマンドを実行してみます。
# yum install phpldapadminしかし、パッケージが見つからないと表示されるかもしれません。その場合、EPEL(Extra Packages for Enterprise Linux)を利用します。EPELでは様々なFedoraのパッケージが、互換ディストリビューションで利用することを目的に管理されています。
# ls /etc/yum.repos.d/ CentOS-Base.repo CentOS-Media.repo CentOS-fasttrack.repo CentOS-Debuginfo.repo CentOS-Vault.repo # yum install -y epel-release # ls /etc/yum.repos.d/ CentOS-Base.repo CentOS-Media.repo CentOS-fasttrack.repo epel.repo CentOS-Debuginfo.repo CentOS-Vault.repo epel-testing.repoこれでphpLDAPadminのパッケージを取得できるようになりました。ただし、EPELのドキュメントには、リポジトリを混在させると問題が出やすいとされていますので注意してください。
そこで、この問題を避けるために、yum-plugin-prioritiesを導入します。
# yum install -y yum-plugin-prioritiespriorities.confにenabled=1の記述があることを確認しておきます。
# cat /etc/yum/pluginconf.d/priorities.conf [main] enabled = 1あとは、各リポジトリ用の設定ファイルにpriority=Nの形式で優先度を指定します。Nは1〜99の整数です。数字が小さいほど優先度が高くなります。たとえば、次のように記述します。
# vi /etc/yum.repos.d/CentOS-Base.repo [base] name=CentOS-$releasever - Base mirrorlist=http://mirrorlist.centos.org/?release=$releasever& \ arch=$basearch&repo=os&infra=$infra #baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 priority=1 #released updates [updates] name=CentOS-$releasever - Updates mirrorlist=http://mirrorlist.centos.org/?release=$releasever& \ arch=$basearch&repo=updates&infra=$infra #baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 priority=1baseリポジトリやupdateリポジトリには1を、サードパーティのリポジトリには10より大きな値を設定することが推奨されています。この設定をすると、指定したパッケージがbaseリポジトリにない時にだけ、EPELへ探しにいってくれます。
phpLDAPadminの設定ファイルを編集します。
#vi /etc/phpldapadmin/config.php //(略) $servers->setValue('login','attr','dn'); ← コメントアウトを外す // $servers->setValue('login','attr','uid'); ← コメントアウトする //(略)LDAPサーバが動作するWebサーバで、設定ファイルを必要に応じて編集します。(下記はApache 2.2です。)
# /etc/httpd/conf.d/phpldapadmin.conf Alias /phpldapadmin /usr/share/phpldapadmin/htdocs Alias /ldapadmin /usr/share/phpldapadmin/htdocs <Directory /usr/share/phpldapadmin/htdocs> Order Deny,Allow Deny from all Allow from 127.0.0.1 <パブリックIPアドレス> Allow from ::1 </Directory>phpLDAPadminへのアクセスをhttps限定にさせるためhttpでアクセスしてきた場合、リダイレクトするようにhttpd.confを変更します。
# vi /etc/httpd/conf/httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so ← コメントアウトする
<ifModule mod_rewrite.c>
RewriteEngine On
# LogLevel alert rewrite:trace3
RewriteCond %{HTTPS} off
# RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
RewriteRule ^/ldapadmin/(.*)?$ https://%{HTTP_HOST}/ldapadmin/$1 [R,L]
RewriteRule ^/phpldapadmin/(.*)?$ https://%{HTTP_HOST}/phpldapadmin/$1 [R,L]
</ifModule>
・RewriteEngine On
rewriteを有効にする。
・RewriteLog "logs/rewrite_log"(参考)
rewrite動作のログファイル指定。Windowsなら"logs/rewrite.log"の方が扱いやすい。
・RewriteLogLevel 0(参考)
rewriteのログレベル指定。「1」にするだけで膨大なログが出るので、デバッグが終わったら「0」にしないと大変なことになる
・RewriteCond %{SERVER_PORT} !^443$
サーバ(apache)へのアクセスポートが443番では無かったら(即ち、httpsでのアクセスではなかったら)、以下のルールを適用するという意味。
・RewriteRule
必要な分を1行づつ記述していくが、基本は正規表現でマッチングをとり、一致したらHTTPSにrewriteさせる
●Postfixとの連携
LDAPを利用するので、以下の項目に関して事前に決めておきます。
管理する仮想ドメイン | bigbang.dyndns.org |
メール管理アカウント(for postfix) | mail (UID: 8) |
メール保存ディレクトリ | /var/spool/mail/ or Maildir/ |
LDAP Data構造 | 自ドメインでの構造による |
LDAP suffix | dc=bigbang,dc=dyndns,dc=org |
LDAP bind DN | cn=Manager,dc=bigbang,dc=dyndns,dc=org |
LDAP bind passwd | ******** |
OpenLDAPの設定を行います。LDAP標準のschemaではpostfixを使う際に色々不足しているので、新たにschemaを作成します。
ページに提示しているmail.schemaの場合、既存のLDAPツリーにぶら下がっている各スタッフのエントリーにmailUserやmailGroup objectClassを追加することができませんので、これらを追加できるようにする変更を行います。また、attributeにて定義してあったhomeDirectoryは既に別の用途に利用しているため、これをメール配信用のディレクトリにするのもよくありません。したがって、新たにmailDirectoryというattributeを追加することにしました。そのため、メールボックスはこの属性で指定することになります。
# vi /etc/openldap/schema/mail.schema attributetype (1.1.2.1.1.1 NAME 'mailForward' DESC 'forward address' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26) attributetype (1.1.2.1.1.2 NAME 'mailAlias' DESC 'alias address' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26) attributetype (1.1.2.1.1.3 NAME 'accountActive' DESC 'active or not active' EQUALITY booleanMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE) attributetype (1.1.2.1.1.4 NAME 'domainName' DESC 'domain name' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE) attributetype (1.1.2.1.1.5 NAME 'transport' DESC 'transport' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26) attributetype (1.1.2.1.1.6 NAME 'mailQuota' DESC 'Mail Home Directory Max byte' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE) attributetype (1.1.2.1.1.7 NAME 'mailDrop' DESC 'drop address' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26) attributetype ( 1.3.6.1.4.1.15774.1.10.1.2.3 NAME 'mailDirectory' DESC 'mail directory' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} SINGLE-VALUE ) objectClass (1.1.2.2.1.1 NAME 'mailUser' DESC 'mail user Object' SUP top AUXILIARY MUST ( transport $ mailDirectory \ $ accountActive $ domainName $ userPassword $ mailQuota ) MAY ( mailForward $ mailAlias )) objectClass (1.1.2.2.1.2 NAME 'mailGroup' DESC 'ML Group Account Object' SUP top AUXILIARY MUST ( accountActive $ domainName $ mailDrop ))
●root によるパスワードのリセットはサポートされません。
CentOS 7でpasswdでLDAPユーザのパスワードを変更しようとすると、「root によるパスワードのリセットはサポートされません。」と表示されパスワードの変更ができません。
/var/log/secureに下記のようなログが記録されていました。
Apr 13 08:37:53 serverA passwd: pam_unix(passwd:chauthtok): \ user "test5001" does not exist in /etc/passwd Apr 13 08:37:58 serverA passwd: pam_sss(passwd:chauthtok): \ Authentication failed for user test5001: 6 (拒否されたパーミッション) Apr 13 08:37:58 serverA passwd: pam_sss(passwd:chauthtok): \ User info message: root によるパスワードのリセットはサポートされません。対応方法は「●LDAPクライアントのセットアップ(CentOS 7)を参照してください。
●getent passwdで表示されない
CentOS 7でgetent passwdを実行してもLDAPユーザが表示されなくなってしまいました。/etc/pam.d以下をいろいろ変更していたのが原因かもしれません。
原因は/etc/nsswitch.confを変更したことでした。このファイルを下記のとおり修正したところ表示されるようになりました。
# vi /etc/nsswitch.conf #passwd: files sss #shadow: files sss #group: files sss ↓ passwd: files ldap sss shadow: files ldap sss group: files ldap sss
●LDAPユーザで登録されているユーザでpasswdでパスワードが変更できない
それぞれのサーバの環境は下記のとおりです。
1 サーバ情報
サーバ#1:nezumi、192.168.0.4
サーバ#2:centos6、192.168.0.12
2 共通点
$ uname -r 2.6.32-573.22.1.el6.i686 $ rpm -qa | grep openldap-servers openldap-servers-2.4.40-7.el6_7.i686 $ rpm -qa | grep openldap-clients openldap-clients-2.4.40-7.el6_7.i686 $ rpm -qa | grep nss-pam-ldap nss-pam-ldapd-0.7.5-20.el6_6.3.i686 $ rpm -qa | grep sssd sssd-common-1.12.4-47.el6_7.8.i686 sssd-ldap-1.12.4-47.el6_7.8.i686 sssd-1.12.4-47.el6_7.8.i686 sssd-client-1.12.4-47.el6_7.8.i686 $ authconfig --test | grep ldap パスワード: nss_ldap is enabled LDAP server = "ldap://192.168.0.12/,ldap://192.168.0.4/" pam_ldap is enabled LDAP server = "ldap://192.168.0.12/,ldap://192.168.0.4/"LDAPユーザにスイッチすることは可能。
OSがCentOS 6の場合 [user@nezumi ~]$ su - sato パスワード: [sato@nezumi ~]$ OSがCentOS 6の場合 [user@centos6 ~]$ su - sato パスワード: [sato@centos6 ~]$ OSがCentOS 7の場合 [user@n-server ~]$ su - sato パスワード: su: 認証失敗
3 異なる点
sssdはcentos6のみで動作。サーバnezumiでのpasswdよるLDAPパスワード変更は可能ですが、サーバcentos6では変更できません。
[sato@nezumi ~]$ passwd ユーザー sato のパスワードを変更。 Enter login(LDAP) password: 新しいパスワード: 新しいパスワードを再入力してください: LDAP password information changed for sato passwd: 全ての認証トークンが正しく更新できました。 [sato@centos6 ~]$ passwd ユーザー sato のパスワードを変更。 現在のパスワード: (パスワードの入力) パスワードの変更に失敗しました。 サーバーのメッセージ: Old password not accepted. Kerberos 5 Password: (上記と同じパスワードの入力) Enter login(LDAP) password: (上記と同じパスワードの入力) 新しいパスワード: 新しいパスワードを再入力してください: パスワードの変更に失敗しました。 サーバーのメッセージ: Old password not accepted. passwd: 認証トークン操作エラー下記のとおり、/etc/pam.d/passwdを変更したところサーバcentos6でも変更できるようになりました。
[root@centos6 ~]# vi /etc/pam.d/passwd
#%PAM-1.0
password sufficient pam_ldap.so
auth include system-auth
account include system-auth
password substack system-auth
-password optional pam_gnome_keyring.so
[root@centos6 ~]# exit
logout
[user@centos6 ~]$ su - sato
パスワード:
[sato@centos6 ~]$ passwd
ユーザー sato のパスワードを変更。
Enter login(LDAP) password:
New password:
Re-enter new password:
LDAP password information changed for sato
passwd: 全ての認証トークンが正しく更新できました。
CentOS 7でsuできなかったときの
Apr 28 13:03:36 n-server su: pam_sss(su-l:auth): authentication failure; \ logname=user uid=1000 euid=0 tty=pts/4 ruser=user rhost= user=sato Apr 28 13:03:36 n-server su: pam_sss(su-l:auth): \ received for user sato: 6 (拒否されたパーミッション)
●Suppressed ???? messages from /system.slice/slapd.serviceが/var/log/messagesに記録される
参考URL:syslogの溢れ対策
5分毎に/var/log/messagesに「Suppressed 5768 messages from /system.slice/slapd.service」が記録されていることに気がつきました。
5758件のメッセージが溢れたことを意味しています。
この溢れを対処するため、journald.conf及びrsyslog.confを編集します。
# vi /etc/systemd/journald.conf # 下記のように編集 RateLimitInterval=10s RateLimitBurst=20000 # vi /etc/rsyslog.conf # 末尾に追加する $imjournalRatelimitInterval 10 $imjournalRatelimitBurst 20000 # systemctl restart systemd-journald # systemctl restart rsyslog
●「bdb_equality_candidates: (uid) not indexed」が/var/log/slapd.logに頻繁に記録される
参考URL:OpenLDAP - 「bdb_equality_candidates」エラーの対応方法
「bdb_equality_candidates: (uid) not indexed」が/var/log/slapd.logに頻繁に記録されることに気がつきました。
下記のように対処することにより、記録されなくなりました。
# ldapvi -Y EXTERNAL -h ldapi:/// -b cn=config # olcDbIndexが記載されている行を探します。見つかったらその下に下記行を追記します。 olcDbIndex: uid eq olcDbIndex: member eq olcDbIndex: uniqueMember eq olcDbIndex: memberUid eq # 変更が完了したら「:wq」と入力、Enterを押下します。 SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 13 entries read add: 0, rename: 0, modify: 1, delete: 0 Action? [yYqQvVebB*rsf+?] y (「y」と入力し、編集を反映させる) Done.LDAPを再起動する必要はありません。
この作業後、ログサイズが非常に小さくなりました。