FTPとFTPSでファイル転送

目次

Webページを作成したらWebサーバーへファイルをアップロードする必要があります。 ブログ用に借りたレンタルサーバーではアップロードにFTPとFTPSが使えるので両方試してみました。

FTPとFTPSでファイル転送

作成するプログは静的サイトのためデータベースもいらず複雑なものではありません。 無料のサービスでも良いのですが、動機づけのために有料のレンタルサーバーを使うことにしました。 契約したのは「さくらのレンタルサーバ ライト」で、FTP(File Transfer Protocol)とFTPS(FTP over SSL)が使用できますが、SSHやSFTPは使用できません。

知識としてFTPは危ないというのは知っているのですが、実際にどうなるのかは試してみたことが無かったので確認してみました。

FTPでファイル転送する

FTPでファイル転送を行うと平文、つまり暗号化されずそのままネットワークを転送されます。 試しにパケットキャプチャでファイル転送の様子を見てみました。。

転送ファイルはindex.htmlとします。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>My home page</title>
  </head>
  <body>
    <h1>Title</h1>
  </body>
</html>

パケットキャプチャはtcpdumpを使用しました。

$ sudo tcpdump -v -A -i eth0 host USERNAME.sakura.ne.jp

まずftpでレンタルサーバーに接続します。

$ ftp
ftp> open USERNAME.sakura.ne.jp
Connected to USERNAME.sakura.ne.jp.
220 ProFTPD Server (SAKURA Internet FTP Server) [::ffff:000.000.000.000]
Name (USERNAME.sakura.ne.jp:izumi): USERNAME
331 Password required for USERNAME
Password: パスワードを入力[USERPASSWORD]
230 User USERNAME logged in
Remote system type is UNIX.
Using binary mode to transfer files.

パケットキャプチャで通信の中身を見るとユーザー名(USERNAME)もパスワード(USERPASSWORD)もそのままやり取りされています。

20:28:08.992220 IP (tos 0x0, ttl 54, id 0, offset 0, flags [DF], proto TCP (6), length 89)
    xxxxxxx.sakura.ne.jp.ftp > ohishi-vm.48084: Flags [P.], cksum 0xab9a (correct), seq 72:109, ack 17, win 2063, options [nop,nop,TS val 2123230638 ecr 794434188], length 37: FTP, length: 37
	331 Password required for USERNAME
E..Y..@.6.0.;j.a..
k....(|.....w...........
~.../Z..331 Password required for USERNAME

20:28:32.332827 IP (tos 0x10, ttl 64, id 9221, offset 0, flags [DF], proto TCP (6), length 71)
    ohishi-vm.48084 > xxxxxxx.sakura.ne.jp.ftp: Flags [P.], cksum 0x1418 (incorrect -> 0x68d5), seq 17:36, ack 109, win 502, options [nop,nop,TS val 794457552 ecr 2123230638], length 19: FTP, length: 19
	PASS USERPASSWORD
E..G$.@.@.....
k;j.a.......w(|. ...........
/Zu.~...PASS USERPASSWORD

20:28:32.389942 IP (tos 0x0, ttl 54, id 0, offset 0, flags [DF], proto TCP (6), length 82)
    xxxxxxx.sakura.ne.jp.ftp > ohishi-vm.48084: Flags [P.], cksum 0xdff3 (correct), seq 109:139, ack 36, win 2063, options [nop,nop,TS val 2123254028 ecr 794457552], length 30: FTP, length: 30
	230 User USERNAME logged in
E..R..@.6.0.;j.a..
k....(|. ...............
~.I./Zu.230 User USERNAME logged in

putコマンドでファイルをレンタルサーバーに転送します。

ftp> put index.html

パケットキャプチャでファイル中身がそのまま見ることが出来ました。

20:30:57.966893 IP (tos 0x8, ttl 64, id 8389, offset 0, flags [DF], proto TCP (6), length 199)
    ohishi-vm.42935 > xxxxxxx.sakura.ne.jp.ftp-data: Flags [P.], cksum 0x1498 (incorrect -> 0x927b), seq 1:148, ack 1, win 510, options [nop,nop,TS val 794603186 ecr 4001209826], length 147
E... .@.@.....
k;j.a.....sf...m............
/\...}..<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>My home page</title>
  </head>
  <body>
    <h1>Title</h1>
  </body>
</html>

知識として知ってはいましたが実際にやってみるとFTPだとユーザー名、パスワード、転送内容がそのまま見えて外からも分かりやすいです。

FTPSでファイル転送する

FTPではネットワークでそのまま見ることが出来ましたが、FTPS(FTP over SSL)ではどうなるかやってみます。 転送ソフトにはFTPSに対応しているLFTPを使うことにします。

OSは"Ubuntu 20.04.2 LTS"です。

LFTPを設定する

lftpでFTPSを使うための設定を行います。 自分のホームディレクトリに".lftprc"ファイルを以下の内容で作成します。

set ftp:ssl-auth TLS
set ftp:ssl-force true
set ftp:ssl-allow true
set ftp:ssl-protect-list true
set ftp:ssl-protect-data true
set ftp:ssl-protect-fxp true
設定項目 説明
ftp:ssl-auth (string) AUTHコマンドのデフォルトをTLS(Transport Layer Security)にします。
ftp:ssl-force (boolean) trueの場合、サーバーがSSLをサポートしていないときに、パスワードを(暗号でなく)平文で送信することを拒否します。
ftp:ssl-allow (boolean) trueの場合、アクセスのためにSSL接続することを交渉します。
ftp:ssl-protect-list (boolean) trueの場合、ファイルリスト転送のためにSSL接続を要求します。
ftp:ssl-protect-data (boolean) trueの場合、データ転送のためにSSL接続を要求します。
ftp:ssl-protect-fxp (boolean) trueの場合、FXP(File eXchange Protocol)モードの2つのFTPサーバー間でのデータ転送のためにSSL接続を要求します。

サーバーに接続しファイルを転送する

コマンドlftp [-u user] [site]でサーバーに接続します。 サイトを指定した場合そのまま接続するのでopenコマンドは不要です。 FTPと同様にindex.htmlファイルを転送します。

$ lftp -u USERNAME ftp://USERNAME.sakura.ne.jp
パスワード: [パスワードを入力]
lftp> put index.html

パケットキャプチャは以下のように内容が暗号化されて見ることが出来ません。 ユーザー名、パスワード、ファイル内容がそのまま分かる状態で出てくることはありませんでした。

20:35:36.260316 IP (tos 0x0, ttl 64, id 19609, offset 0, flags [DF], proto TCP (6), length 62)
    ohishi-vm.48090 > xxxxxxx.sakura.ne.jp.ftp: Flags [P.], cksum 0x140f (incorrect -> 0xd90d), seq 7:17, ack 348, win 501, options [nop,nop,TS val 794881480 ecr 1046128303], length 10: FTP, length: 10
	AUTH TLS
E..>L.@.@..B..
k;j.a....*T.................
/`..>Z..AUTH TLS

20:35:36.283972 IP (tos 0x0, ttl 54, id 0, offset 0, flags [DF], proto TCP (6), length 77)
    xxxxxxx.sakura.ne.jp.ftp > ohishi-vm.48090: Flags [P.], cksum 0x304f (correct), seq 348:373, ack 17, win 2063, options [nop,nop,TS val 1046128319 ecr 794881480], length 25: FTP, length: 25
	234 AUTH TLS successful
E..M..@.6.0.;j.a..
k........*T......0O.....
>Z../`..234 AUTH TLS successful

<-- 中略 -->

20:36:26.784445 IP (tos 0x0, ttl 64, id 56080, offset 0, flags [DF], proto TCP (6), length 259)
    ohishi-vm.46855 > xxxxxxx.sakura.ne.jp.56647: Flags [FP.], cksum 0x14d4 (incorrect -> 0x180b), seq 452:659, ack 146, win 501, options [nop,nop,TS val 794932004 ecr 4294118008], length 207
E.....@.@.K...
k;j.a...G...3a./............
/a.$..
x..............:...\.?.{.I........9.....l0.y.....zd.z.......aQ...........O.......!..%c.x9.J.....OU1.d..o:...W...."@2w...[~GB.Xq..ch
A.......e .dN\..0Wvl.0K..p<M.l.s....K._..S..O.................l^.fbj. ..;...
20:36:26.796308 IP (tos 0x0, ttl 64, id 19634, offset 0, flags [DF], proto TCP (6), length 52)
    ohishi-vm.48090 > xxxxxxx.sakura.ne.jp.ftp: Flags [.], cksum 0x1405 (incorrect -> 0x3e6f), ack 7210, win 501, options [nop,nop,TS val 794932016 ecr 1046178799], length 0
E..4L.@.@..3..
k;j.a....*T.................
/a.0>[k.

これでパスワードやファイル内容を盗み見られることなくレンタルサーバーに転送できるようになりました。 他に安全なファイル転送にはSFTPやSCPがありますがライトプランでは使用できませんでした。