FTP 是 File Transfer Protocol (文件傳輸協議)的縮寫 ,在 Unix/Linux 系統中經常使用的免費 FTP 服務器軟件主要是 VSFTP,vsftp的官方地址:http://vsftpd.beasts.orghtml
FTP工做時會開兩個端口,一個命令端口(TCP:21),一個數據端口(TCP:20)node
服務器主動鏈接客戶端linux
FTP 客戶端隨機開啓一個大於1024 的端口 N 向服務器的 21 號端口發起鏈接,而後開放 N+1 號端口進行監聽,並向服務器發出PORT N+1 命令。服務器接收到命令後,會用其本地的 FTP 數據端口(一般是 20 )來鏈接客戶端指定的端口 N+1 ,進行數據傳輸算法
通道 | client | server | |
---|---|---|---|
命令控制 | 1088 | ------> | 21 |
數據傳輸 | 1089 | <------ | 20 |
客戶端主動連接服務器端數據庫
FTP 客戶端隨機開啓一個大於1024 的端口 N 向服務器的 21 號端口發起鏈接,同時會開啓 N+1 號端口。而後向服務器發送PASV 命令,通知服務器本身處於被動模式。服務器收到命令後,會開放一個大於 1024 的端口 P 進行監聽,而後用 PORT P 命令通知客戶端,本身的數據端口是 P 。客戶端收到命令後,會經過 N+1號端後鏈接服務器的端口 P ,而後在兩個端口之間進行數據傳輸ubuntu
通道 | client | server | |
---|---|---|---|
命令控制 | 1088 | ------> | 21 |
數據傳輸 | 1089 | -- PASV --> | 1099 |
關於二者的區別參考:http://slacksite.com/other/ftp.htmlvim
ubuntu14.04安全
$ sudo dpkg -i vsftpd_3.0.2-1ubuntu2.14.04.1_amd64.deb $ netstat -lant | grep 21 tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN
主配置文件:/etc/vsftpd.confbash
匿名用戶(映射爲系統用戶ftp )共享文件位置:/srv/ftp服務器
anonymous_enable=NO # 是否容許匿名用戶登錄,模式不容許 local_enable=YES # 容許系統用戶登錄 #write_enable=YES # 容許登錄用戶進行寫操做,默認不容許 #local_umask=022 # 用戶登錄後建立文件的umask值 #anon_upload_enable=YES # 容許匿名用戶上傳文件 #anon_mkdir_write_enable=YES # 容許匿名用戶建立目錄 dirmessage_enable=YES # 是否顯示目錄說明文件, 須要收工建立.message文件 use_localtime=YES # 使用本地時間 xferlog_enable=YES # 開啓上傳下載日誌 connect_from_port_20=YES # 數據傳輸端口 #chown_uploads=YES # 是否改變上傳文件的屬主 #chown_username=whoever # 若是是須要輸入一個系統用戶名 #xferlog_file=/var/log/vsftpd.log # 日誌文件的路徑 #xferlog_std_format=YES # 是否使用標準的ftp xferlog模式 #idle_session_timeout=600 # session超時時間 #data_connection_timeout=120 # 設置數據傳輸超時時間 #nopriv_user=ftpsecure # 運行vsftpd須要的非特權系統用戶默認是nobody #async_abor_enable=YES # 是否容許運行特殊的ftp命令async ABOR #ascii_upload_enable=YES # 是否使用ascii碼方式上傳文件 #ascii_download_enable=YES # 是否使用ascii碼方式下載文件 #ftpd_banner=Welcome to blah FTP service. # 定製歡迎信息 #deny_email_enable=YES # 是否容許禁止匿名用戶使用某些郵件地址 #banned_email_file=/etc/vsftpd.banned_emails # 禁止郵件地址的文件路徑 #chroot_local_user=YES # 本地用戶禁錮在宿主目錄中 #chroot_list_enable=YES # 是否將系統用戶限止在本身的home目錄下 #chroot_list_file=/etc/vsftpd.chroot_list # 列出的是不chroot的用戶的列表 #ls_recurse_enable=YES # 是否容許使用ls -R等命令 secure_chroot_dir=/var/run/vsftpd/empty pam_service_name=vsftpd # pam的配置文件名稱 /etc/pam.d/vsftpd rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
修改配置文件
$ sudo vim /etc/vsftpd.conf nonymous_enable=YES $ sudo service vsftpd restart
測試:
shuowei@gaopeng:~$ ftp 172.16.10.101 Connected to 172.16.10.101. 220 (vsFTPd 3.0.2) Name (172.16.10.101:shuowei): ftp # 登錄用戶爲ftp 331 Please specify the password. Password: # 密碼隨意,能夠爲空 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> ls 200 PORT command successful. Consider using PASV. 150 Here comes the directory listing. -rw-r--r-- 1 0 0 0 Jan 25 11:12 test.txt 226 Directory send OK. ftp> get test.txt # 有下載的權限 local: test.txt remote: test.txt 200 PORT command successful. Consider using PASV. 150 Opening BINARY mode data connection for test.txt (0 bytes). 226 Transfer complete. ftp> delete test.txt # 沒有寫的權限 550 Permission denied. ftp>
修改配置文件
$ sudo vim /etc/vsftpd.conf nonymous_enable=YES write_enable=YES anon_upload_enable=YES anon_mkdir_write_enable=YES $ sudo service vsftpd restart
$ sudo mkdir /srv/ftp/pub $ sudo chown ftp. /srv/ftp/pub/ $ sudo chmod 777 /srv/ftp/pub/
shuowei@gaopeng:~$ ftp 172.16.10.101 Connected to 172.16.10.101. 220 (vsFTPd 3.0.2) Name (172.16.10.101:shuowei): ftp 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> ls 200 PORT command successful. Consider using PASV. 150 Here comes the directory listing. drwxrwxrwx 2 105 112 4096 Jan 25 11:33 pub -rw-r--r-- 1 0 0 0 Jan 25 11:12 test.txt 226 Directory send OK. ftp> cd pub # 進入pub目錄 250 Directory successfully changed. ftp> ls 200 PORT command successful. Consider using PASV. 150 Here comes the directory listing. 226 Directory send OK. ftp> mkdir testdir # 文件建立成功 257 "/pub/testdir" created ftp> put zabbix-3.0.tar.gz # 能夠上傳文件 local: zabbix-3.0.tar.gz remote: zabbix-3.0.tar.gz 200 PORT command successful. Consider using PASV. 150 Ok to send data. 226 Transfer complete. 15653160 bytes sent in 0.10 secs (143.7224 MB/s) ftp> ls 200 PORT command successful. Consider using PASV. 150 Here comes the directory listing. drwx------ 2 105 112 4096 Jan 25 11:36 testdir -rw------- 1 105 112 15653160 Jan 25 11:42 zabbix-3.0.tar.gz 226 Directory send OK.
shuowei@gaopeng:~$ ftp 172.16.10.101 Connected to 172.16.10.101. 220 (vsFTPd 3.0.2) Name (172.16.10.101:shuowei): ubuntu # 系統用戶名 331 Please specify the password. Password: # 系統用戶的密碼 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> ls 200 PORT command successful. Consider using PASV. 150 Here comes the directory listing. -rw-r--r-- 1 1000 1000 111462 Jan 25 10:30 vsftpd_3.0.2-1ubuntu2.14.04.1_amd64.deb 226 Directory send OK. ftp> pwd 257 "/home/ubuntu" # 登錄後在本身的家目錄 ftp> get vsftpd_3.0.2-1ubuntu2.14.04.1_amd64.deb# 有下載的權限 local: vsftpd_3.0.2-1ubuntu2.14.04.1_amd64.deb remote: vsftpd_3.0.2-1ubuntu2.14.04.1_amd64.deb 200 PORT command successful. Consider using PASV. 150 Opening BINARY mode data connection for vsftpd_3.0.2-1ubuntu2.14.04.1_amd64.deb (111462 bytes). 226 Transfer complete. 111462 bytes received in 0.00 secs (52.1582 MB/s) ftp> delete vsftpd_3.0.2-1ubuntu2.14.04.1_amd64.deb # 沒有寫的權限 須要開啓write_enable=YES 550 Permission denied.
VSFTP 一個稱爲安全的保證是採用了虛擬用戶的認證方式,它靠對 /etc/pam.d/ 目錄下指定的一個認證文件對用戶進行認證,認證成功後再把虛擬用戶映射爲本地用戶,該本地用戶由服務器配置文件裏的語句 ftp_username 的值指定。使用虛擬用戶認證,則原有系統帳戶將再也不可用。
全部虛擬用戶會統一映射爲一個指定的系統普通帳號:訪問共享位置,即爲此係統普通用戶的家目錄,固然每一個虛擬用戶也可被賦予不一樣的訪問權限,經過匿名用戶的權限控制參數進行指定
爲了實現虛擬用戶咱們須要準備的環境
$ sudo mkdir /data $ sudo useradd -m -d /data/ftp -s /bin/false ftpadmin
ubuntu@node1:~$ sudo mkdir /etc/vsftpd/ ubuntu@node1:~$ sudo vim /etc/vsftpd/ftpusers.txt jdyyy 123456 yuanzhi 123456
建立數據庫文件須要安裝db_util
$ sudo dpkg -i db5.3-util_5.3.28-3ubuntu3.1_amd64.deb db-util_1%3a5.3.21~exp1ubuntu1_all.deb
生成認證數據庫文件
ubuntu@node1:~$ sudo db_load -T -t hash -f /etc/vsftpd/ftpusers.txt /etc/vsftpd/ftpusers.db # -T: 容許使用文本文件信息加載到數據庫中 # -t : 指定加密算法 # -f : 指定文件 ubuntu@node1:~$ sudo chmod 600 /etc/vsftpd/ftpusers.db
建立數據庫的pam文件
# 備份原來的pam文件 $ sudo cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak # 拷貝pam模板文件到/etc/pam.d/ $ sudo cp /usr/share/doc/vsftpd/examples/VIRTUAL_USERS/vsftpd.pam /etc/pam.d/vsftpd # 編譯新的pam文件 # 注意pam_userdb.so的位置,模板中/lib/security/pam_userdb.so是找不到的 # 根據系統的狀況改,db=/etc/vsftpd/ftpusers ftpuser是認證數據庫文件的文件名,這裏不須要加後綴 $ sudo vim /etc/pam.d/vsftpd auth required /lib/x86_64-linux-gnu/security/pam_userdb.so db=/etc/vsftpd/ftpusers account required /lib/x86_64-linux-gnu/security/pam_userdb.so db=/etc/vsftpd/ftpusers
# 激活虛擬用戶 guest_enable=YES # 虛擬用戶映射到系統用戶的用戶名稱(系統用戶的名稱) guest_username=ftpadmin # 虛擬用戶擁有與系統用戶相同的權限 virtual_use_local_privs=YES
異常處理
若是配置文件中沒有加:virtual_use_local_privs=YES
登錄報錯:500 OOPS: vsftpd: refusing to run with writable root inside chroot()
shuowei@gaopeng:~$ ftp 172.16.10.101 Connected to 172.16.10.101. 220 (vsFTPd 3.0.2) Name (172.16.10.101:shuowei): jdyyy 331 Please specify the password. Password: 500 OOPS: vsftpd: refusing to run with writable root inside chroot() Login failed. ftp>
去除系統用戶家目錄寫權限
$ sudo chmod a-w /data/ftp/
可是又沒有寫的權限了。
listen=YES anonymous_enable=NO local_enable=YES write_enable=YES dirmessage_enable=YES use_localtime=YES xferlog_enable=YES connect_from_port_20=YES xferlog_file=/var/log/vsftpd.log secure_chroot_dir=/var/run/vsftpd/empty pam_service_name=vsftpd rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key guest_enable=YES guest_username=ftpadmin virtual_use_local_privs=YES
這樣虛擬用戶讀寫刪權限都有
$ sudo vim /etc/vsftpd.conf user_config_dir=/etc/vsftpd_user_conf
$ sudo mkdir /data/ftp/jdyyy $ sudo mkdir /etc/vsftpd_user_conf $ sudo vim /etc/vsftpd_user_conf/jdyyy # 只有上傳權限,沒有下載權限 write_enable=YES virtual_use_local_privs=NO anon_upload_enable=YES anon_world_readable_only=YES anon_mkdir_write_enable=YES anon_other_write_enable=NO $ sudo vim /etc/vsftpd_user_conf/yuanzhi # 只有下載權限 write_enable=NO virtual_use_local_privs=NO anon_upload_enable=NO anon_world_readable_only=NO anon_mkdir_write_enable=NO anon_other_write_enable=NO # 注意ftp文件夾的權限 ubuntu@node1:/$ ll /data/ total 12 drwxr-xr-x 3 root root 4096 Jan 25 16:17 ./ drwxr-xr-x 23 root root 4096 Jan 25 16:17 ../ drwxr-xr-x 4 ftpadmin ftpadmin 4096 Jan 25 17:50 ftp/ # 主配置文件 ubuntu@node1:/$ grep -Ev "(^#|^$)" /etc/vsftpd.conf listen=YES anonymous_enable=NO local_enable=YES dirmessage_enable=YES use_localtime=YES xferlog_enable=YES connect_from_port_20=YES xferlog_file=/var/log/vsftpd.log chroot_local_user=YES secure_chroot_dir=/var/run/vsftpd/empty pam_service_name=vsftpd rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key guest_enable=YES guest_username=ftpadmin virtual_use_local_privs=YES allow_writeable_chroot=YES user_config_dir=/etc/vsftpd_user_conf
權限 | upload | download | admin |
---|---|---|---|
下載 | - | + | + |
上傳 | + | - | + |
建立目錄 | + | - | + |
刪除 | - | - | + |
root@node1:~# ls -ld /data/ftp/* drwxr-xr-x 2 ftpadmin ftpadmin 4096 Jan 28 18:50 /data/ftp/download drwxr-xr-x 3 ftpadmin ftpadmin 4096 Jan 28 18:54 /data/ftp/upload vsftpd服務的主配置文件 ubuntu@node1:~$ grep -Ev "(^#|^$)" /etc/vsftpd.conf listen=YES anonymous_enable=NO local_enable=YES dirmessage_enable=YES use_localtime=YES xferlog_enable=YES connect_from_port_20=YES xferlog_file=/var/log/vsftpd.log chroot_local_user=YES secure_chroot_dir=/var/run/vsftpd/empty pam_service_name=vsftpd rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key guest_enable=YES guest_username=ftpadmin allow_writeable_chroot=YES user_config_dir=/etc/vsftpd_user_conf
建立不一樣用戶各自的的配置文件
root@node1:~# ls /etc/vsftpd_user_conf/ admin download upload ubuntu@node1:~$ cat /etc/vsftpd_user_conf/download write_enable=NO anon_upload_enable=NO anon_world_readable_only=NO anon_mkdir_write_enable=NO anon_other_write_enable=NO local_root=/data/ftp/download ubuntu@node1:~$ cat /etc/vsftpd_user_conf/upload write_enable=YES anon_upload_enable=YES anon_world_readable_only=YES anon_mkdir_write_enable=YES anon_other_write_enable=NO local_root=/data/ftp/upload ubuntu@node1:~$ cat /etc/vsftpd_user_conf/admin write_enable=YES anon_upload_enable=YES anon_world_readable_only=NO anon_mkdir_write_enable=YES anon_other_write_enable=YES
生成用戶數據庫文件
ubuntu@node1:~$ cat /etc/vsftpd/ftpusers.txt upload 123456 download 123456 admin admin ubuntu@node1:~$ sudo db_load -T -t hash -f /etc/vsftpd/ftpusers.txt /etc/vsftpd/ftpusers.db
重啓服務