前面的系列文章基本講完了linux管理相關的基礎知識,從本篇開始講解centos7中服務程式的部署和配置,以便為外部提供各種服務。 日常工作和娛樂中,我們所需的各種資源都離不開網路以及各種服務,我們通過網路獲取部署在其他伺服器上的各種服務資源,這些服務包括文件服務、郵件服務、媒體服務等等。 一般情況 ...
前面的系列文章基本講完了linux管理相關的基礎知識,從本篇開始講解centos7中服務程式的部署和配置,以便為外部提供各種服務。
日常工作和娛樂中,我們所需的各種資源都離不開網路以及各種服務,我們通過網路獲取部署在其他伺服器上的各種服務資源,這些服務包括文件服務、郵件服務、媒體服務等等。
一般情況下,我們使用電腦上網的一個重要目的就是為了獲取資料,而文件傳輸則是獲取資料的方式。因此,我們首先來瞭解下linux中文件傳輸相關的知識。
一、文件傳輸協議FTP
1.1 FTP產生背景
“無規矩不成方圓”,這說明瞭規則的重要性。同樣,當今的互聯網由成千上萬台機器組成,這些機器包括個人電腦、工作站、伺服器、巨型機等各種形形色色的設備,並且這些設備中使用的操作系統還不一樣,有的可能是用的windows,而有的則是Linux或其他系統。
要在這麼紛繁複雜的設備之間傳輸文件,那就必須要有一定的規則,大家都按規則辦事,傳輸的文件才能相互識別,達到正確傳遞信息的目的。在這種背景下,為瞭解決文件傳輸的問題,文件傳輸協議應運而生。
1.2 FTP相關概念
文件傳輸協議(File Transfer Protocol,FTP),是一種在互聯網中進行文件傳輸的協議,基於客戶端/伺服器模式,預設使用 20、21 號埠,其中20埠是數據埠用於進行數據傳輸,21埠為命令埠,用於接收客戶端發出的相關FTP命令和參數。
本系列文章第三篇提到的所有工具都可以實現在Windows中遠程到Linux主機並上傳下載文件,並且在Linux主機之間也可以通過scp命令上傳文件,那為什麼還需要FTP呢?個人認為應該是因為FTP一般搭建與內網之中,有具有容易搭建、方便管理的特點,並且一些FTP客戶端工具還具有文件多點下載以及斷點續傳等功能,這些是scp做不到的。
FTP是C/S架構,也就是基於客戶端/伺服器的模式,FTP伺服器是按照FTP協議在互聯網上提供文件存儲和訪問服務的主機,FTP客戶端則是向伺服器發送連接請求,以建立數據傳輸鏈路的主機。
FTP協議的傳輸拓撲結構如下:
FTP協議工作模式有兩種:主動模式和被動模式,其中被動模式是預設的工作模式。
主動模式:FTP 伺服器主動向客戶端發起連接請求。
被動模式:FTP 伺服器等待客戶端發起連接請求。
由於FTP一般部署在企業內網,如果開啟並配置了防火牆,有時候需要將FTP的工作模式設置為主動模式,才可以傳輸數據。
二、Linux下基於FTP協議工具
2.1 vsftpd服務安裝
vsftpd(very secure ftp daemon)非常安全的FTP守護進程,是一款運行在Linux系統上的免費開源的FTP服務端程式。其主要特點是:安全性高、傳輸速度快、支持虛擬用戶驗證。
預設情況Centos7中是沒有安裝vsftpd的,因此需要手動通過yum倉庫安裝,根據前文的講解可以用光碟資源自帶的yum源,也可以直接配置外網源。本例採用預設的外網yum源進行安裝。
[root@origin ~]# rpm -q vsftpd
package vsftpd is not installed
[root@origin ~]# 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 ~]# rpm -q vsftpd
vsftpd-3.0.2-25.el7.x86_64
[root@origin ~]#
通過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命令即可。
三、簡單文件傳輸協議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下文件共用的方法。