Linux如何阻止系统攻击者(一)
时间:2007-02-17 来源:PHP爱好者
当你安装一台Linux系统,你就拥有了一个强大的、高级的、多任务的网络操作系统。但是该系统功能有些过于强大了.某些发布版本缺省启动很多服务(如:rlogind, inetd, httpd, innd, fingerd, timed, rhsd,等等)。作为系统管理员需要熟悉了解这些服务。如果你的机器连接到了Internet的话你更需要关注你的系统安全。 大多数攻击者并不是一个革新者,他们往往利用最新的公布的系统工具技术等突破一个众所周知的或一个新的刚刚发现的安全漏洞。但作为一个管理者,通过访问你使用的Linux发布的官方站点如www.redhat.com/、http://www.calderasystems.com/等可以获知最新的安全漏洞及相应的补丁程序。也可以通过定期访问http://www.securityfocus.com/、http://www.cert.org/等安全漏洞通告站点。
最方便的的控制访问服务器的方法是通过一个叫TCP wrapper的程序。在大多数发布版本中该程序往往是缺省地被安装。利用TCP wrapper你可以限制访问前面提到的某些服务。而且TCP wrapper的记录文件记录了所有的企图访问你的系统的行为。通过last命令查看该程序的og管理员可以谁在企图连接你的系统。 在Linux的/etc目录下,有一个如下所示inetd.conf文件,该文件是TCP wrapper的配置文件,定义了TCP wrapper可以控制启动哪些服务。比如要将finger服务去除,就将finger服务的那一行注释掉(在前面加上"# "即可); # inetd。conf This file describes the services that will be available # through the INETD TCP/IP super server. To re-configure # the running INETD process, edit this file, then send the # INETD process a SIGHUP signal。
# service_name sock_type proto flags user server_path args
ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -a telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd # Finger, systat and netstat give out user information which may be 。。。 。。。 但是对于诸如sendmail,named等服务,由于它们不象finger,telnet等服务,在请求到来时由inet守护进程启动相应的进程提供服务,而是在系统启动时,作为守护进程运行的。在slackware版本的Linux,可以通过修改/etc/rc.d目录下的启动配置文件rc.M文件,将启动sendmail的命令行注释掉: #!/bin/sh # rc。M This file is executed by init(8) when the system is being # initialized for one of the "multi user" run levels (i.E. # levels 1 through 6). It usually does mounting of file # systems et al. # Start the sendmail daemon: # if [ -x /usr/sbin/sendmail ]; then # echo "Starting sendmail daemon (/usr/sbin/sendmail -bd -q 15m)… " # /usr/sbin/sendmail -bd -q 15m # fi 。。。。。。 对于诸如named等其他服务,也是通过将同一个目录下相应启动配置文件中相应的启动命令注释掉,从而当你重新启动机器时,相应的服务将不会启动。而对于高版本的redhat linux,提供了一个linuxconfig命令,可以通过它在图形界面下交互式地设置是否在启动时,运行相关服务。 但是对于telnet、ftp等服务,如果将其一同关闭,那么对于管理员需要远程管理时, 将非常不方便。Linux提供另外一种更为灵活和有效的方法来实现对服务请求用户的限制, 从而可以在保证安全性的基础上,使可信任用户使用各种服务。 在/etc目录下,有两个文件:hosts.deny hosts.allow 通过配置这两个文件,你可以指定 哪些机器可以使用这些服务,哪些不可以使用这些服务。 配置这两个文件是通过一种简单的访问控制语言来实现的,访问控制语句的基本格式为:
程序名列表,主机名/IP地址列表。
程序名列表指定一个或者多个提供相应服务的程序的名字,名字之间用逗号或者空格分割,可以在inetd.conf文件里查看提供相应服务的程序名:如上面的文件示例中,telent所在行的最后一项就是所需的程序名:in.telnetd 主机名/IP地址列表指定允许或者禁止使用该服务的一个或者多个主机的标识,主机名之间用逗号或空格分隔。程序名和主机地址都可以使用通配符,实现方便的指定多项服务和多个主机。 当服务请求到达服务器时,访问控制软件就按照下列顺序查询这两个文件,直到遇到一个匹配为止: 1. 当在/etc/hosts.allow里面有一项与请求服务的主机地址项匹配,那么就允许该主机获取该服务 2. 否则,如果在/etc/hosts.deny里面有一项与请求服务的主机地址项匹配,就禁止该主机使用该项服务 如果相应的配置文件不存在,访问控制软件就认为是一个空文件,所以可以通过删除或者移走配置文件实现对所有主机关闭所有服务。在文件中,空白行或者以#开头的行被忽略,你可以通过在行前加 # 实现注释功能。 Linux提供了下面灵活的方式指定进程或者主机列表: 1. 一个以"。"起始的域名串,如 .amms.ac.cn 那么www.amms.ac.cn就和这一项匹配成功 2. 以'.'结尾的IP串如 202.37.152. 那么IP地址包括202.37.152. 的主机都与这一项匹配 3. 格式为n.n.n.n/m.m.m.m表示网络/掩码,如果请求服务的主机的IP地址与掩码的位与的结果等于n.n.n.n 那么该主机与该项匹配。 4. ALL表示匹配所有可能性 5. EXPECT表示除去后面所定义的主机。如:list_1 EXCEPT list_2 表示list_1主机列表中除去List_2所列出的主机 6. LOCAL表示匹配所有主机名中不包含'。'的主机 上面的几种方式只是Linux提供的方式中的几种,但是对于我们的一般应用来说是足够了。我们通过举几个例子来说明这个问题: 例一:我们只希望允许同一个局域网的机器使用服务器的ftp功能,而禁止副广域网上面的ftp服务请求,本地局域网由 202.39.154. 、202.39.153. 和202.39.152. 三个网段组成。 在hosts.deny文件中,我们定义禁止所有机器请求所有服务: ALL:ALL 在hosts.allow文件中,我们定义只允许局域网访问ftp功能: in.ftpd -l -a: 202.39.154 202.39.153. 202.39.152. 这样,当非局域网的机器请求ftp服务时,就会被拒绝。而局域网的机器可以使用ftp服务。
ALL:ALL
然后重新启动你的 inetd进程:
/etc/rc.d/init.d/inet restart
但是hosts.deny文件只能控制/etc/inetd.conf文件中包含的服务的访问这些服务有/usr/bin/tcpd管理。wrapper监听接入的网络请求,然后与在hosts.allow和hosts.deny的中的服务比较,然后做出允许或拒绝的决定。 files, and makes a yes or no decision on what to allow through. 但是对于wrapper没有包含的服务你就需要采用其他方法了
非常全面的一个php技术网站,php爱好者站 http://www.phpfans.net 有相当丰富的文章和源代码.
最方便的的控制访问服务器的方法是通过一个叫TCP wrapper的程序。在大多数发布版本中该程序往往是缺省地被安装。利用TCP wrapper你可以限制访问前面提到的某些服务。而且TCP wrapper的记录文件记录了所有的企图访问你的系统的行为。通过last命令查看该程序的og管理员可以谁在企图连接你的系统。 在Linux的/etc目录下,有一个如下所示inetd.conf文件,该文件是TCP wrapper的配置文件,定义了TCP wrapper可以控制启动哪些服务。比如要将finger服务去除,就将finger服务的那一行注释掉(在前面加上"# "即可); # inetd。conf This file describes the services that will be available # through the INETD TCP/IP super server. To re-configure # the running INETD process, edit this file, then send the # INETD process a SIGHUP signal。
# service_name sock_type proto flags user server_path args
ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -a telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd # Finger, systat and netstat give out user information which may be 。。。 。。。 但是对于诸如sendmail,named等服务,由于它们不象finger,telnet等服务,在请求到来时由inet守护进程启动相应的进程提供服务,而是在系统启动时,作为守护进程运行的。在slackware版本的Linux,可以通过修改/etc/rc.d目录下的启动配置文件rc.M文件,将启动sendmail的命令行注释掉: #!/bin/sh # rc。M This file is executed by init(8) when the system is being # initialized for one of the "multi user" run levels (i.E. # levels 1 through 6). It usually does mounting of file # systems et al. # Start the sendmail daemon: # if [ -x /usr/sbin/sendmail ]; then # echo "Starting sendmail daemon (/usr/sbin/sendmail -bd -q 15m)… " # /usr/sbin/sendmail -bd -q 15m # fi 。。。。。。 对于诸如named等其他服务,也是通过将同一个目录下相应启动配置文件中相应的启动命令注释掉,从而当你重新启动机器时,相应的服务将不会启动。而对于高版本的redhat linux,提供了一个linuxconfig命令,可以通过它在图形界面下交互式地设置是否在启动时,运行相关服务。 但是对于telnet、ftp等服务,如果将其一同关闭,那么对于管理员需要远程管理时, 将非常不方便。Linux提供另外一种更为灵活和有效的方法来实现对服务请求用户的限制, 从而可以在保证安全性的基础上,使可信任用户使用各种服务。 在/etc目录下,有两个文件:hosts.deny hosts.allow 通过配置这两个文件,你可以指定 哪些机器可以使用这些服务,哪些不可以使用这些服务。 配置这两个文件是通过一种简单的访问控制语言来实现的,访问控制语句的基本格式为:
程序名列表,主机名/IP地址列表。
程序名列表指定一个或者多个提供相应服务的程序的名字,名字之间用逗号或者空格分割,可以在inetd.conf文件里查看提供相应服务的程序名:如上面的文件示例中,telent所在行的最后一项就是所需的程序名:in.telnetd 主机名/IP地址列表指定允许或者禁止使用该服务的一个或者多个主机的标识,主机名之间用逗号或空格分隔。程序名和主机地址都可以使用通配符,实现方便的指定多项服务和多个主机。 当服务请求到达服务器时,访问控制软件就按照下列顺序查询这两个文件,直到遇到一个匹配为止: 1. 当在/etc/hosts.allow里面有一项与请求服务的主机地址项匹配,那么就允许该主机获取该服务 2. 否则,如果在/etc/hosts.deny里面有一项与请求服务的主机地址项匹配,就禁止该主机使用该项服务 如果相应的配置文件不存在,访问控制软件就认为是一个空文件,所以可以通过删除或者移走配置文件实现对所有主机关闭所有服务。在文件中,空白行或者以#开头的行被忽略,你可以通过在行前加 # 实现注释功能。 Linux提供了下面灵活的方式指定进程或者主机列表: 1. 一个以"。"起始的域名串,如 .amms.ac.cn 那么www.amms.ac.cn就和这一项匹配成功 2. 以'.'结尾的IP串如 202.37.152. 那么IP地址包括202.37.152. 的主机都与这一项匹配 3. 格式为n.n.n.n/m.m.m.m表示网络/掩码,如果请求服务的主机的IP地址与掩码的位与的结果等于n.n.n.n 那么该主机与该项匹配。 4. ALL表示匹配所有可能性 5. EXPECT表示除去后面所定义的主机。如:list_1 EXCEPT list_2 表示list_1主机列表中除去List_2所列出的主机 6. LOCAL表示匹配所有主机名中不包含'。'的主机 上面的几种方式只是Linux提供的方式中的几种,但是对于我们的一般应用来说是足够了。我们通过举几个例子来说明这个问题: 例一:我们只希望允许同一个局域网的机器使用服务器的ftp功能,而禁止副广域网上面的ftp服务请求,本地局域网由 202.39.154. 、202.39.153. 和202.39.152. 三个网段组成。 在hosts.deny文件中,我们定义禁止所有机器请求所有服务: ALL:ALL 在hosts.allow文件中,我们定义只允许局域网访问ftp功能: in.ftpd -l -a: 202.39.154 202.39.153. 202.39.152. 这样,当非局域网的机器请求ftp服务时,就会被拒绝。而局域网的机器可以使用ftp服务。
ALL:ALL
然后重新启动你的 inetd进程:
/etc/rc.d/init.d/inet restart
但是hosts.deny文件只能控制/etc/inetd.conf文件中包含的服务的访问这些服务有/usr/bin/tcpd管理。wrapper监听接入的网络请求,然后与在hosts.allow和hosts.deny的中的服务比较,然后做出允许或拒绝的决定。 files, and makes a yes or no decision on what to allow through. 但是对于wrapper没有包含的服务你就需要采用其他方法了
非常全面的一个php技术网站,php爱好者站 http://www.phpfans.net 有相当丰富的文章和源代码.
相关阅读 更多 +