每天一個linux命令(25):ftp命令

Linux ftp命令設置文件系統相關功能。

FTP是ARPANet的標準文件傳輸協議,該網絡就是現今Internet的前身。

語法

ftp [-dignv][主機名稱或IP地址]

參數

  • -d 詳細顯示指令執行過程,便於排錯或分析程序執行的情形。
  • -i 關閉互動模式,不詢問任何問題。
  • -g 關閉本地主機文件名稱支持特殊字符的擴充特性。
  • -n 不使用自動登陸。
  • -v 顯示指令執行過程。

實例

例如使用ftp命令匿名登錄ftp.kernel.org服務器,該服務是Linux 內核的官方服務器,可以使用如下命令:

ftp ftp.kernel.org #發起鏈接請求 

1 文件傳輸協議

一般來講,人們將計算機聯網的首要目的就是獲取資料,而文件傳輸是一種非常重要的獲取資料的方式。今天的互聯網是由幾千萬臺個人計算機、工作站、服務器、小型機、大型機、巨型機等具有不同型號、不同架構的物理設備共同組成的,而且即便是個人計算機,也可能會裝有Windows、Linux、UNIX、Mac等不同的操作系統。爲了能夠在如此複雜多樣的設備之間解決問題解決文件傳輸問題,文件傳輸協議(FTP)應運而生。

FTP是一種在互聯網中進行文件傳輸的協議,基於客戶端/服務器模式,默認使用20、21號端口,其中端口20(數據端口)用於進行數據傳輸,端口21(命令端口)用於接受客戶端發出的相關FTP命令與參數。FTP服務器普遍部署於內網中,具有容易搭建、方便管理的特點。而且有些FTP客戶端工具還可以支持文件的多點下載以及斷點續傳技術,因此FTP服務得到了廣大用戶的青睞。FTP協議的傳輸拓撲如圖11-1所示。

FTP服務器是按照FTP協議在互聯網上提供文件存儲和訪問服務的主機,FTP客戶端則是向服務器發送連接請求,以建立數據傳輸鏈路的主機。FTP協議有下面兩種工作模式。

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

被動模式:FTP服務器等待客戶端發起連接請求(FTP的默認工作模式)。

(防火牆一般是用於過濾從外網進入內網的流量,因此有些時候需要將FTP的工作模式設置爲主動模式,纔可以傳輸數據。本文中使用的是被動模式)

2 Vsftpd服務程序

vsftpd作爲更加安全的文件傳輸的服務程序,允許用戶以三種認證模式登錄到FTP服務器上。

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

本地用戶模式:是通過Linux系統本地的賬戶密碼信息進行認證的模式,相較於匿名開放模式更安全,而且配置起來也很簡單。但是如果被黑客破解了賬戶的信息,就可以暢通無阻地登錄FTP服務器,從而完全控制整臺服務器。

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

ftp是Linux系統中以命令行界面的方式來管理FTP傳輸服務的客戶端工具。我們首先手動安裝這個ftp客戶端工具,以便在後續實驗中查看結果。

 

FTP安裝 及服務開啓、重啓、關閉

首先檢查一下你的遠程服務器是否已經安裝了FTP服務。

#rpm -qa | grep vsftpd

 

如果啥都沒顯示,恭喜你,沒有安裝ftp服務,你可以安心安裝。

運行下面的命令就可以完成vsftpd的安裝

#yum -y install vsftpd

安裝提示:

複製代碼

[root@linuxprobe ~]# yum install vsftpd
Loaded plugins: langpacks, product-id, subscription-manager
………………省略部分輸出信息………………
================================================================================
 Package Arch Version Repository Size
================================================================================
Installing:
 vsftpd x86_64 3.0.2-9.el7 rhel 166 k
Transaction Summary
================================================================================
Install 1 Package
Total download size: 166 k
Installed size: 343 k
Is this ok [y/d/N]: y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
 Installing : vsftpd-3.0.2-9.el7.x86_64 1/1 
 Verifying : vsftpd-3.0.2-9.el7.x86_64 1/1 
Installed:
 vsftpd.x86_64 0:3.0.2-9.el7 
Complete!

複製代碼

安裝完成再次利用上面的rpm命令檢查一下是否完成安裝,如果完成安裝,那就可以繼續。

vsftpd服務程序的主配置文件(/etc/vsftpd/vsftpd.conf)內容總長度達到123行,但其中大多數參數在開頭都添加了井號(#),從而成爲註釋信息。

 vsftpd服務程序常用的參數以及作用如下

複製代碼

參數                                作用
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爲不限制

複製代碼

開啓vsftpd服務

#service vsftpd start

#在centos 中使用 systemctl start vsftpd(我覺得上面的也可以)

檢查vsftpd服務

#service vsftpd status

注意:關於防火牆的問題

CentOS7.0版本的linux系統的防火牆是firewalld,其他版本的可能是iptables(沒有去確認)。

我這裏裝的時候把防火牆給永久關閉了。

firewalld防火牆關閉代碼

關閉防火牆

 systemctl stop firewalld.service

永久禁止防火牆

systemctl disable firewalld.service

檢查防火牆狀態

systemctl status firewalld.service

提示:Active: inactive (dead)就表示關閉了。

iptables防火牆關閉代碼

查詢防火牆狀態    :    [root@localhost ~]# service   iptables status
停止防火牆   :            [root@localhost ~]# service   iptables stop
啓動防火牆   :            [root@localhost ~]# service   iptables start
重啓防火牆   :            [root@localhost ~]# service   iptables restart
永久關閉防火牆    :    [root@localhost ~]# chkconfig   iptables off
永久關閉後啓用    :    [root@localhost ~]# chkconfig   iptables on
 

特別注意:不要卸載iptables防火牆,否則你會有大麻煩

 

如果因工作需求,無法關閉iptables防火牆,需要在iptables防火牆規則裏添加FTP端口號:

(iptables防火牆)添加下面的代碼到/etc/sysconfig/iptables裏去。

(firewalld)添加下面的代碼到/etc/sysconfig/firewalld裏去。

-A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT

重啓防火牆服務

#systemctl restart iptables.service

 

3.1 匿名訪問模式

前文提到,在vsftpd服務程序中,匿名開放模式是最不安全的一種認證模式。任何人都可以無需密碼驗證而直接登錄到FTP服務器。這種模式一般用來訪問不重要的公開文件(在生產環境中儘量不要存放重要文件)。當然,如果採用第8章中介紹的防火牆管理工具(如Tcp_wrappers服務程序)將vsftpd服務程序允許訪問的主機範圍設置爲企業內網,也可以提供基本的安全性。

vsftpd服務程序默認開啓了匿名開放模式,我們需要做的就是開放匿名用戶的上傳、下載文件的權限,以及讓匿名用戶創建、刪除、更名文件的權限。需要注意的是,針對匿名用戶放開這些權限會帶來潛在危險,我們只是爲了在Linux系統中練習配置vsftpd服務程序而放開了這些權限,不建議在生產環境中如此行事。表11-2羅列了可以向匿名用戶開放的權限參數以及作用。

可以向匿名用戶開放的權限參數以及作用

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

快捷方法:直接向vsftpd服務程序的主配置文件(/etc/vsftpd/vsftpd.conf)中添加下面的配置參數,原本的參數都刪了。

複製代碼

[root@linuxprobe ~]# vim /etc/vsftpd/vsftpd.conf
1 anonymous_enable=YES
2 anon_umask=022
3 anon_upload_enable=YES
4 anon_mkdir_write_enable=YES
5 anon_other_write_enable=YES
6 local_enable=YES
7 write_enable=YES
8 local_umask=022
9 dirmessage_enable=YES
10 xferlog_enable=YES
11 connect_from_port_20=YES
12 xferlog_std_format=YES
13 listen=NO
14 listen_ipv6=YES
15 pam_service_name=vsftpd
16 userlist_enable=YES
17 tcp_wrappers=YES

複製代碼

然後重啓FTP服務。

[root@linuxprobe ~]# systemctl restart vsftpd
[root@linuxprobe ~]# systemctl enable vsftpd
 ln -s '/usr/lib/systemd/system/vsftpd.service' '/etc/systemd/system/multi-user.target.wants/vsftpd.service

測試:現在就可以在客戶端執行ftp命令連接到遠程的FTP服務器了。在vsftpd服務程序的匿名開放認證模式下,其賬戶統一爲anonymous,密碼爲空。而且在連接到FTP服務器後,默認訪問的是/var/ftp/pub目錄。我們可以切換到該目錄下的pub目錄中,然後嘗試創建一個新的目錄文件,以檢驗是否擁有寫入權限:

複製代碼

[root@linuxprobe ~]# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.2)
Name (192.168.10.10: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> mkdir files
550 Permission denied.

複製代碼

系統顯示拒絕創建目錄,查看該目錄的權限得知,只有root管理員纔有寫入權限。怪不得系統會拒絕操作呢!進入到/var/ftp/pub目錄下,右鍵--屬性--權限,將其他類的訪問權限改爲“創建和刪除”,即可通過FTP在該目錄下創建文件夾、上傳、下載,更改文件名等操作。

 

如果還不行,系統提示“創建目錄的操作失敗”(Create directory operation failed),那就是SELinux服務在“搗亂”了吧。

下面使用getsebool命令查看與FTP相關的SELinux域策略都有哪些:

複製代碼

[root@linuxprobe ~]# 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

複製代碼

我們可以根據經驗(需要長期培養,別無它法)和策略的名稱判斷出是ftpd_full_access--> off策略規則導致了操作失敗。接下來修改該策略規則,並且在設置時使用-P參數讓修改過的策略永久生效,確保在服務器重啓後依然能夠順利寫入文件。

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

 

或:關閉SELinux

# vi /etc/selinux/config

將 SELINUX=XXX -->XXX 代表級別

改爲

SELINUX=disabled

然後重啓系統,或者執行命令:setenforce 0。

現在便可以順利執行文件創建、修改及刪除等操作了。

複製代碼

[root@linuxprobe ~]# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.2)
Name (192.168.10.10: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> mkdir files
257 "/pub/files" created
ftp> rename files database
350 Ready for RNTO.
250 Rename successful.
ftp> rmdir database
250 Remove directory operation successful.
ftp> bye
221 Goodbye.

複製代碼

 

3..2 本地用戶模式

相較於匿名開放模式,本地用戶模式要更安全,而且配置起來也很簡單。如果大家之前用的是匿名開放模式,現在就可以將它關了,然後開啓本地用戶模式。針對本地用戶模式的權限參數以及作用如表11-3所示。

表11-3                                   本地用戶模式使用的權限參數以及作用

複製代碼

參數                        作用
anonymous_enable=NO    禁止匿名訪問模式
local_enable=YES    允許本地用戶模式
write_enable=YES    設置可寫權限
local_umask=022    本地用戶模式創建文件的umask值
userlist_deny=YES    啓用“禁止用戶名單”,名單文件爲ftpusers和user_list
userlist_enable=YES    開啓用戶作用名單文件功能

複製代碼

快捷方法:直接向vsftpd服務程序的主配置文件(/etc/vsftpd/vsftpd.conf)中添加下面的配置參數,原本的參數都刪了。

複製代碼

[root@linuxprobe ~]# vim /etc/vsftpd/vsftpd.conf
1 anonymous_enable=NO
2 local_enable=YES
3 write_enable=YES
4 local_umask=022
5 dirmessage_enable=YES
6 xferlog_enable=YES
7 connect_from_port_20=YES
8 xferlog_std_format=YES
9 listen=NO
10 listen_ipv6=YES
11 pam_service_name=vsftpd
12 userlist_enable=YES
13 tcp_wrappers=YES

複製代碼

在vsftpd服務程序的主配置文件中正確填寫參數,然後保存並退出。還需要重啓vsftpd服務程序,讓新的配置參數生效。在執行完上一個實驗後還原了虛擬機的讀者,還需要將配置好的服務添加到開機啓動項中,以便在系統重啓自後依然可以正常使用vsftpd服務。

[root@linuxprobe ~]# systemctl restart vsftpd
[root@linuxprobe ~]# systemctl enable vsftpd
 ln -s '/usr/lib/systemd/system/vsftpd.service' '/etc/systemd/system/multi-user.target.wants/vsftpd.service

按理來講,現在已經完全可以本地用戶的身份登錄FTP服務器了。但是在使用root管理員登錄後,系統提示如下的錯誤信息:

複製代碼

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

複製代碼

可見,在我們輸入root管理員的密碼之前,就已經被系統拒絕訪問了。這是因爲vsftpd服務程序所在的目錄中默認存放着兩個名爲“用戶名單”的文件(ftpusers和user_list)。不知道大家是否已看過一部日本電影“死亡筆記”(劉遄老師在上學期間的最愛),裏面就提到有一個黑色封皮的小本子,只要將別人的名字寫進去,這人就會掛掉。vsftpd服務程序目錄中的這兩個文件也有類似的功能—只要裏面寫有某位用戶的名字,就不再允許這位用戶登錄到FTP服務器上。

複製代碼

[root@linuxprobe ~]# cat /etc/vsftpd/user_list 
1 # vsftpd userlist
2 # If userlist_deny=NO, only allow users in this file
3 # If userlist_deny=YES (default), never allow users in this file, and
4 # do not even prompt for a password.
5 # Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers
6 # for users that are denied.
7 root
8 bin
9 daemon
10 adm
11 lp
12 sync
13 shutdown
14 halt
15 mail
16 news
17 uucp
18 operator
19 games
20 nobody

複製代碼

複製代碼

[root@linuxprobe ~]# cat /etc/vsftpd/ftpusers 
# Users that are not allowed to login via ftp
1 root
2 bin
3 daemon
4 adm
5 lp
6 sync
7 shutdown
8 halt
9 mail
10 news
11 uucp
12 operator
13 games
14 nobody

複製代碼

果然如此!vsftpd服務程序爲了保證服務器的安全性而默認禁止了root管理員和大多數系統用戶的登錄行爲,這樣可以有效地避免黑客通過FTP服務對root管理員密碼進行暴力破解。如果您確認在生產環境中使用root管理員不會對系統安全產生影響,只需按照上面的提示刪除掉root用戶名即可。

我們也可以選擇ftpusers和user_list文件中沒有的一個普通用戶嘗試登錄FTP服務器:

複製代碼

[root@linuxprobe ~]# ftp 192.168.10.10 
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.2)
Name (192.168.10.10:root): linuxprobe (普通用戶)
331 Please specify the password.
Password:此處輸入該用戶的密碼
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir files
550 Create directory operation failed.

複製代碼

  • 在採用本地用戶模式登錄FTP服務器後,默認訪問的是該用戶的家目錄,也就是說,訪問的是/home/linuxprobe目錄(系統創建的用戶,在home文件夾下都有對應用戶名的文件夾)。而且該目錄的默認所有者、所屬組都是該用戶自己,因此不存在寫入權限不足的情況。如果讀寫權限沒給,手動設定,給讀寫權限。但是當前的操作仍然被拒絕,是因爲我們剛纔將虛擬機系統還原到最初的狀態了。爲此,需要再次開啓SELinux域中對FTP服務的允許策略:
  • 採用非本地用戶模式登錄,需創建FTP組“FTP”用戶,與採用本地用戶模式的區別是:採用非本地用戶模式可以指定FTP文件夾。

  新增ftp用戶 vftpuser

#/usr/sbin/adduser -d /mnt/ftp -g ftp -s /sbin/nologin vftpuser

  新增用戶vftpuser,用戶的主目錄是/mnt/ftp 目錄,用戶組是ftp,不能登錄的賬戶

  設置vftpuser密碼

#passwd vftpuser

  回車後輸入密碼

  修改/mnt/ftp/的目錄權限

#chmod 755 /mnt/ftp/

  重啓vsftp服務

#/sbin/service vsftpd restart

查看SElinux策略內ftp相關權限,並修改。

複製代碼

[root@linuxprobe ~]# 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@linuxprobe ~]# setsebool -P ftpd_full_access=on

複製代碼

或:關閉SELinux

# vi /etc/selinux/config

 

將 SELINUX=XXX -->XXX 代表級別改爲

 

SELINUX=disabled

 

然後重啓系統,或者執行命令:setenforce 0。

 

在實驗課程和生產環境中設置SELinux域策略時,一定記得添加-P參數,否則服務器在重啓後就會按照原有的策略進行控制,從而導致配置過的服務無法使用。

在配置妥當後再使用本地用戶嘗試登錄下FTP服務器,分別執行文件的創建、重命名及刪除等命令。操作均成功!

複製代碼

[root@linuxprobe ~]# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.2)
Name (192.168.10.10:root): linuxprobe
331 Please specify the password.
Password:此處輸入該用戶的密碼
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir files
257 "/home/linuxprobe/files" created
ftp> rename files database
350 Ready for RNTO.
250 Rename successful.
ftp> rmdir database
250 Remove directory operation successful.
ftp> bye
221 Goodbye.

複製代碼

 

3.3 虛擬用戶模式

 

我們最後講解的虛擬用戶模式是這三種模式中最安全的一種認證模式,當然,因爲安全性較之於前面兩種模式有了提升,所以配置流程也會稍微複雜一些。

 

第1步:創建用於進行FTP認證的用戶數據庫文件,其中奇數行爲賬戶名,偶數行爲密碼。例如,我們分別創建出zhangsan和lisi兩個用戶,密碼均爲redhat:

 

 

[root@linuxprobe ~]# cd /etc/vsftpd/
[root@linuxprobe vsftpd]# vim vuser.list
zhangsan
redhat
lisi
redhat

 

但是,明文信息既不安全,也不符合讓vsftpd服務程序直接加載的格式,因此需要使用db_load命令用哈希(hash)算法將原始的明文信息文件轉換成數據庫文件,並且降低數據庫文件的權限(避免其他人看到數據庫文件的內容),然後再把原始的明文信息文件刪除。

[root@linuxprobe vsftpd]# db_load -T -t hash -f vuser.list vuser.db
[root@linuxprobe vsftpd]# file vuser.db
vuser.db: Berkeley DB (Hash, version 9, native byte-order)
[root@linuxprobe vsftpd]# chmod 600 vuser.db
[root@linuxprobe vsftpd]# rm -f vuser.list

第2步創建vsftpd服務程序用於存儲文件的根目錄(/var/ftproot)以及虛擬用戶映射的系統本地用戶(virtual)。FTP服務用於存儲文件的根目錄指的是,當虛擬用戶登錄後所訪問的默認位置。

由於Linux系統中的每一個文件都有所有者、所屬組屬性,例如使用虛擬賬戶“張三”新建了一個文件,但是系統中找不到賬戶“張三”,就會導致這個文件的權限出現錯誤。爲此,需要再創建一個可以映射到虛擬用戶的系統本地用戶。簡單來說,就是讓虛擬用戶默認登錄到與之有映射關係的這個系統本地用戶的家目錄中,虛擬用戶創建的文件的屬性也都歸屬於這個系統本地用戶,從而避免Linux系統無法處理虛擬用戶所創建文件的屬性權限。

爲了方便管理FTP服務器上的數據,可以把這個系統本地用戶的家目錄設置爲/var目錄(該目錄用來存放經常發生改變的數據)。並且爲了安全起見,我們將這個系統本地用戶設置爲不允許登錄FTP服務器,這不會影響虛擬用戶登錄,而且還可以避免黑客通過這個系統本地用戶進行登錄。

[root@linuxprobe ~]# useradd -d /var/ftproot -s /sbin/nologin virtual
[root@linuxprobe ~]# ls -ld /var/ftproot/
drwx------. 3 virtual virtual 74 Jul 14 17:50 /var/ftproot/
[root@linuxprobe ~]# chmod -Rf 755 /var/ftproot/

第3步:建立用於支持虛擬用戶的PAM文件。

PAM(可插拔認證模塊)是一種認證機制,通過一些動態鏈接庫和統一的API把系統提供的服務與認證方式分開,使得系統管理員可以根據需求靈活調整服務程序的不同認證方式。要想把PAM功能和作用完全講透,至少要一個章節的篇幅纔可以(對該主題感興趣的讀者敬請關注本書的進階篇,裏面會詳細講解PAM)。

通俗來講,PAM是一組安全機制的模塊,系統管理員可以用來輕易地調整服務程序的認證方式,而不必對應用程序進行任何修改。PAM採取了分層設計(應用程序層、應用接口層、鑑別模塊層)的思想,其結構如圖11-2所示。

新建一個用於虛擬用戶認證的PAM文件vsftpd.vu,其中PAM文件內的“db=”參數爲使用db_load命令生成的賬戶密碼數據庫文件的路徑,但不用寫數據庫文件的後綴:

[root@linuxprobe ~]# vim /etc/pam.d/vsftpd.vu
auth       required     pam_userdb.so db=/etc/vsftpd/vuser
account    required     pam_userdb.so db=/etc/vsftpd/vuser

第4步:在vsftpd服務程序的主配置文件中通過pam_service_name參數將PAM認證文件的名稱修改爲vsftpd.vu,PAM作爲應用程序層與鑑別模塊層的連接紐帶,可以讓應用程序根據需求靈活地在自身插入所需的鑑別功能模塊。當應用程序需要PAM認證時,則需要在應用程序中定義負責認證的PAM配置文件,實現所需的認證功能。

例如,在vsftpd服務程序的主配置文件中默認就帶有參數pam_service_name=vsftpd,表示登錄FTP服務器時是根據/etc/pam.d/vsftpd文件進行安全認證的。現在我們要做的就是把vsftpd主配置文件中原有的PAM認證文件vsftpd修改爲新建的vsftpd.vu文件即可。該操作中用到的參數以及作用如表11-4所示。

表11-4                            利用PAM文件進行認證時使用的參數以及作用

複製代碼

參數    作用
anonymous_enable=NO    禁止匿名開放模式
local_enable=YES    允許本地用戶模式
guest_enable=YES    開啓虛擬用戶模式
guest_username=virtual    指定虛擬用戶賬戶
pam_service_name=vsftpd.vu    指定PAM文件
allow_writeable_chroot=YES    允許對禁錮的FTP根目錄執行寫入操作,而且不拒絕用戶的登錄請求

複製代碼

複製代碼

[root@linuxprobe ~]# vim /etc/vsftpd/vsftpd.conf
1 anonymous_enable=NO
2 local_enable=YES
3 guest_enable=YES
4 guest_username=virtual
5 allow_writeable_chroot=YES
6 write_enable=YES
7 local_umask=022
8 dirmessage_enable=YES
9 xferlog_enable=YES
10 connect_from_port_20=YES
11 xferlog_std_format=YES
12 listen=NO
13 listen_ipv6=YES
14 pam_service_name=vsftpd.vu
15 userlist_enable=YES
16 tcp_wrappers=YES

複製代碼

第5步:爲虛擬用戶設置不同的權限。雖然賬戶zhangsan和lisi都是用於vsftpd服務程序認證的虛擬賬戶,但是我們依然想對這兩人進行區別對待。比如,允許張三上傳、創建、修改、查看、刪除文件,只允許李四查看文件。這可以通過vsftpd服務程序來實現。只需新建一個目錄,在裏面分別創建兩個以zhangsan和lisi命名的文件,其中在名爲zhangsan的文件中寫入允許的相關權限(使用匿名用戶的參數):

複製代碼

[root@linuxprobe ~]# mkdir /etc/vsftpd/vusers_dir/
[root@linuxprobe ~]# cd /etc/vsftpd/vusers_dir/
[root@linuxprobe vusers_dir]# touch lisi
[root@linuxprobe vusers_dir]# vim zhangsan
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

複製代碼

然後再次修改vsftpd主配置文件,通過添加user_config_dir參數來定義這兩個虛擬用戶不同權限的配置文件所存放的路徑。爲了讓修改後的參數立即生效,需要重啓vsftpd服務程序並將該服務添加到開機啓動項中:

複製代碼

[root@linuxprobe ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
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
user_config_dir=/etc/vsftpd/vusers_dir
[root@linuxprobe ~]# systemctl restart vsftpd
[root@linuxprobe ~]# systemctl enable vsftpd
 ln -s '/usr/lib/systemd/system/vsftpd.service' '/etc/systemd/system/multi-user.target.wants/vsftpd.service

複製代碼

第6步:設置SELinux域允許策略,然後使用虛擬用戶模式登錄FTP服務器。相信大家可以猜到,SELinux會繼續來搗亂。所以,先按照前面實驗中的步驟開啓SELinux域的允許策略,以免再次出現操作失敗的情況:

複製代碼

[root@linuxprobe ~]# 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@linuxprobe ~]# setsebool -P ftpd_full_access=on

複製代碼

此時,不但可以使用虛擬用戶模式成功登錄到FTP服務器,還可以分別使用賬戶zhangsan和lisi來檢驗他們的權限。

複製代碼

[root@linuxprobe ~]# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.2)
Name (192.168.10.10:root): lisi
331 Please specify the password.
Password:此處輸入虛擬用戶的密碼
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir files
550 Permission denied.
ftp> exit
221 Goodbye.
[root@linuxprobe ~]# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.2)
Name (192.168.10.10:root): zhangsan
331 Please specify the password.
Password:此處輸入虛擬用戶的密碼
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir files
257 "/files" created
ftp> rename files database
350 Ready for RNTO.
250 Rename successful.
ftp> rmdir database
250 Remove directory operation successful.
ftp> bye
221 Goodbye.

複製代碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章