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

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

序章

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

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

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

前提条件

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

  • sudo権限を持つroot以外のユーザーがいるUbuntu16.04サーバー:これらの権限を持つユーザーを設定する方法について詳しくは、 Ubuntu16.04を使用したサーバーの初期設定ガイドをご覧ください。

Ubuntuサーバーを配置したら、開始する準備が整います。

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

まず、パッケージリストを更新し、vsftpdデーモンをインストールします。

sudo apt-get update
sudo apt-get 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トラフィックのルールを追加する必要があります。

FTP用にポート20と21を開き、後でTLSを有効にするときにポート990を開き、構成ファイルで設定する予定のパッシブポートの範囲用にポート40000〜50000を開く必要があります。

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がインストールされ、必要なポートが開いているので、次のステップに進む準備ができています。

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

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

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

sudo adduser sammy

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

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

この例では、ホームディレクトリから書き込み権限を削除するのではなく、chrootとして機能するftpディレクトリと、書き込み可能な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
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/sammy/ftp/files
sudo chown sammy:sammy /home/sammy/ftp/files

filesディレクトリの権限チェックでは、次の結果が返されます。

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/sammy/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=YES
. . .

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

/etc/vsftpd.conf

. . .
chroot_local_user=YES
. . .

local_root directoryパスにユーザー名を挿入するために、user_sub_tokenを追加します。これにより、このユーザーと今後追加される可能性のあるユーザーに対して構成が機能します。

/etc/vsftpd.conf

user_sub_token=$USER
local_root=/home/$USER/ftp

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

/etc/vsftpd.conf

pasv_min_port=40000
pasv_max_port=50000

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


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

/etc/vsftpd.conf

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

userlist_denyはロジックを切り替えます。 「YES」に設定すると、リストのユーザーはFTPアクセスを拒否されます。 「NO」に設定すると、リストのユーザーのみがアクセスを許可されます。 変更が完了したら、ファイルを保存して終了します。

最後に、ユーザーを作成してファイルに追加します。 -aフラグを使用してファイルに追加します。

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

期待どおりに追加されたことを再確認してください。

cat /etc/vsftpd.userlist
Outputsammy

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

sudo systemctl restart vsftpd

これで、テストの準備が整いました。

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

ユーザー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): 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は、ファイルの読み取りと書き込みだけでなく、接続できる必要があります:ここでは、指定されたユーザーが_can_connect:であることを確認します。

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ディレクトリに移動し、getコマンドを使用して、前に作成したテストファイルをローカルマシンに転送します。

cd files
get test.txt
Output227 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>

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

put test.txt upload.txt
Output227 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)

接続を閉じます。

bye

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

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

FTPは、ユーザーの資格情報を含め、転送中のデータを暗号化しないため、TTL/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_IP_address
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つのオプションを追加します。 まず、SSLは多くのFTPクライアントを破壊する可能性があるため、SSLの再利用は必要ありません。 「高」暗号化暗号スイートが必要になります。これは、現在、128ビット以上のキー長を意味します。

/etc/vsftpd.conf

require_ssl_reuse=NO
ssl_ciphers=HIGH

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

次に、変更を有効にするためにサーバーを再起動する必要があります。

sudo systemctl restart vsftpd

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

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を最初に開いたときに、ファイルという単語のすぐ下にあるサイトマネージャーアイコン(一番上の行の左端のアイコン)を見つけます。 クリックして:

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

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

「ホスト」フィールドに名前または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/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 sammy -s /bin/ftponly

sammyとしてログインしてみてください。

ssh [email protected]

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

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

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

結論

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