前言
本篇將分享:
- vsftpd 的設定細節
- 建立一個特定的 FTP user
- 使用 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 是反向代理這個資料夾, 不過因為跟本篇較無關係,看看就好!
參考資料
- 我心目中的
Linux
之神,鳥哥大
http://linux.vbird.org/linux_server/0410vsftpd.php - Digital Ocean 的大神
https://www.digitalocean.com/community/questions/proper-permissions-for-web-server-s-directory
留言