こんにちは、DX攻略部のラムネです。
最近、お客様からのご要望で「AWSのEC2上で構築したWordPress環境へFTP経由でファイル転送をする」というものがあり、記憶が新しいうちに備忘録も兼ねてノウハウをまとめておきたいと思います。
今回の要件では主に2つの課題があり、主に後半はネット上の情報があまりなく少々苦戦しましたので、その部分もお伝えできればと思います。
- EC2上にFTP環境を構築する
- 構築したFTP環境とEFSを連携させる
EC2×vsftpdでFTP環境を構築した理由
FTPとは、サーバーとクライアント間でファイルをやり取りするための通信プロトコル(手段)のことですが、FTP環境を構築する方法はいくつかあります。
その中でAWS環境でWordPressの環境が既に構築されていることを考慮すると、選択肢は主に2つです。
- Transfer Familyで構築する方法
- EC2×vsftpdで構築する方法
特に今回のように既にサービスとして稼働している場合は、コスト面さえ許容できれば①のTransfer Familyを使うのがベストな方法かと思います。
Transfer FamilyはFTP環境として存在しているだけで毎月219ドル(日本円換算で約3万円)のコストが発生する少々値の張るサービスです。(※ちなみにデータをやり取りすると、プラスαかかります。笑)
とは言え、本体サービスに影響を与えないよう構築できることと、セキュリティの面をAWS側に丸投げできることを踏まえると、一定の規模感のサービスではよく使われるサービスです。
今回も既にサービスとして運営しておりましたので、①の選択肢で最初は構築したのですが、接続元であるFTPクライアント側で繋がらないというハプニングが発生し、急遽②の選択肢でFTP環境を構築することになりました。
ちなみに、繋がらなかった原因は、「FTPクライアント側のセキュリティが①の要件に追いついておらず、Transfer Family側が接続拒否した」という内容でした。(「そんな環境でFTP接続するなよ!」というツッコミはグッと堪えました。)
さらにこの話には続きがあり、このハプニングが発生した翌日にはサービスの更新を控えており、大人の事情で残りのタイムリミットは24時間を切っておりました。
こういうタイミングで焦って構築すると、あまり良いことは起きないので、最悪の場合は営業の方になんとか調整してもらうつもりで着手に乗り出しました。
SFTP/FTPSではなくFTPを採用した理由
FTPを採用した理由は単純にFTPの接続元であるクライアント側の制約でFTPを採用しています。
ただし、本来はSFTPやFTPSといったセキュリティを意識したプロトコルを採用すべきです。特にFTPはクラッキングの対象になりやすく、昨今ではユーザー名とパスワードだけのログイン認証では不安要素の方が大きいのが実情です。
EC2上にvsftpdでFTP環境を構築する方法
さて、背景は色々ありましたが、本記事の本題であるEC2上にvsftpdでFTP環境を構築していきたいと思います。
STEP1: EC2にアタッチするセキュリティグループの設定
VPCやサブネット等のEC2を稼働させるまでの基礎的な構築は割愛しますが、セキュリティグループの設定は下記の通りです。
ここで重要になってくるポイントは下記の3点です。
- FTP接続用に21番ポートを開ける
- SSH接続用に22番ポートを開ける
- パッシブモード用に60001-60010番ポートを開ける
FTP接続のための21番ポート、SSH接続のための22番ポート、FTP経由でファイル転送する際にパッシブモードという方式を利用するあるための60001-60010番ポートを追加で開けています。
なお、これらのポートについては必ずしも上記のポート番号を使う必要はなく、後に設定するvsfptd側の設定ファイルで変更することも可能です。
セキュリティの観点からポートを意図的に変更することもありますので、この辺りについてはご自身の事情に合わせてポートを設定してください。今回はデモ環境ですので、定石通り設定します。
なお、アウトバウンドは「0.0.0.0/0」で、基本すべてを通して問題ありません。
STEP2: EC2の起動とElastic IPの付与
セキュリティグループの作成が完了したら、続いてEC2を構築していきましょう。
基本的なポイントは理解している前提で進めますが、ポイントをまとめると下記の通りです。
- Amazon マシンイメージ:Amazon Linux 2023 AMI
- インスタンスタイプ:t2.micro
- セキュリティグループ:STEP1で作成したものをアタッチ
- パブリック IP の自動割り当て:一応ONにしておきました。
設定ができたら「インスタンスを起動」をクリックし、EC2を起動させてください。
無事にEC2の起動したら、Elastic IP(固定IP)も忘れずにアタッチしましょう。
STEP3: EC2環境にvsftpdをインストール
EC2を起動できたら、ローカルPCからSSH接続でEC2へログインしましょう。
一応ですがSSH接続用のコマンドです。
ssh -i ~/.ssh/[EC2にセットしたキーペアのファイル名] ec2-user@[EC2のパブリックIPアドレス]
無事にEC2へログインできたら、まずはお作法ですが、既存パッケージを最新のものへアップデートしましょう。
sudo yum update -y
続いて、下記コマンドで必要パッケージをインストールしましょう。
sudo yum install -y vsftpd
インストールが完了したら、次はvsftpdを起動させましょう。
sudo systemctl start vsftpd
あとは、サービスの自動起動も有効化しておきましょう。
sudo systemctl enable vsftpd
ここまででvsftpdのインストールと基本設定は完了したので、最後にステータスを確認し、エラーがないことを確認します。
sudo systemctl status vsftpd
STEP4: FTPアクセス用のユーザー作成
次に、FTPアクセス用のユーザーを新規作成していきましょう。
EC2上での新規ユーザーの作成は下記コマンドを実行するだけでOKです。
sudo adduser ftp-user
sudo adduser [ユーザー名]
ですので、[ユーザー名」の部分はご自身の好きな名称に変更してください。
次に、ユーザーにパスワードを設定していきます。
下記コマンドを実行することで、登録するパスワードを求められます。これが後にFTP接続をする際のパスワードになりますので、安全に保存しておきましょう。
sudo passwd ftp-user
※ftp-user
の部分はご自身が作成したユーザー名に変更してください。
最後にユーザーが正常に作成できているかを確認します。
sudo cat /etc/passwd
(補足)必要に応じて作成したユーザーをグループに追加することも忘れずに!
FTP専用のユーザーを作成する場合、必要に応じてユーザーを特定グループに追加することも忘れないようにしましょう。
例えば、WordPressをApacheを使って動作させている場合はftp-user
でファイルを追加してもパーミッションエラーにならないようにする必要があります。
# apacheグループにftp-userを追加するコマンド
sudo usermod -aG apache ftp-user
オプション-a
をつけないと上書きされてしまうので、必ず付けるようにましょう。
普段からサーバー構築している人からすれば、「そんなことわざわざ書かなくても…」と言われるかもですが、本記事ではド素人でもFTP構築できることをコンセプトにしているためお許しください笑
STEP5: vsftpdの設定ファイルに必要設定を追加
続いて、vsftpdの設定に移っていきます。
ハマるポイントその1としてインターネット上の設定を鵜呑みにして、コピペで動かそうとすると、結構エラーが出ますので1つ1つ意味を理解して設定するようにしましょう。
まずは設定ファイルを開きましょう。
sudo vi /etc/vsftpd/vsftpd.conf
非常に長い英文まじりの設定ファイルなので嫌気が指すかもしれませんが、設定部分のみをまとめると、デフォルトで設定されているものは下記の通りです。
###########################################
## デフォルトで設定されているもの
###########################################
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES
listen=YES
listen_ipv6=NO
pam_service_name=vsftpd
userlist_enable=YES
そして、今回別途追加したオプションは下記の通りです。
###########################################
## オプションで設定したもの
###########################################
# ユーザーリストのホワイトリスト化
userlist_deny=NO
# ドットファイルも見れるようにする
force_dot_files=YES
# パッシブモードでの接続設定
pasv_address=[EC2の固定IPを設定]
pasv_enable=YES
pasv_addr_resolve=YES
pasv_min_port=60001
pasv_max_port=60010
# ログイン後にユーザーのホームディレクトリにchrootする
chroot_local_user=YES
# chrootをしても例外的に上の階層にアクセスできるユーザーをリスト管理する
chroot_list_enable=YES
# ここに書かれたユーザーは上の階層にアクセスできる
chroot_list_file=/etc/vsftpd/chroot_list
# chroot先での書き込みを許可する
allow_writeable_chroot=YES
# FTPユーザごとにホームディレクトリを指定
user_config_dir=/etc/vsftpd/vsftpd_user_conf
1つ1つ解説していきましょう。
user_listを有効化し、ホワイトリストとして設定する
まずはuser_listについて、user_listはその名の通りユーザー一覧のことで一覧にユーザー名を追加することで、特定ユーザーのみFTP接続できるようにしたり、逆に接続できないようにしたりすることが可能になります。
user_listについてはインストール時にデフォルトで用意されており、下記コマンドで確認/変更することができます。
sudo vi /etc/vsftpd/user_list
なお、ユーザーリストを変更する際には念のため、バックアップも行っておきましょう。
sudo cp /etc/vsftpd/user_list /etc/vsftpd/user_list.org
ここからが解説になりますが、user_listのデフォルト設定ではブラックリスト設定になっており、今回はホワイトリスト(登録したユーザーのみFTPアクセスできる)設定にしたかったので、下記2つのオプションでそれを設定しています。
# ユーザリストを有効化
userlist_enable=YES
# ユーザーリストのホワイトリスト化
userlist_deny=NO
ドットファイルも見れるように設定
ドットファイルも見れるようにしたいのでforce_dot_filesをYESに設定しています。
デフォルト設定ですと、.htaccessなどのドットから始まるファイルが閲覧できません。
# ドットファイルも見れるようにする
force_dot_files=YES
パッシブモードで接続できるように設定
パッシブモードで接続したいので下記設定も追加しました。
# パッシブモードでの接続設定
pasv_address=[EC2の固定IPを設定]
pasv_enable=YES
pasv_addr_resolve=YES
pasv_min_port=60001
pasv_max_port=60010
pasv_address
にはEC2のパブリックIP(Elastic IP)を設定してください。
パッシブモードを有効化するためのpasv_enable=YES
、お名前解決できるようにするためのpasv_addr_resolve=YES
、STEP1でセキュリティグループで設定したポート範囲で処理を実行させるためのpasv_min_port=60001
とpasv_max_port=60010
を設定しています。
FTPユーザーのホームディレクトリを独自に設定
FTPユーザーがログインした際のホームディレクトリーを個別指定したかったため、下記設定でそれを実現しています。
# ログイン後にユーザーのホームディレクトリにchrootする
chroot_local_user=YES
# FTPユーザごとにホームディレクトリを指定
user_config_dir=/etc/vsftpd/vsftpd_user_conf
chroot_local_user=YES
で個別のホームディレクトリ設定を有効化し、user_config_dir=/etc/vsftpd/vsftpd_user_conf
でvsftpd_user_confフォルダ内にそれぞれユーザー毎のファイルを作成し、個別にホームディレクトリーを設定しています。
なお、vsftpd_user_confフォルダのファイル名はSTEP4で作成したユーザー名をそのままファイル名として設定し、ユーザー毎の個別ファイルにはlocal_root=/home/ftp-user/efs
という形で指定し、FTP接続したユーザーが最初に位置すべき地点(パス)を指定しています。
ホームディレクトリより上の階層にアクセスできないように設定
ホームディレクトリよりも上の階層へアクセスできるユーザーとできないユーザーをそれぞれ指定したかったため、下記設定も追加しました。また書き込み権限も与えています。
# chrootをしても例外的に上の階層にアクセスできるユーザーをリスト管理する
chroot_list_enable=YES
# ここに書かれたユーザーは上の階層にアクセスできる
chroot_list_file=/etc/vsftpd/chroot_list
# chroot先での書き込みを許可する
allow_writeable_chroot=YES
また、chroot_listファイルはデフォルトでは生成されないため、設定ファイルにchroot_list_file
で設定したパスにファイルを新規作成しましょう。
sudo touch /etc/vsftpd/chroot_list
余談までに設定ファイルにchroot_list_file
を指定した状態で、パス指定先にファイルが存在しないと、接続時に下記のようなエラーが発生してしまいます。
ですので、そもそもオプションを設定しないか、パス指定先にchroot_listファイルを設置するかのどちらかで対応しましょう。
以上、ここまでが今回vsftpdで設定した内容となります。
STEP6: 構築したFTP環境の疎通確認
ここまで設定したらあとは疎通確認を行うのみです。
FilezillaなどのFTPソフトに下記情報を入力し、接続を実行してください。
- FTPユーザー名(STEP4で作成したやつ)
- FTPパスワード(STEP4で作成したやつ)
- FTPホスト名(EC2のパブリックIP)
また、今回はパッシブモードを使用してファイル転送を行うため、予め転送モードを「パッシブ」に設定しておきましょう。※デフォルトでも正常に動作するとは思いますが。
設定が完了したら「接続」ボタンを押し、正常にFTP接続ができてることを確認ください。
ファイルの閲覧/ダウンロード/書き込みができることも確認して問題がなければFTP構築完了です。
もし疎通確認で失敗した場合の対処法
システム開発というものはアップデートや環境の違いにより、うまく動作しないことはよく起こります。
このような問題が発生した際に適切な問題切り分けを行う能力もエンジニアの能力として重要になってくるわけですが、1つのコツとして「最初からやり直す」というのは解決策の一つとしておすすめです。
もちろん、最初は過去の履歴ややったことを遡り、ミスがないかを確認することが重要ですが、本当に詰まったときはEC2を一から立てて、こまめに疎通確認を行いつつ、石橋を叩きながら構築を進めることでたいていの問題はクリアになります。
ちなみに、今回のFTP構築の際につまずきやすいポイントは下記の通りです。
- セキュリティグループが適切に設定できていない。
- ユーザー作成時のユーザー名やパスワードが誤っていた。
- vsftpd.confの設定に誤りがある
特に③については、問題箇所の特定が難しかったりするので、EC2を新しく立てvsftpdのインストールから開始する、もしくは、バックアップを取っておいたvsftpd.conf.orgを復活させて初期設定で疎通確認を行うなどの対応を行ってみることをおすすめします。
EC2上のFTP環境とEFSを連携させる方法
一旦ここまでで本記事の本題である「EC2にvsftpdを使ってFPT環境を構築する方法」は以上となります。
続きの「EC2で構築したFTP環境とEFSを連携させる方法」について詳しく知りたい方は下記記事をご覧ください。
こんにちは、DX攻略部のラムネです。 前回に引き続き今回この記事では「構築したFTP環境とEFSを連携させる方法」について解説していきたいと思います。 前回はEC2上にvsftpdでFTP環境を構築するところまでを解説しましたが[…]
EC2で構築したFTPとEFSの連携方法はかなり限定的なノウハウとなりますが、ネット上にあまり情報がなく少々苦戦しましたので現在お悩みの方の助けになれば幸いです。
実際、EC2とFTPの連携という点で言えば、開発現場での利用頻度はそこそこありますので、決して無駄と捨て去るほどの知識でもない、少々絶妙なラインですね。笑
まとめ
本記事では「EC2にvsftpdを使ってFPT環境を構築する方法」について解説してきました。
本記事のポイントは下記の2点です。
- vsftpdの設定ファイルは最小限でまず疎通確認を行おう!
- vsftpdの設定オプションは1つ1つどのような効果があるのか理解して設定しよう!
24時間というタイムリミットがあり、少々焦りましたが、無事構築することができました。
今回の場合は、EFSが絡んできたため少々厄介でしたが、この記事を通して、少しでも現場エンジニアの助けになれれば幸いです。
もし「助かった!ありがとう!」という方は、ぜひDX攻略部のベーシック会員(無料)にでもなっていただけると嬉しいです。笑
DX攻略部では「企業のデジタル化戦略」を支援しており、DXに役立つサービスのご紹介や使い方の開発やマーケ現場で使う実践的なノウハウをこのような形で記事を通して発信しております。
最近では非常に多くの方にDX攻略部を知っていただく機会が増え、嬉しく思うと同時に、正確でより役立つ情報発信をすることの重要性を改めて再認識しております。
最後までお読みいただきありがとうございました。