Centos FTP (vsftp)虛擬化設定

由 Derek 發表於 三月 21, 2012 / 5 則評論

 

前言:

為什麼要虛擬化? 虛擬化有什麼好處?

使用虛擬化主要是方便管理和增加Server的安全性。在未虛擬化的情況下,若使用ftpuser過多,那勢必會造成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 建立vsftplog檔,並修改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 修改vsftpdPAM驗證

以下分為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

 

參考資料:

                 百度文庫

                 centos 5.4 Vsftpd 虛擬帳戶安裝配置

 

關於作者

一個半路殺出來的傻小子,憑著一股傻勁努力的學習、嘗試、分享。希望能用自己微薄之力,替IT界和資訊界盡一點心力。單憑一己之力始終還是有限,歡迎和我有相同理念的夥伴一同加入一同努力。

評論

  1. sam 說: 2013/01/21

    完全按照上述步驟, 但測試時郤一直發生login fail, pam改來改去仍不見成功, pam只留二行就會造成原real account無法登入, 請問還有什麼要注意的 ?

    • Derek 說: 2013/01/21

      在pam設定上有分32位元和64位元的,你可查看是否設定錯誤
      vi /etc/pam.d/vsftpd

  2. ♂帆°☆ 說: 2012/04/11

    好詳細的教學 ~
    PS:  tcp_wrappers=YESs 這裡是不是多打了一個 s 呢?

    • Derek 說: 2012/04/17

      感謝告知 已修改~!

  3. 張旭 說: 2012/03/22

    great job!

發表評論至 Derek

*