脳みそこねこね

備忘録とやったことをつらつらと書く

vimとxdebugでPHPのデバッグをしよう!(その1)

ということで、予告した通り残しておくことにする。

あ、前提として、Webアプリケーションのデバッグってことにします。

 

最初は、開発環境。

まあ、当たり前だが、開発環境というくらいだから

占有Apacheが動いているLinux環境というくらいの準備はしておいてもらいたい。

 

とりあえずここでやるべきことは、

だ。

 

vimは、まず、featureの確認をすること。

$ vim --version

pythonとsignsが有効になっている必要がある。(RHELCentOSはデフォ+みたい。)

もしなってないのであれば、よろしくどうぞ。

OKであれば、以下のサイトからデバッガを取得して、然るべきところにコピー。

DBGp client

$ cd ~/.vim    <--ここに↑で取得&解凍したものから、pluginディレクトリをコピーする

 

次は、php

まずは、xdebugをインストールしましょう。

peclでもOKだが、漢ならソースコンパイルだお。

XDEBUG EXTENSION FOR PHP | DOWNLOADS

自分の環境にあったversionを指定しよう。

DLして解凍したら、いつも通りのコンパイル~インストール。

$ phpize
$ ./configure --enable-xdebug
$ make
$ su
# make install

phpizeがなかったら、yumとかで用意してね。

あとは、php.iniを編集して、Apacheの再起動。

  • php.ini(各自のポリシーに合わせてくだされ。conf.d/xdebug.iniとかでも可。)
[Zend]
zend.extension = /path/to/xdebug.so
xdebug.remote_enable = 1
xdebug.remote_port = 9000
xdebug.remote_host = localhost
xdebug.profiler_enable = 1
xdebug.profiler_output_dir = /path/to/dir

 

次はクライアント側。

Chromeのextensionが便利。

Chrome : Xdebug helper

入れたらデバッグ対象のドメインを「ツール>拡張機能>(Xdebug helperの)オプション」からしておきましょう。

 

では、さっそくデバッグ

デバッグ対象のサービスにアクセスすると、アドレスバーにこんなのが出るはず。

f:id:rusty0929:20120420110554p:plain

クリックすると、ONになって利用可能になる。

f:id:rusty0929:20120420110601p:plain

 

あとは、vim起動して、F5してから、chromeデバッグしたいURLにアクセス。

ちなみにデフォルトは5秒以内。

 

ここからの使い方はまた次回。

syslogの設定

OpenLDAPのsyslogは、デフォルトではファイル出力されない。

ストリームとしては、local4に出力しているらしい。

この設定もslapdの起動オプションで指定可能。(-lオプション)

 

ということで、syslog設定とlogrotate設定をせねばなりますまい。

  • /etc/rsyslog.conf
-- 59行目あたり。LOCAL7のboot.logの設定があると思うのでそのあたり。
LOCAL4.*   /var/log/ldap.log
  • /etc/logrotate.d/syslog
-- 定義に/var/log/ldap.logを追加する

設定できたら、syslogサービスを再起動

# /etc/init.d/rsyslog restart

これで、LDAPログが出力されるようになる。

んじゃ、また。

クライアント側の設定

やったぜ!!!

苦節2週間くらいかかったが、やっとLDAP認証でクライアント側にログインできたぜ!!

 

ぜんぜん本質ではないところではまっていたので、それは今回の最後のほうで

ちょっとだけ触れることにしよう。

 

さて、クライアント側の設定であるが、こちらはyumで導入することにする。

# yum -y install openldap-clients nss-pam-ldapd

 あとは、各種設定ファイルとかを環境に合わせていく。

-- 最終行に追記
URI ldap://192.168.0.1/ ←環境に合わせる
BASE dc=sample,dc=com  ←環境に合わせる
TLS_CACERTDIR /etc/openldap/cacerts
  • /etc/nslcd.conf
-- 最終行あたりに修正&追記
uri ldap://192.168.0.1/ ←環境に合わせる
base dc=sample,dc=com  ←環境に合わせる
ssl no
tls_cacertdir /etc/openldap/cacerts
  • /etc/pam_ldap.conf
-- 17行目をコメント
# host 127.0.0.1
-- 21行目
base dc=sample,dc=com  ←環境に合わせる
-- 最終行に追記
uri ldap://192.168.0.1/ ←環境に合わせる
ssl no
tls_cacertdir /etc/openldap/cacerts
pam_password md5
  • /etc/pam.d/system-auth
  • /etc/pam.d/password-auth
同じ設定を2ファイルにすること!
-- authのpam_deny.soの設定の前の行に挿入
auth      sufficient   pam_ldap.so use_first_pass
-- accountのpam_permit.soの設定の前の行に挿入
account   [default=bad success=ok user_unknown=ignore] pam_ldap.so
-- passwordのpam_deny.soの設定の前の行に挿入
password  sufficient   pam_ldap.so use_authtok
-- sessionのpam_unix.soの後に追記
session   optional     pam_ldap.so
session   optional     pam_mkhomedir.so skel=/etc/skel umask=077
  • /etc/nsswitch.conf
-- 33行目あたりから修正
passwd:    files ldap
shadow:    files ldap
group:     files ldap
-- 57行目あたり
netgroup:  ldap
-- 61行目あたり
automount: files ldap
  • /etc/sysconfig/authconfig
-- 18行目を修正
USELDAP=yes

nslcdサービスをサーバ起動時に開始されるようにして、再起動

# chkconfig nslcd on
# shutdown -r now

これで、LDAP側に登録されているユーザとパスワードで認証が通るはずだ。

 

さて、今回はまったのは、次の2点。

1.参考にしたサイトでは、password-authファイルの修正手順がなかった

今回、修正したうち、/etc/pam.dディレクトリ配下のファイルが2つある。

  • system-auth:コンソールでログインまたはsuコマンドなどの認証設定
  • password-auth:ターミナルでログインなどの認証設定
最初、system-authしか修正しなかったものだから、ターミナルでログインが失敗する。
そんなときは、クライアントサーバ(sshログインサーバ)の/var/log/secureのログを眺める。
pam_ldap.soが使われていないようだったので、気づけた。

 

2.389ポート。。。

これは、完全に筆者環境における罠なので、一般には、はまらないと思う。

今回のサーバとクライアントだが、実は「VMWare vSphere Hypervisor」上、つまり

ESXi上の仮想マシンで動いている。

で、その仮想スイッチをvmKernelのものと共用していた。

それぞれのホストは、vSphere Serverで一元管理できるのだが、それがLDAPを使ってるので

389番ポートがフィルタリングされてしまっていたのだ。

なので、クライアント側からサーバ側にpingが通ったとしても、389番ポートへの通信は

届かない、サーバが見つからないとなっていたのでした。。。

 

まあ、それもいろいろ調べて、なんとなくそこが怪しいと思ったので、

ホスト通信用とは別の仮想スイッチを作成し(そもそもハード的にはNICは2枚乗せてたので)

そちらで、仮想マシン間のネットワークは集約するようにしましたとさ。

 

というわけで、今日はこの辺で。

slapd.confからslap.dへ

さて、初期起動も確認できたということで、

次はデータのエントリができるように準備をすすめる。 

前にも書いたけど、今回のLDAP利用の主目的が

  • ユーザ認証の一元化

ということなので、それに沿うようにすすめる。

 

いろいろやることはあるようだけど、

  1. 初期状態のslapd.confからslap.d雛型を作成して、それを直接編集
  2. slapd.confに設定できることはやっておいて、そこからslapd.d雛型作成
  3. yumでインストールしたときの手順を踏襲

のどれかになる。

今回は3を採用。理由は特にない。なんとなく。

たぶん、ちゃんと最終的にこうしたい!っていうイメージさえあれば2でいけるはず。

1だと余計な設定までできてしまうので、微妙っちゃー微妙。

 

というわけで、早速。slapd.confは、シンプルに。

pidfile         /opt/local/openldap-2.4.29/var/run/slapd.pid
argsfile        /opt/local/openldap-2.4.29/var/run/slapd.args

 雛型作成は、以下の手順を踏むことでslap.confを基にslap.d配下にファイルが作成される。

# mkdir etc/openldap/slapd.d
# ./sbin/slaptest -f etc/openldap/slapd.conf -F etc/openldap/slapd.d/

起動前に設定部分を直接編集。

  • etc/openldap/slapd.d/cn=config/olcDatabase\={0}config.ldif
-- 4行目
olcAccess: {0}to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth manage by * break

次のファイルを新規作成

  • 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

起動スクリプトを作成し、 起動。

# chown ldap. -R etc/openldap/slapd.d
# chmod 700 -R etc/openldap/slapd.d
# /etc/init.d/slapd start

起動したら、初期設定を行う。

まずは、スキーマの読込

# ./bin/ldapadd -Y EXTERNAL -H ldapi:/// -f etc/openldap/scheme/core.ldif
# ./bin/ldapadd -Y EXTERNAL -H ldapi:/// -f etc/openldap/scheme/cosine.ldif
# ./bin/ldapadd -Y EXTERNAL -H ldapi:/// -f etc/openldap/scheme/nis.ldif
# ./bin/ldapadd -Y EXTERNAL -H ldapi:/// -f etc/openldap/scheme/inetorgperson.ldif

次にバックエンドの設定。

rootのパスワードの設定をするので作成しておく。

# ./sbin/slappasswd
New password:
Re-enter new password:
{SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxx

フロントエンドおよびバックエンドの設定ファイルは、本当はslapd.confにされているのだが

今回、最低限のslapd.confで初期作成をしているので、自分でやる。

dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulepath: /opt/local/openldap-2.4.29/libexec/openldap  ←自分の環境に合わせる
olcModuleload: back_hdb

dn: olcDatabase=hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {2}hdb
olcSuffix: dc=sample,dc=com                  ←自分の環境に合わせる
olcDbDirectory: /opt/local/openldap-2.4.29/var/openldap-data ←自分の環境に合わせる
olcRootDN: cn=admin,dc=psyence,dc=biz             ←自分の環境に合わせる
olcRootPW: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx       ←さっき作成したパスワード
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=sample,dc=com" 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=sample,dc=com" write by * read   ←自分の環境に合わせる

用意ができたら、読込。

# ./bin/ldapadd -Y EXTERNAL -H ldapi:/// -f etc/openldap/schema/backend.ldif
dn: dc=sample,dc=com         ←自分の環境に合わせる
objectClass: top
objectClass: dcObject
objectclass: organization
o: Sample               ←自分の環境に合わせる
dc: Sample              ←自分の環境に合わせる

dn: cn=admin,dc=sample,dc=com     ←自分の環境に合わせる
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
userPassword: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx   ←さっき作成したパスワード

dn: ou=people,dc=sample,dc=com    ←自分の環境に合わせる
objectClass: organizationalUnit
ou: people

dn: ou=groups,dc=sample,dc=com    ←自分の環境に合わせる
objectClass: organizationalUnit
ou: groups

用意ができたら、読込。

# ./bin/ldapadd -x -D cn=admin,dc=sample,dc=com -W -f etc/openldap/schema/frontend.ldif  ←自分の環境に合わせる
Enter LDAP Password:                                    ←さっき作成したパスワード

ちゃんと登録されているか、確認してみる

# ./bin/ldapsearch -x -b dc=sample,dc=com -LLL  ←自分の環境に合わせる

ちゃんと登録されていれば、frontend.ldifの内容が表示されるはずだ。

あとは、実際に認証に使用するユーザ情報とグループ情報を追加していくわけだが、

今日はちょっと疲れたので、また今度。

起動スクリプト

ソースからインストールすると、起動スクリプトが存在しない。

サンプルもない。困った。

 

ということで自作。

  • /etc/init.d/slapd
#!/bin/sh
# OpenLDAP Script
#
# chkconfig: 2345 20 50
. /etc/init.d/functions

prog=OpenLDAP

FACILITY=LOCAL4
#HOST="ldap:///"
HOSTS="ldap:/// ldapi:///"
CONFIGDIR=/opt/local/openldap/etc/openldap/slapd.d
SLAPD=/opt/local/openldap/libexec/slapd
USER=ldap

output_start_log() {
    if [ $RESULT -eq 0 ]; then
        echo -n $"Starting ${prog}: " && success
        echo ""
        touch /var/lock/subsys/ldap
    else
        echo -n $"Starting ${prog}: " && failure
        echo ""
    fi
}
output_stop_log() {
    if [ $RESULT -eq 0 ]; then
        echo -n $"Stopping ${prog}: " && success
        echo ""
        rm /var/lock/subsys/ldap
    else
        echo -n $"Stopping ${prog}: " && failure
        echo ""
    fi
}
start() {
    if [ -z "${HOSTS}" ]; then
        ${SLAPD} -h ${HOST} -l ${FACILITY} -F ${CONFIGDIR} -u ${USER} > /dev/null 2>&1
        RESULT=$?
        output_start_log
    else
        ${SLAPD} -h "${HOSTS}" -l ${FACILITY} -F ${CONFIGDIR} -u ${USER} > /dev/null 2>&1
        RESULT=$?
        output_start_log
    fi
}
stop() {
    killall slapd > /dev/null 2>&1
    RESULT=$?
    output_stop_log
}

case "$1" in
    start)
        start;;
    stop)
        stop;;
    restart)
        stop
        sleep 1
        start ;;
    *)
        echo $"Usage: $0 {start|stop|restart}";;
esac

動作確認して終了

# chmod 755 /etc/init.d/slapd
# /etc/init.d/slapd start
# chkconfig --add slapd
# chkconfig slapd on

ちなみにこのスクリプトは、LDAP設定をslapd.dディレクトリで行う場合のもの。

slapd.confで行う場合は、slapdの-Fオプションではなく-fオプションで

ファイルパスを指定すること。