1997年02月26日

Windows NT のディレクトリをUNIX のテープにバックアップ


samba の応用で、Windows NT の共有ディレクトリをUNIX 側のTape にtar でバックアップします。
テープ上のファイルデータはOS に保護されず無防備なので、 書き出す時に暗号化を施し、 パスワードなしでは読めないようにします。

私は試していませんが、ここで述べる話はWindows95 にもあてはまると思います。
Windows95 のノートパソコンのファイルをUNIX のテープへバックアップする参考にもどうぞ。

SAMBA について

SAMBA というフリーのすばらしいソフトウェアパッケージがあります。
UNIX マシンにSAMBA をインストールすると、Windows NT やWindows 95 からネットワーク経由でUNIX(もちろんLinux も含みます) 上のファイルへアクセスできるようになります。
SAMBA はUNIX をマイクロソフトLAN マネージャのサーバにしてしまうのです。

SAMBA の概要やインストールについては雑誌などでよく取り上げられていますね。 また、ホームページでわかりやすく解説されている方もいます。
佐藤文優さんの Japanized SAMBA Web Pages ではSAMBA ドキュメントの日本語訳やさまざまな関連リンクがまとめられていて、SAMBA の最新バージョンもわかります。

smbclient について

そのSAMBA パッケージには、UNIX から実行するためのクライアントソフトウェア(コマンド)smbclient が含まれています。
例えば、
  % smbclient \\\\NT_host\\D$
と実行すると、NT_host という名前のWindows NT マシンのD ドライブにつながります。
接続のためにはWindows NT のログオンパスワードが必要で、 コマンド実行後に入力を求められます。
上の例ではWindows NT のユーザ名を省略しているので、現在UNIX にログインしているアカウント名と同じ名前がWindows NT でのユーザ名ということになります。

上のコマンドを実行し、パスワードを入力するとsmbclient のコマンドプロンプトになります。

これはftp コマンドでUNIX からWindows 側に接続したことと似ています。
ftp コマンドで、プロンプトからls, put, get などとするように、smbclient のコマンドプロンプトからls, put, get などでファイル操作を行えます。

SAMBA を用いてUNIX のディレクトリをWindows にマウントすると、 ファイルマネージャなどからUNIX 側のファイルにアクセス(UNIX がサーバ)できました。
それとは逆に、smbclient を実行した場合はUNIX からWindows のファイルを操作できる(UNIX がクライアント)のです。

smbclient のtar 拡張

sambatar というパッチセットがSAMBA パッケージに寄贈されました。
当初はSAMBA のanonymous FTP のcontrib ディレクトリにあり、 オプションとしてユーザがSAMBA 本体にあてるパッチとして分かれていました。

最近はSAMBA 本体に吸収されているのでパッチ作業を行わなくても、 普通にmake するとsmbclient にtar 機能が拡張されます。

tar 拡張機能は次のようなものです。
tar コマンド相当の機能は外部のtar コマンドを呼び出すのではなく、smbclient コマンド内部に実装されています。

smbclient のtar 拡張コマンドは、次のように使用します。
  ----------------------------------------------------------------------------
  % smbclient \\\\NT_host\\D$                <-- smbclient コマンド実行
    Server time is Sun Jan 19 20:21:12 1997
    Timezone is UTC+9.0
    Password:                                <-- パスワードを入力する
    Domain=[PROJECTX] OS=[Windows NT 4.0] Server=[NT LAN Manager 4.0]
    smb: \> cd project                       <-- バックアップしたいディレクトリ
    smb: \project\> tar c /dev/st0
  ----------------------------------------------------------------------------

この例では、NT_host というマシンの共有ドライブ D に接続し、D:\project ディレクトリに移り、サブディレクトリを含むそこ以下の全てのファイルを UNIX(Linux) 側のテープ(/dev/st0)に書き出しています。

Windows 側ファイルのリモートバックアップ

もしWindows NT マシンにテープ装置が接続されていれば、NT 標準のバックアップツールでレジストリやファイルパーミッションも含めてバックアップできます。

ネットワークで接続されたUNIX マシンにしかテープ装置が接続されていない場合は上記の方法でUNIX 側からNT のファイルをバックアップ可能です。

SAMBA ではsmbtar という名前のシェルスクリプト が提供されているので、そちらの方が扱いやすいという方も多いでしょう。
(smbtar は内部でsmbclient のtar 拡張コマンドを実行します)

でも、私には次の不満があるのです。

テープに書く時は暗号化したい

標準tar フォーマットで書いたテープは誰でも簡単に読めてしまいます。
大切なプロジェクトのソースファイルや暗号化用のシークレットファイル、 (UNIX のファイルですが)シャドーパスワードファイルなど、 他人に見られたくないファイルがあります。
これらがディスクにあるうちはパーミッションで保護したり、 もし他人にのぞかれてもOS に残したログで見られたことが分かります。
でも一旦テープに書き出すと、OS のファイル管理は届かなくなり、 こっそり盗まれても分からなくなります。

テープを鍵のかかるロッカーにしまうのですか?
それもいいことですが、 最近はピッキングツールとよばれる道具が通信販売で簡単に入手でき、 大抵の鍵が簡単に開いてしまう そうなのです。
バールでこじ開けられるとテープを見られたことが分かりますし、 そうまでして他人のファイルを盗む人はなかなかいないでしょう。 大きな音も出ますしね。
でも、ピッキングツールがあると安易にやられてしまうと思うのです。

だから私は大切なファイルをバックアップする時は、 必ずテープに暗号化して行っていました。
でもNT 単体では標準ツールの範囲でそれが今まで行えなかったのです。

UNIX 上のファイルの暗号化バックアップ

ちょっと脱線します。

UNIX(Linux) の場合は暗号化バックアップは簡単です。
次のようにします。
 ------------------------------------------------
  % tar cvf - ./project | crypt | dd of=/dev/st0
 ------------------------------------------------
crypt というコマンドは標準入力のデータストリームを暗号化して標準出力へ吐き出します。
(crypt コマンドによる暗号化はあまり高度なものではありません。 もう少し複雑なアルゴリズムで暗号化を施すdes コマンドというのがあります。 フリーのdes のソースを入手しmake できたので興味のある方は こちらをご覧下さい。)

上の組合せコマンドを実行すると、crypt が暗号化に使用するパスワードを入力するように聞いてくるので、 他人に類推されないような8文字以内のパスワードを指定します。

テープから読み出す時は次のようにします。
 ---------------------------------------
  % dd if=/dev/st0 | crypt | tar xpvf -
 ---------------------------------------
この場合もやはりcrypt が暗号を戻すパスワードを聞いてくるので、 暗号化する時に入力したパスワードをキーボードから入力します。
crypt 内部では、暗号化と暗号化解除の区別がないので、gzip を展開する場合のような -d とかの特別なオプションはありません。

ところで、Slackware などのLinux のインストールパッケージではcrypt コマンドが含まれていません。
sunsite のファイルが収められたInfoMagic LINUX Deveropers Resource にpdcrypt というパブリックドメイン (という言葉は日本のパソコン通信ではよくないとされていますが、pdcrypt には自らそう書いてあります)のソフトウェアがあり、 それをインストールして使っています。

このcrypt はSUN やSGI IRIS のcrypt と互換性があります。
もし会社の仕事をテープで持ち帰る必要があればSUN で暗号化し、自宅のLinux で復号化できます。 電車にカバンを置き忘れても会社の秘密はまもれます。

smbclient tar コマンドとcrypt を組み合わせる

ということで、UNIX ファイルの暗号化バックアップは簡単でした。
Windows NT 上のファイルの場合はUNIX 側からSAMBA のsmbclient tar 拡張をうまく使ってcrypt を通してからテープに書き出します。
スクリプト例
---------------------------------------------------------- 1: #!/bin/sh 2: echo "first 15seconds, enter SMB password(No prompt)" 3: echo "Afer that, enter crypt key(with prompt)" 4: ( 5: echo "cd project"; 6: echo "tar c -"; 7: echo "quit"; 8: )| smbclient \\\\NT_host\\D$ -E | \ 9: dd bs=10 skip=1 |\ 10: (sleep 15; crypt > /dev/st0) ---------------------------------------------------------- (先頭の行番号は説明のためにつけたものです)
5行目バックアップしたいディレクトリへ移動
6行目 clitar.c を見ていると、tar サブコマンドのファイル名に"-" を指定すると データが標準出力に出ることがわかりました。
8行目-E オプションでsmbclient のメッセージが標準エラー 出力へ出されるようになります。
これがないとtar のデータと混ざってしまいます。
9行目NT の接続パスワードプロンプト(10bytes)が標準出力へ 出てしまうのでdd コマンドで捨てています。
10行目crypt の暗号化パスワード読み込みがNT のパスワード入力と重なりうまく入力できなくなるので、crypt を始める前に15sec 遅延させています。
/dev/st0 はテープのデバイスファイルです。

このスクリプトを実行してから、NT のパスワードを15秒以内に入力し、 crypt のパスワード入力要求が出てから暗号化に使用するパスワードを入力します。

もちろんsmbclient コマンドの引数にNT のパスワードを直接書き込んだり、 crypt コマンドの引数にパスワードを直接書き込むとスクリプトは簡単になります。
でもセキュリティー上、パスワードをファイルに書くわけにいきませんね。

(注意)
  1. テープに書き込むデータは暗号化されますが、ネットワーク上には裸のデータが 流れます。
  2. 上の例では、crypt に指示したパスワードはネットワーク上に流れません。
    ところが、smbclient でWindows に接続する時のパスワードがネットワーク上に流れています(-_-)。

(1997/01/21 追記)

samba-1.9.15p8 など、バージョンの古いsmbclient tar 拡張ではサブディレクトリ以下がうまく転送できない 問題があるようです。
私はsamba-1.9.16p7 でうまく動作しています。

このバージョンで、samba-1.9.16p7/source/Makefile でLinux 用のFLAGSM に-DREPLACE_GETPASS を立ててmake するとWindows NT 用のパスワード入力要求プロンプトがstdout ではなく、/dev/tty に出るようになります。
つまり、プロンプトをカットするためのdd を省くことができます。

この場合は上記サンプルスクリプトは次のようになります。
スクリプト例
---------------------------------------------------------- 1: #!/bin/sh 2: echo "first 15seconds, enter SMB password" 3: echo "Afer that, enter crypt key" 4: ( 5: echo "cd project"; 6: echo "tar c -"; 7: echo "quit"; 8: )| smbclient \\\\NT_host\\D$ -E | \ 9: (sleep 15; crypt) | dd of=/dev/st0 ----------------------------------------------------------
前のスクリプト例では10bytes ごとにdd でバッファリングしていました。 この例ではPassword:プロンプトがパイプで流れてこないので10byte スキップのためのdd がいらなくなり、変なバッファリングから解放されました。
パフォーマンスも改善されます。

また、crypt > /dev/st0 というふうにテープデバイスに直接書くのは気持ち悪いので、 こちらはdd で書くようにしています。

わたし流のLinux
AT互換機とLinux