ファイル転送とは?
概要
まずはファイルサーバーとファイル転送サーバーの違いについて確認しましょう。
ファイルサーバーはネットワーク上の他のコンピュータからアクセスできるファイルやデータを保存・管理するためのサーバーです。また、物理的なサーバーの意味として使われることもあり、その場合ファイルサーバーは高性能なハードウェアと専用のサーバーOSを備えており、企業や組織で広く使用されている専用コンピュータを指します。ファイルサーバーは柔軟性が高く、アプリケーションのインストールやカスタマイズが可能で、データベースやバックアップソリューションなど、多目的に利用できます。一方、ソフトウェアとしてのファイルサーバーを指す場合、Linuxで動作する代表的なツールはsamba、NFS、WebDAVなどがあります。
一方でFTPサーバーに代表されるファイル転送サーバーはファイル転送プロトコルを使用してファイルを送受信するためのサーバーです。主にファイルの転送(アップロードおよびダウンロード)に特化しています。一般的にはユーザーはクライアントソフトウェアを使用してサーバーに接続しファイルを転送します。FTPサーバーをファイルサーバーと誤解してしまう方がいますが、FTPサーバーはあくまでファイル転送機能を提供するものであることにご注意ください。本記事ではこのファイル転送サーバーについて解説していきます。
プロトコル
続いてファイル転送用のプロトコルを見ていきましょう!ファイル転送のプロトコルはFTPを思い浮かべるかもしれませんが、FTPだとデータ転送が暗号化されていないため危険です。そこで安全にデータ転送を行う仕組みとしてここではFTPS、SFTP、SCPを挙げています。ここで1点注意したいのはSFTPです。名前にFTPとついていますが、実態としてはSSHを利用したファイル転送の仕組みとなります。
特徴 | FTPS | SFTP | SCP |
---|---|---|---|
プロトコル | FTP over SSL/TLS | SSH File Transfer Protocol | Secure Copy Protocol |
ポート | 21(制御)、データ転送に追加ポートが必要 | 22 | 22 |
暗号化 | SSL/TLSによる暗号化 | SSHによる暗号化 | SSHによる暗号化 |
認証方法 | ユーザー名とパスワード、証明書 | ユーザー名とパスワード、公開鍵認証 | ユーザー名とパスワード、公開鍵認証 |
データ転送 | FTPコマンドを使用、データチャネルを暗号化 | SSHチャネルを使用してデータを転送 | SSHチャネルを使用してデータを転送 |
FireWall設定 | 複雑(制御とデータ転送で異なるポートを使用) | シンプル(単一ポートで完結) | シンプル(単一ポートで完結) |
利用シナリオ | 既存のFTPシステムのセキュリティ強化 | 安全なファイル転送が必要なシナリオ | シンプルで高速なファイル転送が必要なシナリオ |
転送機能 | ファイルアップロード、ダウンロード、ディレクトリ操作 | ファイルアップロード、ダウンロード、ディレクトリ操作 | ファイルアップロード、ダウンロード |
リモートで コマンド実行 | 不可 | 可 | 不可 |
データ整合性 | ファイル転送の途中で中断された場合再開可能 | ファイル転送の途中で中断された場合再開可能 | 不可 |
vsftpdの構築
前提
ubuntu(AWS Cloud9)
OpenSSL(OpenSSL 3.0.2 15)
EC2のセキュリティグループ設定とIPアドレス取得
AWSのEC2を利用する場合、セキュリティグループを設定しポート開放を行う必要があります。もし別の環境をご利用の場合は下記のポート開放してください。EC2のポート開放についてはこちらのサイトを参考にしてください。
ここでポートを2つ設定していることがわかります。これはFTPのパッシブモードの仕様になり、制御用ポートとして21番ポートが、データ転送用ポートは任意のポート(今回は10000-10100の範囲のポート)が使用されます。詳しい制御プロセスの解説は省略しますが、ここではFTPの通信には制御用ポートとデータ転送用ポートの2つが必要と覚えておきましょう!
# セキュリティグループのインバウンドルール
カスタムTCP, ポート21(FTP用)
カスタムTCP, ポート10000-10100(パッシブモード用)
続いてEC2のグローバルIPアドレスを取得します。マネジメントコンソールからCloud9にアタッチされているEC2を選択し、インスタンス情報の中からパブリックIPを取得します。今回は検証なのでこのままパブリックIPを利用しますが、継続的に使用したい場合はElasticIPという固定のパブリックIPをEC2にアタッチしてくださいね。
OpenSSLのインストールとSSL証明書作成
次にOpenSSLを利用してSSL証明書を作成していきます。FTPSを実現するためにはSSL/TLSによる暗号化を実現する必要がありますが、そのための証明書を生成します。
9行目は証明書を発行するコマンドです。それぞれのオプションを説明すると下のようになります。
openssl req
コマンドの一部で、証明書署名要求(CSR)や自己署名証明書を生成するためのサブコマンドです。-x509
509フォーマットの自己署名証明書を生成するオプションで、CSRではなく自己署名証明書を生成します。-nodes
“no DES” の略で秘密鍵を暗号化しないことを指定し、秘密鍵をパスフレーズなしで保存するオプションです。-newkey rsa:2048
新しいRSA秘密鍵を生成し、その鍵の長さを2048ビットに指定します。-keyout vsftpd.pem
生成した秘密鍵を vsftpd.pem というファイルに出力します-out vsftpd.pem
生成した自己署名証明書を vsftpd.pem というファイルに出力します。つまり、このvsftpd.pemファイルには秘密鍵と証明書の両方が含まれます。-days 365
証明書の有効期間を365日(1年間)に設定します。
# OpenSSLのインストール
sudo apt update
sudo apt install openssl #Cloud9はインストール済み
openssl version
OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)
# OpenSSLによるSSL証明書作成
cd /etc/ssl/private
openssl req -x509 -nodes -newkey rsa:2048 -keyout vsftpd.pem -out vsftpd.pem -days 365
vsftpのインストールと各種設定
ここではFTPサーバーの本体となるvsftpをインストール、設定していきます。vsftpd.confでは追加・修正した設定内容を記述しました。設定は基本設定、ファイル操作、SSL/TLS設定、パッシブモード設定の4つに分けられます。設定のわかりづらい部分を下記ピックアップします。
21行目のls -R
コマンド(再帰的なリスト表示)を許可します。ディレクトリ内のファイルとサブディレクトリを再帰的にリスト表示できます。32行目のrequire_ssl_reuse=NO
はSSLセッションの再利用を必須としません。これを有効にすると、SSL接続のパフォーマンスが向上しますが、一部のFTPクライアントと互換性がない場合があります。33行目のssl_ciphers=HIGH
は高強度のSSL暗号スイートのみを使用するように指定します。これにより、暗号化の強度が向上します。
# vsftpのインストール
sudo apt update #上記で実施していれば不要
sudo apt install vsftpd
vsftpd -v
vsftpd: version 3.0.5
sudo systemctl status vsftpd
---
Active: active (running) since Mon 2024-07-15 02:13:54 UTC; 23s ago
---
# vsftpの設定
vi /etc/vsftpd.conf
### 以下、設定内容の抜粋
# 基本設定
listen=YES
listen_ipv6=NO
# ファイル操作
write_enable=YES
ascii_upload_enable=YES
ascii_download_enable=YES
ls_recurse_enable=YES
# SSL/TLS設定
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
require_ssl_reuse=NO
ssl_ciphers=HIGH
# パッシブモード設定
pasv_enable=YES
pasv_min_port=10000
pasv_max_port=10100
ftpユーザーの作成
疎通確認のためのユーザーを作成します。ここではftp-client
というユーザーを作成します。パスワードは任意のもので構いません。
sudo adduser ftp-client
sudo passwd ftp-client #任意のパスワードを入力
sudo cat /etc/passwd
FileZillaによる疎通確認
それでは最後に前述したパブリックIP、FTPユーザー情報を使ってFTPクライアントソフトであるFileZillaを利用して疎通確認をします。ファイル⇒サイトマネージャでIPアドレスとFTPユーザー、パスワードを入力すると下図のようなポップアップが表示されると思います。詳しくはこちらのサイトを参考にしてください。
下図のような不明な証明書のポップアップが表示されましたら「今後は常にこの証明書を信用する」にチェックを入れOKボタンを押下します。
接続が成功すると下図のように右側ペインに接続先のディレクトリ構成やディレクトリの中身が表示されるようになります。あとはドラッグアンドドロップでファイルを任意のディレクトリに移動させファイルをアップロードします。
まとめ
今回はFTPサーバーの概要について解説しました。特にwebアプリの開発ではたくさんの方がFTPサーバーを利用されていると思います。普段何気なく使っているFTPサーバーの重要な概念であるパッシブモード、SSLについてぜひ理解を深めてくださいね!