字體:  

Centos 下建置 vsftpd virtual user 虛擬用戶

virage 發表於: 2012-4-23 18:24 來源: ADJ網路控股集團


使用虛擬化主要是方便管理和增加Server的安全性。在未虛擬化的情況下,若使用ftpuser過多,那勢必會造成Server在安全性上的重大隱憂。


而在虛擬化後的vsftp可靈活的設定FTP虛擬用戶的權限,降低因user過多造成的安全性問題。


在這裡,Vsftp的虛擬用戶支持,也就是說,這些Vsftp用戶不再必須是系統用戶了,而且用戶路徑的定義、配置可以更加個性化,從而使得Vsftp也更加功能強大。而在這當中,PAM再次扮演了關鍵的角色。

 

環境:

Centos 5.6

vsftpd-2.0.5-21.el5


一.安裝:
1.安裝Vsftpd服務相關套件:
# yum -y install vsftpd*


2.確認安裝PAM服務相關套件:
# yum -y install pam pam-devel


3.安裝DB4套件包:
這裡要特別安裝一個db4的包,用來支持文件數據庫。
# yum -y install db4*


Dependencies Resolved
=============================================================================
Package                 Arch       Version          Repository        Size
=============================================================================
Installing:
db4-devel               i386       4.3.29-10.el5     base              2.0 M
db4-java                i386       4.3.29-10.el5     base              1.7 M
db4-tcl                 i386       4.3.29-10.el5     base              1.0 M
db4-utils               i386       4.3.29-10.el5     base              119 kTransaction Summary
=============================================================================
Install      4 Package(s)        
Update       0 Package(s)        
Remove       0 Package(s)     


二.系統帳戶
1.建立Vsftpd服務的宿主用戶:

預設vsftpd的宿主帳號為root,但由於安全性的考量,這邊不使用預設帳號。

因此在這邊建立一個新的宿主帳號為 vsftpd,用來做為vsftp的宿主帳號。但由於不給

此帳號登入的必要,所以設定為不可登入的系統帳號。

# useradd vsftpd -s /sbin/nologin


2.建立Vsftpd虛擬宿主用戶:

由於虛擬帳號並不屬於系統帳號,也就是說虛擬帳號在系統中是不存在的。所謂vsftp

的虛擬宿主帳號,就是一個提供所有虛擬帳號的宿主帳號。也正因為提供ftp所有虛

擬帳號,所以此宿主本身的權限也會影響到這些虛擬帳號。

# useradd vsftpduser -s /sbin/nologin


注意: 以上所創建的帳號,可依個人需求自行修改。若不想設定也可直接使用root權限。



三.調整Vsftpd的配置文件:
1.編輯配置文件前先備份

# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak


2.編輯主配置文件Vsftpd.conf

提供以下設定檔,以便參考。

QUOTE:

[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).

# 設定連接PORT20

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.

# ServerClient的資料連線已經成功建立(不論主動還是被動連線)

# 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=vsftpd

#

# 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 ADJ 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=vsftpduser

 

# 設定虛擬用戶的權限和宿主帳號的一樣

virtual_use_local_privs=YES

 

# 設定虛擬用戶個人Vsftp的配置文件存放路徑。

# 需要注意的地方就是這些配置文件名必須和虛擬用戶名相同。

user_config_dir=/etc/vsftpd/vconf

 

#指定連接PORT的範圍,才不會因PORT亂跳,不好設定防火牆

pasv_enable=YES

pasv_min_port=65400

pasv_max_port=65410


# 使用當地時間

use_localtime=YES


3.建立Vsftpd的日誌文件,並更該屬主為Vsftpd的服務宿主用戶:
# chown vsftpd.vsftpd /var/log/vsftpd.log




三.製作虛擬用戶數據庫文件
1.先建立虛擬用戶名單文件:
# touch /etc/vsftpd/ftp-userlist


建立了一個虛擬用戶名單文件,這個文件就是來記錄vsftpd虛擬用戶的用戶名和口令的數據文件,我這裡給它命名為ftp-userlist。

為了避免文件的混亂,我把這個名單文件就放置在/etc/vsftpd/下。


2.編輯虛擬用戶名單文件:
# vi /etc/vsftpd/ftp-userlist
----------------------------
adj

111111

allen

111111
----------------------------
編輯這個虛擬用戶名單文件,在其中加入用戶的用戶名和口令信息。格式很簡單:“一行用戶名,一行口令”。


3.生成虛擬用戶數據文件:

# db_load -T -t hash -f /etc/vsftpd/ftp-userlist /etc/vsftpd/ftp-userlist.db


注意:以後如果有增加或減少帳號時請記得要在執行一次「db_load -T -t hash –f要不然設定是不會生效的。



四.設定PAM驗證文件,並指定虛擬用戶數據庫文件進行讀取
1.在編輯前做好備份:

# cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak


2.編輯Vsftpd的PAM驗證配置文件


以下分為32位元和64位元的修改方式,請依自己安裝系統的位元來做修改

不論是32位元或是64位元,除了新增的兩行外其他的都請註解起來。


32位元:


QUOTE:

[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位元:


QUOTE:

[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



五.虛擬用戶的配置
1.建立虛擬帳號vsftpd.conf存放的資料夾

# mkdir /etc/vsftpd/vconf/


2.建立測試用戶 adj 的FTP用戶配置文件:

#  vi /etc/vsftpd/vconf/adj


QUOTE:

# 一般user權限,能下載、上傳和刪除

 

# 檔案存放路徑(若設定的路徑內,沒有指定的資料夾時,請自行建立)

local_root=/home/upload/

 

# 設定不允許匿名用戶訪問。

anonymous_enable=NO

 

# 設定Vsftpd服務的宿主帳號為手動建立的Vsftpd用戶。

nopriv_user=vsftpd

 

# 指定虛擬用戶的宿主用戶

guest_username=vsftpduser

 

#設定是否允許寫操作

write_enable=YES

 

#設定是否允許下載

download_enable=YES

 

#設定上傳文件權限掩碼

local_umask=022

 

#當使用者進入某個目錄時,會顯示該目錄需要注意的內容

dirmessage_enable=YES

 

#當設定為 YES 時,使用者上傳與下載檔案都會被紀錄起來

xferlog_enable=YES

 

#這就是 ftp-data 的埠號

connect_from_port_20=YES


# Standard Format

xferlog_std_format=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



3.更改虛擬用戶的主目錄的屬主為虛擬宿主用戶:

# chown -R vsftpduser.vsftpduser /home/upload


4.啟動vsftp服務

# service vsftpd start


5. 防火牆設定

先啟用防火牆和關閉SELinux,並加入防火牆規則

請加入以下規則

第一二行為允許21port連線

第三行因為在vsftpd.conf有限制port連線,因此在這邊也要將此範圍的port打開

QUOTE:

# Allow FTP

iptables -A INPUT -p tcp --dport 20 -j ACCEPT

iptables -A INPUT -p tcp --dport 21 -j ACCEPT

iptables -A INPUT -p tcp --dport 65400:65410 -j ACCEPT


6.測試

請用ftp軟體如 Filezilla Client 連線看是否能正常登入和使用。若是都能登入和使用的話就表示沒問題了。



參考資料:

http://blog.faq-book.com/?p=4549

http://www.guan8.net/Java/278735.html

http://hi.baidu.com/xc_hai/blog/item/bef536133a0b9ac3c2fd7888.html