前書き

FTP(File Transfer Protocolの略)は、クライアントとサーバー間でファイルを移動するためにかつて広く使用されていたネットワークプロトコルです。 それ以降、ファイルを配信するより高速で安全で便利な方法に置き換えられました。 多くのカジュアルなインターネットユーザーは、 `+ https `を使用してWebブラウザーから直接ダウンロードすることを期待しており、コマンドラインユーザーは ` scp +`やhttps://www.digitalocean.com/community/などの安全なプロトコルを使用する可能性が高くなります。 tutorials / how-to-use-sftp-to-securely-transfer-files-with-a-remote-server [SFTP]。

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

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

前提条件

このチュートリアルを進めるには、次のものが必要です。

  • Debian 10サーバー、および `+ sudo +`特権を持つ非rootユーザー。 これらの権限を持つユーザーを作成する方法の詳細については、https://www.digitalocean.com/community/tutorials/initial-server-setup-with-debian-10 [Debian 10での初期サーバー設定]ガイドをご覧ください。

ステップ1-vsftpdのインストール

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

sudo apt update
sudo apt install vsftpd

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

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

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

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

ファイアウォールのステータスをチェックして、有効になっているかどうかを確認しましょう。 許可されている場合、ファイアウォールルールがテストをブロックしないように、FTPトラフィックが許可されていることを確認します。 このガイドでは、https://www.digitalocean.com/community/tutorials/initial-server-setup-with-debian-10#step-4-%E2%80%94のステップ4に従ってUFWがインストールされていることを前提としています。 -setting-up-a-basic-firewall [初期サーバー設定ガイド]。

ファイアウォールの状態を確認します。

sudo ufw status

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

OutputStatus: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

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

FTPのポート「20」と「21 +」、TLSを有効にする場合のポート「+990」、および構成ファイル:

sudo ufw allow 20/tcp
sudo ufw allow 21/tcp
sudo ufw allow 990/tcp
sudo ufw allow 40000:50000/tcp

ファイアウォールの状態を確認します。

sudo ufw status

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

OutputStatus: 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アクセスが必要なユーザーがいる場合があります。 次の手順で、既存のユーザーのデータへのアクセスを維持するように注意します。 それでも、セットアップを構成してテストするまでは、新しいユーザーから始めることをお勧めします。

まず、「++」というテストユーザーを追加します。

sudo adduser

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

FTPは一般に、ユーザーが特定のディレクトリに制限されている場合により安全です。 + vsftpd +`はhttps://www.digitalocean.com/community/tutorials/how-to-configure-chroot-environments-for-testing-on-an-ubuntu-12-04-vps#what-isでこれを実現します-a-chroot-environment [+ chroot `]刑務所。 ローカルユーザーに対して「 chroot 」が有効になっている場合、デフォルトではホームディレクトリに制限されます。 ただし、 ` vsftpd +`がディレクトリをセキュリティで保護する方法のため、ユーザーが書き込み可能であることはできません。 これはFTP経由でのみ接続する必要がある新しいユーザーにとっては問題ありませんが、シェルアクセスもある場合は、既存のユーザーがホームフォルダーに書き込む必要がある場合があります。

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

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

sudo mkdir /home//ftp

所有権を設定します。

sudo chown nobody:nogroup /home//ftp

書き込み許可を削除します。

sudo chmod a-w /home//ftp

許可を確認します。

sudo ls -la /home//ftp
Outputtotal 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 ..

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

sudo mkdir /home//ftp/files
sudo chown : /home//ftp/files

`+ ftp +`ディレクトリのパーミッションチェックは以下を返します:

sudo ls -la /home/sammy/ftp
Outputtotal 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 +`ファイルを追加しましょう。

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

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

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

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

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=
. . .

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

/etc/vsftpd.conf

. . .
chroot_local_user=
. . .

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

/etc/vsftpd.conf

. . .

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

/etc/vsftpd.conf

. . .

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

/etc/vsftpd.conf

. . .

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

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

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

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

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

cat /etc/vsftpd.userlist
Outputsammy

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

sudo systemctl restart vsftpd

設定が完了したら、FTPアクセスのテストに進むことができます。

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

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

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

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

接続を閉じます。

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

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

接続を閉じます。

bye

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

ftp -p
OutputConnected to 203.0.113.0.
220 (vsFTPd 3.0.3)
Name (203.0.113.0:default):
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>

+ files in`ディレクトリに移動して、 + get`コマンドを使用して、先ほど作成したテストファイルをローカルマシンに転送します。

cd files
get test.txt
Output229 Entering Extended Passive Mode (|||47398|)
150 Opening BINARY mode data connection for test.txt (17 bytes).
100% |**********************************|    17      146.91 KiB/s    00:00 ETA
226 Transfer complete.
17 bytes received in 00:00 (0.17 KiB/s)
ftp>

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

put test.txt upload.txt
Output229 Entering Extended Passive Mode (|||46598|)
150 Ok to send data.
100% |**********************************|    17        8.93 KiB/s    00:00 ETA
226 Transfer complete.
17 bytes sent in 00:00 (0.08 KiB/s)

接続を閉じます。

bye

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

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

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

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

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

証明書のアドレス情報を入力するよう求められます。 以下の強調表示されている値を独自の情報に置き換えます。 「+ Common Name」フィールドには、必ず「++」を追加してください。

OutputGenerating 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]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:

証明書フラグの詳細については、https://www.digitalocean.com/community/tutorials/openssl-essentials-working-with-ssl-certificates-private-keys-and-csrs [OpenSSL Essentials:Working with SSL証明書、秘密鍵、CSR]

証明書を作成したら、もう一度 `+ vsftpd +`設定ファイルを開きます:

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

. . .


. . .

その後、SSLの使用を強制します。これにより、TLSを処理できないクライアントが接続できなくなります。 これは、すべてのトラフィックが暗号化されるようにするために必要ですが、FTPユーザーにクライアントの変更を強制する場合があります。 `+ ssl_enable `を ` YES +`に変更します。

/etc/vsftpd.conf

. . .
ssl_enable=
. . .

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

/etc/vsftpd.conf

. . .



. . .

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

/etc/vsftpd.conf

. . .



. . .

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

/etc/vsftpd.conf

. . .


. . .

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

/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

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

サーバーを再起動して、変更を有効にします。

sudo systemctl restart vsftpd

この時点で、安全でないコマンドラインクライアントと接続することはできなくなります。 試した場合、次のように表示されます。

Outputftp -p
Connected to 203.0.113.0.
220 (vsFTPd 3.0.3)
Name (203.0.113.0:default):
530 Non-anonymous sessions must use encryption.
ftp: Login failed.
ftp>

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

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

最新のFTPクライアントは、TLS暗号化を使用するように構成できます。 クロスプラットフォームのサポートにより、https://filezilla-project.org/ [FileZilla]に接続する方法を示します。 他のクライアントのドキュメントを参照してください。

FileZillaを初めて開いたとき、* Host *という単語の上にあるSite Managerアイコンを見つけます。これは、一番上の行の左端のアイコンです。 クリックして:

image:https://assets.digitalocean.com/articles/vsftpd_18_04/vsftpd_images/filezilla_site_manager_vsftpd_18_04.png [サイトマネージャーのスクリーンショット]

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

image:https://assets.digitalocean.com/articles/vsftp-user/new-site.png [New Site Button] + [* My Sites ]の下に、 New Site という言葉が付いた新しいアイコンが表示されます。 今すぐ名前を付けることも、後で戻って Rename *ボタンを使用することもできます。

*ホスト*フィールドにドメイン名またはIPアドレスを入力します。 [暗号化]ドロップダウンメニューで、[明示的なFTP over TLSが必要]を選択します。

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

画像:https://assets.digitalocean.com/articles/vsftpd_debian_10/vsftpd_settings.png [一般設定]タブ

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

image:https://assets.digitalocean.com/articles/vsftp-user/user-pass.png [パスワードダイアログ]

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

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

image:https://assets.digitalocean.com/articles/vsftpd_18_04/vsftpd_images/filezilla_certificate_vsftpd.png [サイト証明書ダイアログ]

証明書を受け入れたら、「+ files in」フォルダーをダブルクリックし、「+ upload.text」を左にドラッグして、ファイルをダウンロードできることを確認します。

image:https://assets.digitalocean.com/articles/vsftpd_18_04/vsftpd_images/filezilla_file_test_vsftpd_18_04.png [test.txtをダウンロード]

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

image:https://assets.digitalocean.com/articles/vsftpd_18_04/vsftpd_images/filezilla_file_upload_vsftpd_18_04.png [名前の変更とアップロード]

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

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

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

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

sudo nano /bin/ftponly

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

/ bin / ftponly

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

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

許可を変更して、ファイルを実行可能にします。

sudo chmod a+x /bin/ftponly

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

sudo nano /etc/shells

下部に追加:

/ etc / shells

. . .
/bin/ftponly

次のコマンドでユーザーのシェルを更新します。

sudo usermod  -s /bin/ftponly

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

次のようなものが見えるはずです。

OutputThis account is limited to FTP access only.
Connection to 203.0.113.0 closed.

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

結論

このチュートリアルでは、ローカルアカウントを持つユーザーのFTPの設定について説明しました。 外部認証ソースを使用する必要がある場合は、「+ vsftpd +」の仮想ユーザーのサポートを調べてください。 これは、PAM、Pluggable Authentication Modulesの使用を通じて豊富なオプションセットを提供し、LDAPやKerberosなどの別のシステムでユーザーを管理する場合に適しています。