停止不必要的服务才是管理的第一步

概述

大多数服务器管理员将希望,对于自己运行的服务器,第一,服务不会停止,第二,不会被非法入侵。
特别是最近几年,由于报告了很多非法入侵的事例,所以想重新审视(再检查)一次服务器的安全性的读者也是其中的一员。

在这种情况下,最好是从OS的替换进行,进行考虑到安全性的设定。但是,实际上,既然为顾客等提供服务或作为基础服务器24小时满运转,就不能这么轻易地停止,这是现实。当然,如果服务器冗余,问题将被清除,但在大多数情况下,由于预算等关系,所有服务器都不能采取这样的配置。

在本文中,以现行运行的UNIX服务器为对象,介绍将运行服务的停止控制在最小限度的同时,提高、维持安全性的一系列设定和工具。

迈向安全服务器的第一步

作为成为安全服务器的第一步,首先要做的就是停止不必要的服务。这是一定要重新考虑的项目之一,以减少入侵服务器的可能性。

可能会认为,外部对不需要的服务的访问,因为它被上层路由器和防火墙屏蔽了,所以没问题。但是,考虑到内部的其他服务器被侵入,作为踏脚板被滥用的时候的情况,会怎么样呢?在这种情况下,不管在多高级别上被阻止,都被访问,因此有可能通过不必要的服务允许进一步入侵。当然,如果提供不必要服务的软件始终保持在安全版本中,则几乎不会被入侵。

确认现状

首先,从当前启动的服务的确认开始。在UNIX中,可以从执行进程和待机端口的状态知道。

确认进程(ps)

要了解服务器上正在运行哪些服务,只需确认正在运行的进程的状态即可。作为确认进程状态的方法,在UNIX中很早就知道ps命令。

ps命令中指定的选项根据UNIX系统而不同。如果是BSD系统,则可以指定-a和-x,如果是System V系统,则可以同时指定-e和-f。两者输出的内容几乎相同。

输出结果的最右边的CMD(BSD ps是COMMAND)部分,从服务器上实际怎样的服务(命令)运行着可以特定。

另外,如果想知道中途断开的CMD的输出,则只要指定-w(以132行显示)或-ww(全部显示)选项即可。

从上述例子的ps命令的输出结果可知,以下的服务正在工作中。从这些中,确定实际不需要的服务,停止。

进程停止条件
portmap如果不提供RPC服务
rpc.statd如果不提供NFS服务
sshd如果不进行远程登录
xinetd不进行由xinetd进行的访问控制等互联网服务的情况
sendmail如果不接收邮件
httpd不提供HTTP服务时

确认待机端口(netstat)

在运行中的服务(进程)中,特别是对于能够从外部访问的服务,需要充分的确认。许多UNIX可以通过netstat命令的-a选项来检查服务器上等待的TCP/UDP端口。因为会显示很多信息,所以使用less或more命令滚动屏幕会很容易看到。

表示Proto的tcp行的State是LISTEN,或者udp行的Local Address部分是待机中的端口。从输出结果可以看出,目标服务器上的下一个端口正在等待。从中找出不需要的服务使用的待机端口。

端口协议服务目的
22tcpOpenSSH (sshd)远程维护
25tcpSendmail邮件接收
80tcpApache (httpdHTTP服务
111tcp,udpportmapRPC端口地图
443tcpApache (httpd)Web服务
32768tcp,udpstatus (rpc.statd)NFS服务

同时确认进程和待机端口(lsof, socklist, sockstat)

将前面提到的ps和netstat两者组合起来的是lsof、socklist、sockstat这样的命令。这些与ps和netstat不同,在OS中没有标准安装,或者由于是OS固有的,所以使用是有限的,但是在运用上非常方便,所以要介绍一下。

lsof

使用lsof(LiSt Open File)命令的-i选项,可以确认执行过程使用的待机端口。这个命令也可以在其他UNIX上使用,包括Linux,所以如果没有安装,请获取源代码(包)并安装它。

指定的选项-n和-P可以被认为与netstat的-n同义。此外,如果指定-i选项,则需要root权限。

从输出结果可以看出,例如,sshd使用22/tcp,sendmail使用25/tcp端口。

socklist

Socklist是包含在许多Linux发行版中的Perl脚本,可以说是lsof的简单版本。没有特别的选项,只需以root权限执行命令。

sockstat

Sockstat是FreeBSD中包含的Perl脚本,由FreeBSD 3.1提供。通过指定-l选项,可以确认正在运行的命令和正在使用的待机端口。

识别不必要的服务

是否不需要的服务的判断根据该服务器的使用目的等而变化。例如,如果只提供HTTP服务即可,则可以判断邮件(Sendmail)或DNS(BIND)等服务不需要,除非有特别的理由。

这样,如果一个一个地调查待机端口的进程,自然就会知道不需要的服务是哪一种。有些人不知道这是不必要的服务,但是在这种情况下,如果使用man命令和Web搜索引擎,在很多情况下,所需的信息将通过它获得。

不必要的服务(过程)的选定结束后,作为最后的步骤实际停止这些不必要的服务。

Step.1:停止不必要的服务

kill、pkill

要停止正在运行的进程,如果是UNIX,通常使用kill命令。默认情况下,TERM(15)信号被发送到进程并停止。再次确认进程时进程已停止。

在最近的UNIX中,也使用了pkill命令。Pkill最初是在Solaris 7中实现的命令,但它也在最近的Linux和NetBSD中被采用。

启动脚本

在某些情况下,每个软件都预先准备了启动脚本,因此使用它启动/停止服务。在许多情况下,只需向启动脚本传递start(启动)/stop(停止)参数。

service

在Linux上,还可以通过service命令停止特定服务的进程。

Step.2:禁用启动脚本

在步骤.1的步骤中停止的情况下,即使此时服务(进程)停止,在下次启动OS时也会再次启动。为了不让它这样做,需要禁用启动脚本。

在大多数默认安装的软件中,启动脚本存储在/etc以下,或者存在用于启动的设置。下面介绍几个不同操作系统的例子。

Red Hat Linux

各种软件的启动脚本存储在/etc/rc.d/rc.d目录以下。意味着运行级别,如果在正常模式下启动,则应用/etc/inittab文件的initdefault运行级别。

$ grep initdefault: /etc/inittab
id:3:initdefault:

通常,由于指定了运行级别3,所以以/etc/rc.d/rc3.d或更小的S开头的脚本将被激活。例如,在sendmail的情况下,/etc/rc.d/rc3.d/S80sendmail对应。

这样,以S开头的文件作为启动脚本,以K开头的文件作为停止脚本执行。这只是在S的情况下传递start,在K的情况下将stop传递给启动脚本的参数。另外,以S和K开头的各脚本是符号链接,实体存储在/etc/rc.d/init.d以下。

ls -l /etc/rc.d/rc3.d/S80sendmail 
lrwxrwxrwx  1 root root 18 Sep 24  2002 
/etc/rc.d/rc3.d/S80sendmail -> ../init.d/sendmail 

要禁用这些启动脚本,可以将以S开头的文件名更改为别名,但是在红帽Linux的情况下,chkconfig被预先准备为用于轻松管理它们的命令。

# chkconfig --list sendmail
sendmail  0:off 1:off 2:on  3:on  4:on  5:on  6:off 

可以看出,运行级别2、3、4和5是有效的(On)。禁用所有这些(关闭)。

# chkconfig sendmail off
# chkconfig --list sendmail
sendmail  0:off 1:off 2:on  3:off 4:off 5:off 6:off 

运行级别2还没有关闭。尝试单独指定。

# chkconfig --level 2 sendmail off
# chkconfig --list sendmail
sendmail  0:off 1:off 2:off 3:off 4:off 5:off 6:off 

这次关了。这样,从下次OS启动时开始sendmail就不会启动。

Solaris 2.x

Solaris2.x与前面提到的红帽Linux具有基本相同的配置。各种软件的启动脚本存储在/etc/rc.d目录以下,意味着运行级别,并且/etc/inittab文件的initdefault运行级别作为启动时的默认应用。

% grep initdefault: /etc/inittab
is:3:initdefault:

但是,在Solaris2.x的通常模式的情况下,由于按照运行级别2→3的顺序执行,所以使无效的脚本运行级别2也成为停止的对象。Solaris 2.x和红帽Linux一样,因为开头以S开头的文件成为启动脚本,所以在无效的情况下,只要将文件名的开头设为S以外即可。

# cd /etc/rc2.d
# mv S88sendmail disable.S88sendmail

FreeBSD、NetBSD

各种软件的启动脚本存储在/etc/rc.d目录以下,它们在/etc/defaults/rc.conf和/etc/rc.conf中启动(Yes)/不(No)被控制。在两个设置的内容在/etc/defaults/rc.conf→/etc/rc.conf的顺序读取,默认设定值的/etc/defaults/rc.conf的内容在/etc/rc.conf覆盖。因此,如果您想改变传统启动脚本的行为,通常可以将其设置为/etc/rc.conf。

可以分别参考/etc/defaults/rc.conf。如果在/etc/defaults/rc.conf中设置NO(NONE),则不需要在/etc/rc.conf中重新设置,但考虑到这将是肯定的,明确地设置NO(NONE)也不错。

Step.3:重新审视inetd.conf

前面描述的启动脚本主要针对单独守护程序中运行的软件。有些服务是通过inetd(Xinetd)运行的,因此我们也需要对它们进行审查。

inetd

根据/etc/inetd.conf的默认内容,inetd确定要执行什么,因此如果停止不必要的服务,则需要在编辑器等中编辑/etc/inetd.conf并禁用它。

注意,在inetd中启用的服务对应于/etc/inetd.conf中的开头为#或空行以外的行。为了确认当前有效的服务,可以使用grep命令等进行确认。

% grep -i "^[0-9a-z]" /etc/inetd.conf

要应用更改的内容,需要向inetd进程发送HUP(挂起)信号,并重新读取/etc/inetd.conf。

# pkill -HUP inetd

xinetd

Xinetd,根据/etc/xinetd.conf的内容,因为它决定了要执行什么,如果你停止不必要的服务编辑/etc/xinetd.conf,如编辑器,有必要禁用。但是,红帽Linux等,xinetd.conf更/etc/xinetd.d目录以下的设定文件被读取,所以实际上这些文件编辑。注意,如果禁用,则在service项目中设置disable=yes。

service telnet
{
     ……省略……
     disable = yes
} 

要应用更改的内容,您需要向xinetd进程发送HUP信号,并重新读取/etc/xinetd.conf。

# pkill -HUP xinetd

另外,在Red Hat Linux等中,可以通过chkconfig命令启用/禁用xinetd的服务。

# chkconfig --list telnet
telnet        on
# chkconfig telnet off
# chkconfig --list telnet
telnet        off
# chkconfig telnet off 

由于设置的内容在chkconfig中启用/禁用时启用,所以不需要特意kill-HUP。以上,停止不必要的服务后,可以在上述的“确认现状”中再次确认。

结束语

说明了作为构筑·运用安全服务器的基本的、不需要的服务的停止。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值