找了一下,看到 vsftpd (very secure ftpd) 似乎蠻好架,於是就來試試看。
顧及自己動物機的安全,因此要求如下:
- 支援虛擬帳號 (virtual account),能與作業系統帳號切開
- 不可以隨便亂逛,把系統看光光 (chroot)
- 不允許匿名使用者
1. 安裝
$ sudo apt-get install vsftpd libpam-pwdfile由於 vsftpd 是利用 pam 來與系統的驗證機制結合,這樣他就可以利用系統的帳號登入。
因此我們也可以用它來產生虛擬帳號的功能。
其中 pwdfile 是 apache web server 使用者權限管理的 library,這樣我們就可以用同樣的方法來管理虛擬帳號。
2. 設定檔 (請覆蓋或備份原本的檔案)
/etc/vsftpd.conf
# global settings
listen=YES
listen_port=2211
anonymous_enable=NO
write_enable=YES
hide_ids=YES
# local accont
local_enable=YES
local_umask=022
virtual_use_local_privs=YES
guest_enable=YES
guest_username=ftpsecure
nopriv_user=ftpsecure
# chroot
chroot_local_user=YES
#user_sub_token=$USER
#local_root=/mnt/ftproot/$USER
local_root=/mnt/ftproot
secure_chroot_dir=/var/run/vsftpd
# pam auth setting ==> /etc/pam.d/vsftpd
pam_service_name=vsftpd
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log
#xferlog_std_format=YES
# pasv mode setting
pasv_enable=YES
pasv_max_port=65535
pasv_min_port=49152
# monitor
# monitor command: watch ps -C vsftpd -o user,pid,stime,cmd
setproctitle_enable=YES
/etc/pam.d/vsftpd
# Customized login using htpasswd file
auth required pam_pwdfile.so pwdfile /etc/vsftpd/passwd
account required pam_permit.so
3. 建立虛擬使用者對應的系統使用者
為了讓系統更安全,通常我們會讓伺服器用獨立的使用者執行。
在上面的設定檔中,我們使用 ftpsecure 這個帳號。
$ sudo adduser ftpsecure
然後修改 /etc/passwd 。把 shell 設定成 /bin/false。
在這邊我把他的家目錄也設定成跟 local_root 相同了。但這並不一定需要。
ftpsecure:x:9876:9876:,,,:/mnt/ftproot:/bin/false
接下來,因為 vsftpd 不允許 user 到 chroot 的根目錄有寫入權限。
因此我們來修改一下權限:
$ sudo chwon nobody:nogroup /mnt/ftproot
$ sudo chmod 755 /mnt/ftproot
然後建一個目錄讓 user 可以寫入
$ sudo mkdir /mnt/ftproot/upload
$ sudo chown ftpsecure:ftpsecure /mnt/ftproot/upload
$ sudo chmod 755 /mnt/ftproot/upload
4. 建立虛擬使用者
你必須先安裝 apache 以取得 htpasswd 這個指令。
假設我要把密碼檔存放在 /etc/vsftpd/passwd ,以及建立 ftpuser 這個帳號。
$ sudo mkdir /etc/vsftpd
$ sudo htpasswd -dc /etc/vsftpd/passwd ftpuser
5. 重啟 server
$ sudo service vsftpd restart
6. 防火牆
$ sudo ufw allow 2211
$ sudo ufw allow proto tcp to any port 49152:65535
7. 測試
$ ftp localhost 2211
8. Monitor
$ watch ps -C vsftpd -o user,pid,stime,cmd