そろそろLDAPにしてみないか?

第9回 LDAPとログ

この記事を読むのに必要な時間:およそ 9.5 分

エラーコード

いくつかのログからLDAP操作を見てきたわけですが,エラーコードが0でない場合,つまりldapsearchコマンドやldapaddコマンドが失敗した場合のトラブルシューティングはどのように行えば良いのでしょうか?

たとえば,親エントリがない場合にldapaddした際のログは,リスト10のようになります。

リスト10

Feb 17 10:03:42 localhost slapd[16607]: conn=5 fd=11 ACCEPT from IP=127.0.0.1:32806 (IP=0.0.0.0:389) 
Feb 17 10:03:42 localhost slapd[16607]: conn=5 op=0 BIND dn="cn=Manager,dc=example,dc=com" method=128 
Feb 17 10:03:42 localhost slapd[16607]: conn=5 op=0 BIND dn="cn=Manager,dc=example,dc=com" mech=SIMPLE ssf=0 
Feb 17 10:03:42 localhost slapd[16607]: conn=5 op=0 RESULT tag=97 err=0 text= 
Feb 17 10:03:42 localhost slapd[16607]: conn=5 op=1 ADD dn="ou=hoge,ou=fuga,ou=pubKey,dc=example,dc=com" 
Feb 17 10:03:42 localhost slapd[16607]: conn=5 op=1 RESULT tag=105 err=32 text= 
Feb 17 10:03:42 localhost slapd[16607]: conn=5 op=2 UNBIND 
Feb 17 10:03:42 localhost slapd[16607]: conn=5 fd=11 closed 

同様に,すでにDNが存在する場合にそれを上書きしようとするとリスト11のようなログになります。

リスト11

Feb 17 10:03:50 localhost slapd[16607]: conn=8 fd=11 ACCEPT from IP=127.0.0.1:32809 (IP=0.0.0.0:389) 
Feb 17 10:03:50 localhost slapd[16607]: conn=8 op=0 BIND dn="cn=Manager,dc=example,dc=com" method=128 
Feb 17 10:03:50 localhost slapd[16607]: conn=8 op=0 BIND dn="cn=Manager,dc=example,dc=com" mech=SIMPLE ssf=0 
Feb 17 10:03:50 localhost slapd[16607]: conn=8 op=0 RESULT tag=97 err=0 text= 
Feb 17 10:03:51 localhost slapd[16607]: conn=8 op=1 ADD dn="cn=hogeuser,ou=Group,dc=example,dc=com" 
Feb 17 10:03:51 localhost slapd[16607]: conn=8 op=1 RESULT tag=105 err=68 text= 
Feb 17 10:03:51 localhost slapd[16607]: conn=8 op=2 UNBIND 
Feb 17 10:03:51 localhost slapd[16607]: conn=8 fd=11 closed 

パスワードが間違っておりうまくバインドできなかった場合はリスト12のようなログです。

リスト12

Feb 17 10:07:52 localhost slapd[16607]: conn=9 fd=11 ACCEPT from IP=127.0.0.1:32810 (IP=0.0.0.0:389) 
Feb 17 10:07:52 localhost slapd[16607]: conn=9 op=0 BIND dn="cn=Manager,dc=example,dc=com" method=128 
Feb 17 10:07:52 localhost slapd[16607]: conn=9 op=0 RESULT tag=97 err=49 text= 
Feb 17 10:07:52 localhost slapd[16607]: conn=9 fd=11 closed 

これらの操作では,エラーコードがそれぞれ32,68,49と出力されているため,追加操作に失敗したことを意味しています。また,エラーコードについては/usr/include/ldap.hリスト13に定義されています。これらのコードは16進数で定義されています。10進数で表される32,68,31というコードは16進ではそれぞれ0x20,0x44,0x31であるため,原因は
LDAP_NO_SUCH_OBJECT,LDAP_ALREADY_EXISTS,
LDAP_INVALID_CREDENTIALS

であることがわかります。LDAPサーバを管理していると,エラーコード49や68はよく目にしますので,そのうち皆さんも自然と数字の意味を覚えられるようになると思います(笑⁠⁠。

リスト13 ldap.hで定義されているエラーコードの一部

/* 
 * LDAP Result Codes 
 */ 
#define LDAP_SUCCESS                            0x00 

#define LDAP_RANGE(n,x,y)       (((x) <= (n)) && ((n) <= (y))) 

#define LDAP_OPERATIONS_ERROR           0x01 
#define LDAP_PROTOCOL_ERROR                     0x02 
#define LDAP_TIMELIMIT_EXCEEDED         0x03 
#define LDAP_SIZELIMIT_EXCEEDED         0x04 
#define LDAP_COMPARE_FALSE                      0x05 
#define LDAP_COMPARE_TRUE                       0x06 
#define LDAP_AUTH_METHOD_NOT_SUPPORTED  0x07 
#define LDAP_STRONG_AUTH_NOT_SUPPORTED  LDAP_AUTH_METHOD_NOT_SUPPORTED 
#define LDAP_STRONG_AUTH_REQUIRED       0x08 
#define LDAP_PARTIAL_RESULTS            0x09    /* LDAPv2+ (not LDAPv3) */ 

#define LDAP_REFERRAL                           0x0a /* LDAPv3 */ 
#define LDAP_ADMINLIMIT_EXCEEDED        0x0b /* LDAPv3 */ 
#define LDAP_UNAVAILABLE_CRITICAL_EXTENSION     0x0c /* LDAPv3 */ 
#define LDAP_CONFIDENTIALITY_REQUIRED   0x0d /* LDAPv3 */ 
#define LDAP_SASL_BIND_IN_PROGRESS      0x0e /* LDAPv3 */ 

#define LDAP_ATTR_ERROR(n)      LDAP_RANGE((n),0x10,0x15) /* 16-21 */ 

#define LDAP_NO_SUCH_ATTRIBUTE          0x10 
#define LDAP_UNDEFINED_TYPE                     0x11 
#define LDAP_INAPPROPRIATE_MATCHING     0x12 
#define LDAP_CONSTRAINT_VIOLATION       0x13 
#define LDAP_TYPE_OR_VALUE_EXISTS       0x14 
#define LDAP_INVALID_SYNTAX                     0x15 

#define LDAP_NAME_ERROR(n)      LDAP_RANGE((n),0x20,0x24) /* 32-34,36 */ 

#define LDAP_NO_SUCH_OBJECT                     0x20 
#define LDAP_ALIAS_PROBLEM                      0x21 
#define LDAP_INVALID_DN_SYNTAX          0x22 
#define LDAP_IS_LEAF                            0x23 /* not LDAPv3 */ 
#define LDAP_ALIAS_DEREF_PROBLEM        0x24 

#define LDAP_SECURITY_ERROR(n)  LDAP_RANGE((n),0x2F,0x32) /* 47-50 */ 

#define LDAP_PROXY_AUTHZ_FAILURE        0x2F /* LDAPv3 proxy authorization */ 
#define LDAP_INAPPROPRIATE_AUTH         0x30 
#define LDAP_INVALID_CREDENTIALS        0x31 
#define LDAP_INSUFFICIENT_ACCESS        0x32 

#define LDAP_SERVICE_ERROR(n)   LDAP_RANGE((n),0x33,0x36) /* 51-54 */ 

#define LDAP_BUSY                                       0x33 
#define LDAP_UNAVAILABLE                        0x34 
#define LDAP_UNWILLING_TO_PERFORM       0x35 
#define LDAP_LOOP_DETECT                        0x36 

#define LDAP_UPDATE_ERROR(n)    LDAP_RANGE((n),0x40,0x47) /* 64-69,71 */ 

#define LDAP_NAMING_VIOLATION           0x40 
#define LDAP_OBJECT_CLASS_VIOLATION     0x41 
#define LDAP_NOT_ALLOWED_ON_NONLEAF     0x42 
#define LDAP_NOT_ALLOWED_ON_RDN         0x43 
#define LDAP_ALREADY_EXISTS                     0x44 
#define LDAP_NO_OBJECT_CLASS_MODS       0x45 
#define LDAP_RESULTS_TOO_LARGE          0x46 /* CLDAP */ 
#define LDAP_AFFECTS_MULTIPLE_DSAS      0x47 /* LDAPv3 */ 

#define LDAP_OTHER                              0x50 

まとめ

以上,非常に簡単でしたがOpenLDAPのログの読み方について簡単に紹介してきました。LDAPに限った話ではありませんが,困ったときにはすぐにログファイルをtail -fするような習慣を身につけたいものです。

著者プロフィール

中満英生(なかみつひでお)

大学時代に出会ったSolarisがきっかけでUNIXの世界へ。その後ホスティングプロバイダ,データセンターで実務経験を積む傍ら,雑誌記事の執筆や技術セミナーの講師を務める。サーバ設定の他,セキュリティに関する著作や技術者エッセイも執筆経験あり。