ロリポップ！のFTPサーバ用にLFTPを使って安全にファイル操作する

ロリポップ！レンタルサーバを借りました。ただし一番安いエコノミープランのため SSH が利用できません。そのためファイル操作は SFTP, SCP などでなく FTP や WebDAV に頼ることになります。今回は何となく FTP を選び、端末で利用可能な LFTP をクライアントに使いました。Web 上で利用可能なロリポップ！FTP という FTP クライアントや、FileZilla といった GUI ツールも利用可能ですが、コマンドで色々と自動化したい気持ちがあるので CLI ツールを優先しました。LFTP の使用方法や暗号化の設定などをメモします。

- 参考サイト
  - [lftp の使い方 - 雑多なプログラムメモ](https://hn-carter.sakura.ne.jp/posts/to-use-lftp/)
  - [LFTP でサーバ間でファイル転送をする #Linux - Qiita](https://qiita.com/akkykg/items/bea5f11587b75d3db2cc)

## 実行環境

- macOS Monterey 12.7.6
- Homebrew 4.5.2
- LFTP 4.9.3

## レンタルサーバの仕様

ロリポップ！レンタルサーバは月額 99 円から借りられる Web・メールサーバです。安さで選びました。ただその安さゆえ本当に仕様が簡素で、SSH が利用できません。FTP サーバ・FTPS サーバおよびそれらへのログイン用アカウントは用意されています。

## LFTP の紹介

公式サイト: [LFTP - sophisticated file transfer program](https://lftp.yar.ru/)

LFTP は、数ある FTP クライアントの実装の一つです。端末で利用可能です。FTP, FTPS, HTTP, HTTPS などなど様々な方法でファイル操作ができます。特に、FTP の TLS 通信に対応しているクライアントなので、パスワードの漏洩に関する不安が低減します。

## LFTP のインストールと実行確認

macOS なので Homebrew を使ってインストールしました。

```
% brew install lftp
```

下の図は、実行確認の様子です。

```
% lftp --version
LFTP | Version 4.9.3 | Copyright (c) 1996-2020 Alexander V. Lukyanov


LFTP is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with LFTP.  If not, see <http://www.gnu.org/licenses/>.

Send bug reports and questions to the mailing list <lftp@uniyar.ac.ru>.

Libraries used: idn2 2.3.8, libiconv 1.11, OpenSSL 3.5.0, Readline 8.2,
zlib 1.2.11
```

## LFTP の設定

FTP では TLS 暗号化により通信内容を秘匿することができます。Web サーバ用のファイルを傍受されるのはともかく、サーバログイン用のパスワードが漏洩したら目も当てられません。下記のように暗号化の設定をします。

ファイル `~/.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-force true` は特に重要です。これによって、平文でパスワードを送信しないようにしています。

## 接続とファイル操作

今回 FTP の利用目的は、ローカルマシン上の HTML 文書などを一括でアップロードすることです。よって対話的な使用方法ではなく、LFTP の処理をまとめたバッチファイルを作ります。

たとえば、バッチファイル `lftp_script` は次のような内容です。

```
open -u ftp-user ftp://ftp.lolipop.jp
mirror --only-newer --reverse _site/ htdocs/
```

これで、LFTP を次のように実行すると、パスワード入力（`open` コマンド）の後にファイルのアップロード（`mirror` コマンド）が走ります。

```
% lftp -f ./lftp_script
```

## 暗号化検証

Wireshark を使ってパケットキャプチャを行い、LFTP の通信が秘匿されていることを確かめました。
実行したコマンドは次の通りです。

```
% lftp -d -e "ls ; exit" -u ftp-user ftp://ftp.lolipop.jp
```

### 暗号化なし

![TLS暗号化がなくパスワードが見えている図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3965118/a4418385-97c7-45d0-a6f0-3146e069e32f.png)

`USER ****` や `PASS 1111` のように、通信パケット中に含まれる認証情報を誰でも見えてしまうことが確認できます。

### 暗号化あり

![TLS暗号化されてパスワードが現れない図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3965118/2cd04743-d46f-43af-a381-9de43cb3f475.png)

`AUTH TLS` から始まり、鍵交換やハンドシェイクが行われた後の通信は解析困難な Application Data として表示されています。`PASS` などの認証情報が現れていないことから、データは暗号化されて秘匿されていることが確認できます。

ご覧の通り、この TLS 通信は STARTTLS、すなわちサーバへ接続後に平文で TLS ネゴシエーションしてから暗号化通信に切り替わる方法です。サーバの設定次第では、サーバとの接続時を含めて全過程が暗号化される FTPS 通信も可能です。その際はサーバが FTPS 通信専用の TCP ポートで待ち受けていなければなりません。

## 感想

SCP や SFTP はいずれも SSH に基づく通信なので、これが利用できれば FTP の TLS 通信に気をもむことはなかったでしょう。普段使わない通信プロトコルでは、今後特に暗号化の有無に気を配っていきたいです。初歩的ですが SFTP と FTPS が全くの別物であることも意識できてよかったです。

---

この記事は筆者のブログより転載したものです。