FTPは、クライアントとサーバー間でファイルを移動するためにかつて広く使用されていたネットワークプロトコルであるFile TransferProtocolの略語です。これは、より速く、より安全で、より便利なファイル転送方法に置き換えられました。多くのカジュアルなネットユーザーは、 https
を使用してWebブラウザーから直接ダウンロードしたいと考えており、コマンドラインユーザーは scp
やSFTPなどの安全なプロトコルを使用する方が簡単です。
FTPは、特定の要件を持つレガシーアプリケーションとワークフローをサポートするために引き続き使用されます。使用するプロトコルを選択できる場合は、より最新のオプションを検討することを検討してください。ただし、FTPが必要な場合は、vsftpdを選択することをお勧めします。 vsftpdは、セキュリティ、パフォーマンス、および安定性のために最適化されており、他のFTPサーバーに存在する多くのセキュリティ問題を十分に防ぐことができ、多くのLinuxディストリビューションのデフォルト設定です。
このチュートリアルでは、SSL / TLSで保護されたログイン資格情報を使用してFTPを使用してユーザーが自分のホームディレクトリにファイルをアップロードできるようにvsftpdを構成する方法を示します。
このチュートリアルに従うには、次のものが必要です。
Ubuntuサーバーができたら、起動できます。
まず、パッケージリストを更新し、vsftpdデーモンをインストールします。
sudo apt-get update
sudo apt-get install vsftpd
インストールが完了したら、構成ファイルをコピーして、空の構成から開始し、元のファイルをバックアップとして保存できるようにします。
sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.orig
構成をバックアップすることで、ファイアウォールを構成する準備が整いました。 Tencent Cloudの[CVM](https://cloud.tencent.com/product/cvm?from=10680)サーバーを使用している場合は、Tencent Cloudコンソールの[Security Group](https://console.cloud.tencent.com/cvm/securitygroup)に直接設定できます。
ファイアウォールのステータスをチェックして、有効になっているかどうかを確認します。その場合、テストを妨げるファイアウォールルールに遭遇しないように、FTPトラフィックが許可されるようにします。
sudo ufw status
この場合、SSHのみが許可されます。
Status: 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
現在、ファイアウォールルールは次のとおりです。
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アクセスを必要とするユーザーがすでにいる可能性があります。以下の手順では、既存のユーザーによるデータへのアクセスを維持するように注意します。それでも、設定を構成してテストする前に、新しいユーザーに連絡することをお勧めします。
まず、テストユーザーを追加します。
sudo adduser sammy
プロンプトが表示されたらパスワードを割り当てます。他のプロンプトで「ENTER」を押すことができます。
ユーザーが特定のディレクトリに制限されている場合、FTPは通常より安全です。 vsftpd
は chroot
jailsを使用してこのステップを完了します。ローカルユーザーが 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
total 84 dr-xr-xr-x 2 nobody nogroup 4096 Aug 2421:29.4 drwxr-xr-x 3 sammy sammy 4096 Aug 2421: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 2614:01.
drwxr-xr-x 3 sammy sammy 4096 Aug 2613:59..
drwxr-xr-x 2 sammy sammy 4096 Aug 2614:01 files
最後に、将来のテストで使用するファイル test.txt
を追加します。
echo "vsftpd test file"| sudo tee /home/sammy/ftp/files/test.txt
ftp
ディレクトリを保護し、ユーザーが files
ディレクトリにアクセスできるようにしたので、構成に注目します。
ローカルシェルアカウントを持つ1人のユーザーがFTPに接続できるようにする予定です。 vsftpd.conf
には2つの重要な設定があります。最初に構成ファイルを開き、構成の設定が次の設定と一致することを確認します。
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
**注:**パッシブポート範囲用にここで設定したポートを事前に開いています。値を変更する場合は、必ずファイアウォールの設定を更新してください。
特定の状況に基づいてFTPアクセスのみを許可することを意図しているため、デフォルトではなく、リストに明示的に追加された場合にのみユーザーにアクセスできるように構成を設定します。
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
sammy
デーモンを再起動して、構成の変更をロードします。
sudo systemctl restart vsftpd
これで、テストする準備が整いました。
ユーザー sammy
のみがFTP経由で接続できるようにサーバーを構成しました。これが事実であることを確認しましょう。
匿名ユーザーは接続できないようにする:匿名アクセスを無効にしました。ここでは、匿名で接続してテストします。正しく行った場合は、匿名ユーザーへのアクセスを拒否する必要があります。
ftp -p 203.0.113.0
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>
接続を閉じます。
bye
他のユーザーsammyは接続できないはずです:次に、 sudo
ユーザーとして接続を試みます。また、アクセスを拒否する必要があり、パスワードの入力が許可される前にアクセスを拒否する必要があります。
ftp -p 203.0.113.0
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>
接続を閉じます。
bye
sammyは、ファイルの読み取りと書き込みだけでなく、接続できる必要があります:ここでは、指定されたユーザーが接続できるようにします。
ftp -p 203.0.113.0
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
コマンドを使用して前に作成したテストファイルをローカルコンピュータに転送します。
cd files
get test.txt
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 in0.0101seconds(1588 bytes/s)
ftp>
右に曲がり、新しい名前のファイルをアップロードして、書き込みアクセスをテストします。
put test.txt upload.txt
227 Entering Passive Mode(203,0,113,0,164,71).150 Ok to send data.226 Transfer complete.16 bytes sent in0.000894seconds(17897 bytes/s)
接続を閉じます。
bye
構成をテストしたので、サーバーをさらに保護するための手順を実行します。
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
証明書のアドレス情報を入力するように求められます。自分の情報を次の質問に置き換えてください。
Generating a 2048 bit RSA private key
............................................................................+++...........+++
writing newprivate 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 []:
証明書サインの詳細については、[Tencent Cloud SSL Certificate Service](https://cloud.tencent.com/product/ssl?from=10680)を参照してください。
証明書を作成した後、 vsftpd
構成ファイルを再度開きます。
sudo nano /etc/vsftpd.conf
ファイルの最後に、 rsa_
で始まる2行があります。コメントはそれらを次のように見せます:
# 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つのオプションを追加します。まず第一に、多くのFTPクライアントを壊す可能性があるため、SSLの再利用は必要ありません。 「高」暗号化暗号スイートが必要になります。これは、現在、キーの長さが128ビット以上であることを意味します。
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をサポートするクライアントを使用して接続できるかどうかを確認します。
最新のFTPクライアントのほとんどは、TLS暗号化を使用するように構成できます。クロスプラットフォームをサポートしているため、FileZillaを使用して接続する方法を示します。他のお客様の資料をご参照ください。
FileZillaを初めて開くときは、テキストの下にある「サイトマネージャー」アイコンを見つけます。これは、一番上の行の左端のアイコンです。クリックして:
新しいウィンドウが開きます。右下隅にある[新しいサイト]ボタンをクリックします。
「個人用サイト」の下に、「新しいサイト」という言葉が付いた新しいアイコンが表示されます。今すぐ名前を付けるか、後で戻って[名前の変更]ボタンを使用できます。
「ホスト」フィールドに名前またはIPアドレスを入力する必要があります。 [暗号化]ドロップダウンメニューで、[TLSを介した明示的なFTPが必要]を選択します。
「ログインタイプ」は「パスワードを尋ねる」を選択します。 [ユーザー]フィールドに作成したFTPユーザーを入力します。
インターフェイスの下部にある[接続]をクリックします。システムは、ユーザーパスワードの入力を求めます。
「OK」をクリックして接続します。これで、TLS / SSL暗号化を使用してサーバーに接続する必要があります。
証明書に同意したら、 files
フォルダーをダブルクリックし、upload.txtを左にドラッグして、ファイルをダウンロードできることを確認します。
完了したら、ローカルコピーを右クリックし、名前をupload-tls.txt`に変更してサーバーにドラッグし、ファイルをアップロードできることを確認します。
これで、SSL / TLS対応ファイルを安全かつ正常に転送できることを確認しました。
クライアントの要件のためにTLSを使用できない場合は、FTPユーザーが他の方法でログインできないようにすることで、ある程度のセキュリティを確保できます。比較的簡単な方法は、カスタムシェルを作成してそれを防ぐことです。これは暗号化を提供しませんが、感染したアカウントの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
下部に、以下を追加します。
... /bin/ftponly
次のコマンドでユーザーのシェルを更新します。
sudo usermod sammy -s /bin/ftponly
次に、sammyとしてログインしてみます。
ssh [email protected]
次のようなものが表示されます。
This account is limited to FTP access only.
Connection to 203.0.113.0 closed.
これにより、ユーザーは ssh
を使用してサーバーにアクセスできなくなり、FTPアクセスのみが使用できるようになります。
このチュートリアルでは、ローカルアカウントを持つユーザー向けのFTPの設定について説明しました。外部認証ソースを使用する必要がある場合は、仮想ユーザーに対するvsftpdのサポートを理解する必要がある場合があります。これにより、PAM(プラグ可能な認証モジュール)を使用して豊富なオプションが提供されます。これは、他のシステム(LDAPやKerberosなど)でユーザーを管理する場合に適しています。
その他のUbuntuチュートリアルについては、[Tencent Cloud + Community](https://cloud.tencent.com/developer?from=10680)にアクセスして詳細を確認してください。
参照:「Ubuntu16.04でユーザーのディレクトリ用にvsftpdを設定する方法」
Recommended Posts