2015年10月28日 星期三

Linux FTP Server 安全性設定 (VSFTPD on CentOS 7)

相關的安全性設定,包括:
一、關閉 FTP 匿名登入。
二、FTP 帳號, 不可透過 ssh 登入作業系統。
三、FTP 帳號登入後,只看的到自己的 home 目錄,不可隨意切換到作業系統上層目錄。
四、防火牆設定。

1. 安裝 vsftpd
yum install -y vsftpd
systemctl start vsftpd      (啟動 ftp daemon)
systemctl enable vsftpd   (設為開機啟動 ftp daemon)
CentOS 7 Daemon 相關的一些控制改為用 systemctl 指令來操作了。

2. 建立 FTP 的使用者用帳號

useradd -m ftpuser
3. 關閉匿名登入 FTP
編輯 /etc/vsftpd/vsftpd.conf,修改 anonymous_enable 為 no anonymous_enable=NO
4. 設定可連入 FTP 的使用者白名單
編輯 /etc/vsftpd/vsftpd.conf
userlist_enable=YES
userlist_deny=NO                          (設定白名單 (只有user_list內的使用者可以登入FTP))
userlist_file=/etc/vsftpd/user_list       (使用者清單的檔案路徑)
編輯 /etc/vsftpd/user_list,檔案內容只留一行 ftpuser
vi /etc/vsftpd/user_list
5. 設定 ftp 連線的 user 只能在自己 home 目錄,禁止隨意切換到上層目錄,例如根目錄 /,這個功能稱為 chroot (change root,change 使用者的根目錄)
編輯 /etc/vsftpd/vsftpd.conf,加上下面三行。
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
在 /etc/vsftpd 產生一個 chroot_list 檔案

touch chroot_list
chroot_list 用來設定不受管制的 user 帳號清單。若希望 root 帳號連入時,可隨意切換目錄,則在 chroot_list 檔案內容加上一行 root 。

vsftpd.conf 有更動,記得重新啟動一下 vsftpd systemctl restart vsftpd
6. 修改 SELinux 設定,允許 vsftpd 可執行 change root 到 user home 目錄
預設 SELinux 不允許 vsftpd change root 到 user home 目錄,沒改的話會出現以下錯誤。
500 OOPS: cannot change root
查看SELinux 現有設定
getsebool -a | grep ftp

執行 setsebool -P ftp_home_dir 1
更新:於CentOS 7.3後,沒有ftp_home_dir屬性,改為 ftpd_full_access,故執行 setsebool -P ftpd_full_access 1

7. 把 ftp user 的 home 目錄 write 權限拿掉
例如 ftp user 帳號為  ftpuser,則把 /home/ftpuser 的 write 權限拿掉,若沒拿掉 write 權限,則出現,500 OOPS: vsftpd: refusing to run with writable root inside chroot()
執行以下指令,拿掉 write 權限:
chmod a-w /home/ftpuser 子目錄才有 write 權限,
所以建立一個 /home/ftpuser/folder , folder 這個目錄才能上傳檔案。
cd /home/ftpuser
mkdir folder

8. 設定 ftpuser 帳號不可使用
ssh 登入作業系統
編輯 /etc/passwd,將 ftpuser 的 shell 改為 /sbin/nologin
執行 systemctl restart sshd
9. passive mode firewall policy
編輯 /etc/vsftpd/vsftpd.conf,加上以下三行,指定 data transfer 使用的 port range 從 4000 到 4500。
pasv_enable=YES
pasv_max_port=4000
pasv_min_port=4500

CentOS 7的版本預設是用 firewalld,不過我習慣用 iptables。接受來源 IP: xx.xx.xx.xx 連接 FTP 21 port 與 data transfer port 4000~4500。
iptables -I INPUT -p tcp -s xx.xx.xx.xx -dport 21 -j ACCEPT
iptables -I INPUT -p tcp -s xx.xx.xx.xx -dport 4000:4500 -j ACCEPT



沒有留言: