vimとxdebugでPHPのデバッグをしよう!(その1)
ということで、予告した通り残しておくことにする。
あ、前提として、Webアプリケーションのデバッグってことにします。
最初は、開発環境。
まあ、当たり前だが、開発環境というくらいだから
占有Apacheが動いているLinux環境というくらいの準備はしておいてもらいたい。
とりあえずここでやるべきことは、
だ。
vimは、まず、featureの確認をすること。
$ vim --version
pythonとsignsが有効になっている必要がある。(RHELやCentOSはデフォ+みたい。)
もしなってないのであれば、よろしくどうぞ。
OKであれば、以下のサイトからデバッガを取得して、然るべきところにコピー。
$ cd ~/.vim <--ここに↑で取得&解凍したものから、pluginディレクトリをコピーする
次は、php。
まずは、xdebugをインストールしましょう。
peclでもOKだが、漢ならソースコンパイルだお。
XDEBUG EXTENSION FOR PHP | DOWNLOADS
自分の環境にあったversionを指定しよう。
DLして解凍したら、いつも通りのコンパイル~インストール。
$ phpize $ ./configure --enable-xdebug $ make $ su # make install
phpizeがなかったら、yumとかで用意してね。
[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が便利。
入れたらデバッグ対象のドメインを「ツール>拡張機能>(Xdebug helperの)オプション」からしておきましょう。
では、さっそくデバッグ。
デバッグ対象のサービスにアクセスすると、アドレスバーにこんなのが出るはず。
クリックすると、ONになって利用可能になる。
あとは、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
-- 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:ターミナルでログインなどの認証設定
2.389ポート。。。
これは、完全に筆者環境における罠なので、一般には、はまらないと思う。
今回のサーバとクライアントだが、実は「VMWare vSphere Hypervisor」上、つまり
ESXi上の仮想マシンで動いている。
で、その仮想スイッチをvmKernelのものと共用していた。
それぞれのホストは、vSphere Serverで一元管理できるのだが、それがLDAPを使ってるので
389番ポートがフィルタリングされてしまっていたのだ。
なので、クライアント側からサーバ側にpingが通ったとしても、389番ポートへの通信は
届かない、サーバが見つからないとなっていたのでした。。。
まあ、それもいろいろ調べて、なんとなくそこが怪しいと思ったので、
ホスト通信用とは別の仮想スイッチを作成し(そもそもハード的にはNICは2枚乗せてたので)
そちらで、仮想マシン間のネットワークは集約するようにしましたとさ。
というわけで、今日はこの辺で。
slapd.confからslap.dへ
さて、初期起動も確認できたということで、
次はデータのエントリができるように準備をすすめる。
前にも書いたけど、今回のLDAP利用の主目的が
- ユーザ認証の一元化
ということなので、それに沿うようにすすめる。
いろいろやることはあるようだけど、
- 初期状態のslapd.confからslap.d雛型を作成して、それを直接編集
- slapd.confに設定できることはやっておいて、そこからslapd.d雛型作成
- yumでインストールしたときの手順を踏襲
のどれかになる。
今回は3を採用。理由は特にない。なんとなく。
たぶん、ちゃんと最終的にこうしたい!っていうイメージさえあれば2でいけるはず。
1だと余計な設定までできてしまうので、微妙っちゃー微妙。
というわけで、早速。slapd.confは、シンプルに。
- etc/openldap/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オプションで
ファイルパスを指定すること。