使用 vsftpd 在 GCP VM 上部署 FTP Server

前言

本篇將分享:

  1. vsftpd 的設定細節
  2. 建立一個特定的 FTP user
  3. 使用 gcloud command line 開啟相對應的防火牆

環境

  • GCP VM
  • ubuntu 18.04

安裝 vsftpd

sudo apt install vsftpd

設定檔

  • 打開設定檔

    sudo vim /etc/vsftpd.conf
  • 設定參數如下:

    # 如果不想跑在預設的 21 port, 這個必須要打開
    listen=YES
    # 承上,如果 listen 為 yes, 這個必須是 NO
    listen_ipv6=NO

    # 是否允許匿名者登入,預設是 NO。此例子中,我們只允許我們設定的 user 存取 server, 所以設定為 NO
    anonymous_enable=NO

    # 本篇目的是要建立一個特定使用者,並且只允許這位使用者登入,所以須為 YES
    local_enable=YES
    #
    # 允許寫入的權限
    write_enable=YES

    # 該使用者的預設 umask
    local_umask=002

    # 在每個資料夾內,我們可以建一個檔名為 `.mssage` 的檔案,裡頭輸入訊息,當登入者進到這個資料夾實,就會顯示這則訊息
    dirmessage_enable=YES

    # 使用當地時間
    use_localtime=YES

    # 當登入者上傳或下載檔案時,都將之記錄下來
    xferlog_enable=YES

    # 檔案傳輸的 port 為 20, 我們用被動模式, 所以選 NO
    connect_from_port_20=NO

    # 啟用被動模式
    pasv_enable=YES

    # xferlog 的位置,可以更改
    xferlog_file=/var/log/vsftpd.log

    # 是否使用正式格式。 選擇 NO 的話會比較易讀,但若有使用 log 分析軟體,建議選 YES
    xferlog_std_format=YES

    # 當使用者登入時,會顯示的歡迎訊息
    ftpd_banner="Welcome to QCDN's FTP server, feel free to upload whatever you would like to deploy on Website."

    # chroot 意思就是 change root,是否要將使用者預設就限制在自己的根目錄內,為了安全性考量,此選項建議打開, 否則登入者就被允許在你的 server 裡面閒晃
    chroot_local_user=YES

    # 允許這項功能的話,我們可以建立一個列表,列表裡頭的使用者將被允許可以離開自己的根目錄
    chroot_list_enable=YES

    # 乘上,該列表位置
    chroot_list_file=/etc/vsftpd.chroot_list

    # 須為一個名稱為 empty 的資料夾,且使用者不可對該資料夾有寫入的權限。當使用者未獲得檔案存取權限之前,會被限制在這個資料夾內
    secure_chroot_dir=/var/run/vsftpd/empty

    # 這是用來管理使用者權限的一個檔案,檔案位於 /etc/pam.d/vsftpd, 裡頭可以找到一個被限制存取的列表, /etc/ftpusers, 如果你不想讓哪一位使用者存取,你只要把他的帳號加到這個檔案裡頭就行了
    pam_service_name=vsftpd
    #

    # 利用 TLS 加密傳輸的資料,本篇不使用
    rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
    rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
    ssl_enable=NO

    # 為了要指定每個不同登入者的家目錄,這邊取得登入者的變數
    user_sub_token=$USER

    # 指定本地登入者的 root 位置, 若指定在別的位置,會跟 chroot 相衝突,如果要將使用者限制在自己的根目錄,需指定此路徑
    local_root=/home/$USER/ftp

    # 如果不想使用預設的 21 port, 可以自己指定 port 號
    listen_port=21212

    # 預設0, 使用任何 port 號。 這邊是一個被動模式的 port 使用範圍。 當伺服器端收到使用者端的被動模式要求,伺服器端會從這個區間內回覆使用者端一個用來傳輸資料的 port 供資料傳輸使用
    pasv_min_port=40000

    # 預設0, 使用任何 port 號。 這邊是一個被動模式的 port 使用範圍。 當伺服器端收到使用者端的被動模式要求,伺服器端會從這個區間內回覆使用者端一個用來傳輸資料的 port 供資料傳輸使用
    pasv_max_port=50000

    # 啟用 userlist 功能來限制可以存取的使用者,其功能基本上跟 pam 是類似的,是另外一種方式, 若要啟用,為 YES
    userlist_enable=YES

    # 當此值為 YES, 則填入下一個設定檔中的帳號為禁止存取。 當此值為 NO, 為嚴格模式,只有被加入檔案的使用者可以存取
    userlist_deny=NO

    # 呈上,為使用者限制的列表檔案
    userlist_file=/etc/vsftpd.userlist

    # 每秒存取的最大流量 byts
    local_max_rate=10000000

    # 是否允許被限制在 chroot 的使用者有寫入的權限,因為我們要允許使用者上傳檔案,所以為 YES
    allow_writeable_chroot=YES

    # 預設為0, 表示無限制。 最大允許連線 server 的用戶端數量
    max_clients=50

    # 預設為0, 表示無限制。 來自同 ip 的最大允許連線數量
    max_per_ip=5

    # 是否使用 TCP Wrappers。TCP wrappers 是透過用戶端想要連結的程式檔名,然後分析用戶端的 IP ,看看是否需要放行
    tcp_wrappers=YES

    # 是否允許紀錄兩種不同格式的 log
    dual_log_enable=YES

    # log 的位置
    vsftpd_log_file=/var/log/vsftpd.log

建立 user

sudo adduser test

之後再輸入密碼,假設為 1234

建立相關設定檔

sudo touch /etc/vsftpd.chroot_list && sudo mkdir /home/test/ftp && sudo touch /etc/vsftpd.userlist && sudo touch /var/log/vsftpd.log

權限設定

  • 我架設這個 FTP Server 主要是要讓前端可以簡單地利用上傳來做簡單的部署,所以下面才會有 www-data 的相關權限設定。 有興趣可以看看,不然跳過也沒關係,因為這跟 FTP Server 沒有很直接的關係

  • 建立共同群組
    此資料夾,預設只有該使用者以及 nginx 的 www-data 可以存取,所以先建立共同群組

    sudo groupadd ftp_access
  • ftp 使用者以及 www-data 加入此群組

    sudo usermod -a -G ftp_access test && sudo usermod -a -G ftp_access www-data
  • 設定權限

    sudo find /home/test/ftp -type d -exec chmod 2770 {} \; && sudo find /home/test/ftp -type f -exec chmod 0664 {} \; && sudo chmod /home/test/ftp test:ftp_access

設定允許存取者

echo 'test' > /etc/vsftpd.userlist

GCP 防火牆設定

給機器加 tag

  • 我個人習慣用 gcloud shell, 可以選擇以下兩種方式
  • 若你對 gcloud 不熟,也可以選擇使用網頁 UI 操作
  • 登入跟開機器的部分就略過,因為不在本篇主題範圍內
  • 給機器加 tag
    gcloud compute instances add-tags instanceName \
    --tags test

    開啟防火牆

  • 依據指定的 tag 來開啟防火牆,這樣才不會開到所有的機器上
  • 開啟連線 port
    gcloud compute firewall-rules create ftp-communication --allow tcp:21212 --target-tags test
  • 開啟 passive port 的範圍
    gcloud compute firewall-rules create ftp-dataportrange --allow tcp:40000-50000 --target-tags test

FTP 連線

安裝

  • mac
    brew install inetutils
  • ubuntu
    應該已經有了

重啟

sudo service vsftpd restart;sudo service vsftpd status

應該要是 running

連線

ftp -p yourIP 21212
  • 輸入我們設定 user: test
  • 輸入密碼: 1234
  • 試試上傳一個檔案
    put whateverFile

結論

沈浸在技術研究的感覺總是令人沈醉,雖然當遇到難題時,還真的想大醉一場
有設定到 www-data 的部分,那是因為其實這個 FTP server 是架設來讓前端可以做簡單的部署,只要把 code 上傳,我的 NginX 會有一個 config 是反向代理這個資料夾, 不過因為跟本篇較無關係,看看就好!

參考資料

利用 Let's Encrypt 來自動簽署並更新 SSL 憑證 pm2 - 用法大全

留言

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×