前言:
為什麼要虛擬化? 虛擬化有什麼好處?
使用虛擬化主要是方便管理和增加Server的安全性。在未虛擬化的情況下,若使用ftp的user過多,那勢必會造成Server在安全性上的重大隱憂。而在虛擬化後的vsftp可靈活的設定FTP虛擬用戶的權限,降低因user過多造成的安全性問題。這邊會比較建議,在允許的情況下就使用虛擬化設定會好一些。
環境:
Centos 5.7
vsftpd-2.0.5-24.el5
需求:
建立兩個虛擬帳號共用資料夾faq並且能下載、上傳和刪除的權限,但不可離開家目錄
設定說明:
1. 安裝
1.1 檢查是否已安裝vsftp
[root@localhost ~]# rpm -qa | grep vsftpd
vsftpd-2.0.5-21.el5 |
1.2 若是沒有安裝的話可自行安裝,或升級版本為vsftpd-2.0.5-24.el5
[root@localhost ~]# yum -y install vsftpd*
Dependencies Resolved ============================================================== Package Arch Version Repository Size ============================================================== Updating: vsftpd x86_64 2.0.5-24.el5 base 141 k Transaction Summary ============================================================== Install 0 Package(s) Upgrade 1 Package(s) |
1.3 安裝PAM相關套件
[root@localhost ~]# yum -y install pam* |
1.4 安裝DB4相關套件
[root@localhost ~]# yum -y install db4* |
2. 建立系統帳號
2.1 建立vsftpd的宿主帳號
預設vsftpd的宿主帳號為root,但由於安全性的考量,這邊不使用預設帳號。
因此在這邊建立一個新的宿主帳號為faq,用來做為vsftp的宿主帳號。但由於不給
此帳號登入的必要,所以設定為不可登入的系統帳號。
[root@localhost ~]# useradd faq -s /sbin/nologin |
2.2 建立vsftpd虛擬宿主帳號
由於虛擬帳號並不屬於系統帳號,也就是說虛擬帳號在系統中是不存在的。所謂vsftp
的虛擬宿主帳號,就是一個提供所有虛擬帳號的宿主帳號。也正因為提供ftp所有虛
擬帳號,所以此宿主本身的權限也會影響到這些虛擬帳號。
[root@localhost ~]# useradd faquser -s /sbin/nologin |
注意: 以上所創建的帳號,可依個人需求自行修改。若不想設定也可直接使用root權限。
3. 編輯vsftpd.conf配置
3.1 在編輯開始前先行備份
[root@localhost ~]# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak |
3.2 編輯vsftpd.conf
提供以下設定檔,以便參考。
[root@localhost ~]# vim /etc/vsftp/vsftpd.conf
# Example config file /etc/vsftpd/vsftpd.conf # # The default compiled in settings are fairly paranoid. This sample file # loosens things up a bit, to make the ftp daemon more usable. # Please see vsftpd.conf.5 for all compiled in defaults. # # READ THIS: This example file is NOT an exhaustive list of vsftpd options. # Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd’s # capabilities. # # Allow anonymous FTP? (Beware – allowed by default if you comment this out). # 設定不允許匿名訪問 anonymous_enable=NO # # Uncomment this to allow local users to log in. # 設定本地用戶可以訪問。 # 注意:主要是為虛擬宿主用戶,如果該項目設定為NO那麼所有虛擬用戶將無法訪問。 local_enable=YES # # Uncomment this to enable any form of FTP write command. # 設定可以進行寫操作。 write_enable=YES # # Default umask for local users is 077. You may wish to change this to 022, # if your users expect that (022 is used by most other ftpd’s) # 設定上傳後文件的權限掩碼。 local_umask=022 # # Uncomment this to allow the anonymous FTP user to upload files. This only # has an effect if the above global write enable is activated. Also, you will # obviously need to create a directory writable by the FTP user. # 禁止匿名用戶上傳 anon_upload_enable=NO # # Uncomment this if you want the anonymous FTP user to be able to create # new directories. # 匿名用戶不可以建目錄 anon_mkdir_write_enable=NO # 匿名用戶不可以寫入 anon_other_write_enable=NO # # Activate directory messages – messages given to remote users when they # go into a certain directory. # 設定開啟目錄標語功能 dirmessage_enable=YES # # The target log file can be vsftpd_log_file or xferlog_file. # This depends on setting xferlog_std_format parameter # 設定開啟LOG記錄 xferlog_enable=YES # # Make sure PORT transfer connections originate from port 20 (ftp-data). # 設定連接PORT為20 connect_from_port_20=YES # # If you want, you can arrange for uploaded anonymous files to be owned by # a different user. Note! Using “root” for uploaded files is not # recommended! # 設定禁止上傳文件更改宿主屬性 chown_uploads=NO #chown_username=whoever # # The name of log file when xferlog_enable=YES and xferlog_std_format=YES # WARNING – changing this filename affects /etc/logrotate.d/vsftpd.log # 設定Vsftpd的服務日誌保存路徑。 # 注意,該文件預設不存在。要手動建立,由於更改了Vsftpd的宿主帳號,為手動建立的faq # 必須修改LOG的寫入權限,否則服務將啟動失敗 xferlog_file=/var/log/vsftpd.log # # Switches between logging into vsftpd_log_file and xferlog_file files. # NO writes to vsftpd_log_file, YES to xferlog_file # 使用標準log格式 xferlog_std_format=YES # # You may change the default value for timing out an idle session. # Server與Client的資料連線已經成功建立(不論主動還是被動連線) # Client在時間內都沒有命令動作,強制離線,預設的時間為600秒 #idle_session_timeout=600 # # You may change the default value for timing out a data connection. # 簡單來說就是單次最大連續傳輸時間,超過時間而無動作的話就會被強制斷線,預設為120秒 #data_connection_timeout=120 # # It is recommended that you define on your system a unique user which the # ftp server can use as a totally isolated and unprivileged user. # 設定Vsftpd服務的宿主帳號為手動建立的Vsftpd用戶。 nopriv_user=faq # # Enable this and the server will recognise asynchronous ABOR requests. Not # recommended for security (the code is non-trivial). Not enabling it, # however, may confuse older FTP clients. # 設定支持異步傳輸功能 async_abor_enable=YES # # By default the server will pretend to allow ASCII mode but in fact ignore # the request. Turn on the below options to have the server actually do ASCII # mangling on files when in ASCII mode. # Beware that on some FTP servers, ASCII support allows a denial of service # attack (DoS) via the command “SIZE /big/file” in ASCII mode. vsftpd # predicted this attack and has always been safe, reporting the size of the # raw file. # ASCII mangling is a horrible feature of the protocol. # 設定支持ASCII模式的上傳和下載功能 ascii_upload_enable=YES ascii_download_enable=YES # # You may fully customise the login banner string: # 設定Vsftpd的登入歡迎辭 ftpd_banner=Welcome the Login faq-book of the FTP SERVER. # # You may specify a file of disallowed anonymous e-mail addresses. Apparently # useful for combatting certain DoS attacks. #deny_email_enable=YES # (default follows) #banned_email_file=/etc/vsftpd/banned_emails # # You may specify an explicit list of local users to chroot() to their home # directory. If chroot_local_user is YES, then this list becomes a list of # users to NOT chroot(). # 禁止用戶登出自己的FTP主目錄 chroot_list_enable=NO # (default follows) #chroot_list_file=/etc/vsftpd/chroot_list # # You may activate the “-R” option to the builtin ls. This is disabled by # default to avoid remote users being able to cause excessive I/O on large # sites. However, some broken FTP clients such as “ncftp” and “mirror” assume # the presence of the “-R” option, so there is a strong case for enabling it. # 禁止用戶登陸FTP後使用”ls -R”的命令。該命令會對Server性能造成負擔。 ls_recurse_enable=NO # # When “listen” directive is enabled, vsftpd runs in standalone mode and # listens on IPv4 sockets. This directive cannot be used in conjunction # with the listen_ipv6 directive. # 若設定為YES表示vsftpd是以stand alone來啟動。若是NO就以super daemon來啟動 # 所謂StandAlone模式就是該服務擁有自己的程序。則SuperDaemon模式,而是由Xinetd來代替 # 同時Vsftp服務的許多功能將無法使用。 listen=YES # vsftp所使用的命令通到port。此port可依各人需求更改。 listen_port=21 # # This directive enables listening on IPv6 sockets. To listen on IPv4 and IPv6 # sockets, you must run two copies of vsftpd whith two configuration files. # Make sure, that one of the listen options is commented !! # 不監聽ipv6 listen_ipv6=NO # 這個是pam模組的名稱,PAM驗證將參考/etc/pam.d/下的vsftpd文件配置 pam_service_name=vsftpd
# userlist_file中的User不得使用FTP userlist_enable=YES
# 設定支持TCP Wrappers tcp_wrappers=YES
# 不可離開家目錄 chroot_local_user=YES
# 設定啟用虛擬用戶功能 guest_enable=YES
# 指定虛擬用戶的宿主用戶 guest_username=faquser
# 設定虛擬用戶的權限和宿主帳號的一樣 virtual_use_local_privs=YES
# 設定虛擬用戶個人Vsftp的配置文件存放路徑。 # 需要注意的地方就是這些配置文件名必須和虛擬用戶名相同。 user_config_dir=/etc/vsftpd/vconf
#指定連接PORT的範圍,才不會因PORT亂跳,不好設定防火牆 pasv_min_port=50000 pasv_max_port=60000 |
3.3 建立vsftp的log檔,並修改Log權限
[root@localhost ~]# touch /var/log/vsftpd.log
[root@localhost ~]# chown faq.faq /var/log/vsftpd.log |
4. 建立虛擬帳號的資料庫
4.1 建立虛擬帳號名單
格式如下
user_id
password
簡單說編輯的方式就是單數行為帳號,雙數行為密碼。
[root@localhost ~]# vi /etc/vsftpd/ftp-userlist
alan 123456 andy 123456 |
4.2 產生虛擬帳號的資料庫
[root@localhost ~]# db_load -T -t hash -f /etc/vsftpd/ftp-userlist /etc/vsftpd/ftp-userlist.db |
注意:以後如果有增加或減少帳號時請記得要在執行一次「db_load -T -t hash –f」要不然設定是不會生效的。
5. 設定PAM驗證檔,並指定讀取虛擬帳號的資料庫
5.1 修改前先自行備份
[root@localhost ~]# cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak |
5.2 修改vsftpd的PAM驗證
以下分為32位元和64位元的修改方式,請依自己安裝系統的位元來做修改
不論是32位元或是64位元,除了新增的兩行外其他的都請註解起來。
32位元:
[root@localhost ~]# vi /etc/pam.d/vsftpd
#%PAM-1.0 #session optional pam_keyinit.so force revoke #auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed #auth required pam_shells.so #auth include system-auth #account include system-auth #session include system-auth #session required pam_loginuid.so
auth required /lib/security/pam_userdb.so db=/etc/vsftpd/ftp-userlist account required /lib/security/pam_userdb.so db=/etc/vsftpd/ftp-userlist |
64位元:
[root@localhost ~]# vi /etc/pam.d/vsftpd
#%PAM-1.0 #session optional pam_keyinit.so force revoke #auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed #auth required pam_shells.so #auth include system-auth #account include system-auth #session include system-auth #session required pam_loginuid.so
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/ftp-userlist account required /lib64/security/pam_userdb.so db=/etc/vsftpd/ftp-userlist |
6. 虛擬帳號的配置
6.1 建立虛擬帳號vsftpd.conf存放的資料夾
[root@localhost ~]# mkdir /etc/vsftpd/vconf/ |
6.2 建立虛擬帳號模版存放的資料夾
建立此資料夾是用來存放,之後要設定虛擬帳號的vsftpd.conf,以方便日後新增。
[root@localhost ~]# mkdir /etc/vsftpd/vconf/stencil |
6.3 建立模版 (以下為範例 請依個人需求修改範例)
6.3.1 一般user權限,能下載、上傳和刪除
[root@localhost ~]# vi /etc/vsftpd/vconf/stencil/user
# 一般user權限,能下載、上傳和刪除 # 檔案存放路徑(若設定的路徑內,沒有指定的資料夾時,請自行建立) local_root=/home/faq
# 設定不允許匿名用戶訪問。 anonymous_enable=NO
# 設定Vsftpd服務的宿主帳號為手動建立的Vsftpd用戶。 nopriv_user=faq
# 指定虛擬用戶的宿主用戶 guest_username=faquser
#設定是否允許寫操作 write_enable=YES
#設定是否允許下載 download_enable=YES
#設定上傳文件權限掩碼 local_umask=022
#當使用者進入某個目錄時,會顯示該目錄需要注意的內容 dirmessage_enable=YES
#當設定為 YES 時,使用者上傳與下載檔案都會被紀錄起來 xferlog_enable=YES
#這就是 ftp-data 的埠號 connect_from_port_20=YES
#若設定為 YES 表示 vsftpd 是以 standalone 的方式來啟動的 listen=YES
#這個是 pam 模組的名稱,我們放置在 /etc/pam.d/vsftpd pam_service_name=vsftpd
#是否藉助 vsftpd 的抵擋機制來處理某些不受歡迎的帳號 userlist_enable=YES
#支援 TCP Wrappers tcp_wrappers=YES
#限制空閒連接時間 idle_session_timeout=600
#設定單次連續傳輸最大時間 data_connection_timeout=120
#設定同時客戶端連線數 max_clients=5
#限制單一客戶端最大連線數 max_per_ip=10
#設定該用戶的最大傳輸速率 單位b/s local_max_rate=600000
#將使用者限制在自己的家目錄之內(chroot) chroot_local_user=YES
#設定匿名是否可讀檔 anon_world_readable_only=NO
#是否讓 anonymous 具有上傳資料的功能,預設是 NO anon_upload_enable=NO
#是否讓 anonymous 具有建立目錄的權限?預設值是 NO anon_mkdir_write_enable=NO
#是否允許 anonymous 具有寫入的權限?預設是 NO anon_other_write_enable=NO |
6.3.2 最大權限 root
[root@localhost ~]# vi /etc/vsftpd/vconf/stencil/root
# 最大權限 root # 檔案存放路徑(若設定的路徑內,沒有指定的資料夾時,請自行建立) local_root=/
# 設定不允許匿名用戶訪問。 anonymous_enable=NO
# 設定Vsftpd服務的宿主帳號為手動建立的Vsftpd用戶。 nopriv_user=root
# 指定虛擬用戶的宿主用戶 guest_username=root
#設定是否允許寫操作 write_enable=YES
#設定是否允許下載 download_enable=YES
#設定上傳文件權限掩碼 local_umask=022
#當使用者進入某個目錄時,會顯示該目錄需要注意的內容 dirmessage_enable=YES
#當設定為 YES 時,使用者上傳與下載檔案都會被紀錄起來 xferlog_enable=YES
#這就是 ftp-data 的埠號 connect_from_port_20=YES
#若設定為 YES 表示 vsftpd 是以 standalone 的方式來啟動的 listen=YES
#這個是 pam 模組的名稱,我們放置在 /etc/pam.d/vsftpd pam_service_name=vsftpd
#是否藉助 vsftpd 的抵擋機制來處理某些不受歡迎的帳號 userlist_enable=YES
#支援 TCP Wrappers tcp_wrappers=YES
#限制空閒連接時間 idle_session_timeout=600
#設定單次連續傳輸最大時間 data_connection_timeout=120
#設定同時客戶端連線數 max_clients=5
#限制單一客戶端最大連線數 max_per_ip=10
#設定該用戶的最大傳輸速率 單位b/s #local_max_rate=600000
#將使用者限制在自己的家目錄之內(chroot) chroot_local_user=NO
#設定匿名是否可讀檔 anon_world_readable_only=NO
#是否讓 anonymous 具有上傳資料的功能,預設是 NO anon_upload_enable=NO
#是否讓 anonymous 具有建立目錄的權限?預設值是 NO anon_mkdir_write_enable=NO
#是否允許 anonymous 具有寫入的權限?預設是 NO anon_other_write_enable=NO |
6.4 設定虛擬帳號且共用目錄
6.4.1 建立共用目錄並修改權限
[root@localhost ~]# mkdir /home/faq
[root@localhost ~]# chown –R faquser.faquser /home/faq |
6.4.2 設定虛擬帳號的vsftpd.conf
[root@localhost ~]# cp /etc/vsftpd/vconf/stencil/user /etc/vsftpd/vconf/alan
[root@localhost ~]# cp /etc/vsftpd/vconf/stencil/user /etc/vsftpd/vconf/andy |
6.5 啟動vsftp服務
[root@localhost ~]# /etc/init.d/vsftpd start |
7. 防火牆設定
先啟用防火牆和關閉SELinux,並加入防火牆規則
請加入以下兩行規則
第一行為允許21port連線
第二行因為在vsftpd.conf有限制port連線,因此在這邊也要將此範圍的port打開
[root@localhost ~]# vim /etc/sysconfig/iptables
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 21 -j ACCEPT -A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 50000:60000 -j ACCEPT |
8. 測試
請用ftp軟體連線看是否能正常登入和使用。若是都能登入和使用的話就表示沒問題了。
以下為一些設定上的補充
1. 或許有人會問說為什麼在 /etc/vsftpd 這邊設定過vsftpd.conf。然後又要在/etc/vsftpd/vconf 這邊也設定一次呢?
答:
因為在/etc/vsftpd這邊所設定的是針對實體帳號faquser此帳號做的設定,而在/etc/vsftpd/vconf這邊所設定的是針對該虛擬帳號做的設定。若是在兩邊都有設定的情況下會以後者/etc/vsftpd/vconf所設定的為主。但相對的如果在後者/etc/vsftpd/vconf沒有設定到的情況下,則會繼承前者的設定。
2. 在共用資料夾的情況下如何新增帳號 ?
答:
[root@localhost ~]# vi /etc/vsftpd/ftp-userlist #加入新帳號的帳密
[root@localhost ~]# db_load -T -t hash -f /etc/vsftpd/ ftp-userlist /etc/vsftpd/ ftp-userlist.db #執行轉換成資料庫 [root@localhost ~]# cp /etc/vsftpd/vconf/stencil/user /etc/vsftpd/vconf/username [root@localhost ~]# /etc/init.d/vsftpd start |
若有需要的話可以覆製完vsftpd.conf後在做權限的修改。
3. 如何修改FTP的密碼
答:
[root@localhost ~]# vi /etc/vsftpd/ftp-userlist #修改密碼
[root@localhost ~]# db_load -T -t hash -f /etc/vsftpd/ ftp-userlist /etc/vsftpd/ ftp-userlist.db #執行轉換成資料庫 [root@localhost ~]# /etc/init.d/vsftpd start |
4. 如何提供每一個虛擬帳號都有自己的家目錄,而不共用
答:
[root@localhost ~]# vi /etc/vsftpd/ftp-userlist #加入新帳號的帳密
[root@localhost ~]# db_load -T -t hash -f /etc/vsftpd/ ftp-userlist /etc/vsftpd/ ftp-userlist.db #執行轉換成資料庫 [root@localhost ~]# cp /etc/vsftpd/vconf/stencil/user /etc/vsftpd/vconf/username [root@localhost ~]# vim /etc/vsftpd/vconf/username # 檔案存放路徑(若設定的路徑內,沒有指定的資料夾時,請自行建立) local_root=/home/username #把這邊修改為要指定到的資料夾路徑
[root@localhost ~]# mkdir /home/username [root@localhost ~]# chown –R faquser.faquser /home/username [root@localhost ~]# /etc/init.d/vsftpd start |
參考資料:
完全按照上述步驟, 但測試時郤一直發生login fail, pam改來改去仍不見成功, pam只留二行就會造成原real account無法登入, 請問還有什麼要注意的 ?
在pam設定上有分32位元和64位元的,你可查看是否設定錯誤
vi /etc/pam.d/vsftpd
好詳細的教學 ~
PS: tcp_wrappers=YESs 這裡是不是多打了一個 s 呢?
感謝告知 已修改~!
great job!