为了建构一个安全为主的FTP服务器,vsftpd针对操作系统的『程序的权限(privilege)』概念来设计,PID在系统上面能进行的任务与他拥有的权限有关。也就是说,PID拥有的权限等级越高,他能够进行的任务就越多。举例来说,使用root身份所触发的PID通常拥有可以进行任何工作的权限等级。
不过,万一触发这个PID的程序(program)有漏洞而导致被网络怪客(cracker)所攻击而取得此PID使用权时,那么网络怪客将会取得这个PID拥有的权限吶!所以,近来发展的软件都会尽量的将服务取得的PID权限降低,使得该服务即使不小心被入侵了,入侵者也无法得到有效的系统管理权限,这样会让我们的系统较为安全的啦。vsftpd就是基于这种想法而设计的。
除了PID方面的权限之外,vsftpd也支持chroot这个函式的功能,chroot顾名思义就是『change root directory』的意思,那个root指的是『根目录』而非系统管理员。他可以将某个特定的目录变成根目录,所以与该目录没有关系的其他目录就不会被误用了。
举例来说,如果你以匿名身份登入我们的ftp服务的话,通常你会被限定在/var/ftp目录下工作,而你看到的根目录其实就只是/var/ftp,至于系统其他如/etc, /home, /usr...等其他目录你就看不到了!这样一来即使这个ftp服务被攻破了,没有关系,入侵者还是仅能在/var/ftp里面跑来跑去而已,而无法使用Linux的完整功能。自然我们的系统也就会比较安全啦!
vsftpd是基于上面的说明来设计的一个较为安全的FTP服务器软件,他具有底下的特点喔:
vsftpd这个服务的启动者身份为一般用户,所以对于Linux系统的权限较低,对于Linux系统的危害就相对的减低了。此外,vsftpd亦利用chroot()这个函式进行改换根目录的动作,使得系统工具不会被vsftpd这支服务所误用;
任何需要具有较高执行权限的vsftpd指令均以一支特殊的上层程序所控制,该上层程序享有的较高执行权限功能已经被限制的相当的低,并以不影响Linux本身的系统为准;
绝大部分ftp会使用到的额外指令功能(dir, ls, cd ...)都已经被整合到vsftpd主程序当中了,因此理论上vsftpd不需要使用到额外的系统提供的指令,所以在chroot的情况下,vsftpd不但可以顺利运作,且不需要额外功能对于系统来说也比较安全。
所有来自客户端且想要使用这支上层程序所提供的较高执行权限之vsftpd指令的需求,均被视为『不可信任的要求』来处理,必需要经过相当程度的身份确认后,方可利用该上层程序的功能。例如chown(), Login的要求等等动作;
此外,上面提到的上层程序中,依然使用chroot()的功能来限制用户的执行权限。
由于具有这样的特点,所以vsftpd会变的比较安全一些咯!底下就开始来谈如何设定吧!
21.2.2所需要的软件以及软件结构
vsftpd所需要的软件只有一个,那就是vsftpd啊!^_^!如果你的CentOS没有安装,请利用yum install vsftpd来安装他吧!软件很小,下载连同安装不需要几秒钟就搞定了!而事实上整个软件提供的配置文件也少的令人高兴!简单易用就是vsftpd的特色啊!这些设定数据比较重要的有:
/etc/vsftpd/vsftpd.conf
严格来说,整个vsftpd的配置文件就只有这个档案!这个档案的设定是以bash的变量设定相同的方式来处理的,也就是『参数=设定值』来设定的,注意,等号两边不能有空白喔!至于详细的vsftpd.conf可以使用『man 5 vsftpd.conf』来详查。
/etc/pam.d/vsftpd
这个是vsftpd使用PAM模块时的相关配置文件。主要用来作为身份认证之用,还有一些用户身份的抵挡功能,也是透过这个档案来达成的。你可以察看一下该档案:
[root@www ~]# cat /etc/pam.d/vsftpd
#%PAM-1.0
session optional pam_keyinit.soforce revoke
authrequired pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
authrequired pam_shells.so
authincludepassword-auth
account includepassword-auth
session required pam_loginuid.so
session includepassword-auth
上面那个file后面接的档案是『限制使用者无法使用vsftpd』之意,也就是说,其实你的限制档案不见得要使用系统默认值,也可以在这个档案里面进行修改啦!^_^
/etc/vsftpd/ftpusers
与上一个档案有关系,也就是PAM模块(/etc/pam.d/vsftpd)所指定的那个无法登入的用户配置文件啊!这个档案的设定很简单,你只要将『不想让他登入FTP的账号』写入这个档案即可。一行一个账号,看起来像这样:
[root@www ~]# cat /etc/vsftpd/ftpusers
# Users that are not allowed to login via ftp
root
bin
daemon
....(底下省略)....
瞧见没有?绝大部分的系统账号都在这个档案内喔,也就是说,系统账号默认是没有办法使用vsftpd的啦!如果你还想要让某些使用者无法登入,写在这里是最快的!
/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}而不同,这得要特别留意喔!
/etc/vsftpd/chroot_list
这个档案预设是不存在的,所以你必须要手动自行建立。这个档案的主要功能是可以将某些账号的使用者chroot在他们的家目录下!但这个档案要生效与vsftpd.conf内的『chroot_list_enable, chroot_list_file』两个参数有关。如果你想要将某些实体用户限制在他们的家目录下而不许到其他目录去,可以启动这个设定项目喔!
/usr/sbin/vsftpd
这就是vsftpd的主要执行档咯!不要怀疑,vsftpd只有这一个执行档而已啊!
/var/ftp/
这个是vsftpd的预设匿名者登入的根目录喔!其实与ftp这个账号的家目录有关啦!
大致上就只有这几个档案需要注意而已,而且每个档案的设定又都很简单!真是不错啊!
21.2.3vsftpd.conf设定值说明
事实上,/etc/vsftpd/vsftpd.conf本身就是一个挺详细的配置文件,且使用『man 5 vsftpd.conf』则可以得到完整的参数说明。不过我们这里依旧先将vsftpd.conf内的常用参数给他写出来,希望对你有帮助:
与服务器环境较相关的设定值
connect_from_port_20=YES (NO)
记得在前一小节提到的主动式联机使用的FTP服务器的port吗?这就是ftp-data的埠号;
listen_port=21
vsftpd使用的命令通道port,如果你想要使用非正规的埠号,在这个设定项目修改吧!不过你必须要知道,这个设定值仅适合以stand alone的方式来启动喔!(对于super daemon无效)
dirmessage_enable=YES (NO)
当用户进入某个目录时,会显示该目录需要注意的内容,显示的档案默认是.message,你可以使用底下的设定项目来修订!
message_file=.message
当dirmessage_enable=YES时,可以设定这个项目来让vsftpd寻找该档案来显示讯息!
listen=YES (NO)
若设定为YES表示vsftpd是以standalone的方式来启动的!预设是NO呦!所以我们的CentOS将它改为YES哩!这样才能使用stand alone的方式来唤醒。
pasv_enable=YES (NO)
支持数据流的被动式联机模式(passive mode),一定要设定为YES的啦!
use_localtime=YES (NO)
是否使用本地时间?vsftpd预设使用GMT时间(格林威治),所以预设的FTP内的档案日期会比台湾晚8小时,建议修改设定为YES吧!
write_enable=YES (NO)
如果你允许用户上传数据时,就要启动这个设定值;
connect_timeout=60
单位是秒,在数据连接的主动式联机模式下,我们发出的连接讯号在60秒内得不到客户端的响应,则不等待并强制断线咯。
accept_timeout=60
当用户以被动式PASV来进行数据传输时,如果服务器启用passive port并等待client超过60秒而无回应,那么就给他强制断线!这个设定值与connect_timeout类似,不过一个是管理主动联机,一个管理被动联机。
data_connection_timeout=300
如果服务器与客户端的数据联机已经成功建立(不论主动还是被动联机),但是可能由于线路问题导致300秒内还是无法顺利的完成数据的传送,那客户端的联机就会被我们的vsftpd强制剔除!
idle_session_timeout=300
如果使用者在300秒内都没有命令动作,强制脱机!避免占着茅坑不拉屎~
max_clients=0
如果vsftpd是以stand alone方式启动的,那么这个设定项目可以设定同一时间,最多有多少client可以同时连上vsftpd哩!限制使用FTP的用量!
max_per_ip=0
与上面max_clients类似,这里是同一个IP同一时间可允许多少联机?
pasv_min_port=0, pasv_max_port=0
上面两个是与passive mode使用的port number有关,如果你想要使用65400到65410这11个port来进行被动式联机模式的连接,可以这样设定pasv_max_port=65410以及pasv_min_port=65400。如果是0的话,表示随机取用而不限制。
ftpd_banner=一些文字说明
当使用者联机进入到vsftpd时,在FTP客户端软件上头会显示的说明文字。不过,这个设定值数据比较少啦!建议你可以使用底下的banner_file设定值来取代这个项目;
banner_file=/path/file
这个项目可以指定某个纯文本档作为使用者登入vsftpd服务器时所显示的欢迎字眼。同时,也能够放置一些让使用者知道本FTP服务器的目录架构!
与实体用户较相关的设定值
guest_enable=YES (NO)
若这个值设定为YES时,那么任何实体账号,均会被假设成为guest喔(所以预设是不开放的)!至于访客在vsftpd当中,预设会取得ftp这个使用者的相关权限。但可以透过guest_username来修改。
guest_username=ftp
在guest_enable=YES时才会生效,指定访客的身份而已。
local_enable=YES (NO)
这个设定值必须要为YES时,在/etc/passwd内的账号才能以实体用户的方式登入我们的vsftpd服务器喔!
local_max_rate=0
实体用户的传输速度限制,单位为bytes/second,0为不限制。
chroot_local_user=YES (NO)
在预设的情况下,是否要将使用者限制在自己的家目录之内(chroot)?如果是YES代表用户默认就会被chroot,如果是NO,则预设是没有chroot。不过,实际还是需要底下的两个参数互相参考才行。为了安全性,这里应该要设定成YES才好。
chroot_list_enable=YES (NO)
是否启用chroot写入列表的功能?与底下的chroot_list_flie有关!这个项目得要开启,否则底下的列表档案会无效。
chroot_list_file=/etc/vsftpd.chroot_list
如果chroot_list_enable=YES那么就可以设定这个项目了!这个项目与chroot_local_user有关,详细的设定状态请参考21.2.6 chroot的说明。
userlist_enable=YES (NO)
是否藉助vsftpd的抵挡机制来处理某些不受欢迎的账号,与底下的参数设定有关;
userlist_deny=YES (NO)
当userlist_enable=YES时才会生效的设定,若此设定值为YES时,则当使用者账号被列入到某个档案时,在该档案内的使用者将无法登入vsftpd服务器!该档案文件名与下列设定项目有关。
userlist_file=/etc/vsftpd/user_list
若上面userlist_deny=YES时,则这个档案就有用处了!在这个档案内的账号都无法使用vsftpd喔!
匿名者登入的设定值
anonymous_enable=YES (NO)
设定为允许anonymous登入我们的vsftpd主机!预设是YES,底下的所有相关设定都需要将这个设定为anonymous_enable=YES之后才会生效!
anon_world_readable_only=YES (NO)
仅允许anonymous具有下载可读档案的权限,预设是YES。
anon_other_write_enable=YES (NO)
是否允许anonymous具有除了写入之外的权限?包括删除与改写服务器上的档案及档名等权限。预设当然是NO!如果要设定为YES,那么开放给anonymous写入的目录亦需要调整权限,让vsftpd的PID拥有者可以写入才行!
anon_mkdir_write_enable=YES (NO)
是否让anonymous具有建立目录的权限?默认值是NO!如果要设定为YES,那么anony_other_write_enable必须设定为YES!
anon_upload_enable=YES (NO)
是否让anonymous具有上传数据的功能,默认是NO,如果要设定为YES,则anon_other_write_enable=YES必须设定。
deny_email_enable=YES (NO)
将某些特殊的email address抵挡住,不让那些anonymous登入!如果以anonymous登入服务器时,不是会要求输入密码吗?密码不是要你输入你的email address吗?如果你很讨厌某些email address,就可以使用这个设定来将他取消登入的权限!需与下个设定项目配合:
banned_email_file=/etc/vsftpd/banned_emails
如果deny_email_enable=YES时,可以利用这个设定项目来规定哪个email address不可登入我们的vsftpd喔!在上面设定的档案内,一行输入一个email address即可!
no_anon_password=YES (NO)
当设定为YES时,表示anonymous将会略过密码检验步骤,而直接进入vsftpd服务器内喔!所以一般预设都是NO的!(登入时会检查输入的emai)
anon_max_rate=0
这个设定值后面接的数值单位为bytes/秒,限制anonymous的传输速度,如果是0则不限制(由最大带宽所限制),如果你想让anonymous仅有30 KB/s的速度,可以设定『anon_max_rate=30000』
anon_umask=077
限制anonymous上传档案的权限!如果是077则anonymous传送过来的档案权限会是-rw-------喔!
关于系统安全方面的一些设定值
ascii_download_enable=YES (NO)
如果设定为YES,那么client就优先(预设)使用ASCII格式下载文件。
ascii_upload_enable=YES (NO)
与上一个设定类似的,只是这个设定针对上传而言!预设是NO
one_process_model=YES (NO)
这个设定项目比较危险一点~当设定为YES时,表示每个建立的联机都会拥有一支process在负责,可以增加vsftpd的效能。不过,除非你的系统比较安全,而且硬件配备比较高,否则容易耗尽系统资源喔!一般建议设定为NO的啦!
tcp_wrappers=YES (NO)
当然我们都习惯支持TCP Wrappers的啦!所以设定为YES吧!
xferlog_enable=YES (NO)
当设定为YES时,使用者上传与下载文件都会被纪录起来。记录的档案与下一个设定项目有关:
xferlog_file=/var/log/xferlog
如果上一个xferlog_enable=YES的话,这里就可以设定了!这个是登录档的档名啦!
xferlog_std_format=YES (NO)
是否设定为wu ftp相同的登录档格式?预设为NO,因为登录档会比较容易读!不过,如果你有使用wu ftp登录文件的分析软件,这里才需要设定为YES
dual_log_enable=YES, vsftpd_log_file=/var/log/vsftpd.log
除了/var/log/xferlog的wu-ftp格式登录档之外,还可以具有vsftpd的独特登录档格式喔!如果你的FTP服务器并不是很忙碌,或许订出两个登录档的撰写(/var/log/{vsftpd.log,xferlog)是不错的。
nopriv_user=nobody
我们的vsftpd预设以nobody作为此一服务执行者的权限。因为nobody的权限相当的低,因此即使被入侵,入侵者仅能取得nobody的权限喔!
pam_service_name=vsftpd
这个是pam模块的名称,我们放置在/etc/pam.d/vsftpd即是这个咚咚!
上面这些是常见的vsftpd的设定参数,还有很多参数我没有列出来,你可以使用man 5 vsftpd.conf查阅喔!不过,基本上上面这些参数已经够我们设定vsftpd啰