はじめに
AWSのファイルストレージサービスであるEFSにローカルからファイルを転送するため、題名の構築が必要でした。
EC2にファイルをFTP接続で設置できるように、FTPサーバーとして構築します。
事前準備
・EC2を事前に設置
インターネットゲートウェイやサブネットも作成済み
こちらを参考にしました
・EC2のインバウンドのセキュリティーグループはこちらの設定にしてください。
「ポート21」はFTP通信でFTPサーバー接続用
「ポート22」はSSH接続でEC2サーバー接続用
「ポート60001-60010」はファイルを置く時に使用するポート。複数ポートを確保することで、接続時、負荷を分散できます。
流れ
①EC2をFTPサーバーとして構築
②rootユーザーでFTP接続する
③rootユーザーの使用を禁止し、別のユーザーを作成する
④作成したユーザーが他のディレクトリにアクセスしファイル転送する方法
⑤FTPユーザごとにホームディレクトリを指定する
⑥接続したユーザーのホームディレクトリより上の階層に対してアクセスを禁止する
⑦接続したユーザーのホームディレクトリより上の階層に対してアクセスをできるようにする
⑧ユーザーごとに表示できるディレクトリを制限する
⑨ファイルの説明
⑩ログファイルの見方
EC2をFTPサーバーとして構築
まずEC2にSSH接続します
$ ssh -i ~/.ssh/ec2-key.pem ec2-user@✕✕.✕✕✕.✕✕✕.✕✕
アップデート実行
$ sudo yum update -y
FTPクライアントをインストール
$ sudo yum install -y ftp
vsftpdをインストール
$ sudo yum install -y vsftpd
vsftpdの起動と自動起動設定をします。設定することでサーバーが再起動すると、vsftpdも自動で起動します。
$ sudo systemctl enable vsftpd
$ sudo systemctl start vsftpd
$ sudo systemctl status vsftpd
● vsftpd.service - Vsftpd ftp daemon
Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; enabled; vendor preset: disabled)
Active: active (running) since
起動していることが確認できました。
vsftpd.confを編集していくのですが、その前に、デフォルト設定をvsftpd.conf.org
というファイル名でコピーしておきます。こちらは編集しません。
$ cd /etc/vsftpd/
$ sudo cp -a vsftpd.conf vsftpd.conf.org
vsftpd.conf
を編集します。
$ sudo vim vsftpd.conf
以下の5行をvsftpd.conf
の一番下に追加し、保存します。
pasv_address=XX.XXX.XXX.XXX #EC2のパブリックIPアドレス(SSH接続時のアドレスと同じ)
pasv_enable=YES #パッシブモードON
pasv_addr_resolve=YES #パッシブモードの接続先IPアドレスをホスト名から取得
pasv_min_port=60001 #接続時の最小ポート番号
pasv_max_port=60010 #接続時の最大ポート番号
vsftpd.confファイルのの詳しい内容を知りたいかたはこちら
vsftpd.conf
を編集しましたので、再起動します。
$ sudo service vsftpd restart
rootユーザーでFTP接続する
「ftpuser」と「user_list」ファイルを編集します。
それぞれのファイルのroot
をコメントアウトして#root
に修正します。
$ sudo vim /etc/vsftpd/user_list
# root
$ sudo vim /etc/vsftpd/ftpusers
# root
**「user_list」**は、userlist_deny=YES もしくは記述が無い場合、接続禁止リストとして機能します。
つまり、「このリストに記述されているユーザーは FTP 接続ができない」ということになります。
**「ftpusers」**は、アクセスを禁止するためのリストです。
user_listよりも優先順位が高いので、user_listで許可されているユーザーであっても、このリストにユーザー名を書かれてしまうとアクセスできません。
rootユーザーのパスワードを設定します
$ sudo passwd root
ユーザー root のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。
FTPサーバーに接続できるか確認します。
$ ftp
ftp> open xxx.xxx.xx.xx(パブリックipアドレス)
Connected to xxx.xxx.xx.xx (xxx.xxx.xx.xx).
220 (vsFTPd 3.0.2)
Name (xxx.xxx.xx.xx:ec2-user): root
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
FTP接続できると確認できましたので、FileZillaなどのツールで確認します。
rootユーザーの使用を禁止し、別のユーザーを作成する
rootだとEC2サーバー内の全てのディレクトリとファイルにアクセスする権限がありますので、rootを使用できないようrootユーザーのログインを拒否
することができます。
先程の/etc/vsftpd/ftpusersの#root
のコメントアウトを消すとログインできません。
新規でユーザーを作成します。
ユーザー名:ftp-user、パスワード:hogehogepasswordの設定でユーザーを作成します。
$ sudo useradd ftp-user
$ sudo passwd ftp-user
ユーザー ftp-user のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。
作成したユーザーが他のディレクトリにアクセスしファイル転送する方法
ただし、ftp-userユーザーは、EC2内の/home/ftp-user
配下しかファイルが転送できません。
もし、EC2内の/mnt
や/var/www/html
にアクセスしてファイルを転送したい場合、ディレクトリの所有者を変更する必要があります。
$ ls -la /mnt
合計 0
drwxr-xr-x 2 root root 6 10月 1 13:50 .
dr-xr-xr-x 18 root root 257 10月 1 12:55 ..
/mntは、ユーザー所有権とグループ所有権がrootであると分かります。
そのため、ユーザー所有権とグループ所有権をftp-userに変えることで/mntへアクセスできるようにします。
$ sudo chown ftp-user:ftp-user /mnt
$ ls -la /mnt
合計 0
drwxr-xr-x 2 ftp-user ftp-user 6 10月 1 13:50 .
dr-xr-xr-x 18 root root 257 10月 1 12:55 ..
chownコマンドの詳しい内容についてはこちら
/mntにアクセスし、ファイルの転送できることを確認しました。
AWSのファイルストレージサービスであるEFSを用いて、EC2の/mntディレクトリ配下とEFSをマウントすることがありますので、使う場面はありますね。
こちらの記事では、EFSをEC2にマウントさせる方法を記載しています。
FTPユーザごとにホームディレクトリを指定する
ftp-userは、ログイン時、/home/ftp-user
がホームディレクトリになります。
ログイン時、/home/ftp-user
ではなく/mnt
がホームディレクトリになるよう設定します。
$ cd /etc/vsftpd/
$ ls
chroot_list ftpusers user_list vsftpd.conf vsftpd.conf.org vsftpd_conf_migrate.sh
$ sudo vim vsftpd.conf
vsftpd.confの設定に下記の内容を記載します。
ユーザごとの設定ファイルを参照する為のパスを記載します。
user_config_dir=/etc/vsftpd/vsftpd_user_conf
vsftpd_user_confディレクトリを作成します。
$ sudo vim /etc/vsftpd/vsftpd_user_conf/ftp-user
vsftpd_user_confディレクトリ配下
にftp-userファイルを作成し、ホームディレクトリを設定します。
local_root=/mnt
/mntにchrootされました!
接続したユーザーのホームディレクトリより上の階層に対してアクセスを禁止する
vsftpd.confに以下の内容を記入し、再起動すると、接続したユーザーのホームディレクトリより上の階層に対してアクセスを禁止できる
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
allow_writeable_chroot=YES
chroot_local_user=YES:ログイン後にユーザーのホームディレクトリにchrootする
chroot_list_enable=YES:chrootをしても例外的に上の階層にアクセスできるユーザーをリスト管理する
chroot_list_file=/etc/vsftpd/chroot_list:↑↑のリストであり、ここに書かれたユーザーは上の階層にアクセスできる
(chroot_listは作成する必要がある)
allow_writeable_chroot=YES:chroot先での書き込みを許可する(ない場合、ホームディレクトリ先が書き込み権限がないとアクセスできなくなる)
$ sudo service vsftpd restart
ftp-userは、ホームディレクトリより上の階層に、アクセスできなくなりました!
接続したユーザーのホームディレクトリより上の階層に対してアクセスをできるようにする
結論から言うと、先程chroot_list_file=/etc/vsftpd/chroot_list
と設定しましたが、chroot_list
ファイルを作成し、そこにホームディレクトリより上の階層に対してアクセスをできるようにしたいユーザーを記入する。
$ sudo vim chroot_list
# ここに記載されたユーザーは、ホームディレクトリより上の階層に対してアクセスをできる
ftp-user
ftp-userは、ホームディレクトリより上の階層に対してアクセスをできるようになりました!
ユーザーごとに表示できるディレクトリを制限する
mntディレクトリ配下に、efs
・efs2
・efs3
・efs3
ディレクトリがあります。
mnt/
├ efs
├ efs2
├ efs3
└ efs4
ftp-userには、efs2
・efs3
ディレクトリを操作してほしくないので、efs2
・efs3
が表示されない設定をしていきたいと思います。
vsftpd.confファイルに以下の設定がされているか確認します。されていなければ、設定します。
$ sudo vim /etc/vsftpd/vsftpd.conf
chroot_local_user=YES
user_config_dir=/etc/vsftpd/vsftpd_user_conf
そして、/etc/vsftpd/vsftpd_user_conf/ftp-user
のファイルがなければ作成します。
$ sudo vim /etc/vsftpd/vsftpd_user_conf/ftp-user
ftp-userファイルに表示したくないファイルやディレクトリを記載します。
deny_file={efs2,efs3}
hide_file={efs2,efs3}
ftp-userでログインすると、efs2
・efs3
ディレクトリが表示されなくなりました!
ファイルの説明
現在、/etc/vsftpd
配下には以下のファイルとディレクトリがあります。
/etc/vsftpd/
├ chroot_list
├ user_list
├ ftpusers
├ vsftpd.conf
├ vsftpd.conf.org
└ vsftpd_user_conf - ftp-user
一つ一つ説明していきます。
chroot_listファイル
vsftpd.confの設定で有効な場合、制限をかけたいユーザーを設定できます。
設定したユーザーは上位ディレクトリへの移動ができなくなります。
chroot_list_enableをYESにした場合、chroot_list_fileで指定したchroot_listファイルは必須になります。
ファイルが存在しない場合、全てのユーザがログインできなくなるので、ユーザいない場合でも、空のファイルを作る必要があります。
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
user_listファイル
ユーザーのアクセスを禁止、許可する制御ファイルです。
vsftpd.confの下記の設定内容によって意味が変わります。
「user_listファイルに追加したユーザーのアクセスを禁止する場合」
userlist_enable=YES
userlist_deny=YES #もしくは記述が無い場合
root #rootユーザーはアクセスできない
「user_listファイルに追加したユーザーのみアクセスを許可する場合」
userlist_enable=YES
userlist_deny=NO
root #rootユーザーのみアクセスできる
ftpusersファイル
ユーザーのアクセスを禁止するためのリストです。
user_listよりも優先順位が高いので、user_listで許可されているユーザーであっても、このリストにユーザー名を書かれてしまうとアクセスできません。
vsftpd.confファイル
FTPサーバーの設定ファイルです。
vsftpd.conf.orgファイル
FTPサーバーの設定のデフォルトファイルです。
基本的には触りません。
vsftpd_user_confディレクトリ
ユーザーごとにファイルを作成し、ユーザーごとの設定をすることができるディレクトリです。
# ホームディレクトリを指定
local_root=/mnt
# 表示したくないディレクトリ
deny_file={efs2,efs3}
hide_file={efs2,efs3}
FTP接続エラー
以下のように、接続拒否されることがあります。
$ ftp
ftp open [ec2のパブリックip]
ftp> ls
227 Entering Passive Mode (0,0,0,0,234,99).
ftp: connect: Connection refused
vsftpd.confファイルに以下の設定を加えると、接続できる場合があります。
# スタンドアロンモード(デーモン)で起動するかどうか(YES/NO)
listen=YES
# スタンドアロンモード(デーモン)で起動するかどうか(IPv6で待ち受ける)
listen_ipv6=NO
ログファイルの見方
/etc/vsftpd/vsftpd.conf
に以下の設定をすることで、ログを取得できます。
# ログ取得の有無(YES/NO)
xferlog_enable=YES
# ログファイルのファイル名を設定する
xferlog_file=/var/log/xferlog
# ログをxferlogのフォーマットにするかの設定する
xferlog_std_format=YES
/var/log/xferlog
では、以下のようなログが取得できます。
Tue Oct 26 18:08:07 2021 1 xx.xxx.xxx.xx 237796 /hoge/test.html b _ i r ec2-user ftp 0 * c
設定 | 意味 |
---|---|
Tue Oct 26 18:08:07 2021 | アクセス日時 |
1 | 転送時間、秒 |
xx.xxx.xxx.xx | アクセス元リモートホストのIP |
237796 | 転送されたバイト数 |
/hoge/test.html | 転送されたファイル名 |
b | 転送モード a: ascc, b: binary |
_ | 加えられたアクション C: ファイルは圧縮された, U: ファイルは解凍された, T: ファイルは tar された, _: なにも行われていない |
i | 転送の向き o: 出て行く方向, i: 入ってくる方向 |
r | ユーザーのアクセスモード a: 匿名のゲストユーザ, g: パスワード設定されたゲストユーザ, r: ローカルで認証されたユーザ |
ec2-user | ユーザー名 |
ftp | このサービスの名前:FTP |
0 | 認証方式 0: none, 1: RFC931 |
* | 認証時に返されるユーザーID, ユーザーIDが不可の場合は、* |
c | 転送の状態 c:転送完了、i:転送未完了 |
ファイル転送エラーしたときのログ
転送が未完了になっており、転送されたバイト数が0になっていることが分かります。
Thu Nov 11 16:27:47 2021 1 xx.xxx.xxx.xxx 0 /testtest/wp-config.php b _ i r ec2-user ftp 0 * i
FTP のすべての要求と応答をログに出力する
log_std_format
を無効化し、log_ftp_protocol
をYESに設定すると、すべての要求と応答をログに出力されす
# ログをxferlogのフォーマットにするかの設定する
- #xferlog_std_format=YES
# FTP のすべての要求と応答を記録
+ log_ftp_protocol=YES
あとは、再起動するだけです。
$ sudo service vsftpd restart
/var/log/xferlog
は、ログが出力されなくなり、
/var/log/vsftpd.log
に、ログが出力されるようになります。
FTP command: Client "xx.xx.xx.xx", "PASV"
FTP response: Client "xx.xx.xx.xx", "227 Entering Passive Mode (xx,xx,xx,xx,xx)."
同時接続数とパッシブポートを増やす
同一IPからの同時接続数はデフォルトで50ですが、ファイルの転送数が多い場合など、エラーになった場合以下のように修正してみます。
- 同時接続数を50から
200
- パッシブポートを「60001-60010」→「60001-60050」
まず、セキュリティーグループを「60001-60010」→「60001-60050」に修正します。
その後、vsftpd.conf
を修正して、再起動すると反映完了です、
$ sudo su
# vim /etc/vsftpd/vsftpd.conf
pasv_min_port=60001
- pasv_max_port=60010
+ pasv_max_port=60050
+ max_per_ip=200
# sudo service vsftpd restart
Redirecting to /bin/systemctl restart vsftpd.service
参考
・[AWS] EC2でFTPを使いたい
・【備忘録】FTPサーバーをAWSで立てる
・【AWS】閉域網のEC2にFTPサーバーを構築
・Linux:FTPユーザごとにホームディレクトリを指定する(vsftpd)
・vsftpdで上位ディレクトリへのアクセスを禁止するには
FTPではなく、SFTPサーバーの設定はこちらを参照するとできます。
・EC2をSFTPサーバー設定