<?xml version="1.0" encoding="UTF-8"?>
<feed version="0.3" xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="en">
<title>ITプロフェッショナル部（システム開発のアイロベックス｜東京都新宿区の業務システム開発会社）</title>
<link rel="alternate" type="text/html" href="http://www.ilovex.co.jp/Division/ITD/" />
<modified>2008-12-05T11:48:12Z</modified>
<tagline>IT Professional Division</tagline>
<id>tag:www.ilovex.co.jp,2011:/Division/ITD//11</id>
<generator url="http://www.movabletype.org/" version="4.261">Movable Type</generator>
<copyright>Copyright (c) 2008, ichikawa</copyright>

<entry>
<title>Windowsドメインのパスワードで Linuxにもログインできるようにする。</title>
<link rel="alternate" type="text/html" href="http://www.ilovex.co.jp/Division/ITD/archives/2008/12/windows_linux.html" />
<modified>2008-12-05T11:48:12Z</modified>
<issued>2008-12-04T13:03:16Z</issued>
<id>tag:www.ilovex.co.jp,2008:/Division/ITD//11.5861</id>
<created>2008-12-04T13:03:16Z</created>
<summary type="text/plain">社内のユーザーアカウントを Windows ActiveDirectoryで管理...</summary>
<author>
<name>ichikawa</name>

<email>ichikawa@ilovex.co.jp</email>
</author>
<dc:subject>01_07_MultiMix</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.ilovex.co.jp/Division/ITD/">
<![CDATA[<p>社内のユーザーアカウントを Windows ActiveDirectoryで管理していて、<br />
イントラの Webサーバーとかバージョン管理のサーバー等に<br />
部分的に Linuxを導入しているところは多いと思います。</p>

<p>弊社でも Linuxを野放しにしていたため、<br />
パスワードが各サーバーでパスワードが違って、面倒なことになって来ました。<br />
遅ればせながら、今回は Kerberosを使って、パスワードの管理を<br />
Windowsドメイン ActiveDirectory側にまとめてみましたので、設定の仕方を記録しておきます。</p>

<p><br />
対象としたのは、Debian(etch)ですが、<br />
他のディストリビューションでも設定にはかわりはないと思います。</p>

<p>まず、設定に必要なパッケージをインストールします。<br />
<div style="border:#888888 1px solid;padding:4px;margin-left:20px;"># <strong>apt-get install libpam-krb5 krb5-user libpam-unix2</strong></div></p>

<p>pam-krb5 インストール途中で入力が要求されるものは、DCの名前です。適当に答えておきます。<br />
ただし、ドメイン名は大文字で書かなくてはいけませんので注意します。</p>

<p><br />
インストールが終了したら Kerberos クライアントが使用する設定ファイルを確認しておきます。<br />
# <strong>vi /etc/krb5.conf</strong><i>（確認が必要な個所だけ抜粋）</i><br />
<div style="border:#888888 1px solid;padding:4px;margin-left:20px;">[libdefaults]<br />
　default_realm = HOGEHOGE.CO.JP　<i>（大文字であることを確認）</i></p>

<p>[realms]<br />
　HOGEHOGE.CO.JP = {<br />
　　kdc = dc1.HOGEHOGE.CO.JP<br />
　　kdc = dc2.HOGEHOGE.CO.JP　<i>（dcが複数あれば行を追記しても可）</i><br />
　　admin_server = yamahiko.HOGEHOGE.CO.JP<br />
　}</p>

<p>[domain_realm] <i>（必要に応じて追記。使い方によっては不要？）</i><br />
　.hogehoge.co.jp = HOGEHOGE.CO.JP<br />
　hogehoge.co.jp = HOGEHOGE.CO.JP</div></p>

<p><br />
うまく設定できたか、Kerberosクライアント側のコマンドを使って確認します。<br />
<div style="border:#888888 1px solid;padding:4px;margin-left:20px;"># <strong>kinit ichikawa@HOGEHOGE.CO.JP</strong> <i>（注：ドメイン名は大文字）</i><br />
Password for ichikawa@HOGEHOGE.CO.JP:<i>（Windowsドメインのパスワードを入力する）</i></div></p>

<p>うまく認証できれば何のメッセージもなくプロンプトに戻りますが<br />
エラーの場合は以下のようになります。<br />
<div style="border:#888888 1px solid;padding:4px;margin-left:20px;"># <strong>kinit ichikawa@HOGE.CO.JP</strong><br />
kinit(v5): Cannot resolve network address for KDC in requested realm while getting initial credentials<br />
<i>（ドメインが存在しない）</i></p>

<p># <strong>kinit hogehoge@HOGEHOGE.CO.JP</strong><br />
kinit(v5): Client not found in Kerberos database while getting initial credentials<br />
<i>（ユーザーが存在しない）</i></p>

<p># <strong>kinit ichikawa@hogehoge.co.jp</strong><br />
Password for ichikawa@hogehoge.co.jp:<i>（Windowsドメインのパスワードを入力する）</i><br />
kinit(v5): KDC reply did not match expectations while getting initial credentials<br />
<i>（ドメインが小文字）</i></p>

<p># <strong>kinit ichikawa@HOGEHOGE.CO.JP</strong><br />
Password for ichikawa@HOGEHOGE.CO.JP:<i>（Windowsドメインのパスワードを入力する）</i><br />
kinit(v5): Preauthentication failed while getting initial credentials<br />
<i>（パスワードを間違えた）</i></p>

<p># <strong>kinit ichikawa@HOGEHOGE.CO.JP</strong><br />
Password for ichikawa@HOGEHOGE.CO.JP:<i>（Windowsドメインのパスワードを入力する）</i><br />
kinit(v5): Clock skew too great while getting initial credentials<br />
<i>（Linuxと ActiveDirectoryの DCの時刻が 5分以上ずれている）</i></div></p>

<p>いくつかの例では、Windowsの DC側のセキュリティログにイベントが残り、<br />
Windows側にパスワードの間違いでロックがかかるようなグループポリシーを設定している場合は、<br />
Linux側のパスワード間違いも対象になるはずです。</p>

<p></p>

<p>さて、Kerberosの設定が正しいことを確認したら、次はログイン等の認証方法を設定している pam関係のファイルを修正します。<br />
/etc/pam.d/login等の特定のコマンド用のファイルを直すよりは、<br />
それらが includeで使用している共通の common-** のファイルを修正します。</p>

<p># <strong>vi /etc/pam.d/common-auth</strong><br />
<div style="border:#888888 1px solid;padding:4px;margin-left:20px;">auth sufficient pam_krb5.so <i>（追加）</i><br />
#auth required pam_unix.so nullok_secure <i>（下行と置き換え）</i><br />
auth required pam_unix2.so <i>（追加。 pam_unix.so をそのまま利用していると、passwordを 2回聞いてきたりするので）</i></div></p>

<p># <strong>vi /etc/pam.d/common-session</strong><br />
<div style="border:#888888 1px solid;padding:4px;margin-left:20px;">session optional pam_krb5.so <i>（追加）</i><br />
session required pam_unix.so <i>（pam_unix2.soでなくても良い？？？）</i><br />
session required pam_mkhomedir.so skel=/etc/skel umask=0022 <i>（追加）</i><br />
<i>（ついでなので、ログインしたら自動でホームディレクトリが作成されるようにする）</i></div></p>

<p><br />
以上です。何かのプロセスを再起動したりする必要はありません。</p>

<p><br />
ついでに Windowsドメインと同じ名前ですでに Linux側にパスワードを持ったアカウントがあれば、<br />
/etc/shadow を編集したりしてLinux側のパスワードを消去しておきます。<br />
パスワードを保持したままだと Windowsドメインのパスワード／Linuxのパスワードどちらでもログインできてしまいます。</p>

<p>以降の運用は<br />
アカウント追加時<br />
１．Windows側でアカウントを作成。<br />
２．Linux側でアカウントを作成。<br />
　<strong>useradd newUser</strong> （←これだけで可）</p>

<p>アカウント無効時<br />
１．Windows側でアカウントを無効化。<br />
２．（Linux側でもログインできなくなる）</p>

<p>これで複数のパスワードを覚えておく必要はなく、Windowsドメインのパスワードを修正するだけで Linuxへのログインパスワードも変わります。<br />
Linux側でユーザーを管理するための UIDや GIDを付番するために、<br />
アカウント自体は Linux側にも作成する必要があるものの、パスワードの管理は Windows側に集約できます。<br />
Linuxへのログインが一切必要ないアカウントは作成しなくてよく、<br />
またLinuxにしかログインしないアカウントは従来通り Linux側にだけ作成することができます。</p>

<p><br />
さらにアカウントまで Windowsドメイン側に統合したければ Winbindや LDAPを使ったりすることになるようですが、それはまた別の機会に。<br />
</p>]]>

</content>
</entry>

<entry>
<title>Solaris標準のtarに注意！</title>
<link rel="alternate" type="text/html" href="http://www.ilovex.co.jp/Division/ITD/archives/2008/10/solaristar.html" />
<modified>2008-10-30T13:29:32Z</modified>
<issued>2008-10-29T12:17:20Z</issued>
<id>tag:www.ilovex.co.jp,2008:/Division/ITD//11.5735</id>
<created>2008-10-29T12:17:20Z</created>
<summary type="text/plain">最近はSolarisを使う仕事が多いのですが、その中で知らずにハマってしまったこ...</summary>
<author>
<name>yamaoka</name>

<email>yamaoka@ilovex.co.jp</email>
</author>
<dc:subject>01_06_Linux</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.ilovex.co.jp/Division/ITD/">
<![CDATA[<p>最近はSolarisを使う仕事が多いのですが、その中で知らずにハマってしまったことがありました。</p>

<p>ハマった原因はというとSolarisに標準で入っているtarで、tarとは圧縮・解凍を行うコマンドです。<br />
Linuxなどに入っている標準のtarはいわゆるGNU tarと呼ばれるものですが、<br />
Solarisに標準で入っているtarはGNU tarとは異なります。</p>

<p>Solaris標準のtarとGNU tarで違うところがいくつかあるのですが、その中の一つとして、<br />
Solaris標準のtarは長いファイル名や深いディレクトリ階層には対応していないことです。</p>

<p>例えば、これがどのように影響するかということですが、<br />
TomcatをSolaris標準のtarで解凍したときに正しく解凍してくれません。<br />
したがって、そのまま作業を進めるとTomcatが起動できないということになります。<br />
私は、解凍で失敗するとは考えてなかったので、Tomcatが起動できずにハマっていました。</p>

<p>では、どのようにするのがよいかということですが、<br />
Solarisの場合でもGNU tar を使うようにしましょう。<br />
Companion CDがインストールされていれば、/usr/sfw/bin/配下にgtarがあります。<br />
インストールしていなければ、GNU tarをダウンロードしてきてインストールしましょう。</p>

<p>何も知らずにSolaris標準のtarコマンドを使ってると思わぬところに落とし穴があります。<br />
Solaris標準のtarには注意です！<br />
</p>]]>

</content>
</entry>

<entry>
<title>久しぶりに古いバージョンのJavaを利用して嵌りました</title>
<link rel="alternate" type="text/html" href="http://www.ilovex.co.jp/Division/ITD/archives/2008/10/java.html" />
<modified>2008-10-23T14:26:58Z</modified>
<issued>2008-10-23T14:23:45Z</issued>
<id>tag:www.ilovex.co.jp,2008:/Division/ITD//11.5721</id>
<created>2008-10-23T14:23:45Z</created>
<summary type="text/plain">最近、久しぶりに古いバージョンのJavaを利用して嵌りました。 なぜなら、JDK...</summary>
<author>
<name>ykato</name>

<email>ykato@ilovex.co.jp</email>
</author>
<dc:subject>01_21_Java</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.ilovex.co.jp/Division/ITD/">
<![CDATA[<p>最近、久しぶりに古いバージョンのJavaを利用して嵌りました。<br />
なぜなら、JDK/JRE V1.2.x、V1.3.xには、java.util.Calenderクラスに不具合があるからなのです。</p>

<p>抽象クラスであるjava.util.Calenderクラスの具象クラス（java.util.GregorianCalenderクラス）及び、<br />
その派生クラスにて閏年の12月31日を扱った際に、エラーが発生する場合があります。</p>

<p>■発生条件<br />
　以下の全て条件を満たす時、java.lang.IllegalArgumentExceptionが発生することがある。</p>

<p>1)JDKまたはJREの1.2.0、1.2.1、1.2.2、1.3.0、1.3.1を使用する。（パッチレベルは省略）<br />
2)java.util.GregorianCalendarクラス、または、java.util.GregorianCalenderクラスを継承したクラス、<br />
　または、java.util.CalenderクラスのgetInstance()メソッドにて取得したクラスを使用している。<br />
3)setLenient(false)を実行する。<br />
4)以下のいずれかの方法で、閏年の12月31日の日付を設定する。</p>

<p>4-1)システム日付が、閏年の12月31日の時、java.lang.Calendar.getInstance()または、<br />
　　new java.util.GregorianCalendar()を実行する。</p>

<p>4-2)set()メソッドで閏年の12月31日の値を設定する。<br />
　　かつ、getTime(),add(),roll(), get(),computeTime(),getTimeInMillis(),complete(), computeFields() <br />
　　のいずれかのメソッドを実行する。</p>

<p>4-3)setTime()メソッド、setTimeInMillis()メソッドで閏年の12月31日の値を設定する。</p>

<p>4-4) add()メソッドによる計算により、閏年の12月31日の値を設定する。</p>

<p>5)同じオブジェクトに対し引き続き、set()メソッドで、閏年以外の値を設定する。<br />
6)getTime(), equals(), before(), after(), add(), roll(), get()<br />
  computeTime(), getTimeInMillis(), complete()のいずれかのメソッドを実行した場合。</p>

<p>■回避例<br />
1)別の日付を設定する直前に(発生条件5)の直前に、Calendar.clear()を呼ぶ。<br />
2)別の日付を設定する際は、新たにインスタンス化したオブジェクトを使用する。</p>

<p>今回は、昔のことをすっかり忘れていた為、嵌ってしまいました。<br />
昔、社内でも報告した記憶があるのですが。。。</p>]]>

</content>
</entry>

<entry>
<title>IIS7+PHPのファイルアップロードに注意</title>
<link rel="alternate" type="text/html" href="http://www.ilovex.co.jp/Division/ITD/archives/2008/10/windowsserver20.html" />
<modified>2008-10-17T08:55:27Z</modified>
<issued>2008-10-17T00:49:00Z</issued>
<id>tag:www.ilovex.co.jp,2008:/Division/ITD//11.5703</id>
<created>2008-10-17T00:49:00Z</created>
<summary type="text/plain">今週から社外向けに公開しているWebサーバ(このページを表示しているサーバ)が、...</summary>
<author>
<name>ikeda</name>
<url>http://www.ilovex.co.jp/ilovex/ikeda/</url>
<email>ikeda@ilovex.co.jp</email>
</author>
<dc:subject>01_05_Windows</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.ilovex.co.jp/Division/ITD/">
<![CDATA[<p>今週から社外向けに公開しているWebサーバ(このページを表示しているサーバ)が、<br />
WindowsWebServer2008になりました。</p>

<p>フリーソフトで配布しているBugZeroはPHPで動作しているのですが、<br />
今回WindowsWebServer2008に変更した際にアップロードしたファイルが、<br />
アップロードした人以外には参照できないという問題が発生しました。</p>

<p>原因は、<br />
PHPがファイルのアップロードを行う際にファイルを一時的に別のフォルダに保存し、<br />
アップロード完了後にアップロード先に指定されているフォルダに移動しているため、<br />
一時保存のフォルダのセキュリティでIISの匿名認証のユーザが設定されていない場合、<br />
そのフォルダのセキュリティ設定をファイルが継承してしまいます。<br />
このため実際に保存されるフォルダで匿名認証のユーザが設定されていても、<br />
その設定を引き継がないという状態でした。</p>

<p>解決方法は、<br />
１．PHPの設定ファイルのphp.iniの設定項目にある「upload_tmp_dir」に、<br />
　　フォルダを指定する記述を行う。<br />
２．upload_tmp_dirに指定したフォルダに匿名認証のユーザの権限（読み取り権限）を設定する。<br />
３．設定を反映するためにIISを再起動する。</p>

<p>以上で、アップロードしたファイルに匿名認証のユーザの権限が設定されます。</p>]]>

</content>
</entry>

<entry>
<title>ネットワークブロードキャストに ping</title>
<link rel="alternate" type="text/html" href="http://www.ilovex.co.jp/Division/ITD/archives/2008/10/_ping.html" />
<modified>2008-10-16T05:15:16Z</modified>
<issued>2008-10-16T04:49:11Z</issued>
<id>tag:www.ilovex.co.jp,2008:/Division/ITD//11.5680</id>
<created>2008-10-16T04:49:11Z</created>
<summary type="text/plain">ネットワークのちょっとした Tipsです。 ローカルのネットワークについて、接続...</summary>
<author>
<name>ichikawa</name>

<email>ichikawa@ilovex.co.jp</email>
</author>
<dc:subject>01_07_MultiMix</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.ilovex.co.jp/Division/ITD/">
<![CDATA[<p>ネットワークのちょっとした Tipsです。</p>

<p>ローカルのネットワークについて、接続を緩めに許可していると、<br />
その時点でいったいどれだけの機器をつないでいるのか、時々把握しきれなかったりしませんでしょうか？</p>

<p>Windowsマシンだけであれば、Microsoft Windows Networkで一覧できたりしますが、<br />
Windows以外の OSや UPnPに対応していない機器を使っていたりすると、<br />
いちいちいろんなアドレスに Pingを打って、使われているのかいないのかを確かめたりしなくてはならず、とても面倒です。</p>

<p>そんな時、わざわざ別だててネットワーク調査用のアプリケーションをインストールしなくても、<br />
標準コマンドだけで簡易的にネットワーク機器を調べられます。<br />
それが、「ネットワークブロードキャストアドレスに ping」です。</p>

<p>例えば、社内のネットワークが 192.168.1.0/24 であった場合、<br />
　ping 192.168.1.255 (Windowsの場合)<br />
とか<br />
　ping -b 192.168.1.255 (Linuxの場合)<br />
します。この ping の結果は、大半の環境では timed out になったりしますが、<br />
その後<br />
　arp -a (Windowsの場合)<br />
とか<br />
　arp -n (Linuxの場合)<br />
をすると、ローカルブロードキャストネットワーク機器の<br />
IPアドレスと MACアドレスがのきなみ arpリストに入っているのです。</p>

<p>FireWall等で制限のかかっている機器は対象とならない場合もありますが、<br />
取り急ぎ確認してみるには使える機能ではないでしょうか？<br />
</p>]]>

</content>
</entry>

<entry>
<title>VBScriptで改行コードを変換する！</title>
<link rel="alternate" type="text/html" href="http://www.ilovex.co.jp/Division/ITD/archives/2008/10/vbscript.html" />
<modified>2008-10-07T19:26:05Z</modified>
<issued>2008-10-07T10:17:34Z</issued>
<id>tag:www.ilovex.co.jp,2008:/Division/ITD//11.5660</id>
<created>2008-10-07T10:17:34Z</created>
<summary type="text/plain">今回はVBScriptで改行コードを変換する方法を紹介します。 実際には改行コー...</summary>
<author>
<name>jnakamura</name>

<email>jnakamura@ilovex.co.jp</email>
</author>
<dc:subject>01_99_etc</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.ilovex.co.jp/Division/ITD/">
<![CDATA[<p>今回はVBScriptで改行コードを変換する方法を紹介します。</p>

<p>実際には改行コードを変換するのではなく、<br />
変換するファイルを読み込んで別のファイルを作成するというもの。<br />
その際に、改行コードを設定します。</p>

<p>下記は改行コードを「CRLF」から「LF」に変換します。</p>

<p>'書き込みモード、読み込みモードをコンストで保持<br />
Const ForReading = 1, ForWriting = 2</p>

<p>'変換するファイルの名前を設定<br />
filename = "ファイルの名前"</p>

<p>'新しく作成するファイルの名前<br />
'最後に名前を変換元の名称に変換するので何でもいいです<br />
tmpfilename = "一時ファイルの名前"</p>

<p>Set obj = CreateObject("Scripting.FileSystemObject")</p>

<p>'変換するファイルを読み込みモードで開く<br />
Set file = obj.OpenTextFile(filename, ForReading)</p>

<p>'作成するファイルを書き込みモードで開く<br />
Set tmpfile = obj.OpenTextFile(tmpfilename, ForWriting, True)</p>

<p>'ファイルの終わりに達するまでは繰り返す<br />
do while not file.AtEndOfStream<br />
	<br />
	'変換元のファイルから一行読み込む<br />
	buf = file.ReadLine<br />
	<br />
	'書き込む際に改行コードをつける<br />
	tmpfile.Write buf & vbLf<br />
loop</p>

<p>'各ファイルの<br />
file.Close<br />
tmpfile.Close</p>

<p>'作成元のファイルを削除<br />
obj.DeleteFile filename</p>

<p>'作成元のファイルに移動<br />
obj.MoveFile tmpfilename, filename</p>

<p>MsgBox "終了"</p>

<p>変換するデータや環境にもよるのですが、<br />
ただ単純に一行読み込んで、一行出力するだけなので、<br />
10万件でも５～１０秒程度で変換出来ると思います。</p>

<p>※1レコード400バイトのデータ10万件で実行したところ、5秒程度で変換できました。</p>]]>

</content>
</entry>

<entry>
<title>複数のexeで、単一のコンフィグファイルを共有する</title>
<link rel="alternate" type="text/html" href="http://www.ilovex.co.jp/Division/ITD/archives/2008/10/exeappconfig.html" />
<modified>2008-10-02T21:00:21Z</modified>
<issued>2008-10-02T10:54:10Z</issued>
<id>tag:www.ilovex.co.jp,2008:/Division/ITD//11.5643</id>
<created>2008-10-02T10:54:10Z</created>
<summary type="text/plain">WindowsForm、もしくはコンソールアプリの設定ファイルは、 app.co...</summary>
<author>
<name>takefuji</name>

<email>takefuji@ilovex.co.jp</email>
</author>
<dc:subject>01_22_dotNet</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.ilovex.co.jp/Division/ITD/">
<![CDATA[<p>WindowsForm、もしくはコンソールアプリの設定ファイルは、<br />
app.configに設定を記述することになります。</p>

<p>簡単な構成ですと、１つの実行ファイル(exe)で、<br />
app.configも１つとなり、何も問題ないのですが、<br />
複数の実行ファイルで、共通のコンフィグファイルを<br />
読み込みたい場合があります。</p>

<p>その場合、app.configに記述するのではなく、<br />
共通の外部ファイルを作成し、<br />
"configSource"属性で指定すると良いでしょう。</p>

<pre style="border:1px solid #999999;background-color:#ffffff;padding:5px;font-family: verdana, helvetica, arial, sans-serif;line-height: 102%;">

<p>  &lt;!-- 接続文字列はCommon_connectionStrings.configで管理します--&gt;<br />
  &lt;connectionStrings configSource="Common_connectionStrings.config" /&gt;<br />
  &lt;!-- 設定情報はCommon_appSettings.configで管理します--&gt;<br />
  &lt;appSettings configSource="Common_appSettings.config" /&gt;</p>

</pre>

<p>こうすることによって、外部ファイルを共通の設定ファイルとして扱えます。<br />
データベースの接続文字列を変えたい場合は、一つのファイル変更で済むことになります。</p>

<p>なお、注意点ですが、<br />
複数の実行ファイル(exe)に分割する場合は、<br />
それぞれのビルド出力パスを同じにすると良いです。<br />
（プロジェクトのプロパティで設定）<br />
その上で、同一フォルダにコンフィグファイルを配置しておくと、<br />
管理しやすいです。<br />
そうしておけば、コンフィグ内容に相対パスを指定しても問題ないことになります。<br />
ただし、セットアップファイルを作成する際は、<br />
パスが狂わないように、「プライマリ出力」のパスに気を付けてください。<br />
</p>]]>

</content>
</entry>

<entry>
<title>Windows Server 2008では local Administratorのパスワードが有効期限切れになる</title>
<link rel="alternate" type="text/html" href="http://www.ilovex.co.jp/Division/ITD/archives/2008/09/windows_server_1.html" />
<modified>2008-09-30T18:35:12Z</modified>
<issued>2008-09-30T07:39:13Z</issued>
<id>tag:www.ilovex.co.jp,2008:/Division/ITD//11.5625</id>
<created>2008-09-30T07:39:13Z</created>
<summary type="text/plain">利用者がパスワードを定期的に変更しなければいけないポリシーにしている環境は結構あ...</summary>
<author>
<name>ichikawa</name>

<email>ichikawa@ilovex.co.jp</email>
</author>
<dc:subject>01_05_Windows</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.ilovex.co.jp/Division/ITD/">
<![CDATA[<p>利用者がパスワードを定期的に変更しなければいけないポリシーにしている環境は結構あると思います。</p>

<p>この時に社内のネットワーク ActiveDirectoryの グループポリシーを使ってそれを実現している場合、<br />
・Windows2003までのドメインでは、パスワードのポリシーに関しては、ドメイン全体に対して１種類のポリシー(Default Domain Policy)しか設定できない。<br />
・パスワードのポリシーはコンピュータの構成で設定するものなので、コンピュータがドメインに参加してさえいればローカルのアカウントに対してもその設定が適用される。<br />
・Windows Server 2008のローカルの Administratorはデフォルトで『パスワードを無期限にする』のチェックが入っていない。<br />
という理由から、放って置くとマシンローカルのアカウントのパスワードが有効期限切れになります。<br />
あまりパスワードの有効期限について意識しないで Windows Server 2008をインストールすると、<br />
インストール直後は良くても数ヶ月過ぎるといきなり何かが正しく動かなかったりする可能性があるということです。</p>

<p>そうならないためには、<br />
・意図して Windows Server 2008のローカルの Administratorの『パスワードを無期限にする』のチェックを付ける。<br />
もしくは<br />
・ちゃんと定期的に Administratorのパスワードを変更する。<br />
といった作業が必要です。</p>

<p>なお、Windows 2008のドメインにすれば、パスワードのポリシーを複数設定できるため、ポリシーの適用除外が指定できるようですが、<br />
もともとセキュリティ向上のために Local Administratorのパスワードはデフォルトでは無期限になっていないのですから、よく考えて行うべきでしょうね。<br />
</p>]]>

</content>
</entry>

<entry>
<title>コマンドプロンプトでファイルの中身を比較してみよう!!</title>
<link rel="alternate" type="text/html" href="http://www.ilovex.co.jp/Division/ITD/archives/2008/09/post_52.html" />
<modified>2008-09-25T23:26:19Z</modified>
<issued>2008-09-25T14:16:38Z</issued>
<id>tag:www.ilovex.co.jp,2008:/Division/ITD//11.5609</id>
<created>2008-09-25T14:16:38Z</created>
<summary type="text/plain">普段使用しているエディタ等で、 ２つのファイルの内容の違いを調べることがよくある...</summary>
<author>
<name>kobara</name>

<email>kobara@ilovex.co.jp</email>
</author>
<dc:subject>01_99_etc</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.ilovex.co.jp/Division/ITD/">
<![CDATA[<p>普段使用しているエディタ等で、<br />
２つのファイルの内容の違いを調べることがよくあると思います。</p>

<p>実は、コマンドプロンプトでもファイルの内容の違いを<br />
調べることが可能なのです。</p>

<p>ではどうすればコマンドプロンプトで、ファイルの違いを確認できるのか<br />
といいますと、それには【 fc 】コマンドを使用します。</p>

<p><br />
C:\>fc hikaku1.txt hikaku2.txt</p>

<p>ファイルの内容に違いがなければ以下のように<br />
表示されます。</p>

<p><img alt="f3.gif" src="http://www.ilovex.co.jp/Division/ITD/f3.gif" width="540" height="145" /></p>

<p>ファイルの内容に違いがあれば以下のように<br />
表示されます。</p>

<p><img alt="f2.gif" src="http://www.ilovex.co.jp/Division/ITD/f2.gif" width="540" height="469" /></p>

<p>このままだと違いがあるのが分かっても、ではどこに違いがあるのかが<br />
すぐには分かりません。<br />
そんなときは、オプションに【 /n 】をつけると行番号も表示されるため<br />
異なる箇所がすぐに分かります。</p>

<p>C:\>fc hikaku1.txt hikaku2.txt /n</p>

<p><img alt="f1.gif" src="http://www.ilovex.co.jp/Division/ITD/f1.gif" width="540" height="469" /></p>

<p>エディタで比較するのに飽きたら、コマンドプロンプトでたまには比較してみてください。<br />
</p>]]>

</content>
</entry>

<entry>
<title>VirtualServer の仮想HDファイルをドライブとして参照（マウント）</title>
<link rel="alternate" type="text/html" href="http://www.ilovex.co.jp/Division/ITD/archives/2008/09/virtualserver_h.html" />
<modified>2008-09-22T22:17:16Z</modified>
<issued>2008-09-22T13:05:56Z</issued>
<id>tag:www.ilovex.co.jp,2008:/Division/ITD//11.5595</id>
<created>2008-09-22T13:05:56Z</created>
<summary type="text/plain">なんだか意外に知られていないようなので、メモ2。 VirtualServer の...</summary>
<author>
<name>ichikawa</name>

<email>ichikawa@ilovex.co.jp</email>
</author>
<dc:subject>01_05_Windows</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.ilovex.co.jp/Division/ITD/">
<![CDATA[<p>なんだか意外に知られていないようなので、メモ2。</p>

<p>VirtualServer の仮想HDファイル *.VHD の中身をゲストマシン以外（ホストマシン等）でも見たい場合があります。<br />
仮想マシンを起動していてネットワークが使える状態であれば、フォルダを共有したりすればよいのですが、<br />
大量にファイルを移動させたい場合にわざわざ（仮想）ネットワーク経由になるのがいやだとか、<br />
仮想マシンそのものを起動していない（メモリ不足で起動できない等）場合には<br />
VirtualServerをインストールしたフォルダ \Program Files\Microsoft Virtual Server\ 中にある \Vhdmount\vhdmount.exe というコマンドでホストマシンのディスクとして見ることができます。<br />
例：コマンドプロンプトで<br />
　<strong>vhdmount /p</strong> &lt;VHDファイル名&gt;　　　仮想ファイルをドライブとして認識させる。<br />
　<strong>vhdmount /u /d All</strong>　　　変更を破棄して全ての仮想ディスクを取り外す。</p>

<p>残念ながら VirtualPC には vhdmount.exe は付いておらず、このコマンドはコピーしただけでは動作しないので、最低限 VirtualServerをカスタムでインストールする必要があります。</p>

<p><br />
ついでに、Windows Server 2008の Hyper-V にも vhdmount.exe が付いていませんが、<br />
Hyper-Vの場合には自分で“プログラムを書く！”という方法が主に紹介（推奨？）されていて、<br />
最も端折って書けば、以下です。</p>

<p>VhdMount.vbs<br />
<div style="border:#888888 1px solid;padding:4px;margin-left:20px;">' マウントは VhdMount.vbs mount &lt;vhdファイル名&gt;<br />
' アンマウントは VhdMount.vbs unmount &lt;vhdファイル名&gt;<br />
With GetObject( "winmgmts:\\.\root\virtualization" )<br />
With VHDSvc= .ExecQuery( "SELECT * FROM Msvm_ImageManagementService" ).ItemIndex(0)<br />
Eval "." &amp; WScript.Arguments(0) &amp; "(""" &amp; WScript.Arguments(1) &amp; """)"<br />
End With: End With</div>（手抜きなので、この後 サーバーマネージャー ⇒ ディスクの管理 から手動でディスクを『オンライン』にする必要があります）</p>

<p>他にも、C#.net や VBScript(WSH)での正しい？記述が以下にあります。<br />
<a href="http://msdn.microsoft.com/en-us/library/cc136811(VS.85).aspx" target="_blank">(MSDN) Mount Method of the Msvm_ImageManagementService Class</a></p>

<p>（ Msvm_ImageManagementService を使ったプログラムは Hyper-Vの環境でしか使用できないようです）</p>

<p><br />
※VirtualServer/VirtualPC と Hyper-Vの *.VHD には基本的には互換性があるようです。<br />
ただし、ベースとなる仮想マシンが異なるため、一部ハードウェアの認識をしなおす必要がある場合があるのと、<br />
Virtual～用の 追加機能と Hyper-Vの追加機能には互換性がないので、追加機能を入れなおす必要があります。<br />
その際、Virtual～用の 追加機能のバージョンが 13.813以上でないと Hyper-Vの環境からはアンインストールできないようなので、<br />
それ以下のバージョンの場合は、予めに Virtual～ の環境でアンインストール（もしくはアップグレード）しておく必要があります。<br />
</p>]]>

</content>
</entry>

<entry>
<title>VirtualServer/VirtualPC の仮想HDファイルの最適化（圧縮）</title>
<link rel="alternate" type="text/html" href="http://www.ilovex.co.jp/Division/ITD/archives/2008/09/virtualservervi.html" />
<modified>2008-09-22T22:12:22Z</modified>
<issued>2008-09-22T12:46:05Z</issued>
<id>tag:www.ilovex.co.jp,2008:/Division/ITD//11.5568</id>
<created>2008-09-22T12:46:05Z</created>
<summary type="text/plain">なんだか意外に知られていないようなので、メモ。 VirtualServer/Vi...</summary>
<author>
<name>ichikawa</name>

<email>ichikawa@ilovex.co.jp</email>
</author>
<dc:subject>01_05_Windows</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.ilovex.co.jp/Division/ITD/">
<![CDATA[<p>なんだか意外に知られていないようなので、メモ。</p>

<p>VirtualServer/VirtualPC のゲストマシン（中の仮想マシン）でローカルディスクのファイルに対して読み書き繰り返していると、<br />
ホストマシン（外の実態マシン）で見える仮想HDファイル *.VHD の容量は実質的に使用している容量よりもどんどん大きくなっていきます。<br />
ホストマシンの Virtual～ には、仮想ディスクの最適化（圧縮）のメニューがありますが、<br />
通常はこれだけを実行しても期待通りにはファイルサイズは小さくなりません。</p>

<p>仮想ディスクを整理するには手順があって、<br />
 １．ゲストマシンで、全てのドライブに対してデフラグを行う。<br />
 ２．ホストマシンの Virtual～ をインストールしたフォルダ \Program Files\Microsoft Virtual～\ 中の<br />
　\Virtual Machine Additions\ に、Precompact.iso もしくは ～Precompactor.iso というCDのイメージがあるので、<br />
　ゲストマシンの CDで見られるようにする。<br />
 ３．ゲストマシンで、CDの中にある Precompact.exeを実行する（通常は自動起動するかも）<br />
 ４．precompactが終了したらゲストマシンをシャットダウン。<br />
 ５．ホストマシンでディスクの最適化を行う。<br />
の順に実行しないと、思うような最適化がされません。<br />
（何かのタイミングでゲストマシンを停止してファイルを整理する必要があるということです）</p>

<p>ついでに、少々注意。<br />
Ａ．ゲストマシンに Linuxを使った場合には、precompact に相当する明示的なコマンドはどうも存在しないようです。<br />
　precompactが行っていることは「未使用のディスク領域を nullを書き込んでいる（0で埋め尽くしている）だけ」とのことなので、<br />
　cp /dev/zero hogehoge で DiskFullになるまで放置した後 rm hogehoge してみましたが、思うようには縮まりませんでした。<br />
Ｂ．Windows Server 2008の Hyper-V には precompact.exe が付いていません。<br />
　ドキュメントには precompactしなくても仮想ディスクは最適化できるらしいように書いてあるのですが、<br />
　実際にやってみると思わしくなく、Virtual～ を入れたマシンから precompact.exe を持ってきて実行した方が良く最適化されるようです。<br />
</p>]]>

</content>
</entry>

<entry>
<title>お手軽 OCR</title>
<link rel="alternate" type="text/html" href="http://www.ilovex.co.jp/Division/ITD/archives/2008/09/_ocr.html" />
<modified>2008-09-22T21:45:43Z</modified>
<issued>2008-09-17T12:21:50Z</issued>
<id>tag:www.ilovex.co.jp,2008:/Division/ITD//11.5549</id>
<created>2008-09-17T12:21:50Z</created>
<summary type="text/plain">知らなかったのは私だけでしょうか？ 人知れずすごい機能が眠っているもので、 Of...</summary>
<author>
<name>ichikawa</name>

<email>ichikawa@ilovex.co.jp</email>
</author>
<dc:subject>01_05_Windows</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.ilovex.co.jp/Division/ITD/">
<![CDATA[<p>知らなかったのは私だけでしょうか？<br />
人知れずすごい機能が眠っているもので、<br />
Office をインストールすると、こっそり OCR機能まで一緒に付いて来ていたらしい。</p>

<p>試しに、自分のクライアント Office2003がインストールされている環境で確認してみたところ。<br />
次のようなコードで使うことができた。</p>

<p>OCRTest.vbs(WSH)<br />
<div style="border:#888888 1px solid;padding:4px;margin-left:20px;">'VB(A)では Microsoft Office Document Imaging 11.0 Type Library を参照設定<br />
Dim oDocument ' As New MODI.Document<br />
Dim oImage ' As MODI.Image<br />
Dim oLayout ' As MODI.Layout<br />
Dim oWord ' As MODI.Word<br />
Dim i' As Integer</p>

<p>　Set oDocument = CreateObject("MODI.Document")<br />
　oDocument.Create "C:\work\hogehoge.jpg" ' GIFや Jpeg画像を読ませる<br />
　oDocument.OCR 17 '17:miLANG_JAPANESE ' ここで少々時間がかかる。<br />
　Set oImage = oDocument.Images(0) ' 複数ページのドキュメント対応？1ページ目<br />
　Set oLayout = oImage.Layout<br />
　WScript.Echo oLayout.Text ' 全ての認識文字を出力<br />
　For i = 0 To oLayout.Words.Count - 1<br />
　　Set oWord = oLayout.Words.Item(i) ' 実用では Rects → Rect.* で場所を確認すべき<br />
　　WScript.Echo "[" & oWord.Text & "]" ' 単語区切りごとに文字出力<br />
　Next<br />
　Set oWord = Nothing<br />
　Set oLayout = Nothing<br />
　Set oImage = Nothing<br />
　oDocument.Close<br />
　Set oDocument= Nothing<br />
</div></p>

<p>試しに ILOVEXのホームページにあるバナーアイコンを幾つか読み込ませてみると、</p>

<p>　<img alt="banner_m_systemservice.jpg" src="http://www.ilovex.co.jp/Division/ITD/banner_m_systemservice.jpg" width="215" height="70" />　⇒　「novex システム開発専用サイトテム開発を一括で請負いまち」<br />
　<img alt="banner_m_xzinet.jpg" src="http://www.ilovex.co.jp/Division/ITD/banner_m_xzinet.jpg" width="215" height="70" />　⇒　「- x 遡 et 例 ect 二 ― 11 日報型ブ口ジェ外管理到」<br />
　<img alt="banner_ad-folder175.jpg" src="http://www.ilovex.co.jp/Division/ITD/banner_ad-folder175.jpg" width="175" height="60" />　⇒　「Windows7 オルダーアクセス権限確肥ツール Ik Au - Folder」<br />
　<img alt="banner_web_M.gif" src="http://www.ilovex.co.jp/Division/ITD/banner_web_M.gif" width="175" height="65" />　⇒　「Movable Type を使った WEB サイト構築」</p>

<p>（デザインされたバナーを読み込ませること自体に無理がありました。すいません）</p>

<p><br />
ある程度 精度に目をつぶれば、お手軽 OCRに使えるかもしれないですね。<br />
</p>]]>

</content>
</entry>

<entry>
<title>EXCEL：VBAによる入力規制</title>
<link rel="alternate" type="text/html" href="http://www.ilovex.co.jp/Division/ITD/archives/2008/09/excelvba.html" />
<modified>2008-09-17T18:34:09Z</modified>
<issued>2008-09-17T09:31:19Z</issued>
<id>tag:www.ilovex.co.jp,2008:/Division/ITD//11.5541</id>
<created>2008-09-17T09:31:19Z</created>
<summary type="text/plain">EXCEL：VBAによる入力規制 今回はEXCEL：VBAによる入力規制のやり方...</summary>
<author>
<name>jin</name>

<email>jin@ilovex.co.jp</email>
</author>

<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.ilovex.co.jp/Division/ITD/">
<![CDATA[<p>EXCEL：VBAによる入力規制</p>

<p>今回はEXCEL：VBAによる入力規制のやり方をご紹介します。</p>

<p>関数<br />
<<<<<<br />
入力規制をする範囲.Validation.Add(Type, AlertStyle, Operator, Formula1, Formula2)</p>

<p>・Type 必ず指定します。入力規則の種類を指定します。 <br />
　　xlValidateInputOnly：すべての値<br />
　　xlValidateWholeNumber：整数 <br />
　　xlValidateDecimal：小数点 <br />
　　xlValidateTextLength：文字列（長さ指定） <br />
　　xlValidateList：リスト<br />
　　xlValidateDate：日付 <br />
　　xlValidateTime：時刻 <br />
　　xlValidateCuestcm：ユーザー設定</p>

<p>・AlertStyle 省略可能です。入力規則でのエラーのスタイルを指定します。 <br />
　　xlValidAlertStop：停止 <br />
　　xlValidAlertWarning： 注意 <br />
　　xlValidAlertInformation：情報 </p>

<p>・Operator 省略可能です。入力規則での演算子を指定します。 <br />
　　xlBetween：Formula1とFormula2の間 <br />
　　xlEqual：Formula1と等しい <br />
　　xlGreater：Formula1より大きい <br />
　　xlGreaterEqual：Formula1以上 <br />
　　xlLess：Formula1より小さい <br />
　　xlLessEqual：Formula1以下 <br />
　　xlNotBetween：Formula1とFormula2の間以外 <br />
　　xlNotEqual：Formula1と異なる </p>

<p>・Formula1 省略可能です。データの入力規則での条件式の最初の部分を指定します。 </p>

<p>・Formula2 省略可能です。データの入力規則での条件式の 2 番目の部分を指定します。<br />
引数OperatorがxlBetweenまたはxlNotBetweenの場合、この引数は無視されます。 <br />
>>>>></p>

<p>以下が例となります。<br />
Add以外にも色々と入力規制に関する関数があるので少し紹介します。</p>

<p>例）<br />
With Range("B:B").Validation</p>

<p>　　既存規則削除<br />
　　.Delete</p>

<p>　　規制を追加<br />
　　.Add Type:=xlValidateWholeNumber, _<br />
　　AlertStyle:=xlValidAlertInformation, _<br />
　　Formula1:="1", Formula2:="99"<br />
　　<br />
　　IMEモードの指定も可能<br />
　 .IMEMode = xlIMEModeAlpha <br />
　 <br />
　　エラー時のダイアログの設定<br />
　　.ErrorTitle = "整数のみ入力可"<br />
　　.ErrorMessage = "入力できるのは、1から 99 までの値です"<br />
　　<br />
End With</p>]]>

</content>
</entry>

<entry>
<title>ApacheのディスクキャッシュはMime-Typeを見てくれない</title>
<link rel="alternate" type="text/html" href="http://www.ilovex.co.jp/Division/ITD/archives/2008/09/apachemimetype.html" />
<modified>2008-09-12T03:21:22Z</modified>
<issued>2008-09-11T18:17:29Z</issued>
<id>tag:www.ilovex.co.jp,2008:/Division/ITD//11.5525</id>
<created>2008-09-11T18:17:29Z</created>
<summary type="text/plain">以前、開発にかかわったシステムでDBからバイナリデータを取得し、 画像として表示...</summary>
<author>
<name>nishimaki</name>
<url>http://www.ilovex.co.jp/ilovex/nishimaki/</url>
<email>nishimaki@ilovex.co.jp</email>
</author>
<dc:subject>01_01_WebSystem</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.ilovex.co.jp/Division/ITD/">
<![CDATA[<p>以前、開発にかかわったシステムでDBからバイナリデータを取得し、<br />
画像として表示するというプログラムに関わりました。<br />
DBへのアクセス負荷を抑えるために、Apacheのディスクキャッシュ機能を<br />
使用しました。<br />
その時にハマッタことについて説明したいと思います。</p>

<p>まず、DBから取得するバイナリデータは画像がそのまま格納されているので<br />
特に何も処理せず、取得したデータをPHPで画面へ出力します。</p>

<p>>> 以下ソース</p>

<p>$data = 画像データ;<br />
header("Content-type: image/jpeg");<br />
echo $data;</p>

<p><< ここまでソース</p>

<p>簡単に書くとこのような処理になります。このプログラムがimage_output.phpという名前とすると<br />
画面上のHTMLタグは以下のように記述していました。<br />
&ltimg src="http://hoge.com/image_output.php?imgid=9238291"&gt</p>

<p>処理の流れとしては、<br />
１）ユーザーがブラウザ経由でHTMLにアクセス<br />
２）HTMLのimgタグに埋め込まれているPHP(image_output.php)が呼び出され<br />
　　画像IDが9238291の画像をDBから取得して表示する。<br />
　　すでにApacheでPHPの処理結果がキャッシュされていれば、<br />
　　Apacheのモジュールでキャッシュ側のデータを表示する。<br />
　　<br />
といった、2段階の処理が行われます。</p>

<p>これで何も問題ないと私は思い込んでいました。<br />
しかし様々なブラウザでテストすると、IEとFirefoxでは画像が表示されましたが<br />
Operaではバイナリデータが表示されてしまいました。<br />
携帯電話の場合は、DocomoとSoftbankは画像として表示されましたが<br />
AUでは表示されませんでした。<br />
Apacheのキャッシュが保存されるディレクトリは、どんなファイルでもMime-Typeをimage/jpegにするような<br />
設定を試みましたが解決せず、結局自前でキャッシュ機能を作成することとなりました。</p>

<p>Apacheのキャッシュ機能では、ファイルがどんなファイルであってもMime-Typeは無視され、<br />
デフォルトの設定ではプレーンテキストとして扱われてしまうようです。<br />
ブラウザによっては、imgタグであれば画像として表示するような動きをするものもあれば、<br />
Mime-Typeの情報をしっかり見るブラウザがあるようです。</p>

<p>画像を動的に出力するようなシステムを作る際は気をつけてください。</p>

<p>ちなみにAUの端末は拡張子がjpgであれば、<br />
Mime-Typeに関係なく画像として表示する動きをするようです。</p>]]>

</content>
</entry>

<entry>
<title>Oracle10gの機能を利用した暗号化</title>
<link rel="alternate" type="text/html" href="http://www.ilovex.co.jp/Division/ITD/archives/2008/09/oracle10g_2.html" />
<modified>2008-09-03T22:33:19Z</modified>
<issued>2008-09-03T13:25:51Z</issued>
<id>tag:www.ilovex.co.jp,2008:/Division/ITD//11.5487</id>
<created>2008-09-03T13:25:51Z</created>
<summary type="text/plain">データベースのセキュリティ対策の一つとして、格納データを暗号化するという方法があ...</summary>
<author>
<name>yamaoka</name>

<email>yamaoka@ilovex.co.jp</email>
</author>
<dc:subject>01_03_Database</dc:subject>
<content type="text/html" mode="escaped" xml:lang="en" xml:base="http://www.ilovex.co.jp/Division/ITD/">
<![CDATA[<p>データベースのセキュリティ対策の一つとして、格納データを暗号化するという方法があります。<br />
Oracle10gで暗号化の処理を実装する場合、以下のような方法があります。</p>

<div style="border:1px solid #999999;background-color:#f7f4e8;padding:5px;">
■DBMS_OBFUSCATION_TOOLKITパッケージ<br/>
　Oracle8i から使用可能<br/>
　※下位互換のために存在し、Oracle10gではDBMS_CRYPTOパッケージが推奨されている。<br/>
<br/>
■DBMS_CRYPTOパッケージ<br/>
　Oracle10g から使用可能<br/>
<br/>
■透過的データ暗号化機能 - Transparent Data Encryption(TDE)<br/>
　Oracle10g Release2 から使用可能<br/>
</div>

<p>各機能の利用方法については、いろいろなサイトに載っていますのでそちらを見ていただくとして、<br />
ここではOracle10gから使用可能であるDBMS_CRYPTOパッケージとTDEの機能について、<br />
私なりに使ってみた感想を書きます。</p>

<p><br />
<strong>■DBMS_CRYPTOパッケージ</strong><br />
DBMS_CRYPTOパッケージは、SQLの中で指定する関数となります。<br />
暗号化したい列に対して、アプリケーション側で明示的に暗号化ロジックを組み込んでいくことになります。<br />
この方法で実装した場合、CPU負荷が高くなる場合があり、パフォーマンスへの影響もそれなりに考えられます。<br />
暗号化したときの暗号鍵も、知られないように管理しておく必要があります。</p>

<p>では、暗号化した列のテーブルを参照したときはどのような挙動になるかといいますと、<br />
DBMS_CRYPTOでの暗号化に関しては通常のテーブルと同じようにSELECTでデータを参照することができます。<br />
とはいえ、暗号化した文字列でテーブルに格納されているため、SELECTでテーブルを参照しても<br />
すぐには生のパスワードを知られることがないという利点があります。</p>

<p><br />
<strong>■TDE(Transparent Data Encryption)</strong><br />
TDEは、データベースのほうで設定を行います。<br />
設定を行っておけば自動的に暗号化・複合化を行ってくれるため、<br />
アプリケーション側ではとくに意識することなく実装することができます。<br />
CPU負荷もそれほど見られないため、パフォーマンスへの影響は少ないといえます。<br />
また、暗号鍵はOracle Walletという別のソフトウェアで一括管理されます。</p>

<p>では、TDEを利用した場合のテーブル参照についてどのようになるかといいますと、<br />
暗号鍵がクローズされている場合、暗号化した列はSELECT文で参照できずにエラーが返ってきます。<br />
暗号化した列を含むSELECT文を発行しても同様にエラーが返ってきます。<br />
つまり、"SELECT * FROM ～" というような書き方はできなくなります。<br />
暗号鍵をオープンすることで、SELECTでエラーにならずにデータを参照することができます。<br />
しかし、ここで注意しなければならないのが、暗号鍵をオープンしてテーブルを参照することで<br />
生のパスワードが見えてしまうことです。<br />
したがって、先の説明ではアプリケーション側では意識しなくてよいと書きましたが、<br />
その代りに暗号鍵のオープン／クローズは意識する必要がでてくるのではないかと思います。</p>

<p><br />
上記の内容をそれぞれまとめると、以下のようになります。</p>

<div style="border:1px solid #999999;background-color:#f7f4e8;padding:5px;">
■DBMS_CRYPTOパッケージ<br/>
　・アプリケーション側で暗号化ロジックを組み込む必要がある<br/>
　・TDEと比較してパフォーマンスがよくない<br/>
　・SELECTしたときは暗号化した文字列が表示される<br/>
　・暗号鍵の管理が必要になる<br/>
　・暗号化されている列をSELECTしても、暗号化した文字列が表示されるだけで<br/>
　　生のパスワードを知られることはない<br/>
<br/>
■TDE(Transparent Data Encryption)<br/>
　・データベース側で設定を行うため、アプリケーション側では意識しなくてよい<br/>
　・DBMS_CRYPTOパッケージを使うよりもパフォーマンスがよい<br/>
　・暗号鍵がクローズしているとき、暗号化されている列の値を参照できない<br/>
　・暗号鍵がクローズしているとき、暗号化されている列をSELECTするとエラーになる<br/>
　・暗号鍵がオープンしているときはSELECT文で生のパスワードが見えてしまう<br/>
</div>

<p>Oracleが提供している資料などを見るとDBMS_CRYPTOパッケージよりもTDEのほうが良さそうな気はしますが、<br />
TDEを使っても結局のところアプリケーション側で意識する必要は出てくるのではないかと思います。<br />
そう考えるとTDEのほうは、SELECTで何も表示されないのならまだしも、<br />
エラーが返ってくるというのが非常にマイナス点だと感じました。<br />
（パフォーマンスがどの程度影響出てくるのか気になるところではありますが・・）<br />
使う場面によりけりですが、TDEよりもDBMS_CRYPTOパッケージのほうが使い勝手は良いという印象です。</p>

<p><br />
私が使用した時の感想なので主観的な意見が多々あるかと思いますが、<br />
ここは違うぞ、という部分がありましたら指摘いただければと思います。<br />
</p>]]>

</content>
</entry>

</feed>
