LDAPでActiveDirectoryに接続する。

LDAPからActiveDirectoryに接続する方法について、
興味本位から調べてみた。

たとえば、example.comというドメインツリーに
Administratorというユーザで接続する際、
通常のLDAPであれば、BaseDNを

CN=Administrator,DC=example,DC=com
と記載するが、ActiveDirectoryの場合、
Administrator@example.com
と記述するだけでアクセスできる。

詳細については、機会があれば改めて記述したいと思う。

初めてのS2JDBC

情報ばかり知っていても意味がない。JavaでWebアプリを作ってみようと
一念発起し、Seasar2(SAStruts+Mayaa+S2JDBC)を試しています。

Eclipse+Doltengでプロジェクトを作成したのですが、S2JDBCの導入部分で
ハマってしまったので対処メモ。ちなみにDBはMySQL5.1を利用してます。

Antで"Feature 'http://apache.org/xml/features/xinclude' is not recognized"

JDBCドライバや、jdbc.dicon/s2jdbc.diconの準備を終え、
いざ、Entityクラス・Serviceクラスを生成!!

 > cd [ProjectDir]
 > ant -f s2jdbc-gen-build.xml gen-entity gen-ddl
としたところ、
"Feature 'http://apache.org/xml/features/xinclude' is not recognized"
といわれて、ビルドがこける。

調べたところ、/src/main/resources/services/に
テキストファイル「javax.xml.parsers.SAXParserFactory」を作成し、一行。

 「com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl」

と記述することで解決。
参考:http://ml.seasar.org/archives/seasar-user/2008-October/016149.html

プロパティ(dialect)の設定に失敗しました。

Antもとおり、Entity/Serviceクラスも出来たので、とりあえず
ActionクラスからServiceを呼び出してみる。
Tomcatを立ち上げ、ブラウザからみると500エラー、、、
s2jdbc.diconも間違いないはずなのになぜ?

原因は、JDBCドライバの設置場所にありました。
プロジェクトにはlibディレクトリが、2箇所あり
Tomcatから利用するには、/src/main/webapp/WEB-INF/libに
設置する必要があるそうです。
参考:http://ml.seasar.org/archives/seasar-user/2007-June/008375.html

今月の読本

このところ、忙しくしていたせいで書きかけになってしまった
LDAPの話が気掛かりではありますが、、、
給料日を迎えると、ついつい書店へ足が向いてしまうのは悪い癖。

今月はこの本。

ガベージコレクションのアルゴリズムと実装

ガベージコレクションのアルゴリズムと実装


今しがた購入したばかりなので、内容はなんとも言えませんが、
GCとは何なのか。とても興味深いです。

LDAPについて綴ってみる(その1)

ようやく、OpenSolarisOpenLDAP連携が「とりあえず動く」状態に!!
とはいうものの、LDAPについて語るにはあまりにも知識不足。
LDAPという迷宮に迷い込んでしまったようです。

そこで、今回は「LDAP」とはなにか自分の知識をまとめるという意味で
綴ってみたいと思います。
※いろいろと勘違いがあるかと思いますので、ご指摘いただければ幸いです。

LDAPとは

LDAP(Lightweight Directory Access Protocol)とは、ディレクトリサービスに接続
するためのプロトコルのひとつです。
ディレクトリサービスというと、WindowsのActive DirecotryやSun Microsystems
Direcotry Serverなどが有名ですが、要はコンピュータネットワーク上のさまざまな
資源(ユーザアカウントやグループ、ホスト情報など)を一元管理するためのサービス
です。

RFC(LDAPv2) RFC1777 Lightweight Directory Access Protocol
OSI参照モデル プレゼンテーション層(第6層)
トランスポート TCP port289
LDAPに関するRFCの一覧はこちらをご覧ください。

取り扱うデータは?

LDAPを一言でいうならば、資源情報を管理するための「データベース」なのですが、
一般的なOracleMySQLPostgreSQLなどのRDBMSとはデータ構造が異なります。



LDAP RDBMS
用途 検索性能重視、頻繁な更新には向かない 検索だけでなく頻繁な更新も重視
データ構造 ツリー構造 表構造
スキーマ 既存のスキーマ(objectClass) 業務にあわせて個別に設計
操作 LDAP(ネットワークプロトコル) SQL(プログラマブル言語)
検索 木の枝葉をたどるイメージ 表の行を走査するイメージ
なお、検索方法で「木の枝葉をだどるイメージ」と記しましたが、ひとつひとつの
枝葉(Entry)は一意の情報でなくてはなりません。

スキーマ

さて、データ構造について説明しましたが、どのようにデータを保持するのでしょうか。
RDBMSでは、「CREATE TABLE」文を使用してスキーマ(表)を作成します。
LDAPでは、「Attribute」と「objectClass」によって取り扱う情報を定義します。

Attribute(アトリビュート)とは、取り扱うデータの属性が定義されます。RDBMSでいう
ところのフィールドに該当します。
objectClassは、このAttributeをまとめ制約条件を記載したオブジェクトとなります。
一般的にはAttributeとobjectClassはRFCにて定義されているものを使用します。
たとえ話ですが、以下の3つの入力項目をもつアドレス帳があったとるすと、、、

項目名 入力規制(型)
氏名 文字列
電話番号 数字、ハイフン、#、*
住所 文字列
備考 文字列
各、「項目名」と「入力規制(型)」を定義するのが、Attributeにあたります。 そして、アドレス帳に必要な情報(ここでは「氏名」「電話番号」「住所」「備考」)を
まとめるのがobjectClassになります。
そして、制約条件とは「氏名」は必須で、「電話番号」または「住所」を記載。「備考」は
任意でなどという情報の適正化を指定する機能となります。

クラウドマガジンvol.1を買ってみる

みてわかるクラウドマガジンvol.1 (日経BPパソコンベストムック)

みてわかるクラウドマガジンvol.1 (日経BPパソコンベストムック)


ぷらっと本屋に立ち寄った際、目に付いたので思わず購入。
Ubuntu+eucalyptusネタにつられてしまいました。

VMWareで試そうと思ったのですが、Ubuntuで構築する場合、
KVMを利用するので物理マシンが必要なんですね、、、

Xenであればいけるかな?

OpenLDAPをインストールする(トラブルシュート)

せっかくSolaris系OSを使用するわけなので、Solarisコンテナを使用したい。
コンテナついでに、PAMのLDAPモジュールを利用してユーザの一元管理をと
一意奮闘しております。

今回は、SUNWopenldapパッケージを使用したのですが、
妙なところでハマッたのでそのメモ。
※シューティングメモのため細かい内容は今回は割愛します

まずはパッケージをインストール

OpenSolarisは便利です。
pkgコマンドを利用すると、インストールされていないパッケージを
リモートのパッケージリポジトリからインストールできます。

# #パッケージを調べる。結果はSUNWopenldap
# pkg search openldap
# #SUNWopenldapの依存パッケージを調べる。
# pkg contents -m SUNWopenldap
# #依存パッケージのインストール状況を調べる
# pkg info SUNWcsl SUNWlibsasl SUNWlibnet SUNWicu SUNWopenssl SUNWopenldap
# #パッケージ管理されているのでとりあえず、依存パッケージ全部入れちゃえ
# pkg install -v SUNWcsl SUNWlibsasl SUNWlibnet SUNWicu SUNWopenssl SUNWopenldap
これで、インストール完了です。
設定ファイルが/etc/openldapに保存されますので、自己の環境にあわせ、
slapd.confを設定します。
なお、起動・停止スクリプトも一緒にインストールされるので、
以下の部分はそのままにしました。
pidfile         /var/run/openldap/slapd.pid
argsfile        /var/run/openldap/slapd.args

いざslapdを起動する

Solaris10から、SMF(Service Management Facility)というサービス
管理機能が追加されました。OpenSolarisも例外なくSMFがあります。
※SMFについてはいつか別の機会にふれたいと思います。

今回インストールした、SUNWopenldapパッケージもSMFにより
サービスの制御が可能です。

# svcs -a | grep ldap
disabled       21:45:28 svc:/network/ldap/client:default
disabled       21:45:54 svc:/network/ldap/server:openldap_24
# svcadm enable -t svc:/network/ldap/server:openldap_24
よし!! これで起動
# ps -ef | grep slapd
と思いきや、slapdのプロセスが、、、無い。
さて、原因追求。
svcsコマンドでサービスの起動状況を確認し、maintenace状態であることがわかった。
svcs -vx でSMFのメッセージを確認する。
# svcs -a | grep openldap_24
maintenance    22:50:45 svc:/network/ldap/server:openldap_24
# svcs -vx
svc:/network/ldap/server:openldap_24 (slapd - OpenLDAP LDAP server)
 State: maintenance since 2010年04月xx日 xx時xx分xx秒
Reason: Method failed repeatedly.
   See: http://sun.com/msg/SMF-8000-8Q
   See: man -M /usr/openldap/man -s 8 slapd
   See: http://www.openldap.org
   See: /var/svc/log/network-ldap-server:openldap_24.log
Impact: This service is not running.
とりあえず、logファイルを確認すると、
[  4月 xx xx:xx:xx Method "stop" exited with status 2. ]
[  4月 xx xx:xx:xx Executing stop method ("/usr/bin/kill `cat /var/run/openldap/slapd.pid`"). ]
cat: /var/run/openldap/slapd.pid: cannot open [No such file or directory]
pidファイルが無いとおっしゃっています。
/var/runのサブディレクトopenldapということでこいつが存在しないことが
原因だとわかり、
# mkdir /var/run/openldap
# chown openldap:openldap /var/run/openldap
# svcadm enable svc:/network/ldap/server:openldap_24
# svcs -a | grep openldap_24
online         21:45:54 svc:/network/ldap/server:openldap_24
これで無事起動!!

ほんとの原因は /var/run に

さて、これで設定完了と思いつつ、OS再起動。
ところが、再起動後プロセスを確認するとslapdは起動していなかった

ログファイルを確認すると、前回と同じくpidファイルが開けないと書いてある
また、/var/runを除いてみても、先に作成した/var/run/openldapが存在しない。
感に任せて dfをたたく、、、

# df -h
Filesystem            Size  Used Avail Use% Mounted on
rpool/ROOT/opensolaris
                       19G  3.0G   16G  17% /
swap                  923M  312K  923M   1% /etc/svc/volatile
/usr/lib/libc/libc_hwcap1.so.1
                       19G  3.0G   16G  17% /lib/libc.so.1
swap                  923M  4.0K  923M   1% /tmp
swap                  923M   40K  923M   1% /var/run
rpool/export           16G   21K   16G   1% /export
rpool/export/home      16G   21K   16G   1% /export/home
rpool/export/home/hoge
                       16G  8.8M   16G   1% /export/home/hoge
rpool                  16G   79K   16G   1% /rpool
いやな予感的中。
/var/runがswapデバイスにのっていた。 swapデバイスとはその名の通り、swap領域を利用しているため、
揮発性のある領域で、OSの再起動をすると消えてしまうのである。

トラブルシュート

/var/run/openldapディレクトリが、OS起動毎になくなってしまうことが
原因のため、起動スクリプトの修正を行う必要がある。

まずは、どんなスクリプトが呼び出されているか確認する必要があるため
SMFの制御ファイルであるマニフェストと呼ばれるXMLベースのファイルを確認する

# vi /var/svc/manifest/network/ldap/ldap-olslapd.xml
	:
	:
<exec_method
    type='method'
    name='start'
    exec='/usr/lib/slapd -u openldap -g openldap -f /etc/openldap/slapd.conf'
    timeout_seconds='60'>
    <method_context>
        <method_credential user='openldap' group='openldap'
            privileges='basic,net_privaddr' />
    </method_context>
</exec_method>

<exec_method
        type='method'
        name='stop'
        exec='/usr/bin/kill `cat /var/run/openldap/slapd.pid'
        timeout_seconds='60' />
	:
	:
	:
マニフェストの一部で、に起動・停止時の設定が書かれているのだが
上記の通り、起動・停止がハードコーディングされてる。

そこで、下記のような起動スクリプトを/etc/openldap/slapdrc.shとして作成しました
※あくまで暫定の起動スクリプトです。
#!/bin/sh
CONF_FILE='/etc/openldap/slapd.conf'
RUN_DIR='/var/run/openldap'
RUN_UID='openldap'
RUN_GID='openldap'

start() {
        if [ ! -d $RUN_DIR ]; then
                /usr/bin/mkdir -p $RUN_DIR
                /usr/bin/chown $RUN_UID:$RUN_GID $RUN_DIR
        fi

        /usr/lib/slapd -u $RUN_UID -g $RUN_GID -f $CONF_FILE
}

stop() {
        if [ -f $RUN_DIR/slapd.pid ]; then
                /usr/bin/kill `cat $RUN_DIR/slapd.pid`
        fi
}

case $1 in
start)
        start;;
stop)
        stop;;
esac

また、マニフェスト上で実行ユーザ・グループがopenldapになっているため、
        <method_credential user='openldap' group='openldap'
            privileges='basic,net_privaddr' />
セキュリティ上好ましくありませんが、下記のようにパーミッションを設定
# chmod +x slapdrc.sh
# chmod u+s slapdrc.sh

続いて、マニフェストを以下のように修正します。
<exec_method
    type='method'
    name='start'
    exec='/etc/openldap/slapdrc.sh start'
    timeout_seconds='60'>
    <method_context>
        <method_credential user='openldap' group='openldap'
            privileges='basic,net_privaddr' />
    </method_context>
</exec_method>

<exec_method
        type='method'
        name='stop'
        exec='/etc/openldap/slapdrc.sh stop'
        timeout_seconds='60' />
修正したマニフェストをsvccfgコマンドを利用して登録します
# svccfg import /var/svc/manifest/network/ldap/ldap-olslapd.xml

以上で、OS再起動後もslapdが立ち上がるようになります。
もっとも、作成したスクリプトは暫定的なものですので、
セキュリティを考慮して作り直す必要がありますが、それはまた別の機会に

OpenSolarisをインストールする

Solaris10のライセンス形態変更により、OpenSolarisへ乗換えを開始しました
せっかく、新規でインストールを行うのでインストール手順をメモ

OpenSolarisを入手する

OpenSolarisをダウンロードします。
http://www.opensolaris.com/get/index.jsp?lang=ja
2010/4/3日時点での最新は「OpenSolaris 2009.06」です。
今回、x86/x64 LiveCDイメージを利用しました。

インストール環境の準備

今回は試験環境ということもあり、ローカルVMWare Server1.0.10に環境を構築しました。

Select a Guest Operating Syste Sun Solaris Solaris 10 64-bit
Processors One
Memory 1024MB
Network Type NAT
Disk Type SCSI(Recommended)
Disk Capacity 20GB

とりあえず今回は何も考えずISO Imageからbootしました。
インストール時のスクリーンキャプチャとも思ったのですが、
結構画面数があるので、入力項目のみ記載します。
1.LiveCDの起動
GRUBメニュー OpenSolaris 2009.06
USB KeyBoard 20. Japanese
Keyboard Layout 14. Japanese

2.インストーラ
正常に起動すると、GNOMEディスクトップ画面が表示されます
ディスクトップ上に「OpenSolarisをインストールする」というアイコンがあるので起動します。

インストーラはウィザード形式になっており次の7項目で構成されています。
ようこそ
ディスク○ディスク全体を使用する
 ●ディスクをパーティション分割する
   スライス1Solaris(20GB)
   スライス2未使用(-)
   スライス3未使用(-)
   スライス4未使用(-)
タイムゾーン地域アジア
 場所日本
 タイムゾーン日本
 日付デフォルト
 時刻デフォルト
ロケール言語日本語
 地域日本語
ユーザrootパスワード(任意)
 ユーザアカウント(任意)
 ユーザ名(任意)
 ログイン名(任意)
 ユーザパスワード(任意)
 コンピュータ名(任意)
インストール
完了

以上で、デフォルトインストールが完了です。