[root@CentOS7-01 ~]#yum -y install vsftpd
#主配置文件 /etc/vsftpd/vsftpd.conf
listen_port=port #默認爲21,若是須要將vsftpd服務暴露在公網,建議修改成其它端口
anonymous_enable=YES #默認爲YES
# 在配置文件最後面加上下面的配置,而後重啓vsftpd no_anon_password=YES [root@CentOS7-01 ~]#systemctl restart vsftpd
# 要想支持匿名用戶上傳,須要修改配置文件 anon_upload_enable=YES #把前面的#去掉便可,而後重啓服務 [root@CentOS7-01 ~]#systemctl restart vsftpd
#默認狀況下,/var/ftp/pub目錄權限爲755,因此匿名用戶沒法往這個目錄上傳文件 # [root@CentOS7-01 ~]#ll /var/ftp/pub/ -d drwxr-xr-x 2 root root 6 Dec 18 11:15 /var/ftp/pub/ # 利用acl爲ftp用戶設置rwx權限 [root@CentOS7-01 ~]#setfacl -m u:ftp:rwx /var/ftp/pub/ [root@CentOS7-01 ~]#getfacl /var/ftp/pub/ getfacl: Removing leading '/' from absolute path names # file: var/ftp/pub/ # owner: root # group: root user::rwx user:ftp:rwx group::r-x mask::rwx other::r-x
# 如上圖所示,匿名用戶默認不能建立目錄,需改配置文件 anon_mkdir_write_enable=YES #把前面的#去掉便可,而後重啓服務 [root@CentOS7-01 ~]#systemctl restart vsftpd
# 如上圖,複製f2文件到本地的時候,提示報錯,來看下該文件的權限 [root@CentOS7-01 ~]#ll /var/ftp/pub/ total 0 -rw------- 1 ftp ftp 0 Dec 18 11:23 f1 -rw------- 1 ftp ftp 0 Dec 18 11:22 f2 drwx------ 2 ftp ftp 6 Dec 18 11:33 新文件夾 # 能夠看到f2文件權限爲600,只有屬主有讀權限,這裏將它改成444就能下載了 [root@CentOS7-01 ~]#chmod 444 /var/ftp/pub/f2
# 經過上面臨時修改文件權限的方法雖然能夠成功下載了,但若是文件量多起來了, 仍是手工改權限是不現實的,因此,能夠在配置文件加上以下配置,而後重啓服務 anon_world_readable_only=NO [root@CentOS7-01 ~]#systemctl restart vsftpd
# 默認狀況下匿名用戶上傳的文件權限爲600,全部不能下載,要想能把上傳的文件下載下來,能夠修改配置文件 anon_umask=033 #在配置文件加上此設置,而後重啓服務 [root@CentOS7-01 ~]#systemctl restart vsftpd # 添加了此配置以後,上傳的文件默認權限就是644,而不用手動修改權限實現下載了
# 要想實現匿名用戶刪除上傳的文件,需修改配置文件 anon_other_write_enable=YES #在文件最後添加此行,而後重啓服務 [root@CentOS7-01 ~]#systemctl restart vsftpd
# 在配置文件中,修改一下內容 chown_uploads=YES #去掉前面的#號,默認爲NO chown_username=hechunping #修改成指定的全部者 chown_upload_mode=0644 #在文件最後加上此行 # 測試上傳新文件file1 [root@CentOS7-01 ~]#ll /var/ftp/pub/ total 0 -rw-r--r-- 1 hechunping ftp 0 Dec 18 14:22 file1.txt
local_enable=YES #是否容許linux用戶登陸,默認YES write_enable=YES #容許linux用戶上傳文件,默認YES local_umask=022 #指定系統用戶上傳文件的默認權限,默認022
guest_enable=YES #全部系統用戶都映射成guest用戶 guest_username=ftpuser #配合上面選項才生效,指定guest用戶 local_root=/ftproot #guest用戶登陸後所在的目錄
#將前面的#去掉,而後重啓服務 chroot_local_user=YES #禁錮系統用戶在其家目錄中, 默認NO,即不由錮 [root@CentOS7-01 ~]#systemctl restart vsftpd
# 修改配置文件,而後重啓服務 chroot_list_enable=YES #去掉前面的#便可 chroot_list_file=/etc/vsftpd/chroot_list #同上,該文件需手工建立 [root@CentOS7-01 ~]#systemctl restart vsftpd # 注意 1)當chroot_local_user=YES時,則chroot_list中用戶不由錮 2)當chroot_local_user=NO時,則chroot_list中用戶禁錮
# 當用戶被禁錮在其家目錄的狀況下,登陸會出現上面的錯誤,由於vsftpd安全檢查緣由,根目錄不能用寫權限,但子目錄能夠有,解決的方法有如下兩種 1)去掉根目錄的寫權限 chmod -w /home/user 2)在配置文件最後添加以下配置,而後重啓 allow_writeable_chroot=YES
# wu-ftp日誌:默認啓用 xferlog_enable=YES 啓用記錄上傳下載日誌,此爲默認值 xferlog_std_format=YES 使用wu-ftp日誌格式,此爲默認值 xferlog_file=/var/log/xferlog 可自動生成, 此爲默認值 # 上面的日誌格式太簡單,不易讀,因此使用vsftpd日誌 # vsftpd日誌:默認不啓用 dual_log_enable=YES #在配置文件最後加上此配置,而後重啓服務 vsftpd_log_file=/var/log/vsftpd.log #加了上面的配置後,該文件會自動生成。
ftpd_banner=Welcome to hechunping FTP service. #先將前面的#註釋去掉,而後修改成自定義的提示信息 banner_file=/etc/vsftpd/ftpbanner.txt #也能夠加上此項配置,將提示信息寫到自定義配置文件中 [root@CentOS7-01 ~]#vim /etc/vsftpd/ftpbanner.txt ^[[31m非法用戶,禁止登陸^[[0m #操做提示:先按crtl+v,而後不鬆開再按[
dirmessage_enable=YES #默認值,不用動 message_file=.message #在配置文件最後面加上,而後將這個文件建在要訪問的目錄中,好比用戶hechunping的家目錄/home/hechunping [root@CentOS7-01 ~]#vim /home/hechunping/.message ^[[32m這是hechunping的家目錄^[[0m
[root@CentOS7-01 ~]#vim /etc/vsftpd/vsftpd.conf pam_service_name=vsftpd #此爲默認值 # pam配置文件 /etc/pam.d/vsftpd # 在下面這個配置文件的用戶將被拒絕登陸ftp服務器 [root@CentOS7-01 ~]#cat /etc/vsftpd/ftpusers # Users that are not allowed to login via ftp root bin daemon adm lp sync shutdown halt mail news uucp operator games nobody
userlist_enable=YES #默認值,不用動 userlist_deny=YES(默認值) #黑名單,不提示口令,NO爲白名單 userlist_file=/etc/vsftpd/users_list #此爲默認值,在此文件中的用戶會被直接拒絕,甚至不會提示輸入密碼
nopriv_user=nobody #此爲默認值
max_clients=number #最大併發鏈接數,默認2000 max_per_ip=number #每一個IP同時發起的最大鏈接數,默認50
anon_max_rate=0 #匿名用戶的最大傳輸速率,默認爲0,不限制 local_max_rate=0 #本地用戶的最大傳輸速率,默認爲0,不限制
connect_timeout=60 #主動模式數據鏈接超時時長,默認值 accept_timeout=60 #被動模式數據鏈接超時時長,默認值 data_connection_timeout=300 #數據鏈接無數據輸超時時長,默認值 idle_session_timeout=300 #無命令操做超時時長,默認值
ascii_upload_enable=YES #默認爲NO ascii_download_enable=YES #同上
# 查看是否支持SSL [root@CentOS7-01 certs]#ldd `which vsftpd` | grep libssl.so libssl.so.10 => /lib64/libssl.so.10 (0x00007f7dfd1fa000) # 建立自簽名證書 [root@CentOS7-01 ~]#cd /etc/pki/tls/certs/ [root@CentOS7-01 certs]#make vsftpd.pem umask 77 ; \ PEM1=`/bin/mktemp /tmp/openssl.XXXXXX` ; \ PEM2=`/bin/mktemp /tmp/openssl.XXXXXX` ; \ /usr/bin/openssl req -utf8 -newkey rsa:2048 -keyout $PEM1 -nodes -x509 -days 365 -out $PEM2 ; \ cat $PEM1 > vsftpd.pem ; \ echo "" >> vsftpd.pem ; \ cat $PEM2 >> vsftpd.pem ; \ rm -f $PEM1 $PEM2 Generating a 2048 bit RSA private key .............................................+++ ........................+++ writing new private key to '/tmp/openssl.SOcSWK' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:beijing Locality Name (eg, city) [Default City]:beijing Organization Name (eg, company) [Default Company Ltd]:abc Organizational Unit Name (eg, section) []:IT Common Name (eg, your name or your server's hostname) []:hechunping Email Address []: [root@CentOS7-01 certs]#ls ca-bundle.crt make-dummy-cert renew-dummy-cert ca-bundle.trust.crt Makefile vsftpd.pem # 配置vsftpd服務支持SSL,而後重啓服務,再使用客戶端工具FileZilla測試 [root@CentOS7-01 certs]#vim /etc/vsftpd/vsftpd.conf ssl_enable=YES # 默認爲NO rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem #指定證書位置 [root@CentOS7-01 certs]#systemctl restart vsftpd
# a.什麼是虛擬用戶 1)全部虛擬用戶會統一映射爲一個指定的系統帳號:訪問共享位置,即爲此係統帳號的家目錄 2)各虛擬用戶可被賦予不一樣的訪問權限,經過匿名用戶的權限控制參數進行指定 # b.虛擬用戶帳號的存儲方式 1)文件:編輯文本文件,此文件須要被編碼爲hash格式,奇數行爲用戶名,偶數行爲密碼 db_load -T -t hash -f vusers.txt vusers.db 2)關係型數據庫中的表中:實時查詢數據庫完成用戶認證 vsftpd支持mysql庫:pam要依賴於pam-mysql /lib64/security/pam_mysql.so /usr/share/doc/pam_mysql-0.7/README
[root@CentOS7-01 ~]#cat /etc/vsftpd/vusers.txt hechunping 123.com xiaoming 123.com [root@CentOS7-01 ~]#cd /etc/vsftpd/ db_load -T -t hash -f vusers.txt vusers.db [root@CentOS7-01 vsftpd]#chmod 600 vusers.db
[root@CentOS7-01 vsftpd]#useradd -d /data/ftproot -s /sbin/nologin -r vuser [root@CentOS7-01 vsftpd]#mkdir -pv /data/ftproot/upload [root@CentOS7-01 vsftpd]#setfacl -m u:vuser:rwx /data/ftproot/upload
[root@CentOS7-01 vsftpd]#vim /etc/vsftpd/vsftpd.conf guest_enable=YES guest_username=vuser pam_service_name=vsftpd.db
# a.指定各個用戶配置文件存放的路徑 [root@CentOS7-01 vsftpd]#vim /etc/vsftpd/vsftpd.conf user_config_dir=/etc/vsftpd/vusers.d/ # b.建立各個用戶配置文件存放的路徑 [root@CentOS7-01 vsftpd]#mkdir /etc/vsftpd/vusers.d [root@CentOS7-01 vsftpd]#cd /etc/vsftpd/vusers.d # c.建立用戶hechunping的配置文件,容許可讀可寫,其它用戶只讀 [root@CentOS7-01 vusers.d]#cat hechunping anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES # d.建立用戶xiaoming的配置文件,將其登陸目錄更改成/data/ftproot2 [root@CentOS7-01 vusers.d]#cat xiaoming local_root=/data/ftproot2
[root@CentOS7-01 vusers.d]#ll /data/ftproot/upload/ total 0 # 在另外一臺主機上用hechunping虛擬用戶登陸 [root@CentOS7-02 ~]#ftp 192.168.7.71 Connected to 192.168.7.71 (192.168.7.71). 220 (vsFTPd 3.0.2) Name (192.168.7.71:root): hechunping 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> ls 227 Entering Passive Mode (192,168,7,71,44,8). 150 Here comes the directory listing. drwxrwxr-x 2 0 0 6 Dec 23 12:07 upload 226 Directory send OK. ftp> cd upload 250 Directory successfully changed. ftp> ls 227 Entering Passive Mode (192,168,7,71,146,66). 150 Here comes the directory listing. 226 Directory send OK. ftp> !ls anaconda-ks.cfg test ftp> put test local: test remote: test 227 Entering Passive Mode (192,168,7,71,176,83). 150 Ok to send data. 226 Transfer complete. ftp> ls 227 Entering Passive Mode (192,168,7,71,108,131). 150 Here comes the directory listing. -rw------- 1 997 995 0 Dec 23 12:11 test 226 Directory send OK. # 從上面的結果發現虛擬用戶hechunping是可讀可寫的
[root@CentOS7-01 vusers.d]#ls /data/ftproot2/ file1 # 在另外一臺主機上用xiaoming虛擬用戶登陸 [root@CentOS7-02 ~]#ftp 192.168.7.71 Connected to 192.168.7.71 (192.168.7.71). 220 (vsFTPd 3.0.2) Name (192.168.7.71:root): xiaoming 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> ls 227 Entering Passive Mode (192,168,7,71,228,90). 150 Here comes the directory listing. -rw-r--r-- 1 0 0 0 Dec 23 09:43 file1 226 Directory send OK. ftp> !ls anaconda-ks.cfg test ftp> put test local: test remote: test 227 Entering Passive Mode (192,168,7,71,106,6). 550 Permission denied. ftp> cd /etc 550 Failed to change directory. ftp> get file1 local: file1 remote: file1 227 Entering Passive Mode (192,168,7,71,187,241). 150 Opening BINARY mode data connection for file1 (0 bytes). 226 Transfer complete. ftp> # 從上面的結果來看,虛擬用戶xiaoming不能寫和切換到別的目錄,只能下載指定登陸的目錄中的文件
環境準備 OS:CentOS7 FTP服務器1臺 數據庫服務器一臺
[root@CentOS7-02 ~]#yum –y install mariadb-server [root@CentOS7-02 ~]#systemctl enable --now mariadb
# a.創建存儲虛擬用戶信息的數據庫和表 MariaDB [(none)]> create database vsftpd; MariaDB [(none)]> use vsftpd; MariaDB [(none)]> CREATE TABLE users ( id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, name CHAR(50) BINARY NOT NULL, password CHAR(48) BINARY NOT NULL ); # b.添加虛擬用戶,爲了安全應該使用PASSWORD函數加密其密碼後存儲 MariaDB [vsftpd]> INSERT INTO users(name,password) values('zhangsan',password('123.com')); Query OK, 1 row affected (0.00 sec) MariaDB [vsftpd]> INSERT INTO users(name,password) values('lisi',password('123.com')); Query OK, 1 row affected (0.00 sec) # c.建立鏈接vsftpd數據庫的用戶 MariaDB [vsftpd]> grant select on vsftpd.* to vsftpd@'192.168.7.%' identified by '123.com'; Query OK, 0 rows affected (0.00 sec) MariaDB [vsftpd]> flush privileges; Query OK, 0 rows affected (0.01 sec)
# a.安裝vsftpd [root@CentOS7-01 ~]#yum -y install vsftpd # b.源碼編譯安裝pam-mysql 1)相關依賴包安裝 [root@CentOS7-01 ~]#yum install vsftpd gcc gcc-c++ make mariadb-devel pam-devel 2)下載和編譯安裝pam-mysql [root@CentOS7-01 ~]#wget http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz [root@CentOS7-01 ~]#tar xvf pam_mysql-0.7RC1.tar.gz [root@CentOS7-01 ~]#cd pam_mysql-0.7RC1 [root@CentOS7-01 pam_mysql-0.7RC1]#./configure --with-pam-mods-dir=/lib64/security [root@CentOS7-01 pam_mysql-0.7RC1]#make -j `lscpu |awk 'NR==4{print $2}'` && make install [root@CentOS7-01 pam_mysql-0.7RC1]#ll /lib64/security/pam_mysql.* -rwxr-xr-x 1 root root 882 Dec 23 17:56 /lib64/security/pam_mysql.la -rwxr-xr-x 1 root root 141712 Dec 23 17:56 /lib64/security/pam_mysql.so
[root@CentOS7-01 pam_mysql-0.7RC1]#cat /etc/pam.d/vsftpd.mysql auth required pam_mysql.so user=vsftpd passwd=123.com host=192.168.7.72 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2 account required pam_mysql.so user=vsftpd passwd=123.com host=192.168.7.72 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
0 (or "plain") | 表示不加密 |
1 (or "Y") | 表示使用crypt(3)函數加密 |
2 (or "mysql") | 表示使用mysql password()函數加密 |
3 (or "md5") | 表示使用md5加密 |
4 (or "sha1") | 表示使用sha1加密 |
auth | 表示認證 |
account | 驗證帳號密碼正常使用 |
required | 表示認證要經過 |
pam_mysql.so | 該模塊是默認的相對路徑,是相對/lib64/security/路徑而言,也能夠寫絕對路徑;後面爲給此模塊傳遞的參數 |
user=vsftpd | 登陸mysql的用戶 |
passwd=123.com | 登陸mysql的密碼 |
host=192.168.7.72 | mysql服務器的ip地址 |
db=vsftpd | 指定鏈接mysql的數據庫名稱 |
table=users | 指定鏈接數據庫中的表名 |
usercolumn=name | 當作用戶名的字段 |
passwdcolumn=password | 當作用戶名字段的密碼 |
crypt=2 | 密碼的加密方式爲mysql password()函數加密 |
# a.創建虛擬用戶映射的系統用戶及對應的目錄 [root@CentOS7-01 pam_mysql-0.7RC1]#useradd -d /data/ftproot -s /sbin/nologin -r vuser # b.拿掉ftp根目錄的寫權限 [root@CentOS7-01 pam_mysql-0.7RC1]#chmod 555 /data/ftproot mkdir -pv /data/ftproot/{upload,pub} setfacl –m u:vuser:rwx /data/ftproot/{upload,pub} # c.確保/etc/vsftpd/vsftpd.conf中已經啓用瞭如下選項 anonymous_enable=YES # d.添加下面兩項 guest_enable=YES guest_username=vuser # e.修改下面一項,原系統用戶將沒法登陸 pam_service_name=vsftpd.mysql # f.啓動並設置開機自啓vsftpd服務 [root@CentOS7-01 pam_mysql-0.7RC1]#systemctl enable --now vsftpd
vsftpd能夠在配置文件目錄中爲每一個用戶提供單獨的配置文件以定義其ftp服務訪問權限,每一個虛擬用戶的配置文件名同虛擬用戶的用戶名。配置文件目錄能夠是任意未使用目錄,只須要在vsftpd.conf指定其路徑及名稱便可 # a.配置vsftpd虛擬用戶使用的配置文件目錄 [root@CentOS7-01 pam_mysql-0.7RC1]#vim /etc/vsftpd/vsftpd.conf user_config_dir=/etc/vsftpd/vusers.d/ # b.建立所須要的目錄,併爲虛擬用戶提供配置文件 [root@CentOS7-01 pam_mysql-0.7RC1]#mkdir /etc/vsftpd/vusers.d/ [root@CentOS7-01 pam_mysql-0.7RC1]#cd /etc/vsftpd/vusers.d/ [root@CentOS7-01 pam_mysql-0.7RC1]#touch zhangsan lisi [root@CentOS7-01 vusers.d]#ls lisi zhangsan # c.配置虛擬用戶的訪問權限 [root@CentOS7-01 vusers.d]#cat zhangsan anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES [root@CentOS7-01 vusers.d]#cat lisi local_root=/data/ftproot2
[root@CentOS7-01 ftproot]#tree -d /data/ftproot /data/ftproot ├── pub └── upload 2 directories # 在另外一臺主機上用虛擬用戶zhangsan登陸 [root@CentOS7-02 ~]#ftp 192.168.7.71 Connected to 192.168.7.71 (192.168.7.71). 220 (vsFTPd 3.0.2) Name (192.168.7.71:root): zhangsan 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> ls 227 Entering Passive Mode (192,168,7,71,107,185). 150 Here comes the directory listing. drwxrwxr-x 2 0 0 6 Dec 23 13:13 pub drwxrwxr-x 2 0 0 6 Dec 23 13:32 upload 226 Directory send OK. ftp> cd pub 250 Directory successfully changed. ftp> !ls anaconda-ks.cfg file1 test ftp> ls 227 Entering Passive Mode (192,168,7,71,129,21). 150 Here comes the directory listing. 226 Directory send OK. ftp> put test local: test remote: test 227 Entering Passive Mode (192,168,7,71,241,98). 150 Ok to send data. 226 Transfer complete. # 從上面的結果能夠發現,虛擬用戶zhangsan具備讀寫權限
[root@CentOS7-01 ~]#tree /data/ftproot2/ /data/ftproot2/ └── file1 0 directories, 1 file # 在在另外一臺主機上用虛擬用戶lisi登陸 [root@CentOS7-02 ~]#ftp 192.168.7.71 Connected to 192.168.7.71 (192.168.7.71). 220 (vsFTPd 3.0.2) Name (192.168.7.71:root): lisi 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> ls 227 Entering Passive Mode (192,168,7,71,66,122). 150 Here comes the directory listing. -rw-r--r-- 1 0 0 0 Dec 23 09:43 file1 226 Directory send OK. ftp> !ls anaconda-ks.cfg file1 test ftp> put test local: test remote: test 227 Entering Passive Mode (192,168,7,71,32,137). 550 Permission denied. ftp> cd /var 550 Failed to change directory. ftp> get file1 local: file1 remote: file1 227 Entering Passive Mode (192,168,7,71,180,77). 150 Opening BINARY mode data connection for file1 (0 bytes). 226 Transfer complete. ftp> # 從上面的結果來看,虛擬用戶lisi不能寫和切換到別的目錄,只能下載指定登陸的目錄中的文件
基於文件和MySQL驗證的vsftpd虛擬用戶的區別: # a.基於文件驗證的vsftpd虛擬用戶須要手工建立存放用戶名和密碼的文本文件,不方便管理,而且該文件被編碼爲hash格式以後還能看到相關的信息 [root@CentOS7-01 ~]#cat /etc/vsftpd/vusers.db a 낚23.comxiaoming ȩcRэh^123.comhechunping # b.基於MySQL驗證的vsftpd虛擬用戶不用事先建立相關的文本文件,直接在相關的用戶表使用SQL語句建立便可,維護起來更加方便,而且密碼是使用mysql password()函數加密過的,更加安全。推薦使用方式