Linuxのvsftpdでファイル転送サーバーを構築してみよう!

eyecatch-linux-vsftpd-ftp
目次

ファイル転送とは?

概要

まずはファイルサーバーとファイル転送サーバーの違いについて確認しましょう。

ファイルサーバーはネットワーク上の他のコンピュータからアクセスできるファイルやデータを保存・管理するためのサーバーです。また、物理的なサーバーの意味として使われることもあり、その場合ファイルサーバーは高性能なハードウェアと専用のサーバーOSを備えており、企業や組織で広く使用されている専用コンピュータを指します。ファイルサーバーは柔軟性が高く、アプリケーションのインストールやカスタマイズが可能で、データベースやバックアップソリューションなど、多目的に利用できます。一方、ソフトウェアとしてのファイルサーバーを指す場合、Linuxで動作する代表的なツールはsamba、NFS、WebDAVなどがあります。

一方でFTPサーバーに代表されるファイル転送サーバーはファイル転送プロトコルを使用してファイルを送受信するためのサーバーです。主にファイルの転送(アップロードおよびダウンロード)に特化しています。一般的にはユーザーはクライアントソフトウェアを使用してサーバーに接続しファイルを転送します。FTPサーバーをファイルサーバーと誤解してしまう方がいますが、FTPサーバーはあくまでファイル転送機能を提供するものであることにご注意ください。本記事ではこのファイル転送サーバーについて解説していきます。

プロトコル

続いてファイル転送用のプロトコルを見ていきましょう!ファイル転送のプロトコルはFTPを思い浮かべるかもしれませんが、FTPだとデータ転送が暗号化されていないため危険です。そこで安全にデータ転送を行う仕組みとしてここではFTPS、SFTP、SCPを挙げています。ここで1点注意したいのはSFTPです。名前にFTPとついていますが、実態としてはSSHを利用したファイル転送の仕組みとなります。

特徴FTPSSFTPSCP
プロトコルFTP over SSL/TLSSSH File Transfer ProtocolSecure Copy Protocol
ポート21(制御)、データ転送に追加ポートが必要2222
暗号化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についてぜひ理解を深めてくださいね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

Hack Luck Labの管理人hakula(ハクラ)です。2012年にSIerに新卒入社し、SE、新規事業、情シスを担当。その後、ITコンサルを経て、現在はバックエンドエンジニア。過去にはC#、SQL Server、JavaScriptで開発を行い、現在はPython、Rest Framework、Postgresql、Linux、AWSなどを使用しています。ノーコードツールやDX関連も興味あり。「技術は価値を生むために使う」ことが信条で、顧客や組織への貢献を重視しています。

目次