歡迎您光臨本站 註冊首頁

搭建企業常用的 FTP 伺服器

←手機掃碼閱讀     火星人 @ 2014-03-04 , reply:0

搭建企業常用的 FTP 伺服器

搭建企業常用的 FTP 伺服器

客戶需求:
伺服器(FTP 伺服器)上有很多普通用戶,每個用戶都有自己的家目錄。允許所有的用戶通過
用戶名和密碼登錄到 FTP 伺服器上。但是有一個用戶特殊,這個用戶的密碼是公開的,很多人
都知道,所以要求此用戶登錄伺服器進入的並不是自己的家目錄,而是一個指定的目錄,同時
在這個用戶看來,此目錄就是根目錄了。其他的所有用戶都默認進入到自己的家目錄,而且可
以出自己的家目錄。特殊的用戶可以上傳文件,可以下載文件,但是不能刪除和覆蓋已經上傳
的文件。
上面的需求是企業中真實存在的,需要實現的幾個主要功能如下:
1. 除了特殊用戶之外,其他的用戶不需要做特殊的設置,因為默認情況下普通用戶進入的
就是自己的家目錄,並且可以出自己的家目錄。
2. 特殊用戶的登錄的默認目錄需要重新指定。
3. 特殊用戶要 chroot,但是其他的普通用戶不能 chroot。
4. 特殊用戶不能刪除和重寫已經上傳的文件。
我們先分析一下這幾個功能都要如何實現:
第一個功能,不需要做格外的設定。
第二個功能,需要將特殊用戶和其他普通用戶區別來,也就是說我們要對特殊用戶做特殊的設
定,vsftpd.conf 配置文件中的 user_config_dir 參數可以對用戶做單獨的設置。那麼在特殊用戶
自己的配置文件里我們要指定其默認的登錄目錄,用參數 local_root 可以實現。
第三個功能,只有一個用戶要做 chroot,其他的普通用戶不需要,那麼就可以在 vsftpd.conf 配
置文件中用下面三個參數共同實現:
chroot_local_user=NO
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
其中我們先討論后兩個參數,chroot_llist_enable 為 YES 的話,chroot_list_file 所指定的文件才
生效。chroot_list_file 文件里存放的是用戶名,每一行一個用戶名。當 chroot_local_user 為
YES 的話,那麼除了 chroot_list_file 指定的文件里的用戶不需要做 choot 操作之外,其他的所
有普通用戶都需要做 chroot 操作;當 chroot_local_user 為 NO 的話,那麼只有 chroot_list_file
指定的文件里的用戶做 chroot 操作,其他的所有普通用戶都不需要 choot。
顯然,這個實驗里我們要用到第二種情況,因為這樣只要在 chroot_list_file 里寫入特殊用戶的
名字即可。否則要將所有用戶都寫入,而且每當添加新的用戶時都要再寫入此文件中。
第四個功能,既然用戶可以上傳文件,那麼就應該可以對文件進行寫操作,換言之,就可以對
文件進行刪除操作。所以通過普通的 Linux 文件許可權設定是實現不了的。但是 vsftpd.conf 文件
提供了一個很牛的參數——cmds_allowed。此參數可以指定用戶都可以執行哪些操作,這裡指
的操作是用戶通過 vsftpd 登錄到伺服器后可以執行哪些 vsftpd 的命令。我們可以將除了 DELE
之外的所有命令都寫到這個參數的後面,這樣用戶就僅僅不能進行刪除操作了。因為只要限制
那個特殊用戶而已,所以這個參數要添加到特殊用戶自己的配置文件里。
現在我們就實際配置一下。
FTP 伺服器的 IP:192.168.56.102
Client 端的 IP:192.168.56.101
伺服器上的有兩個用戶:commonuser 和 publicuser,其中publicuser 是上面提到的特殊用戶。
在主配置文件 vsftpd.conf 中添加下面的內容:
hroot_local_user=NO
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
user_config_dir=/etc/vsftpd/vsftpd_user_conf
創建 /etc/vsftpd/chroot_list 文件,其內容就是特殊用戶的名字,
# cat /etc/vsftpd/chroot_list
pubicuser
創建 /etc/vsftpd/vsftpd_user_conf 目錄,並在其下面創建特殊用戶同名的文件,這裡是
publicuser 文件。其內容有兩個,一個是改變其登錄的默認目錄,另一個是不讓他執行 DELE
操作,
# cat /etc/vsftpd/vsftpd_user_conf/publicuser
local_root=/var/ftp/publicuser
cmds_allowed=ABOR,ACCT,ALLO,APPE,CDUP,CWD,EPRT,EPSV,FEAT,HELP,LIST,MDTM,M
KD,MODE,NLST,NOOP,OPTS,PASS,PASV,PORT,PWD,QUIT,REIN,REST,RETR,RMD,RNFR,RNT
O,SITE,SIZE,SMNT,STAT,STOR,STOU,STRU,SYST,TYPE,USER,XCUP,XCWD,XMKD,XPWD,X
RMD
注意:這裡面沒有 DELE。
創建 /var/ftp/publicuser 目錄,修改其許可權為 777。
用普通的用戶 commonuser 測試,
# ftp 192.168.56.102
Connected to 192.168.56.102.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (192.168.56.102:root): commonuser
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/home/commonuser"
ftp> put test_file
local: test_file remote: test_file
227 Entering Passive Mode (192,168,56,102,40,249)
150 Ok to send data.
226 File receive OK.
ftp> ls
227 Entering Passive Mode (192,168,56,102,28,183)
150 Here comes the directory listing.
-rw-r--r-- 1 501 501 0 Mar 19 01:53 test_file
226 Directory send OK.
ftp> delete test_file
250 Delete operation successful.
ftp> quit
221 Goodbye.
用特殊用戶 publicuser 測試,
# ftp 192.168.56.102
Connected to 192.168.56.102.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (192.168.56.102:root): publicuser
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"
ftp> put test_file
local: test_file remote: test_file
227 Entering Passive Mode (192,168,56,102,233,67)
150 Ok to send data.
226 File receive OK.
ftp> delete test_file
550 Permission denied.
ftp> quit
221 Goodbye.
到此為止,除了禁止覆蓋之外,其他的功能都已經實現了。FTP 的覆蓋機制並不是先刪除文件
在創建文件,很可能是直接清空文件內容,再寫入新內容。這樣的話,如果用戶可以執行 PUT
操作,那麼就可以覆蓋文件。所以必須通過其他的辦法去實現。
我想到的是給這個特殊用戶的登錄目錄添加額外的屬性,通過 chattr 命令。
也就是,我寫一個 cron 認為,不停的對 /var/ftp/publicuser 目錄中的文件執行 chattr +i 操作,
其中「i」屬性是說帶有「i」屬性的文件是不能被改變的。
做個測試,
# chattr +i /var/ftp/publicuser/test_file
# lsattr /var/ftp/publicuser/test_file
----i-------- /var/ftp/publicuser/test_file
然後在嘗試覆蓋,
# ftp 192.168.56.102
Connected to 192.168.56.102.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (192.168.56.102:root): publicuser
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,56,102,40,99)
150 Here comes the directory listing.
-rw-r--r-- 1 500 500 0 Mar 19 01:47 test_file
226 Directory send OK.
ftp> put test_file
local: test_file remote: test_file
227 Entering Passive Mode (192,168,56,102,134,2)
553 Could not create file.
ftp> quit
221 Goodbye.
這樣就實現了一個企業里常見的 FTP 伺服器。
《解決方案》

不錯不錯。
《解決方案》

vsftpd還是很不錯的。但是我個人喜歡pureftpd
《解決方案》

用好了都不錯。
《解決方案》

你好,請問這兩部解釋的是不是有點問題呀?
《解決方案》

很好謝謝了

[火星人 ] 搭建企業常用的 FTP 伺服器已經有560次圍觀

http://coctec.com/docs/service/show-post-16707.html