Linux下网络服务的安全设置

     Linux操作系统由于其良好的稳定性、健壮性、高效性和安全性。正在成为各种网络服务的理想平台。各种网络应用在Linux系统上部有性能卓越的应用,例如,提供Web服务的Apache服务器;提供DNS服务的Bind;提供SMTP服务的Postfix、Sendmail、Qmail等;提供FTP服务的Wu-ftp和Vsftp,Proftp等。除此之外,越来越多的网络应用也都提供了在Linux上的实现,更多的应用可参考《Linux企业应用案例精解》一书。依靠这些开放源代码的软件,通过精心的配置可以提供同昂贵的商业软件同样优秀的网络服务。本文重点讲述Linux系统对于网络服务的控制和管理,首先介绍Linux系统提供网络服务的两种方式,即standalong和inetd/xinetd方式;然后介绍如何察看、启动和停止系统提供的服务。
一、stand-along和inetd/xinetd方式
Linux系统能够通过两种方式来提供网络服务, 一种是传统的stand-alone方式,另外一种通过系统的inetd进程来启动。
1)stand-alone方式
(1) 工作过程
1
stand-alone方式的工作过程如图1所示。首先,服务器启动网络服务进程,用以监听某一指定网络端口,来等待客户端的连接请求到达。比如,Web服务器会监听TCP的80端口;telnet服务则会监听TCP的23端口。然后,当有客户端连接请求到达时这个监听的进程会响应这个连接请求,并且生成一个子进程或是线程来处理客户端的请求, 父服务进程则返回,继续监听指定端口,等待下一个客户请求的到来。
最后, 当客户端完成访问结束时, 处理其请求的子进程也随之退出。在某些情况下,比如访问量比较大的Web服务器上,会预先生成几个子进程,这样就不必在父进程接收到客户端请求时再去生成子进程,从而提高了客户的访问速度。
(2).服务的启动和停止
Linux系统当中,通过stand-alone方式启动服务通常都由/etc/rc.d/下面对应的运行级别当中的符号链接来启动。这里首先解释一下运行级别。Linux运行级别是一种系统状态, 或者称为模式(Mode),它由列在/etc/rc.d/rc<x>.d目录中的服务来定义,其中<x>是运行级别的数字。
# ls -l
drwxr-xr-x 2 root root 4096 07-30 22:31 init.d
-rwxr-xr-x 1 root root 2255 2008-03-03 rc
drwxr-xr-x 2 root root 4096 07-30 22:31 rc0.d
drwxr-xr-x 2 root root 4096 07-30 22:15 rc1.d
drwxr-xr-x 2 root root 4096 07-30 22:31 rc2.d
drwxr-xr-x 2 root root 4096 07-30 22:31 rc3.d
drwxr-xr-x 2 root root 4096 07-30 22:15 rc4.d
drwxr-xr-x 2 root root 4096 08-23 19:28 rc5.d
drwxr-xr-x 2 root root 4096 07-30 22:31 rc6.d
-rwxr-xr-x 1 root root   220 2008-03-03 rc.local
-rwxr-xr-x 1 root root 26918 2008-03-03 rc.sysinit
现存的运行级别如下:
0停运;
1 单用户模式;
2 没有使用(可由用户定义);
3 完整的多用户模式;
4 没有使用(可由用户定义);
5 完整的多用户模式(带有基于X的登录屏幕);
6 重新引导。
如果使用的是文本登录屏幕,那么所在的运行级别就3。如果使用的是图形化登录屏幕,则运行级别就是5。默认的运行级别可以通过修改/etc/inittab文件来改变:
……………….
# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
# Run xdm in runlevel 5
x:5:respawn:/etc/X11/prefdm -nodaemon
修改的运行级别在系统重新引导之后就会生效,系统就会进入相应的运行级别。注意,不要将运行级别设置为0或6。如果要立即改变运行级别,则需要使用telinit命令,之后跟随运行级别号码。只有是root用户才能使用这个命令。要注意的是,telinit命令并不改变/etc/inittab文件,只改变当前的运行级别。当系统重新引导后,它会被引导入/etc/inittab中指定的运行级别。
对每一个运行级别来说,在/etc/rc.d子目录中都有一个对应的下级目录。这些运行级别的下级子目录的命名方法是rcX.d,其中的X就是代表运行级别的数字。比如,运行级别3的全部命令脚本程序都保存在/etc/rc.d/rc3.d子目录中。
# ls
K02avahi-dnsconfd            K35smb              K88wpa_supplicant   S08iptables        S22messagebus       S80sendmail
K02dhcdbd                    K35vncserver        K89dund             S09isdn           S25bluetooth        S85gpm
K02NetworkManager            K35winbind          K89netplugd         S10network         S25netfs            S90crond
… …
         S56xinetd           S99smartd
K25squid                     K87multipathd       S08ip6tables        S20kdump           S77netbackup
 
由上可以看到,在各个运行级别的子目录中,都有很多个以字母S或以字母K开头的文件,这些文件都是一些到/etc/init.d/下面的符号连接。比如:
# ls -l S77netbackup
lrwxrwxrwx 1 root root 26 07-30 22:31 S77netbackup -> /etc/rc.d/init.d/netbackup
真正的启动脚本部存放存/etc/init.d/下,系统启动时,Linux系统会根据/etc/initab当中设定的运行级别来运行某个特定的了目录。首先运行以字母K打头的命令脚本程序,然后再运行以字母s打头的命令脚本程序。对以字母K打头的命令脚本程序来说,会传递Stop参数来停止该服务。类似地对以字母s打头的命令脚本程序来说,会传递Start参数来启动该服务。
在许多情况下, 命令脚本程序的执行顺序都很重要。比如,如果没有先配置网络接口,那么就没有办法使用DNS服务来解析主机名。因此,为了安排它们的执行顺序,在字母s或K的后面紧跟着一个两位数字,数值小的在数值大的前面执行。比如,/etc/rc.d/rc3.d/S5Oinet就会在/etc/rc.d/rc3.d/S55named之前执行(s50inet配置网络设置,S55named肩动DNS服务器)。
二、inetd/xinetd方式
(1)工作过程
相对stand-alone方式,inetd/xinetd方式也被称为“Internet Super-Server”,因为它管理着多个守护程序的链接,这些守护进程来提供诸如FTP、Telnet等网络服务。inetd/xinetd工作方式如图2所示。有关更详细的xinetd介绍请查阅Linux系统管理教程。
2
控制服务的启动和停止
管理系统服务访问的方法有好几种,可以根据服务、系统配置及对Linux的掌握程度来决定使用哪一种管理方法。
拒绝对某一服务的使用最简便的方法是将其关闭。不论是由xinetd管理的服务,还是在/etc/rc.d层次中的服务,都可以使用服务配置工具、ntsysv和chkconfig等三种不同的应用程序来配置其启动或停止。
1.服务配置工具
使用图形化应用程序可以显示每项服务的描述, 以及每项服务是否在引导时启动(运行级别3、4和5),并允许启动、停止或重新启动每项服务,如图4所示。
4 服务配置工具
 
2ntsysv
ntsysv是基于文本的程序,它允许为每个运行级别配置引导时要启动的服务。对于不属于xinetd的服务而言,改变不会立即生效。不能使用这个程序来启动、停止或重新启动不属于xinetd的服务。
3chkconfig
chkconfig是允许在不同运行级别启动和关闭服务的命令行工具。对于不属于xinetd的服务而言,改变不会立即生效。不能使用这个程序启动、停.I匕或重新启动不属于xinetd的服务。
[root@jie rc3.d]# chkconfig –list
NetworkManager 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭
NetworkManagerDispatcher        0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭
acpid           0:关闭 1:关闭 2:关闭 3:启用 4:启用 5:启用 6:关闭
anacron         0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
apmd            0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
atd             0:关闭 1:关闭 2:关闭 3:启用 4:启用 5:启用 6:关闭
auditd          0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
autofs          0:关闭 1:关闭 2:关闭 3:启用 4:启用 5:启用 6:关闭
avahi-daemon    0:关闭 1:关闭 2:关闭 3:启用 4:启用 5:启用 6:关闭
avahi-dnsconfd 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭
bluetooth       0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
capi            0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭
conman          0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭
cpuspeed        0:关闭 1:启用 2:启用 3:启用 4:启用 5:启用 6:关闭
此外,还可以直接编辑/etc/rc.d/rcX.d下文件,或者在/etc/xinet.d/文件下直接控制Linux提供的系统服务。注意这里的X对应了启动级别.
三、Web服务安全
1Web服务面临的威胁
由于Web服务的普及,各种针对它的攻击手段也是层出不穷。对于Web服务而言,按照威胁针对的对象可以分为针 对服务器端、针对客户端和针对服务器到客户端之间的传输三类。
(1)针对服务器端的威胁 针对服务器端的威胁主要包括非授权用户利用配置漏洞或其它漏洞获取服务器端保密信息,入侵者通过Web服务进 程漏洞取得服务器主机的控制权;入侵者发动DoS (拒绝服务)攻击使服务失效。
(2)针对客户端的威胁 针对客户端的威胁主要包括通过浏览器漏洞执 行ActiveX、Javaapplet等动态执行程序危害用户系统,获取用 户机密信息。
(3) 针对服务器到客户端之间传输的威胁 针对服务器到客户端之间传输的威胁通过网络窃听等手来获取客户/服务器之间的通信信息,或者恶意篡改通信内容。
这里我们重点讨论Web 服务器端和通信过程中的安全性。对于多数Web服务器而言,被攻击主要因为应用程序或 脚本当中存在漏涧,并且这些漏洞被入侵者所利用而导致。
2. Apache安全配置实例
(1) 用户/用户组,文件系统和默认设置
按照最小特权原则,需要给Apache分配一个合适的权限,让其能够完成Web服务。必须保证Apache使用一个专 门的用户和用户组,不要使用系统预定义的账号,比如 nobody用户和nogroup用户组。
对于Apache 系统而言,有 ServerRoot、DocumentRoot、 ScriptAlias、CustomLog和Errorlog四个主要目录,必须确 保以上四个主要目录相互独立,也就说任何两个目录之间不 存在父子关系。例如下面的配置:
ServerRoot “/etc/httpd”
DocumentRoot   “/var/www/html “
ScriptAlias /cgi-bin/ “/var/www/cgi-bin/”
CustomLog  /var/log/httpd/access.log
ErrorLog logs /var/log/httpd/error.log
因为除了 root用户以外,没有其它用户能够配置或是运行Apache,所以ServerRoot应该被配置为只能由root用户 访问。DocumentRoot应该能够被管理Web站点内容的用户访 问,跟Apache服务器使用Apache用户和apache用户组访问。ScriptAlias目录应该只能被CGI开发人员和apache用户访问。在管理时最好为Web内容维护人员和CGI开发人员分别建立webcontent和webdev两个组然后利用usermod命 令将用户分别加入到这两个组当中。例如,将用户cgweb加入到root组当中:
# usermod -G root cgweb
利用groups命令可以査看用户属于哪些组:
# groups cgweb
cgweb:cgweb root
在默认设置当中修改以下几点:
禁止使用目录索引文件
Apache服务器在接收到用户对一个目录的访问时,会查找Directorvlndex指令指定的目录索引文件。默认情况下该文件是index.html 如果该文件不存在,那么Apache 会创建动态列表为用户显示该目录的内容,如图 1 用户 http://ipaddress/test/访问Web服务器上的test目录。
Apache 服务器在该目录下没有找到 index.html,则显示test目录下所有文件和目录信息。通常这样的设置会暴露 Web 站点结构,因此需要修改配置文件禁止显示动态目录列表。
修改配置文件httpd.conf
<Directory “/var/www/html”>
 Options -Indexes FolIowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
Options字段添加“-Indexes”,表明禁止显示活动目录。
禁止默认访问
一个好的安全模型应该规定默认拒绝一切访问,为了实现默认的访问拒绝可以在httpd.conf 当中使用如下的配置:
<Directory />
Order deny, allow
Deny from all
</Directory >
为了访问特定的目录,再次使用<Directory … >进行 配置。
<Directory   “/var/www/html ” >
Order allow,deny
Allow from all
< /Directory>
禁止用户重载
通过如下设定,可以防止用户通过任何目录当中的.htaccess配置文件对配置进行重载的能力。
<Directory/>
AllowOverride None
</Directory>
(2) 控制 CGI 脚本
CGI 脚本的漏洞已经成为了Web 眼务器的首要安全隐患,许多程序员在编写CGI 程序时并不注重其安全性,在无 意当中产生了许多的后门和漏洞。控制CGI 脚本的漏洞除了在编写时需要注意对输入数据的合法性检查、对系统调用的 谨慎使用等因素外,安全配置Apache 服务器也能够消除掉 许多不安全的CGI 程序带来的影响。
默认情况下,以Apache 服务器所使用的UID 来运行这 些CGI 程序。在很多情况下,如果以CGI 程序所有者的UI D 来运行这些程序,则会带来安全性上的好处,此时这些CGI程序即使存在某些漏洞,那么其危害也仅限于该XJID 所能够 访问的文件当中。也就说这样只能伤害用户的文件,而不会对整个系统带来致命的影响。
.使用 SSL加密
使用SSL (Secure Sockets Layer, 安全套接字层)能够保证 Web 服务器和客户端通信过程当中数据的安全性 。HTTP协议采用明文进行传输,因此入侵者对于服务器和客户端之间传输的数据很容易进行窃听和篡改。为了解决这一问题,最初由Netscape公司开发了Secure socket layer(SSL) 协议,现在SSL已经成为用以鉴别网站和网页浏览者身份、 并在浏览器和Web 服务器之间进行加密通信的全球标准。 SSL技术已被所有主要的浏览器和Web服务器所支持。
四、DNS服务安全
DNS即域名解析服务作为网络的基础服务之一,承担着 将域名翻译成计算机可识别的IP 地址形式,以及寻找IP 地 址对应域名的逆向翻译工作。DNS服务对于网络非常重要,一旦DNS服务出现故障,用户就不能采用域名的方式来进行访问,并且,相应的邮件服务也会由于无法正常解析域名而 出现故障。正是由于DNS服务对于网络的重要性,它也成为黑客攻击的重要目标。
1. DNS服务面临的威胁
DNS服务面临的威胁有域名信息欺骗、DoS/DDOS攻击和缓冲区漏洞溢出攻击等。
(1) 域名信息欺骗
域名信息欺骗(DNS Spoofing)指的是客户端进行DNS 查询时,由于DNS服务器被攻击或错误的配置,而对客户端返回了一个错误的、未经证实的响应。域名信息欺骗会带来 严重的后果,客户由于相信了DNS服务器错误的信息会导致 用户访问到一个错误的、很可能是一个恶意的网站,从而导致非常严重的后果。
1)入侵者通常采用以下两种方法来进行域名信息欺骗:
• 缓存感染入侵者通过特定的DNS 访问将其数据放入到DNS服务器的缓存当中。这些缓存信息会在客户进行DNS访问时返回给客户,从而将客户引导到入侵者所设置的恶意 服务器上。
DNS 劫持  入侵者通过监听客户端和 DNS之间服务 器的对话,通过猜测服务器响应给客户端的DNS query id 在服务器之前将虚假的响应交给用户,从而欺骗客户端去访问恶意的网站。
2)DoS攻击
很多DNS 服务器的缺省设置存在一个漏洞,可能导致DoS (Denial of Service, 拒绝服务攻击)。如果一个域名服务器允许远程主机向它査询其它域(本身并不管理这些域)的域 名,就是所谓允许递归査询,有可能导致网络流量的异常增大。单个主机引起的流量增大可能并不导致拒绝服务攻击的 产生,但是利用DNS的分级方式的弱点,可能引发对单个站 点的大量数据流量,阻塞正常的网络交通服务。这个问题出 在当域名服务器收不到某域权威服务器的域名解析应答时的 处理方式上。当域名服务器接收到一个域名解析请求时,它往往会转发给上一级的DNS服务器。如果这个查询请求不能 被解析,因为其权威域名服务器上没有启动DNS服务或是没有应答. 那么每个转发的服务器将会试图自己解析,通常会重试三次(分别在0 秒、12 秒和24 秒时),甚至更多次。在这种情况下,该域名所在网络的流量就明显增大了。通过使 用大量的域名服务器做这种査询,可能导致向目标网络发送 大量数据,造成拒绝服务攻击。
(3) 缓冲区漏洞溢出攻击
DNS服务器软件在实现上如果存在漏洞,比如对特定的 输入没有进行严格检査,那么有可能被攻击者利用,攻击者构造特殊的畸形数据包来对 DNS 服务器进行缓冲区溢出 攻 击。如果这一攻击成功,就会造成DNS 服务停止,或者攻击 者能够在DNS 服务器上执行任意代码。
2. Bind安全配置实例
下面以著名的BIND 软件为例,讲解DNS 服务器的安全配置。
 (1)控制区域传输 如果DNS 服务器允许对任何人都进行区域传输的话,那么整个网络架构中的主机名、主机IP 列表、路由器名和路由 器IP 列表,甚至包括各主机所在的位置和硬件配置等情况都会被入侵者轻易得到。因此,要对区域传输进行必要的限制。
可以通过在/etc/named.conf 文件当中添加以下语句来 限制区域传输:
acl “zero-transfer” {
192.168.0.3,
192.168.0.100,
};
zone   “yourdomain.com” {
type master;
file “mydomain.dns”;
allow-transfer { zero-transfer ;};
};
现在只有IP地址为192.168.0.53和192.168.0.100的主 机能够同DNS 服务器进行区域传输。
(2)限制访问区域 限制 DNS 服务器提供服务的范围对于 DNS服务器的安全性也是至关重要的,这样能够把许多入侵者拒之门外。要实现这一点很简单,只需要在BIND 服务器的配置文件/etc/named.conf 当中增加以下语句:
options {
allow-query {192.168.0.0/24;};
这样通过allow-query指令就能够保证网 段192.168.0.0/24 上的所有主机可以访问服务器提供的DNS服务,而不处于该网段的主机就无法访问该DNS 服务器提供的服务。
(3) 用非root 用户用户运行DNS 服务
利用BIND 软件提供的-u 选项采用非root 用户身份来运行 BIND :
# /usr/sbin/named -u nobody
通过上面这条命令以nobody 身份来运行BIND ,这样能够降低由于缓冲区溢出攻击所带来的危害。
五、FTP 服务安全
FTP 服务即文件传输服务,它曾经是Internet 上应用最 为广泛的文件交换手段之一,但是FTP 协议由于其设计之初并没有考虑到安全问题,因此,FTP 协议存在着不可克服的 安全性漏洞。
1. FTP服务面临的威胁
FTP 服务主要面临缓冲区溢出攻击、明文口令和匿名访问等几种攻击。
(1) 缓冲区溢出攻击
缓冲区溢出漏洞是一种软件中边境条件、函数指针等设计不当造成地址空间错误。它的原理是向一个有限空间的缓冲区中拷贝了过长的字符串,带来了两种后果,一是过长的字符串覆盖了相临的存储单元而造成程序瘫痪,甚至造成宕 机、系统或进程重启等;二是利用漏洞可以让攻击者运行恶意代码,执行任意指令,甚至获得超级权限等。
(2) 明文口令
由于FTP 协议采用明文传输其口令,因此很容易被攻击者通过窃听的方式获取口令。
(3) 匿名访问
匿名访问方式在FTP 服务当中被广泛的支持,但是由于匿名FTP 不需要真正的身份验证,因此很容易为入侵者提供—个访问通道,配合缓冲区溢出攻击,会造成很严重的后果。例如,Ramen 蠕虫就是利用匿名访问和缓冲区溢出攻击对著名的wu-ftpd 服务器造成了极大的威胁。
2.Vsftp 安全配置实例
这里以vsftpd为例,介绍FTP服务器的安全配置。vsftpd在安全性、高性能及稳定性三个方面有不错的表现,它能够提供包括虚拟IP设置、虚拟用户、Standalone、xinetd操作 模式、强大的单用户设置能力及带宽限流等强大功能。在安 全方面,它从原理上修补了大多数wu_ftp 、ProFTP,的安装缺陷,使用安全编码技术解决了缓冲溢出 问题,并能有效避免“globbing” 类型的拒绝服务攻击。
安装和vsftp的基本配置在这里就不再赘述,可以参考其相关文档。
下面主要从两个方面来加强VSftp的安全性:
(1)采用tcp_wrappers进行访问控制
要使用这项功能,首先需要在安装编译之前构建包含tcp_wrappers 的 vsftpd,可通过编辑“builddefs.h”文件, 将“#undef VSF_BUILD_TCPWRAPPERS” 修改 为 “#define VSF_BU I LD_TCPWRAPPERS”, 然后重新构建 编译,生成可执行代码。其次,要开启在配置文件 vsftpd。conf 中的选项“tcp_wrappers=YES”。该功能依赖于对文件“/etc / hosts.allow”的配置。以下是一个样例:
vsftpd; 192.168.1.3: setenv VSFTPD_LOAD_CONF/etc/vsftpd_tcp_wrap. conf
vsftpd: 192.168.1.4: DENY
其中,第一行表示如果一个客户端从192.168.1.3连接,那么vsftpd将应用 “/etc/vsftpd_tcp_wrap.conf” 的vsftpd 配置文件连接。这些设置被应用在默认的vsftpd.conf之前。 这一点十分有用,可用它为一些IP应用不同的访问限制( 例 如上传的能力) ;还可以指定某些IP有能力来超越连接限制 (max_clients=0);或者为某些IP增减带宽限制。第二行表示 拒绝192.168.1.4连接的能力。这一点对别有用心的连接者 很有用。
(2) 启用虚拟用户
     虚拟用户是指不像系统上的真实用户一样客观存在的用户,虚拟用户因而比真实用户更安全。虚拟用户常用来服务那些不想开放给不被信任用户的内容,一般不影响正常的普通用户。
创建虚拟用户数据库
使用pam_userdb鉴别虛拟用户,需要一个“db”格式的 用户名/ 密码文件。要创建一个“db” 格式文件,首先要创 建一个在交替行上写有用户名和密码的无格式文本文件,代 码如下:
$ cat logins.txt   
upload
foo
download
bar
上面的“upload” 对应着密码“foo”: “download”对应 着密码“bar”。同时用root身份登陆,创建实际的数据库文 件,代码如下:
$db_load -T -t hash -f logins.txt /etc /Vsftpd_login.db
注意,要求已安装了Berkeley db 程序。这样即可创建“/etc/vsftpd_login.db”。如果想改变访问许可权限,可用如下命令:
$chmod 600 /etc/vsftpd_login.db
建一个使用新数据库的PAM 文件
创建编辑文件vsftpd.pam,包含以下两行:
auth required /lib/security/pam_userdb.so db=/etc/vsftpd_login
accound required /lib/security/pam_userdb.so db=/etc/vsftpd_login
告诉PAM使用新数据库来鉴别用户。把该PAM文件保 存到 PAM 目录(通常为“/etc/pam.d/cp vsftpd.pam /etc/pam.d/ftp”) 。
为虚拟用户设置文件位置
接下来使用以下命令为虚拟用户设置文件位置:
$useradd -d /home/ftpsite virtual
$ls -ld /home/ftpsite
将显示如下:
drwx—–3 virtual virtual 4096 Aug 25 00:39 /home/ftpsite
上面表明已经创建一个叫做“virtual” 的用户,并且有 一个主目录“/home/ftpsite”。增加一些内容到这个下载区域,代码如下:
$ cp /etc/hosts /home/ftpsite
$ chown virtual. virtual /home/ftpsite/hosts
定制vsftpd.conf 配置文件
重新定制vsftpd.conf文件:
Anonymous_enable= NO
local_enable=YES
由于安全因素应关闭匿名FTP,并开启非匿名FTP(虚拟 用户需使用)。
write_enable=NO
anon_upload_enable=NO
anon_mkdir_writei_enable=NO
anon_other_write_enable=NO
出于安全目的写下这些确保命令,不许写命令执行。
Chroot_local_user=YES
限制虚拟用户到上面设置的虚拟 FTP 区域 /home /ftpsite。
Guest_ enable= YES