<1>FTP協義簡介
==>FTP是相當古老的傳輸協議之一,他最主要的功能是在服務器與客戶端之間進行檔案的傳輸,這個古老的協義使用的是明碼傳輸方式,且過去有相當多的安全危機歷史,為了更安全的使用FTP協義,下面主要講vsftpd這個軟件。
==>FTP服務器在預設的情況下,依據使用者登入的情況而分為三種不同的身分,分別是(1)實體賬號realuser(2)訪客guest(3)匿名登錄者anonymous這3種。
==>命令記錄與登錄文件記錄/var/log
==>限制用戶活動的目錄,家目錄
==>FTP的運作流程與使用到的端口
FTP的傳輸使用的是TCP封包協議,TCP在建立聯機前會先進行三向交握,FTP服務器使用了兩個聯機,分別是命令信道與數據流通道,這兩個聯機都需要經過三向交握。
(1)建立命令通道的聯機
客戶端會隨機取一個大于1024以上的端口來與FTP服務器的port21達成聯機,這個過程當然需要三次握手了,達成聯機后客戶端便可以透過這個聯機來對FTP服務器下達指令,包括查詢文件名,下載,上傳等等指令都是利用這個通道來下達的。
(2)客戶端通知FTP服務器端使用active并且告知連接的隨機端口號,并等待ftp服務器的聯機。
(3)FTP服務器由命令通道了解客戶端的需求后,會主動的由20這個端口號向客戶端的(2)處建立的端口號聯機,并完成3次握手。
==>在主動聯機的ftp服務器與客戶端之間具有防火墻的聯機問題
(1)用戶與服務器間命令信道的建立,因為NAT會主動的記錄內部送往外部的聯機信息,而由于命令信道的建立是由客戶端向服務器端聯機的,因此這一條聯機可以順利的建立起來。
(2)用戶與服務器間數據信道建立,同樣的客戶端會主動先啟用portBB,并透過命令通道告知FTP服務器,且等待服務器端的主動聯機。
(3)服務器主動連接到NAT等待轉遞至客戶端的聯機問題,但是由于透過NAT的轉換后,FTP服務器只能得知NAT的ip而不是客戶端ip,因此ftp服務器會以port20主動的向nat的portBB發送主動聯機的要求,但是nat并沒有啟動portBB來臨聽ftp服務器的聯機,此為問題所在。
==>如何解決以上問題
(1)使用iptables所提供的ftp偵測模塊
可以使用modprobe這個指令來加載ip_conntrack_ftp及ip_nat_ftp等模塊,這幾個模塊會主動的分析目標是port21的聯機信息,所以可以得到port BB的資料,此時若接受到ftp服務器的主動聯機,就能夠將該封包導向正確的后端主機了。
(2)客戶端選擇被動式聯機
<2>vsftpd
yum install vsftpd -y 安裝軟件
相關的文件:
(1)/etc/vsftpd/vsftpd.conf主配置文件
(2)/etc/pam.d/vsftpd這個是vsftpd使用PAM模塊時的相關配置文件,主要用來作來身份認證之用
(3)/etc/vsftpd/ftpusers與上一個檔案有關系,也就是PAM模塊所指定的那個無法登入的用戶配置文件,這個檔案的設定很簡單,你只要將不想讓他登入FTP的賬號寫入這個檔案即可,一行一個賬號。絕大部分的系統賬號都在這個檔案內,也就是說,系統賬號默認是沒有辦法使用vsftpd的。
(4)/etc/vsftpd/user_list這個檔案是否能夠生效與vsftpd.conf內的兩個參數有關,分別是[userlist_enable, userlist_deny],如果說/etc/vsftpd/ftpusers是PAM模塊的抵擋設定項目,那麼這個/etc/vsftpd/user_list則是vsftpd自定義的抵檔項目,事實上這個檔案與/etc/vsftpd/ftpusers幾乎一模一樣,在預設的情況下,可以將不希望可登入vsftpd的賬號寫入這里,不過這個檔案的功能會依據vsftpd.conf配置文件內的userlist_deny={YES/NO}而不同。
(5)/etc/vsftpd/chroot_list
這個檔案預設是不存在的,所以你必須要手動自行建立。這個檔案的主要功能是可以將某些賬號的使用者chroot在他們的家目錄下,但這個檔案要生效與vsftpd.conf內的chroot_list_enable,chroot_list_file這兩個參數有關。如果你想要將某些實體用戶限制在他們的家目錄下而不許到其它目錄去,可以啟動這個設定項目。
(6)/var/ftp這個是vsftpd的預設匿名者登入的根目。
<3>vsftpd的主配置文件/etc/vsftpd/vsftpd.conf
可以man 5 vsftpd.conf來進行詳細查看。
<4>vsftpd啟動的模式
vsftpd可以使用stand alone或super daemon的方式來啟動,我們CentOS預設是以stand alone來啟動的,那什麽時候應該選擇stand alone或者是super daemon呢?如果你的ftp服務器是提供給整個因特網來進行大量下載的任務,例如各院校的FTP服務器,那建議你使和stand alone的方式,服務的速度上會比較好,如果僅是提供給內部人員使用的FTP服務器,那使用super daemon來管理即可。
(1)如何用stand alone來啟動
/etc/init.d/vsftpd start
netstat -ntulp | grep 21
(2)如何設置用super daemon來啟動
==>改vim /etc/vsftpd/vsftpd.conf中listen=NO
==>接下來修改一下super daemon的配置文件,底下檔案你必須要自行建立,原本是存在的。
vim /etc/xinetd.d/vsftpd
service ftp
{
socket_type = stream
wait = no
user = root
server = /usr/sbin/vsftpd
log_on_success += DURATION USERID
log_on_failure += USERID
nice = 10
disable = no
}
/etc/init.d/xinetd restart
netstat -ntulp | grep 21
<5>CentOS中vsftpd中设置的默认值
vim /etc/vsftpd/vsftpd.conf
anonymous_enable = YES ==>支持匿名者的登入使用FTP功能
local_enable =YES ==>支持本地端的实体用户登入
write_enable =YES ==>允许用户上传数据(包括档案与目录)
local_umask =022 ==>建立新目录(755)与档案(644)的权限
dirmessage_enable =YES ==>若目录下有.message则会显示该档案的内容
xferlog_enable =YES ==>启动登录文件记录,记录于/var/log/xferlog
connect_from_port_20 =YES ==>支持主动式联机功能
xferlog_std_format =YES ==>支持WuFTP的登录档格式
listen =YES ==>使用stand alone方式启动vsftpd
pam_service_name =vsftpd ==>支持PAM模块的管理
userlist_enable =YES ==>支持/etc/vsftpd/user_list档案内的账号登入管控
tcp_wrappers =YES ==>支持TCP Wrappers的防火墙机制
按照以上的设定,vsftpd可以达到如下的功能:
(1)你可以使用anonymous这个匿名账号或其它实体账号(/etc/passwd)登入
(2)anonymous的家目录在/var/ftp,且无上传权限,亦已经被chroot了,可前往任何有权限可进入的目录中
(3)任何于/etc/vsftpd/ftpusers内存在的账号均无法使用vsftpd(PAM)
(4)可利用/etc/hosts.{allow|deny}来作来基础防火墙
(5)当客户端有任何上传/下载信息时,该信息会被纪录到/var/log/xferlog中
(6)主动式联机的端口为port 20
(7)使用格林威治时间(GMT)
启动服务:/etc/init.d/vsftpd restart
chkconfig vsftpd on
<6>針對實體賬號的設定
雖然在CentOS的默認情況當中實體用戶已經可以使用FTP的服務了,不過還是需要一些額外的功能來限制實體用戶,舉例來說,限制用戶無法離開家目錄(chroot),限制下載速率、限制用戶上傳案時的權限(mask)等:
以下例出一些希望達到的功能:
==>希望使用本地時間取代GMT時間
==>用戶登入時顯示一些歡迎訊息的信息
==>系統賬號(UID<500)不可登入主機
==>一般實體用戶可以進行上傳、下載、建立目錄及修改檔案等動作
==>其它主機設定值保留默認值
vim /etc/vsftpd/vsftpd.conf
(1)與匿名者相關的信息,在這個案例中將匿名登錄取消
anonymous_enable=NO
(2)與實體用戶相關的信息,可寫入
local_enable=YES ==>支持本地端的实体用户登入
write_enable=YES ==>允许用户上传数据(包括档案与目录)
local_umask=002 ==>表示創建檔案與目錄的權限
userlist_enable=YES ==>支持/etc/vsftpd/user_list档案内的账号登入管控
userlist_deny=YES
userlist_file=/etc/vsftpd/user_list ==>這個檔案必須存在,預設此檔案存在
(3)與服務器環境有關的設定
use_localtime =YES
dirmessage_enable =YES ==>若目录下有.message则会显示该档案的内容
xferlog_enable =YES ==>启动登录文件记录,记录于/var/log/xferlog
connect_from_port_20 =YES ==>支持主动式联机功能
xferlog_std_format =YES ==>支持WuFTP的登录档格式
listen =YES ==>使用stand alone方式启动vsftpd
pam_service_name =vsftpd ==>支持PAM模块的管理
tcp_wrappers =YES ==>支持TCP Wrappers的防火墙机制
banner_file =/etc/vsftpd/welcome.txt ==>此檔案需手動建立(4)建立歡迎訊息
vim /etc/vsftpd/welcome.txt
(5)建立限制系統賬號登入的檔案
將UID小于500的賬號,寫入以下兩個文件當中,一行一個
/etc/vsftpd/ftpusers
/etc/vsftpd/user_list
(6)重啟服務/etc/init.d/vsftpd restart進行測試
CentOS6.4默认是没有装ftp客户端的,所以在进行测试之前是要先安装ftp客户端的。
ftp localhost
==>此时如果输入实体用户名和密码,则显示cannot change directory:/home/xxxx
为Selinux问题
(7)实体账号的SELinux议题
在预设的情况下,CentOS的FTP是不允许实体账号登入取得目录数据的,这是因为SELinux的问题,按以下方式处理即可。
getsebool -a | grep ftp查看所有与ftp相关的selinx布尔值
设置:setsebool -P ftp_home_dir=1
(8)对实体用户(包括未来新增用户)进行chroot
例:假设我系统里面仅有lsm与hhn两个账号不要被chroot,其它账号和未来新增的账号通通都要被chroot,如何进行设定。
===>修改vsftpd.conf的参数值
vim /etc/vsftpd/vsftpd.conf
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
==>建立不被chroot的使用者账号列表,即使没有任何账号,此档案也是要存在
vim /etc/vsftpd/chroot_list
lsm
hhn
重启服务:/etc/init.d/vsftpd restart
如此一来,除来lsm与hhn之外的其它可用FTP的账号,其它账号通通会被chroot在他们的家目录底下。
(9)限制实体用户的总下载流量(带宽)
假设我要限制所有使用者的总传输带最大可达1MBytes/sec时,可以按如下设定:
vim /etc/vsftpd/vsftpd.conf
增加底下这一个参数即可:
local_max_rate=1000000单位是bytes/second
(10)限制最大同时上线人数与同一IP的FTP联机数
例如我希望最多只有10个人同时使用你的FTP的话,并且每个IP来源最多只能建立一条FTP的联机时,可按如下操作:
max_clients=10
max_per_ip=1
(11)建立严格的可使用FTP的账号列表
在预设的环境当中,是将不许使用的FTP的账号写入/etc/vsftpd/user_list档案,所以没有写入/etc/vsftpd/user_list当中的使用者就能够使用FTP了。如此,未來新增的使用者預設都能夠使用FTP的服務。換個角度來思考,如我只想讓某些人可以使用FTP,即新增的使用者預設是不可使用FTP這個服務的,應如何修改配置文件呢?
vim /etc/vsftpd/vsftpd.conf
userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd/user_list
<7>僅有匿名登錄的相關設定
設定好之后,有以下功能
==>使用本地的時間,而非GMT時間
==>提供歡迎訊息,說明可提供下載的信息
==>僅開放anonymous的登入,且不需要輸入密碼
==>文件傳輸的速限為1Mbytes/second
==>數據連接的過程(非命令通道)只要超過60秒沒有響應,就強制client斷線!
==>只要anonymous超過十分鐘沒有動作,就予以斷線;
==>最大同時上線人數限制為50人,且同一IP來源最大聯機數量為5人
(1)重新建立vsftpd.conf
vim /etc/vsftpd/vsftpd.conf
==>與匿名者相關的信息
anonymous_enable=YES
no_anon_password=YES --->匿名登錄時,系統不會檢驗密碼(通常是email)
anon_max_rate=1000000 --->最大帶寬使用為1MB/s左右
data_connection_timeout=60 --->數據流聯機的timeout為60s
idle_session_timeout=600 --->或匿名者無動作超過10分鐘就斷線
max_clients=50 --->最大聯機與每個ip的可用聯機
max_per_ip=5
==>與實體用戶相關的信息,本案例中將其關閉
local_enable=NO
==>與服務器環境相關的設定
use_localtime=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd
tcp_wrappers=YES
banner_file=/etc/vsftpd/anon_welcome.txt
(2)建立歡迎畫面與下載提示訊息
vim /etc/vsftpd/anon_welcome.txt 這個檔案一下要存在,否則會造成客戶端無法聯機成功
Hi everyone!
Welcome to our ftp service.Thank you!!!
(3)重啟服務,進行測試
(4)让匿名者可上传/下载自己的资料
在上面的设定当中,匿名用户仅可进行下载的动作而已,如果你还想让匿名者可以上传档案或者是建立目录的话,那还需要额外增加一些设定才可:
vim /etc/vsftpd/vsftpd.conf
write_enable=YES
anon_other_write_enable=YES
anon_mkdir_write_enable=YES
anon_upload_enable=YES
再测试发现还是无法上传下载操作,原因是selinux问题,需要设置以下两个selinux的bool值:
setsebool -P allow_ftpd_anon_write=1
setsebool -P allow_ftpd_full_access=1
(5)让匿名者仅具有上传权限,不可下载匿名者上传的东西
一般来说,用户上传的数据在管理员尚未查阅过是否合乎版权等相关事宜前,是不应该让其他人下载的,然而前一小节的设定当中,用户上传的资料是可以被其它人所浏览与下载的,如此一来实在是很危险,所以如果需设定/var/ftp/uploads内透过匿名者上传的数据中,仅能上传不能被下载时,那么被上传的数据的权限就得要修改一下才行。
vim /etc/vsftpd/vsftpd.conf
先拿掉anon_other_write_enable=YES
改为以下:
write_enable=YES
anon_mkdir_write_enable=YES
anon_upload_enable=YES
chown_uploads=YES
chown_username=daemon
重启服务
(6)被动式联机端口的限制
FTP的联机分为主动式与被动式,主动式联机比较好处理,因为都是透过服务器的port 20对外主动联机,所以防火墙的处理比较简单。被动式联机就比较麻烦,因为预设FTP服务器会随机取几个没有在使用当中的端口来建立被动式联机,那防火墙的设定就比较麻烦。我们可以透过指定几个固定范围内的端口来作为FTP的被动式数据连接之用即可,这样我们就能够预先知道FTP数据链路的端口。举例来说,我们假设被动式连接的端口为65400到65410这几个端口时,可以这样设定。
vim /etc/vsftpd/vsftpd.conf
pasv_min_port=65400
pasv_max_port=65410
<8>防火墙的设定
FTP使用两个端口,加上常有随机启用的数据流端口,以及被动式联机的服务器端口,所以需有以下3步进行操作:
(1)加入iptables的ip_nat_ftp,ip_conntrack_ftp两个模式
加入模块,虽然iptables.rule已加入模块,不过系统档案还是修改一下好
vim /etc/sysconfig/iptables-config
IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"
加入模块即可,两个模块中间有空格键隔开,然后重新启动iptables服务。
(2)开放port21给因特网使用
(3)开放前一小节提到的port65400--65410端口给Internet联机用。
修改iptables.rule的脚本如下:
vim /usr/local/virus/iptables/iptables.rule
iptables -A INPUT -p TCP -i $EXTIF --dport 21 --sport 1024:65534 -j ACCEPT
iptables -A INPUT -p TCP -i $EXTIF --dport 65400:65410 --sport 1024:65534 -j ACCEPT