2009/10/31

Windows7はスルー

日経なんかでも散々Windows7の特集組んだりしてましたが、Inspiron 640mに入っているVista BuisinessをWindows7に移行しない事にしました。

Intelの945GMチップセットを積んでいるので64bit版にしても認識できるメモリ量が増える分けではない、そもそも使いたいアプリ&機能がない、というのが主な理由です。

しかし一番大きな理由は限定出荷されているアップデート版を買うよりも、DSP版の方が安いというところでしょう。もちろんカスタムインストールになるから移行が大変ですけどね。64bit版にするなら同じことですし。

Windows7はRC版を使ってみて、まぁ見た目に違うのとUAC周りで挙動の違いはあるのですが、バックアップ機能とか、壊れたNTFSのチェックディスク機能とか、Vistaと価格差を埋め合わせるほどのメリットはないと感じています。

XPを使っていてハードウェアの性能が十分なら、Windows7にするのはおすすめなんですけどね。 しかしXPのバックアップ周りとかNTFSのチェックディスクの機能なんかは貧弱ですが、 日常的に使う分には何も不具合ないのが困りどころだとは思います。

まぁ新しいもの好きにしても、OS自体はすぐに飽きそうな気がします。 それよりもXPやVistaでIronPythonやPowerShellで遊んでいた方が楽しいかなぁ。

仕事でクライアント環境を管理するようになればVMWare用にパッケージ版を買うかもしれないですけどね。

2009/10/29

LPIC Level3 301 Coreの試験を終えて

無事に試験を終えましたが、途中退室したり体調を崩してしまいました。 試験と名のつくものは苦手ですが、今回もみごとにやられました。 まだ胃の辺りがピクピクしています。

さて、結果はギリギリ合格でしたが、試験前の同意書には試験の具体的な内容について議論しない旨の一筆があり、試験問題について直接的なこと、どんな問題がでた、とかは言えない事になっています。

試験の印象

今回はEnglishのボタンを押す回数は少なくて、2,3回ぐらいでした。 理解できなくはないけれど、直訳っぽくて念のために見たというぐらい。
あとは問題文の意図を理解したり選択肢を選ぶために、実践経験の有無が明暗を分けると思います。

試験についてはこれぐらい。 実戦経験の豊富な人はうかるし、問題集の解説を暗記したような人はうからない。そんな試験でした。

ギリギリだったから偉そうな事はなにも言えない。 いったい自分は受かるべくして受かったのだろうか、いやそうじゃないよなぁ…。

ガイアの夜明け「百貨店・スーパーの大転換」をみて

最近はデパートの業態でも格安商品を充実させているという特集をしていました。

たぶん、その中でのデパートの企画担当者が言っていた「消費者には"ショッピングセンター"、"駅ビル"などが探索ルートに入っているが"デパート"は、そうではない。」という旨のコメントが現状を端的に表現しているのだと思います。

消費者は価格だけでモノを選ぶのか

デパートは高級品、安心感というイメージを売りにしてきたけれど、いまは値段が安くても実際に触れてみて問題がなければ買うという状況なのは間違いないでしょう。

だから、デパートも低価格品を提供しなければいけない、という事なのだと思います。

消費者はモノの価値に敏感になっているから、適正な価格は間違いなく必要です。 けれど、「適正な価格」にはデパートに本来あったイメージも含まれているはずで、消費者が価格にだけ反応するという前提が成り立たないと、現状を説明する事はできないと感じました。

Publish/subscribe型で消費者の行動を考えてみる

「なんでかな~」とか考えつつ、ふと消費者がいま受けとるメッセージに注目してみようと思いました。

消費者は勝手に行動するのでメディエーションの余地はないから、イベント駆動型でも良かったのかな。まぁメッセージ配送の経路はメディアだったり口コミだったりするわけで整備されていないという意味では、メッセージ指向な捉え方が正解なのかなぁ。

「低価格」というメッセージを受け取った消費者はポジティブなアクションを起します。 そしてデパートが消費者のポジティブなアクションに繋がるメッセージを発信しているかというと、たぶんない。きっとない。

で、無理に送った「低価格」のメッセージが消費者の意図しないアクションを引き起して、現場が混乱しているようにみえます。

デパートのメッセージング戦略

デパートが発信している「高級品」、「安心感」というメッセージは暗黙のうちに「高価格」という風に変換されて消費者はネガティブなアクションに反映させていると思います。

いまどきデパートの適正な価格は当たり前なので、こんなメッセージで消費者がポジティブなアクションを起す事はありません。安すぎるものがあれば買うでしょうけれど、それしか買わないでしょう。 なぜなら普通はスーパーをハシゴしてそういう購買パターンを持っているから。

デパートの優位性

でもね、デパートは商社と一緒に商品開発してみたりとか、品質チェックの体制とか、不具合がわかった場合のレベルの高い対応とか違いがあるはずなのですよ。

その重要なポイントが消費者にメッセージとして伝わっていないと思います。具体的に「高級品」、「安心感」の内容を説明してこなかった、これまでの日本的な言わずとも伝わるはずという態度で、価値をメッセージにして発信しない限り消費者にポジティブなアクションを引き起す事はないでしょう。

いまは具体的にどんなサービスがあるのか分からない状態で、デパートのアフターサービスなんて都市伝説なんじゃないかな。 実際に量販店と同じものを売って、フォローできない商品も多いでしょうし。

でも商品開発をした担当者がデパートで、その狙いをわざわざプレゼンするとか、ブランドに込めた思いを自分の言葉で語るとか、デパートの価値を説明するメッセージを具体化して発信しなければ、どこも一昔前のイトーヨーカドー的なものになるでしょう。

デパートのECサイトはスーパーと同じ

デパートのWebサイトの内容は普通のショッピングサイトですよね。 その商品がどうやって作られたか、とかそういう説明は見たことがないし、必要だとも思ってないのかなぁ。 商品を並べて好きなものを選んでもらうだけなら、いまどきスーパーでも出来るっていう。

それとも、それは有名な商品で分かる人が買っていくのか…。 いや、それなら楽天の専門店で買って行くでしょう。

どんな人がかかわって商品が出来るのかとか、でっかいスケールの話しの最後にさりげなく商品が置かれているとか、ブランドイメージが大切なら、そのイメージを具体化する作りにした方がいいんじゃないかなぁ。w3mとかCSSをオフにしたら、スーパーと違いがわかりませんからね。

結局、見た目が重視されすぎて、コンテンツの持つ本質的なメッセージへの説明がなさ過ぎなんだと思います。 スーパー的なコンテンツの構成の中に自身を当てはめてしまったら、価格で比較されるのは自明な気がします。

Amazonだって希少性の高いものが、そこそこの値段であって、かつ便利だから売れるんであって、楽天でも変えるなら、いつ届くかも書いてないデパートのECサイトなんて見向きもされないでしょう。

消費行動の多様化の意味

デパートが多様なメッセージを発信すれば、それを自分のスタイルに合うと判断した消費者がデパートにやってくると思います。

なぜ高級なのか、なぜ安心なのか説明することで、よりひっかかりが強くなるんじゃないでしょうか。

メッセージを増やせば良いとはいってもデパートが本業に関係のないメッセージを捏造したら、すぐにバレるでしょうね。 本業の強みを活かす方法を考えていないデパートの現状には、あまり明るい未来がないかもしれません。 バフェットさんも本業に集中しろっていっていますし。

さいごに

子供の頃は北陸地域中心にある大和というデパートに、 (子供からすれば)大きな回転するタワーに並ぶお菓子の量り売りがあったり、雰囲気が明かに違って行くのが楽しみでした。長崎屋もあったけれど普通のでっかいスーパーみたいな印象で、わくわくしなかったなぁ。似てるはずなんですけどね。

いままでなかったのかもしれないけれど、デパートにしかない価値観は必ずあって、そこにフォーカスする事はできると思います。

けれど、それを「わかってくださる方だけにお売りします」という態度のままでいるのは、あまりにもおごっているし、「わからない方には必要とされる安いだけのものを提供します」というのも本業をおそろかにしているといわざるを得ません。

安いものに価値を与えつつ、そこそこの値段で売る事は難しいのかなぁ…。

集客のためにユニクロを抱えても、取れたボタン付けるとか、ほつれたところを縫い直してみるとか、特別な生地使ってみるとか、何か特別なサービスをさせて、デパートに置く意味を与える必要はあるんだと思います。 いまの時代に合せて体制を変化させて、本業の本質は何か、語れるデパートが残っていくんでしょうね。 残ってくれないとスーパーだけになるのは寂しい気がします。

2009/10/28

LDAP認証:CentOSでやってはいけない設定

CentOS 5.3, 5.4で試したのですが、nsswitch.confに以下の設定を入れてしまうと、事実上起動途中でシステムがハングアップしてしまいます。

group:          ldap files

"ldap"に登録されていない情報をローカルに見に行くというところが原因で、パフォーマンスの観点からもお勧めはできない設定です。

ただUbuntuでは、この設定でLDAPサーバーに接続できないエラーが大量に出力されますが、無事に起動します。 CentOSでは"bind_policy soft"にするとUbuntuと同じような挙動になり、起動はできるようになりました。Ubuntuはデフォルトの"bind_policy hard"で動くんですけどね…。

とりあえず復旧するためには、CentOSのインストールDVDから起動してboot:に続いてlinux rescueと打って復旧モードで起動してnsswitch.confファイルを元に戻すのがお勧めです。

インストールDVDを使わなくてもシングルユーザーモードで起動するようにして、udevの初期化途中でC-cを何回か連打すればシェルに落ちると思いますが、ファイルシステム壊しそうでお勧めできないですね。

Ubuntuで挙動が違う原因はlibnss-ldapのdebパッケージに適用されているパッチにあるようです。 リトライ回数などが変更されているので、おそらくその影響でしょう。これだとCentOSも時間をかければ起動しそうですが、一回つまずく毎に相当待たされるので確認するのは辞めておきます。

2009/10/27

LPIC Level3対策の勉強を引き続き

とりあえずOpenLDAPに触ったところは良いとして、いろいろ資料を漁っていたところLPI-Japanのページに辿り着きました。[参考資料ダウンロード]

その中にあった小田切さんの301対策セミナー資料の中に「TLSを使おう(SSLじゃないんだよ)」と書かれていて、SSLじゃない、という部分に「ああぁ、そうか、そうですね」とおもわずつぶやきました。

他にも資料が少ないから、Webの資料を鵜呑みにするなとか、いろいろ書かれてあって「ですよね〜」と同意せざるを得ません。そういう視点でみたらここにまとめた事は危険な香りがします…。

今度ちゃんとまとめなおそう。

2009/10/26

Ubuntu 8.04 LTSでのAdobe Reader 9.2のインスール

Adobe Readerの脆弱性について

各種報道などで前回の10月のWindows Updateのスケジュールと同じタイミングで、Adobe Readerでの脆弱性対応が行なわれる事がアナウンスされています。[IPA] Adobe Reader および Acrobat の脆弱性(APSB09-15)について

Ubuntu用のdebファイルをダウンロード

更新する事をすっかり忘れていたのですが、そろそろ更新と思ったところAdobeのダウンロードサイトがすこしおかしい事に気がつきました。普通は"Get Adobe Reader"のアイコンをクリックして、各OS向けのパッケージをダウンロードできるはずなのですが、現段階ではLinux向けには9.1.2と8.1.6の2つのバージョンが表示されてしまいます。

それでSecurity Advisory文書からAdobeのサイトを確認すると、LinuxとSolaris向けに9.2-1がリリースされている事がわかります。Security Updates Available for Adobe Reader and Acrobat, Adobe Reader for Unix

でも、ここからリンクを辿っていくと元のget.adobe.comのサイトに誘導されてしまい、堂々巡りに…。

そこで途中の"downloaded from the FTP Servers."のリンクを辿って、直接ftpサーバーからダウンロードする事にしました。[AdbeRdr9.2-1_i386linux_jpn.deb]

debファイルからのアップデート

後は普通にdpkgを使って更新していきますが、Acrobatはi386なのにOSはx86_64版なので"--force-all"をつけています。

$ sudo dpkg -i --force-all AdbeRdr9.2-1_i386linux_jpn.deb

しかし英語版のページでも9.2へのリンクはないんだよなぁ。セキュリティアップデートなのに、コンテンツの更新手順が面倒なのだとしたら、作りに問題があるよなぁ…。

2009/10/25

Ubuntu, CentOS管理コマンドに触れて思う事

LDAP認証の設定を終えて

2つのDistributionでは、そのデフォルト設定などが違うために、同じコードを使っていても、その設定方法やポリシーには違いがあります。Ubuntuでは”auth-client-config"コマンド、CentOSでは"authconfig"コマンドを使って、nsswitch.confやpam.d/以下のファイル群を操作します。

Ubuntuでは/etc/ldap.confは$ sudo dpkg-reconfigure ldap-auth-configで再設定はできて、"nss_base_passwd"などの手動で設定した項目はそのまま残っています。

CentOSでも/etc/ldap.confの状況は同じで、"authconfig"コマンドで設定できます。 authinfo.pyの中では条件にあった行だけを書き換えていて、手動で設定が必要な部分についてはやはり残す仕組みになっています。

何のためのツール群か

こういう管理ツールは必要なのか、時々疑問に思う事があります。 サポートのコストを軽減させたり、ファイルを直接編集する事で関係ないところまで無意識に書き換えてしまうといったケアレスミスの軽減に役に立つ場面はあると思います。

しかし実際には、その場しのぎのツールが生み出されて、そのバリエーションは多義に渡ります。 この分野ではUNIX系システムの特徴である”パイプ”や一つの処理を一つのコマンドに行なわせる簡潔さは継承されていないようです。

システム管理の自動化について考えると、AIXが持っている"ls*","mk*","ch*"系コマンドの一貫性はsmitの体系中で良く動いていると思います。 複雑なデバイスの管理になると崩れていく部分はありますが、それと比較してUbuntuやCentOSの持つ管理系コマンドの仕組みはpythonで書かれていたりして現代的で格好いいかもしれませんが、UNIX系の雰囲気は持っていません。

今後の予定

まだ認証の仕組みにSSLを使っていないので、現実的な応用を考えればLDAP認証やらレプリケーションやらにSSLまで設定をしてようやく最低限なのかなと思っています。

LPICの試験対策としては、まぁ必要ないところなので試験が終ってから、OpenLDAPを自宅LANに導入していこうと思います。まぁどんなOSを使ってもパッケージがhttpdグループやらを作ってくれるので、あらかじめUID, GIDを統一して準備しておく必要性は感じないですけどね。

ひょっとすると将来の仕事でLAN環境を作らなきゃかもしれないし、LDAPを使った応用については勉強しておこうと思っています。まぁ前の前の会社で散々やっていたけれど…。

OpenLDAP 2.4: CentOS 5.4でのLDAP認証設定

基本的にはUbuntuの時と同じで、バージョンは違うものの、使っている仕組みは同じなので /etc/ldap.conf をUbuntuからコピーしてきても動きます。

そこでCentOSで設定する時の注意点だけまとめます。

2009/10/24追記:
以下で説明している方法は、次のコマンドで代用できます。
$ sudo authconfig --enableldap --enableldapauth --ldapserver=10.0.0.2 --ldapbasedn="ou=accounts,dc=example,dc=org" --updateall

全体の流れ

CentOS 5.3のDVDから特にRPMを選択せずに導入し、yum updateで5.4相当にしています。 nss_ldapなどのモジュール類は既に入っているので、yumで取得する必要はありませんでした。

”/etc/ldap.conf"→"/etc/nsswitch.conf"→"/etc/pam.d/system-auth"と編集していくだけです。

/etc/pam.d/system-authの編集

"system-auth"ファイルはloginやsshdなどの設定からincludeされている、認証全般を管理するファイルです。 "pam_unix.so"が読み込まれている前に"sufficient pam_ldap.so"を追加していきます。

auth        required      pam_env.so
auth        sufficient    pam_ldap.so
auth        sufficient    pam_unix.so nullok try_first_pass
...
...
account     sufficient    pam_ldap.so
account     required      pam_unix.so
...

まとめ

実際のところPAMの設定で、最低限必要なのは”auth sufficient pam_ldap.so"ぐらいです。 accountセクションに"pam_ldap"を書かなくても、通常のログインに問題はありません。 まだ"shadowAccount"オブジェクトクラスの情報をLDAPに登録していないからです。

他にも”authorizedServiceObject”、"hostObject"オブジェクトクラスをユーザーIDに設定して、ldpa.confで"pam_check_service_attr yes"等を設定してチェックさせる事もできますが、OpenLDAPの標準的なschemaの中には含まれていませんね。

PAMの挙動を確認するためには、ある程度はソースコードの各定義を斜め読みするのが良さそうです。 ドキュメントから全ての動きを想像するのは、ちょっと難しいかもしれません。

さらに追記

CentOSでは"authconfig"コマンドがPAM, NSS等の各種サービスを設定してくれますが、細かいところまでは難しいようです。

system-authについてはsystem-auth-acへのシンボリックリンクになっていて、"authconfig"コマンドは実際にはsystem-auth-acファイルを編集します。そのためカスタマイズする場合にはsystem-authをファイルに置き換えて編集する事で、将来RPMが更新された際などに"authconfig"が実行されて編集内容をリセットしてしまう危険を回避する事ができます。

マニュアルに書いてあるとはいっても普通にファイルを編集してしまうと、意図しないタイミングで書き変わってしまう可能性があるので、そんな事件に遭遇すると嫌になるかもしれないですね…。

2009/10/24

OpenLDAP 2.4: Ubuntu 9.04クライアントでのログイン設定

さて作成した"e0001"ユーザーでログインするための設定をUbuntu 9.04に入れていきます。 Ubuntuは"ubuntu-9.04-server-amd64.iso"を使って、OpenSSH Serverが稼働している以外はデフォルトのままです。

モジュールの導入

Ubuntuを導入しただけでは、認証に必要なモジュールもldapsearchなどの確認用ユーティリティも準備されていないので必要なものを導入します。

$ sudo apt-get install libpam-ldap libnss-ldap ldap-utils

/etc/ldap.confの設定

ldap.confは複数あります。 OSが認証に使うものは/etc/ldap.conf、ldapsearchなどの標準的なユーティリティが参照するものは/etc/ldap/ldap.confといった具合です。 もしこの他にもLDAP接続を行なうコンポーネントを使えば、そのために別のldap.confに相当する設定を追加する必要がでてきます。

ログイン時のLDAP認証はPAM(Pluggable Authentication Modules)が行ないます。 ログイン時には参照されないUID, GID含めた/etc/passwd相当のユーザー情報の参照はNSS(Name Service Switch)が担当します。 /etc/ldap.confはこの二つのコンポーネントが共通に参照する事になっています。

libpam-ldapを導入する時にいくつか質問されldap.confに反映されますが、不十分なので後から修正が必要なようです。一応質問には次のように答えました。

  1. [入力] ldap://10.0.0.2:389/
  2. [入力] ou=accounts,dc=example,dc=org
  3. [入力] 3 (Ldap Version)
  4. [入力] no (local root database admin)
  5. [入力] no (LDAP database require login)

NSS用の設定を追加

足りない設定を修正していきます。 /etc/ldap.confでコメントアウトされている部分を修正します。

nss_base_passwd  ou=accounts,dc=example,dc=org?one
nss_base_shadow  ou=accoutns,dc=example,dc=org?one
nss_base_group  ou=groups,dc=example,dc=org?one

/etc/nsswitch.confの設定

ローカルに定義されていないアカウントはLDAPを参照します。

passwd:         files ldap
group:          files ldap
shadow:         files ldap

2009/10/26追記:
nsswitch.confについては、$ sudo auth-client-config -p lac_ldap -t nssで更新する事が可能です。

まとめ

一応、ここまでの設定で"e0001"ユーザーでログインする事ができます。 他に必要な設定として、/etc/pam.d/の下の"common-auth"、"common-account"で"sufficient pam_ldap.so"を"pam_unix.so"の手前に設定する必要があります。 この部分はUbuntuでは自動的にやってくれるようです。 もしファイルを手で修正していたりして、うまく追加されていない場合には確認する必要があるかもしれません。

後はローカルに/Users/e0001ディレクトリを作ったりしています。 実用的に使うにはまだまだ道程が長そうですが、確認という意味ではこんなものでしょうか。

OpenLDAP 2.4: 認証に使うIDの追加

UbuntuやCentOSにログインする時にLDAPを参照するようにしてみます。

通常はユーザーの情報の中に認証に使うエントリも追加するべきなのでしょうが、 実験用に別のコンテナを作成してIDを追加しました。

コンテナの追加

次のような内容の"add_account_group.ldif"を作成し、ldapaddで追加します。 $ ldapadd -x -W -D cn=Manager,dc=example,dc=org -f add_account_group.ldif

dn: ou=accounts,dc=example,dc=org
objectClass: organizationalUnit
ou: accounts

IDの追加

objectClassにはnis.schemaに定義されているposixAccountを使いました。 ここら辺の定義のベースになっているのは、rfc2307だと思います。

将来的にはautomountに関連した情報なども格納するような拡張が計画されているようで、rfc2307bisという文書もinternete-draftsの中から探す事ができます。 OpenLDAPに附属するschemaディレクトリには含まれていないようですが、389 DirectoryServer (a.k.a. Fedora Directory Server)には"10rfc2307bis.ldif"の名前で含まれています。

今回はログインするために必要な範囲の情報を入れていきます。 objectclassに指定している"inetOrgPerson"と"posixAccount"で必須とされているのは、それぞれ"cn sn"(PersonでMUST定義)と"cn uid uidNumber gidNumber homeDirectory"の6エントリです。

loginShellを追加して、次のような"add_user_e0001.ldif"を作成して、ou=accounts追加の時と同じように"-f"に指定します。 なおuserPasswordの文字列はslappasswdコマンドを使って生成しています。 $ slappasswd -h {SSHA} -s secretpassword

dn: cn=e0001,ou=accounts,dc=example,dc=org
objectclass: inetOrgPerson
objectclass: posixAccount
cn: e0001
sn: e0001 User
uid: e0001
uidNumber: 3001
gidNumber: 3001
homeDirectory: /Users/e0001
userPassword: {SSHA}gYeybCGMSjj+qIJd23CnNTYwBHK58gH6
loginShell: /bin/bash
mail: e0001@example.org

まとめ

とりあえずテスト用なので最小限のエントリを作成しましたが、実際にはポリシーを徹底させるためにshadowAccountオブジェクトクラスを使う必要もあるかもしれません。 それぐらいは固定的な値を設定すれば良いのかもしれませんが、パスワードを変更させるためにクライアントをマスターサーバーに直接接続させるのか、という考慮も必要に思えます。

複数マスター構成を取っても根本的な負荷分散は難しいので、マスターサーバーに対する更新処理はバッチ的に処理する仕組みが必要になるかもしれません。 ユーザーのエントリをログインID情報を保持する以外にもメールアドレスや、その他の情報を総合的に管理する時の台帳として使うのであれば、情報の更新などを複数のアプリから直接行なうと問題になりそうです。

また各クライアントからパスワードを変更させるために直接マスターサーバーにアクセスさせるのか、という根本的な構成について検討する必要もあるように思えます。

2009/10/21

OpenLDAP 2.4: 動的なスキーマの登録

bdbを使った時に消せなくなるコンテナエントリが出来てしまうところは、BerkeleyDBのマニュアルやら追いかけたのですが、LPICの試験とは関係ないのと、事務局からexpireの予告はがきが届いたこともあって、試験勉強を進める事にしました。

参考にしている問題集の「徹底攻略LPI Level3問題集」(中島能和:著)によれば、Active Directoryやらを使ってのLinuxアカウントの統合なども出るらしい。

そこで、とりあえず作ったサーバーを使って、VMWareに別VMを追加してPAMとNSSで認証をさせてみようと作業を進めました。

ここで新たな問題が…。

そこで"objectclass: posixAccount"を持つようなアカウント用のコンテナを作って…、と作業を進めてみたもののldapaddが失敗してしまう…。

adding new entry "cn=e0001,ou=accounts,dc=example,dc=org"
ldap_add: Invalid syntax (21)
 additional info: objectclass: value #0 invalid per syntax

あれ、っと思っていろいろ見回してみると、なんとcore.schemaしか登録されていませんでした。

$ ldapsearch -x -W -D cn=admin,cn=config -b cn=schema,cn=config | grep dn:
xxxxxxx
dn: cn=schema,cn=config
dn: cn={0}core,cn=schema,cn=config

システムの"schema"ディレクトリには"nis.ldif"や"cosine.ldif"はありますが、misc.ldifなどはありませんでした。

少し調べてみると"slaptest"コマンドにもslapd同様に"-f"、"-F"を両方指定してslapd.confを変換する事が判りました。 そこで適当なディレクトリに移動して、misc.ldifを作成してみました。

$ mkdir dummy_slapd.d
$ mkdir fake_schema
$ echo 'include "fake_schema/misc.schema"' > dummy_slapd.conf
$ cp /usr/local/etc/openldap/schema/misc.schema fake_schema/
$ slaptest -f dummy_slapd.conf -F dummy_slapd.d
config file testing succeeded
$ cp dummy_slapd.d/cn\=config/cn\=schema/cn\=\{0\}misc.ldif misc.ldif

これでmisc.ldifが手に入ったと…。
あとはldapaddでスキーマを登録していきます。

$ ldapadd -x -W -D cn=admin,cn=config -f /usr/local/etc/openldap/schema/cosine.ldif
$ ldapadd -x -W -D cn=admin,cn=config -f /usr/local/etc/openldap/schema/inetorgperson.ldif
$ ldapadd -x -W -D cn=admin,cn=config -f /usr/local/etc/openldap/schema/nis.ldif
$ ldapadd -x -W -D cn=admin,cn=config -f misc.ldif
Enter LDAP Password: xxxxxxx
adding new entry "cn={0}misc"
ldap_add: Server is unwilling to perform (53)
 additional info: no global superior knowledge

最後にエラーになってしまったのは、slaptestで生成したmisc.ldifが、DNとして"cn=misc,cn=schema,cn=config"ではなく、"cn={0}misc"となっているからでした。

変更前: misc.ldifの先頭3行

dn: cn={0}misc
objectClass: olcSchemaConfig
cn: {0}misc

変更後: misc.ldifの先頭3行

dn: cn=misc,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: misc

さらにファイルの後ろも編集します。

変更前: misc.ldifの最後9行

structuralObjectClass: olcSchemaConfig
entryUUID: 5a6e1624-526d-102e-98e3-738f0cac427d
creatorsName: cn=config
createTimestamp: 20091021091042Z
entryCSN: 20091021091042.575517Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20091021091042Z

この部分をバッサリ削除します。なので変更後は"structuralObjectClass:"から"modifyTimestamp:"までのエントリがなくなります。

2009/10/22追記:
最初に投稿した時点ではmisc.ldifファイルの修正方法が間違っていました。削除していない行があると次のようなエラーがでます。 adding new entry "cn=misc,cn=schema,cn=config"
ldap_add: Constraint violation (19)
additional info: structuralObjectClass: no user modification allowed

あとはこれをldapaddして、終了。 さっさと先に進まないと…。

2009/10/19

OpenSolaris 2009.06版をVMWare Workstation 6.5で動かす

OpenSolaris 2009.06版をVMWare Workstation 6.5.3に導入してみた。 しかしvmware-toolsが素直に入らない。

最初はXサーバーを止めなきゃかなと思って$ svcadm disable svc:/application/graphical-login/gdm:defaultとかしたのですが、必要なくて、よくよくメッセージをみると、/usr/lib/vmware-tools/configurator/XOrg/7.4/vmware_drv.soが見つからない事が原因でvmware-config-tools.plが実行できませんでした。

XOrgのバージョンがいつから上がっているのか、すぐに分からないけれどVirtualBoxは問題なく動くみたいだし、対応が遅いのかなぁ…。

いずれにしても既存の7.1にリンクを張ってしのぎました。

$ cd /usr/lib/vmware-tools/configurator/XOrg/
$ sudo ln -s 7.1 7.4

あとは普通に$ sudo vmware-config-tools.plの後に、$ /usr/bin/vmware-userを実行して、解像度の変更やマウスカーソルの移動がスムーズにできるようになりました。

2009/10/17

OpenLDAP 2.4: 消せないエントリについて、まとめ

およそ12万件の郵便番号データを一斉に削除した時に、最後に残ったコンテナの"ou=address,dc=example,dc=org"エントリが削除できない問題を少し探っていました。

とりあえず状況からわかった事は"database hdb"にデータを格納した場合は、削除が問題なく完了するという事。Ubuntuで$ sudo apt-get install slapdした場合にはデフォルトが"hdb"になりますが、ソースから導入すると"bdb"がslapd.confに書かれています。

今回は自分でコンパイルしていたので気がついたというか、Ubuntu付属のslapdを使っていたら気がつかなかったかもしれないですね…。

場合分け

ldapdeleteコマンドの-fオプションを使うと複数のDNを記述したファイルを準備する事で、一気にエントリを削除する事ができます。

そこでスクリプトを準備して、122872件のエントリを削除してからou=addressエントリを削除してみます。

$ ./gen_delete_entries.rb > delete.ldif
$ ldapdelete -x -W -D cn=Manager,dc=example,dc=org -f delete.ldif

ここまではエラーも出ずに無事に完了します。ちなみに"gen_delete_entries.rb"スクリプトは次のようなものでした。

#!/usr/bin/ruby
for i in 0..122872
  printf "ou=%06d,ou=Address,dc=example,dc=org\n", i
end

エラーの内容

これから手動で"ou=address"エントリを削除しようとするとエラーがでます。

$ ldapdelete -x -W -D cn=Manager,dc=example,dc=org ou=Address,dc=example,dc=org
ldap_delete: Operation not allowed on non-leaf (66)
 additional info: subordinate objects must be deleted first

個別に削除せずに"ldapdelete"に"-r"オプションをつけて、いっきに12万件を削除した場合には、次のようなエラーになります。

$ ldapdelete -r -x -W -D cn=Manager,dc=example,dc=org ou=Address,dc=example,dc=org
ldap_delete: Other (e.g., implementation specific) error (80)
 additional info: DN index delete failed

"hdb"にすれば回避できるとはいっても、似たような現象はFAQの中でopenldap-dataディレクトリ以下のパーミッションの問題だ、とか今回の件には当てはまらないようなやりとりしか確認できていません。

ま、しばらくLPICの勉強から外れて原因を探ってみようと思います。

2009/10/15

OpenLDAP 2.4: 格納したUTF-8データの読み出し

さてOpenLDAPに登録されるデータについて、rfc2849でいうところの"SAFE-STRING"に収まらないものはBase64でエンコードされた上で格納される事になっています。 その時の目印はAttributeの区切りが':'から'::'になっているものです。

rfc2849をみると他にURLを使う':>'が記述されていますが、これは放っておきましょう。

郵便番号の県名などの日本語データはLDAP上では自動的にbase64エンコーディングされて格納されています。 そのためそのままldapsearchをすると、あまりうれしくない表示になります。

$ ldapsearch -x -b dc=example,dc=org postalCode=9650000
dn: ou=020258,ou=Address,dc=example,dc=org
objectClass: organizationalUnit
ou: 020258
st:: 56aP5bO255yM
l:: 5Lya5rSl6Iul5p2+5biC
street:: 5Lul5LiL44Gr5o6y6LyJ44GM44Gq44GE5aC05ZCI
postalCode: 9650000
description: 0,0,0,0,0

base64をデコードする簡単なフィルタを作る

そこでパイプに渡すと'::'を認識してbase64デコードするスクリプトを作ってみました。

#!/usr/bin/ruby
require 'base64'
$stdin.each do |line|
  if line !~ /^\w+::\s/
    print line
    next
  end
  (label, item) = line.split(/\s+/, 2)
  printf "%s %s\n", label, Base64.decode64(item)
end

例えばlsuf.rbとかいう名前のファイルに保存して、パイプでそのまま渡してみます。

$ ldapsearch -x -b dc=example,dc=org postalCode=9310000 | ./lsuf.rb 
dn: ou=020258,ou=Address,dc=example,dc=org
objectClass: organizationalUnit
ou: 020258
st:: 福島県
l:: 会津若松市
street:: 以下に掲載がない場合
postalCode: 9650000
description: 0,0,0,0,0

実際のところ、これぐらいして確認しないと、本当にデータが保存されているのか自信なくなりますね。

ldapsearchの引数にutf-8(日本語)を渡す

例えば"会津若松市"にある郵便番号を全て表示したい場合には、次のようにする事ができます。

$ ldapsearch -x -b dc=example,dc=org '(l=会津若松市)' postalCode street | ./lsuf.rb
# 020258, Address, example.org
dn: ou=020258,ou=Address,dc=example,dc=org
street:: 以下に掲載がない場合
postalCode: 9650000
...
...
# 020480, Address, example.org
dn: ou=020480,ou=Address,dc=example,dc=org
street:: 和田
postalCode: 9650811

とりあえずこれでだいたい使えるようになったかな…。

OpenLDAP 2.4: ダミーデータの作成

OpenLDAPでMaster-Server構成を作ってみたものの、データを入れてみないとおもしろくないので、 適当なデータをデッチ上げる事にしました。

データソースは昔から日本郵便が配布している郵便番号データダウンロードにある全国分のデータを使います。これで約12万2千件を越えるデータが手に入ります。

このままではLDAPに入れる事ができないので、加工する必要があります。 ずっと前にFedora Directory Serverを試した時のスクリプトに手を加えて、それっぽいLDIFを生成するrubyスクリプトを作りました。郵便番号データのデータ構造は郵便番号データの説明の中に詳しく解説されています。

データの作成

LDAPの内部データ構造はUTF-8となっているので、"ken_all.zip"をダウンロードして、UTF-8に変換します。

$ nkf -e ken_all.csv > ken_all.utf8.csv

続いてrubyスクリプトでLDIFを出力するスクリプトを書いて、これに渡してあげます。

$ ./postal2ldif.rb ken_all.utf8.csv > ken_all.utf8.ldif

スクリプトの中身は、こんな感じ。

#!/usr/bin/ruby

printf("dn: ou=Address,dc=example,dc=org\n")
printf("objectClass: organizationalUnit\n")
printf("ou: Address\n\n")

require 'csv'
id = 0
CSV.open(ARGV[0], 'r').each do |row|
  printf("dn: ou=%06d,ou=Address,dc=example,dc=org\n", id)
  printf("objectclass: organizationalUnit\n")
  printf("ou: %06d\n", id)
  printf("st: %s\n", row[6])
  printf("l: %s\n", row[7])
  printf("street: %s\n", row[8])
  printf("postalCode: %s\n", row[2])
  printf("description: %s,%s,%s,%s,%s\n", row[9],row[10],row[11],row[12],row[13],row[14])
  printf("\n")
  id += 1
end

データを入れてみる

こうやって作成した"ken_all.utf8.ldif"ファイルをldapaddを使って、一気に加えてみます。

$ ldapadd -x -W -D cn=Manager,dc=example,dc=org -f ken_all.utf8.ldif

だいたい待つこと1時間といったところでしょうか。 12万件のデータを一つのou=Addressコンテナに入れるのは、どうかと思ったり…。 まぁテストですし、気にしない事にしました。

データを削除してみる

さて12万件のデータを削除してみます。 $ ldapdelete -x -W -D cn=Manager,dc=example,dc=org ou=Address,dc=example,dc=org

さすがに30分以上かかって、最後にエラーを出してou=Address自体の削除はできなかったものの、表面上は無事にデータが消えました。

レプリカ側のデータは、まだ500件以上残っているけれど、この不整合がエラーの原因なのかなぁ…。 そのまましばらく放っておいたら、件数をみればコンシューマ側でも削除処理が終ったようでした。

しかし、どうやってもou=Address,dc=example,dc=orgが消せない…。 エントリの追加もできるのになぁ…。なんでだろう。

さいごに

LDIFは手に入ったし、作業自体はVMWare上にサーバーを置いているから、スナップショットから元に戻してまたデータを入れたり、消したりしてみようと思います。 もうちょっと条件を絞って、どういう挙動なのか確認しないとなぁ。

2009/10/13

OpenLDAP 2.4: slapd.dの再構成

昨日やって、なんとか動くところまでいった"slapd.d"を使う構成のやり直し。

slapd.confに最初から"database config"の設定をちゃんと入れていれば、何も問題はなかったです。 最初にこの設定をいれないままに"-f slapd.conf -F slapd.d"の設定で動かしてしまった事が問題でした。

最低限のconfig構成

database config
rootdn    "cn=admin,cn=config"
rootpw    yoursecretpassword

やっぱりLDAPはデータの入れ方の話しだから、空を掴むような感覚になるなぁ。 明日はデータをきちんと入れて、いろいろいじっていこう。

2009/10/12

OpenLDAP 2.4のslapd.d構成と少し格闘

backupを取ろうとした矢先に外付けHDDのVMWareイメージが全滅しました。 まぁWindowsの再導入とか面倒なだけで、重要な情報はなかったから良いのですが…。
そうはいっても、いままでの試行錯誤の経過を全部失なってしまって少し傷心気味です。

さてLPIC v3の対策とLDAPの復習を兼ねてOpenLDAP v2.4に手を出してみました。 まっさらになったvmwareディレクトリの中にUbuntu 8.04 LTS x86_64版のイメージを作って、 そこを元にTeamを組んでCloneでVMを増やしてみました。

OpenLDAPはapt-getではなく、最新版のopenldap-2.4.19.tgzを持ってきています。 v2.2の経験しかなかったので、いつの間にかslapd.confを使うのは時代遅れっぽいし、LDBMがabsoluteになってBDBがデフォルトになっていたり、戸惑う事ばかりです。JFにあるLDAP HOWTOは完全に古い情報になってしまいましたね…。

テスト対策という意味では、v2.3ぐらいで遊んだ方が良さそうでしたが、まぁそれはおもしろくないので、v2.4の世界を堪能してみる事にしてみました。 LDAPはDB同様に入れ物の話しだから、おもしろいデータをネタにしないと、昔のIBM Secureway Directory Serverのトラウマ再びという感じです。今はTivoli Directory Serverか…。
とりあえずデータの件は置いておくことにします。

LPI Level3の問題集をやってみた

OpenLDAPに手を出したきっかけは、LPICの問題集をやってみたところ微妙にわからないところがあったからでした。Sync LDAP構成って何ですか、と。

レプリカの構成自体は参考書の説明の通りで、すぐに動いたんですよね。

## producer側
overlay    syncprov
syncprov-sessionlog    1000
index    entryCSN,entryUUID  eq

## consumer側
syncrepl rid=1
  provider=ldap://10.0.0.2
  type=refreshAndPersist
  bindmethod=simple
  binddn="cn=Manager,dc=example,dc=org"
  credentials=hiddenpasswordstring
  searchbase="dc=example,dc=org"

でもLPIC日本支部のWebサイトにある問題例をみるとproducer側では"syncprov-checkpoint"を設定する事となっています。本家の説明を読むと次のように書かれています。

  • indexを付けたentryCSNはsyncprov-checkpoint
  • entryUUIDはsyncprov-sessionlog

問題集に載っていた例だとsyncprov-checkpointも付けないとindexでentryCSNを付けてる意味がないよね、とか、いろいろミスマッチが楽しめます。

やっぱり確実な資料は配布元の「OpenLDAP Software 2.4 Administrator's Guide」ですかね。

2009/11/10追記:ちなみに使っていた問題集はインプレスの「徹底攻略 LPI問題集 Level 3 [301/302] 対応」です。
正誤表があるかと思いましたが、ないようですね。

slapd.d構成

OpenLDAP Software v2.4 Administrator's Guideでは、中途半端な説明のままslapd.confは時代遅れになりつつあり、これからはslapd.dディレクトリに構成情報を入れるのだと解説が始まります。

実際にはどうやって使えばいいか、あまり説明はありません。
デフォルト構成では、最初に /usr/local/etc/openldap/slapd.conf を使う事になっているので、 いろいろ手順が必要になります。

  1. slapd.confに"database config"エントリを作成して、rootDN(cn=admin,cn=config),rootPWディレクティブを設定する
  2. /usr/local/etc/openldap/slapd.d ディレクトリを作成
  3. slapdのオプションで"-f slapd.conf -F slapd.d"を付けて、slapd.confの内容をslapd.d以下にコピーする
  4. $ sudo skill slapdなどでslapdを停止する
  5. $ sudo /usr/local/libexec/slapdなどで起動する

しかし問題はたくさん

これで slapd.d を使う事ができるかと思いきや、再起動前は$ ldapsearch -x -b cn=config -W -D cn=admin,cn=configが動いていたのに、オプションを除いて起動した後は、同じ事ができなくなってしまいました。

.../slapd.d/cn=config/olcDatabase={0}config.ldifを直接眺めていると、olcRootDN, olcRootPW設定が記録されていませんでした。うーーん、困ってしまった。

結局のところ、再びslapdを"-f slapd.conf -F slapd.d"を付きで起動して、次のようなldifを準備してみました。

dn: olcDatabase={0}config,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=admin,cn=config
-
replace: olcRootPW
olcRootPW: hiddenpasswordstring

これをldapmodifyを使って、サクっとアップデート。$ ldapmodify -x -W -D cn=admin,cn=config -f yourfilename.ldif ぐらいかな。

なんか途中で試行錯誤したのが悪かったのかな…。明日スナップショットを取ったところまで戻って最初から手順を遣り直してみよう…。

2009/10/05

9月に受験したTOEICの結果がやってきた

Typingmaniaの「メルト -Hard-」でClass AAA(Point 195128)がようやく取れました。
しかし所詮はゲーム。これ以上は腱鞘炎になりそうなので、ここらで満足して辞めておきます。

さて9月に受けたTOEICの結果がWeb上で確認できるようになったとのメールが届きました。 あらかじめTOEICのWebサイトに登録をして、そこから申し込む必要はあるものの、便利なサービスです。

今回はようやく大台を越えて720点でひさしぶりにスコアが伸びました。 でも3年ぐらい前から30ポイントしか上がっていないところはちょっと期待外れ。
もうちょっと手応えを感じていたんだけどな…。

まぁ新形式になって始めて受験したんだし、 とりあえずこの結果を良しとして、今日はなにかちょっと良いものを買ってきて御飯にしましょう。

2009/10/01

お得なマイカップ

最初に勤めた会社では7,8年前でしたが環境に配慮してマイカップの使用が推奨されていました。 その事業所内のベンディングマシーンも全台対応していて、そういうところは徹底していました。

もっとも機械では定量しか注いでくれませんが、人が注ぐ場合にはカップの7分目程度まで注いでくれたものです。

こういう状況では、できるだけ大きなマイカップを持っていく方がお得なわけです。 スターバックスのタンブラーを持ち込む人もいましたが、さすがに少なく注がれてしまい、みたところ紙コップと同量か、ひょっとすると少なかったかもしれません。

そんな状況で私が使っていたのが無印良品の白磁マグカップ 325mlでした。

陶器と比べてガラス素材な磁器は薄く作れるため、見た目同じサイズの陶器では200ml前後のところ300mlを越える容量があります。

陶器のカップは見た目の割に容量が大きくないんですよね。 それに使っていくうちに見えない傷がついて、ちょっとぶつけただけで突然壊れたりしますし。 その点、磁器は丈夫です。

そんなわけでmyカップには磁器のカップがお勧めです。