FTP通信とは
File Transfer Protocol
ネットワーク上のクライアントとサーバー間でファイルを転送するための通信プロトコル
アクティブモード、パッシブモードとは
こちらの記事がわかりやすかったです。
まず、FTP接続はふたつのコネクションを組み合わせて使用する
- コントロールコネクション(制御)
FTPサーバーにログインする際の利用者認証、
クライアントとサーバー間のコマンドやレスポンスのやり取りに使用して、
データコネクションを確立する
接続が確立されてからセッション終了まで維持される
ポート21を使用
- データコネクション(データ転送)
実際のファイルを転送するために使用
ファイル転送時のみ接続され、転送完了後に切断
デフォルトでポート20を使用(パッシブモードでは動的ポート)
FTPにおけるアクティブモードとパッシブモードは、データ転送時のクライアントとサーバー間の接続確立方法の違いを指す。
アクティブモード
- アクティブモードはFTPが生まれたときに開発された古い方式
- クライアントが2つのポートをリッスン(コントロール用とデータ転送用)
- サーバーからクライアントへ接続開始
- サーバ側からクライアント側に接続を試みるため、クライアント側のファイアウォールに通信が拒否されることがある
- ポート20からクライアントの指定ポートへ接続
パッシブモード
- サーバーが動的ポートをリッスン
- クライアントからサーバーへ接続開始
- サーバーが指定した動的ポートにクライアントが接続
近年はファイアウォールの制限を避けやすいパッシブモードが一般的です。
実際のモードの選択は、FTPクライアントが接続時に決定します。
サーバーはどちらのモードでも対応できるように設定を行います。
- アクティブモードのサポート
connect_from_port_20=YES/NO #ポート20の使用設定 デフォルトYES
port_enable=YES #アクティブモードを有効化 デフォルトYES
- パッシブモードのサポート
pasv_enable=YES #パッシブモードを有効化 デフォルトYES
pasv_min_port=60001 #パッシブポートの範囲指定
pasv_max_port=60003
今回はFileZillaからパッシブモードで接続します。
構成図
・FTPサーバは、vsftpdを使用
vsftpd(Very Secure FTP Daemon):
Unix系システムで広く使用されているFTPサーバーソフトウェアのこと
1.VPC環境の準備
VPC、サブネット、インターネットゲートウェイ、NATゲートウェイ、ルートテーブルの作成
2.NLBの作成
1.セキュリティグループ作成
タイプ | プロトコル | ポート範囲 | ソース |
---|---|---|---|
カスタムTCP | TCP | 60001-60003 | 外部から接続してくるユーザのグローバルIPアドレス |
カスタムTCP | TCP | 21 | 外部から接続してくるユーザのグローバルIPアドレス |
2.リスナーの追加
制御ポート:21(TCP)
データ転送用ポート:60001(TCP)
データ転送用ポート:60002(TCP)
データ転送用ポート:60003(TCP)
3.ターゲットグループの追加
2.で設定したリスナーに対して、バックエンドのEC2に繋ぐようにそれぞれターゲットグループを作成する。
※データ転送用ポートはデータ転送時以外は非アクティブなため、
データ転送ポート用ターゲットグループ作成時は、HealthCheck項目のportをOverride選択して21にする。
3.FTPサーバーの構築
1. セキュリティグループ作成
タイプ | プロトコル | ポート範囲 | ソース |
---|---|---|---|
カスタムTCP | TCP | 60001-60003 | NLBのSG |
カスタムTCP | TCP | 21 | NLBのSG |
2. EC2インスタンスの作成
項目 | 値 |
---|---|
名前とタグ | 任意で設定 |
マシンイメージ | Amazon Linux2023 |
インスタンスタイプ | t2.micro |
キーペア | 任意で設定 |
セキュリティグループ | 既存のセキュリティグループを選択する(先ほど作成したものを選択) |
その他はデフォルトで設定
3. FTPサーバーのインストール
①EC2インスタンスにSSM接続をする。
FTPサーバ用のソフト【vsftpd】をインストール
sudo yum install vsftpd -y
sudo systemctl enable vsftpd.service
sudo systemctl start vsftpd.service
②vsftpd.config ファイルを編集する
sudo vi /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
xferlog_enable=YES
xferlog_std_format=YES
listen=YES
listen_ipv6=NO
pasv_enable=YES
pasv_min_port=60001
pasv_max_port=60003
pasv_addr_resolve=YES
pasv_address=<NLB DNSホスト名 or NLBのAレコードを設定したホスト名>
pasv_promiscuous=NO
tcp_wrappers=NO
pam_service_name=vsftpd
userlist_enable=YES
userlist_deny=NO
初心者ならではの視点を大切にしているので各行詳しく説明します:
anonymous_enable=NO
- 匿名ユーザーでのFTPアクセスを禁止
- セキュリティ向上のため、認証済みユーザーのみアクセス可能
local_enable=YES
- ローカルユーザー(システムに登録されているユーザー)のFTPアクセスを許可
write_enable=YES
- ユーザーによるファイルのアップロード、変更、削除などの書き込み操作を許可
local_umask=022
- アップロードされるファイルのパーミッション設定
- 022は所有者以外の書き込み権限を制限(ファイルは644、ディレクトリは755になる)
local_umask=022
の設定でもファイルのアップロードは可能
これを理解するために重要なポイントは:
write_enable=YES
によって、FTPでのアップロード自体は許可されているlocal_umask
は、アップロード後のファイルのパーミッションを決定する
つまり:
- アップロード時の動作:
write_enable=YES
で制御 - アップロード後のファイル権限:
local_umask=022
で制御
xferlog_enable=YES
- FTPの転送ログを有効化
- セキュリティ監査やトラブルシューティングに使用
xferlog_std_format=YES
- 標準的なxferlogフォーマットでログを記録
- 他のFTPサーバーと互換性のあるログ形式を使用
listen=YES
- IPv4でのFTP接続をリッスン(待ち受け)
listen_ipv6=NO
- IPv6でのFTP接続を無効化
pasv_enable=YES
- パッシブモードFTPを有効化
pasv_min_port=60001
pasv_max_port=60003
- パッシブモードで使用するポートの範囲を指定
pasv_addr_resolve=YES
- pasv_addressで指定したホスト名をDNSで解決することを許可
- パッシブモードでFTPクライアントに返すIPアドレスを、pasv_addressで指定されたホスト名からDNS解決で取得する
pasv_address=<NLB DNSホスト名 or NLBのAレコードを設定したホスト名>
- パッシブモード接続時にクライアントに通知するアドレス
- NLBのDNSホスト名を指定
pasv_promiscuous=NO
- データコネクションとコントロールコネクションのIPアドレスが一致することを確認
- 異なるIPアドレスからの接続を拒否
- デフォルト値であり、セキュリティ上推奨される設定
tcp_wrappers=NO
- TCP Wrappersによるアクセス制御を無効化
TCP Wrappersは、特定のIPアドレスやホスト名からのアクセスを許可/拒否するための制御機能。
現在ではファイアウォールでこれらの制御を行うのが一般的
pam_service_name=vsftpd
- PAM(Pluggable Authentication Modules)認証サービスの名前を指定
- vsftpdがユーザーを認証する際のルールを定義
- /etc/pam.d/vsftpdというファイルにルールを記載
- パスワードによる認証やLDAPなど、どの認証方式を使うかを決定
簡単に言えば、「FTPサーバーにログインする時の認証方法を決めるための設定」
userlist_enable=YES
- ユーザーリストを使用して、FTPサーバーへのアクセスを制御する機能を有効にする設定
- このリストとuserlist_denyの設定により、特定のユーザーのアクセスを許可または拒否
userlist_deny=NO
- ユーザーリストを許可リストとして使用する設定
- YES:リストに載っているユーザーのアクセスを拒否
- NO:リストに載っているユーザーのみアクセスを許可
- リストは通常/etc/vsftpd.userlistに保存される
4.FTPユーザーを追加
①ユーザーの作成
sudo adduser --home /home/ftp-user ftp-user
今回はユーザー名をftp-user
とした。
②ユーザーのパスワードを任意で設定する
sudo passwd ftp-user
③ホームディレクトリの所有権を変更する
sudo chown ftp-user:ftp-user -R /home/ftp-user/
これにより、このユーザーがホームディレクトリ内のすべてのファイルとサブディレクトリに対して読み書きができるようになる。
④ホームディレクトリのパーミッション設定
sudo chmod 750 /home/ftp-user/
セキュリティのために、他のユーザーからのアクセスを制限
⑤user_listへの追加
sudo echo "ftp-user" | sudo tee -a /etc/vsftpd/user_list
- vsftpdのユーザーリストにftp-userを追加
- このリストは、設定に応じてFTPアクセスを許可または拒否するユーザーを管理する
userlist_enable=YES
の設定と組み合わせて機能する
⑥最後にvsftpdサービスを再起動
sudo systemctl restart vsftpd
4.FTPサーバーに接続
今回は FileZilla を使ってFTPサーバーにログインする。
項目 | 値 |
---|---|
プロトコル | FTP |
ホスト | NLBのパブリックDNS名を入力 |
ポート番号 | 21 |
ユーザー名 | 作成したユーザー名を入力 |
パスワード | 設定したパスワードを入力 |
→ FileZilla 3.68.1 で稼働確認できました。
参考
https://miyashimo-studio.jp/blog/detail/filezilla-how-to-use/
https://qiita.com/kce119/items/49608562aecacd45e5bb