• 締切済み

OpenLDAPの”uid”属性について質問です。

OpenLDAPの”uid”属性について質問です。 【環境】 RHEL5(64-bit) OpenLDAP2.3.43 【質問内容】 OpenLDAPを認証サーバとして、Webアプリケーションを構築しようと考えています。 ユーザID:オブジェクトクラスinetOrgPersonにおける”uid”属性 パスワード:オブジェクトクラスPersonにおける”userPassword”属性 で作成していますが、1点困っています。 ユーザIDに大文字小文字の区別がされないのです。 この件、調べてみたところ、 uid属性の等価比較する場合のルール(EQUALITY)が 、大文字/小文字を区別しない 状態になっているのでは?と考えました。 OpenLDAP(に標準添付されるスキーマ定義ファイル)のデフォルト値としても EQUALITY caseIgnoreMatch となっているようです。 そこで、/etc/openldap/schema/core.schema の内容を確認したところ、 該当箇所は以下のようになっていました。 #attributetype ( 0.9.2342.19200300.100.1.1 # NAME ( 'uid' 'userid' ) # DESC 'RFC1274: user identifier' # EQUALITY caseIgnoreMatch # SUBSTR caseIgnoreSubstringsMatch # SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) また、他のスキーマ定義ファイルを見ても属性uidを定義している箇所は 存在しておりませんでした。 ここで疑問なのは、 ・属性uidの定義箇所はコメントアウトされており、未設定に見える ・ですが、大文字小文字の判断の問題はあれど、属性値としてのuidは  登録できているように見える です。 ・未記載の場合に適用されるデフォルト値があり、そちらを参照している 等あるのでしょうか? 最終的に当方が実施すべきと考えていることは、属性uidに対し EQUALITY caseExactMatch を実施する、とかんがえておりますが、上記の通りその実施箇所が わからなくなっております。 以上、ご存じの方がいらっしゃれば御回答頂きたく存じます。 (参考) slapd.confにて以下のように定義しており、他のスキーマ定義ファイルを 参照していることは無いと認識しております。 include /etc/openldap/schema/core.schema include /etc/openldap/schema/cosine.schema include /etc/openldap/schema/inetorgperson.schema include /etc/openldap/schema/nis.schema include /etc/openldap/schema/その他、独自スキーマ また、全てのスキーマ定義ファイルについて、キーワード”uid”で検索し、 有意な設定箇所が無いことを確認しております。

みんなの回答

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

>uid属性の等価比較する場合のルール(EQUALITY)が、大文字/小文字を区別しない  たしかにuid属性はRFCにおいて定義上そうなっていますね。  そして、OpenLDAPサーバーソフトウェアの中で、core.schemaなどにコメントで記述されているものはプログラムの中にハードコーディングされている模様です。試してみると分かりますがコメントを外してサーバーを起動してみると重複するスキーマというエラーになって起動できません。 > 最終的に当方が実施すべきと考えていることは、属性uidに対し > EQUALITY caseExactMatch > を実施する、とかんがえておりますが、上記の通りその実施箇所が > わからなくなっております。  前述の通りuid属性の中身を書き換えてOpenLDAPサーバーを起動する事はできません。また、一応、なんといいますか、OIDを上書きするのはディレクトリーサービス上してはいけない事になっています。なので、実施すべきことは「スキーマの拡張」という作業になるのですが、ディレクトリーサービスというシステムの中で、スキーマはIANAで厳密に管理されており、いわば「オレオレスキーマ」というものは作ってはいけない決まりになっています。スキーマの拡張には最終的にIANAに届け出る必要があるのです。  以上の事より、3つの道のいずれかで対処する事になるかと思います。 1.スキーマには一切手を加えずに、検索時にcaseExactMatchルールを使う。  例えば、今使われているフィルターが、ユーザー名で置き換わる部分を%uと表現するとして &((objectClass=inetOrgPerson)(uid=%u)) などという場合、uidは定義の通りcaseIgnoreMatchになりますが、これを &((objectClass=inetOrgPerson)(uid:caseExactMatch:=%u)) とする事で、uidに対する条件としてcaseExactMatchマッチングルールを使用して検索を行う事ができます。 2.ディレクトリーサービスのルールの範囲内で実現可能な方法を検討する。  属性uid(のEQUALITY)がcaseIgnoreMatchなのは動かしようが無い事なので、caseExactMatchである別の属性を使用する事になります。  OpenLDAPのスキーマ定義ファイル(RHEL5であれば/etc/openldap/schemaの中にあるファイル)で言うと、core.schemaの中に入っているスキーマの中ではrefくらいでしょうか。java.schemaの中にはjavaClassNameなどの属性があります。それをMUST属性としているauxiliaryなオブジェクトクラスのjavaNamingReferenseなどを付与して、uid属性の変わりにjavaClassName属性を認証の名前として使用する事で、caseExactMatchルールを用いて検索する事ができます。 「ユーザー名なのに属性javaClassNameを使うのか?」という問いに対しては、こんな自由な事ができるのがLDAP(と言うかディレクトリーサービス)がLDAPたるゆえんであり、なおかつディレクトリーサービスの枠内で実現されています。他にも、(homeDirectoryなど)構文がIA5 StringでマッチングルールがcaseExactIA5Matchであるような属性にするという選択もあります。 3.あえてディレクトリーサービスのルールを破る。  前述の通り、ディレクトリーサービスでは、自分勝手に定義済み属性の属性値を変更したり、付与されていないOIDで属性やオブジェクトクラスを定義する事は許されません。  私も技術者の端くれでソフトウェアシステムのルールの中で生きている以上、積極的に賛成する事はできかねますが、閉じたシステム構築の中で属性の改ざんやオレオレスキーマを作成する事は技術的に不可能ではありません。自前でcaseExactMatchな属性myUidを作り、inetOrgPersonをスキーマ拡張してmyUid属性をMUSTに追加したmyInetOrgPersonオブジェクトクラスを作る事もできる訳です。  ただ、やはり後で収集がつかなくなる危険性もあるため、あえてこの手を選ぶのはどうしても1か2の方法が使えなかったら、だけにとどめておくのが良いでしょう。

関連するQ&A

  • OpenLDAPログインについて

    OpenLDAPを使ったログインについて質問があります。 OpenLDAPサーバを利用したユーザー認証で、OpenLDAPサーバにエントリした ユーザでログインできません。また、/etc/passwdに登録してあるユーザをツールを使用して、OpenLDAPサーバに移行したユーザでは、ログインできます。ユーザの追加方法または設定ファイルに誤りがあるんでしょうか? slapd.conf include /usr/local/etc/openldap/schema/core.schema include /usr/local/etc/openldap/schema/cosine.schema include /usr/local/etc/openldap/schema/inetorgperson.schema include /usr/local/etc/openldap/schema/nis.schema # Define global ACLs to disable default read access. # Do not enable referrals until AFTER you have a working directory # service AND an understanding of referrals. #referral ldap://root.openldap.org pidfile /usr/local/var/run/slapd.pid argsfile /usr/local/var/run/slapd.args # Load dynamic backend modules: modulepath /usr/local/libexec/openldap moduleload back_bdb.la ldifファイル dn: uid=hogehoge,ou=People,dc=solaristest,dc=com uid: hogehoge cn: hogehoge objectClass: account objectClass: posixAccount objectClass: top objectClass: shadowAccount loginShell: /bin/sh uidNumber: 119 gidNumber: 1 homeDirectory: /export/home/hogehoge userPassword: {SSHA}KzPlKEL6i7Sw0Br5BmgMr0OuW4WcXFJk 勉強不足で申し訳ありませんが、教えて頂けたら幸いです。 ご指導よろしくお願いします。

  • openLDAPでslapd.confの設定

    openLDAPをインストールして、ドキュメントのクイックスタート「 http://www.openldap.org/doc/admin24/quickstart.html 」を見ながら、設定を行なっているのですが、期待した結果が得られません。 ドキュメントによると、slapd.confに「suffix "dc=example,dc=com"」と記述した場合、slapdのサービスを起動した後で「ldapsearch -x -b '' -s base '(objectclass=*)' namingContexts」を実行すると、「dn: namingContexts: dc=example,dc=com」と表示されるべきなのですが、「namingContexts: dc=my-domain,dc=com」と表示されてしまいます。そのためかどうかわかりませんが、後続のldapaddを行なっても、正しいパスワードを入れているつもりなのにInvalid Credentials(49)が表示されてしまいます。 環境:CentOS 6 x86_64 インストール:openldap-servers と openldap-clientsをyumでインストールした rpm -qc openldap-serversの結果: /etc/openldap/schema/collective.schema /etc/openldap/schema/corba.schema /etc/openldap/schema/core.ldif /etc/openldap/schema/core.schema /etc/openldap/schema/cosine.ldif /etc/openldap/schema/cosine.schema /etc/openldap/schema/duaconf.schema /etc/openldap/schema/dyngroup.schema /etc/openldap/schema/inetorgperson.ldif /etc/openldap/schema/inetorgperson.schema /etc/openldap/schema/java.schema /etc/openldap/schema/misc.schema /etc/openldap/schema/nis.ldif /etc/openldap/schema/nis.schema /etc/openldap/schema/openldap.ldif /etc/openldap/schema/openldap.schema /etc/openldap/schema/pmi.schema /etc/openldap/schema/ppolicy.schema /etc/openldap/schema/redhat/autofs.schema /etc/openldap/slapd.conf /etc/pki/tls/certs/slapd.pem /etc/sysconfig/ldap 当然、slapd.conf は /etc/openldap の中に作っています。 アドバイスよろしくお願いします。

  • SUID(Set UID)属性の使い方について

    SUID属性を利用した処理を行いたいのですが上手く動きません。 例えば今rootユーザのみ読み書き可能な /var/log/messageファイルを一般ユーザが参照したいというケースを考えてみます。 Cで仮に #include<stdio.h> int main(void){ return system("cat /var/log/messages"); } などと書いてコンパイルし"chklog"という名前で実行ファイルをrootユーザで作成します。 続いて"chmod 4511 chklog"にてrootユーザに対してSUID属性を付与します。 これを使えば、他の一般ユーザでもmessagesファイルを参照出来るのではと思ったのですが、実際に実行すると cat: /var/log/messages: 許可がありません と表示され、権限が無いことになってしまいます。 (rootユーザで実行したときは正常に動きました。) SUID属性を今まで実際に使った(自分で作成するという意味で)事がありませんので、ひょっとしたら根本的にSUIDの意味を勘違いしているのかもしれませんが、ご存じの方ご教示願えれば幸いです。 #ちなみに実行環境はFedoraCore3(カーネル2.6.12)となります。

  • UID.GIDについて

    「CentOS release 5.5」で、Apache/2.2.3 ProFTPD Version 1.3.2 でWEBサーバを作り、ユーザ管理は、別立てのldapサーバで行い動いています。 ユーザからsuexec機能が欲しいということで実装すると、cgiが動かないという問合せがきました。 調べるとldap 上のUID.GID(hoge.hoge=UIDとGIDが同じ)と、ファイルシステム上(フォルダ、ファイル)のUID.GID(hoge.users)が異なる為、suexecが policy violation:を起こしていました。 両方のUID.GID(hoge.users)を一致させ動くようになりましたが、構築者(業者)は、UID.GIDがldapとファイルシステム上と異なる事で問題になるのはsuexec機能だけなので大きな問題ではないと主張しています。 質問: 今後、メールサーバ(postfix)等もldapを使う予定ですが、ldapとファイルシステム上のUID.GIDが異なる事でどの様な問題が起こる可能性があるのでしょうか。 ldapとファイルシステム上のUID.GIDを一致させないのは普通(default)のやり方なのでしょうか。 通常、/etc/passwd,group,shadowでアカウントは管理されていますが、これらとファイルシステム上のUID.GID は一致しています。→当然ldapにした場合も同じにすべきと私は考えていますがこの考えは正しいのでしょうか。 よろしくお願いします。

  • OpenLDAP 補助クラスについて

    LDAPユーザーでsamba+メールをできるようにしたいと想い 以下のクラス7つを使用することにしました。 objectClass: top objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson objectClass: posixAccount objectClass: shadowAccount objectClass: sambaSamAccount ただ、今回これにsquidを利用できるようにしようと考えたのですが、 上のクラスの組み合わせではhost属性を定義することができません。 補助クラスでhost属性が利用できるものがあれば それを利用しhost属性を定義したいと考えているのですが、 何のクラスを定義すればいいのかがわかりません。 host属性を利用するには、何のクラスを利用したらいいのか ご存知の方がいらっしゃいましたらご教授のほうよろしくお願いできないでしょうか? また、Javaみたいにクラスを調べることができる(http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/index.html)このようなLDAPのページがあるのでしょうか? ご存知の方がいらっしゃいましたらご教授のほうよろしくお願いできないでしょうか?

  • LDAPのdnの指定方法について

    LDAPを始めて構築している者です。 ユーザ情報を管理するために、openLDAPをインストールしました。 インターネット上にa-company.co.jpというドメインを持っているとします。 dnの指定に、以下の例1ように"dc"属性を用いるのでしょうか。それとも、例2のように"c"属性を用いるのが一般てきなのでしょうか?  例1 dn: ou=people,dc=a-company,dc=co,dc=jp  例2 dn: ou=people,o=a-comapny,c=jp またユーザ情報の管理にinetOrgPersonというObjectClassを使用したいと考えています。 そのため、私自身は、例1を採用したいと思っています。 例1では何かデメリットはありますでしょか? もし例2が一般的な場合、"c"属性を利用するためには、 countryという別のOjectClassを継承する必要があるようです。 以下のように記述するとldapaddする際に異なった種類のオブジェクトを追加できませんというようなエラーが出てしまいます。  dn: uid=xx,ou=people,dc=a-company,dc=co,dc=jp  ClassObect: inetOrgPerson  ClassObect: country  uid: xx 例2が一般的な場合inetOrgPersonとcountry を併記するldifの記述方法はあるのでしょうか? もしあれば教えて頂けると幸いです。 LDAPの構築経験がある方、ぜひご教授お願いいたします。 よろしくお願い致します。

  • ldapaddコマンドでエラー

    OpenLDAPの設定をしているのですが、ldapaddコマンドで実行したら下記のエラーが表示されて、うまくいきません。色々、Googleで調べてやったのですが解決できなかったので、教えて頂けたら幸いです。 エラー解決で参考にしたURLhttp://arinux.jugem.jp/?eid=42 /usr/local/bin/ldapadd -f userlist.ldif -x -D "cn=Manager,dc=solaristest,dc=com " -W -h localhost Enter LDAP Password: adding new entry "cn=test,ou=People,dc=solaristest,dc=com" ldap_add: Invalid syntax (21) additional info: objectclass: value #1 invalid per syntax slapd.conf include /usr/local/etc/openldap/schema/core.schema include /usr/local/etc/openldap/schema/cosine.schema include /usr/local/etc/openldap/schema/inetorgperson.schema pidfile /usr/local/var/run/slapd.pid argsfile /usr/local/var/run/slapd.args # Load dynamic backend modules: modulepath /usr/local/libexec/openldap moduleload back_bdb.la database bdb suffix "dc=solaristest,dc=com" rootdn "cn=Manager,dc=solaristest,dc=com" rootpw {SSHA}XXXXXXXXXXXXXXXXXXXXX directory /usr/local/var/openldap-data index objectClass eq 基本データベース新規作成 base.ldif dn: dc=solaristest,dc=com objectClass: dcObject objectclass: organization dc: solaristest o: solaristest Corporation dn: cn=Manager, dc=solaristest,dc=com objectClass: organizationalRole cn:Manager dn: ou=People,dc=solaristest,dc=com objectClass: organizationalUnit ou: People dn: ou=Group,dc=solaristest,dc=com objectClass: organizationalUnit ou: Group /usr/local/bin/ldapadd -f base.ldif -x -D "cn=Manager,dc=solaristest,dc=com" -W -h localhost こちらは、エラーなく通っています。 既存ユーザ情報をLDAPサーバーへ登録 MigrationTools使用 migrate_common.phパラーメータの変更 $DEFAULT_MAIL_DOMAIN = "solaristest.com"; $DEFAULT_BASE = "dc=solaristest,dc=com" 一般ユーザ情報抽出 ./migrate_passwd.pl userlist > userlist.ldif userlist.ldif dn: cn=test,ou=People,dc=solaristest,dc=com uid: test cn: test objectclass: inetOrgPerson objectclass: posixAccount objectClass: top objectClass: shadowAccount userPassword:XXXXXXXXXXXXX shadowLastChange: 14575 loginShell: /bin/sh uidNumber: 100 gidNumber: 1 homeDirectory: /export/home/test 以上、よろしくお願いします。

  • WSHで「ファイルUID」を取得するには?

    エクスプローラの「列の設定」ダイアログに、ファイルUID という項目があります。ファイルを同一ドライブ内で移動してもこの値は変化しません。属性を変更しても変化せず、重複もないみたいなのでファイルのUnique ID なのだろうと思います。これをWSHから取得するにはどうすればいいのでしょうか? 目下、ファイル名を一旦テキストファイルに取り込んで編集してから戻すというやり方で、複数ファイル名を一括してリネームするスクリプトを書いています。ファイル名に依らずにファイルを識別するために、現在はプロパティの概要項目に、識別文字列を入力しています。この方法はNTFSでしか使えず、エクスプローラの動作も重くなります。 このファイル識別に「ファイルUID」が使えたら、と思うのですが。

  • ldapのコンフィグファイルslapd.conf

    debianが公式でパッケージを提供しているソフトウェアで、コンフィグファイルの拡張子が.confではないことはあり得ますか? debianの公式 http://packages.debian.org/squeeze/slapd からslapdのパッケージをダウンロードして、 debian 6.0.6 にインストールしました。 またldap-utilsもインストールしました。 http://packages.debian.org/squeeze/ldap-utils コンフィグファイルを # find / | grep slapd.conf で探すと、 /usr/share/slapd/slapd.conf に見つかったので、ここのファイルを編集しました。 もうひとつslapd.confは見つかりましたが、docディレクトリの中なので、それは違うと思います。 そして # slaptest とすると、 config file testing succeeded と文法チェックが通ります。 が、 # slaptest -f /usr/share/slapd/slapd.conf lt_dlopenext failed: (back_@BACKEND@) file not found slaptest: bad configuration file! となりました。 コンフィグファイルの書き方が間違っているというのは今は置いときましょう。 が、オプション無しで slaptest したときと結果が違うということは、 slaptestがデフォルトでチェックしているコンフィグファイルは別にあるということですよね? いったいどこにあるのでしょうか。 /etcディレクトリの中では見つかりませんでした。 # find / | grep slapd.conf /var/lib/dpkg/info/slapd.config /var/lib/dpkg/info/slapd.conffiles /usr/share/slapd/slapd.conf /usr/share/man/man5/slapd.conf.5.gz /usr/share/man/man5/slapd-config.5.gz /usr/share/doc/slapd/examples/slapd.conf 関係無いと思いますがこちらも # find / | grep ldap.conf /etc/ldap/ldap.conf /usr/share/man/man5/ldap.conf.5.gz # find /etc | grep openldap /etc/ldap/schema/openldap.schema /etc/ldap/schema/openldap.ldif /etc/bash_completion.d/openldap # find /usr | grep openldap /usr/share/doc/openldap /usr/share/doc/openldap/README.Debian /usr/share/doc/openldap/copyright /usr/share/doc/openldap/changelog.Debian.gz 【関連しているけど別の話】 slapd.confの中に、 @BACKEND@ こんなものがあります。 この@で囲まれた文字列はなんなのでしょうか? 変数のようなものに思えます。 どこで定義されているのでしょうか?

  • ldapaddについて

    ldapaddについて質問があります。 Solaris10の環境にOpenLDAPをインストールしているんですが、1台のマシンにOpenLDAPサーバとSolaris付属のLDAPクライアントして構成します。 ldapaddコマンドで、下記の実行した際に、止まった状態で正常に終了しません。 /usr/local/bin/ldapadd -f userlist.ldif -x -D "cn=Manager,dc=solaristest,dc=com" -W -h localhost Enter LDAP Password: Solaris付属のLDAPクライアントのサービスを停止した状態で行っていたことに気づきました。Solaris付属のLDAPクライアントサービスを上げてから 再度、上記のコマンドを実行すると、正常に終了します。 ldapaddコマンドを実行する際に、LDAPクライアントのサービスを起動していないといけないでしょうか? それとも、slapd.confの設定に問題があるんでしょうか? 勉強不足で申し訳ありませんが、教えていただけたら幸いです。 よろしくお願いします。 slapd.conf include /usr/local/etc/openldap/schema/core.schema include /usr/local/etc/openldap/schema/cosine.schema include /usr/local/etc/openldap/schema/inetorgperson.schema include /usr/local/etc/openldap/schema/nis.schema # Define global ACLs to disable default read access. # Do not enable referrals until AFTER you have a working directory # service AND an understanding of referrals. #referral ldap://root.openldap.org pidfile /usr/local/var/run/slapd.pid argsfile /usr/local/var/run/slapd.args # Load dynamic backend modules: modulepath /usr/local/libexec/openldap moduleload back_bdb.la # moduleload back_hdb.la # moduleload back_ldap.la # Sample security restrictions # Require integrity protection (prevent hijacking) # Require 112-bit (3DES or better) encryption for updates # Require 63-bit encryption for simple bind # security ssf=1 update_ssf=112 simple_bind=64 # Sample access control policy: # Root DSE: allow anyone to read it # Subschema (sub)entry DSE: allow anyone to read it # Other DSEs: # Allow self write access # Allow authenticated users read access # Allow anonymous users to authenticate # Directives needed to implement policy: # access to dn.base="" by * read # access to dn.base="cn=Subschema" by * read # access to * # by self write # by users read # by anonymous auth # # if no access controls are present, the default policy # allows anyone and everyone to read anything but restricts # updates to rootdn. (e.g., "access to * by * read") # # rootdn can always read and write EVERYTHING! ####################################################################### # BDB database definitions ####################################################################### database bdb suffix "dc=solaristest,dc=com" rootdn "cn=Manager,dc=solaristest,dc=com" # Cleartext passwords, especially for the rootdn, should # be avoid. See slappasswd(8) and slapd.conf(5) for details. # Use of strong authentication encouraged. rootpw {SSHA}wlLOtWPPXErPxwL04tNQj2jA3s/fnLEq # The database directory MUST exist prior to running slapd AND # should only be accessible by the slapd and slap tools. # Mode 700 recommended. directory /usr/local/var/openldap-data # Indices to maintain index objectClass eq

専門家に質問してみよう