2015年8月18日 星期二

vsftpd 虛擬帳號設定 - 使用檔案清單或 MySQL

更新日期:2015-08-17
(本篇文章來回修改數次,如果有內容不一致的地方請見諒)

Linux 版本:CentOS 6.6 32bit

相關檔案
/etc/vsftpd/vsftpd.conf vsftpd 設定檔
/etc/vsftpd/ftpusers 禁止使用 ftp 的系統帳號清單
/etc/vsftpd/user_list 帳號列表。是否允許帳號使用ftp
/etc/vsftpd/chroot_list 帳號列表。是否將檔案裡的帳號限制在家目錄。
/etc/vsftpd/userconf (自訂資料夾) 存放各別帳號設定檔的資料夾

目錄安排
/home/vsftpd => 所有 ftp 資料夾都在這底下
/home/vsftpd/john => 虛擬用戶 john 的家目錄
/home/vsftpd/alice => 虛擬用戶 alice 的家目錄


1. 安裝相關套件

[root@localhost ~]# yum install -y vsftpd 
[root@localhost ~]# yum install -y pam* db4*
[root@localhost ~]# yum install -y mysql mysql-server pam_mysql


2. 編輯 vsftpd 設定檔
[root@localhost ~]# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.ori
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
## modified by Ron Lee ## 2015-08-17 #log file xferlog_enable=YES xferlog_file=/var/log/xferlog xferlog_std_format=YES #connect time connect_timeout=60 accept_timeout=60 idle_session_timeout=300 # IP, port connect_from_port_20=YES pasv_min_port=63001 pasv_max_port=63200 # pam pam_service_name=vsftpd # privilege dirlist_enable=YES download_enable=YES write_enable=YES local_umask=022 virtual_use_local_privs=YES # list of users not to chroot chroot_list_enable=YES chroot_local_user=YES chroot_list_file=/etc/vsftpd/chroot_list # list of users being denied userlist_enable=YES userlist_deny=YES userlist_file=/etc/vsftpd/user_list # virtual users nopriv_user=vsftpd local_enable=YES guest_enable=YES guest_username=vsftpd user_sub_token=$USER local_root=/home/vsftpd/$USER user_config_dir=/etc/vsftpd/userconf # other listen=YES anonymous_enable=NO dirmessage_enable=YES tcp_wrappers=YES max_clients=200 max_login_fails=5 # 下面這兩個參數現在不能使用。啟動時系統會回報 vsftpd:500 OOPS: unrecognised variable in config file convert_charset_enable=1 local_charset=UTF8

3. 編輯虛擬帳號設定檔

3.1 使用檔案清單

3.1.1 建立虛擬帳號

格式:帳號、密碼、帳號、密碼...
[root@localhost ~]# vim /etc/vsftpd/virtual_users
john 123456789 peter 987654321

3.1.2 將虛擬帳號檔轉換成資料庫格式
[root@localhost ~]# db_load -T -t hash -f /etc/vsftpd/virtual_users /etc/vsftpd/virtual_users.db
[root@localhost ~]# rm -f /etc/vsftpd/virtual_users

3.1.3 編輯 pam 的 vsftpd 設定檔
[root@localhost ~]# cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.ori
[root@localhost ~]# vim /etc/pam.d/vsftpd
auth required /lib/security/pam_userdb.so db=/etc/vsftpd/virtual_users account required /lib/security/pam_userdb.so db=/etc/vsftpd/virtual_users

3.1.4 為每個虛擬帳號建立設定檔
如果在 vim /etc/vsftpd/vsftpd.conf 設定妥當,不一定要為個別帳號做設定。
[root@localhost ~]# vim /etc/vsftpd/userconf/john
local_root=/home/john write_enable=NO anon_upload_enable=NO
write_enable 跟 anon_upload_enable 都設成 NO,表示唯讀。
可能會有個疑問:anon 開頭應該是指暱名帳號,但本篇講的是虛擬帳號。像anonymous_enable=NO,虛擬帳號還是可以使用。所以虛擬帳號不是暱名帳號,那把 anon_upload_enable 設成 NO,有用嗎?實測就是有用。如果只把 write_enable 設成 NO,虛擬帳號可以上傳,但是不能刪除。必須這兩個參數都是NO,才能禁止上傳、禁止刪除。

3.2 使用 MySQL

3.2.1 建立資料庫
[root@localhost ~]# mysql -u root -p
mysql> CREATE DATABASE vsftpd;
mysql> GRANT ALL ON vsftpd.* TO 'vsftpd'@'localhost' IDENTIFIED BY '2kWhQB5uGD' WITH GRANT OPTION;
mysql> GRANT ALL ON vsftpd.* TO 'vsftpd'@'%' IDENTIFIED BY '2kWhQB5uGD' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;
mysql> USE vsftpd;
mysql> CREATE TABLE `accounts` (
 `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
 `username` VARCHAR( 30 ) NOT NULL ,
 `pass` VARCHAR( 50 ) NOT NULL ,
 `group` VARCHAR( 50 ) ,
 UNIQUE (`username`)
 ) ENGINE = MYISAM ; 

3.2.1 建立帳號
mysql> USE vsftpd;
mysql> INSERT INTO `accounts` (`username`, `pass`, `group`) VALUES ('john', md5('johnpassword'), 'admin');
mysql> exit;

3.2.3 編輯 pam 的 vsftpd 設定檔
保留下面兩行即可,密碼要設定。
[root@localhost ~]# vi /etc/pam.d/vsftpd
auth required pam_mysql.so user=vsftpd passwd=MYPASSWORD host=localhost db=vsftpd table=accounts usercolumn=username passwdcolumn=pass crypt=3 account required pam_mysql.so user=vsftpd passwd=MYPASSWORD host=localhost db=vsftpd table=accounts usercolumn=username passwdcolumn=pass crypt=3

4. 新增虛擬帳號所使用的實體帳號
帳號定義在 vsftpd 的設定檔 guest_username=vsftpd
[root@localhost ~]# useradd vsftpd -G users -d /home/vsftpd -s /bin/false


5. 設定防火牆
[root@localhost ~]# vi /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 60021:60200 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT

6. 設定 selinux
方式一
設定 ftp 目錄的 selinux
[root@localhost ~]# chcon -t public_content_rw_t /home/vsftpd -R

方式二
[root@localhost ~]# semanage fcontext -a -t public_content_t "/home/vsftpd(/.*)?"
[root@localhost ~]# semanage fcontext -a -t user_home_dir_t "/home/vsftpd/([^/]+)(/.*)?";
[root@localhost ~]# restorecon -Rv /home/vsftpd
[root@localhost ~]# ls -lZ /home/vsftpd/
如果執行 semanage 指令發現系統中沒有這個指令,請安裝 policycoreutils-python 套件
yum install -y policycoreutils-python

開啟 selinux 布林值
查看ftp相關設定
[root@localhost ~]# getsebool -a | grep ftp
allow_ftpd_anon_write --> off
allow_ftpd_full_access --> off
allow_ftpd_use_cifs --> off
allow_ftpd_use_nfs --> off
ftp_home_dir --> off
ftpd_connect_db --> off
ftpd_use_fusefs --> off
ftpd_use_passive_mode --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off
tftp_use_cifs --> off
tftp_use_nfs --> off
後面3個tftp不是ftp,可忽略。allow_ftpd_use_cifs 跟網路共享資料夾有關,有用到再開。
[root@localhost ~]# setsebool -P allow_ftpd_anon_write on
[root@localhost ~]# setsebool -P allow_ftpd_use_cifs on
[root@localhost ~]# setsebool -P ftp_home_dir on
[root@localhost ~]# setsebool -P ftpd_use_passive_mode on
[root@localhost ~]# setsebool -P ftpd_connect_db on
[root@localhost ~]# setsebool -P httpd_enable_ftp_server on

7. 參考
在 CentOS 5 上透過 VSFTPD 及 MySQL 應用虛擬戶口
Manage of VSFTPD.CONF
Centos FTP (vsftp)虛擬化設定
Vsftpd Virtual User 實作筆記
Centos FTP (vsftp)虛擬化設定
史上最详细的vsftpd配置文件讲解
vsftpd設定 (三本貓 linux 中心)
Manpage of VSFTPD.CONF
Semanage和Chcon的差異
邁向 RHCE 之路 (Day27) - vsftp 檔案傳輸伺服器
Vsftpd FTP Server With Virtual Users ( MySQL + PAM )
(上面這篇有提供script安裝設定 )
=========================================

問題

◎錯誤訊息:500 OOPS: vsftpd: refusing to run with writable root inside chroot ()
/etc/vsftpd/vsftpd.conf 新增一行
allow_writeable_chroot=YES
注意,這裡是 "writeable" 。如果是 vsftpd-ext,才是
allow_writable_chroot=YES
參考

◎本地端可以連線,遠端無法連線
可能防火牆沒有設定好

◎錯誤訊息:500 OOPS: cannot change directory:
可能是SELINUX的關係

◎無法正確設定某個使用者的 selinux 的 user_home_dir_t
假設有個使用者叫 john ,參考某篇文章應該這樣設:
semanage fcontext -a -t user_home_dir_t "/home/vsftpd/john(/.*)?";
然後再
restorecon -Rv /home/vsftpd
ls -lZ /home/vsftpd/
應該要看到它第 3 個參數是 user_home_dir_t。
但是我操作過程中只有第 1 次看到它是 user_home_dir_t ,之後怎麼試都維持在 public_content_t。來回做了好幾遍,不知道哪邊出錯,一直是 public_content_t。後來重開機再重新執行這三個指令就好了。

沒有留言:

張貼留言