開発者ドキュメント

Ubuntu18.04でユーザーのディレクトリにvsftpdを設定する方法

序章

FTP(File Transfer Protocolの略)は、クライアントとサーバー間でファイルを移動するためにかつて広く使用されていたネットワークプロトコルです。 その後、ファイルを配信するためのより速く、より安全で、より便利な方法に置き換えられました。 多くのカジュアルなインターネットユーザーは、httpsを使用してWebブラウザーから直接ダウンロードすることを期待しており、コマンドラインユーザーはscpSFTPなどの安全なプロトコルを使用する可能性が高くなります。

FTPは、非常に特殊なニーズを持つレガシーアプリケーションとワークフローをサポートするために引き続き使用されます。 使用するプロトコルを選択できる場合は、より最新のオプションを検討することを検討してください。 ただし、FTPが必要な場合は、vsftpdが最適です。 セキュリティ、パフォーマンス、および安定性のために最適化されたvsftpdは、他のFTPサーバーで見られる多くのセキュリティ問題に対する強力な保護を提供し、多くのLinuxディストリビューションのデフォルトです。

このチュートリアルでは、SSL/TLSで保護されたログイン資格情報を使用してFTPを使用してユーザーが自分のホームディレクトリにファイルをアップロードできるようにvsftpdを構成します。

前提条件

このチュートリアルに従うには、次のものが必要です。

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

パッケージリストを更新し、vsftpdデーモンをインストールすることから始めましょう。

  1. sudo apt update
  2. sudo apt install vsftpd

インストールが完了したら、構成ファイルをコピーして、空の構成から始めて、元の構成をバックアップとして保存できるようにします。

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

構成のバックアップが整ったら、ファイアウォールを構成する準備が整います。

ステップ2—ファイアウォールを開く

ファイアウォールのステータスをチェックして、ファイアウォールが有効になっているかどうかを確認しましょう。 許可されている場合は、ファイアウォールルールがテストをブロックしないようにFTPトラフィックが許可されていることを確認します。

ファイアウォールのステータスを確認します。

  1. sudo ufw status

この場合、SSHのみが許可されます。

Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6)

他のルールが設定されているか、ファイアウォールルールがまったくない可能性があります。 この場合、SSHトラフィックのみが許可されるため、FTPトラフィックのルールを追加する必要があります。

FTP用にポート2021、TLSを有効にする場合にポート990、設定する予定のパッシブポートの範囲にポート40000-50000を開きましょう構成ファイル内:

  1. sudo ufw allow 20/tcp
  2. sudo ufw allow 21/tcp
  3. sudo ufw allow 990/tcp
  4. sudo ufw allow 40000:50000/tcp
  5. sudo ufw status

ファイアウォールルールは次のようになります。

Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere 990/tcp ALLOW Anywhere 20/tcp ALLOW Anywhere 21/tcp ALLOW Anywhere 40000:50000/tcp ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) 20/tcp (v6) ALLOW Anywhere (v6) 21/tcp (v6) ALLOW Anywhere (v6) 990/tcp (v6) ALLOW Anywhere (v6) 40000:50000/tcp (v6) ALLOW Anywhere (v6)

vsftpdがインストールされ、必要なポートが開いている状態で、専用のFTPユーザーの作成に移りましょう。

ステップ3—ユーザーディレクトリの準備

専用のFTPユーザーを作成しますが、FTPアクセスを必要とするユーザーがすでにいる可能性があります。 次の手順では、既存のユーザーのデータへのアクセスを維持するように注意します。 それでも、セットアップを構成してテストするまでは、新しいユーザーから始めることをお勧めします。

まず、テストユーザーを追加します。

  1. sudo adduser sammy

プロンプトが表示されたら、パスワードを割り当てます。 他のプロンプトからENTERを押してください。

ユーザーが特定のディレクトリに制限されている場合、FTPは一般的に安全です。 vsftpdは、chrootジェイルでこれを実現します。 chrootがローカルユーザーに対して有効になっている場合、デフォルトではホームディレクトリに制限されます。 ただし、vsftpdがディレクトリを保護する方法のため、ユーザーが書き込み可能であってはなりません。 これは、FTP経由でのみ接続する必要がある新規ユーザーには問題ありませんが、既存のユーザーがシェルアクセスも持っている場合は、ホームフォルダーに書き込む必要がある場合があります。

この例では、ホームディレクトリから書き込み権限を削除するのではなく、ftpディレクトリを作成してchrootとして機能させ、書き込み可能なfilesディレクトリを作成して実際のファイルを保持します。

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

  1. sudo mkdir /home/sammy/ftp

所有権を設定します。

  1. sudo chown nobody:nogroup /home/sammy/ftp

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

  1. sudo chmod a-w /home/sammy/ftp

権限を確認します。

  1. sudo ls -la /home/sammy/ftp
Output
total 8 4 dr-xr-xr-x 2 nobody nogroup 4096 Aug 24 21:29 . 4 drwxr-xr-x 3 sammy sammy 4096 Aug 24 21:29 ..

次に、ファイルをアップロードするためのディレクトリを作成し、ユーザーに所有権を割り当てましょう。

  1. sudo mkdir /home/sammy/ftp/files
  2. sudo chown sammy:sammy /home/sammy/ftp/files

ftpディレクトリの権限チェックでは、次の情報が返されます。

  1. sudo ls -la /home/sammy/ftp
Output
total 12 dr-xr-xr-x 3 nobody nogroup 4096 Aug 26 14:01 . drwxr-xr-x 3 sammy sammy 4096 Aug 26 13:59 .. drwxr-xr-x 2 sammy sammy 4096 Aug 26 14:01 files

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

  1. echo "vsftpd test file" | sudo tee /home/sammy/ftp/files/test.txt

ftpディレクトリを保護し、ユーザーにfilesディレクトリへのアクセスを許可したので、構成を変更しましょう。

ステップ4—FTPアクセスの構成

ローカルシェルアカウントを持つ1人のユーザーがFTPに接続できるようにすることを計画しています。 このための2つの主要な設定は、vsftpd.confですでに設定されています。 構成ファイルを開いて、構成の設定が以下の設定と一致することを確認することから始めます。

  1. sudo nano /etc/vsftpd.conf
/etc/vsftpd.conf
. . .
# Allow anonymous FTP? (Disabled by default).
anonymous_enable=NO
#
# Uncomment this to allow local users to log in.
local_enable=YES
. . .

次に、write_enable設定のコメントを解除して、ユーザーがファイルをアップロードできるようにします。

/etc/vsftpd.conf
. . .
write_enable=YES
. . .

また、chrootのコメントを解除して、FTP接続されたユーザーがディレクトリツリー外のファイルやコマンドにアクセスできないようにします。

/etc/vsftpd.conf
. . .
chroot_local_user=YES
. . .

また、user_sub_tokenを追加して、local_root directoryパスにユーザー名を挿入し、このユーザーと将来の追加ユーザーに対して構成が機能するようにします。 次の設定をファイルの任意の場所に追加します。

/etc/vsftpd.conf
. . .
user_sub_token=$USER
local_root=/home/$USER/ftp

また、パッシブFTPに使用できるポートの範囲を制限して、十分な接続が利用できるようにします。

/etc/vsftpd.conf
. . .
pasv_min_port=40000
pasv_max_port=50000

注:手順2では、パッシブポート範囲用にここで設定したポートを開きました。 値を変更する場合は、必ずファイアウォール設定を更新してください。

ケースバイケースでFTPアクセスを許可するには、ユーザーがデフォルトではなく、リストに明示的に追加された場合にのみアクセスできるように構成を設定しましょう。

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

userlist_denyはロジックを切り替えます。YESに設定されている場合、リストのユーザーはFTPアクセスを拒否されます。 NOに設定されている場合、リスト上のユーザーのみがアクセスを許可されます。

変更が完了したら、ファイルを保存してエディターを終了します。

最後に、ユーザーを/etc/vsftpd.userlistに追加しましょう。 -aフラグを使用して、ファイルに追加します。

  1. echo "sammy" | sudo tee -a /etc/vsftpd.userlist

期待どおりに追加されたことを確認します。

  1. cat /etc/vsftpd.userlist
Output
sammy

デーモンを再起動して、構成の変更をロードします。

  1. sudo systemctl restart vsftpd

構成が整ったら、FTPアクセスのテストに移りましょう。

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

ユーザーsammyのみがFTP経由で接続できるようにサーバーを構成しました。 これが期待どおりに機能することを確認しましょう。

匿名ユーザーは接続に失敗するはずです:匿名アクセスを無効にしました。 匿名で接続してみて、それをテストしてみましょう。 構成が適切に設定されている場合、匿名ユーザーはアクセス許可を拒否されます。 別のターミナルウィンドウを開き、次のコマンドを実行します。 必ず203.0.113.0をサーバーのパブリックIPアドレスに置き換えてください。

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

接続を閉じます。

  1. bye

sammy以外のユーザーは接続に失敗するはずです:次に、sudoユーザーとして接続してみましょう。 また、アクセスを拒否する必要があります。また、パスワードの入力が許可される前にアクセスを拒否する必要があります。

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

接続を閉じます。

  1. bye

ユーザーsammyは、ファイルの接続、読み取り、および書き込みができる必要があります:指定されたユーザーが接続できることを確認しましょう。

  1. ftp -p 203.0.113.0
Output
Connected to 203.0.113.0. 220 (vsFTPd 3.0.3) Name (203.0.113.0:default): sammy 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>

filesディレクトリに移動し、getコマンドを使用して、前に作成したテストファイルをローカルマシンに転送しましょう。

  1. cd files
  2. get test.txt
Output
227 Entering Passive Mode (203,0,113,0,169,12). 150 Opening BINARY mode data connection for test.txt (16 bytes). 226 Transfer complete. 16 bytes received in 0.0101 seconds (1588 bytes/s) ftp>

次に、書き込み権限をテストするために、新しい名前でファイルをアップロードしましょう。

  1. put test.txt upload.txt
Output
227 Entering Passive Mode (203,0,113,0,164,71). 150 Ok to send data. 226 Transfer complete. 16 bytes sent in 0.000894 seconds (17897 bytes/s)

接続を閉じます。

  1. bye

構成をテストしたので、サーバーをさらに保護するための手順を実行しましょう。

ステップ6—トランザクションの保護

FTPは、ユーザーの資格情報を含め、転送中のデータを暗号化しないため、TLS/SSLでその暗号化を提供できるようにします。 最初のステップは、vsftpdで使用するSSL証明書を作成することです。

opensslを使用して新しい証明書を作成し、-daysフラグを使用して1年間有効にします。 同じコマンドで、2048ビットのRSA秘密鍵を追加します。 -keyoutフラグと-outフラグの両方を同じ値に設定すると、秘密鍵と証明書は同じファイルに配置されます。

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

証明書のアドレス情報を入力するように求められます。 以下の強調表示された値を独自の情報に置き換えてください。

Output
Generating a 2048 bit RSA private key ............................................................................+++ ...........+++ writing new private key to '/etc/ssl/private/vsftpd.pem' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:US State or Province Name (full name) [Some-State]:NY Locality Name (eg, city) []:New York City Organization Name (eg, company) [Internet Widgits Pty Ltd]:DigitalOcean Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []: your_server_ip Email Address []:

証明書フラグの詳細については、 OpenSSL Essentials:SSL証明書、秘密鍵、およびCSRの操作を参照してください。

証明書を作成したら、vsftpd構成ファイルを再度開きます。

  1. sudo nano /etc/vsftpd.conf

ファイルの下部に、rsa_で始まる2行が表示されます。 次のようにコメントアウトします。

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

それらの下に、作成した証明書と秘密鍵を指す次の行を追加します。

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

その後、SSLの使用を強制します。これにより、TLSを処理できないクライアントが接続できなくなります。 これは、すべてのトラフィックが暗号化されていることを確認するために必要ですが、FTPユーザーがクライアントを変更することを余儀なくされる可能性があります。 ssl_enableYESに変更します。

/etc/vsftpd.conf
. . .
ssl_enable=YES
. . .

その後、次の行を追加して、SSLを介した匿名接続を明示的に拒否し、データ転送とログインの両方にSSLを要求します。

/etc/vsftpd.conf
. . .
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
. . .

この後、次の行を追加して、SSLの優先後継であるTLSを使用するようにサーバーを構成します。

/etc/vsftpd.conf
. . .
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
. . .

最後に、さらに2つのオプションを追加します。 まず、SSLは多くのFTPクライアントを破壊する可能性があるため、SSLの再利用は必要ありません。 「高」暗号化暗号スイートが必要になります。これは、現在、128ビット以上のキー長を意味します。

/etc/vsftpd.conf
. . .
require_ssl_reuse=NO
ssl_ciphers=HIGH
. . .

完成したファイルセクションは次のようになります。

/etc/vsftpd.conf
# This option specifies the location of the RSA certificate to use for SSL
# encrypted connections.
#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
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

完了したら、ファイルを保存して閉じます。

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

  1. sudo systemctl restart vsftpd

この時点で、安全でないコマンドラインクライアントに接続できなくなります。 試してみると、次のようになります。

Output
ftp -p 203.0.113.0 Connected to 203.0.113.0. 220 (vsFTPd 3.0.3) Name (203.0.113.0:default): sammy 530 Non-anonymous sessions must use encryption. ftp: Login failed. 421 Service not available, remote server has closed connection ftp>

次に、TLSをサポートするクライアントを使用して接続できることを確認しましょう。

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

最新のFTPクライアントのほとんどは、TLS暗号化を使用するように構成できます。 クロスプラットフォームをサポートしているため、FileZillaに接続する方法を示します。 他のクライアントのドキュメントを参照してください。

FileZillaを最初に開いたときに、 Host という単語のすぐ上にあるサイトマネージャーアイコンを見つけます。これは、一番上の行の左端のアイコンです。 クリックして:

新しいウィンドウが開きます。 右下の新しいサイトボタンをクリックします。

マイサイトの下に、新しいサイトという単語が付いた新しいアイコンが表示されます。 今すぐ名前を付けるか、後で戻って名前の変更ボタンを使用できます。

Hostフィールドに名前またはIPアドレスを入力します。 暗号化ドロップダウンメニューで、[TLSを介した明示的なFTPを要求する]を選択します。

ログオンタイプで、パスワードを要求を選択します。 ユーザーフィールドにFTPユーザーを入力します。

インターフェイスの下部にある接続をクリックします。 ユーザーのパスワードの入力を求められます。

OKをクリックして接続します。 これで、TLS/SSL暗号化を使用してサーバーに接続する必要があります。

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

証明書に同意したら、filesフォルダーをダブルクリックし、upload.txtを左にドラッグして、ファイルをダウンロードできることを確認します。

それが終わったら、ローカルコピーを右クリックし、名前をupload-tls.txtに変更してサーバーにドラッグし、ファイルをアップロードできることを確認します。

これで、SSL/TLSを有効にしてファイルを安全かつ正常に転送できることを確認しました。

手順8—シェルアクセスの無効化(オプション)

クライアントの要件のためにTLSを使用できない場合は、FTPユーザーが他の方法でログインする機能を無効にすることで、ある程度のセキュリティを確保できます。 これを防ぐための比較的簡単な方法の1つは、カスタムシェルを作成することです。 これは暗号化を提供しませんが、FTPでアクセス可能なファイルへの侵害されたアカウントのアクセスを制限します。

まず、binディレクトリにあるftponlyというファイルを開きます。

  1. sudo nano /bin/ftponly

ログインできない理由をユーザーに伝えるメッセージを追加します。

/ bin / ftponly
#!/bin/sh
echo "This account is limited to FTP access only."

ファイルを保存して、エディターを終了します。

ファイルを実行可能にするための権限を変更します。

  1. sudo chmod a+x /bin/ftponly

有効なシェルのリストを開きます。

  1. sudo nano /etc/shells

下部に次を追加します。

/ etc / shells
. . .
/bin/ftponly

次のコマンドを使用して、ユーザーのシェルを更新します。

  1. sudo usermod sammy -s /bin/ftponly

次に、sammyとしてサーバーにログインしてみてください。

  1. ssh sammy@your_server_ip

次のように表示されます。

Output
This account is limited to FTP access only. Connection to 203.0.113.0 closed.

これにより、ユーザーはサーバーに対してsshできなくなり、FTPアクセスのみに制限されることが確認されます。

結論

このチュートリアルでは、ローカルアカウントを持つユーザーのFTPの設定について説明しました。 外部認証ソースを使用する必要がある場合は、vsftpdによる仮想ユーザーのサポートを調べることをお勧めします。 これは、PAM、プラガブル認証モジュールを使用して豊富なオプションのセットを提供し、LDAPやKerberosなどの別のシステムでユーザーを管理する場合に適しています。

モバイルバージョンを終了