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

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 という名前で作成します。

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

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

      202502_sftp_file_transfer_01
    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 ユーザを追記

      202502_sftp_file_transfer_02

    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 ですが、ホームディレクトリ配下のみアクセスできるよう設定したため「/」と表示されます。

      202502_sftp_file_transfer_03
    2. ファイル転送
      /efs/mnt/sftp-user 配下に test ディレクトリを作成し、その中にローカルにあるテキストファイルを転送していきます。
      test ディレクトリのオーナーとグループは sftp-user で作成します。
      test ディレクトリ作成とテキストファイル(test.txt)を準備すると画像のようになります。

      202502_sftp_file_transfer_04

      ローカル(左側)にあるテキストファイル(test.txt)をリモート接続先(左側)のtest ディレクトリ内にドラッグアンドドロップします。
      test ディレクトリの中を確認すると、テキストファイル(test.txt)が転送できました。

      202502_sftp_file_transfer_05

    まとめ

    EFS がマウントされた EC2 インスタンスに SFTP ユーザを作成、そのユーザから SFTP クライアントの WinSCP を使用してファイル転送を実施しました。
    SFTP 接続の設定・構築を初めて行ったので、とても勉強になりました。
    EFS を使用しているため、複数の EC2 インスタンスにマウントさせて利用することも可能です。
    どなたかのお役に立てれば幸いです。

    参考

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

    アジアクエスト株式会社では一緒に働いていただける方を募集しています。
    興味のある方は以下のURLを御覧ください。