> ホーム > ネットワーク > FTP の話。

FTP の話。

Table of Contents

FTP って実は奥が深いんすね。知りませんでした。と同時に FireWall との相性の悪さも知りませんでした。何気なく使っていたもので。いやお恥ずかしい。

今回も、脱初心者向けをいいことに抽象的な話で解説したあとに、いきなり技術レベルが上がります。なんか、悪いクセだなぁ。

2001.11.

ネットワーク越しのファイルの移動

ファイルを移動する。

この言葉が表すことのできる「移動」には

という意味があります。また、このマシンからあのマシンへ移動する場合には

というがあります。ネットワークの移動には

があります。インターネットを介した(あるいはインターネットプロトコルを利用した)移動には

で、ここでは FTP の話です。

要するに FTP とはネットワークを介してファイルを転送するための”一つの方式”のことで、名前もそのものずばり File Transfer Protocol と言います。

FTP の特徴

FTP は、インターネットで最も伝統的に使われているファイル転送方式(プロトコル)です。ちょっとその特徴を整理しておきましょう。

転送先のディスクの一部にアクセスしている

FTP ではネットワークを介して別なコンピュータのディスクの一部にアクセスし、そこにファイルを保存したり、その中のファイルを削除したり、ディレクトリ(フォルダ)を作ったりすることができます。(属性の変更もできますが。)

これは言ってみればネットワーク越しにもう一つハードディスクが増えたようなもなので、例えばメールの添付ファイルで相手にファイルを送ったり、あるいはメッセンジャーの機能を使ってファイルを送ったりすることとは根本的に異なります。メールやメッセンジャーで相手にファイルを送る場合は、送り先のディスクの様子は分かりませんから。

OS とネットワークを限定しない

相手側の機械のディスクの一部(許可されたディレクトリ以下)にアクセスして読み書きができるという意味では LAN 内の共有フォルダと同じです。しかしこの共有フォルダというのは基本的には OS 固有の機能ですし、原則的に LAN 内でしか使えません。つまり、Mac なら Mac 同士、Windows なら Windows 同士、しかも近くのコンピュータとしか共有できない、という制限があります。(Windows NT Server や UNIX、エミュレータなどがあればこの限りではありませんが。)

それに対して最初から FTP はインターネット用のプロトコルですから、利用できるネットワークや OS には制限はありません。

(実は共有フォルダはインターネット越しに見えたりもするのですが、この動作が果たして正しいのか、あるいはセキュリティ的にどうなのかということはよく分かりません。とは言え、最近では LAN の FireWall でカットするところが多いみたいですが。)

クライアントサーバ

FTP が他の方式と違うもう一つの特徴は、

クライアントとサーバがやり取りするものである

ということです。

図を見れば一発で分かる(と思う)のですが、他の方式は「誰かさんの機械(クライアント)」とファイルのやりとりを行うのですが、FTP は「みんなのものであるサーバ」とファイルのやりとりを行うものなのです。

サーバというのは基本的には24時間不眠不休で働き続けます。つまり、相手の機械が動いているかどうかを気にする必要がまったくないということです。ちょっと乱暴に言えば LAN 内にある「みんなの共有フォルダ」がインターネットからも利用できるようになったようなものです。

そしてもう一つ、他の方式では両方(クライアントAとクライアントB)で同じソフトを使ってファイルのやりとりを行うものが多いのですが、FTP ではクライアントとサーバでは全然違うソフトを使いますし、おかげでセキュリティを細かく設定することが可能です。

(具体的なサーバの話はこの際気にする必要はないと思います。サーバの話が分かる人はこんなの読んでないでしょう。)

FTP と HTTP

FTP をどういうときに自覚的に使うか、っちゅーと、ホームページをサーバに載せるとき、というのがこれを読んでいる人にはいちばん多いと思います。

実は、ホームページというのも、基本的にはどこかのハードディスクの中身の一部を見ているものなんです。見るときに、HTML というファイルの内容や画像を自動的に解釈して表示するソフト(つまりこれがWWWブラウザ)を使っているだけで、自動的に表示しないソフトを使った場合や、サーバの設定によっては Explorer や Finder と同じようにファイルの一覧がダラダラと出てくるものなんです。(ま、実際に作ってみた人は分かっていると思いますが。)

例えばホームページのデータに、FTP でアクセスする場合と HTTP で(WWWブラウザで)アクセスする場合を図に示すとこんな風になります。

同じ場所にアクセスしていても、使っているプロトコル(=通信の仕方。この場合は FTP と HTTP。)と使っているソフトによって見え方、できる操作が変わってくるのです。


やってみよう

まずは FTP というプロトコルでサーバにアクセスするためのソフトを用意します。IE 4 以降をインストールした Windows では IE がその代わりになりますが、より便利に FTP を使おうと思ったらやはり専用のソフトを用意した方がよいでしょう。

こういうソフトは FTP サーバに対して FTP クライアントと呼ばれます。単に FTP ソフトと呼ぶとサーバかクライアントか分からなくなってしまうので、(多くは文脈で分かるのですが)より明確にするためにクライアントと呼んでください。別にかっこつけてるわけじゃないんです。ネットワーク関係の話は接続の経路や方向によって誤解が生じやすいので適切な言葉を使うようにした方が無難です。(ファイルのアレとか言われても何がなんだか分からないのです。)

Win Mac

辺りが有名な高機能ソフトでしょうか。(この辺の選定は人によって異なるでしょうけど。)残念ながら、Mac にはフリーソフトはありません(;_;) (ふるーい Fetch はフリーですが。)かなり重要なアイテムだと思うんですけどねぇ。あるとすればそれは OS X 用のコマンドラインソフトになります。(実は Windows にも最初からコマンドラインの FTP がついてくるんですが、passive mode に対応していないので除外しました。)

使い方

認証が必要

まず何よりも

の設定が必要です。この辺はメールの設定と同じですね。アクセスするサーバ、そのサーバに認められているユーザー名とパスワードの情報が必要です。RootFTP というソフトだと以下のように設定します。基本的にどのソフトでも似たような感じだと思います。

「アドレス」は ftp://abcde.fgh.com/directory/ の abcde.fgh.com の部分です。ユーザー名、パスワードは、管理者(or プロバイダ)に言われたものを入力します。自分以外の人間が同じマシンを使うことがないのであればパスワードは保存しておいて構わないでしょう。

Mac の Fetch だとこんな感じ。

anonymous FTP

FTP は基本的には上のようにユーザー認証を必要とするものなのですが、誰でも利用できる anonymous FTP(匿名FTP)というものもあります。これは

ユーザー名anonymous
パスワード(自分のメールアドレス)

で利用するものです。

FTP はユーザー認証を必要とします。逆に言うと、サーバにユーザー登録しないと基本的には使えないものなのです。しかし、プログラムやドキュメントの配布など、不特定多数の人に FTP でのアクセスを許可したい場合はいちいち登録なんかしていられません。そこで anonymous FTP の登場です。

最近では一方的な配布に関してはなんでもかんでも HTTP で行う場合も増えていますが、大手のサイトなんかは FTP がやはり多いので、知っておくと便利です。(大手のサイトはユーザーもパスワードもデタラメなアクセスであってもそのまま許可してしまうとか、CGI などの仕掛けを用意してアクセスさせることも多いのですが。)

ASCIIモードとバイナリモード

FTP でのデータ転送には二つのモードがあります。一つは ASCII モード、もう一つはバイナリモードです。

ASCII モードはテキストモードとも呼ばれています。(たぶん。)要するにテキストファイルを転送するためのモードで、テキスト独自の「改行」というものを処理できるモードです。

ASCIIモードが必要になってくるのはテキストファイルをサーバのプラットフォームに適した形にする必要になるときです。どういうときかというと、プログラムとして動作させる、あるいはプログラムのコードとして認識させる必要があるときです。例えば CGI 用のスクリプトを転送するときとか。

伝統的には転送時に binary コマンドや ascii コマンドを打つんですけど、最近は拡張子別に ASCII やバイナリでの転送を自動で分けてくれるソフトが多いので、最初にちょっと設定してあげれば、あとは特に意識しなくても使えると思います。

逆に言うと、ASCII モードだと改行コードの変換が間に入るため遅くなりますし、テキストファイルじゃないものを転送した場合はファイルを壊す可能性もあります。個人的には CGI スクリプトなど、改行コードの違いが動作に影響を与える可能性がある場合を除いて、すべてバイナリモードでいいような気がしていますし、スクリプトはサーバのプラットフォームの形式を自分の手元で編集すればいいんじゃないかと思うんですよね。例えば EUC + LF の形式で編集できるエディタを用意すればそんで済む話じゃないかと。

MacBinary と拡張子の処理

FTP というものは本来、単にファイルを転送するだけのプロトコルです。その転送したファイルの中身がどうだとか、そんなことは知ったことではないというのが基本でした。

しかし Mac の場合は一つやっかいな問題があります。それがデータフォークとリソースフォークの2つの情報を持つことができる Mac 独自のファイルシステムです。手っ取り早く言うとアイコンの情報とか、どのソフトで作ったかなんて情報を、そのファイルの中身とは別に保つことができるのは Mac 独自の仕掛けでして、他の OS ではそんな芸当はできません。(Windows ではまったく違う考え方で少しだけ似た機能を実現しているにすぎません。)特にインターネットの形成に大きな役割を果たし、サーバとしての多くの稼動実績を誇る UNIX の世界にはそんな考え方はありません。

そこで他のシステムにファイルを持っていっても Mac 独自の情報を保つための工夫が考え出されました。それが MacBinary です。(ファイルの先頭128バイトの情報を MacBinary と呼ぶこともあります。)

MacBinary という形式を使うと他のファイルシステムでも Mac 独自の情報を保つことができます。(ただし、もちろん Mac 以外のプラットフォームではこの情報は役に立ちません。)つまり、FTP サーバに、「Mac のソフトなどを載せる場合は」この MacBinary というパッケージ方式を使うといろいろ嬉しい、ということです。

逆に、Mac だけでそのファイルを活用するわけでない場合は、この MacBinary という方式を使っちゃダメです。例えばホームページのデータを転送する場合は、テキストファイルはプレーンなテキストファイル、画像は余計な情報を持たない画像でないと困るのです。そこで使うのは例えば Fetch では Raw Data と呼ばれる形式です。

ただ、この辺、ソフト自身で細かく設定するというよりは、Internet Config を使って拡張子というかファイルの種類ごとに設定していくのが Mac の流儀のようです。Internet Config の設定を流用する形になっているソフトが多いです。

参考までに BinHex は 7ビットでのテキストエンコード形式で、これをメールの添付ファイルに使うソフトもあります。(たぶん Mac 用のメールソフトではほとんど全部可能でしょう。)AppleSingle は Base64 の(つまり 6ビットの)テキストエンコード形式で、ともに Mac 独自の情報を保つことが可能です。

参考

Macintosh と Windows ファイル送信の掟
http://homepage1.nifty.com/glass/tom_neko/web/web_02.html#MacBinary

より快適に

ミラーリング

ミラーリングってのは mirroring、つまり、鏡写しにそっくりなものを作るってことで、転じて2つのディスク(あるいはディレクトリ)の内容をそっくりにすることを意味します。

例えばあるファイルが更新され、あるファイルが削除された場合、普通にデータをコピーするだけだと「更新」しか正しく反映されません。そりゃそうです、コピーというコマンドに削除という意味はありませんから、いかにファイルが古かろうが、削除コマンドを使わない限り、もとのファイルが消えてしまうことはありません。

そこでミラーリングです。前にこのファイル作ったけど、もういらないや、こっちのファイルは更新したから改めて転送しなきゃ、というのをいちいち考えなくても、一発で自動的に行ってくれます。最近の FTP クライアントならたいてい使えます。

chmod

サーバとしてよく使われる UNIX では、読めるファイル、書き込み(および削除)できるファイル、実行できるファイル、という属性があり、またその属性はそのファイルの owner、同じ group に属している人、other の3階層のユーザーについて指定できます。

特に意味があるのは実行できるという属性で、UNIX では Windows や Mac と違い、この設定をしないとどんなソフトも実行できるようにはなりません。

で、何に使うのかというと、CGI かなぁ、やっぱり。CGI ってのは WWW サーバと実行プログラムの橋渡しをする仕組みなのですが、この CGI という仕組みを利用して実行するプログラムを自分の Windows や Mac で作っている場合は、サーバにそのプログラムを送ったあとに、サーバ上で実行できるように実行属性をつけてやらないといけないのです。以前はこの作業は FTP とは別に telnet で作業させることが多かったのですが、これも最近のソフトではたいてい対応しています。

漢字コード変換

すでに触れたように ASCII モードでは改行の変換が行われるのですが、それに加えて文字コードも変換してくれるという機能のついている FTP クライアントもあります。

個人的には変換に時間が掛かるよりはいろんな文字コードを扱えるエディタを使えばいいんじゃない?という感じなのでこの機能はあっても使いませんが。

ファイル名の変換

中にはこういう機能を持っているソフトもあります。ちょっと余計なお世話という感じがしないでもないのですが、Windows や Mac を使っているとファイル名の大文字小文字に無頓着になりがちなので、あった方がいいのかもしれません。

どういうことかというと、例えば Windows や Mac ではファイル名の大文字小文字を区別しないのに UNIX では区別するので、例えば Windows で作ったホームページをいざサーバに送ったら全然リンクが正しく機能しないとか画像が出ない、といったことが起こるのです。これを回避するときに便利です。

マルチスレッド

ちょいと細かい話ですが、FTP というのは離れたマシンとのファイルのやりとりを行うため、例えば Explorer や Finder 上でファイルを移動するのと違い、それぞれの操作にけっこう時間が掛かります。

しかし、Explorer や Finder に慣れてしまうとこの間(ま)が苦痛です。そこでファイルの転送、ディレクトリの移動といった動作を別々なスレッドで動作させるという工夫がなされているソフトがあります。この工夫をしてくれると、実際の作業時間がそれほど短縮できなくても、いくつもの動作を同時に行ったり、あるいはキャッシュと組み合わせて同時に行っているように見せかけることができるため、体感速度が上がります。つまり、ネットワーク越しのファイルの転送、移動の操作時のストレスを減らしてくれるのです。もちろん、他の理由でマルチスレッドにしているものもあるでしょうけど、フツーに使う分にはこの体感速度のメリットがいちばん大きいでしょう。

ファイル転送のセキュリティと今後

てな感じで紹介してきた FTP ですが、この FTP というプロトコルは今じゃセキュリティの問題がずいぶん明らかになってきています。

いちばんの問題は「パスワードが漏れやすい」ということでしょう。インターネットは互助会バケツリレー方式なので自分の機械とサーバの間にいろんな装置が介在します。このとき、途中の機械をいじれる誰かがパケット(通信データの断片。これが基本単位。)を監視、覗き見するするソフトを動かしていたら、割と簡単にパスワードを盗むことができてしまうのです。(それなりに根気はいりますが。)

ま、普通の人はそんなことをするスキルはないし、スキルはあっても普通の管理者はそんなことしてるヒマがありません。たいていは大丈夫なのですが、一部の、スキルもヒマもあるけどモラルのない人たちはそういういたずらをしている可能性があります。

まー FTP のパスワードがばれても FTP サーバに載せている情報を盗まれたり壊されたりするくらいなので、例えば FTP をホームページの更新にしか使っていないのであればその中身はホームページのデータでしかなく、その情報はすでに公開されているものなので致命的な被害はないと言っていいでしょう。(それでも公的機関や会社のホームページの場合は信用問題ですけど。)自分のマシンの中にオリジナルのデータを持っていれば復旧も楽ですし。

だいたい、素人のホームページを改ざんしたところでクラッカー的な名声は上がらないので、ちょっとでも賢い人はそんなことはしないのです。つまり、個人で楽しんでいる程度のホームページの場合はあんまり神経質になる必要はないってことです。名声の上がらないような個人的なクラックの場合は、逆に犯人の特定が比較的容易ですしね。(ネットワーク技術的なものもありますが、人間関係から割れるということです。実際、犯罪として検挙される例はだいたい関係者の内部犯行です。)

個人で楽しんでいるホームページの場合、掲示板に現われる荒らしとかの方が具体的で怖いでしょうね。対応に追われるとかなり精神的にもつらいもんがありますし。

ですがどうしても仕事で使うデータをネットワーク越しにやりとりしたい、という場合もあります。こういう場合は確かに FTP はセキュリティ的に不安です。そこで、暗号化を考えます。

* 以下に挙げる方法は、PGP 以外はサーバ側が対応していないと話になりません。で、たいていのプロバイダでは対応していないので、自分でサーバを立てられる人以外にはあまり関係ないかもしれません。でも恐らく今のプレーンな FTP は徐々に淘汰されていくような気がします。こういう単語を今から知っていても損はないんじゃないかと思います。

まずはやりとりするファイルそのものを保護

ZIP ファイルや PDF などにはファイルを開くときのパスワードを設定する機能があります。この機能を使って、ネットワーク上を転送させるファイルそのものをガードしておくのは、お手軽に使えるいい方法だと思います。もちろん、この場合は何らかの安全な手段でパスワードが相手に伝わっている必要があります。

PGP

PGP は簡単に言うとメールを暗号化し、信用できる相手とだけその内容がやりとりできるようにした仕組みです。この場合は PGP に対応しているメールソフトを使って、PGP 関係の操作さえ分かればいいので、サーバ管理のスキルが必要なく、比較的楽に導入できます。(でも実はメール受信用のポピュラーな POP3 というプロトコルもパスワードが漏れやすいんですが(^^;

ここで暗号化できるのは特定の相手へのメールの内容だけで、例えばメールの送受信そのものを暗号化することはできません。先ほどと同じように通信そのものを監視されていた場合は、メールのパスワードは盗まれてしまいます。APOP というプロトコルで認証できる場合は、パスワードは盗まれにくくなりますが、やっぱり通信そのものは暗号化できません。

また、あんまり大きなデータのやりとりにはメールは不向きですし、例えばあとから参加者が増えた場合、同じデータを送り直さなければいけないのはけっこう面倒です。送受信時に手間が増えるのもウケがよくないですし、自分用の PGP の鍵を自分で作らなきゃいけないのはちょっと面倒です。

でも、ファイルをやりとりするのが2人〜少人数の場合はなかなかいい方法だと思います。安全です。

SSH port forwarding FTP

FTP の通信を暗号化する方法があります。正確には FTP の通信を、別の暗号化した通信の中に通す方法です。

この暗号化に使うのは SSH(Secure SHell)という技術です。もともとは(POP3 や FTPと同じく)パスワードなどの通信が素の状態でネットワークを流れる telnet というものを暗号化したもので、これを使うと安全にコマンドラインを使って離れたところにあるマシンを操作することができる、というものです。

で、この SSH にはコマンドラインで他のマシンを操作することの他に、他の通信をスルー(forward)する機能がありまして、これを使うことで SSH の暗号化機能をほかの通信でも使ってしまうことができるのです。

細かいことは端折りますが、クライアントとサーバの両方に FTP の機能と SSH の機能を利用するソフトウェアがインストールされていて、適切に設定されていれば、この方法が使えます。

FTP を使うときに必ず SSH と FTP の両方のソフトが必要なので、面倒ですけどね。FTP クライアントは passive mode に対応したものが必要です。あまり古いソフトとか簡易版のようなソフトでは無理です。SSH クライアントはいくつものポートを転送することができるクライアントが必要です。1つだけだと認証やコマンドのやりとりに使うポートしか転送・暗号化できません。(だから Mac の場合は MindTerm 以外はダメかな。だとすると 68 Mac はダメですね。ちょっと残念。)

SCP

SSH の暗号化機能を利用したファイルのコピーに SCP(Secure CoPy)というものがあります。これは rcp という、離れたマシンへファイルをコピーするプログラムを暗号化したものなのですが、これが SSH の中の機能として実装されています。

つまり、SSH サーバの動いているマシンへは、SCP というプログラムでファイルを送ることが可能です。逆に言うとファイルの送りたいサーバに、FTP ではなく SSH サーバが動いている必要があります。FTP サーバが動いていても、SCP を利用することはできません。

また、SCP はあくまでファイルのコピーを目的としたプログラムなので、FTP のようにファイルの一覧を取得したりする機能はありません。そういう操作は SSH から普通に UNIX のコマンドを使うことになります。したがって、ちょっと普通の人には使いにくいと言えます。

ただ、Windows では WinSCP というソフトがけっこういいデキでして、これを使えば FTP のような感覚で SCP を使うことができます。うまく SSH の部分を隠して GUI でファイルの転送が可能です。MacOS にはこれに近い感じで使えるフリーの SCP ソフトはなさそうです。SSH のソフトはいくつかあるので、これでコマンドラインを叩きながら SCP でファイルの転送を行う必要があるみたいです。

OS X 用には RBrowser というソフトがあります。とは言え、OS X は中身は UNIX ですから、実は SCP もこのあと触れる SFTP も最初からコマンドとして持っています。あとは GUI の部分を作るだけなんですよね。こういうネットワーク関係のソフトは断然 OS X の方が作りやすそうです。安定性とスピードの両立、アプリの対応などもそろそろこなれてきているようだし、Mac もいよいよ新しい時代に入ってきている感じですね。

SFTP

いずれ FTP はこの SFTP に取って代わられるのかもしれません。SSH の暗号化通信の機能を使った Secure FTP というやつです。(やろうと思えばデータの圧縮も行えるので、今までより速い通信ができるかもしれません。)感覚的には今までの FTP と同じように使えます。

ただ、GUI のクライアントがまだ Windows に1つ、Mac OS X に1つくらいしかありません。(UNIXは調べていません。)しかもまだまだ練れていない。コマンドラインではすでに十分に実用段階だと思うのですが、まだまだ普及しているとは言えませんね。

しかも上の SCP もそうなのですが、SFTP も SSH の一部として実現されているので、サーバとしては SSH サーバを導入する必要があります。SSH は先に触れたように telnet を置き換えるコマンドライン環境ですので、SSH サーバを入れるということは、UNIX OS そのものの操作環境をユーザーに提供するってことです。

これはサービスとして提供するプロバイダには、導入を躊躇させる要因であるような気がします。仲間内で自分たちの立てた UNIX サーバを安全に遠隔地から利用するっていうんならともかく、インターネットサービスを提供する立場の人間からは、なんでもかんでも SSH というのはちょっと都合が悪いような気がします。SSH のユーザー認証と SFTP のユーザー認証を分離できるようにしないと、あんまりプロバイダで使えるようにはならないかもしれません。

でもまぁ、時代はブロードバンドだって言いますし、インターネットはいい意味でも悪い意味でも個人のものになってきたんじゃないかと思います。本当にやりたい人は自分でサーバ借りたり立てたりしてやればいい、と。確かにたいていの人にとって FTP ってのはダウンロードだけできればいいシロモノですもんね。

参考

たくさんすぎて分からない。SCP, SFTP の辺りは英語のページ多数。SSH で FTP のコマンドポートを forward するのは日本語ページも多い。大学関係とか。