序章
FTP(File Transfer Protocolの略)は、クライアントとサーバー間でファイルを移動するためにかつて広く使用されていたネットワークプロトコルです。 その後、ファイルを配信するためのより高速で、より安全で、より便利な方法に置き換えられました。 多くのカジュアルなインターネットユーザーは、Webブラウザから直接ダウンロードすることを期待しています。 https
、およびコマンドラインユーザーは、次のような安全なプロトコルを使用する可能性が高くなります。 scp
またはSFTP。
FTPは、非常に特殊なニーズを持つレガシーアプリケーションとワークフローをサポートするために引き続き使用されます。 使用するプロトコルを選択できる場合は、より最新のオプションを検討することを検討してください。 ただし、FTPが必要な場合は、vsftpdが最適です。 セキュリティ、パフォーマンス、および安定性のために最適化されたvsftpdは、他のFTPサーバーで見られる多くのセキュリティ問題に対する強力な保護を提供し、多くのLinuxディストリビューションのデフォルトです。
このチュートリアルでは、SSL/TLSで保護されたログイン資格情報を使用してFTPを使用してユーザーが自分のホームディレクトリにファイルをアップロードできるようにvsftpdを構成します。
前提条件
このチュートリアルに従うには、次のものが必要です。
- Debian 9サーバー、およびsudo権限を持つroot以外のユーザー。 これらの権限を持つユーザーを作成する方法の詳細については、 Debian9を使用した初期サーバーセットアップガイドを参照してください。
ステップ1—vsftpdをインストールする
パッケージリストを更新してインストールすることから始めましょう vsftpd
デーモン:
- sudo apt update
- sudo apt install vsftpd
インストールが完了したら、構成ファイルをコピーして、空の構成から始めて、元の構成をバックアップとして保存できるようにします。
- sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.orig
構成のバックアップが整ったら、ファイアウォールを構成する準備が整います。
ステップ2—ファイアウォールを開く
ファイアウォールのステータスをチェックして、ファイアウォールが有効になっているかどうかを確認しましょう。 許可されている場合は、ファイアウォールルールがテストをブロックしないようにFTPトラフィックが許可されていることを確認します。 このガイドは、初期サーバーセットアップガイドのステップ4に従って、UFWがインストールされていることを前提としています。
ファイアウォールのステータスを確認します。
- sudo ufw status
この場合、SSHのみが許可されます。
OutputStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
他のルールが設定されているか、ファイアウォールルールがまったくない可能性があります。 この場合、SSHトラフィックのみが許可されるため、FTPトラフィックのルールを追加する必要があります。
ポートを開けましょう 20
と 21
FTPの場合、ポート 990
TLSとポートを有効にする場合 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
インストールされ、必要なポートが開いたら、専用のFTPユーザーの作成に移りましょう。
ステップ3—ユーザーディレクトリの準備
専用の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
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
の権限チェック 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/sammy/ftp/files/test.txt
これで、 ftp
ディレクトリとユーザーにアクセスを許可しました files
ディレクトリ、構成を変更しましょう。
ステップ4—FTPアクセスの構成
ローカルシェルアカウントを持つ1人のユーザーがFTPに接続できるようにすることを計画しています。 このための2つの主要な設定はすでに設定されています vsftpd.conf
. 構成ファイルを開いて、構成の設定が以下の設定と一致することを確認することから始めます。
- sudo nano /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
設定:
. . .
write_enable=YES
. . .
また、コメントを外します chroot
FTP接続されたユーザーがディレクトリツリー外のファイルやコマンドにアクセスできないようにするには、次の手順に従います。
. . .
chroot_local_user=YES
. . .
また、追加しましょう user_sub_token
ユーザー名を local_root directory
パスを使用して、このユーザーと将来の追加ユーザーに対して構成が機能するようにします。 次の設定をファイルの任意の場所に追加します。
. . .
user_sub_token=$USER
local_root=/home/$USER/ftp
また、パッシブFTPに使用できるポートの範囲を制限して、十分な接続が利用できるようにします。
. . .
pasv_min_port=40000
pasv_max_port=50000
注:ステップ2では、パッシブポート範囲用にここで設定したポートを開きました。 値を変更する場合は、必ずファイアウォール設定を更新してください。
ケースバイケースでFTPアクセスを許可するには、ユーザーがデフォルトではなく、リストに明示的に追加された場合にのみアクセスできるように構成を設定しましょう。
. . .
userlist_enable=YES
userlist_file=/etc/vsftpd.userlist
userlist_deny=NO
userlist_deny
ロジックを切り替えます:に設定されている場合 YES
、リストのユーザーはFTPアクセスを拒否されます。 に設定されている場合 NO
、リスト上のユーザーのみがアクセスを許可されます。
変更が完了したら、ファイルを保存してエディターを終了します。
最後に、ユーザーをに追加しましょう /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): your_sudo_user
530 Permission denied.
ftp: Login failed.
ftp>
接続を閉じます。
- bye
ユーザーsammyは、ファイルの接続、読み取り、および書き込みができる必要があります:指定されたユーザーが接続できることを確認しましょう。
- 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
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でその暗号化を提供できるようにします。 最初のステップは、で使用するSSL証明書を作成することです vsftpd
.
使ってみよう 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
ファイルの下部に向かって、で始まる2行が表示されます。 rsa_
. 次のようにコメントアウトします。
. . .
# 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の使用を強制します。これにより、TLSを処理できないクライアントが接続できなくなります。 これは、すべてのトラフィックが暗号化されていることを確認するために必要ですが、FTPユーザーがクライアントを変更することを余儀なくされる可能性があります。 変化する ssl_enable
に YES
:
. . .
ssl_enable=YES
. . .
その後、次の行を追加して、SSLを介した匿名接続を明示的に拒否し、データ転送とログインの両方にSSLを要求します。
. . .
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
. . .
この後、次の行を追加して、SSLの優先後継であるTLSを使用するようにサーバーを構成します。
. . .
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
. . .
最後に、さらに2つのオプションを追加します。 まず、SSLは多くのFTPクライアントを破壊する可能性があるため、SSLの再利用は必要ありません。 「高」暗号化暗号スイートが必要になります。これは、現在、128ビット以上のキー長を意味します。
. . .
require_ssl_reuse=NO
ssl_ciphers=HIGH
. . .
完成したファイルセクションは次のようになります。
# 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 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.
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でアクセス可能なファイルへの侵害されたアカウントのアクセスを制限します。
まず、というファイルを開きます ftponly
の中に bin
ディレクトリ:
- 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
下部に次を追加します。
. . .
/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アクセスのみに制限されています。
結論
このチュートリアルでは、ローカルアカウントを持つユーザーのFTPの設定について説明しました。 外部認証ソースを使用する必要がある場合は、調査することをお勧めします vsftpd
の仮想ユーザーのサポート。 これは、PAM、プラガブル認証モジュールを使用して豊富なオプションのセットを提供し、LDAPやKerberosなどの別のシステムでユーザーを管理する場合に適しています。