Ubuntu 20.04 で SSL/TLS を使用して FTP サーバー (vsftpd) をインストールおよび構成する方法
このチュートリアルは、これらの OS バージョン用に存在します
- Ubuntu 18.04 (Bionic Beaver)
このページでは
- 前提条件
- ステップ 1 - vsftpd をインストールする
- ステップ 2 - ファイアウォールを構成する
- ステップ 3 - vsftpd の構成
- 1. FTP アクセス
- 2.ファイルのアップロードを有効にする
- 3.チュルート刑務所
- 4.パッシブ FTP
- 5.ユーザーを制限する
- ステップ 1 - 新しいユーザーを追加します。
- ステップ 2 - 許可された FTP ユーザー リストにユーザーを追加します。
- ステップ 3 - FTP とファイル ディレクトリを作成する
FTP またはファイル転送プロトコルは、クライアントとサーバー間でファイルを転送するための非常に古いよく知られたプロトコルです。また、TLS なしで使用する場合にのみ使用できる安全でないプロトコルでもあります。このチュートリアルでは、vsftpd を TLS 用に構成して、FTP を安全に使用できるようにします。最近では、FTP は SFTP や SCP などのより安全なプロトコルに置き換えられることがよくあります。
ただし、サーバーで FTP を使用する必要がある場合は、vsftpd (Very Secure FTP Daemon) が最適です。
このチュートリアルでは、Ubuntu 20.04 ベースのサーバーで vsftpd を使用して FTP サーバーをインストールおよび構成する方法を学習します。また、SSL/TLS プロトコルを使用して接続を保護する方法も学びます。
前提条件
- root 以外のユーザーが sudo 権限を持つ Ubuntu 20.04 サーバー。
ステップ 1 - vsftpd をインストールする
最初のステップは、vsftpd をインストールすることです。
$ sudo apt update $ sudo apt install vsftpd
次に、元の構成ファイルをバックアップして、新しい構成から開始できるようにする必要があります。
$ sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.orig
ステップ 2 - ファイアウォールの構成
このステップでは、FTP ポートへのアクセスを許可するように UFW ファイアウォールを構成します。
まず、ファイアウォールの状態を確認してみましょう。
$ sudo ufw status Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6)
これまでのところ、許可されているのは SSH ポートのみです。 TLS を使用する場合はポート 20 (FTP コマンド ポート)、21 (FTP データ ポート)、990 を開き、将来必要になる可能性があるパッシブ ポートの範囲のためにポート 35000 ~ 40000 を開きます。
$ sudo ufw allow 20:21/tcp $ sudo ufw allow 990/tcp $ sudo ufw allow 35000:40000/tcp $ sudo ufw status Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere 990/tcp ALLOW Anywhere 20:21/tcp ALLOW Anywhere 35000:40000/tcp ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) 20:21/tcp (v6) ALLOW Anywhere (v6) 990/tcp (v6) ALLOW Anywhere (v6) 35000:40000/tcp (v6) ALLOW Anywhere (v6)
ステップ 3 - vsftpd の構成
vsftpd が機能するために、いくつかの重要な設定について説明します。
構成ファイルを開くことから始めます。
$ sudo nano /etc/vsftpd.conf
1. FTP アクセス
このチュートリアルでは、FTP アクセスをローカル ユーザーのみに許可し、匿名アクセスを無効にします。これを行うには、次の行が存在し、次のようになっていることを確認します。
anonymous_enable=NO local_enable=YES
2.ファイルのアップロードを有効にする
ここでの FTP の最も重要な目的は、サーバーへの書き込みを可能にすることです。次の行のコメントを外して、その前にある
#
を削除してファイルのアップロードを有効にします。write_enable=YES
3.チュルート刑務所
FTP は、ユーザーが特定のディレクトリに制限されている場合に最適に機能します。 vsftpd は、chroot jail を使用してこれを実現します。ローカル ユーザーに対して chroot が有効になっている場合、デフォルトではホーム ディレクトリに制限されます。これを行うには、次の行のコメントを外します。
chroot_local_user=YES
セキュリティ上の脆弱性を防ぐために、chroot が有効になっている場合、ユーザーが制限されているディレクトリが書き込み可能である限り、chroot は機能しません。
この制限を回避するために、chroot が有効になっているときにファイルのアップロードを許可する 2 つの方法があります。
-
Method 1 - This method works by using a different directory for FTP uploads. For this tutorial, we will create an
ftp
directory inside the user's home to serve as the chroot and a second writable directoryupload
for uploading the files. To achieve this, add the following lines at the bottom of the file.user_sub_token=$USER local_root=/home/$USER/ftp
-
Method 2 - The second method is to simply grant writable access to the home directory as a whole. Add the following line to achieve this.
allow_writeable_chroot=YES
4.パッシブ FTP
vsftpd は、パッシブ FTP 接続に任意のポートを使用できます。 vsftpd が使用できるポート番号の最小値と最大値の範囲を指定できます。これらは、以前に UFW ファイアウォールで構成したポートです。
次の行を追加して、パッシブ FTP 接続を許可します。
pasv_min_port=35000 pasv_max_port=40000
5.ユーザーの制限
特定のユーザーのみが FTP サーバーにログインできるようにするには、以下の行を一番下に追加します。
userlist_enable=YES userlist_file=/etc/vsftpd.userlist userlist_deny=NO
このオプションを有効にして、FTP の使用を許可するユーザーを指定し、そのユーザー名を
/etc/vsftpd.userlist
ファイルに追加する必要があります。vsftpd を再起動して設定を有効にします。
$ sudo systemctl restart vsftpd
ステップ 4 - ユーザー ディレクトリの構成
このチュートリアルでは、FTP トランザクション用の新しいユーザー アカウントを作成します。この目的で既にユーザー アカウントを持っている場合は、ステップ 1 をスキップできます。また、以前に構成ファイルで
allow_writeable_chroot=YES
を設定したことがある場合は、ステップ 3 をスキップできます。ステップ 1 - 新しいユーザーを追加します。
$ sudo adduser testuser
強力なパスワードを設定し、他のすべてのプロンプトをスキップします。
ステップ 2 - 許可された FTP ユーザー リストにユーザーを追加します。
$ echo "testuser" | sudo tee -a /etc/vsftpd.userlist
ステップ 3 - FTP とファイル ディレクトリを作成する
このステップは、FTP ルートとして別のディレクトリが必要であり、chroot 監獄の制限を回避するためにファイルをアップロードするための別のディレクトリが必要な場合です。
FTP フォルダーを作成します。
$ sudo mkdir /home/testuser/ftp
所有権を設定します。
$ sudo chown nobody:nogroup /home/testuser/ftp
書き込み権限を削除します。
$ sudo chmod a-w /home/testuser/ftp
続行する前に権限を確認してください。
$ sudo ls -al /home/testuser/ftp total 8 dr-xr-xr-x 2 nobody nogroup 4096 Jun 7 13:08 . drwxr-xr-x 3 testuser testuser 4096 Jun 7 13:08 ..
次に、ファイルの実際の書き込み可能なディレクトリを作成しましょう。
$ sudo mkdir /home/testuser/ftp/upload $ sudo chown testuser:testuser /home/testuser/ftp/upload
権限をテストします。
$ sudo ls -al /home/testuser/ftp total 12 dr-xr-xr-x 3 nobody nogroup 4096 Jun 7 13:10 . drwxr-xr-x 3 testuser testuser 4096 Jun 7 13:08 .. drwxr-xr-x 2 testuser testuser 4096 Jun 7 13:10 upload
最後に、テストに使用する
test.txt
ファイルを追加しましょう。$ echo "vsftpd test file" | sudo tee /home/testuser/ftp/upload/test.txt
ステップ 5 - FTP アクセスのテスト
この時点で、当社の FTP サーバーは完全に機能しています。先に進む前に、少しテストを行うことができます。
匿名ユーザーとしてログインしてみましょう。
$ ftp -p 136.244.105.99 Connected to 136.244.105.99. 220 (vsFTPd 3.0.3) Name (136.244.105.99:default): anonymous 530 Permission denied. ftp: Login failed. ftp>
接続を閉じます。
ftp> bye
意図したとおりに機能します。つまり、匿名ユーザーは許可されません。
他の sudo ユーザーとして接続してみましょう。こちらも繋がらないはずです。
$ ftp -p 136.244.105.99 Connected to 136.244.105.99. 220 (vsFTPd 3.0.3) Name (136.244.105.99:default): sudo_user 530 Permission denied. ftp: Login failed. ftp>
接続を閉じます。
ftp> bye
最後に、FTP 用に作成した
testuser
として接続してみましょう。$ ftp -p 136.244.105.99 Connected to 136.244.105.99. 220 (vsFTPd 3.0.3) Name (136.244.105.99:default): testuser 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>
upload
ディレクトリに切り替え、get
コマンドを使用してテスト ファイルをローカル マシンに転送します。ftp> cd upload 250 Directory successfully changed. ftp> get test.txt 227 Entering Passive Mode (136,244,105,99,165,42). 150 Opening BINARY mode data connection for test.txt (17 bytes). 226 Transfer complete. 16 bytes received in 0.0101 seconds (164.3719 kB/s) ftp>
次に、
put
コマンドを使用して新しい名前でファイルをアップロードし、書き込み権限をテストします。ftp> put test.txt upload.txt 227 Entering Passive Mode (136,244,105,99,163,102). 150 Ok to send data. 226 Transfer complete. 17 bytes sent in 0.000894 seconds (518.7988 kB/s)
接続を閉じます。
ftp> bye
ステップ 6 - SSL/TLS を使用して送信を保護する
FTP 送信を暗号化するには、SSL 証明書を取得し、それを使用するように vsftpd を構成する必要があります。
FTP サーバーを指すドメインまたはサブドメインが既にある場合は、無料の Lets Encrypt SSL 証明書を作成して使用できます。
このチュートリアルでは、自己署名 SSL 証明書を使用します。作成するには、
openssl
コマンドを使用します。次のコマンドは、2048 ビットの秘密鍵と 1 年間有効な証明書を作成します。証明書とキーの両方が同じファイルに保存されます。
$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem
続くプロンプトをスキップするか、必要に応じて値を入力できます。
証明書が作成されたので、vsftpd 構成ファイルを再度開きます。
$ sudo nano /etc/vsftpd.conf
次の行を見つけて、次のように先頭にハッシュを付けてコメントアウトします。
# 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
に変更します。ssl_enable=YES
SSL セキュリティを向上させるために、さらにいくつかの設定を追加しましょう。
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
これらの設定のほとんどは一目瞭然です。これらは、匿名ユーザーの SSL を無効にし、データ転送とログインの両方に SSL を要求します。また、安全でない SSL プロトコルを無効にし、TLSv1.0 に固執します。最後に、SSL の再利用を無効にし、高度な暗号化暗号スイートを必要としています。
設定を有効にするためにサーバーを再起動します。
$ sudo systemctl restart vsftpd
これで、コマンド ライン経由で FTP を使用できなくなります。 TLS をサポートするクライアントを使用して接続する必要があります。
ステップ 7 - FileZilla を使用した TLS のテスト
このチュートリアルでは、Filezilla を使用して TLS 機能をテストします。
Filezilla を開いたら、一番上の行の Host のすぐ上にある Site Manager アイコンをクリックします。
新しいウィンドウが開きます。右下隅にある [新しいサイト] ボタンをクリックします。
新しいサイトという名前の新しいアイコンが表示されます。 [名前の変更] ボタンを使用して名前を変更できます。
[ホスト] フィールドにサーバーの IP アドレスを入力します。 FTP ポートは FTP のデフォルト ポートである 21 であるため、ポート フィールドは空のままにしておくことができます。 [暗号化] オプションで、ドロップダウン メニューから [明示的な FTP over TLS が必要] を選択します。
上記で作成したものを使用して、FTP ユーザー名とパスワードを入力します。 [接続] ボタンをクリックして続行します。
接続に成功すると、次のようなサーバー証明書が表示されます。
今後のセッションでこの証明書を常に信頼するオプションをチェックできます。ログインのたびに尋ねられないようにします。 [OK] をクリックして続行します。
通常の FTP 操作を実行できるようになりました。
ステップ 8 - シェル アクセスを無効にする
この手順は完全にオプションです。デフォルトでは、FTP ユーザーを作成するとき、明示的に指定されていない場合、ユーザーはサーバーへの SSH アクセスを持ちます。
セキュリティを向上させるために、FTP ユーザーへのシェル アクセスを無効にする必要があります。これを無効にするには、ユーザー アカウントが FTP アクセスのみに制限されていることを示すメッセージを出力する新しいシェルを作成する必要があります。
/bin/ftponly
シェルを作成し、実行可能にします。$ echo -e '#!/bin/sh\necho "This account is limited to FTP access only."' | sudo tee -a /bin/ftponly $ sudo chmod a+x /bin/ftponly
/etc/shells
ファイル内の有効なシェルのリストに新しいシェルを追加します。$ echo "/bin/ftponly" | sudo tee -a /etc/shells
ユーザー シェルを
/bin/ftponly
に変更します。$ sudo usermod newftpuser -s /bin/ftponly
同じコマンドを使用して、FTP アクセスを許可するすべてのユーザーのシェルを変更できます。
結論
これで、Ubuntu 20.04 ベースのサーバーに FTP サーバーをインストールするように vsftpd をインストールして構成したチュートリアルは終了です。また、SSL/TLS を使用して動作するように FTP 接続を構成しました。
質問がある場合は、以下のコメントで質問してください。