Q. Web ページの更新のためにインターネットから安全に ftp で接続すべく、
ssh の port forwarding を使おうと思ってはまりました。パスワードは
暗号化に成功しますが、データ転送の暗号化がうまくできません。
A. クライアント側の OS によって以下のような方法があります。
1) Unix
普通の ftp(1) を ssh(1) の TCP port forwarding でちゃんと動かすのは
面倒なので、hsftp(1) か sftp(1) を使うのがいいでしょう。FreeBSD では、
どちらも Ports Collection の ports/ftp/hsftp 及び ports/ftp/sftp にあ
ります。
hsftp(1) は、内部で ssh(1) と scp(1) のフロントエンドとして働き、コピー
などのコマンドは、ftp(1) とほとんど同じです。ただし ssh-agent(1) など
を使って、scp(1) をパスワード(パスフレーズ)の入力なしに実行できるよう
にしておく必要があります。
sftp(1) も hsftp とほぼ同様ですが、リモート側に sftpserv というプログ
ラムが必要になります。もし、リモート側にインストールされてなければ、
交渉して入れてもらうか自分で用意しましょう。なお、OpenSSH についてくる
sftp-server(8) は SSH Communications Security 社 の ssh (いわゆる
「本家ssh」) バージョン2 についてくる sftp に対応するためのもので、
ports/ftp/sftp についてくる「sftp サーバ」(sftpserv) とは別物です。
FreeBSD 4.2R からは付属しますが互換性はありません。ややこしいのは、
どちらも「sftp」を名乗っていることです。
ftp と比べるとサポートされているコマンドは少ないですが、
sftp> help
Supported commands are:
? help open close get mget put mput
cd pwd ls dir mdir mkdir rmdir rename
rm delete mdelete lcd exec quit exit bye
binary ascii image version
これぐらいのコマンドが使えます。これは、hsftp でもだいたい同じです。
また、ports/net/rsync を ssh 経由で使えばディレクトリの内容をまとめて
アップデートすることができます。
% rsync -auzvC --delete --rsh=ssh . user@server:public_html
2) Java
MindTerm を使えば,FTP-tunneling は簡単に出来ます。もちろん、Control
port (21/tcp) だけでなく Data port (default:20/tcp) も SSH 経由になり
ます。SCP の機能も入っているので,そちらを使ってもいいですが、Web ページ
の更新には FTP が使えたほうが便利です。
<URL:[moved?] http://www.appgate.org/products/mindterm/>
v1.2.1 までのライセンスは GPL ですが,v2 以降が GPL になるかどうか決まっ
ていないようです。v2 以降は SSH2 に対応します。2000年12月現在 v1.9.9pre2
が、バイナリのみ公開されています。
JAVA でインプリメントされているので,java1.1 以降に対応した JVM があれ
ば OS は問いません。こちらでは,Linux, Windows, Macintosh で動作する
ことを確認しています。
3) Windows
現在では MindTerm を使うのが一番簡単そうな方法ですが、TeraTermPro に
ttssh を組み合わせた環境では、scp 機能がないため次のような方法が用いら
れてきました。
3-a) 単純に scp をインストールして済ます。
<URL:http://www.jaist.ac.jp/~uchida-t/ssh/>
<URL:http://bmrc.berkeley.edu/people/chaffee/winntutil.html#sshnt>
3-b) Delegate を併用する方法です。
次の Web ページが TeraTerm + ttssh の使い方として、よくまとまってると
思います。この中で ftp については「書かないけど」の部分ですね。
<URL:http://www.netlab.is.tsukuba.ac.jp/~one/ssh/#H>
以下に [FreeBSD-users-jp 49239] を元に説明します。hostA がローカル側、
hostB がリモートホスト、[a],[b] は Unix では 1024 以上の空いてる port
ですが、Windows では 1024 の制限はないようです。以下の説明では [a]=21,
[b]=8021 としています。
hostA> ssh -L [a]:localhost:[b] -L [b-1]:localhost:[b-1] hostB
o メニューバー Setup → SSH Forwarding で以下のように設定
Local 21 to remote "localhost" port 8021
Local 8020 to remote "localhost" port 8020
o hostA から hostB に ttssh でログイン
hostB> delegated -P[b] SERVER=ftp://localhost:21/ RELIABLE=localhost
o hostB のプロンプトで delegated を実行
% delegated -P8021 SERVER=ftp://localhost:21/ RELIABLE=localhost
hostA> ftp -p localhost [a]
o hostA から localhost の port 21 に passive (PASV) モードで ftp 接続
Delegate は passive mode だと [b-1] にデータ転送用の port を用意して
くれるようです。このスレッドには書いてませんが、セキュリティ的には
delegated のオプションに TIMEOUT=900 ぐらいはつけておいたほうが吉だと
思います。
4) おまけ
SSL 対応の wu-ftp です。
<URL:http://www.average.org/ftp/wuftp+SSL/>
下記の URL に SSL 関係のリンク集がまとまっています。
<URL:http://www.infoscience.co.jp/technical/openssl/related/apps.html>
あと、ssh ではないですが Zebedee というのもあります。
<URL:http://www.winton.org.uk/zebedee/>
<URL:[BROKEN!] http://www.arekore.org/zebedee/>
グループ名: ssh