タイトル/名前 | 更新者 | 更新日 |
---|---|---|
日記/2009/01/05/ExcelVBAでUserFormをリサイズ可能にする方法 | msakamoto-sf | 2009-01-05 15:24:57 |
日記/2009/01/05/Samba,Winbind,LDAPによる認証統合メモ | msakamoto-sf | 2009-01-05 13:36:24 |
日記/2009/01/04/OSSのWebメーラを探した。 | msakamoto-sf | 2009-01-04 21:37:52 |
日記/2008/12/29/過去のPukiWikiコンテンツ、ようやく移転終了。 | msakamoto-sf | 2008-12-29 19:25:37 |
日記/2008/12/29/MS Team Foundation Server 2008 メモ | msakamoto-sf | 2008-12-29 19:17:56 |
Perl/codepiece/my_and_locals1 | msakamoto-sf | 2008-12-29 17:44:54 |
Perl/codepiece/setuid03 | msakamoto-sf | 2008-12-29 17:26:42 |
Perl/codepiece/setuid02 | msakamoto-sf | 2008-12-29 17:21:51 |
Perl/codepiece/setuid01 | msakamoto-sf | 2008-12-29 17:20:04 |
Perl/codepiece/manupilate_INC_by_FindBin | msakamoto-sf | 2008-12-28 23:06:26 |
お手伝いで調査を頼まれて、無事見つかったのでメモ。
ExcelのVBAでUserFormを表示しているのだけれど、リサイズできなくて困ってるとのこと。
→Win32APIで解決。
・「エクセルでフォームを自在に作る方法」
http://questionbox.jp.msn.com/qa1258692.html
・「【36270】画面サイズ変更を実現させるには?」
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=36270;id=excel
・「UserForm Resize」
http://www.xtremevbtalk.com/archive/index.php/t-196301.html
基本的な流れは、
ここまでできれば、UserForm_Resize()のイベントハンドラで色々好きなように調整できるようになります。
なおAPIを呼ぶタイミングは・・・
という使い分けになります。
・「Samba が動作する Linux マシンを Windows ドメインに参加させる方法」
http://www.miraclelinux.com/technet/document/samba/samba0011.html
・「Samba 3.0の全貌 改訂版[前編]」
http://www.atmarkit.co.jp/flinux/special/samba3b/samba01.html
・「Samba 3.0の全貌 改訂版[後編]」
http://www.atmarkit.co.jp/flinux/special/samba3b/samba04.html
・「Samba3.0+OpenLDAP+Winbindでファイルサーバ」
http://wind-master.dip.jp/soft-info/item/32/catid/11
・「連載 Active DirectoryとLinuxの認証を統合しよう」
http://gihyo.jp/admin/serial/01/ad-linux
Samba2.2とかの時代だと、winbindでLinux認証をWindowsのADにつなげるところまではOKだけどLinux側のuid/gidが自動生成されちゃうのでNFSとかでディレクトリを共有してる場合とかで複数のUnixマシンが動いている場合は困る。
Samba3.0の時代になり、winbindで認証されたユーザ情報をLDAPに格納できるようになった。これにより、上記のようなケースでもuid/gidをLDAPで一元管理できるため問題なくなる・・・という理解。
ただしWindwos側のクライアントアクセスライセンス(CAL)については、winbindを動かすLinux用に必要だし、さらにLinuxを経由してログインしてくるエンドのデバイスについても必要なので注意・・・という理解。
会社で使うかもなのでWebメーラを適当に探す・・・が、オープンソースとなると探すのが難しいかも。
有名なのはこの位かな?
まだGoogleで軽く探った位なので、海外製とかにも目を向ければもっとあるかも。
しかしWebメーラで気になるのはSPAM検出とか排除機能。学習機能とかどうなんだろうか。
ソフトハウスとかで人を外に出すのが主体の会社の場合、メンバーって方々にばらばらに散ってしまう。会社のメールサーバに現場からアクセスできないケースが圧倒的に多い。現場によっては客先のシステムでアカウントを貰える場合もあるけど、それはあくまでもお客との連絡だけで、会社との連絡用には使えない場合もある。
となるとメンバーが帰宅後家から・・・となるのだけれど、それはそれで情報漏洩が怖い。
というわけで、メールデータはあくまでもサーバ上でクライアントには・・・まぁ、残らないという建前で、SSLで暗号化されていてWebブラウザがあればOKということでWebメーラ良いなぁという次第。
客先のPCからアクセスする事を考慮すると、VPNなど特殊なソフトは使えない。
もうここまで追いつめられたら、昔よろしく電話と郵送で良いじゃん?と放り出したくもなる。
印刷物には透かしでナンバリングしておいて、会社側で送った先とナンバーを控えておけば、万一流出した場合も(印刷物自体が流出して、コピーなどからナンバーを確認できれば)どこから流出したのか分かるし。
そもそも客先のPCから自社のメールボックスの中身を覗くこと自体がグレーゾーンな気がする。現場によっては普通に禁止なのではなかろうか。
となると、あれだ。WindowsMobileでPCメールの使える携帯電話を、現場毎に最低1台貸与すれば?あるいはHTTPSとCookieの使えるブラウザを搭載した携帯電話とか。機種が限定されちゃうと思うけど。
Excelシートとかで各人の入力が必要な勤怠表などのようなものについては、印刷したのを各人の自宅に郵送し、記入後返送するか手渡し。
そうすれば一切自宅や客先のPCを弄る必要もないし、Officeを一々自宅PCに入れる必要もない。かさむとすれば切手代だけど、60人規模とすれば毎月 \80 x 2(往復) x 60人 = \9,600 かかるけど、下手にWebメールだのVPNだの構築して情報漏洩のリスクを取るよりはマシ、という考えだって有りでしょ。
あと内容によってはそもそもメールで各人に送る必要のない内容だってあるし。忘年会や研修のお知らせなどはポータルサイトのようなものに載せればOKだろうし・・・つまり、個人情報が含まれないような内容とか。
ふにゃ。
このドメイン(www.glamenv-septzen.net)で2005-2007年にかけて、PukiWikiで書いた記事とかがあったのだけれど、一通り移転が完了した。
今となってはどうでも良いような記事はばっさり削除した。memoriesやPokoX周りがそれで、全部まとめて黒歴史という事で思い出だけ書いておいた。
さて・・・このほかに、1,000エントリほど2002年位から書きためていた日記がある。次はこっちだけど・・・さすがに1,000エントリ全部移転するのはあまりにも手間だし、やっぱり今となっては意味のない記事もかなり多い。大半が愚痴だし。
なのでそちらについては、技術的な部分を優先して移そうかな、と考えている。特にEmacsやvim、bashのメモとかは今でも自分の役には立つ筈なので、移しておきたい。
しかしPHPの話題についてはどうしようかな・・・。2002-2004年頃のPHPの技術を載せてもしゃーないしな・・・。
まぁその辺含めてぼちぼち続けます。
高額な分、かなり高機能なプロジェクト管理システム "Team Foundation Server 2008" の紹介や導入、機能の詳細とかが書かれてる。
日頃はTortoiseSVN使ってたり、現場によってはVSSだったりで、VSSの場合のフラストレーションが凄まじいのだけれど・・・現場の方針によってはフリーソフトの類が使えなかったりして、CVS/SVN系にメンバーを引きずり込むチャンスが見えなかった。
が、MS製品であればサポート有りということで説得力もあるし、何より記事を読んだ感じ、ソースコードのバージョン管理については変更セットをサポートしたりとかなりオープンソース系のバージョン管理システムに近づいている。しかもただバージョン管理するだけではなく、自動ビルドやプロジェクト管理などTracの機能にプラスαした感じ。
これで値段さえもう少し・・・ならなぁ。あの値段を見ると、その分人件費に充ててSVN+Trac的にオープンソースの組み合わせでシステム組んでもドッコイドッコイな感じ。
とはいえ、オープンソース「しか」知らないというのも不公平だなと感じていたので、有り難い情報としてメモ。
"Effective Perl"(Joseph N.Hall/Randal L.Schwartz, 吉川邦夫訳, アスキー出版局)にmyとlocalの説明が載っていたので、改めで実際に動かし、確認する。
Perl/codepiece/setuid02 ではコマンドライン引数の汚染除去を試みた。
今回は、ファイルから読み取った値の汚染除去を試みる。
perlsec( http://perldoc.perl.org/perlsec.html )にあるとおり、Taintモードが有効な場合、Perlプログラムの"外部"から取得される変数は基本的に汚染されていると見なされる。perlsecに上げられているものとして以下が汚染されたものと見なされる。
これらの値を使って以下の操作を行う場合、致命的なエラーが発生する。
但し、Perl5.8.8のperlsecによると、以下の場合はTaintチェックは行われない。
以下のコードピースで、ファイルから読み取った値の汚染除去を試みる。
#!/usr/bin/perl -T use strict; use warnings; my $fn = shift or die "usage: $0 conffile\n"; my $re_filename = qr|[0-9A-Za-z_,\-\./]+|; die "$fn is not untained." unless $fn =~ /^($re_filename)$/; $fn = $1; open FH, "<$fn" or die "open failure. $!\n"; # 引数で渡されたファイル(conffile)から、出力先のファイル名を取得する。 # # conffileは、出力先のファイル名が一行で記述されているテキストファイルとする。 # 例: # /tmp/hoge.txt<NL><EOF> # my $outfile = <FH>; close FH; # remove new line chomp $outfile; $fn = $outfile; # 汚染除去を行う。 die "$fn is not secure." unless $fn =~ /^($re_filename)$/; $fn = $1; open FH, ">$fn" || die "open failure. $!\n"; print FH "$outfile\n"; print FH "REAL_USER_ID(UID) = $<\n"; print FH "EFFECTIVE_USER_ID(EUID) = $>\n"; print FH "REAL_GROUP_ID(GID) = $(\n"; print FH "EFFECTIVE_GROUP_ID(EGID) = $)\n"; close FH;
例えば上記コードピースで、出力ファイル名をキメ打ちにした場合も、正常に終了する。
print FH "$outfile\n";
上記コードが有るにもかかわらず正常に終了するのは、printが汚染チェックを行わないからである。
引き続き、setuidを攻略する。コマンドラインからの引数の汚染除去を行う手法を試みてみる。
基本的に、正規表現マッチにより取り出した値を利用すれば良いようである。
#!/usr/bin/perl -T use strict; use warnings; if(@ARGV < 2) { die "usage: $0 touch_file_name example_integer\n"; } # コマンドラインからファイル名を取得 my $fn = shift; # コマンドラインから文字列結合用の値を取得 my $num = shift; # ファイル名マッチの正規表現で、汚染を除去する。 # ここでは単に一般的なUNIXファイル名であれば良しとしているが、 # 実際はディレクトリなどもっと厳しくする必要がある。 my $re_filename = qr|[0-9A-Za-z_,\-\./]+|; die "$fn is not untained." unless $fn =~ /^($re_filename)$/; $fn = $1; open FH, ">$fn" || die "open failure. $!\n"; print FH "REAL_USER_ID(UID) = $<\n"; print FH "EFFECTIVE_USER_ID(EUID) = $>\n"; print FH "REAL_GROUP_ID(GID) = $(\n"; print FH "EFFECTIVE_GROUP_ID(EGID) = $)\n"; close FH; # ファイル名に文字列結合する為の整数値を汚染除去する。 my $re_number = qr|[0-9\-\.]+|; die "$num is not unsecure." unless $num =~ /^($re_number)$/; $num = $1; # 上記汚染除去を行っておかないと、続くopenで、 # Insecure dependency in open while running setuid at ... # が発生する。 $fn .= "_$num"; open FH, ">$fn" || die "open failure. $!\n"; print FH "$fn\n"; print FH "$num\n"; close FH;
(user1)$ chmod ug+s setuserid2.pl (user1)$ ls -l setuserid2.pl -rwsr-sr-x ... user1 ... setuserid2.pl* (user1)$ su user2 Password: (user2)$ ./setuserid.pl /tmp/hoge 256 → (user2)$ cd /tmp; ls -l -rw-r--r-- ... user1 ... hoge.tmp -rw-r--r-- ... user1 ... hoge.tmp_256 (user2)$ more /tmp/hoge.tmp REAL_USER_ID(UID) = 600 EFFECTIVE_USER_ID(EUID) = 500 REAL_GROUP_ID(GID) = 600 600 EFFECTIVE_GROUP_ID(EGID) = 500 600 → user1 が 500, user2 が 600 (user2)$ more /tmp/hoge.tmp_256 /tmp/hoge.tmp_256 256
このように、正規表現でマッチした結果から再取得することで、Perlから見れば「明示的なユーザーチェックにより汚染を除去できた」とされ、コマンドライン引数をファイル名に使用することが可能となることを確認できた。
ただ、上記リンクの http://harapeko.asablo.jp/blog/2007/01/29/1148931 にもあるように、 むやみやたらと安易なREGEXPによる汚染除去を行うのではなく、本当にその引数が必要なのか?といった、設計自体の見直しも忘れない 方が良いらしい。
setuidされたPerlについての調査を行った。
kernelレベルではまたどうもややこしくなるようである。ここでは、単純にTaintモードの確認を行う。
#!/usr/bin/perl -T use strict; use warnings; #my $fn = sprintf("/tmp/%ld.tmp", time); my $fn = shift || die "usage: $0 touch_file_name\n"; print $fn, "\n"; open FH, ">$fn" || die "open failure. $!\n"; print FH "REAL_USER_ID(UID) = $<\n"; print FH "EFFECTIVE_USER_ID(EUID) = $>\n"; print FH "REAL_GROUP_ID(GID) = $(\n"; print FH "EFFECTIVE_GROUP_ID(EGID) = $)\n"; close FH;
$ chmod u+s setuserid.pl $ chmod g+s setuserid.pl $ ls -l setuserid.pl -rwsr-sr-x ... setuserid.pl* $ su xxxxx(別のユーザ) $ ./setuserid.pl /tmp/hoge Insecure dependency in open while running setuid at /.../setuserid.pl line xx.
perlsecにあるとおり、引数から渡されてきたものをそのままファイル名としてopen私用とすると、汚染されていると見なされ、上記のようなエラーになる。これを回避するには、正規表現をバイパスさせる手法がperlsecに挙げられている。
ここでは、ファイル名をtimeの秒数で生成するようにしてみる。
#my $fn = sprintf("/tmp/%ld.tmp", time); my $fn = shift || die "usage: $0 touch_file_name\n"; → my $fn = sprintf("/tmp/%ld.tmp", time); #my $fn = shift || die "usage: $0 touch_file_name\n";
実行結果 $ su xxxxx(別のユーザ) $ ./setuserid.pl /tmp/1175567398.tmp $ more /tmp/1175567398.tmp REAL_USER_ID(UID) = 600 EFFECTIVE_USER_ID(EUID) = 500 REAL_GROUP_ID(GID) = 600 600 EFFECTIVE_GROUP_ID(EGID) = 500 600
とりあえず今回はここまで。setuid、難しい・・・。
#!/usr/bin/perl use strict; use warnings; use FindBin qw($Bin $Script $RealBin $RealScript); print "Bin = ", $Bin, "\n"; print "Script = ", $Script, "\n"; print "RealBin = ", $RealBin, "\n"; print "RealScript = ", $RealScript, "\n";
$ perl FindBin01.pl Bin = C:/in_vitro/perl/core_modules Script = FindBin01.pl RealBin = C:/in_vitro/perl/core_modules RealScript = FindBin01.pl
実際にuse libを操作してみる。
package test::Hoge; use strict; use warnings; our $message = "Hello, test::Hoge!";
#!/usr/bin/perl use strict; use warnings; use File::Spec; use FindBin; use lib File::Spec->catdir($FindBin::Bin, "lib"); use test::Hoge; print $test::Hoge::message, "\n";
$ perl ./sample/FindBin02.pl Hello, test::Hoge!