linux入門系列15--文件傳輸之vsftp服務

前面的系列文章基本講完了linux管理相關的基礎知識,從本篇開始講解centos7中服務程序的部署和配置,以便爲外部提供各類服務。linux

平常工做和娛樂中,咱們所需的各類資源都離不開網絡以及各類服務,咱們經過網絡獲取部署在其餘服務器上的各類服務資源,這些服務包括文件服務、郵件服務、媒體服務等等。算法

通常狀況下,咱們使用計算機上網的一個重要目的就是爲了獲取資料,而文件傳輸則是獲取資料的方式。所以,咱們首先來了解下linux中文件傳輸相關的知識。數據庫

1、文件傳輸協議FTP

1.1 FTP產生背景

「無規矩不成方圓」,這說明了規則的重要性。一樣,當今的互聯網由成千上萬臺機器組成,這些機器包括我的計算機、工做站、服務器、巨型機等各類形形色色的設備,而且這些設備中使用的操做系統還不同,有的多是用的windows,而有的則是Linux或其餘系統。vim

要在這麼紛繁複雜的設備之間傳輸文件,那就必需要有必定的規則,你們都按規則辦事,傳輸的文件才能相互識別,達到正確傳遞信息的目的。在這種背景下,爲了解決文件傳輸的問題,文件傳輸協議應運而生。windows

1.2 FTP相關概念

文件傳輸協議(File Transfer Protocol,FTP),是一種在互聯網中進行文件傳輸的協議,基於客戶端/服務器模式,默認使用 20、21 號端口,其中20端口是數據端口用於進行數據傳輸,21端口爲命令端口,用於接收客戶端發出的相關FTP命令和參數。centos

本系列文章第三篇提到的全部工具均可以實如今Windows中遠程到Linux主機並上傳下載文件,而且在Linux主機之間也能夠經過scp命令上傳文件,那爲何還須要FTP呢?我的認爲應該是由於FTP通常搭建與內網之中,有具備容易搭建、方便管理的特色,而且一些FTP客戶端工具還具備文件多點下載以及斷點續傳等功能,這些是scp作不到的。安全

FTP是C/S架構,也就是基於客戶端/服務器的模式,FTP服務器是按照FTP協議在互聯網上提供文件存儲和訪問服務的主機,FTP客戶端則是向服務器發送鏈接請求,以創建數據傳輸鏈路的主機。服務器

FTP協議的傳輸拓撲結構以下:網絡

file

FTP協議工做模式有兩種:主動模式和被動模式,其中被動模式是默認的工做模式架構

  • 主動模式:FTP 服務器主動向客戶端發起鏈接請求。

  • 被動模式:FTP 服務器等待客戶端發起鏈接請求。

因爲FTP通常部署在企業內網,若是開啓並配置了防火牆,有時候須要將FTP的工做模式設置爲主動模式,才能夠傳輸數據。

2、Linux下基於FTP協議工具

2.1 vsftpd服務安裝

vsftpd(very secure ftp daemon)很是安全的FTP守護進程,是一款運行在Linux系統上的免費開源的FTP服務端程序。其主要特色是:安全性高、傳輸速度快、支持虛擬用戶驗證。

默認狀況Centos7中是沒有安裝vsftpd的,所以須要手動經過yum倉庫安裝,根據前文的講解能夠用光盤資源自帶的yum源,也能夠直接配置外網源。本例採用默認的外網yum源進行安裝。

[root[@origin](https://my.oschina.net/zorigin) ~]# rpm -q vsftpd
package vsftpd is not installed
[root[@origin](https://my.oschina.net/zorigin) ~]# yum install vsftpd
Loaded plugins: fastestmirror, langpacks
...省略部份內容
Installed size: 353 k
Is this ok [y/d/N]: y
Downloading packages:
vsftpd-3.0.2-25.el7.x86_64.rpm                             | 171 kB   00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : vsftpd-3.0.2-25.el7.x86_64                                   1/1 
  Verifying  : vsftpd-3.0.2-25.el7.x86_64                                   1/1 
Installed:
  vsftpd.x86_64 0:3.0.2-25.el7                                                 
Complete!
[root[@origin](https://my.oschina.net/zorigin) ~]# rpm -q vsftpd     
vsftpd-3.0.2-25.el7.x86_64
[root[@origin](https://my.oschina.net/zorigin) ~]#

經過rpm命令查看是否已經安裝過vsftpd,若是沒有安裝則經過yum install命令安裝便可,安裝過程當中須要按提示輸入y繼續下載並安裝。

> 注意:從如今開始,凡是涉及到服務的配置,就要考慮防火牆和SELinux的因素,不少教程和書籍上都是直接關閉防火牆和selinux,雖然這樣在學習階段能夠避免干擾,可是這樣很是不安全。另外凡是配置了服務,都要加入開機啓動中,讓其每次重啓自動生效。

安裝vsftpd服務後,會在/etc下自動生成配置文件

[root@ftpserver ~]# ll /etc/vsftpd/
total 20
-rw-------. 1 root root  125 Oct 31  2018 ftpusers
-rw-------. 1 root root  361 Oct 31  2018 user_list
-rw-------. 1 root root 5116 Oct 31  2018 vsftpd.conf
-rwxr--r--. 1 root root  338 Oct 31  2018 vsftpd_conf_migrate.sh

各個文件的解釋

文件名 做用
vsftpd.conf 主配置文件
ftpusers 黑名單
vsftpd_conf_migrate.sh 遷移腳本
user_list 用戶列表,與userlist_enbale和userlist_deny選項密切相關

查看主配置文件vsftpd.conf內容能夠看到各項配置信息,須要根據實際狀況來進行配置,其中主要的參數和做用以下:

參數 做用
listen=[YES|NO] 是否以獨立運行的方式監聽服務
listen_address=IP地址 設置要監聽的IP地址
listen_port=21 設置FTP服務的監聽端口
download_enable=[YES|NO] 是否容許下載文件
userlist_enable=[YES|NO] 設置用戶列表爲「容許」操做
userlist_deny=[YES|NO] 設置用戶列表爲「禁止」操做
max_clients=0 最大客戶端鏈接數,0爲不限制
max_per_ip=0 同一IP地址的最大鏈接數,0爲不限制
anonymous_enable=[YES|NO] 是否容許匿名用戶訪問
anon_upload_enable=[YES|NO] 是否容許匿名用戶上傳文件
anon_umask=022 匿名用戶上傳文件的umask值
anon_root=/var/ftp 匿名用戶的 FTP 根目錄
anon_mkdir_write_enable=[YES|NO] 是否容許匿名用戶建立目錄
anon_other_write_enable=[YES|NO] 是否開放匿名用戶的其餘寫入權限(包括重命名、刪 除等操做權限)
anon_max_rate=0 匿名用戶的最大傳輸速率(字節/秒),0 爲不限制
local_enable=[YES|NO] 是否容許本地用戶登陸FTP
local_umask=022 本地用戶上傳文件的umask值
local_root=/var/ftp 本地用戶的 FTP 根目錄
chroot_local_user=[YES|NO] 是否將用戶權限禁錮在FTP目錄,以確保安全
local_max_rate=0 本地用戶最大傳輸速率(字節/秒),0爲不限制

不用徹底記住這些參數,須要時再來查看便可。

2.2 ftp客戶端安裝

ftp是Linux系統中以命令行界面的方式來管理FTP傳輸服務的客戶端工具。默認也是沒有安裝的,須要手動安裝。

[root@origin ~]# rpm -q ftp
package ftp is not installed
[root@origin ~]# yum install ftp
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
...省略部份內容
Total download size: 61 k
Installed size: 96 k
Is this ok [y/d/N]: y
Downloading packages:
ftp-0.17-67.el7.x86_64.rpm                                 |  61 kB   00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : ftp-0.17-67.el7.x86_64                                       1/1 
  Verifying  : ftp-0.17-67.el7.x86_64                                       1/1 
Installed:
  ftp.x86_64 0:0.17-67.el7                                                     
Complete!
[root@origin ~]# rpm -q ftp     
ftp-0.17-67.el7.x86_64
[root@origin ~]#

經過yum install命令便可安裝成功,ftp客戶端工具安裝成功後,接下來就是及操做下文件傳輸的功能。

2.3 vsftpd三種認證模式

vsftpd做爲更加安全的文件傳輸的服務程序,容許用戶以三種認證模式登陸到FTP服務器上:匿名開放模式、本地用戶模式、虛擬用戶模式。實際生產環境中虛擬用戶模式用的較多。

  • 匿名開放模式:任何人均可以無需密碼驗證而直接登陸到FTP服務器,是一種最不安全的認證模式。

  • 本地用戶模式:是經過Linux系統本地的帳戶密碼信息進行認證的模式。若是被黑客破解了帳戶信息,就能夠暢通無阻地登陸FTP服務器,從而徹底控制整臺服務器。

  • 虛擬用戶模式:須要爲FTP服務單獨 創建用戶數據庫文件,虛擬出用來進行口令驗證的帳戶信息,而這些帳戶信息在 服務器系統中其實是不存在的,僅供 FTP 服務程序進行認證使用。這樣,即便 黑客破解了帳戶信息也沒法登陸服務器,從而有效下降了破壞範圍和影響。是三種模式中最安全的一種認證模式

2.4 匿名開放模式

匿名開放模式是最不安全的一種認證模式,任何人均可以無需密碼驗證而直接登陸到FTP服務器。針對匿名用戶放開這些權限會帶來潛在危險,生產環境不建議這樣作,所以通常不會用匿名模式,儘管如此,但本節仍是實際演示一下。

按以前的方法克隆準備2臺虛擬機:一臺主機名爲:ftpserver ,用於安裝vsftpd服務;另一臺主機名爲:ftp,用於安裝ftp客戶端。

vsftpd 服務程序默認開啓了匿名開放模式,咱們須要作的就是開放匿名用戶的上傳、下 載文件的權限,以及讓匿名用戶建立、刪除、改名文件的權限。

針對匿名模式的配置主要有以下幾個參數:

參數 做用
anonymous_enable=YES 容許匿名訪問模式
anon_umask=022 匿名用戶上傳文件的umask值
anon_upload_enable=YES 容許匿名用戶上傳文件
anon_mkdir_write_enable=YES 容許匿名用戶建立目錄
anon_other_write_enable=YES 容許匿名用戶修改目錄名稱或刪除目錄

配置匿名模式主要步驟以下:

2.4.1 服務器配置vsftp服務,開啓匿名模式

只須要按照上表查找主配置文件中對應的參數,若是是注射掉的就把注射去掉,若是是沒有的就新加便可。

可是考慮到該配置文件裏邊的註釋信息是在是太多了,影響配置,乾脆咱們把與配置無關的注射直接去掉。

[root@ftpserver ~]# mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
[root@origin ~]# grep -v "#" /etc/vsftpd/vsftpd.conf.bak >/etc/vsftpd/vsftpd.conf
[root@ftpserver ~]# cat /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
[root@ftpserver ~]#

上邊示例中,咱們先把主配置文件備份,而後經過grep命令匹配出非註釋的參數,而後再重定向將其寫入到主配置文件。這樣配置文件看起來內容就簡潔多了。

而後咱們將上表的參數配置到主配置文件便可:

[root@origin ~]# vi /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
anon_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

實際上第一行已經默認開啓了,等因而添加第二到第五行便可。保存並退出,這樣就完成了vsftpd服務的配置。

配置完成後重啓服務,並添加到開機啓動。配置並開啓vsftp服務後,就能夠在客戶端執行ftp命令鏈接到遠程的FTP服務器了。

[root@ftpserver ~]# systemctl restart vsftpd
[root@ftpserver ~]# systemctl enable vsftpd
ln -s '/usr/lib/systemd/system/vsftpd.service' '/etc/systemd/system/multi-user.target.wants/vsftpd.service'
[root@ftpserver ~]# 
[root@ftpserver ~]# ll /var/ftp/pub/
total 0
[root@ftpserver ~]# echo "ftp server content">/var/ftp/pub/ftpserver.txt
[root@ftpserver ~]# ll /var/ftp/pub/
total 4
-rw-r--r--. 1 root root 19 Jan 13 23:09 ftpserver.txt
[root@ftpserver ~]#

在/var/ftp/pub目錄下準備文件,供ftp客戶端下載。由於客戶端鏈接到FTP服務器後,默認訪問的是服務器的/var/ftp目錄(該目錄下還有一個pub目錄)。

2.4.2 客戶機使用ftp服務下載文件

在vsftpd服務程序的匿名開放認證模式下,其帳戶統一爲 anonymous,密碼爲空

[root@ftp ~]# ftp 192.168.78.101
ftp: connect: No route to host
ftp>

發現報錯了,此時咱們首先應該想到的就是ftpserver服務器的防火牆,所以咱們關閉防火牆來驗證一下

[root@ftpserver ~]# firewall-cmd --state
running
[root@ftpserver ~]# systemctl stop firewalld.service 
[root@ftpserver ~]# firewall-cmd --state
not running
[root@ftpserver ~]#

在ftpserver服務器關閉防火牆後,在嘗試鏈接就能夠正常鏈接並下載服務器上的ftpserver.txt文件了。

[root@ftp ~]# ftp 192.168.78.101
Connected to 192.168.78.101 (192.168.78.101).
220 (vsFTPd 3.0.2)
Name (192.168.78.101:root): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250 Directory successfully changed.
ftp> ls
227 Entering Passive Mode (192,168,78,101,132,61).
150 Here comes the directory listing.
-rw-r--r--    1 0        0              19 Jan 13 15:09 ftpserver.txt
226 Directory send OK.
ftp> get ftpserver.txt
local: ftpserver.txt remote: ftpserver.txt
227 Entering Passive Mode (192,168,78,101,115,121).
150 Opening BINARY mode data connection for ftpserver.txt (19 bytes).
226 Transfer complete.
19 bytes received in 7e-05 secs (271.43 Kbytes/sec)
ftp>

這樣就把ftpserver服務器上的ftpserver.txt文件下載到了當前用戶的家目錄下

[root@ftp ~]# ll
-rw-r--r--. 1 root root   19 Jan 13 23:20 ftpserver.txt
...省略部分無關的文件
[root@ftp ~]# cat ftpserver.txt 
ftp server content
[root@ftp ~]#

到此咱們就可使用ftp下載服務器上的文件了。可是有個問題必須的說明一下,前邊遇到ftp鏈接問題時,咱們直接關閉了服務器上的防火牆。但這是很是不安全的,生產環境中通常都是要求開啓防火牆。

那麼防火牆是如何阻止了ftp客戶端鏈接呢?其實就是由於firewall防火牆默認禁止了ftp傳輸的端口號,所以能夠清除防火牆的默認策略

[root@ftpserver ~]# systemctl start firewalld.service 
[root@ftpserver ~]# firewall-cmd --state              
running
[root@ftpserver ~]# iptables -F
[root@ftpserver ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]
[root@ftpserver ~]#

清除防火牆默認策略並保存,這樣即便服務器不關閉防火牆也能夠正常使用功能ftp功能下載文件了。

2.4.3 經過ftp客戶端在服務器上建立目錄

接下來咱們切換到pub目錄,並嘗試建立一個目錄test

ftp> cd pub
250 Directory successfully changed.
ftp> mkdir test
550 Create directory operation failed.
ftp>

好神奇,竟然報錯了。你們不用擔憂,學習階段要的就是這種效果,遇到的錯誤越多,越能快速積累經驗,並創建一套分析問題和解決問題的邏輯思惟套路。

分析一下,咱們第一步時已經在主配置文件中添加了運行匿名用戶建立目錄和寫入文件的權限,但爲什麼仍是會報錯呢?既然排除了是用戶權限的問題,那麼是否是/var/ftp這個目錄的權限問題呢?

[root@ftpserver ~]# ll -d /var/ftp/pub
drwxr-xr-x. 2 root root 26 Jan 13 23:09 /var/ftp/pub
[root@ftpserver ~]# chown -Rf ftp /var/ftp/pub
[root@ftpserver ~]# ll -d /var/ftp/pub        
drwxr-xr-x. 2 ftp root 26 Jan 13 23:09 /var/ftp/pub
[root@ftpserver ~]# ll -d /var/ftp/
drwxr-xr-x. 3 root root 16 Jan 13 22:59 /var/ftp/

經過查看,果真發現/var/ftp目錄只有root用戶纔有寫入的權限,所以咱們直接把pub目錄全部者改成ftp用戶,讓ftp用戶擁有寫入的權限,咱們再次來試下看可否建立文件夾

ftp> mkdir test
550 Create directory operation failed.
ftp>

奇怪,依然報錯。前面排除了用戶權限、目錄權限以外,咱們應該想到頗有多是SELinux形成的,所以咱們關閉SELinux再來驗證一下

[root@ftpserver ~]# setenforce 0
[root@ftpserver ~]#

關閉SeLinux後後,再去建立目錄,發現建立成功

ftp> mkdir test
257 "/pub/test" created
ftp>

所以,說明不只要讓pub目錄的屬主擁有寫入權限,而且同時還要關閉SELinux才能建立目錄。

可是實際生產環境中不建議關閉SELinux,因此咱們要弄清楚究竟SELinux哪一個配置影響了

[root@ftpserver ~]# setenforce 1
[root@origin ~]# getenforce 
Enforcing
[root@origin ~]# getsebool -a | grep ftp
ftp_home_dir --> off
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> off
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
sftpd_anon_write --> off
sftpd_enable_homedirs --> off
sftpd_full_access --> off
sftpd_write_ssh_home --> off
tftp_anon_write --> off
tftp_home_dir --> off
[root@origin ~]#

咱們查看下SELinux狀態爲開啓,查看與ftp域相關的策略,其中有一條ftpd_full_access --> off其實就是這條規則致使了操做失敗。

修改該策略,並使用-P參數使其永久生效。

[root@origin ~]# setsebool -P ftpd_full_access=on

再次登陸建立目錄,發現成功了

ftp> mkdir test2
257 "/pub/test2" created
ftp>

所以遇到問題,從用戶權限、目錄權限、網絡防火牆、SELinux服務幾個方面去逐個排查。

2.5 本地用戶模式

本地模式比匿名模式更加安全,如今繼續在前面的虛擬機中作實驗,開始以前先關閉上一實驗中開啓的匿名模式。

[root@ftpserver ~]# vim /etc/vsftpd/vsftpd.conf
[root@ftpserver ~]# cat /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
#anon_umask=022
#anon_upload_enable=YES
#anon_mkdir_write_enable=YES
#anon_other_write_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
[root@ftpserver ~]#

將anonymous_enable=YES改成NO,即關閉了本地模式,此時就不能在使用匿名模式登錄了。

另外前面新加的與匿名配置參數能夠保留,也能夠直接刪除,只要總開關anonymous_enable關閉了就禁用了匿名登陸。

如今開始演示本地用戶模式操做ftp。

其實從前面的配置文件能夠看出,vsfftpd服務默認既開啓了匿名模式也開啓了本地用戶模式(local_enable=YES)。如下幾個參數是本地用戶模式相關的配置

參數 做用
local_enable=YES 容許本地用戶模式
write_enable=YES 設置可寫權限
local_umask=022 本地用戶模式建立文件的 umask 值
userlist_enable=YES 啓用「禁止用戶名單」,名單文件爲 ftpusers 和 user_list
userlist_deny=YES 開啓用戶做用名單文件功能
2.5.1 配置本地用戶模式

其實vsftpd默認已經開啓了本地用戶模式,所以沒什麼能夠配置的,查看下配置文件:

[root@ftpserver ~]# cat /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
#anon_umask=022
#anon_upload_enable=YES
#anon_mkdir_write_enable=YES
#anon_other_write_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
[root@ftpserver ~]#

參考上表,與本地用戶配置相關的主要參數爲:local_enable=YES,write_enable=YES,local_umask=022。若是你的配置文件默認沒配置這幾個項則手動配置一下便可。

注意,若是修改了配置須要重新啓動下vsftpd服務

[root@ftpserver ~]# systemctl restart vsftpd
[root@ftpserver ~]# systemctl enable vsftpd
[root@ftpserver ~]#

另外再建立一個普通用戶ftptest並設置密碼,用於客戶端登陸

[root@ftpserver home]# useradd ftptest
[root@ftpserver home]# passwd ftptest
Changing password for user ftptest.
New password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: all authentication tokens updated successfully.
[root@ftpserver home]#

這樣ftp服務器就準備好了。

> 特別說明:根據前文的經驗,須要按前文方法設置防火牆和SELinux策略客戶端才能使用,因爲咱們是沿用以前的配置,以前已經配置好了,因此這裏不用配置。默認狀況下防火牆將限制登陸、SELinux則限制建立目錄等操做。

2.5.2 ftp客戶端操做服務器

如今就能夠直接採用ftpserver服務器上的普通帳戶ftptest進行文件操做了。

[root@ftp ~]# ftp 192.168.78.101
Connected to 192.168.78.101 (192.168.78.101).
220 (vsFTPd 3.0.2)
Name (192.168.78.101:root): ftptest
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir test
257 "/home/ftptest/test" created
ftp> rename test test1
350 Ready for RNTO.
250 Rename successful.
ftp> ls
227 Entering Passive Mode (192,168,78,101,106,178).
150 Here comes the directory listing.
drwxr-xr-x    2 1001     1001            6 Jan 14 09:01 test1
226 Directory send OK.
ftp> rmdir test1
250 Remove directory operation successful.
ftp> exit
221 Goodbye.
[root@ftp ~]#

案例中成功經過ftp服務器中的ftptest用戶對目錄進行建立、重命名、刪除等操做。而且ftp客戶端建立的目錄,在ftpserver服務器對應的用戶目錄下也能夠查到新建的目錄。

所以能夠看到,本地用戶模式相對匿名模式,配置更簡單一些。可是你們想過爲啥ftptest用戶登陸後就能夠對目錄進行建立、刪除等操做嗎?那是由於本地用戶模式登陸FTP服務器後,默認訪問的是該用戶的家目錄,即/home/ftptest目錄,它的默認全部者、所屬組都是該用戶本身,所以不存在寫入權限不足的狀況。

2.5.3 本地用戶登陸模式之填坑

若是你是按照個人文章步驟操做,必定會很順暢,可是若是一開始並非新建ftptest用戶來登陸,而是直接使用root用戶來進行遠程登陸,那就有個坑須要注意一下。

在客戶端用root登陸試試看

[root@ftp ~]# ftp 192.168.78.101
Connected to 192.168.78.101 (192.168.78.101).
220 (vsFTPd 3.0.2)
Name (192.168.78.101:root): root
530 Permission denied.
Login failed.
ftp>

哦豁,目前的系統root是擁有最高權限的,竟然被拒了,而前邊建立的普通用戶ftptest用戶竟然能夠正常使用ftp功能!我就遇到過,哈哈哈哈,百思不得解。

若是是初次接觸真可能懷疑是本身哪一個步驟操做錯了,其實這裏有一個規則:

vsftpd服務程序配置目錄存放着兩個「用戶名單」的文件:ftpusers、user_list。緣由就在這2個文件,只要這2個文件中存在的用戶,就不容許登陸FTP服務器上。

來看看這2個文件內容:

[root@ftpserver ~]# cat /etc/vsftpd/user_list 
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody
[root@ftpserver ~]# cat /etc/vsftpd/ftpusers 
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody
[root@ftpserver ~]#

果真裏邊存在root用戶,這正是vsftpd服務爲了保證服務器安全默認就禁止了root和大部分系統用戶登陸ftp。這樣作的好處是避免黑客經過FTP服務器對root密碼進行暴力破解。

而爲啥以前建立的ftptest用戶能夠登陸ftp呢,那是由於建立的用戶並無被默認寫入這2個文件。若是確保在生產環境中直接使用root用戶對安全性沒有影響,則直接在這2個文件中把root刪除便可,不然請使用這2個文件中不存在的普通用戶來登陸ftp服務器。

刪除這2個文件中的root用戶,而後重啓vsftpd服務,再次使用root登陸ftp便可成功操做。

2.6 虛擬用戶模式

再來看一種更加安全的認證模式即虛擬用戶模式,由於更加安全因此配置起來稍微要麻煩一些。

咱們仍然在以前的機器上繼續操做,步驟步驟以下:

2.6.1 建立用戶數據庫文件

在ftpserver服務器中的vsftpd配置目錄下建立包含用戶信息的文件vuser.list(文件名字任意取)

[root@ftpserver ~]# cd /etc/vsftpd/
[root@ftpserver vsftpd]# ls
ftpusers  user_list  vsftpd.conf  vsftpd.conf.bak  vsftpd_conf_migrate.sh
[root@ftpserver vsftpd]# vim vuser.list
vuser1
123456
vuser2
123456

vuser.list文件中包含vuser1和vuser2兩個用戶,密碼均爲123456。文件中奇數行表示帳號名,偶數行表示密碼。

接下來要將vuser.list文件轉換爲vsftpd服務程序能直接加載的格式,轉換格式使用db_load命令,該命令用哈希算法將原始的明文信息文件轉換爲數據庫文件。

在使用db_load命令前,查看該命令是否安裝

[root@ftpserver vsftpd]# db_load
usage: db_load [-nTV] [-c name=value] [-f file]
        [-h home] [-P password] [-t btree | hash | recno | queue] db_file
usage: db_load -r lsn | fileid [-h home] [-P password] db_file
[root@ftpserver vsftpd]#

出現該命令的用法,說明默認已經安裝了。

若是未安裝須要手動安裝,該命令包含在db4包中,使用命令yum -y install db4安裝便可。

既然安裝了db_load命令,那就使用它來轉換用戶文件格式

[root@ftpserver vsftpd]# db_load -T -t hash -f vuser.list vuser.db
[root@ftpserver vsftpd]# file vuser.db 
vuser.db: Berkeley DB (Hash, version 9, native byte-order)
[root@ftpserver vsftpd]# ll vuser.db 
-rw-r--r--. 1 root root 12288 Jan 14 21:16 vuser.db
[root@ftpserver vsftpd]# chmod 600 vuser.db 
-rw-------. 1 root root 12288 Jan 14 21:16 vuser.db
[root@ftpserver vsftpd]# rm -rf vuser.list 
[root@ftpserver vsftpd]#

經過db_load命令就把明文的vuser.list文件轉換爲了vuser.db格式的文件,並經過chmod命令下降該文件的權限,從而避免其餘人查看到該數據庫文件的內容,最後直接把明文的vuser.list文件刪除。

2.6.2 建立PAM文件

PAM(Pluggable Authentication Module)是一種認證機制,它將服務與認證方式分開,使得系統管理員能夠輕易的調整服務程序的認證方式,而沒必要對應用程序進行任何修改。它涉及的內容挺多的,此處僅僅先了解概念便可。

在ftpserver服務器上新建一個PAM文件vsftpd.vu(文件名能夠任意)用於虛擬用戶認證,文件內的db參數爲上一步使用功能db_load命令生成的數據庫文件的路徑,但不用寫後綴名

[root@ftpserver vsftpd]# vim /etc/pam.d/vsftpd.vu
auth required pam_userdb.so db=/etc/vsftpd/vuser
account required pam_userdb.so db=/etc/vsftpd/vuser
2.6.3 建立本地用戶

既然是虛擬用戶認證,爲啥還須要創建本地用戶呢?能夠簡單理解爲虛擬指定一個ftp文件存儲的根目錄,當虛擬用戶登陸ftp服務器後默認訪問的就是這個目錄。

因爲Linux中一切文件都有全部者和所屬組,假設前文建立的虛擬用戶vuser1建立了一個文件,可是系統中卻沒有vuser1這個用戶,就會致使文件的權限出現錯誤。所以須要建立一個本地用戶來映射虛擬用戶,讓虛擬用戶默認登陸到與之有映射關係的這個系統本地用戶的家目錄中,虛擬用戶建立的文件的屬性也都歸屬於這個系統本地用戶,從而避免 Linux 系統沒法處理虛擬用戶所建立文件的屬性權限。

因爲ftp目錄中的文件可能常常變化,所以咱們新建一個本地用戶virtual並指定其家目錄爲/var/ftpdir目錄。同時咱們禁用此本地用戶登陸FTP服務器,從而避免黑客利用該本地用戶登陸系統。禁止與虛擬用戶關聯的本地用戶並不會影響虛擬用戶的登陸。

[root@ftpserver vsftpd]# useradd -d /var/ftpdir -s /sbin/nologin virtual
[root@ftpserver vsftpd]# ll -d /var/ftpdir/
drwx------. 3 virtual virtual 74 Jan 14 21:46 /var/ftpdir/
[root@ftpserver vsftpd]# chmod -Rf 755 /var/ftpdir/
[root@ftpserver vsftpd]# ll -d /var/ftpdir/        
drwxr-xr-x. 3 virtual virtual 74 Jan 14 21:46 /var/ftpdir/
[root@ftpserver vsftpd]#

修改目錄權限,讓其餘人可讀。

2.6.4 vsftpd主配置文件配置

配置vsftpd主配置文件,指定以前建立的PAM認證文件以及與虛擬用戶關聯的本地用戶。

[root@ftpserver vsftpd]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
#anon_umask=022
#anon_upload_enable=YES
#anon_mkdir_write_enable=YES
#anon_other_write_enable=YES
local_enable=YES
guest_enable=YES
guest_username=virtual
allow_writeable_chroot=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd.vu
userlist_enable=YES
tcp_wrappers=YES

實際就是在原有基礎上添加:guest_enable=YES、guest_username=virtual、allow_writeable_chroot=YES,並修改pam_service_name=vsftpd.vu爲以前建立的pam認證文件。另外注意,必須開啓本地模式(local_enable=YES)。

虛擬用戶認證相關參數及做用以下:

參數 做用
anonymous_enable=NO 禁止匿名開放模式
local_enable=YES 容許本地用戶模式
guest_enable=YES 開啓虛擬用戶模式
guest_username=virtual 指定虛擬用戶帳戶
pam_service_name=vsftpd.vu 指定PAM文件,存放於/etc/pam.d/目錄下,默認是vsftpd文件
allow_writeable_chroot=YES 容許對禁錮的FTP根目錄執行寫入操做,並且不拒絕用戶的登陸請求
2.6.5 虛擬用戶權限設置

假設咱們要區別對待vuser1和vuser2,只容許vuser1查看文件,而容許vuser2上傳、建立、修改、查看、刪除文件。這種需求在企業真實環境中是常見的,咱們能夠經過vsftpd服務器程序來實現。

[root@ftpserver vsftpd]# mkdir /etc/vsftpd/vusers_dir
[root@ftpserver vsftpd]# cd vusers_dir/
[root@ftpserver vusers_dir]# touch vuser1
[root@ftpserver vusers_dir]# vim vuser2
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

只須要在vsftpd配置目錄下新建vusers_dir目錄(名字能夠任意取),在目錄中分別對應這2個用戶建立文件並寫入權限便可。

同時修改vsftpd主配置文件,過添加 user_config_dir參數來定義這兩個虛擬用戶不一樣權限的配置文件所存放的路徑。

[root@ftpserver vsftpd]# vim /etc/vsftpd/vsftpd.conf
...省略原有內容
user_config_dir=/etc/vsftpd/vusers_dir

配置完成以後重啓vsftpd服務。

2.6.6 驗證不一樣虛擬用戶設置的權限是否生效

此時咱們就可使用虛擬用戶vuser1和vuser2登陸ftp進行測試了

> 因爲咱們按照以前的基礎上進行演示,以前已經配置好了防火牆和SELinux相關策略,所以這裏無需配置(實際操做時要根據實際狀況進行,防火牆和SELinux會對ftp客戶端的操做形成影響)。

使用vuser1登陸測試驗證是否有建立目錄權限

[root@ftp ~]# ftp 192.168.78.101
Connected to 192.168.78.101 (192.168.78.101).
220 (vsFTPd 3.0.2)
Name (192.168.78.101:root): vuser1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir test
550 Permission denied.
ftp> exit
221 Goodbye.
[root@ftp ~]#

正如以前設置同樣,vuser1只有查看權限,沒有建立目錄的權限。

再來看看vuser2

[root@ftp ~]# ftp 192.168.78.101
Connected to 192.168.78.101 (192.168.78.101).
220 (vsFTPd 3.0.2)
Name (192.168.78.101:root): vuser2
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir vuser2
257 "/vuser2" created
ftp> rmdir vuser2
250 Remove directory operation successful.
ftp> exit
221 Goodbye.
[root@ftp ~]#

正如需求一致,vuser2具有建立和刪除目錄的權限。這樣就能夠根據實際須要靈活配置不一樣用戶的權限。

2.6.7 其餘注意事項及常見錯誤

(1)配置了虛擬用戶登陸後,本地用戶登陸就會失效

[root@ftp ~]# ftp 192.168.78.101
Connected to 192.168.78.101 (192.168.78.101).
220 (vsFTPd 3.0.2)
Name (192.168.78.101:root): root
331 Please specify the password.
Password:
530 Login incorrect.
Login failed.
ftp> exit
221 Goodbye.
[root@ftp ~]#

(2)2.6.4節中的vsftpd主配置文件中必需要開啓本地登陸模式

若是不開,將報錯,提示本地模式和匿名模式必須開啓一個,顯然虛擬用戶模式就是爲了提升安全,所以咱們不開匿名模式而開啓本地模式。

[root@ftp ~]# ftp 192.168.78.101
Connected to 192.168.78.101 (192.168.78.101).
500 OOPS: vsftpd: both local and anonymous access disabled!
ftp> exit
[root@ftp ~]#

(3)2.6.4節中的主配置文件參數allow_writeable_chroot=YES必須開啓

若是不開將報錯

[root@ftp ~]# ftp 192.168.78.101
Connected to 192.168.78.101 (192.168.78.101).
220 (vsFTPd 3.0.2)
Name (192.168.78.101:root): vuser1
331 Please specify the password.
Password:
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
Login failed.
421 Service not available, remote server has closed connection
ftp> exit
[root@ftp ~]#

(3)防火牆影響ftp登陸不了

默認狀況防火牆策略阻止了ftp端口,ftp客戶端登陸將獲得以下錯誤

[root@ftp ~]# ftp 192.168.78.101
ftp: connect: No route to host
ftp> exit

此時須要在ftp服務器上執行:iptables -F

(4)SELinux阻止文件建立

原本vuser2是有建立文件權限的,可是因爲受到默認SELinux策略影響,將不能建立文件

[root@ftp ~]# ftp 192.168.78.101
Connected to 192.168.78.101 (192.168.78.101).
220 (vsFTPd 3.0.2)
Name (192.168.78.101:root): vuser2
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir vuser2
550 Create directory operation failed.
ftp> exit
221 Goodbye.
[root@ftp ~]#

此時須要在ftp服務器執行:setsebool -P ftpd_full_access=off命令便可。

3、簡單文件傳輸協議TFTP

3.1 TFTP概述

TFTP(Trivial File Transfer Protocol)簡單文件傳輸協議,是一種基於UDP協議在客戶端和服務器之間進行簡單文件傳輸的協議。能夠認爲它是FTP協議的簡化版本。

3.2.1 TFTP缺點

TFTP的命令功能不如FTP服務強大,不能遍歷目錄,在安全性方比FTP差。傳輸文件採用 UDP 協議,端口號爲 69,文件傳輸過程不如FTP協議可靠。

3.2.2 TFTP優勢

TFTP不須要客戶端的權限認證, 減小了無謂的系統和網絡帶寬消耗,所以在傳輸瑣碎(trivial)不大的文件時,效率更高。

3.2 TFTP操做案例

3.2.1 TFTP安裝並啓動

咱們仍是繼續使用以前的兩臺虛擬機,在主機ftpserver上安裝tftpsever服務,在主機ftp上安裝tftp服務。

(1)tftp服務器安裝

[root@ftpserver ~]# rpm -q tftp-server
package tftp-server is not installed
[root@ftpserver ~]# yum install tftp-server
...省略中間內容
Installed:
  tftp-server.x86_64 0:5.2-22.el7                                           
Complete!
[root@ftpserver ~]

在RHEL7系統中,TFTP服務是使用 xinetd 服務程序來管理的,在安裝TFTP軟件包後,還須要在 xinetd服務程序中將其開啓。

配置以前先看tftp服務器是否安裝xinetd服務

[root@ftpserver ~]# systemctl restart xinetd
Failed to issue method call: Unit xinetd.service failed to load: No such file or directory.

出現這個結果表示爲安裝xinetd,須要手動進行安裝。

[root@ftpserver ~]# yum install xinetd

在tftp服務器中,修改/etc/xinetd.d/tftp配置文件,將disable=yes改成no

[root@ftpserver ~]# vim /etc/xinetd.d/tftp 
service tftp
{
        socket_type             = dgram
        protocol                = udp
        wait                    = yes
        user                    = root
        server                  = /usr/sbin/in.tftpd
        server_args             = -s /var/lib/tftpboot
        disable                 = no
        per_source              = 11
        cps                     = 100 2
        flags                   = IPv4
}
[root@ftpserver ~]#

修改後重啓xinetd服務並添加到開機啓動。

[root@ftpserver ~]# systemctl restart xinetd
[root@ftpserver ~]# systemctl enable xinetd

考慮到有些系統的防火牆默認沒有容許 UDP 協議的 69 端口,所以 須要手動將該端口號加入到防火牆的容許策略中。

[root@ftpserver ~]# firewall-cmd --permanent --add-port=69/udp
success
[root@ftpserver ~]# firewall-cmd --reload
success
[root@ftpserver ~]#

TFTP 的根目錄爲/var/lib/tftpboot。

在tftp服務器上,建立文件tftptest.txt以供tftp下載

[root@ftpserver ~]# echo "test tftp">/var/lib/tftpboot/tftptest.txt
[root@ftpserver ~]# ll /var/lib/tftpboot/                          
total 4
-rw-r--r--. 1 root root 10 Jan 14 23:05 tftptest.txt
[root@ftpserver ~]#

(2)fttp客戶端安裝

[root@ftp ~]# rpm -q tftp
package tftp is not installed
[root@ftp ~]# yum install tftp
...省略中間內容
Installed:
  tftp.x86_64 0:5.2-22.el7                                                 
Complete!
[root@ftp ~]#
3.2.2 使用TFTP

在tftp客戶端鏈接到tftpserver並下載文件

[root@ftp ~]# tftp 192.168.78.101
tftp> get tftptest.txt
tftp> quit
[root@ftp ~]#  ll tftptest.txt 
-rw-r--r--. 1 root root 10 Jan 14 23:09 tftptest.txt
[root@ftp ~]#  cat tftptest.txt
test tftp
[root@ftp ~]#

能夠看到已經成功把文件下載到本地了。

3.2.3 TFTP相關的命令

列舉幾個tftp相關的命令和參數

命令 做用
? 幫助信息
put 上傳文件
get 下載文件
verbose 顯示詳細的處理信息
status 顯示當前的狀態信息
binary 使用二進制進行傳輸
ascii 使用 ASCII 碼進行傳輸
timeout 設置重傳的超時時間
quit 退出

固然TFTP還有不少其餘用戶,之後有機會在深刻討論。

下一篇文章將講解Linux下文件共享的方法。

相關文章
相關標籤/搜索