最新消息:红方科技年末特惠:.com域名55元、云虚机五折优惠,买3年送2年,更有智能建站套餐等你来取!

FreeBSD下构建安全的Web服务器

Apache yinhexi 1913浏览 0评论

在我们跑Web服务器的时候,大家可能都会一致认为使用Linux+Mysql+Apache+PHP整个开源的系统是比较好的选择,但是我个人认为这是不合理的,首先要根据你的应用来觉得你使用什么服务。假如你需要跑Oracle等大型应用的话,而且Oracle在Linux下是支持的比较好的,那么使用Linux是个好的选择,因为在FreeBSD下安装Oracle是个非常麻烦的事情。那么如果是跑普通的网站应用的话,我觉得使用FreeBSD+Mysql+Apache+PHP是个好的选择,因为对于一个网站来讲,稳定安全是第一位的,否则你的网站什么时候被人修改了都不知道怎么回事,或者被黑客入侵,把数据修改或者删除,那就糟糕了,毕竟现在什么红客、黑客的一堆,不能不防。当然,不是说Linux不安全,但是在Linux下集成了很多不安全的程序,导致了它的不安全,但如果设置的好,Linux一样可以很安全。在中国网络应急响应中心(

系统装完后,在/etc/inetd.conf中把除了ssh之外的服务全部关闭,特别是telnet和rlogin等服务,一定要慎重,否则很可能每几天系统就被入侵了。安装完系统后,建议对系统进行升级,比如使用makeworld或cvsup把系统内核和ports进行升级。这个步骤和Windows装完后打补丁差不多。

2.服务程序安装

系统装完以后,就开始安装我们的应用软件,我们的方针还是最新的软件是最安全的,比如能够防止一些老版本中的溢出等等。我们基本就是要让我们的系统有数据库,同时能够处理Web服务,同时能够远程对网站进行文件管理的FTP服务。我们基本选择的程序都是比较通常的程序。另外,为了有个可视化的管理工具,我们同时也可以安装一个基于浏览器的管理工具Webmin,方便没有ssh客户端等等的时候进行管理。

首先我们选用的Web服务是Apachehttpd2.0.53,这是目前的最新版本,当然你也可以考虑1.3的版本,主要是看个人习惯。我们网站是PHP程序编写,所以要安装PHP,版本是4.3.11,也是最新的版本,如果你的网站程序需要PHP5的支持,那么可以下载php5.0.4.数据库还是最快速的Mysql,选择的版本是最新的4.0.23,如果你需要外键、事务、子查询、存储过程等的支持,那么你可以考虑4.1和5.0的版本。最后我们的FTP选择最安全的vsFTPd,因为它是最安全快速的,我在局域网中测试它的最高创数速率能够达到10MB/S,proFTPd只有8MB/S,vsFTPd针对小型FTP服务器支持非常好,毕竟我用户不多,几个更新网站而已,当然,如果你喜欢简单方便,也可以考虑使用FreeBSD自带的FTPd,功能和易用性也是不错的。如果你用户比较多,并且功能要求比较高,建议使用proFTPd、pure-FTPd、wu-FTPd等,但有些FTPd不是非常安全,选择时候一定要慎重考虑。

服务器程序列表:

Apache2.0.53下载地址:http://vsftpd.beasts.org

反正最少的服务+最少的端口+安全的设置=最大的安全,尽量能够不需要使用的服务就不要安装,比如telnetd、rlogind等,那么相反会对服务器安全构成威胁。

安装以上程序你可以采用手工编译安装,也可以采用FreeBSD的ports来进行安装,这看个人爱好,我个人比较喜欢使用手工安装,如果不明白具体安装的朋友可以参考我的Blog上关于安装Apache+PHP+Mysql的方法。

二、系统安全设置

1.用户控制

尽量少的用户,我们的FTP帐户是和系统帐户绑定在一起的,所以我们添加用户的时候先建立一个目录,然后把新建的用户主目录指向到该目录下。假设我需要一个用户能够管理我的网站,而我网站的目录是在/usr/www目录下,那么我们新建立的用户www_user的主目录就指向/usr/www目录,同时它的shell是没有的:/usr/sbin/nologin,主要是为了防止它通过ssh登陆到系统。同时FTP的密码也要设置的非常复杂,防止黑客通过暴力破解获得FTP权限。另外还要说道我们的root用户的密码,我想最少应该不要少于10位的数字+字母+字符的密码(我的密码是18位),否则是非常不安全的,如果密码简单,那么黑客通过短时间的暴力破解SSH中的root帐户,不用几天,系统就可能被攻破了,同时也建议最少一个月更改一次root用户的密码。(强烈建议一般帐户不要有登陆系统的权限,就是把shell设为/usr/sbin/nologin)

一般如果要使用root权限建议建立一个属于wheel组的小用户,然后登陆后通过su命令提升为root用户进行管理,如果黑客通过破解了我们普通用户的权限后登陆系统,也不能直接通过root权限进行管理,这是一种安全防范的简单方法。

2.文件访问控制

有时候被黑客入侵后拿到了小权限用户,比如传了一个WebShell到系统中,那么对方很可能会把/etc/passwd等内容直接读取出来,同时查看/etc/master.passwd中对加密后的root用户的密码hash进行破解,最后拿到密码进行登陆系统。那么我们就要控制部分文件只有root能够访问,其他用户无权访问。比如uname,gcc等,如果黑客拿到小权限用户后就会查看系统版本,然后找到该版本系统对应的溢出程序,使用gcc来进行编译,如果我们能够限制黑客访问uname和gcc等程序,能在一定程度上减缓黑客入侵的脚步。

使用chmod来改变某个文件的权限信息,比如我要/etc/passwd和/etc/master.passwd文件只能允许root访问:

使用八进制数字来设置

#chmod700/etc/passwd

#chmod700/etc/master.passwd

使用字符标记来进行设置

#chmodu+w+r+x,go-w-r-x/etc/passwd

#chmodu+w+r+x,go-w-r-x/etc/master.passwd

系统中有多个重要文件需要设置控制访问权限,一定要控制好,否则将会构成重要威胁。

3.系统服务和端口控制

端口开的越多就越给黑客多一个入侵的机会,服务越多,危险越大,因为你不知道那些服务是不是有潜在的漏洞或者又发现了新的漏洞,所以尽量少的服务,比如sendmail默认是打开的,那么些建议你把sendmail关闭,关闭防范是在/etc/rc.conf中加上:

sendmail_enable=”NONE”,如果设为”NO”那么只能够关闭掉pop3服务,不能关闭smtp的服务,所以要设置为”NONE”.

系统中最好除了我们能够看到的Apache、Mysql、vsFTPd、SSH之外不要打开其他任何端口和服务。基本的方式是使用netstat-a查看打开的端口,然后从对应的端口来找相关的服务,比如我们这里应该只允许开的端口有21,22,80,3306等,如果有其他端口,那么一定要仔细检查,很可能是黑客的后门或者是会对系统安全构成威胁的服务。同时有些服务不需要监听网络连接的话,只是需要本地的连接,比如Mysql,那么就可以关闭Socket监听,这个将在Mysql安全设置中讲解,另外,可以通过防火墙来控制部分端口访问和连接状况,比如Mysql的3306端口只允许192.168.0.1访问,那么我们就在ipfw里添加规则:

ipfwadd10001allowtcpfrom192.168.0.1to10.10.10.180in

这样就能够防止黑客来访问服务器上的Mysql服务。具体防火墙的设置将在下面“防火墙设置”中详细讲解。

4.日志管理和控制(略)

 

#p#分页标题#e#

 

5.文件指纹检测

文件指纹就是我们文件的基本信息,比如文件权限、文件所属用户/组、文件最后修改日期、文件大小等等,这些都是重要信息,一般黑客入侵后都可能修改文件,那么文件指纹就不一样了。另外,文件的md5校验值也属于文件的指纹的一种。

为了防止黑客篡改系统中的部分核心文件,比如/etc/passwd,/etc/shadow,/etc/inetd.conf等等,那么我们就可以考虑把部分重要文件进行备份,同时做一份目前有的文件的一个指纹保留,比如把/etc,/bin,/usr/bin目录下的文件进行指纹保留:

#ls-l/etc>;/var/back/etc.txt#ls-l/bin>;/var/back/bin.txt#ls-l/bin>;/var/back/usrbin.txt

当然,还有就是给每个重要的文件加上md5校验值,如果觉得不对劲的时候就进行匹配,保证文件的安全。

你可以给你觉得需要做指纹备份的目录进行备份,一般这是为了以后被黑客入侵后的系统检测和系统恢复。比如可以通过文件被修改的时间来确定是不是被入侵,比如可以对比看/etc/inetc.conf文件和备份的文件有什么不同来确定是不是安装了服务型后门等。

6.系统指纹泄漏和防范

一般黑客为了入侵某个系统,一定会先进行扫描等工作,扫描包括目标系统的端口开放情况和服务器使用服务程序和操作系统情况。比如很简单的手工检测Web服务的指纹:

#telnettarget.com80

那么就很可能返回Apache和PHP的版本信息,那么同时也可能使用扫描工具对Mysql、vsFTPd、SSH等服务的端口进行扫描,获取这些服务的指纹。多暴露一份系统信息,那么系统就多一份危险。那么解决办法就是把服务器上服务程序的Banner全部修改掉,从而能够迷惑黑客。

下面简单的说一些修改那些服务Banner的方法。

*Apache

修改httpd.conf文件,设置以下选项:

ServerSignatureOff

ServerTokensProd

上面的适用apache1***,apache2.0这些都是默认,不过还是有server=Apache字样,若要完全去掉需重新編译。

彻底地去掉banner,修改httpd.h:

Include/httpd.h

DefineSERVER_BASEVENDOR”ApacheGroup”

DefineSERVER_PRODUCTVENDOR”Apache”

DefineSERVER_BASEVERSION”1.3.27″

后从新编译Apache就能够完全去掉了。

*PHP

在php.ini中设置expose_php=Off,那么将无法在http头信息中看到php的版本信息。

*Mysql

*vsFTPd

vsFTPd基本上是无法获取到一些关于vsFTPd的banner信息的,不过因为vsFTPd默认的banner信息是”WelcometoFTPServer!”对于高手来说,还是能够猜测到一点,所以我们要彻底改掉。修改vsFTPd的配置文件vsftpd.conf中的下面选项:

Ftpd_banner=xxxxx

把后面的xxxxx改为你想要的banner信息。

*SSH

好象FreeBSD下默认安装的SSH被telnettarget.com22的时候会显示SSH和FreeBSD的信息,简直是个大祸害,什么都告诉别人了,但是目前为止我还不知道怎么修改,知道的高手请指点。

7.系统内核安全

FreeBSD有个比较强的功能,就是能够定义系统内核的安全等级,主要是为了防止内核后门专门定制的,能通过不同的等级限制对内核的访问和对防火墙等的修改。我们首先要开启系统的安全等级,然后设定安全等级,我们打开/etc/rc.conf:

#ee/etc/rc.conf

加入下面的内容:

kern_securelevel_enable=”YES”

kern_securelevel=”-1″

第一句是打开安全等级,第二句是定义等级。它一共五个等级,下面说说不同之处。

*kern_securelevel-1:这是系统默认级别,没有提供任何内核的保护错误;

*kern_securelevel0:基本上作用不多,当你的系统刚启动就是0级别的,当进入多用户模式的时候就自动变成1级了。

*kern_securelevel1:在这个级别上,有如下几个限制:

a.不能通过kldload或者kldunload加载或者卸载可加载内核模块;

b.应用程序不能通过/dev/mem或者/dev/kmem直接写内存;

c.不能直接往已经装在(mounted)的磁盘写东西,也就是不能格式化磁盘,但是可以通过标准的内核接口执行写操作;

d.不能启动X-windows,同时不能使用chflags来修改文件属性;

*kern_securelevel2:在1级别的基础上还不能写没装载的磁盘,而且不能在1秒之内制造多次警告,这个是防止DoS控制台的;

*kern_securelevel3:在2级别的级别上不允许修改IPFW防火墙的规则。

如果你已经装了防火墙,并且把规则设好了,不轻易改动,那么建议使用3级别,如果你没有装防火墙,而且还准备装防火墙的话,不建议使用。我们这里推荐使用2级别,能够避免比较多对内核攻击。

8.系统安全优化

一般优化系统主要是重新编译内核,去掉一些不要的驱动等等,你可以参考我在我Blog上写的关于编译内核的文章。我们这里对网络和内核一些选项进行优化和安全设置。编辑/etc/sysctl.conf文件,在里面加入如下内容:(有注释)

#最大的待发送TCP数据缓冲区空间

net.inet.tcp.sendspace=65536

#最大的接受TCP缓冲区空间

net.inet.tcp.recvspace=65536

#最大的接受UDP缓冲区大小

net.inet.udp.sendspace=65535

#最大的发送UDP数据缓冲区大小

net.inet.udp.maxdgram=65535

#本地套接字连接的数据发送空间

net.local.stream.sendspace=65535

#加快网络性能的协议

net.inet.tcp.rfc1323=1

net.inet.tcp.rfc1644=1

net.inet.tcp.rfc3042=1

net.inet.tcp.rfc3390=1

#最大的套接字缓冲区

kern.ipc.maxsockbuf=2097152

#系统中允许的最多文件数量

kern.maxfiles=65536

#每个进程能够同时打开的最大文件数量

kern.maxfilesperproc=32768

#当一台计算机发起TCP连接请求时,系统会回应ACK应答数据包。该选项设置是否延迟ACK应答数据包,把它和包含数据的数据包一起发送,在高速网络和低负载的情况下会略微提高性能,但在网络连接较差的时候,对方计算机得不到应答会持续发起连接请求,反而会降低性能。

net.inet.tcp.delayed_ack=0

#屏蔽ICMP重定向功能

net.inet.icmp.drop_redirect=1

net.inet.icmp.log_redirect=1

net.inet.ip.redirect=0

net.inet6.ip6.redirect=0

#防止ICMP广播风暴

net.inet.icmp.bmcastecho=0

net.inet.icmp.maskrepl=0

#限制系统发送ICMP速率

net.inet.icmp.icmplim=100

#安全参数,编译内核的时候加了optionsTCP_DROP_SYNFIN才可以用

net.inet.icmp.icmplim_output=0

net.inet.tcp.drop_synfin=1

#设置为1会帮助系统清除没有正常断开的TCP连接,这增加了一些网络带宽的使用,但是一些死掉的连接最终能被识别并清除。死的TCP连接是被拨号用户存取的系统的一个特别的问题,因为用户经常断开modem而不正确的关闭活动的连接

net.inet.tcp.always_keepalive=1

#若看到net.inet.ip.intr_queue_drops这个在增加,就要调大net.inet.ip.intr_queue_maxlen,为0最好

net.inet.ip.intr_queue_maxlen=1000

#防止DOS攻击,默认为30000

net.inet.tcp.msl=7500

#接收到一个已经关闭的端口发来的所有包,直接drop,如果设置为1则是只针对TCP包

net.inet.tcp.blackhole=2

#接收到一个已经关闭的端口发来的所有UDP包直接drop

net.inet.udp.blackhole=1

#为网络数据连接时提供缓冲

net.inet.tcp.inflight.enable=1

#如果打开的话每个目标地址一次转发成功以后它的数据都将被记录进路由表和arp数据表,节约路由的计算时间,但会需要大量的内核内存空间来保存路由表

net.inet.ip.fastforwarding=0

#kernel编译打开optionsPOLLING功能,高负载情况下使用低负载不推荐SMP不能和polling一起用

#kern.polling.enable=1

#并发连接数,默认为128,推荐在1024-4096之间,数字越大占用内存也越大

kern.ipc.somaxconn=32768

#禁止用户查看其他用户的进程

security.bsd.see_other_uids=0

#设置kernel安全级别

kern.securelevel=0

#记录下任何TCP连接

net.inet.tcp.log_in_vain=1

#记录下任何UDP连接

net.inet.udp.log_in_vain=1

#防止不正确的udp包的攻击

net.inet.udp.checksum=1

#防止DOS攻击

net.inet.tcp.syncookies=1

#仅为线程提供物理内存支持,需要256兆以上内存

kern.ipc.shm_use_phys=1

#线程可使用的最大共享内存

kern.ipc.shmmax=67108864

#最大线程数量

kern.ipc.shmall=32768

#程序崩溃时不记录

kern.coredump=0

#lo本地数据流接收和发送空间

net.local.stream.recvspace=65536

net.local.dgram.maxdgram=16384

net.local.dgram.recvspace=65536

#数据包数据段大小,ADSL为1452.

net.inet.tcp.mssdflt=1460

#为网络数据连接时提供缓冲

net.inet.tcp.inflight_enable=1

#数据包数据段最小值,ADSL为1452

net.inet.tcp.minmss=1460

#本地数据最大数量

net.inet.raw.maxdgram=65536

#本地数据流接收空间

net.inet.raw.recvspace=65536

#ipfw防火墙动态规则数量,默认为4096,增大该值可以防止某些病毒发送大量TCP连接,导致不能建立正常连接

net.inet.ip.fw.dyn_max=65535

#设置ipf防火墙TCP连接空闲保留时间,默认8640000(120小时)

net.inet.ipf.fr_tcpidletimeout=864000

 

#p#分页标题#e#

 

三、服务程序的安全设置

到这里就是本文的重点所在了,我们将花费比较多的文字进行描述,当然,所以描述不一定是非常正确的,也希望能够对你有一些帮助。我们系统默认是运行了包括Apache、Mysql、vsFTPd,SSH等服务,我们以下进行一一讲解。

1.Apache的安全设置

Apache的核心设置就是在httpd.conf里面,我们安装的Apache的目录是在/usr/local/apache2/下,那么我们的配置文件就是在/usr/local/apache2/conf/httpd.conf,如果你是使用ports等安装的,配置文件应该是在/etc或/usr/local/etc目录下。使用ee或者vi打开配置文件:

#ee/usr/local/apache2/conf/httpd.conf

下面我们就要进行比较多的安全设置了,基本的服务、端口、主目录等等设置就不说了,只讲与安全有关的设置。

(1)指定运行Apache服务的用户和组

这是比较重要的,因为权限是继承的,如果运行Apache服务的用户权限太高,那么很可能使得入侵者通过WebShell等就会对系统构成严重威胁。一般我们运行Apache的是nobody用户和nobody组。在httpd.conf的250-275行之间找到User和Group选项,比如我们默认设置如下(去掉了注释信息):

<IfModule!mpm_winnt.c>;

<IfModule!mpm_netware.c>;

Usernobody

Group#-1

</IfModule>;

</IfModule>;

(2)Apache的日志文件

Apache的日志文件是非常重要的,可以发现apache的运行状况和访问情况,对于判断入侵等有重要帮助。它的默认选项是:

#错误日志存放目录,默认是存放在apache安装目录的logs下

ErrorLoglogs/error_log

#日志记录的级别,级别有debug,info,notice,warn,error,crit等,默认是“warn”级别

LogLevelwarn

#访问日志记录的格式,每一种格式都有不同的内容,根据你的需要进行定制,以获取最多访问信息

LogFormat”%h%l%u%t\”%r\”%>;s%b\”%{Referer}i\”\”%{User-Agent}i\”"combined

LogFormat”%h%l%u%t\”%r\”%>;s%b”common

LogFormat”%{Referer}i->;%U”referer

LogFormat”%{User-agent}i”agent

#使用上面格式的那一种,默认是使用common

CustomLoglogs/access_logcommon

文件格式预定义的格式内容:

%a远程用户IP

%A本地httpd服务器的ip

%f传送的文件名

%h远程主机

%m请求方式

%lidentd给出的远程名

%p连接的httpd端口号

%P请求的httpd进程

%t时间

%T服务请求时间

你可以定制自己的日志格式,然后通过CustomLoglogs/access_logcommon来进行调用。

注意,日志文件是由运行Apache的用户进行打开的,要注意该文件的安全,防止被黑客改写或者删除。

(3)Apache服务信息显示控制

在配置文件中有个选项是控制是否显示apache版本信息、主机名称、端口、支持的cgi等信息的:

ServerSignatureOn

默认为On,那么将显示所有信息:

我故意访问一个不存在的文件:

但是这也给了黑客利用一些不安全的cgi程序来进行破坏,所以如果你不需要cgi的话,建议关闭该选项:

#ScriptAlias/cgi-bin/”/usr/local/apache/cgi-bin/”

(7)控制PHP脚本只能访问指定目录

在httpd.conf添加如下内容:

php_admin_valueopen_basedir/usr/www

后面的路径是你需要PHP脚本能够访问的目录,如果PHP脚本想要访问其他目录将出项错误提示。

(目录访问控制(未完)

这项内容最复杂,同时涉及的东西也比较多,我只能简单说一下,不清楚请参考其他文章。

比如下面的内容:

<Directory/>;

OptionsFollowSymLinks

AllowOverrideNone

</Directory>;

就是允许访问每一个目录,里面设置的是允许执行的动作,一般包含的动作有:Options、AllowOverride、Order、Allow、Deny.

Options是只对指定目录及其子目录能够执行的操作,Indexes、Includes、FollowSymLinks、ExecCGI、MultiViews、None、All等操作。

AllowOverride是指定目录访问的权限,当然也可以通过AccessFileName文件指定的.htaccess来控制。它的操作有:None、All、Options、FileInfo、AuthConfit、Limit等。

Order、Allow、Deny三个指令必须配合来控制目录访问权限。Order指定检查次序的规则,比如OrderAllow,Deny,表示先按Allow检查,如果不匹配再按Deny进行检查。OrderDeny,Allow,表示先按Deny规则检查,如果不满足条件,再按Allow进行检查。

 

#p#分页标题#e#

 

控制目录访问权限的文件

默认在Unix平台下能够使用.htaccess来对目录权限进行规则定义,但是这是不安全的,建议关闭,默认的选项:

AccessFileName.htaccess

建议设成:

#AccessFileName.htaccess

全部目录权限定义使用httpd.conf中的定义,不使用.htaccess.

(9)用户访问认证

这个技术非常重要,能够控制一些非法用户访问本内容。假设我们的网站:

authuserfile/usr/local/apache/bin/admin.dat

requireuserlogin_user

OptionsIndexesFollowSymlinksMultiViews

AllowOverrideNone

</Directory>;

上面我们就设置了我们的/usr/www/admin目录是必须进行认证才能访问的,接着我们设置访问密码:

#/usr/local/apahche/bin/htpasswd-c/usr/local/apache/bin/admin.datlogin_name

Newpassword:*****

Re-typenewpassword:*****

Addingpasswordforuserlogin_name

那么下次任何用户访问root@localhost=password(’test’);

这时root用户的口令就被改成test了。

*直接修改user表的root用户口令

mysql>;usemysql;

mysql>;updateusersetpassword=password(’test’)whereuser=’root’;

mysql>;flushprivileges;

这样,MySQL数据库root用户的口令也被改成test了。其中最后一句命令flushprivileges的意思是强制刷新内存授权表,否则用的还是缓冲中的口令,这时非法用户还可以用root用户及空口令登陆,直到重启MySQL服务器。

(2)删除默认的数据库和用户

我们的数据库是在本地,并且也只需要本地的php脚本对mysql进行读取,所以很多用户不需要。mysql初始化后会自动生成空用户和test库,这会对数据库构成威胁,我们全部删除。

我们使用mysql客户端程序连接到本地的mysql服务器后出现如下提示:

mysql>;dropdatabasetest;

mysql>;usemysql;

mysql>;deletefromdb;

mysql>;deletefromuserwherenot(host=”localhost”anduser=”root”;

mysql>;flushprivileges;

(3)改变默认mysql管理员的名称

这个工作是可以选择的,根据个人习惯,因为默认的mysql的管理员名称是root,所以如果能够修改的话,能够防止一些脚本小子对系统的穷举。我们可以直接修改数据库,把root用户改为”admin”

mysql>;usemysql;

mysql>;updateusersetuser=”admin”whereuser=”root”;

mysql>;flushprivileges;

(4)提高本地安全性

提高本地安全性,主要是防止mysql对本地文件的存取,比如黑客通过mysql把/etc/passwd获取了,会对系统构成威胁。mysql对本地文件的存取是通过SQL语句来实现,主要是通过LoadDATALOCALINFILE来实现,我们能够通过禁用该功能来防止黑客通过SQL注射等获取系统核心文件。

禁用该功能必须在my.cnf的[mysqld]部分加上一个参数:

set-variable=local-infile=0

(5)禁止远程连接mysql

因为我们的mysql只需要本地的php脚本进行连接,所以我们无需开socket进行监听,那么我们完全可以关闭监听的功能。

有两个方法实现:

*配置my.cnf文件,在[mysqld]部分添加skip-networking参数

*mysqld服务器中参数中添加——skip-networking启动参数来使mysql不监听任何TCP/IP连接,增加安全性。如果要进行mysql的管理的话,可以在服务器本地安装一个phpMyadmin来进行管理。

(6)控制数据库访问权限

对于使用php脚本来进行交互,最好建立一个用户只针对某个库有update、select、delete、insert、droptable、createtable等权限,这样就很好避免了数据库用户名和密码被黑客查看后最小损失。

比如下面我们创建一个数据库为db1,同时建立一个用户test1能够访问该数据库。

mysql>;createdatabasedb1;

mysql>;grantselect,insert,update,delete,create,dropprivilegesondb1.*totest1@localhostidentifiedby’admindb’;

以上SQL是创建一个数据库db1,同时增加了一个test1用户,口令是admindb,但是它只能从本地连接mysql,对db1库有select,insert,update,delete,create,drop操作权限。

(7)限制一般用户浏览其他用户数据库

如果有多个数据库,每个数据库有一个用户,那么必须限制用户浏览其他数据库内容,可以在启动MySQL服务器时加——skip-show-database启动参数就能够达到目的。

(忘记mysql密码的解决办法

如果不慎忘记了MySQL的root密码,我们可以在启动MySQL服务器时加上参数——skip-grant-tables来跳过授权表的验证(。/safe_mysqld——skip-grant-tables&,这样我们就可以直接登陆MySQL服务器,然后再修改root用户的口令,重启MySQL就可以用新口令登陆了。

(9)数据库文件的安全

我们默认的mysql是安装在/usr/local/mysql目录下的,那么对应的数据库文件就是在/usr/local/mysql/var目录下,那么我们要保证该目录不能让未经授权的用户访问后把数据库打包拷贝走了,所以要限制对该目录的访问。

我们修改该目录的所属用户和组是mysql,同时改变访问权限:

#chown-Rmysql.mysql/usr/local/mysql/var

#chmod-Rgo-rwx/usr/local/mysql/var

(10)删除历史记录

执行以上的命令会被shell记录在历史文件里,比如bash会写入用户目录的。bash_history文件,如果这些文件不慎被读,那么数据库的密码就会泄漏。用户登陆数据库后执行的SQL命令也会被MySQL记录在用户目录的。mysql_history文件里。如果数据库用户用SQL语句修改了数据库密码,也会因。mysql_history文件而泄漏。所以我们在shell登陆及备份的时候不要在-p后直接加密码,而是在提示后再输入数据库密码。

另外这两个文件我们也应该不让它记录我们的操作,以防万一。

#rm.bash_history.mysql_history

#ln-s/dev/null.bash_history

#ln-s/dev/null.mysql_history

(11)其他

另外还可以考虑使用chroot等方式来控制mysql的运行目录,更好的控制权限,具体可以参考相关文章。

 

#p#分页标题#e#

 

4.vsFTPd安全设置

vsFTPd是一款非常著名的ftpdaemon程序,目前包括Redhat.com在内很多大公司都在使用,它是一款非常安全的程序,因为它的名字就叫:VerySecureFTPDaemon(非常安全的FTP服务器)。

vsftpd设置选项比较多,涉及方方面面,我们下面主要是针对安全方面进行设置。

目前我们的需求就是使用系统帐户同时也作为是我们的FTP帐户来进行我们文件的管理,目前假设我只需要一个帐户来更新我的网站,并且我不希望该帐户能够登陆我们的系统,比如我们的网站的目录是在/usr/www下面,那么我们新建一个用户ftp,它的主目录是/usr/www,并且它的shell是/usr/sbin/nologin,就是没有shell,防止该用户通过ssh等登陆到系统。

下面在进行系统详尽的设置,主要就是针对vsftpd的配置文件vsftpd.conf文件的配置。

(1)禁止匿名用户访问,我们不需要什么匿名用户,直接禁止掉:

anonymous_enable=NO

(2)允许本地用户登陆,因为我们需要使用ftp用户来对我们网站进行管理:

local_enable=YES

(3)只允许系统中的ftp用户或者某些指定的用户访问ftp,因为系统中帐户众多,不可能让谁都访问。

打开用户文件列表功能:

userlist_enable=YES

只允许用户文件列表中的用户访问ftp:

userlist_deny=NO

用户名文件列表路径:

userlist_file=/etc/vsftpd.user_list

然后在/etc下建立文件vsftpd.user_list文件,一行一个,把用户ftp加进去,同时也可以加上你允许访问的系统帐户名。

(4)禁止某些用户登陆ftp:

pam_service_name=vsftpd

指出VSFTPD进行PAM认证时所使用的PAM配置文件名,默认值是vsftpd,默认PAM配置文件是/etc/pam.d/vsftpd.

/etc/vsftpd.ftpusers

VSFTPD禁止列在此文件中的用户登录FTP服务器,用户名是一行一个。这个机制是在/etc/pam.d/vsftpd中默认设置的。

这个功能和(3)里的功能有点类似,他们俩能结合使用,那样就最好了。

(5)把本地用户锁定在自己的主目录,防止转到其他目录,比如把/etc/passwd给下载了:

chroot_local_users=NO

chroot_list_enable=YES

chroot_list_file=/etc/vsftpd.chroot_list

然后在/etc下建立vsftpd.chroot_list文件,里面把我们要限制的本地帐户加进去,一行一个,我们加上ftp,防止它登陆到系统。

(6)隐藏文件真实的所有用户和组信息,防止黑客拿下ftp后查看更多系统用户信息:

hide_ids=YES

(7)取消ls-R命令,节省资源,因为使用该命令,在文件列表很多的时候将浪费大量系统资源:

ls_recurse_enable=NO

(上传文件的默认权限,设置为022:

local_umask=022

如果要覆盖删除等,还要打开:

write_enable=YES

(9)ftp的banner信息,为了防止黑客获取更多服务器的信息,设置该项:

ftpd_banner=bannerstring

把后面的bannerstring设为你需要的banner提示信息,为了安全,建议不要暴露关于vsFTPd的任何信息。

另外,如果你的信息比较多的话,可以设置为提示信息是读取一个文件中的信息:

banner_file=/directory/vsftpd_banner_file

(10)打开日志功能:

xferlog_enable=YES

同时设置日志的目录:

xferlog_file=/var/log/vsftpd.log

启用详细的日志记录格式:

xferlog_enable=YES

(11)如果打开虚用户功能等,那么建议关闭本地用户登陆:

local_enable=NO

vsFTPd还有很多安全设置,毕竟人家的名字就是:VerySecureFTPDaemon,反正它的溢出漏洞什么的是很少的,如果要更安全,建议按照自己的需要设置vsftpd,设置的好,它绝对是最安全的。

5.SSH安全设置

SSH是一个基于SSL的安全连接远程管理的服务程序,主要出现就是为了解决telnet、rlogin、rsh等程序在程序交互过程中存在明文传输易被监听的问题而产生的,目前基本上是推荐使用ssh来代替telnet、rlogin、rsh等远程管理服务。

ssh能够直接在windows平台下通过SecureSSHClient等客户端工具进行连接管理,目前最流行的服务器端就是OpenSSH程序,目前最新版本是OpenSSH4.0版,详细可以参考

firewall_enable=”YES”#激活firewall防火墙

firewall_script=”/etc/rc.firewall”#firewall防火墙的默认脚本

firewall_type=”/etc/ipfw.conf”#firewall自定义脚本

firewall_quiet=”NO”#起用脚本时,是否显示规则信息。现在为“NO”假如你的防火墙脚本已经定型,那么就可以把这里设置成“YES”了。

firewall_logging_enable=”YES”#启用firewall的log记录。

设置完成后我们再编辑/etc/syslog.conf文件:

#ee/etc/syslog.conf

加入以下行:

!ipfw

*.*/var/log/ipfw.log

现在到了最重要的编辑规则包了:

#ee/etc/ipfw.conf

我们添加一下规则:(注意10.10.10.1是我们服务器的IP)

#########TCP##########

add00001denylogipfromanytoanyipoptrr

add00002denylogipfromanytoanyipoptts

add00003denylogipfromanytoanyipoptssrr

add00004denylogipfromanytoanyipoptlsrr

add00005denytcpfromanytoanyintcpflagssyn,fin

#这5行是过滤各种扫描包

add10001allowtcpfromanyto10.10.10.180in#向整个Internet开放http服务。

add10002allowtcpfromanyto10.10.10.121in#向整个Internet开放ftp服务。

add10000allowtcpfrom1.2.3.4to10.10.10.122in

#向Internet的xx.xx.xx.xx这个IP开放SSH服务。也就是只信任这个IP的SSH登陆。

#如果你登陆服务器的IP不固定,那么就要设为:add10000allowtcpfromanyto10.10.10.122in

add19997check-state

add19998allowtcpfromanytoanyoutkeep-statesetup

add19999allowtcpfromanytoanyout#这三个组合起来是允许内部网络访问出去,如果想服务器自己不和Internet进行tcp连接出去,可以把19997和19998去掉。(不影响Internet对服务器的访问)

##########UDP##########

add20001allowudpfromany53to10.10.10.1#允许其他DNS服务器的信息进入该服务器,因为自己要进行DNS解析嘛~

add29999allowudpfromanytoanyout#允许自己的UDP包往外发送。

##########ICMP#########

add30000allowicmpfromanytoanyicmptypes3

add30001allowicmpfromanytoanyicmptypes4

add30002allowicmpfromanytoanyicmptypes8out

add30003allowicmpfromanytoanyicmptypes0in

add30004allowicmpfromanytoanyicmptypes11in

#允许自己ping别人的服务器。也允许内部网络用router命令进行路由跟踪。

 

#p#分页标题#e#

 

五、Unix/Linux上的后门技术和防范

对黑客来讲,入侵一个系统只是万里长征的开始,最主要的是长期占有一个肉鸡(傀儡机),所以,后门技术往往非常重要。对于我们来讲,总是处于被动的地位,百密一疏,总有没有做到位的地方,谁都不能保证自己的系统是绝对安全的,所以不能避免我们可能会被入侵。黑客入侵后肯定会留后门,当然,除了那些高手,境界非常高,入侵只是为了测试或者技术挑战,对于一般黑客来讲,入侵之后留个后门是很重要的,我们要防范,当然就要了解常用的后门技术,下面就简单的讲将在Unix/Linux系统中比较常见的后门技术。

1.帐号后门

最普通和原始的后门技术,一般就是在系统中添加一个管理员帐户。

#echo”heiyeluren:*:0:0::/root:/bin/sh”>;>;/etc/passwd

#echo”heiyeluren::0:0::0:0::/root:/bin/sh”>;>;/etc/shadow

给系统增加一个uid和gid都为0(root)的帐号,无口令。

FreeBSD的密码是存储在/etc/master.passwd里面的,那么后面的命令就应该改成:

#echo”heiyeluren:::::::::”>;>;/etc/master.passwd

也可以使用程序来实现:

/*Addsuperuser*/

#include”stdio.h”

#definePASSWD_PATH”/etc/passwd”

#defineSHADOW_PATH”/etc/master.passwd”

main()

{

FILE*fd;

fd=fopen(PASSWD_PATH,”a+”;

fprintf(fd,”heiyeluren:*:0:0::/root:/bin/sh\n”;

fclose(fd);

fd=fopen(SHADOW_PATH,”a+”;

fprintf(fd,”heiyeluren::0:0::0:0::/root:/bin/sh\n”;

fclose(fd);

}

#gcc-oadduseradduser.c

#./adduser

这种方法比较傻,一般比较容易发现,特别是系统帐户不多的时候。也有的用户名起的比较迷惑人,比如起个r00t的用户名,uid和gid都是0,这样如果不注意,可能就会被蒙混过关了。

*防范方法:

这种方法虽然比较容易发现,但是我们还是要防范,要多注意观察系统的帐户情况,本来我们系统帐户就不多,检查起来比较方便,另外也要注意那些比较少使用的帐户是不是被更改过,比如默认的帐户有bind,它的shell是/usr/sbin/nologin,就是不能登陆的,但是黑客入侵后把它改了,比如改为/bin/csh,那么对方就能登陆了,但是你确不知道。所以最好办法是把/etc/passwd另外备份一份,不定期的检查,同时把/etc/passwd和/etc/master.passwd设为只有root才能查看。

2.shell后门

这个比较常用,也比较流行。一般就是把root执行的shell程序通过setuid的形式把shell程序拷贝到其他能够执行的地方,然后只要用小权限用户执行该shell就能够直接获取root权限。

比如:

#cp/bin/sh/tmp/.backdoor

#chownroot:root/tmp/.backdoor

#chmod+s/tmp/.backdoor

这样只是把sh复制了,如果你喜欢其他shell,比如ksh、csh也可以,具体你看各个不同的操作系统而定。你就可以把那个加了s标记的shell程序放到任何目录,最好是深一点,不容易被人发现的地方,比如/usr/local/share/man之类的目录,然后你使用小权限用户登陆后执行该shell就可以了,比如我们上面复制的shell,我们只要用小权限用户登陆后执行:

$/tmp/.backdoor

#

就可以了,当然,如何获得小权限用户,你可以使用暴力破解一些帐户,或者自己创建一个小权限的帐户。

*防范方法:

首先给各个主要目录加上我们上面说的文件指纹校验,知道某个目录下有什么文件,如果多出了可疑文件可以仔细检查。还有使用find命令来查找有没有危险的rootsuid程序:

find/-typef(-perm-4000-o-perm-2000)-print

3.Crontab服务后门

crontab命令就相当于windows下的at命令,定期执行某些任务。对黑客来讲,比如定期建立一个帐户,然后过多久就删除,这样管理员永远看不到系统中有后门,这样是非常保险的……

*防范方法:

cron的服务默认是存储在/var/spool/crontab/root目录下,定期检查cron服务,看是否有异常的任务在执行,或者如果你不使用cron的话,直接关闭掉它。

4.rhosts后门

Rhosts文件常常被黑客利用来制作后门,如果系统开了rlogin、rexec等r的服务,因为象rlogin这样的服务是基于rhosts文件里的主机名使用简单的认证方法,所以黑客只要将。rhosts文件设置成”++”,那么就允许任何人从任何地方使用该用户名,无须口令登陆513端口的rlogin服务就行。而且r之类的服务没有日志能力,不容易被发现。

实现方法:

#echo”++”>;/usr/heiyeluren/.rhosts

#rlogin-lheiyelurenlocalhost

这样就不需要任何密码,直接输入用户名heiyeluren就登陆到了系统。

*防范办法:

不要使用rlogin等服务,同时也不推荐使用telnet等服务,因为telnetd等守护进程溢出漏洞一堆,而且在数据传输过程中是没有加密的,很容易被嗅探,建议使用ssh等经过安全加密的服务来替代。

5.Login后门

login程序通常用来对telnet来的用户进行口令验证。入侵者获取login的原代码并修改使它在比较输入口令与存储口令时先检查后门口令。如果用户敲入后门口令,它将忽视管理员设置的口令让你长驱直入。

*防范方法:

一般针对这类后门,一般都是使用”string”命令搜索login程序中是否有中是否有密码等字符串来进行检查。如果密码经过加密,那么就对login文件进行指纹记录和MD5值的记录,觉得异常时进行检测。

6.Bind后门

就是通过常用的网络连接协议TCP/UDP/ICMP来建立连接的后门,这个在Windows下可是轰轰烈烈。

比较普遍的有TCP协议的后门都是写一段程序开一个指定的端口进行监听,然后从客户端进行连接后登陆系统。也有黑客为了隐蔽使用UDP协议来连接。icmp后门也常见,一般是。有时候可能bind后门跟服务后门结合,黑客通过自己写的bind后门来替换inetd中的服务。

*防范方法:

经常使用netstat命令检查有没有非法的端口打开,最好直接用防火墙屏蔽除了正常访问的端口之外的端口。对于ping后门的话,直接在防火墙上禁止ping服务器

7.服务后门

一般是替换或者添加服务来实现后门。比如在/etc/inetd.conf中添加或者替换某个服务来运行自己的后门程序,或者在某些服务中加入自己的后门代码。如果是替换服务的话,该服务必须不被使用,而且不容易发现。如果是自己添加的服务,那么必须在/etc/services中设置对应的服务和端口才能使用。

*防范方法:

经常检查服务,最好备份/etc/inetd.conf、/etc/services等文件,同时在FreeBSD下也要时常检查/usr/loca/etc/rc.d下面的脚本是否是合法的并且是否那些脚本里面有没有启动非法程序。如果是在服务程序中添加自己的代码,那么就要对文件的指纹进行校验,比如md5值看是否匹配。

8.rootkit后门

rootkit后门一般是替换管理员使用的工具,比如ls、ps、netstat、who等常用文件,把那些程序替换成被黑客加了特殊代码的程序,那样就能达到控制的效果。而且现在已经有很多现成能下载使用的rootkit.

*防范方法:

按照我们前面的方法,给每个文件建立系统指纹档案和md5校验值,如果觉得不对劲的时候查看文件指纹是否匹配,有没有别修改过,就知道是否着了rootkit的道。

9.内核后门

通过加载内核模块的方式来加载后门,比较复杂。一般内核后门都是针对操作系统而言的,不同的操作系统内核模块设置编写方法都不一样,一般不通用。内核后门一般无法通过md5校验等来判断,所有基本比较难发现,目前针对内核后门比较多的是Linux和Solaris下。

*防范方法:

FreeBSD下通过我们上面讲的设置内核安全等级来控制加载内核模块。

10.其他后门

还有包括。forward等其他各类后门,另外很多后门可能是结合多种技术,比如把rootkit和内核后门结合在一起,实际过程中,黑克是会更难对付的。当然还有许多我们没有发现高手独门秘诀,这需要灵活检查,不过只要勤劳一点,安全会提升很多。

六、结束语

安全是一个整体,即使那么服务你设置的非常安全,但是不能保证永远安全,安全是动态的,必须不断的充实自己的知识,发现新漏洞、新技术。如果你需要更安全的系统,一定要自己有时常能够手工作入侵检测或者使用部分工具帮助你进行入侵检测。同时推荐你安装一些网络入侵检测系统(NIDS),比如Snort.

转载请注明:红方博客 » FreeBSD下构建安全的Web服务器