メールのドメイン指定送信

メールの誤送信を防止するには下記のような手段が考えられる。

  1. サーバ側で対応する。
    Postfixのsmtpd_client_restrictionsなど。
  2. クライアント側で対応する。
    Thunderbirdのcheck and sendなど。
    https://addons.mozilla.org/ja/thunderbird/addon/check-and-send/
  3. サーバ-クライアント間で対応する。
    SMTPのProxyを使ってチェックする、AntiVirusっぽくクライアントのOSレイヤーで通信をチェックする、DeepInspection的にパケットの転送経路で通信をチェックする。などなど。

なんとなく、3.の一番目「SMTPのProxyを使って対応する」が可能かコードを書いてみた。結果はページの最後に。PerlのCPANは非常に便利で簡単に書ける。(ただし、テストはあまりしていないので信頼性などは微妙。ここはproof-of-conceptの場所なのでその辺りはつっこまないでください。)
なお、下記のコードは悪意のある人がいる状況下で一定の人にしかメールを送らせないための対応としては使ってはいけない
なぜなら、RFCで許されるメールアドレスのチェックは難しく、一定文字列が含まれる場合は許可というルールは危険すぎるからである。
http://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9
メールアドレスチェックが難しい理由としては、メールの不正中継をテストするテストパターンも参考になる。(%による転送経路指定とか。)
http://www.atmarkit.co.jp/fsecurity/rensai/securitytips/005checkmail.html

以下、Perlのコード。

use Carp;
use Net::SMTP::Server;
use Net::SMTP::Server::Client;
use Net::SMTP::Server::Relay;
use Data::Dumper;
my $SMTP_SERVER = "smtp_server";
my $SMTP_PORT = "587";
#メールあて先チェック用
sub is_ok_to{
  my $ref_to_ary = shift;
  foreach my $to (@$ref_to_ary) {
    #あて先チェックをここに書く。
    if($to !~ /[email protected]/){
      return 0;
    }
  }
  return 1;
}
# 以下本体処理部分
#CPANより。
#http://search.cpan.org/~macgyver/SMTP-Server-1.1/Server.pm
$server = new Net::SMTP::Server('localhost', 25) ||
  croak("Unable to handle client connection: $!n");
while($conn = $server->accept()) {
  my $client = new Net::SMTP::Server::Client($conn) ||
    croak("Unable to handle client connection: $!n");
  $client->process || next;
  #ここまでCPANのサンプルコード(コメントは削除)
  if(is_ok_to($client->{TO})){
    &send_mail($client->{FROM},$client->{TO},$client->{MSG});
  }else{
    print "bad mail  [" . Dumper($client). "]";
  }
}
#問題の無いメールを送る
sub send_mail{
  my $from = shift;
  my $ref_to_ary = shift;
  my $msg = shift;
  $smtp = Net::SMTP->new($SMTP_SERVER, Port=>$SMTP_PORT );
  $smtp->mail($from);
  foreach my $to (@$ref_to_ary) {
    $smtp->to($to);
  }
  $smtp->data($msg);
  $smtp->quit() || croak "send_mail() failed [" . Dumper($from, $ref_to_ary, $msg). "]";
  return;
}

Adobeランタイムの再配布ライセンス

Adobeランタイムの再配布版は下記ページから許諾を受けた上でダウンロードできる。
http://www.adobe.com/jp/products/players/fpsh_distribution1.html
ちなみにAdobeランタイムの定義は以下。

「Adobeランタイム」とは、Adobe® AIR®、Adobe® Flash® Player、Shockwave® Player、および関連するXtras™を意味します。
(http://www.adobe.com/jp/products/clients/all_agreement.html より引用)

実は再配布版についての配布許諾契約は結構厳しい。特に下記の条項は商用ベンダーにはかなり辛い条件のように思える。

9. アドビに対する製品のコピー
Adobeランタイムがイントラネット経由で配布される場合を除き、アドビの請求により、配布業者は、その製品のコピー2部またはそのサービスに対する1件の会員資格をアドビの請求があったときより72時間以内にアドビに無料で提供します。これにより、アドビに知らされた、配布業者が本ソフトウェアを組み込んだことに伴う潜在的な品質保証の問題の解決が促進されます。配布業者の製品またはサービスが配布業者の秘密情報を含む場合、アドビは、配布業者との秘密保持契約の締結に協力します。
(http://www.adobe.com/jp/products/clients/all_agreement.html より引用)

品質保証用とはいえ製品コピーや会員資格を渡すのが難しい場合も多々あるだろうし、NDAを72時間で結ぶのは大変な気もする。イントラネット経由での配布はOKだが、イントラネットの定義が”配布業者のイントラネット内”のようなので守るのはそれなりに大変だろうと思う。(もっとも、問題があるなら再配布版を使わなければいいわけで、回避は可能だろうけど。)
Adobeのものに限らず、ソフトウェア関連の契約書やEULA(End User License Agreement)は読んでみるといろいろ楽しい。GPLやBSD Licenseのように有名なものは解釈を含めて参考になる場所が多いのが、それ以外のライセンスは意外と読んでない人も多いように思う。(たとえばMicrosoftのソフトウェアのEULAにおける賠償の上限とか。)

開発環境の構築

開発環境を構築してみた。
入れたのはRedmineとSubversion(とBazzar)。
OSはCentOS 5.1。

Bazzarのインストール

yum install bzr

以上終了。
# なんとなく入れてみたけど、とりあえず使い慣れたsvnで行くことにした。

Subversionのインストール

yum install subversion
yum install mod_dav_svn

で、/etc/httpd/conf.d/subversion.confを適当に編集。
http://park1.wakwak.com/~ima/centos4_subversion0001.html
とかが参考になる。
クライアント側にはTortoiseSVNを導入。

Redmineのインストール

Redmineは下記のサイトにしたがってインストールした。
http://blog.redmine.jp/articles/redmine-1_2-installation_centos/
その後は下記にしたがってプロジェクトなどを作成。
http://redmine.jp/tech_note/
とても有用なサイトに感謝。

Redmineのアクセス制限

Redmine自体にも認証機能はあるけど、なんとなくBasic認証と併用することにした。
普通に.htaccessではうまくいかなさげ。(Passenger使っているから?)
結局、svnみたく

<Location /redmine>
AuthType Basic
AuthName “require valid user”
AuthUserFile /etc/httpd/conf/xxx
Require valid-user
</Location>

で解決。

CD Linux(Live CD)を使ってシンクライアントもどきを作ってみた。

目指す大体の構成は

  • 古いPCのハードディスクを引っこ抜いてディスクレスにする。
  • 1CD Linuxから起動、リモートデスクトップ(rdesktop)で他のPCにつないで作業する。

というもの。
手順は大体こんな感じ。

  1. Puppy Linuxをダウンロード。
    http://openlab.ring.gr.jp/puppylinux/
    ※ CDのカスタマイズが簡単に可能というすばらしいディストリ。しかも軽い。
  2. CDに焼いて起動。
  3. パッケージマネージャからrdesktopをインストール。
    ※バージョンが古いのでWindowsVista以降にリモートログインする場合は最新版を入れる必要がある。
    http://www.murga-linux.com/puppy/viewtopic.php?t=31702
  4. 起動スクリプトやらデスクトップやらネットワークやらを適当に設定。
  5. CDのリマスタリング機能(Puppy Linuxの標準機能!)でCDを焼く。
    ※3、4で行った設定を全て焼きこむ。
    ※設定の一時保存先としてUSBメモリがあると楽。
  6. PCのハードディスクを抜き、CDドライブに5.のCDを入れる。
  7. 再起動後、rdesktopで他PCにログインして作業する。

この環境では基本的にファイルの保存はできないし、何かあっても再起動で全部消える。単純にPCを盗まれてもデータ漏洩の可能性が無いという意味ではそこそこシンクライアントだと思う。
とはいえもどきなので、Linuxのコマンドがローカル環境に大量に存在するとか、USBメモリを突っ込むなどやる気になればローカルにデータ保存が可能とかいう問題はある。「もどき」を取るためには、USBのマウントをさせない、CD-R/DVD-Rのような書き込み可能デバイスをつけない、ネットワークの接続先を限定する、余計な実行ファイルを消して変なことができない構成にするなど工夫が必要。