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

前書き ##

FTPは、クライアントとサーバー間でファイルを移動するためにかつて広く使用されていたネットワークプロトコルであるFile TransferProtocolの略語です。これは、より速く、より安全で、より便利なファイル転送方法に置き換えられました。多くのカジュアルなネットユーザーは、 httpsを使用してWebブラウザーから直接ダウンロードしたいと考えており、コマンドラインユーザーは scpやSFTPなどの安全なプロトコルを使用する方が簡単です。

FTPは、特定の要件を持つレガシーアプリケーションとワークフローをサポートするために引き続き使用されます。使用するプロトコルを選択できる場合は、より最新のオプションを検討することを検討してください。ただし、FTPが必要な場合は、vsftpdを選択することをお勧めします。 vsftpdは、セキュリティ、パフォーマンス、および安定性のために最適化されており、他のFTPサーバーに存在する多くのセキュリティ問題を十分に防ぐことができ、多くのLinuxディストリビューションのデフォルト設定です。

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

前提条件

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

Ubuntuサーバーができたら、起動できます。

**ステップ1-vsftpd **をインストールする##

まず、パッケージリストを更新し、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)に直接設定できます。

ステップ2-ファイアウォールをオンにする

ファイアウォールのステータスをチェックして、有効になっているかどうかを確認します。その場合、テストを妨げるファイアウォールルールに遭遇しないように、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をインストールし、必要なポートを開いたら、次のステップに進む準備ができています。

ステップ3-ユーザーディレクトリを準備する

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

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

sudo adduser sammy

プロンプトが表示されたらパスワードを割り当てます。他のプロンプトで「ENTER」を押すことができます。

ユーザーが特定のディレクトリに制限されている場合、FTPは通常より安全です。 vsftpd chrootjailsを使用してこのステップを完了します。ローカルユーザーが 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ディレクトリにアクセスできるようにしたので、構成に注目します。

ステップ4-FTPアクセスを構成する

ローカルシェルアカウントを持つ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

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

ステップ5-FTPアクセスをテストする

ユーザー 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

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

ステップ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

証明書のアドレス情報を入力するように求められます。自分の情報を次の質問に置き換えてください。

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をサポートするクライアントを使用して接続できるかどうかを確認します。

**ステップ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ユーザーが他の方法でログインできないようにすることで、ある程度のセキュリティを確保できます。比較的簡単な方法は、カスタムシェルを作成してそれを防ぐことです。これは暗号化を提供しませんが、感染したアカウントの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

Ubuntu16.04でユーザーディレクトリ用にvsftpdを設定する方法
Ubuntu16.04で匿名ダウンロード用にvsftpdを設定する方法
Ubuntu14.04でGogsを設定する方法
Ubuntu14.04でRを設定する方法
Ubuntu14.04でShinyServerをセットアップする方法
Ubuntu18.04で時刻同期を設定する方法
Ubuntu16.04用にGhostワンクリックアプリを設定する方法
UbuntuとRaspbianでJavaホームを設定する方法
Ubuntu14.04でMasterlessPuppet環境をセットアップする方法
Ubuntu14.04でUFWを使用してファイアウォールを設定する方法
Ubuntu16.04でApache仮想ホストを設定する方法
Ubuntu20.04でApache仮想ホストを設定する方法
Ubuntu14.04でNginxを使用してパスワード認証を設定する方法
Ubuntu16.04でPostgreSQLの起動を設定する方法
Ubuntu18.04サーバーで静的IPを設定する方法
Ubuntu18.04サーバーで静的IPを設定する方法
CentOS8でSSHキーを設定する方法
ubuntu14.04で静的IPを設定する方法を詳しく説明します
Ubuntuでrootユーザーのパスワードを変更する方法
Ubuntu16.04に基づいて固定IPを設定する方法
Ubuntu20.04にRubyをインストールする方法
Ubuntu20.04にMemcachedをインストールする方法
Ubuntu20.04にJavaをインストールする方法
Ubuntu20.04にMySQLをインストールする方法
Ubuntu20.04にVirtualBoxをインストールする方法
Ubuntu20.04にElasticsearchをインストールする方法
CentOS7でApache仮想ホストを設定する方法
Ubuntu20.04にNginxをインストールする方法
Ubuntu20.04にApacheをインストールする方法
Ubuntu20.04にGitをインストールする方法
Ubuntu16.04にNode.jsをインストールする方法
Ubuntu20.04にMySQLをインストールする方法
Ubuntu20.04にVagrantをインストールする方法
Ubuntu16.04にPostgreSQLをインストールする方法
Ubuntu20.04にGitをインストールする方法
Ubuntu18.04にMemcachedをインストールする方法
Ubuntu16.04にJenkinsをインストールする方法
Ubuntu14.04にMemSQLをインストールする方法
Ubuntu16.04にMongoDBをインストールする方法
Ubuntu14.04にMailpileをインストールする方法
Ubuntu14.04でPHP7にアップグレードする方法
Ubuntu20.04にSkypeをインストールする方法
Ubuntu20.04にJenkinsをインストールする方法
Ubuntu18.04にPython3.8をインストールする方法
Ubuntu18.04にKVMをインストールする方法
Ubuntu20.04にKVMをインストールする方法
ubuntu14.04にopencv3.0.0をインストールする方法
Ubuntu20.04にAnacondaをインストールする方法
Ubuntu18.04にJenkinsをインストールする方法
Ubuntu20.04にApacheをインストールする方法
Ubuntu20.04にRをインストールする方法
Ubuntu20.04でタイムゾーンを設定または変更する方法
Ubuntu16.04にMoodleをインストールする方法
Ubuntu16.04にTeamviewerをインストールする方法
Ubuntu14.04でNginxを保護する方法
Ubuntu20.04にMariaDBをインストールする方法
Ubuntu20.04にNginxをインストールする方法
Ubuntu20.04にGoをインストールする方法
Ubuntu20.04にZoomをインストールする方法
Ubuntu16.04にNginxをインストールする方法
UbuntuでSudoユーザーを作成する方法[クイックスタート]