EFSをマウントしたEC2にSFTPでファイル転送

目次
はじめに
私が参画している案件で、EFS をマウントしたディレクトリに SFTP ユーザでアクセスし、ファイル転送ができるようにしてほしいとの要件がありました。その構築を行ったので、備忘録として残したいと思います。
本記事では、EFS がマウントされた EC2 インスタンスに SFTP ユーザを作成、そのユーザから SFTP クライアントの WinSCP を使用してファイル転送ができるか確認していきます。
また、EC2 インスタンスを FTP サーバとして稼働させるために vsftpd をインストールし、パッシブモードで起動させます。
環境
Amazon Linux 2023 の EC2 インスタンスと EFS はすでに構築しており、マウントもしています。
マウントする際、以下の設定をしています。
- EFS クライアントインストール
amazon-efs-utils
- マウント用のディレクトリを作成し、そのディレクトリへ EFS をマウント
- ディレクトリ :
/efs/mnt
- ディレクトリ :
- EC2 インスタンス再起動時に EFS が自動的にマウントされるよう、
/etc/fstab
に以下を追記- ※ファイルシステム ID は作成した EFS の ID を記載
ファイルシステムID:/ /efs/mnt efs _netdev,noresvport,tls,iam 0 0
今回は SFTP ユーザの作成から設定をしていきます。
SFTP ユーザ作成
sftp-user という名前で作成します。
-
sftp-user のホームディレクトリが EFS をマウントしたディレクトリ配下になるよう作成
useradd -d /efs/mnt/sftp-user sftp-user
-
公開鍵を設定
鍵認証でアクセスするため、公開鍵を配置して以下の構成にします。 -
SFTP ユーザがアクセスできるディレクトリを制限
作成した SFTP ユーザがホームディレクトリ配下のみアクセスできるよう、/etc/ssh/sshd_config
ファイルに以下を追記します。Match User sftp-user
ChrootDirectory /efs/mnt/sftp-user
ForceCommand internal-sftp※
ChrootDirectory
に記載するディレクトリは、オーナーとグループを root 、パーミッションを 755 にする必要があります。 -
sshd 再起動
/etc/ssh/sshd_config
ファイルを変更したので sshd を再起動します。systemctl restart sshd.service
vsftpd インストール
冒頭にも記載しましたが、今回 EC2 インスタンスを FTP サーバとして稼働させるため vsftpd をインストールし、パッシブモードで起動させていきます。
-
vsftpd をインストール
dnf -y install vsftpd
-
/etc/vsftpd/user_list
ファイルに、作成した SFTP ユーザを追記 -
/etc/vsftpd/vsftpd.conf
ファイルに以下を設定
①/etc/vsftpd/user_list
ファイルに記載されているユーザのみが FTP・SFTP で接続可能userlist_enable=YES
userlist_deny=NO②パッシブモード有効
pasv_enable=YES
③パッシブモードで使用するポートの範囲
SFTP通信のパッシブモードでは 2 つのポートが使用されます。- 通信制御用:22 番ポート
- データ転送用:ランダム
データ転送用がランダムとなるため、サーバ側で使用するポートの範囲を設定する必要があります。
今回は 60000 ~ 60010 を範囲とします。pasv_min_port=60000
pasv_max_port=60010※設定したポートでの通信を可能にするため、EC2 インスタンスのセキュリティグループにはポート 22 番、60000 ~ 60010 番のインバウンドルールを許可する設定が必要です。
④パッシブモードで接続する際の接続先 IP アドレスを指定pasv_address=グローバルIPアドレス
-
vsftpd 起動
vsftpd の設定が完了したので起動させます。systemctl start vsftpd.service
WinSCP で接続確認とファイル転送
最後に WinSCP を使用して SFTP 接続を行い、ファイル転送をしていきます。
補足 : WinSCP はコンピュータ間でファイル転送が行えるオープンソースのクライアントソフトウェアです。
-
WinSCP を起動・接続
WinSCP を起動させて以下を入力します。- 転送プロトコル : SFTP
- ホスト名 : グローバル IP アドレス
- ユーザ名 : sftp-user
- 設定 : sftp-user の秘密鍵を選択
入力できたらログインを押下します。
問題なければ画像のように左側がローカル、右側がリモート接続先となります。
右側のリモート接続先のディレクトリを確認すると、「/」となっています。
実際は sftp-user のホームディレクトリ/efs/mnt/sftp-user
ですが、ホームディレクトリ配下のみアクセスできるよう設定したため「/」と表示されます。 -
ファイル転送
/efs/mnt/sftp-user
配下に test ディレクトリを作成し、その中にローカルにあるテキストファイルを転送していきます。
test ディレクトリのオーナーとグループは sftp-user で作成します。
test ディレクトリ作成とテキストファイル(test.txt)を準備すると画像のようになります。ローカル(左側)にあるテキストファイル(test.txt)をリモート接続先(左側)のtest ディレクトリ内にドラッグアンドドロップします。
test ディレクトリの中を確認すると、テキストファイル(test.txt)が転送できました。
まとめ
EFS がマウントされた EC2 インスタンスに SFTP ユーザを作成、そのユーザから SFTP クライアントの WinSCP を使用してファイル転送を実施しました。
SFTP 接続の設定・構築を初めて行ったので、とても勉強になりました。
EFS を使用しているため、複数の EC2 インスタンスにマウントさせて利用することも可能です。
どなたかのお役に立てれば幸いです。
参考
アジアクエスト株式会社では一緒に働いていただける方を募集しています。
興味のある方は以下のURLを御覧ください。