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

提供:Dev Guides
移動先:案内検索

序章

FTPは、 File Transfer Protocol の略で、クライアントとサーバー間でファイルを移動するためにかつて広く使用されていたネットワークプロトコルです。 FTPは、非常に特殊なニーズを持つレガシーアプリケーションとワークフローをサポートするために引き続き使用されます。 プロトコルを選択できる場合は、ファイルの配信に、より効率的で、安全で、便利な最新のオプションを検討してください。 たとえば、httpsを使用してWebブラウザから直接ダウンロードするインターネットユーザーや、scpSFTPなどの安全なプロトコルを使用するコマンドラインユーザー。

vsftpd、非常に安全なFTPデーモンは、Linuxを含む多くのUnixに似たシステムのFTPサーバーであり、多くのLinuxディストリビューションのデフォルトのFTPサーバーでもあります。 vsftpdは、セキュリティ、パフォーマンス、および安定性を最適化するのに役立ちます。 また、他のFTPサーバーで見られるセキュリティ問題に対する強力な保護も提供します。 vsftpdは、仮想IPD構成、SSL統合による暗号化サポートなどを処理できます。

このチュートリアルでは、SSL/TLSで保護されたログイン資格情報を使用してFTPを使用してユーザーがホームディレクトリにファイルをアップロードできるようにvsftpdを構成します。 また、オープンソースのFTPクライアントであるFileZillaを使用してサーバーに接続し、TLS暗号化をテストします。

前提条件

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

  • 最初に必要なのは、Ubuntu 20.04サーバー、sudo権限を持つroot以外のユーザー、および有効なファイアウォールです。 これを行う方法の詳細については、 Ubuntu20.04を使用したサーバーの初期設定ガイドを参照してください。
  • 次に必要なのは、ローカルマシンにインストールおよび構成されたオープンソースのFTPクライアントであるFileZillaです。 これにより、クライアントがTLSを介してサーバーに接続できるかどうかをテストできます。 このチュートリアルからDebianおよびUbuntuシステムにFileZillaをインストールするための手順と、他のシステムにインストールするための手順へのリンクを見つけることができます。

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

パッケージリストを更新することから始めます。

sudo apt update

次に、vsftpdデーモンをインストールします。

sudo apt install vsftpd

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

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

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

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

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

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

sudo ufw status

この出力は、ファイアウォールがアクティブであり、SSHのみが通過を許可されていることを示しています。

OutputStatus: active

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

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

まず、ポート2021、および990を開いて、TLSを有効にしたときに準備ができるようにします。

sudo ufw allow 20,21,990/tcp

次に、構成ファイルで設定するパッシブポートの範囲のポート40000-50000を開きます。

sudo ufw allow 40000:50000/tcp

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

sudo ufw status

ファイアウォールルールの出力は次のように表示されます。

OutputStatus: active

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

vsftpdをインストールし、必要なポートを開いたら、専用のFTPユーザーを作成します。

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

このステップでは、専用のFTPユーザーを作成します。 ただし、FTPアクセスを必要とするユーザーがすでにいる場合があります。 このガイドでは、既存のユーザーのデータへのアクセスを維持する方法の概要を説明しますが、それでも、既存のユーザーを再構成する前に、セットアップを構成してテストするまで、新しい専用FTPユーザーから始めることをお勧めします。

テストユーザーを追加することから始めます。

sudo adduser sammy

プロンプトが表示されたら、パスワードを割り当てます。 ENTERを押して、次のプロンプトをスキップしてください。これらの詳細は、この手順では重要ではありません。

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

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

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

sudo mkdir /home/sammy/ftp

所有権を設定します。

sudo chown nobody:nogroup /home/sammy/ftp

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

sudo chmod a-w /home/sammy/ftp

権限を確認します。

sudo ls -la /home/sammy/ftp
Outputtotal 8
dr-xr-xr-x 2 nobody nogroup 4096 Sep 14 20:28 .
drwxr-xr-x 3 sammy sammy  4096 Sep 14 20:28 ..

次に、ファイルをアップロードするためのディレクトリを作成します。

sudo mkdir /home/sammy/ftp/files

次に、ユーザーに所有権を割り当てます。

sudo chown sammy:sammy /home/sammy/ftp/files

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

sudo ls -la /home/sammy/ftp
Outputtotal 12
dr-xr-xr-x 3 nobody nogroup 4096 Sep 14 20:30 .
drwxr-xr-x 3 sammy sammy  4096 Sep 14 20:28 ..
drwxr-xr-x 2 sammy sammy  4096 Sep 14 20:30 files

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

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

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

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

この手順では、ローカルシェルアカウントを持つ1人のユーザーがFTPに接続できるようにします。 このための2つの主要な設定は、vsftpd.confですでに設定されています。 お好みのテキストエディタを使用してこのファイルを開きます。 ここでは、nanoを使用します。

sudo nano /etc/vsftpd.conf

ファイルを開いたら、anonymous_enableディレクティブがNOに設定され、local_enableディレクティブがYESに設定されていることを確認します。

/etc/vsftpd.conf

. . .
# Allow anonymous FTP? (Disabled by default).
anonymous_enable=NO
#
# Uncomment this to allow local users to log in.
local_enable=YES
. . .

これらの設定は、匿名ログインを防止し、ローカルログインを許可します。 ローカルログインを有効にすると、/etc/passwdファイルにリストされている通常のユーザーを使用してログインできることに注意してください。

一部のFTPコマンドを使用すると、ユーザーはファイルシステム上のファイルやディレクトリを追加、変更、または削除できます。 write_enable設定のコメントを解除して、これらのコマンドを有効にします。 これを行うには、次のディレクティブの前にあるポンド記号(#)を削除します。

/etc/vsftpd.conf

. . .
write_enable=YES
. . .

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

/etc/vsftpd.conf

. . .
chroot_local_user=YES
. . .

次に、値が$USER環境変数であるuser_sub_tokenディレクティブを追加します。 次に、local_rootディレクティブを追加し、表示されているパスに設定します。このパスには、$USER環境変数も含まれています。 この設定により、この構成により、ログイン時にこのユーザーと将来のユーザーを適切なユーザーのホームディレクトリにルーティングできるようになります。 次の設定をファイルの任意の場所に追加します。

/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に設定すると、リストのユーザーのみがアクセスを許可されます。

変更が完了したら、ファイルを保存してエディターを終了します。 nanoを使用してファイルを編集した場合は、CTRL + XYENTERの順に押すと編集できます。

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

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

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

cat /etc/vsftpd.userlist
Outputsammy

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

sudo systemctl restart vsftpd

構成が整ったら、FTPアクセスをテストできます。

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

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

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

ftp -p 203.0.113.0

ユーザー名の入力を求められたら、匿名などの存在しないユーザーとしてログインしてみてください。次の出力が表示されます。

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

接続を閉じます。

bye

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

ftp -p 203.0.113.0
OutputConnected 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>

接続を閉じます。

bye

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

ftp -p 203.0.113.0
OutputConnected 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ディレクトリに移動します。

cd files
Output250 Directory successfully changed.

次に、getを実行して、前に作成したテストファイルをローカルマシンに転送します。

get test.txt
Output227 Entering Passive Mode (203,0,113,0,169,12).
150 Opening BINARY mode data connection for test.txt (17 bytes).
226 Transfer complete.
17 bytes received in 0.00 secs (4.5496 kB/s)
ftp>

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

put test.txt upload.txt
Output227 Entering Passive Mode (203,0,113,0,164,71).
150 Ok to send data.
226 Transfer complete.
17 bytes sent in 0.00 secs (5.3227 kB/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

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

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]: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構成ファイルを再度開きます。

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つのオプションを追加します。 1つ目は、多くのFTPクライアントを破壊する可能性があるため、SSLの再利用は必要ありません。 2つ目は、「高」暗号化暗号スイートを必要とします。これは、現在、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

完了したら、ファイルを保存して閉じます。 nanoを使用した場合は、CTRL + XYENTERの順に押すと終了できます。

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

sudo systemctl restart vsftpd

この時点で、安全でないコマンドラインクライアントに接続できなくなります。 試してみると、次のメッセージが表示されます。

Outputftp -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>

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

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

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

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

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

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

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

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

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

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

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

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

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

これで、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."

ファイルを保存して、エディターを終了します。 nanoを使用した場合は、CTRL + XYENTERの順に押すと終了できます。

次に、アクセス許可を変更して、ファイルを実行可能にします。

sudo chmod a+x /bin/ftponly

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

sudo nano /etc/shells

下部に次を追加します。

/ etc / shells

. . .
/bin/ftponly

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

sudo usermod sammy -s /bin/ftponly

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

ssh sammy@your_server_ip

次のメッセージが表示されます。

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

これにより、ユーザーはサーバーに対してsshできなくなり、FTPアクセスのみに制限されることが確認されます。 サーバーへのログイン時にエラーメッセージが表示された場合は、サーバーがパスワード認証を受け入れていない可能性があることに注意してください。 パスワードベースの認証を使用すると、サーバーが攻撃に対して脆弱になる可能性があるため、パスワード認証を無効にすることを検討することをお勧めします。 SSHキーベースの認証をすでに構成している場合は、このチュートリアルのステップ4 で、サーバーでパスワード認証を無効にする方法について詳しく知ることができます。

結論

このチュートリアルでは、ローカルアカウントを持つユーザーのFTPを設定する方法を説明しました。 外部認証ソースを使用する必要がある場合は、vsftpdによる仮想ユーザーのサポートを検討することをお勧めします。 これは、 PAM、Pluggable Authentication Modules を使用することで豊富なオプションのセットを提供し、LDAPやKerberosなどの別のシステムでユーザーを管理する場合に適しています。 詳細については、 vsftpdの機能、最新リリース、および更新についても読むことができます。