圖片來自 Blake Patterson

在 AWS EC2 架設 pure-ftpd 服務

有時候還是需要 FTP 這種老派的服務,總之就是要給它架起來!

搭配的系統是 Ubuntu 18.04 LTS,提供 FTP 服務的是 pure-ftpd,當初在調查 FTP daemon 的時候比較常看到別人是選用 vsftpd,可是設定好像有點複雜,最後找到 pure-ftpd 感覺比較簡單就挑它了!

本文單純就是架一台機台起來然後讓它提供 FTP 服務,不會涉及到 AWS S3。另外本文假設讀者已經懂得基本的 Linux 操作及 AWS 操作,故也不會講怎麼開 AWS / EC2 / IP / SSH / Cloud9 等主題。

在架設前需要了解一些 FTP 的基礎知識,特別是被動式 FTP(Passive FTP)的基本知識。由於 EC2 只認得自己的 Private IP,不認得自己的 Public IP,所以須強制指定它送出的 IP 設成 AWS Public IP,不然客戶端會無法正常使用。

安裝 pure-ftpd

ubuntu$ sudo apt update
ubuntu$ sudo apt install pure-ftpd

確認 pure-ftpd 正常運作

ubuntu$ service pure-ftpd status

應該會看到「Active: active (running)」的字樣,表示正常運作中。

設定 pure-ftpd

pure-ftpd 的設定都放在 /etc/pure-ftpd/conf/ 內,每個檔名代表一個設定項目,檔案的內容為該項目的設定值,通常為 yes 或 no 或 IP 或數字。完整的設定在 pure-ftpd 的文件內,你可以選擇花五個小時把它看完或者直接跟我下面的設定,有其它需求再問 Google 或 StackOverflow。

檔名內容說明
NoAnonymousyes禁止匿名登入
UnixAuthenticationyes直接用系統帳號作為 FTP 認證帳密
DisplayDotFilesno不顯示隱藏檔
ForcePassiveIPAWS Elastic IP強迫對客戶端回覆 AWS Public IP
PassivePortRange30000 - 5000被動模式可使用的 port 範圍
ChrootEveryoneyes只允許 FTP 用戶存取自己的家目錄
TrustedGID27開放讓 GID = 27 的成員讀取所有目錄(大權限)

設定 AWS 安全組(防火牆)

有幾個 port 必須打開才能夠提供服務,標準的 FTP 通訊 port 21 及前面指定的 port 30000 – 50000,以上這兩組 port 要到 AWS 安全組那邊去開放入站。

建 FTP 帳戶與群組

在建立之前,我們的計畫是不讓這些 FTP 用戶從 login 登入,只讓他們從 FTP 登入,所以要把 nologin 加入系統的 shell 清單內,並指定這些用戶使用 nologin。

系統的 shells 檔案在 /etc/shells,編輯它並在最後一行加入 /usr/sbin/nologin。

開始建帳戶與群組:

ubuntu$ sudo groupadd ftp
ubuntu$ sudo useradd ftp001 -g ftp
ubuntu$ sudo passwd ftp001
Enter new UNIX password: ftp001password

幫 ftp001 建家目錄並設定權限:

ubuntu$ sudo mkdir /home/ftp001
ubuntu$ sudo chown -R ftp001:ftp /home/ftp001

幫 ftp001 設 nologin:

ubuntu$ sudo chsh ftp001
Login Shell [/bin/bash]: /usr/sbin/nologin

這樣 ftp001 就設定好了,本節幾個步驟可以寫成 shell script 方便日後使用。