ウェブサイト検索

Ubuntu 20.04 で SSL/TLS を使用して FTP サーバー (vsftpd) をインストールおよび構成する方法


このチュートリアルは、これらの OS バージョン用に存在します

  • Ubuntu 18.04 (Bionic Beaver)

このページでは

  1. 前提条件
  2. ステップ 1 - vsftpd をインストールする
  3. ステップ 2 - ファイアウォールを構成する
  4. ステップ 3 - vsftpd の構成
    1. 1. FTP アクセス
    2. 2.ファイルのアップロードを有効にする
    3. 3.チュルート刑務所
    4. 4.パッシブ FTP
    5. 5.ユーザーを制限する

    1. ステップ 1 - 新しいユーザーを追加します。
    2. ステップ 2 - 許可された FTP ユーザー リストにユーザーを追加します。
    3. ステップ 3 - FTP とファイル ディレクトリを作成する

    FTP またはファイル転送プロトコルは、クライアントとサーバー間でファイルを転送するための非常に古いよく知られたプロトコルです。また、TLS なしで使用する場合にのみ使用できる安全でないプロトコルでもあります。このチュートリアルでは、vsftpd を TLS 用に構成して、FTP を安全に使用できるようにします。最近では、FTP は SFTP や SCP などのより安全なプロトコルに置き換えられることがよくあります。

    ただし、サーバーで FTP を使用する必要がある場合は、vsftpd (Very Secure FTP Daemon) が最適です。

    このチュートリアルでは、Ubuntu 20.04 ベースのサーバーで vsftpd を使用して FTP サーバーをインストールおよび構成する方法を学習します。また、SSL/TLS プロトコルを使用して接続を保護する方法も学びます。

    前提条件

    • root 以外のユーザーが sudo 権限を持つ Ubuntu 20.04 サーバー。

    ステップ 1 - vsftpd をインストールする

    最初のステップは、vsftpd をインストールすることです。

    $ sudo apt update
    $ sudo apt install vsftpd
    

    次に、元の構成ファイルをバックアップして、新しい構成から開始できるようにする必要があります。

    $ sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.orig
    

    ステップ 2 - ファイアウォールの構成

    このステップでは、FTP ポートへのアクセスを許可するように UFW ファイアウォールを構成します。

    まず、ファイアウォールの状態を確認してみましょう。

    $ sudo ufw status
    Status: active
    
    To                         Action      From
    --                         ------      ----
    OpenSSH                    ALLOW       Anywhere
    OpenSSH (v6)               ALLOW       Anywhere (v6)
    

    これまでのところ、許可されているのは SSH ポートのみです。 TLS を使用する場合はポート 20 (FTP コマンド ポート)、21 (FTP データ ポート)、990 を開き、将来必要になる可能性があるパッシブ ポートの範囲のためにポート 35000 ~ 40000 を開きます。

    $ sudo ufw allow 20:21/tcp
    $ sudo ufw allow 990/tcp
    $ sudo ufw allow 35000:40000/tcp
    $ sudo ufw status
    Status: active
    
    To                         Action      From
    --                         ------      ----
    OpenSSH                    ALLOW       Anywhere
    990/tcp                    ALLOW       Anywhere
    20:21/tcp                  ALLOW       Anywhere
    35000:40000/tcp            ALLOW       Anywhere
    OpenSSH (v6)               ALLOW       Anywhere (v6)
    20:21/tcp (v6)             ALLOW       Anywhere (v6)
    990/tcp (v6)               ALLOW       Anywhere (v6)
    35000:40000/tcp (v6)       ALLOW       Anywhere (v6)
    

    ステップ 3 - vsftpd の構成

    vsftpd が機能するために、いくつかの重要な設定について説明します。

    構成ファイルを開くことから始めます。

    $ sudo nano /etc/vsftpd.conf
    

    1. FTP アクセス

    このチュートリアルでは、FTP アクセスをローカル ユーザーのみに許可し、匿名アクセスを無効にします。これを行うには、次の行が存在し、次のようになっていることを確認します。

    anonymous_enable=NO
    local_enable=YES
    

    2.ファイルのアップロードを有効にする

    ここでの FTP の最も重要な目的は、サーバーへの書き込みを可能にすることです。次の行のコメントを外して、その前にある # を削除してファイルのアップロードを有効にします。

    write_enable=YES
    

    3.チュルート刑務所

    FTP は、ユーザーが特定のディレクトリに制限されている場合に最適に機能します。 vsftpd は、chroot jail を使用してこれを実現します。ローカル ユーザーに対して chroot が有効になっている場合、デフォルトではホーム ディレクトリに制限されます。これを行うには、次の行のコメントを外します。

    chroot_local_user=YES
    

    セキュリティ上の脆弱性を防ぐために、chroot が有効になっている場合、ユーザーが制限されているディレクトリが書き込み可能である限り、chroot は機能しません。

    この制限を回避するために、chroot が有効になっているときにファイルのアップロードを許可する 2 つの方法があります。

    1. Method 1 - This method works by using a different directory for FTP uploads. For this tutorial, we will create an ftp directory inside the user's home to serve as the chroot and a second writable directory upload for uploading the files. To achieve this, add the following lines at the bottom of the file.

      user_sub_token=$USER
      local_root=/home/$USER/ftp
      
    2. Method 2 - The second method is to simply grant writable access to the home directory as a whole. Add the following line to achieve this.

      allow_writeable_chroot=YES
      

    4.パッシブ FTP

    vsftpd は、パッシブ FTP 接続に任意のポートを使用できます。 vsftpd が使用できるポート番号の最小値と最大値の範囲を指定できます。これらは、以前に UFW ファイアウォールで構成したポートです。

    次の行を追加して、パッシブ FTP 接続を許可します。

    pasv_min_port=35000
    pasv_max_port=40000
    

    5.ユーザーの制限

    特定のユーザーのみが FTP サーバーにログインできるようにするには、以下の行を一番下に追加します。

    userlist_enable=YES
    userlist_file=/etc/vsftpd.userlist
    userlist_deny=NO
    

    このオプションを有効にして、FTP の使用を許可するユーザーを指定し、そのユーザー名を /etc/vsftpd.userlist ファイルに追加する必要があります。

    vsftpd を再起動して設定を有効にします。

    $ sudo systemctl restart vsftpd
    

    ステップ 4 - ユーザー ディレクトリの構成

    このチュートリアルでは、FTP トランザクション用の新しいユーザー アカウントを作成します。この目的で既にユーザー アカウントを持っている場合は、ステップ 1 をスキップできます。また、以前に構成ファイルで allow_writeable_chroot=YES を設定したことがある場合は、ステップ 3 をスキップできます。

    ステップ 1 - 新しいユーザーを追加します。

    $ sudo adduser testuser
    

    強力なパスワードを設定し、他のすべてのプロンプトをスキップします。

    ステップ 2 - 許可された FTP ユーザー リストにユーザーを追加します。

    $ echo "testuser" | sudo tee -a /etc/vsftpd.userlist
    

    ステップ 3 - FTP とファイル ディレクトリを作成する

    このステップは、FTP ルートとして別のディレクトリが必要であり、chroot 監獄の制限を回避するためにファイルをアップロードするための別のディレクトリが必要な場合です。

    FTP フォルダーを作成します。

    $ sudo mkdir /home/testuser/ftp
    

    所有権を設定します。

    $ sudo chown nobody:nogroup /home/testuser/ftp
    

    書き込み権限を削除します。

    $ sudo chmod a-w /home/testuser/ftp
    

    続行する前に権限を確認してください。

    $ sudo ls -al /home/testuser/ftp
    total 8
    dr-xr-xr-x 2 nobody   nogroup  4096 Jun  7 13:08 .
    drwxr-xr-x 3 testuser testuser 4096 Jun  7 13:08 ..
    

    次に、ファイルの実際の書き込み可能なディレクトリを作成しましょう。

    $ sudo mkdir /home/testuser/ftp/upload
    $ sudo chown testuser:testuser /home/testuser/ftp/upload
    

    権限をテストします。

    $ sudo ls -al /home/testuser/ftp
    total 12
    dr-xr-xr-x 3 nobody   nogroup  4096 Jun  7 13:10 .
    drwxr-xr-x 3 testuser testuser 4096 Jun  7 13:08 ..
    drwxr-xr-x 2 testuser testuser 4096 Jun  7 13:10 upload
    

    最後に、テストに使用する test.txt ファイルを追加しましょう。

    $ echo "vsftpd test file" | sudo tee /home/testuser/ftp/upload/test.txt
    

    ステップ 5 - FTP アクセスのテスト

    この時点で、当社の FTP サーバーは完全に機能しています。先に進む前に、少しテストを行うことができます。

    匿名ユーザーとしてログインしてみましょう。

    $ ftp -p 136.244.105.99
    Connected to 136.244.105.99.
    220 (vsFTPd 3.0.3)
    Name (136.244.105.99:default): anonymous
    530 Permission denied.
    ftp: Login failed.
    ftp>
    

    接続を閉じます。

    ftp> bye
    

    意図したとおりに機能します。つまり、匿名ユーザーは許可されません。

    他の sudo ユーザーとして接続してみましょう。こちらも繋がらないはずです。

    $ ftp -p 136.244.105.99
    Connected to 136.244.105.99.
    220 (vsFTPd 3.0.3)
    Name (136.244.105.99:default): sudo_user
    530 Permission denied.
    ftp: Login failed.
    ftp>
    

    接続を閉じます。

    ftp> bye
    

    最後に、FTP 用に作成した testuser として接続してみましょう。

    $ ftp -p 136.244.105.99
    Connected to 136.244.105.99.
    220 (vsFTPd 3.0.3)
    Name (136.244.105.99:default): testuser
    331 Please specify the password.
    Password: your_user's_password
    230 Login successful.
    Remote system type is UNIX.
    Using binary mode to transfer files.
    ftp>
    

    upload ディレクトリに切り替え、get コマンドを使用してテスト ファイルをローカル マシンに転送します。

    ftp> cd upload
    250 Directory successfully changed.
    ftp> get test.txt
    227 Entering Passive Mode (136,244,105,99,165,42).
    150 Opening BINARY mode data connection for test.txt (17 bytes).
    226 Transfer complete.
    16 bytes received in 0.0101 seconds (164.3719 kB/s)
    ftp>
    

    次に、put コマンドを使用して新しい名前でファイルをアップロードし、書き込み権限をテストします。

    ftp> put test.txt upload.txt
    227 Entering Passive Mode (136,244,105,99,163,102).
    150 Ok to send data.
    226 Transfer complete.
    17 bytes sent in 0.000894 seconds (518.7988 kB/s)
    

    接続を閉じます。

    ftp> bye
    

    ステップ 6 - SSL/TLS を使用して送信を保護する

    FTP 送信を暗号化するには、SSL 証明書を取得し、それを使用するように vsftpd を構成する必要があります。

    FTP サーバーを指すドメインまたはサブドメインが既にある場合は、無料の Lets Encrypt SSL 証明書を作成して使用できます。

    このチュートリアルでは、自己署名 SSL 証明書を使用します。作成するには、openssl コマンドを使用します。

    次のコマンドは、2048 ビットの秘密鍵と 1 年間有効な証明書を作成します。証明書とキーの両方が同じファイルに保存されます。

    $ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem
    

    続くプロンプトをスキップするか、必要に応じて値を入力できます。

    証明書が作成されたので、vsftpd 構成ファイルを再度開きます。

    $ sudo nano /etc/vsftpd.conf
    

    次の行を見つけて、次のように先頭にハッシュを付けてコメントアウトします。

    # rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
    # rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
    

    次に、次の行を追加します。

    rsa_cert_file=/etc/ssl/private/vsftpd.pem
    rsa_private_key_file=/etc/ssl/private/vsftpd.pem
    

    また、ssl_enable の値を YES に変更します。

    ssl_enable=YES
    

    SSL セキュリティを向上させるために、さらにいくつかの設定を追加しましょう。

    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
    

    これらの設定のほとんどは一目瞭然です。これらは、匿名ユーザーの SSL を無効にし、データ転送とログインの両方に SSL を要求します。また、安全でない SSL プロトコルを無効にし、TLSv1.0 に固執します。最後に、SSL の再利用を無効にし、高度な暗号化暗号スイートを必要としています。

    設定を有効にするためにサーバーを再起動します。

    $ sudo systemctl restart vsftpd
    

    これで、コマンド ライン経由で FTP を使用できなくなります。 TLS をサポートするクライアントを使用して接続する必要があります。

    ステップ 7 - FileZilla を使用した TLS のテスト

    このチュートリアルでは、Filezilla を使用して TLS 機能をテストします。

    Filezilla を開いたら、一番上の行の Host のすぐ上にある Site Manager アイコンをクリックします。

    新しいウィンドウが開きます。右下隅にある [新しいサイト] ボタンをクリックします。

    新しいサイトという名前の新しいアイコンが表示されます。 [名前の変更] ボタンを使用して名前を変更できます。

    [ホスト] フィールドにサーバーの IP アドレスを入力します。 FTP ポートは FTP のデフォルト ポートである 21 であるため、ポート フィールドは空のままにしておくことができます。 [暗号化] オプションで、ドロップダウン メニューから [明示的な FTP over TLS が必要] を選択します。

    上記で作成したものを使用して、FTP ユーザー名とパスワードを入力します。 [接続] ボタンをクリックして続行します。

    接続に成功すると、次のようなサーバー証明書が表示されます。

    今後のセッションでこの証明書を常に信頼するオプションをチェックできます。ログインのたびに尋ねられないようにします。 [OK] をクリックして続行します。

    通常の FTP 操作を実行できるようになりました。

    ステップ 8 - シェル アクセスを無効にする

    この手順は完全にオプションです。デフォルトでは、FTP ユーザーを作成するとき、明示的に指定されていない場合、ユーザーはサーバーへの SSH アクセスを持ちます。

    セキュリティを向上させるために、FTP ユーザーへのシェル アクセスを無効にする必要があります。これを無効にするには、ユーザー アカウントが FTP アクセスのみに制限されていることを示すメッセージを出力する新しいシェルを作成する必要があります。

    /bin/ftponly シェルを作成し、実行可能にします。

    $ echo -e '#!/bin/sh\necho "This account is limited to FTP access only."' | sudo tee -a  /bin/ftponly
    $ sudo chmod a+x /bin/ftponly
    

    /etc/shells ファイル内の有効なシェルのリストに新しいシェルを追加します。

    $ echo "/bin/ftponly" | sudo tee -a /etc/shells
    

    ユーザー シェルを /bin/ftponly に変更します。

    $ sudo usermod newftpuser -s /bin/ftponly
    

    同じコマンドを使用して、FTP アクセスを許可するすべてのユーザーのシェルを変更できます。

    結論

    これで、Ubuntu 20.04 ベースのサーバーに FTP サーバーをインストールするように vsftpd をインストールして構成したチュートリアルは終了です。また、SSL/TLS を使用して動作するように FTP 接続を構成しました。

    質問がある場合は、以下のコメントで質問してください。