DBI::ProxyServerモジュール(日本語チョー訳)

by Hippo2000(1999/11/3)

DBI::ProxyServerモジュールなのです。

なおこのドキュメントではDBIモジュールを入れると入ってくるProxyServer.htmを日本語化したものです。わかりにくい部分は本物を見てください。(^^;;

原本の著作権は Jochen Wiedmannさんがお持ちです。Jochen Wiedmannさんにはメールで了解をいただきました。

なお内容等が間違っていたら修正します。ご連絡ください


目次


名前

DBI::ProxyServer - DBD::Proxyドライバのためのサーバ


概要

    use DBI::ProxyServer;
    DBI::ProxyServer::main(@ARGV);

説明

DBI::ProxyサーバはDBIプロキシドライバのためのプロキシを実装するためのモジュールです。DBMSがネットワークによる操作を提供しなくても、ネットワークを越えたデータベースへのアクセスを可能にします。

しかし統合されたネットワーク機能を持ったDBMSを持っていたとしても、プロキシサーバが便利であるかもしれません:ファイアウォールのある環境でもDBIプロキシとして使うことが出来るのです。

DBI::ProxyServerは、DBMSやファイアウォールのあるマシンでデーモンとして走ります。クライアントはDBIドライバ DBD::Proxyを使って、DBD::mysql、DBD::mSQLや他のDBIドライバを使うのとまったく同じ方法でエージェントに接続します。

エージェントはRPC::PlServerアプリケーションとして実装されています。こうしてこのモジュールの全ての機能、特に暗号化と同様の構成ファイルへのアクセスを持ちます。DBI::ProxyServerは問い合わせを制限する機能を追加しています。

クライアントが実行できる問い合わせの集合を定義し、アクセスを制限することが出来ます。(DBIドライバがパラメータ・バインディングをサポートしている必要があります)。構成ファイル をご覧下さい。


オプション

DBI::ProxyServer::main() 関数を呼び出すさいに、オプションの配列を指定します。(指定がなければ、@ARGV コマンドライン・オプションの配列が使われます。)このオプションはGetopt::Longモジュールで解析されます。ProxyServerはRPC::PlServerのすべてを、さらにNet::Daemonのオプションとオプション操作、特にコマンド行と構成ファイルの両方からオプションを読みこむ機能を継承しています。RPCをご覧ください。使えるオプションについてはNetもご覧ください。

chroot (--chroot=dir)
(UNIXのみ)bind()した後、chroot()をすることにより指定されたディレクトリをルートディレクトリに変更します。セキュリティのためには便利ですが、大きく環境を制限します。例えばドライバが使っているのであれば、構成ファイルでDBIドライバをロードしたり、UNIXソケットへのハード・リンクを作成する必要があります。例えばMySqlでは構成ファイルに以下の行を入れておく必要があります。
    my $rootdir = '/var/dbiproxy';
    my $unixsockdir = '/tmp';
    my $unixsockfile = 'mysql.sock';
    foreach $dir ($rootdir, "$rootdir$unixsockdir") {
        mkdir 0755, $dir;
    }
    link("$unixsockdir/$unixsockfile",
         "$rootdir$unixsockdir/$unixsockfile");
    require DBD::mysql;
    {
        'chroot' => $rootdir,
        ...
    }

chroot()を知らなければ、ログインした後にのみ、あるディレクトリ・ツリーを見ることができるFTPサーバを考えてみてください。--group、--userオプションもご覧ください。

clients
クライアントのリストが入った配列リファレンスです。clientsはハッシュ・リファレンスで、属性accept (アクセスの拒否:0、アクセスの許可:1)、とクライアントIP番号またはホスト名のためのPerl 正規表現mask です。下記Access controlをご覧ください。
configfile (--configfile=file)
構成ファイルは、newメソッドの引数を上書きする1つのハッシュ・リファレンスを返すを返すものと考えられています。しかしながら、起動時のコマンド行引数構成ファイルに優先します。構成ファイルの詳細については下記の構成ファイル セクションをご覧ください。
debug (--debug)
デバッグモードにします。主にレベル"debug"のログメッセージが作られることを示します。
facility (--facility=mode)
(UNIX のみ) Sysのために使われる機能。デフォルトは daemon です。
group (--group=gid)
bind()した後、本当のそして有効なUIDを指定されたものに変更します。これは優先ポート(<1024)にサーバをバインドしようとする場合に便利です。しかしルートとしてサーバを実行しようなどとはおもわなわないでください。--userオプションもご覧ください。
GIDにはグループ名または数値を渡すことができます。
localaddr (--localaddr=ip)
デフォルトでは、デーモンはそのマシンが持っているすべてのIP番号を監視します。この属性でサーバを指定されたIP番号に宣言することができます。
localport (--localport=port)
この属性はデーモンが監視するポートを設定します。デフォルトがないので、何らかの値を指定しなければなりません。
logfile (--logfile=file)
デフォルトではsyslog(Unix)またはイベントログ(Windows NT)にログメッセージが書きこまれます。他のオペレーティング・システムでは、ログファイルを指定する必要があります。特別な値"STDERR"は標準エラー出力にログを出力させます。詳細はNetをご覧ください。
mode (--mode=modename)
サーバは環境によって3つのモードで稼動することができます。

Perl 5.005で動かしていて、スレッド用にコンパイルしてあれば、サーバは接続毎に新しいスレッドを生成します。スレッドはサーバのRun()メソッドを実行し、終了します。このモードがデフォルトです。"--mode=threads"で、このモードにすることもできます。

スレッドが使えなくても、fork()を動かすことができるのであれば、サーバは接続毎に新しいプロセスを生成することで同じように動きます。スレッドがなければ自動的に、あるいは"--mode=fork"オプションを使えば、このモードが使われます。

最後に単一接続(シングル・コネクション)モードがあります。サーバが接続を受ければ、Run()メソッドに入ります。Run()メソッドが返るまでの間、(もしクライアントが切断すれば)他のコネクションは受け付けられません。例えばMacintoshのようにスレッドもfork()もなければ、この操作は便利です。デバッグのために"--mode=single"で、このモードにすることができます。
 
pidfile (--pidfile=file)
(UNIX only) もしこのオプションが指定されていれば、PIDファイルが指定された場所に作成されます。
user (--user=uid)
bind()した後、本当のそして有効なUIDを指定されたものに変更します。これは優先ポート(<1024)にサーバをバインドしようとする場合に便利です。しかしサーバをルートとして実行しようなどとは思わないでください。--groupと--chrootオプションもご覧ください。

UIDにはグループ名または数値を渡すことができます。(訳者注:ユーザ名の間違いだろうとは思いますが)

version (--version)
サーバの起動を止め、代わりにバージョン文字列を出力し、直ちにプログラムを終了させます。

構成ファイル

構成ファイルはRPC::PlServerNet::Daemon のものに、クライアント・リストにいくつかの属性を追加しただけのものです。

構成ファイルはPerlスクリプトです。ファイルの先頭には任意のPerlソースを入れることができます。例えば、最初にドラバをロードしたり(パフォーマンスをよくするのに有効です)、chroot環境を準備したりなど。

大事なことは、最後にname/valueの組み合わせによるオプションのハッシュ・リファレンスを最後に返すということです。指定できるオプションは上記に上げた通りです。

Net::Daemon と RPC::PlServer の全ての機能が適用できます。特に以下のものがあります:

ホストとユーザに依存したアクセス制限(Host and/or User dependent access control)
 
ホストとユーザに依存した暗号化(Host and/or User dependent encryption)
 
ポートへのバイディングの後のUIDとGIDの変更(Changing UID and/or GID after binding to the port )
 
chroot()環境での稼動(Running in a chroot() environment)
 

さらにサーバは問い合わせの制限を提供しています。以下のようなクライアント・リストを考えてみてください:

    'clients' => [
        { 'mask' => '^admin\.company\.com$',
          'accept' => 1,
          'users' => [ 'root', 'wwwrun' ],
        },
        {
          'mask' => '^admin\.company\.com$',
          'accept' => 1,
          'users' => [ 'root', 'wwwrun' ],
          'sql' => {
               'select' => 'SELECT * FROM foo',
               'insert' => 'INSERT INTO foo VALUES (?, ?, ?)'
               }
        }

そして、rootとwwwrunだけがadmin.company.comから接続し、任意の問い合わせを実行することができます。しかしwwwrunだけは他のホストから接続できますが、

    $sth->prepare("select");

    $sth->prepare("insert");

に制限されます。

これは実際には "SELECT * FROM foo'' や "INSERT INTO foo VALUES (?, ?, ?)'' になります。


作者

(原文のまま)

    Copyright (c) 1997    Jochen Wiedmann
                          Am Eisteich 9
                          72555 Metzingen
                          Germany
                          Email: joe@ispsoft.de
                          Phone: +49 7123 14881

The DBI::ProxyServer module is free software; you can redistribute it and/or modify it under the same terms as Perl itself. In particular permission is granted to Tim Bunce for distributing this as a part of the DBI.


参考資料

dbiproxy(1), DBD, DBI(3), RPC, RPC, Net, Net, Sys, Win32, syslog(2)


ホーム Perlの小技

ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。