前書き
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を設定して、ユーザーがSSL / TLSで保護されたログイン資格情報を使用してFTPを使用して自分のホームディレクトリにファイルをアップロードできるようにする方法を示します。
前提条件
このチュートリアルを進めるには、次のものが必要です。
-
* `+ sudo +`特権を持つ非rootユーザーを持つUbuntu 16.04サーバー*:これらの特権を持つユーザーの設定方法の詳細については、https://www.digitalocean.com/community/tutorials/initialをご覧ください。 -server-setup-with-ubuntu-16-04 [Ubuntu 16.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
プロンプトが表示されたらパスワードを割り当て、他のプロンプトで「ENTER」を押してください。
一般に、ユーザーが特定のディレクトリに制限されている場合、FTPはより安全です。+ vsftpd + `は
+ 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/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//ftp/files
sudo chown : /home//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//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=
. . .
`+ local_root directory `パスにユーザー名を挿入するために ` user_sub_token +`を追加して、このユーザーと今後追加される可能性のあるユーザーに対して設定が機能するようにします。
/etc/vsftpd.conf
十分な接続が利用できるように、パッシブFTPに使用できるポートの範囲を制限します。
/etc/vsftpd.conf
FTPアクセスはケースバイケースでのみ許可することを計画しているため、デフォルトではなく明示的にリストに追加された場合にのみアクセスが許可されるように設定をセットアップします。
/etc/vsftpd.conf
`+ userlist_deny +`はロジックを切り替えます。 「YES」に設定すると、リスト上のユーザーはFTPアクセスを拒否されます。 「NO」に設定すると、リスト上のユーザーのみがアクセスを許可されます。 変更が完了したら、ファイルを保存して終了します。
最後に、ユーザーを作成してファイルに追加します。 ファイルに追加するには、 `+ -a +`フラグを使用します。
echo "" | sudo tee -a /etc/vsftpd.userlist
期待どおりに追加されたことを再確認します。
cat /etc/vsftpd.userlist
Outputsammy
デーモンを再起動して、構成の変更をロードします。
sudo systemctl restart vsftpd
これでテストの準備が整いました。
ステップ5-FTPアクセスのテスト
ユーザー「+ sammy +」のみがFTP経由で接続できるようにサーバーを設定しました。 そうであることを確認しましょう。
匿名ユーザーは接続に失敗する必要があります:匿名アクセスを無効にしました。 ここでは、匿名で接続してみてテストします。 適切に行った場合、匿名ユーザーは許可を拒否する必要があります。
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 +`は、ファイルの読み取りと書き込みに加えて、接続できる必要があります*:ここで、指定ユーザーcanconnectを確認します:
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
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]:
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
完了したら、ファイルを保存して閉じます。
次に、変更を有効にするためにサーバーを再起動する必要があります。
sudo systemctl restart vsftpd
この時点で、安全でないコマンドラインクライアントと接続することはできなくなります。 試した場合、次のように表示されます。
ftp -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.
421 Service not available, remote server has closed connection
ftp>
次に、TLSをサポートするクライアントを使用して接続できることを確認します。
ステップ7-FileZillaを使用したTLSのテスト
最新のFTPクライアントは、TLS暗号化を使用するように構成できます。 クロスプラットフォームサポートのため、FileZillaを使用して接続する方法を示します。 他のクライアントのドキュメントを参照してください。
FileZillaを初めて開いたとき、Fileという単語のすぐ下にあるSite Managerアイコンを見つけます。これは、一番上の行の左端のアイコンです。 クリックして:
image:http://assets.digitalocean.com/articles/vsftp-user/site-manager.png [サイトマネージャーのスクリーンショット]
新しいウィンドウが開きます。 右下の[新しいサイト]ボタンをクリックします。
image:http://assets.digitalocean.com/articles/vsftp-user/new-site.png [New Site Button] + [My Sites]の下に、「New site」という言葉の付いた新しいアイコンが表示されます。 ここで名前を付けるか、後で戻って[名前の変更]ボタンを使用できます。
「ホスト」フィールドに名前またはIPアドレスを入力する必要があります。 [暗号化]ドロップダウンメニューで、[TLSを介した明示的なFTPが必要]を選択します。
「ログオンの種類」で「パスワードを要求」を選択します。 「ユーザー」フィールドに作成したFTPユーザーを入力します。
image:http://assets.digitalocean.com/articles/vsftp-user/site-config2.png [一般設定]タブ+インターフェイスの下部にある[接続]をクリックします。 ユーザーのパスワードを求められます:
image:http://assets.digitalocean.com/articles/vsftp-user/user-pass.png [パスワードダイアログ] + [OK]をクリックして接続します。 これで、TLS / SSL暗号化を使用してサーバーに接続する必要があります。
image:http://assets.digitalocean.com/articles/vsftp-user/site-cert.png [サイト証明書ダイアログ] 証明書を受け入れたら、「 files +」フォルダーをダブルクリックしてアップロードをドラッグします。ファイルをダウンロードできることを確認するには、左側のtxtをクリックします。
+ image:http://assets.digitalocean.com/articles/vsftp-user/file-test.png [test.txtのダウンロード] +完了したら、ローカルコピーを右クリックして、名前をupload- tls.txt`をサーバーにドラッグして戻し、ファイルをアップロードできることを確認します。
image:http://assets.digitalocean.com/articles/vsftp-user/file-upload.png [名前の変更とアップロード] + 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 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などの別のシステムでユーザーを管理する場合に適しています。