摘要:node
手把手教你搭建vsftpd服務器,實現了基於db文件和MySQL數據庫文件進行虛擬用戶認證,固然了也本文章也包含搭建過程當中問題的排查啦,哈哈哈。mysql
另外,我在CentOS 7.x上也進行了搭建測試,步驟一致,個別命令會有不一樣,但不影響測試效果。
sql
服務器部署需求分析(實現效果):數據庫
一、登陸、傳輸全程進行加密處理。 二、記錄用戶上傳、下載文件日誌。 三、針對每一個用戶有公共文件夾(你們均可以看到和下載其中的文件)和私有文件夾(只有本身能夠看到,而且可上傳下載文件)。
1、vsftpd服務安裝:
centos
一、搜索yum源中是否有vsftpd的安裝包:
[root@dba ~]# cat /etc/centos-release CentOS release 6.5 (Final) [root@dba ~]# yum list | grep -i "vsftpd" vsftpd.x86_64 2.2.2-24.el6 base You have new mail in /var/spool/mail/root
二、安裝vsftpd服務程序:瀏覽器
[root@dba ~]# yum list | grep -i "vsftpd" && yum -y install vsftpd [root@dba ~]# whereis vsftpd vsftpd: /usr/sbin/vsftpd /etc/vsftpd /usr/share/man/man8/vsftpd.8.gz
三、啓動vsftpd服務程序:安全
[root@dba ~]# /etc/init.d/vsftpd start 爲 vsftpd 啓動 vsftpd: [肯定] [root@dba ~]# netstat -lntp | grep "21" tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 1677/vsftpd
四、訪問vsftpd服務:bash
瀏覽器訪問:ftp://192.168.0.110/,默認會訪問到/var/ftp/pub目錄。服務器
客戶度端訪問(推薦filezilla):https://www.filezilla.cn/download/client session
2、vsftpd服務配置詳解:
一、備份配置文件及用戶黑白名單配置:
[root@dba ~]# cd /etc/vsftpd/ [root@dba 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 [root@dba vsftpd]# cp vsftpd.conf vsftpd.conf_bak [root@dba 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
二、其餘重要配置項介紹:
配置項語法格式: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,但也能夠手動指定! [root@dba vsftpd]# cat /etc/passwd | grep ftp ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
3、vsftpd典型配置案例:
一、基於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 建立用戶配置文件目錄: [root@dba vsftpd]# install -d /etc/vsftpd/user_conf [root@dba 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用戶名密碼源文件和對應的數據庫文件: [root@dba vsftpd]# touch vusers [root@dba vsftpd]# echo -e "user01\nuser01" vusers [root@dba vsftpd]# echo -e "user02\nuser02" >> vusers [root@dba vsftpd]# more vusers user01 user01 user02 user02 [root@dba vsftpd]# db_load -T -t hash -f /etc/vsftpd/vusers /etc/vsftpd/login.db [root@dba 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 建立每一個用戶的配置文件: [root@dba vsftpd]# cd user_conf/ [root@dba 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服務關聯起來: [root@dba 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 [root@dba 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主目錄: [root@dba user_conf]# mkdir -p /ftp/user01/upload [root@dba user_conf]# mkdir -p /ftp/user02/upload [root@dba 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 由於上面建立的用戶user0一、user02登陸ftp服務器以後,是映射成本地用戶ftp進行建立文件、目錄的操做的,因此要機遇用戶主目錄屬主爲用戶:ftp [root@dba ftp]# chown ftp:root user01 [root@dba ftp]# chown ftp:root user02 [root@dba 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目錄屬主權限不對,修改後上傳文件正常。 [root@dba ftp]# ls -ld user01/upload drwxr-xr-x 2 root root 4096 8月 19 00:31 user01/upload [root@dba ftp]# ls -ld user02/upload drwxr-xr-x 2 root root 4096 8月 19 00:31 user02/upload [root@dba ftp]# chown -R ftp:root user01/upload [root@dba ftp]# chown -R ftp:root user02/upload [root@dba ftp]# ls -ld user01/upload drwxr-xr-x 2 ftp root 4096 8月 19 00:31 user01/upload [root@dba 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證書文件: [root@dba 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文件以下: [root@dba ~]# 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 [root@dba vsftpd]# /etc/init.d/vsftpd restart 關閉 vsftpd: [肯定] 爲 vsftpd 啓動 vsftpd: [肯定] ### CentOS 7.x [root@dba vsftpd]# systemctl start vsftpd [root@dba vsftpd]# netstat -lntp | grep 21 tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 2951/vsftpd 重啓以後,使用FileZilla客戶端鏈接vsFTPd服務器,能夠正常上傳下載文件,麼麼噠。。。
二、基於pam_mysql實現匿名用戶認證:
[root@dba 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登陸的虛擬用戶名和密碼: [root@dba pam.d]# yum -y install mysql-server [root@dba pam.d]# yum grouplist | grep -i "develop" Additional Development Desktop Platform Development Development tools Server Platform Development [root@dba ~]# 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插件: [root@dba ~]# yum install openssl-devel [root@dba ~]# yum install mysql-devel [root@dba ~]# wget
[root@dba ~]# tar -zxf pam_mysql-0.7RC1.tar.gz [root@dba ~]# cd pam_mysql-0.7RC1 [root@dba ~]# ./configure --with-mysql=/usr --with-openssl=/usr --with-pam-mods-dir=/lib64/security [root@dba ~]# make && make install [root@dba ~]# 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 [root@dba 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參數介紹: [root@dba 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. [root@dba 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 [root@dba vsftpd]# cat /etc/passwd | grep ftp ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin [root@dba vsftpd]# cd /var/ftp/ [root@dba 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 [root@dba ftp]# ls -ld * drwxr-xr-x 2 root root 4096 Mar 22 20:14 pub 能夠看到上面的ftp與upload目錄,ftp用戶都是沒有寫權限的,能夠修改方式就是修改upload目錄的權限後重啓vsftpd就能夠上傳,Ok,那就開始幹! [root@dba ftp]# chown ftp pub [root@dba ftp]# ll total 4 drwxr-xr-x 2 ftp root 4096 Mar 22 20:14 pub 這樣修改以後應該就沒問題了吧,哈哈哈,結果一測試果真又GG了。。。因此逐步進行排查: 一、目錄權限設置確定沒問題了 二、那估計就是vsftpd配置文件讀寫權限設置的問題了吧,由於個人ftp用戶是存在單獨目錄下與用戶同名的配置文件中的,故新建名爲test的配置文件,配置貼上來: [root@dba user_conf]# pwd /etc/vsftpd/user_conf You have new mail in /var/spool/mail/root [root@dba 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測試,終於能夠上傳文件了,搞定。。。
4、vsftpd部署問題總結:
等待更新中。。。。。