1. 程式人生 > >CentOS 6.x上搭建vSFTPD服務器搭建與配置詳解

CentOS 6.x上搭建vSFTPD服務器搭建與配置詳解

服務器 故障排查 運維 vsftpd

摘要:

手把手教你搭建vsftpd服務器,實現了基於db文件和MySQL數據庫文件進行虛擬用戶認證,當然了也本文章也包含搭建過程中問題的排查啦,哈哈哈。

另外,我在CentOS 7.x上也進行了搭建測試,步驟一致,個別命令會有不同,但不影響測試效果。


服務器部署需求分析(實現效果):

1、登錄、傳輸全程進行加密處理。
2、記錄用戶上傳、下載文件日誌。
3、針對每個用戶有公共文件夾(大家都可以看到和下載其中的文件)和私有文件夾(只有自己可以看到,並且可上傳下載文件)。

一、vsftpd服務安裝:

1、搜索yum源中是否有vsftpd的安裝包:
[[email protected]
/* */ ~]# cat /etc/centos-release CentOS release 6.5 (Final) [[email protected] ~]# yum list | grep -i "vsftpd" vsftpd.x86_64 2.2.2-24.el6 base You have new mail in /var/spool/mail/root

2、安裝vsftpd服務程序:

[[email protected] ~]# yum list | grep -i "vsftpd" && yum -y install vsftpd

[[email protected]
/* */ ~]# whereis vsftpd vsftpd: /usr/sbin/vsftpd /etc/vsftpd /usr/share/man/man8/vsftpd.8.gz

3、啟動vsftpd服務程序:

[[email protected] ~]# /etc/init.d/vsftpd start
為 vsftpd 啟動 vsftpd:                                    [確定]

[[email protected] ~]# netstat -lntp | grep "21"
tcp        0      0 0.0.0.0:21                  0.0.0.0:*                   LISTEN      1677/vsftpd

4、訪問vsftpd服務:

瀏覽器訪問:ftp://192.168.0.110/,默認會訪問到/var/ftp/pub目錄。

客戶度端訪問(推薦filezilla):https://www.filezilla.cn/download/client


二、vsftpd服務配置詳解:

1、備份配置文件及用戶黑白名單配置:

[[email protected] ~]# cd /etc/vsftpd/
[[email protected] vsftpd]# ll
總用量 20
-rw------- 1 root root  125 3月  22 20:14 ftpusers
-rw------- 1 root root  361 3月  22 20:14 user_list
-rw------- 1 root root 4599 3月  22 20:14 vsftpd.conf
-rwxr--r-- 1 root root  338 3月  22 20:14 vsftpd_conf_migrate.sh
[[email protected] vsftpd]# cp vsftpd.conf vsftpd.conf_bak
[[email protected] vsftpd]# ll
總用量 28
-rw------- 1 root root  125 3月  22 20:14 ftpusers
-rw------- 1 root root  361 3月  22 20:14 user_list
-rw------- 1 root root 4599 3月  22 20:14 vsftpd.conf
-rw------- 1 root root 4599 8月  18 23:21 vsftpd.conf_bak
-rwxr--r-- 1 root root  338 3月  22 20:14 vsftpd_conf_migrate.sh

ftpusers:保存ftp登錄用戶黑名單,該列表中用戶登錄時需要輸入用戶名跟密碼,但是不能登錄成功。
user_list:用戶白名單(黑名單)列表,白名單或黑名單由vsftpd.conf中參數進行控制。
白名單:
userlist_enable=YES    #啟用用戶列表功能
userlist_deny=NO    #配置不禁用user_list中的用戶登錄
userlist_file=/etc/vsftpd/user_list    #指定用戶列表文件的路徑和文件名
userlist_log=YES    #基於user_list被阻塞的用戶記錄日誌
黑名單:
userlist_enable=YES    #啟用用戶列表功能
userlist_deny=YES    #配置禁用user_list中的用戶登錄,在列表中的用戶輸入登錄名後不需要輸入密碼就會被阻塞,相比ftpusers更為安全
userlist_file=/etc/vsftpd/user_list    #指定用戶列表文件的路徑和文件名
userlist_log=YES

2、其他重要配置項介紹:

配置項語法格式:directive=value
	匿名用戶:
		匿名用戶是被映射成ftp用戶的,屬主有寫權限就行;
		是否允許匿名用戶登錄:
		anonymous_enable=YES
			匿名用戶的上傳操作;生效要依賴於write_enable=YES
			anon_upload_enable=NO
			workdirrite_enable=YES
			屬主有寫權限就行;
		anon_mkdir_write_enable=NO
			匿名用戶創建目錄的權限;
		anon_other_write_enable=NO
			匿名用戶刪除、重命名操作權限;
	本地用戶:		
	        local_enable
			所有的非匿名用戶的生效,都依賴此指令;
		local_umask
			本地用戶上傳文件的權限掩碼;
	目錄消息:
		dirmessage_enable
			用戶第一次進入目錄時,vsftpd會查看.message文件,並將其內容顯示給用戶,messag_file指定文件路徑,而不使用默認的.message;
		messag_file
	數據傳輸日誌:
		xferlog_enable
		xferlog_std_format
		xferlog_file=/var/log/vsftpd.log
		vsftpd_log_file
	數據傳輸模式:
		connect_from_port_20;是否啟用PORT模式,默認是NO;
	修改匿名用戶上傳的文件的屬主:
		chown_uploads:是否修改;
		chown_username:啟用chown_uploads指令時,將文件屬主修改為此指令指定的用戶;默認為root;
		chown_upload_mode:設定匿名用戶上傳文件的權限;默認為600;
	設定會話的超時時間:
		idle_session_timeout,空閑會話的超時時長;
		connect_timeout:PORT模式下,服務器連接客戶端的超時時長;
		data_connection_timeout:數據傳輸的超時時長;
	命令連接的監聽端口:
		listen_port=20
	設定連接及端口速率:
	        local_max_rate:本地用戶的傳輸速率,單位為字節;默認為0,表示無限制;
		anon_max_rate:匿名用戶的最大傳輸速率;
		max_clients:最大的並發連接數,對服務器端;
		max_per_ip:每個客戶端同時發起的最大連接數;
	登錄歡迎信息:
		ftp_banner="Welcome"
	禁錮本地用戶:
		chroot_local_user=YES;禁錮所有本地用戶;
			註意:要求用戶不能對家目錄有寫權限;

		chroot_list_enable=YES;
		chroot_list_file=/etc/vsftpd/chroot_list;
			禁錮指定用戶於家目錄中;
虛擬用戶配置:
        基於db文件:
            /etc/vsftpd/vusers.txt
            奇數行:用戶名
            偶數行:密碼
        基於mysql數據庫:
            用戶名、密碼可以通過SQL語句添加到數據庫中,vsftpd通過pam接口到與mysql數據庫聯動實現用戶認證的操作。

註意:虛擬用戶和匿名用戶登錄ftp服務器時,是映射到本地用戶列表中到某用戶到,默認為ftp,但也可以手動指定!            
[[email protected] vsftpd]# cat /etc/passwd | grep ftp
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

三、vsftpd典型配置案例:

1、基於db_load實現虛擬用戶認證:

#1.1 修改vsftpd.conf中相關配置項:
anonymous_enable=NO
chroot_local_user=YES
pam_service_name=vsftpd    #開啟pam認證功能,對應的pam配置文件名為vsftpd

guest_enable=YES
guest_username=ftp
user_config_dir=/etc/vsftpd/user_conf

#1.2 創建用戶配置文件目錄:
[[email protected] vsftpd]# install -d /etc/vsftpd/user_conf
[[email protected] vsftpd]# ll
總用量 28
-rw------- 1 root root  125 3月  22 20:14 ftpusers
drwxr-xr-x 2 root root 4096 8月  19 00:08 user_conf
-rw------- 1 root root  361 3月  22 20:14 user_list
-rw------- 1 root root  894 8月  19 00:08 vsftpd.conf
-rw------- 1 root root 4599 8月  18 23:21 vsftpd.conf_bak
-rwxr--r-- 1 root root  338 3月  22 20:14 vsftpd_conf

#1.3 創建ftp用戶名密碼源文件和對應的數據庫文件:
[[email protected] vsftpd]# touch vusers
[[email protected] vsftpd]# echo -e "user01\nuser01" vusers 
[[email protected] vsftpd]# echo -e "user02\nuser02" >> vusers 
[[email protected] vsftpd]# more vusers 
user01
user01
user02
user02

[[email protected] vsftpd]# db_load -T -t hash -f /etc/vsftpd/vusers /etc/vsftpd/login.db
[[email protected] vsftpd]# ll
總用量 44
-rw-r--r-- 1 root root 12288 8月  19 00:20 login.db
-rw-r--r-- 1 root root    28 8月  19 00:17 vusers

#1.4 創建每個用戶的配置文件:
[[email protected] vsftpd]# cd user_conf/
[[email protected] user_conf]# more user02 
# 使用local_root為虛擬用戶指定家目錄(ftp登錄成功後默認在的目錄)時,可以在用戶單獨配置文件中指定,也可以adduser新建用戶,用-d選項指定用戶家目錄。
local_root=/ftp/user02
write_enable=YES
anon_umask=022
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

#1.5 配置pam認證文件,將db文件中用戶跟vsftpd服務關聯起來:
[[email protected] pam.d]# ll vsftpd*
-rw-r--r-- 1 root root 101 8月  19 00:28 vsftpd
-rw-r--r-- 1 root root 335 8月  19 00:27 vsftpd.bak
[[email protected] pam.d]# more vsftpd
auth required pam_userdb.so db=/etc/vsftpd/login
account required pam_userdb.so db=/etc/vsftpd/login

#1.6 創建用戶對應的ftp主目錄:
[[email protected] user_conf]# mkdir -p /ftp/user01/upload
[[email protected] user_conf]# mkdir -p /ftp/user02/upload
[[email protected] user_conf]# ls -ld /ftp/*
drwxr-xr-x 3 root root 4096 8月  19 00:31 /ftp/user01
drwxr-xr-x 3 root root 4096 8月  19 00:31 /ftp/user02

因為上面創建的用戶user01、user02登錄ftp服務器之後,是映射成本地用戶ftp進行創建文件、目錄的操作的,所以要機遇用戶主目錄屬主為用戶:ftp
[[email protected] ftp]# chown ftp:root user01
[[email protected] ftp]# chown ftp:root user02
[[email protected] ftp]# ls -ld *
drwxr-xr-x 3 ftp root 4096 8月  19 00:31 user01
drwxr-xr-x 3 ftp root 4096 8月  19 00:31 user02

註意:為用戶家目錄授權的時候要註意,有時候家目錄存在寫權限時,登錄或上傳文件時會報錯。


#1.7 問題解決:
執行以上操作之後,從客戶端可以正常登錄到ftp服務器,但是上傳文件到用戶upload目錄下時報錯:
    響應: 	553 Could not create file.
    錯誤: 	嚴重文件傳輸錯誤

故查看upload目錄寫權限發現,upload目錄屬主權限不對,修改後上傳文件正常。
[[email protected] ftp]# ls -ld user01/upload
drwxr-xr-x 2 root root 4096 8月  19 00:31 user01/upload
[[email protected] ftp]# ls -ld user02/upload
drwxr-xr-x 2 root root 4096 8月  19 00:31 user02/upload
[[email protected] ftp]# chown -R ftp:root user01/upload
[[email protected] ftp]# chown -R ftp:root user02/upload
[[email protected] ftp]# ls -ld user01/upload
drwxr-xr-x 2 ftp root 4096 8月  19 00:31 user01/upload
[[email protected] ftp]# ls -ld user02/upload
drwxr-xr-x 2 ftp root 4096 8月  19 00:31 user02/upload

#1.8 ftp協議因為歷史原因,默認采用非加密方式進行認證和數據傳輸,要想使認證和傳輸過程加密暫時有兩種方案可供選擇:
方案一:采用openssl內建ftp服務器來進行加密傳輸,具體配置案例可參考鏈接:http://blog.csdn.net/xinxin19881112/article/details/46831311
方案二:采用vsftpd服務器端程序,修改配置實現對認證和傳輸過程加密,具體配置如下:
首先,生成加密使用的pem證書文件:
[[email protected] ftp]# openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout /etc/vsftpd/vsftpd.pem -out /etc/vsftpd/vsftpd.pem
Generating a 1024 bit RSA private key
.++++++
........++++++
writing new private key to ‘/etc/vsftpd/vsftpd.pem‘
-----
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]:BJ
Organization Name (eg, company) [Default Company Ltd]:360
Organizational Unit Name (eg, section) []:Security
Common Name (eg, your name or your server‘s hostname) []:anonymous.org

Email Address []:You have new mail in /var/spool/mail/root

生成的pem文件如下:
[[email protected] ~]# ll /etc/vsftpd/vsftpd.pem 
-rw-r--r-- 1 root root 1876 8月  19 00:52 /etc/vsftpd/vsftpd.pem

然後,修改vsftpd.conf配置文件,開啟加密:
# 啟用TLS/SSL
ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
require_ssl_reuse=NO
ssl_ciphers=HIGH
rsa_cert_file=/etc/vsftpd/vsftpd.pem
rsa_private_key_file=/etc/vsftpd/vsftpd.pem
# 為被動模式下的連接定義端口範圍
pasv_max_port=65535
pasv_min_port=64000

重啟vsftpd服務:
### CentOS 6.x
[[email protected] vsftpd]# /etc/init.d/vsftpd restart
關閉 vsftpd:                                              [確定]
為 vsftpd 啟動 vsftpd:                                    [確定]

### CentOS 7.x
[[email protected] vsftpd]# systemctl start vsftpd

[[email protected] vsftpd]# netstat -lntp | grep 21
tcp        0      0 0.0.0.0:21                  0.0.0.0:*                   LISTEN      2951/vsftpd

重啟之後,使用FileZilla客戶端連接vsFTPd服務器,可以正常上傳下載文件,麽麽噠。。。

2、基於pam_mysql實現匿名用戶認證:

[[email protected] pam.d]# uname -a
Linux dba.com 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

# 2.1安裝MySQL數據庫,並配置vsftpd登錄的虛擬用戶名和密碼:
[[email protected] pam.d]# yum -y install mysql-server
[[email protected] pam.d]# yum grouplist | grep -i "develop"
   Additional Development
   Desktop Platform Development
   Development tools
   Server Platform Development
   
[[email protected] ~]# mysql -u root -p123456
mysql> create database vsftpd;
mysql> use vsftpd;
mysql> create table users (
    -> id int AUTO_INCREMENT NOT NULL,
    -> name char(16) binary NOT NULL,
    -> passwd char(48) binary NOT NULL,
    -> primary key(id)
    -> );
mysql> create table logs (msg varchar(255),
    -> user char(16),
    -> pid int,
    -> host char(32),
    -> rhost char(32),
    -> logtime timestamp
    -> );
    
mysql> desc users;
+--------+----------+------+-----+---------+----------------+
| Field  | Type     | Null | Key | Default | Extra          |
+--------+----------+------+-----+---------+----------------+
| id     | int(11)  | NO   | PRI | NULL    | auto_increment |
| name   | char(16) | NO   |     | NULL    |                |
| passwd | char(48) | NO   |     | NULL    |                |
+--------+----------+------+-----+---------+----------------+
3 rows in set (0.03 sec)

mysql> insert into users(name, passwd) values (‘test‘, password(‘test‘));
Query OK, 1 row affected (0.08 sec)

mysql> select * from users;
+----+------+-------------------------------------------+
| id | name | passwd                                    |
+----+------+-------------------------------------------+
|  1 | test | *94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29 |
+----+------+-------------------------------------------+
1 row in set (0.00 sec)

# 2.2下載安裝pam_mysql插件:
 [[email protected] ~]# yum install openssl-devel
 [[email protected] ~]# yum install mysql-devel
 [[email protected] ~]# wget
[[email protected] ~]# tar -zxf pam_mysql-0.7RC1.tar.gz 
[[email protected] ~]# cd pam_mysql-0.7RC1
[[email protected] ~]# ./configure --with-mysql=/usr --with-openssl=/usr --with-pam-mods-dir=/lib64/security
[[email protected] ~]# make && make install

[[email protected] ~]# ll /lib64/security/pam_mysql.*
-rwxr-xr-x 1 root root    873 Aug 19 12:27 /lib64/security/pam_mysql.la
-rwxr-xr-x 1 root root 133356 Aug 19 12:27 /lib64/security/pam_mysql.so
# 2.3修改配置vsftpd.conf and /etc/pam.d/vsftpd.mysql
#pam_service_name=vsftpd
pam_service_name=vsftpd.mysql

[[email protected] pam.d]# more vsftpd.mysql 
auth 	required /lib64/security/pam_mysql.so db=vsftpd user=root passwd=123456 host=localhost table=users usercolumn=name passwdcolumn=passwd crypt=2
account required /lib64/security/pam_mysql.so db=vsftpd user=root passwd=123456 host=localhost table=users usercolumn=name passwdcolumn=passwd crypt=2

### crypt參數介紹:
[[email protected] pam_mysql-0.7RC1]# less README
crypt (plain)

    The method to encrypt the user‘s password:

       0 (or "plain") = No encryption.  Passwords stored in plaintext.
                        HIGHLY DISCOURAGED.

       1 (or "Y")     = Use crypt(3) function.

       2 (or "mysql") = Use MySQL PASSWORD() function. It is possible
                        that the encryption function used by PAM-MySQL
                        is different from that of the MySQL server, as
                        PAM-MySQL uses the function defined in MySQL‘s
                        C-client API instead of using PASSWORD() SQL function
                        in the query.
                        
       3 (or "md5")   = Use plain hex MD5.

       4 (or "sha1")  = Use plain hex SHA1.

[[email protected] pam.d]# /etc/init.d/vsftpd restart
Shutting down vsftpd:                                      [  OK  ]
Starting vsftpd for vsftpd:                                [  OK  ]

以上,vsftpd服務器基於mysql進行虛擬用戶認證的環境已搭建完畢,下一步開始測試啦。。。


GG,上傳文件再次報錯。。。
響應: 	550 Permission denied.
錯誤: 	嚴重文件傳輸錯誤
報錯與之前的一致,可能是權限配置的問題吧,呵呵

"test"賬號登錄成功後,是映射成ftp用戶對文件和目錄進行操作的,所以進入了/var/ftp/目錄,可以查看配置文件和ftp用戶確定。
guest_enable=YES
guest_username=ftp
user_config_dir=/etc/vsftpd/user_conf
[[email protected] vsftpd]# cat /etc/passwd | grep ftp
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

[[email protected] vsftpd]# cd /var/ftp/
[[email protected] ftp]# ls -ld ../* | grep ftp
drwxr-xr-x   3 root root 4096 Aug 18 22:53 ../ftp
You have new mail in /var/spool/mail/root
[[email protected] ftp]# ls -ld *
drwxr-xr-x 2 root root 4096 Mar 22 20:14 pub
可以看到上面的ftp與upload目錄,ftp用戶都是沒有寫權限的,可以修改方式就是修改upload目錄的權限後重啟vsftpd就可以上傳,Ok,那就開始幹!
[[email protected] ftp]# chown ftp pub
[[email protected] ftp]# ll
total 4
drwxr-xr-x 2 ftp root 4096 Mar 22 20:14 pub
這樣修改之後應該就沒問題了吧,哈哈哈,結果一測試果然又GG了。。。所以逐步進行排查:
1、目錄權限設置肯定沒問題了
2、那估計就是vsftpd配置文件讀寫權限設置的問題了吧,因為我的ftp用戶是存在單獨目錄下與用戶同名的配置文件中的,故新建名為test的配置文件,配置貼上來:
[[email protected] user_conf]# pwd
/etc/vsftpd/user_conf
You have new mail in /var/spool/mail/root
[[email protected] user_conf]# more test 
local_root=/var/ftp
write_enable=YES
anon_umask=022
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

Ok,重啟vsftpd測試,終於可以上傳文件了,搞定。。。

四、vsftpd部署問題總結:

等待更新中。。。。。


本文出自 “MessageTech” 博客,請務必保留此出處http://msgll.blog.51cto.com/6990666/1957583

CentOS 6.x上搭建vSFTPD服務器搭建與配置詳解