Willcom03 をリモートから操作 (ActiveSync + MyMobile)

Willcom03 のリモート接続環境

Willcom03 には標準で リモートデスクトップモバイル がインストールされていて
自宅の環境さえ整えれば 外出先から Willcom03を駆使して 自宅のWindowsを遠隔操作可能です

リモートデスクトップモバイル

ただし 逆に 「Windows端末から Willcom03端末を遠隔操作」 ができないことが分かります
これは ここで紹介する My Mobile というソフトウェアで解決できます

なぜ Willcom03 を遠隔操作したいのか

実は元々の目的は 「電話帳情報をパソコン側から更新したかった」
キーボード操作性のよい一般パソコンから Willcom03の アドレス帳(電話帳) を設定したいのです
  • \マイ デバイス\pim.vol というファイルがアドレス帳の格納データ
  • pim.vol は Outlook もしくは Microsoft Exchange から編集することができる ただしいずれも有償
  • Windowsに通常付属している Outlook Express では編集不可能(これはあくまで 電子メールクライアント!)
  • 今回の調査では pim.vol を直接編集するツールは見付からなかった
意外 無償ツールで Microsoft PIMデータにアクセスすることができないと判明
そこで迷った挙句 「逆転の発想で Willcom03 にリモート接続して直接登録しちゃえ」の方針となった
あくまでも「Willcom03を直接操作して アドレス帳に登録」は操作性の問題から避けたかったのです

検証構成

PDA端末 Willcom03 ActiveSync導入済
Windows端末 Mebius(PC-MV1-C1W) Windows2000 Professional
ActiveSync ActiveSync4.5 Windows2000側にインストール
My obile My Mobiler 1.2 Windows2000側にインストール

ActiveSyncとは

Windows Mobile または Windows CE を搭載した PDA端末 と Windows間で通信するための
接続方式 プロトコル ツール のセットのことで Microsoft から提供されています
  • イーサネット USB 赤外線 による通信手段をサポート 今回は USB接続で検証しました
  • Windowsへは USBドライバとしてインストールされ 接続端末のファイルシステムを操作可能
  • PIM(個人データ情報)や 特定ファイルを 端末〜Windows間で同期するツールが含まれる
  • PDA端末側には通常インストール済 Windows端末へは無償配布されるインストーラを適用
Microsoft独自路線の匂いがただよってますが
とりあえず無償配布されていてそこそこ使い易いので Willcom03 遠隔操作までの流れをレポートします

My Mobile導入までの手順

まず Windows側に ActiveSyncを導入します
マイクロソフトダウンロードから 最新の ActiveSyncを選択してインストールします

ActiveSyncインストーラ

画面はインストーラ起動直後のものです
インストールに特に悩むことはないでしょう
インストールが終わったら Willcom03 と Windowsを 付属 USBケーブルで接続しましょう

ActiveSync 同期設定

問題なければ Willcom03が認識されるはずです
初回の場合は同時に 同期設定のダイアログが開きます
連絡先 や 予定表 などの個別データを Windows(Outlook?) との連携対象に設定できます

ActiveSync 接続完了

私の環境では 何も同期しない設定にしましたが Outlook環境の方は設定さえいれておけば
「Windowsと Willcom03 を USBでつなげただけで充電される上に PIM情報も同期できるぜ」
のナイスな環境が整います

ActiveSync ファイルアクセス

また ActiveSyncで接続した瞬間に Windows側のエクスプローラに「モバイル デバイス」が現れて
Willcom03 のファイルシステムに直接アクセスできるようになります これは便利です

My Mobile アーカイブ展開直後

My Mobileのインストールに移ります
FreewarePPC.comより My Mobile の最新版を取得します zipファイルです
zipファイルは c:\Program Files\ にでも展開すればよいでしょう 中身は上の写真のようになります
MyMobiler.exe がプログラム本体になります 必要ならショートカットをスタートに登録しましょう

My Mobile 起動直後

タスクトレイに何やら常駐します ActiveSyncと連動するのでしょう
(実はこのタイミングで Willcom03側 \windows\remote.exe がインストールされています)
タスクトレイのアイコンをクリックするとメニューが出ます
Willcom03 を USB接続中状態のまま 「Open Mobiler」を選択すると

My Mobile リモート接続

見事に Windowsに Willcom03 の画面が現れました
remote.exe が リモートデスクトップサーバの役割を果たしてくれているのですね
これで マウス と キーボード で Willcom03が遠隔操作できるようになりました
もうちょっと検証を続ける予定です
結局住所録を入力するのは面倒くさい…

オンラインサインアップ

WILLCOM03での オンラインサインアップ + W+Info設定

IEを開くと 「オンラインサインアップしてくれ」とうるさいのでためしてみます
流れとしては以下のとおり
  • スタートメニューから オンラインサインアップ を選択
  • オンラインサインアップに同意
  • Eメールアカウント等の個人情報が確定 SIMカードに書き込み
  • Eメールの配信設定
  • プロフィールの設定
  • W-ZERO3メールの設定
  • W+Info設定

WILLCOM03で使えるメールの種類

紛らわしいことに 同じPHS端末なのに 3種類ものメールが存在します
WILLCOM03のメールの種類
ライトメール Eメール W-ZERO3メール
アドレス方法 PHS電話番号 〜〜@〜.pdx.ne.jp プロバイダから発行されたEメールアカウント
アドレス付与 電話番号による WILLCOMオンラインサインアップにより付与 個別にプロバイダと契約する必要あり
プロバイダ構成 なし(ダイレクトに端末同士を接続) WILLCOM提供の固定メールサーバ インターネット上に存在する任意のメールサーバ
通信方法 PHS音声通話 PHSデータ通信 PHSデータ通信
通信料金 WILLCOM定額なら定額 データ定額なら定額 データ定額なら定額
メールプロトコル WILLCOM独自? POP3(端末への自動ダウンロード可能)/SMTP POP3/SMTP
特徴 通話回線を使ってメッセージを送受信するサービス
電話番号がアドレス代わりなので
別に操作して取得する必要がない
他キャリアの類似サービス(auなら Cメール)と
プロトコル互換性がない(通信できない)
インターネットの Eメールの仕組みを利用
WILLCOM加入時にアドレスが割り当てられる
Eメールを使う他キャリア端末と通信可能
パソコンのEメールともやりとり可能
インターネットの Eメールの仕組みを利用
自力でメールプロバイダと契約する必要あり
Googleメール Yahooメールなどが該当
ライトメールは端末同士直接通信と書いたが実は どこかデータセンターを経由しているかもしれない
また ライトEメール というこれまた紛らわしいサービスが存在するが WILLCOM03 は対応していない模様
WILLCOM同士なら ライトメールが便利
それ以外は Eメールで事足ります WZERO3メールはオプション的な位置付け
今回は オンラインサインアップにより Eメールアカウントを WILLCOM03に設定します

オンラインサインアップ トップ

WILLCOM03購入直後 さっさとオンラインサインアップすればよいのに
もったいぶって 今頃試してみました

オンラインサインアップ 設定完了

設定情報といっても WILLCOM契約情報 から Eメールアカウント情報を引っ張ってくるだけ
確認の質問に 1回答えるだけでした

オンラインサインアップ 個人設定

W-SIMに Eメールアカウント情報を記録したあと
アカウント情報の確認と メール受信設定等ができます

オンラインサインアップ プロフィール

続いてプロフィール設定の画面です
キーボードを使って登録できるので 入力項目が多くても欝にはなりません
ここの設定は スタートメニューの「初期設定ツール」から再設定できます

オンラインサインアップ W-ZERO3 1

W-ZERO3メールの設定をするか聞かれます
ここの設定は スタートメニューの「プロバイダメール設定」から再設定できます

オンラインサインアップ W-ZERO3 2

ためしに 「はい」を押してみます
GMail や Yahoo!メール や OCN のアカウントについては専用の設定ツールああるようですが
Othersを選べばどのプロバイダメールでも設定できます

W+Info設定 確認画面

W+Infoの設定をするか聞かれます
これは Willcomから定期的(1日2回)にニューストピックや天気情報などの配信を受けるサービスです
便利で 情報料は無料なのですが 配信を受けるときにデータ通信料はとられます

W+Info設定 契約情報

承諾文書が表示されたあと 「登録」を押すことで W+Info設定完了します

W+Info設定 完了

とりあえず W+Infoの情報をとることにしました
データ定額ではないので Willcomからの請求が高額になった場合 再度考えます

W+Info設定 元にもどる

設定完了後 トップ画面に戻りました
W+Infoの配信を受けて ニュースが表示されています

最後に(というか最初に言うべき) 全体的に画像がみづらくてすみません
あ… 結局 IEの使い心地試してないや…

WILLCOM03 のブログトップページへ戻る

firefoxインストール

Build Documentation にて提供されている
  1. Windowsバイナリ
  2. UNIXバイナリ
  3. ソースコード
ですが ソースコードのコンパイルにチャレンジしてみます
手元の現時点(Firefox3)での環境
OS Linux 2.6.24 i686-linux-gnu
アセンブラ binutils-2.17
Cライブラリ glibc-2.5
コンパイラ gcc-4.1.2
GTK gtk-1.2.10 + gtk-2.10.0
GDK gdk-1.2.10 + gdk-2.10.8
Cairo cairo-1.4.2 描画ライブラリ –enable-glitz
Pango 1.6.0 描画ライブラリ
ウィンドウシステム xorg-server-X11R7.1-1.1.0
フォント fontconfig-2.4.2 libXft-X11R7.0-2.1.8.2 freetype-2.2.1
日本語入力 Uim-1.5.1 + Anthy-8300
前回(Firefox2)の環境
OS Linux 2.6.19.1 i686-linux-gnu
アセンブラ binutils-2.17
Cライブラリ glibc-2.5
コンパイラ gcc-4.1.1
GTK gtk-1.2.10 + gtk-2.10.0
GDK gdk-1.2.10 + gdk-2.10.8
Cairo cairo-1.2.6 描画ライブラリ –enable-glitz
Pango 1.15.4 描画ライブラリ
ウィンドウシステム xorg-server-X11R7.1-1.1.0
フォント fontconfig-2.4.2 libXft-X11R7.0-2.1.8.2 freetype-2.2.1
日本語入力 Uim-1.4.0 + Anthy-8300
FTPサイトでは 以下のようにサブプロジェクト毎に配置されてます

ftp://ftp.mozilla.org FTPサイト内容

firefox や thunderbird も含めてサブプロジェクトとしてツリーに含まれてます メールやWebブラウザも含めて mozillaプロジェクトとまとまっている感じです
サブプロジェクトの概要(知りうる限り)
firefox Webブラウザ
thunderbird メーラー
calender スケジューラ Sunbird と Lightning の 2種類があるようだ
seamonkey firefoxの機能拡張 コンテンツプレビューや IRCクライアントツール セキュリティ向上ツール Composer(HTMLエディッタ)
xulrunner Geckoエンジンのランタイムライブラリ libXUL これを使えば Gecko利用の独自ブラウザ/メーラーが作れそう

基本的な流れ

  1. サブプロジェクト/release/source/ソースコード.tar.bz2 をダウンロード
  2. ソースコードを展開 mozilla/ 配下に展開される
  3. .mozconfig をサブプロジェクトビルド用に設定
  4. ビルド開始 make -f client.mk build により .mozconfigが読み込まれ目的のサブプロジェクトがビルドされます
  5. インストール su ; make -f client.mk install

  • ソースコード入手の別手段としてCVSでダウンロードもできるようです
  • .mozconfig は先頭の .(ピリオド) を忘れないようにします
  • インストール時に DESTDIRでルートディレクトリを指定できます 例 DESTDIR=/opt make -f client.mk install とすれば /opt/usr/local/ 配下にインストールされます

という流れで firefox thunderbird などこれでいけます
.mozconfigはビルドしたいサブプロジェクトごとに(ビルドディレクトリを変えながら)書き換える必要があるのが面倒です

firefox

・firefox-3.0-source.tar.bz2 をダウンロードして展開します mozilla/ 以下にファイルが展開されます

$ cd
$ tar -xjf ~/firefox-3.0-source.tar.bz2
$ cd mozilla
$ vi .mozconfig
 

・ビルドには スタティックビルド(–disable-shared, –enable-static) を指定 (ただし 3.0では –enable-staticが弾かれた)
・描画バックエンドに cairoを利用するため ad_add_options –enable-default-toolkit=cairo-xlib を追加

. $topsrcdir/browser/config/mozconfig
mk_add_options MOZ_OBJDIR=/home/admin/mozilla_firefox
ac_add_options --enable-optimize
ac_add_options --disable-debug
ac_add_options --disable-shared
#ac_add_options --enable-static
ac_add_options --disable-tests
ad_add_options --enable-default-toolkit=cairo-xlib
mk_add_options MOZ_CO_PROJECT=browser
 

・ビルド&インストール

$ make -f client.mk build
$ su
# make -f client.mk install
 

・日本語環境をインストールします
・ロケール設定拡張を firefoxに適用する必要があります
switch-locales-*.xpi をダウンロードしてブラウザから開きます

・日本語パックを firefoxに適用する必要があります
firefox-*.ja.langpack-*.xpi をダウンロードしてブラウザから開きます

firefox

3.0を起動したとき 見慣れないエラーが

$ firefox
Error: in (function call): procedure or syntax required but got: Error: fatal: looped fatal error
 

これは UIMのバージョンが古いと発生するらしい
SCIMの利用か UIM-1.4.2以上 で解決します

xulrunner

・xulrunner-1.8.0.4-source.tar.bz2 をダウンロードして展開します mozilla/ 以下にファイルが展開されます

$ cd
$ tar -xjf ~/xulrunner-1.8.0.4-source.tar.bz2
$ cd mozilla
$ vi .mozconfig
 

・ビルドには ダイナミックリンク(–enable-shared, –disable-static) を指定
・Java環境も必要なので あらかじめインストールしておきます

. $topsrcdir/xulrunner/config/mozconfig
mk_add_options MOZ_OBJDIR=/home/自分のアカウント/mozilla_xulrunner
ac_add_options --enable-optimize
ac_add_options --disable-debug
ac_add_options --disable-static
ac_add_options --enable-shared
mk_add_options MOZ_CO_PROJECT=xulrunner
 

・ビルド&インストール

$ make -f client.mk build
$ su
# make -f client.mk install
 

・これどーやって使うのだろうか… 不要ならインストールしなくてもよさそう

seamonkey

・Java環境も必要なので あらかじめインストールしておきましょう
・seamonkey-1.1b.source.tar.bz2 をダウンロードして展開します mozilla/ 以下にファイルが展開されます

$ cd
$ tar -xjf ~/seamonkey-1.1b.source.tar.bz2
$ cd mozilla
$ vi .mozconfig
 

・ビルドには ダイナミックリンク(–enable-shared, –disable-static) を指定

mk_add_options MOZ_OBJDIR=/home/自分のアカウント/mozilla_seamonkey
ac_add_options --enable-optimize
ac_add_options --disable-debug
ac_add_options --enable-application=suite
mk_add_options MOZ_CO_PROJECT=suite
 

・ビルド&インストール

$ make -f client.mk build
$ su
# make -f client.mk install
 

・日本語化もできるようです 手元の環境では実施してませんが
・使い勝手は 付加機能(debugメニュー)の付いた firefox みたいな感じです

thunderbird

・thunderbird-2.0b2-source.tar.bz2 をダウンロードして展開します mozilla/ 以下にファイルが展開されます

$ cd
$ tar -xjf ~/thunderbird-2.0b2-source.tar.bz2
$ cd mozilla
$ vi .mozconfig
 

・ビルドは firefoxと同じく スタティックリンク方式にしました

. /home/deer/admin/mozilla/mail/config/mozconfig
mk_add_options MOZ_OBJDIR=/home/deer/admin/mozilla_thunderbird
ac_add_options --enable-optimize
ac_add_options --disable-debug
ac_add_options --disable-shared
ac_add_options --enable-static
mk_add_options MOZ_CO_PROJECT=mail
 

・ビルド&インストール

$ make -f client.mk build
$ su
# make -f client.mk install
 

・日本語環境をインストールします
・日本語パックを thunderbirdに適用する必要があります
thunderbird-*.ja.langpack-*.xpi をダウンロードしてブラウザから開きます

thunderbird拡張設定
・firefoxと異なり 言語設定拡張を入れなくても thunderbirdのメニュー設定から手動で設定できます
thunderbirdロケール設定

Linuxで時刻の設定

ここでは 「時刻が狂ってるんだけど」のトラブルシューティングを書きます

20090819 情報追加 (3) ntpdateの利用

(1)タイムゾーン設定 (UNIX共通)

毎回時刻が 約 9時間ずれている場合は大抵これです
以下のようになっていることを確認しましょう
$ echo $TZ
Japan
このタイムゾーンの機能は GLIBCによるもので 表示の問題です
時計の時刻が(UTCに合わせてあって)正確でも 実際の時刻は経度によります
TZ環境変数に何も入っていない場合 あなたの dateコマンドは イギリスの時刻を返します
# export TZ=Japan  (Linuxの場合)
# setenv TZ Japan  (BSD系の場合)
また rcスクリプトやログオンスクリプトを TZを正しく設定するようにカスタマイズしましょう


(2)hwclock設定 (Linux用)

それでも やはり時刻が狂う場合 (特にリブート毎に) hwclock の設定で回復するかもしれません
hwclockとは マザーボードが持っている ハードクロック(RTC) と システムクロック の同期を管理するツールです
  • システムクロックは 電源が落ちると消える RTCはマザーボード内の電池で動きつづける
  • Linuxなどのシステムは 通常は システムクロックのみを参照する
  • hwclockは Linuxブート時に ハードクロック→システムクロック に読み込む (hwclock –hctosys)
  • hwclockは Linuxシャットダウン時に ハードクロックに時刻を退避する (hwclock –systohc)
まず システムの ブートスクリプト シャットダウンスクリプト をチェックして
hwclock が正しく動作しているか確認します
(シェルスクリプトを読み解く能力が必要です)
私の環境は Gentooベースで init.dのサービスとして登録されていました
/etc/init.d/clock がこんな感じです
#!/sbin/runscript
# Copyright 1999-2004 Gentoo Technologies, Inc.
# Distributed under the terms of the GNU General Public License v2
# $Header: /home/cvsroot/gentoo-src/rc-scripts/init.d/clock,v 1.15 2004/04/21 17
:09:18 vapier Exp $

opts="${opts} save"

depend() {
        need localmount
}

start() {
        local myopts=""
        local TBLURB=""
        local errstr=""
        if [ ! -f /etc/adjtime ]
        then
                echo "0.0 0 0.0" > /etc/adjtime
        fi
        if [ "${CLOCK}" = "UTC" ]
        then
                myopts="--utc"
                TBLURB="[UTC]"
        else
                myopts="--localtime"
                TBLURB="[Local Time]"
        fi

        if [ -n "$(grep 'UML' /proc/cpuinfo)" ]
        then
                ebegin "Setting system clock to hardware clock ${TBLURB}"
                eend 0 "Detected UML Environment; ignoring"
                return 0

        elif [ -x /sbin/hwclock ]
        then
                ebegin "Setting system clock to hardware clock ${TBLURB}"
                errstr="$(/sbin/hwclock --adjust ${myopts} 2>&1 >/dev/null)"
                errstr="${errstr}$(/sbin/hwclock --hctosys ${myopts} 2>&1 >/dev/
null)"
                #hwclock do not return a fail status
                if [ -n "${errstr}" ]
                then
                        eend 1 "Failed to set system clock to hardware clock"
                        return 1
                else
                        eend 0
                        return 0
                fi
        else
                eend 1 "hwclock executable not found"
        fi
}
stop() {
        local myopts=""
        local TBLURB=""
        local errstr=""

        # Don't tweak hw clock on LiveCD halt
        [ -n "${CDBOOT}" ] && return 0
        
        if [ "${CLOCK}" = "UTC" ]
        then
                myopts="--utc"
                TBLURB="[UTC]"
        else
                myopts="--localtime"
                TBLURB="[Local Time]"
        fi

        if [ -n "$(grep 'UML' /proc/cpuinfo)" ]
        then
                ebegin "Syncing hardware clock to system clock ${TBLURB}"
                eend 0 "Detected UML Environment; ignoring"
                return 0
                
        elif [ -x /sbin/hwclock ]
        then
                ebegin "Syncing hardware clock to system clock ${TBLURB}"
                errstr="$(/sbin/hwclock --systohc ${myopts} 2>&1 >/dev/null)"
                if [ -n "${errstr}" ]
                then
                        eend 1 "Failed to set hardware clock to system clock"
                        return 1
                else
                        eend 0
                        return 0
                fi
        else
                eend 1 "hwclock executable not found"
        fi
}

save() {
        stop
}


# vim:ts=4
Gentooの環境設定ファイル /etc/rc.conf では CLOCK=”UTC” と設定されているので
上記スクリプトの意味するところは
「システムブート時に」 hwclock –adjust ; hwclock –hctosys –utc が実行される
「シャットダウン時に」 hwclock –systohc –utc が実行される
です
–utc と –localtime のオプションが設定できますが
特にこだわりなければ –utc のポリシーがよいでしょう
–adjust については後述します

[RTC] = [sys] → (表示)

RTC と システムクロック は常に UTC(標準時刻)と一致するポリシーとし
表示だけは $TZ による変換を受けます
以上をふまえた上で 一度正確な時刻を設定しましょう
# export TZ=Japan
# date -s '2008-5-18 20:03:00'
2008年  5月 18日 日曜日 20:03:00 JST
# hwclock --hctosys --utc

それでも リブートする度に時刻がずれている場合
hwclock のもつ RTC自動補正機能? が働いていることが考えられます
さきほどの –adjust がそれです
これは –systohc 時に RTC と システムクロック のドリフト(ずれ)情報を記録しておき
–adjust 実行時に RTCに補正をかけてしまいます
これは RTCが不正確で時刻が狂っていくような環境で特に有効です

ドリフト情報を扱う /etc/adjtime はこんな状態になっています
-5.747055 1211098626 0.000000
1211098626
LOCAL
1行目の 1項目が –adjust 時に修正適用する秒数です
これが やたら大きい数値になっている場合は ドリフト情報が壊れてしまったのでしょう
0.000000 でリセットしてあげてください

(3)もういい ntpdateを使う

偏見かもしれませんが Intel系よりは AMD系の CPUの方が時間がずれやすいような
(気のせい?)
1週間で 2分ほどずれていきます

で 毎週のように 117に電話しながら date -s コマンドで時刻を手動設定していましたが
「どこかの正確な時刻を参照して システムクロックを補正する」 仕組みは既にあります

NTP(Network Time Protocol)の仕組みを使います
NTPはネットワーク上 離れた別ホストに対して時刻を問い合わせて 自ホストの時刻を合わせますが
NTPサーバ側の構成も だいたい決まっています
NTPサーバの構成
原子時計や電波時計などソースとなる時刻情報に直結しているサーバがあります
これは stratum1(階層1) と言われる NTPサーバです
stratum1 に対して時刻を合わせている stratum2があります
このように NTPサーバは階層構造になっています

stratum1 に対して NTPをかけられればよいのですが
みんなが一斉に NTPをかけるとサーバへの負担となるので
インターネット上公開されている 最下層 stratumサーバを探すことになります

NTPは パブリックドメイン公開されています (The NTP Project)
ここからソース ntp-4.2.4p7.tar.gz を取得して以下のようにインストールしました

~ $ tar -xzf ntp-4.2.4p7.tar.gz
~ $ cd ntp-4.2.4p7
ntp-4.2.4p7 $ ./configure --prefix=/usr/local
checking for a BSD-compatible install... /bin/install -c
checking whether build environment is sane... yes
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking build system type... i686-pc-linux-gnu
…
checking for bin subdirectory... bin
configure: creating ./config.status
config.status: creating libopts/Makefile
config.status: creating Makefile
config.status: creating config.h
config.status: executing depfiles commands
ntp-4.2.4p7 $ make
Compiling with GCC now generates lots of new warnings.
 
Don't be concerned. They're just warnings.
 
Don't send bug reports about the warnings, either.
 
Feel free to send patches that fix these warnings, though.
 
(bk version) >/dev/null 2>&1 && \
    cd . && \
            x=`bk -R prs -hr+ -nd:I: ChangeSet` && \
…
make[2]: Entering directory `/home/admin/ntp-4.2.4p7'
make[2]: `all-am' に対して行うべき事はありません。
make[2]: Leaving directory `/home/admin/ntp-4.2.4p7'
make[1]: Leaving directory `/home/admin/ntp-4.2.4p7'
ntp-4.2.4p7 $ su
ntp-4.2.4p7 # make install
(bk version) >/dev/null 2>&1 && \
    cd . && \
            x=`bk -R prs -hr+ -nd:I: ChangeSet` && \
    y=`cat version 2>/dev/null` || true && \
    case "$x" in ''|$y) ;; *) echo $x > version ;; esac
make  install-recursive
make[1]: Entering directory `/home/admin/ntp-4.2.4p7'
…
make[3]: `install-data-am' に対して行うべき事はありません。
make[3]: Leaving directory `/home/admin/ntp-4.2.4p7'
make[2]: Leaving directory `/home/admin/ntp-4.2.4p7'
make[1]: Leaving directory `/home/admin/ntp-4.2.4p7'
ntp-4.2.4p7 #
/usr/local/bin/ 以下には
ntp-keygen ntpd ntpdc ntptime sntp ntp-wait ntpdate ntpq ntptrace tickadj
の各種 NTP関連ツールがインストールされます

単発コマンドの ntpdate を使います NTPサーバがどこかは インターネット検索して

# ntpdate ntp.ring.gr.jp
20 Aug 08:16:42 ntpdate[26111]: step time server 133.243.232.68 offset -32382.220923 secram #
#
お世話になっている Ringプロジェクトの NTPサーバをつかってみました
あれ でも 32000秒(9時間くらい)時刻がずれた
自マシンの環境が TZ=UTC になってるからですね…

ともかく 時刻合わせができるようになりました (でもやっぱり 手作業)

(4)それでも時刻のずれが気になる

考えられる原因は
  • NTPを使っていて 変な設定になってませんか NTPもドリフト情報を持っているので値を確認してみてください
  • マザーボードの電池(ボタン電池)が切れてませんか RTCが狂います
  • カーネルのバグで デュアルCPU時にシステムクロックが 2倍速になる楽しい現象がありました
カテゴリー: UNIX

LDAP認証統合 nss_ldap と pam_ldap を導入

実は UNIX系システムは 認証の仕組みを柔軟に切り替えられます

認証の仕組みというのは アカウントやパスワードを格納するバックエンドです
慣例として アカウントやパスワードの設定方法といえば
  • アカウント情報は /etc/passwd に格納されている
  • アカウント情報は vipw のコマンドで編集する
  • グループ情報は /etc/group に格納されている
  • グループ情報は vigr のコマンドで編集する
  • アカウントのパスワードは passwd コマンドにより修正する
通常は アカウントや グループなどの管理/運用は 名前解決(NS)と呼ばれ
/etc/ 以下のファイルで行われるのが通常です
名前解決は 実は nsswitch という libcの機構があり バックエンドを切り替えることができます

名前解決 nsswitchの構成

名前解決を行うのは getentコマンドなど libcの get〜()関数を利用するツールです
具体的には gethostbyname() getpwuid() getpwnam() getaddrinfo() などの列挙関数です
これらの関数は libnss_〜.soプラグインを切り替えて使えるように設計されています

例えば libnss_files.so は アカウント情報を /etc/passwd から取ってきます
例えば libnss_ldap.so は アカウント情報を LDAPから取ってきます
今回の目的は 通常使う filesのバックエンド以外にも LDAPのバックエンドを追加することで
telnetで LDAPアカウントのログインができることを目標にします

絵でいえば 赤い libnss_ldap.so と pam_ldap.so が追加になります
なぜ pam_ldap.so も追加する必要があるかというと telnetd や login といった
実際のアプリケーションが 認証に PAM(公式でないがここが詳しい)を利用しているためです
$ ldd `which login`
    linux-gate.so.1 =>  (0xb7fc0000)
    libpam_misc.so.0 => /usr/local/lib/libpam_misc.so.0 (0xb7fbc000)
    libpam.so.0 => /usr/local/lib/libpam.so.0 (0xb7fb0000)
    libdl.so.2 => /usr/glibc/2.5/i686/lib/libdl.so.2 (0xb7fab000)
    libc.so.6 => /lib/libc.so.6 (0xb7e7e000)
    libprelude.so.2 => /usr/local/lib/libprelude.so.2 (0xb7e0e000)
    libgnutls.so.13 => /usr/local/lib/libgnutls.so.13 (0xb7d7c000)
    libgcrypt.so.11 => /usr/local/lib/libgcrypt.so.11 (0xb7d2b000)
    libgpg-error.so.0 => /usr/local/lib/libgpg-error.so.0 (0xb7d27000)
    librt.so.1 => /usr/glibc/2.5/i686/lib/librt.so.1 (0xb7d11000)
    /lib/ld-linux.so.2 (0xb7fc1000)
    libpthread.so.0 => /usr/glibc/2.5/i686/lib/libpthread.so.0 (0xb7cfa000)
    libnsl.so.1 => /usr/glibc/2.5/i686/lib/libnsl.so.1 (0xb7ce4000)
    libz.so.1 => /usr/local/lib/libz.so.1 (0xb7cd0000)
で分かるように libpam.so が使われており PAMによる認証が行われていることが分かります
結局 今回の作業の流れとしては
  • LDAPの導入と アカウント情報の登録
  • libnss_ldap.so の導入
  • pam_ldap.so の導入
となります

LDAPの導入と アカウント情報の登録

LDAPとは ディレクトリサービスを提供するいわばデータベースです
Windowsでは Windows2000から ActiveDirectory という LDAPに準じた機能があり
その意味で UNIX Windows 統合バックエンドとしての可能性に脚光が集まりました
ここでは OpenLDAP の導入手順を紹介します
(OpenLDAPのソフトウェア構成)

  • slapd OpenLDAPの常駐サービスです
  • slurp LDAPのレプリケーション構築用常駐ツールです スレーブLDAPに同期情報を転送します
  • ldapsearch ldapadd ldapdelete ldapmodify クライアントツール データ操作を行います
  • slapd.conf slapdの設定ファイルです
  • ldap.conf /etc/ 以下に置かれるクライアント設定ファイル
  • 〜.schema データフォーマットを定義するスキーマファイル 用途に応じていくつかあります

OpenLDAP 自身のインストールについては省略します
パッケージからインストールするか ソースファイルをビルドしてインストールすることもできます

slapdの基本設定

slapd.confの設定です

# (1) スキーマインクルード
include         /usr/local/etc/openldap/schema/core.schema
include         /usr/local/etc/openldap/schema/cosine.schema
include         /usr/local/etc/openldap/schema/ppolicy.schema
include         /usr/local/etc/openldap/schema/nis.schema

# (2) ディレクトリ情報の基本設定
suffix          "dc=local"
rootdn          "cn=Manager,dc=local"
rootpw          testpass

# (3) バックエンドの基本設定
database        bdb
directory       /usr/local/var/openldap-data
pidfile         /var/run/slapd.pid
argsfile        /var/run/slapd.args

# (4) データへのアクセス権
access to attrs=userPassword
    by self write
    by dn="cn=Manager,dc=local" write
    by anonymous auth
    by * none

access to *
    by self write
    by dn="cn=Manager,dc=local" write
    by * read
 

(1)のインクルードファイルは OpenLDAPインストール時は core.schema のみですが
今回の アカウント管理用のスキーム定義 nis.schema を入れるための必要なスキーマを追加しています

(2)の設定においては
LDAPが 分散ディレクトリ管理(ネットワーク経由で 各LDAPサーバが管理情報を分散して管理)であること
に由来します つまりグローバルなネットワークにおける 自分自身の DN(ドメインみたいなもの) を決める必要があります
今回の LDAPの使いかたはグローバルにさらさない ローカル用途のみですので
DNを 「dc=local」 としました 気を使って「dc=ldaproot,dc=xxx-coopation,dc=co,dc=jp」みたいな
混み合った名称にする必要ありません

また rootdn とは LDAPの管理者アカウントです ここでは 「cn=Manager,dc=local」を設定しています
もっとセンスのよい名前でもよいでしょう

(3)はデータベースファイルの指定や プロセスのPID情報の書きだし先を指定します
特にインストール時の設定のままで修正する必要はありません

(4)はデータに対する 読み書きアクセス権限の設定です
今回導入する アカウント情報の管理において userPassword属性だけは参照もできないようにします
文法としては
「access to」 で データエントリ条件毎に設定します
「by アクセス元指定 write(読書可)|read(読のみ)|auth(認証)|none(アクセス不可)」
で アクセス元毎にアクセス可否を設定します
アクセス元には 以下のいずれかを指定します
「dn=”指定”」 (LDAPアカウント指定)
「self」 (アクセスアカウント)
「users」 (認証済)
「anonymous」 (認証前)
「*」 (その他)
「access to 〜 by 〜」は複数指定でき 最初に条件が一致したルールが適用されます

slapd.confの設定が終わったら ためしに slapdを起動してみます

$ su
# /usr/local/libexec/slapd
# ps ax | grep slapd
/usr/local/libexec/slapd
 

登録するデータは レコード単位で エントリと呼ばれます

  • エントリの IDキーにあたるものは DN(Distinguished Name)と呼ばれ ‘ou=People,dc=local’ のような名前を与えます
  • エントリは DNの名付けかたにより階層構造(親子の関係)をとることができます
  • エントリには dn以外に属性を与えることができます
  • 属性名や属性フォーマット は スキーマと呼ばれる定義ファイルで規定されます
  • エントリは (どのスキーマに属するかの)クラス情報を(複数)持てます objectClass と呼ばれる属性で設定します

エントリを 1つ追加してみます ldapaddコマンドを使います

$ ldapadd -D 'cn=Manager,dc=local' -w testpass
dn: dc=local
objectClass: dcObject
objectClass: organization
dc: local
o: local
description: LDAP Root Directory
(ここで 空行を入れる)
adding new entry "dc=local"
(ここで Ctrl+D を入れる)
$
 

ldapadd の オプションは以下の通りです ldapsearch ldapdelete ldapmodify でも共通です

-D ‘DN指定’ slapdにバインドするアカウントを指定します
-w パスワード 上記アカウントに対するパスワードです

登録したのは 「dc=local」つまりルートエントリです
ldapadd を実行すると 標準入力が開いて テキスト文章を直接入力することができます
複数行を入力していますが dn: が DN名 残りの行が属性設定となります
エントリに必要な情報を入力終えたら 空行 を1行入れることで 実際に LDAPへの登録が行われます

この後 続けて 別エントリのデータを入力することができます
このように 空白行がエントリ区切りとなるフォーマットを LDIF (LDAP Data Interchange Format) と言います

登録されたことを ldapsearchで確認します

$ ldapsearch
# extended LDIF
#
# LDAPv3
# base <> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# local
dn: dc=local
objectClass: dcObject
objectClass: organization
dc: local
o: local
description: LDAP Root Directory

# numResponses: 2
# numEntries: 1
 

slapd.confで設定したとおり データの参照は 管理者権限は必要ありませんが
結果コメント行に ちらっと情報があるように 「ldapsearch」は実は
「ldapsearch -s subtree -b ‘dc=local’ ‘(objectClass=*)’ ‘*’」 の省略形です
-s subtree は 検索スコープで 検索範囲を指定します 以下のようなものがあります
base (ベースエントリ検索)
one (1レベル検索)
subtree (サブツリー検索)
children (子エントリ検索)
-b ‘dc=local’ は 検索の起点となるベースDN を指定します 省略時 slapd.conf の suffixが入ったため dc=local となってます
次の ‘(objectClass=*)’ は 検索フィルタ条件の指定です
objcectClass属性は全てのエントリがなんらかの値を持つので つまり 全てのエントリが該当することになります
(dn を検索フィルタ条件に指定できないので objectClass属性となっているのかもしれません)
最後の ‘*’ は 検索に引っかかったエントリのどの属性情報を表示するかの指定です
dn以外のどの属性を表示するかを 空白区切りで指定できますが ‘*’で全項目を指定しています

ひととおりデータの 挿入 と 検索 ができることが確認できました
実際に アカウント管理を行うためのエントリを定義します nis.schema で定義される管理方法です

$ ldapadd -D 'cn=Manager,dc=local' -w testpass
dn: ou=Groups,dc=local
objectClass: organizationalUnit
ou: Groups

dn: ou=Users,dc=local
objectClass: organizationalUnit
ou: Users

dn: cn=ldapuser,ou=Groups,dc=local
objectClass: posixGroup
cn: ldapuser
gidNumber: 500

dn: uid=test,ou=Users,dc=local
uid: test
cn: test
objectClass: account
objectClass: posixAccount
userPassword: testpass2
uidNumber: 550
gidNumber: 500
homeDirectory: /home/test
loginShell: /usr/local/bin/bash
gecos: test account

(ここで Ctrl+D)

Groupsという グループ管理ディレクトリ と Usersという アカウント管理ディレクトリを作り
test というアカウント情報を登録しました
ldapsearch で 登録どおりの情報が返ることを確認できますが もう 1点 重要な確認事項があります
「userPassword」の属性が見えないことを確認してください
先の slapd.confで設定したとおり anonymous状態では参照できないようになっているはずです
(もちろん 「cn=Manager,dc=local」でバインドすれば見えます)

libnss_ldap.so の導入

LDAPへは testアカウントを登録しましたが
「getent passwd」のコマンドで testアカウントの情報はまだ見えません
nsswitch に nss_ldap の機能を追加する必要があります

ここ から libnss_ldap のパッケージを取得して

$ tar -xzf nss_ldap.tgz
$ cd nss_ldap-260
$ ./configure
〜
configure: creating ./config.status
config.status: creating Makefile
config.status: creating config.h
config.status: executing depfiles commands
$ make
make  all-am
make[1]: Entering directory `/home/admin/nss_ldap-260'
〜
$ su
# cp nss_ldap.so /usr/glibc/2.5/i686/lib/libnss_ldap.so.2
# ln -s libnss_ldap.so.2 /usr/glibc/2.5/i686/lib/libnss_ldap.so
 

libnss_ldap.so.2 は GLIBCの lib/ ディレクトリに入れます
手元の環境は /usr/glibc/2.5/i686 ですが大抵の人は /usr でしょう
最後に /etc/nsswitch.conf で libnss_ldap.so を使う設定を入れます

passwd:      files
shadow:      files
group:       files
 

のそれぞれのエントリに “nss_ldap”の設定を追加します

passwd:      files nss_ldap
shadow:      files nss_ldap
group:       files nss_ldap
 

次のように testアカウントの存在を確認します

$ getent passwd
〜
vpopmail:x:89:89::/var/vpopmail:/bin/false
alias:x:200:200::/var/qmail/alias:/bin/false
postfix:x:207:207:postfix:/var/spool/postfix:/bin/false
smmsp:x:209:209:smmsp:/var/spool/mqueue:/bin/false
portage:x:250:250:portage:/home/portage:/bin/false
nobody:x:65534:65534:nobody:/:/bin/false
test::550:500:test account:/home/test:/usr/local/bin/bash
 

testアカウントが見えていれば OKです

pam_ldap.so の導入

telnet ftp などパスワードを要求する 多くのプログラムは PAM の機構を導入してます
PAMに pam_ldap の機能を追加します

ここ から pam_ldap のパッケージを取得して

$ tar -xzf pam_ldap.tgz
$ cd pam_ldap-184
$ ./configure
〜
updating cache ./config.cache
creating ./config.status
creating Makefile
creating config.h
$ make
gcc -DHAVE_CONFIG_H   -DLDAP_REFERRALS -DLDAP_DEPRECATED -D_REENTRANT  -g -O2 -Wall -fPIC -c pam_ldap.c
〜
gcc  -g -O2 -Wall -fPIC   -o pam_ldap.so -shared -Wl,-Bdynamic -Wl,--version-script,./exports.linux pam_ldap.o md5.o  -lldap -llber -lnsl -lcrypt -lresolv -lpam -ldl
$ su
# cp pam_ldap.so /usr/local/lib/security/
# cp pam_ldap.5 /usr/local/man/man5/
 

本来 make install でインストールすべきところですが
ldap.conf を不意に上書きするおそれがあったので あえて手動インストールしています

PAMの /etc/pam.d/system-auth に ldapの設定を追加します

#%PAM-1.0

auth       required     pam_env.so
auth       sufficient   pam_unix.so likeauth nullok
auth       sufficient   pam_ldap.so use_first_pass
auth       required     pam_deny.so

account    sufficient   pam_unix.so
account    sufficient   pam_ldap.so
account    required     pam_deny.so

password   required     pam_cracklib.so retry=3
password   sufficient   pam_ldap.so try_first_pass echo_pass
password   sufficient   pam_unix.so nullok md5 shadow use_authtok
password   required     pam_deny.so

session    required     pam_limits.so
session    required     pam_unix.so
 

pam_ldap.so を使う 3行を追記します
これで testアカウントで認証ができるはずです

$ telnet localhost
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

Linux 2.6.24 (localhost) (pts/5)


turion.local login: test
Password:
 

これで 認証されれば OKです

OpenLDAPのアカウント管理は さらに Sambaの認証バックエンドとしても使えるらしいのですが
手元の環境では 動作確認まで至りませんでした
(「NT_STATUS_LOGON_FAILURE」と出て終了)