AQ Tech Blog

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

作成者: aoto.yanai|2025年03月04日

はじめに

私が参画している案件で、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 という名前で作成します。

  1. sftp-user のホームディレクトリが EFS をマウントしたディレクトリ配下になるよう作成

    useradd -d /efs/mnt/sftp-user sftp-user
  2. 公開鍵を設定
    鍵認証でアクセスするため、公開鍵を配置して以下の構成にします。

  3. SFTP ユーザがアクセスできるディレクトリを制限
    作成した SFTP ユーザがホームディレクトリ配下のみアクセスできるよう、/etc/ssh/sshd_config ファイルに以下を追記します。

    Match User sftp-user
    ChrootDirectory /efs/mnt/sftp-user
    ForceCommand internal-sftp

    ChrootDirectory に記載するディレクトリは、オーナーとグループを root 、パーミッションを 755 にする必要があります。

  4. sshd 再起動
    /etc/ssh/sshd_config ファイルを変更したので sshd を再起動します。

    systemctl restart sshd.service 

vsftpd インストール

冒頭にも記載しましたが、今回 EC2 インスタンスを FTP サーバとして稼働させるため vsftpd をインストールし、パッシブモードで起動させていきます。

  1. vsftpd をインストール

    dnf -y install vsftpd 
  2. /etc/vsftpd/user_list ファイルに、作成した SFTP ユーザを追記

  3. /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アドレス
  4. vsftpd 起動
    vsftpd の設定が完了したので起動させます。

    systemctl start vsftpd.service 

WinSCP で接続確認とファイル転送

最後に WinSCP を使用して SFTP 接続を行い、ファイル転送をしていきます。
補足 : WinSCP はコンピュータ間でファイル転送が行えるオープンソースのクライアントソフトウェアです。

  1. WinSCP を起動・接続
    WinSCP を起動させて以下を入力します。

    • 転送プロトコル : SFTP
    • ホスト名 : グローバル IP アドレス
    • ユーザ名 : sftp-user
    • 設定 : sftp-user の秘密鍵を選択

    入力できたらログインを押下します。
    問題なければ画像のように左側がローカル、右側がリモート接続先となります。
    右側のリモート接続先のディレクトリを確認すると、「/」となっています。
    実際は sftp-user のホームディレクトリ /efs/mnt/sftp-user ですが、ホームディレクトリ配下のみアクセスできるよう設定したため「/」と表示されます。

  2. ファイル転送
    /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 インスタンスにマウントさせて利用することも可能です。
どなたかのお役に立てれば幸いです。

参考

EFS マウントヘルパーを使用した Amazon EC2 Linux インスタンスをマウントする