Chinaunix首页 | 论坛 | 博客
  • 博客访问: 43803
  • 博文数量: 25
  • 博客积分: 1420
  • 博客等级: 上尉
  • 技术积分: 235
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-14 22:16
文章分类

全部博文(25)

文章存档

2013年(5)

2010年(20)

我的朋友

分类: LINUX

2010-04-03 23:00:52

Linux系统安全是有很多方面来保证的,这里主要介绍Linux端口安全的知识,这里涉及有关Linux端口的设置,这里有些东西是从网上总结出来的,现在拿出来跟大家分享一下。这里一般要注意主机的包漏洞修补,放火墙的设置,关闭危险服务(端口)以及每日的日志分析.

什么是端口

一台主机的端口可以分为监听端口与随机取用的高级端口.所谓监听端口就是主机开启了哪些服务,那么这个服务会在Linux系统里启用一个端口来监听客户端的请求.例如FTP服务器,就会开放21号端口,这个端口会一直启用,直到FTP服务关闭为止.所谓随机取用的高级端口就是Linux要向某个主机请求服务时,Linux主机需要启用一个端口来对外连接,那么端口号是多少?Linux会随机取用一个未被使用且端口号大于1024的端口进行连接.

所以server/Client之间的数据传送其实就是端口与端口之间的传送.

总共有多少端口,哪些是保留端口
 
端口编号是由1-65535组成,所以会有65535个端口.一般而言,只有root才可以开启1-1023一内的端口,这些端口就是特殊抟口,用于保留给系统使用.至于大于1024的端口,除了给系统随机取用作为连接需求之外,也可以用来服务的监听之用.

如果1-1023的端口的程序被入侵,那将表示入侵者拥有root的权限,是因为只有root才可以开启1-1023一内的端口.这个时候就要注意主机的安全了.

在Linux中保留端口与它所对应的服务其实已经有了一个对照表,那就是/etc/services文件,可以使用netstat -n以数值方式显示连接状态,使用netatst -tl可以显示当前正在监听的服务名称. /etc/services文件也是某些端口启动时设置端口的重要依据.

要了解所谓的端口与服务对于安全的关系:真正影响面安全的并不是端口,而是启动端口的服务.

所以真正的危害是某些不安全的服务而不是开放的端口.基本上,如果没有必要,就关掉一些用不到的端口,而且服务的版本要持续更新.

如何查看端口

1.需要知道主机当前开了多少端口?

2.了解服务跟端口对应的文件是那一个?/etc/services

介绍查看主机端口最常用的命令:

netstat:在本机上检查自己的程序检测端口,没有危险

nmap:在本机上以特殊的检测程序检测自己,可能会违法

列出在监听的网络服务:
列出网络服务的方式简单,如下所示:

[root@linux ~]# netstat -tunl

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address       Foreign Address     State

tcp        0      0 0.0.0.0:25          0.0.0.0:*           LISTEN

tcp        0      0 :::80               :::*                LISTEN

tcp        0      0 :::22               :::*                LISTEN

tcp        0      0 :::25               :::*                LISTEN

上面说明了我的主机有启动 port 25, 80, 22 等,而且观察各联机接口,可发现这三个 port 都有对外提供联机的能力喔!

列出已联机的网络联机状态:
如果仅是要列出网络接口上已经联机的或者是一些联机过程挂断、连接程序的网络状态, 可以使用如下的方式来处理:

[root@linux ~]# netstat -tun

Active Internet connections (w/o servers)

Proto Recv-Q Send-Q Local Address        Foreign Address      State

tcp        0      0 192.168.10.100:25    192.168.10.5:3151    TIME_WAIT

tcp        0      0 192.168.10.100:22    192.168.10.150:1832  ESTABLISHED

从上面的数据来看,我的主机 (192.168.10.100) 目前仅有一条已建立的联机,那就是与 192.168.10.150 那部主机连接的联机,并且联机方线是由对方连接到我主机的 port 22 来取用我主机的服务吶!至于那个 TIME_WAIT 则是在等待该联机挂断啦!

删除已建立或在监听当中的联机:
如果想要将已经建立,或者是正在监听当中的网络服务关闭的话,最简单的方法当然就是找出该联机的 PID,然后将他 kill 掉即可啊!例如下面的范例:

[root@linux ~]# netstat -tunp

Active Internet connections (w/o servers)

Proto Recv-Q Send-Q Local Address     Foreign Address      State       PID/P name

tcp        0     68 192.168.10.100:22 192.168.10.150:1832  ESTABLISHED 13247/sshd

如上面的范例,我们可以找出来该联机是由 sshd 这个程序来启用的,并且他的 PID 13247, 希望你不要心急的用 这个指令,否则容易删错人 (因为你的主机里面可能会有多个 sshd 存在), 应该要使用 这个指令才对喔!

[root@linux ~]# kill -9 13247

 

nmap 的套件说明之名称为:『Network exploration tool and security scanner』,顾名思义, 这个东西是被系统管理员用来管理系统安全性查核的工具!他的具体描述当中也提到了, nmap 可以经由程序内部自行定义的几个 port 对应的指纹数据,来查出该 port 的服务为何,所以我们也可以藉此了解我们主机的 port 到底是干嘛用的!如果您是安装 Linux Red Hat 系统的话,那么这个 nmap 套件应该已经安装妥当了,万一没有这个套件的话,也可以来到底下的网站下载:

[root@linux ~]# nmap [扫瞄类型] [扫瞄参数] [hosts 地址与范围]

参数:

[扫瞄类型]:主要的扫瞄类型有底下几种:

    -sT:扫瞄 TCP 封包已建立的联机 connect()

    -sS:扫瞄 TCP 封包带有 SYN 卷标的数据

    -sP:以 ping 的方式进行扫瞄

    -sU:以 UDP 的封包格式进行扫瞄

    -sO:以 IP 的协议 ( protocol ) 进行主机的扫瞄

[扫瞄参数]:主要的扫瞄参数有几种:

    -PT:使用 TCP 里头的 ping 的方式来进行扫瞄,可以获知目前有几部计算机存活(较常用)

    -PI:使用实际的 ping (带有 ICMP 封包的) 来进行扫瞄

    -p :这个是 port range ,例如 1024-, 80-1023, 30000-60000 等等的使用方式

[Hosts 地址与范围]:这个有趣多了,有几种类似的类型

    192.168.0.100  :直接写入 HOST IP 而已,仅检查一部;

    192.168.0.0/24 :为 C Class 的型态,

    192.168.*.*  :嘿嘿!则变为 B Class 的型态了!扫瞄的范围变广了!

    192.168.0.0-50,60-100,103,200 :这种是变形的主机范围啦!很好用吧!

 

范例一:使用预设参数扫瞄本机所启用的 port

[root@linux ~]# nmap localhost

PORT     STATE SERVICE

22/tcp   open  ssh

25/tcp   open  smtp

80/tcp   open  http

139/tcp  open  netbios-ssn

# 在预设的情况下, nmap 仅会扫瞄 TCP 的协议喔!

nmap 的用法很简单,就直接在指令后面接上 IP 或者是主机名称即可。不过,在默认的情况下 nmap 仅会帮你分析 TCP 这个通讯协议而已,像上面这个例子,他只会帮我列出 4 个已经开启的 TCP 的端口口号码, 但优点是顺道也将开启该端口的服务也列出来了。那如果想要同时分析 TCP/UDP 这两个常见的通讯协议呢?可以这样做:

[root@linux ~]# nmap -sTU localhost

PORT      STATE         SERVICE

22/tcp    open          ssh

25/tcp    open          smtp

80/tcp    open          http

137/udp   open|filtered netbios-ns

138/udp   open|filtered netbios-dgm

139/tcp   open          netbios-ssn

与前面的范例比较一下,你会发现这次多了两个 UDP 的埠口,分别是 137 138 , 这样分析好多了吧!然后,如果你想要了解一下到底有几部主机活在你的网络当中时,则可以这样做:

[root@linux ~]# nmap -sP 192.168.10.0/24

Host 192.168.10.171 appears to be up.

MAC Address: 00:01:E6:B3:AA:CC (Hewlett-Packard Company)

Host 192.168.10.174 appears to be up.

MAC Address: 00:04:75:FF:CC:DD (3 Com)

Host 192.168.10.175 appears to be up.

MAC Address: 00:0C:6E:BA:11:22 (Asustek Computer)

看到否?你的环境当中有三部主机活着吶!并且该 IP 所对应的 MAC 也会被记录下来, 很不错吧!如果你还想要将各个主机的启动的 port 作一番侦测的话,那就得要使用:

[root@linux ~]# nmap 192.168.10.0/24

之后你就会看到一堆 port number 被输出到屏幕上啰~如果想要随时记录整个网段的主机是否不小心开放了某些服务,嘿嘿!利用 nmap 配合数据流重导向 (>, >> ) 来输出成为档案, 那随时可以掌握住您局域网络内每部主机的服务启动状况啊!

 

关闭或启动一个端口

要开或关闭一个端口,只需要开启或关闭一个服务即可.所以,当检测完端口后,接下来就是要找出端口所对应的服务,将该服务关掉,就会把端口关掉.

如果我想要将我系统上面的 port 25 关掉的话, 那应该如何关闭呢?最简单的作法就是先找出那个 port 25 的启动程序。

[root@linux ~]# netstat -tnlp

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address Foreign Address State   PID/Program name

tcp        0      0 127.0.0.1:25  0.0.0.0:*       LISTEN  2030/master

tcp        0      0 :::22         :::*            LISTEN  1961/sshd

# 咦!怎么会是 master 这个玩意儿?用 which 这个指令还找不到这个 master

# 那怎办?没关系,我们可以透过 locate 配合正规表示法找到这个指令的!

 

[root@linux ~]# locate master | grep '/master$'

/usr/libexec/postfix/master

# 嘿嘿!那个正规表示法就可以找到上述的输出结果,然后再由 rpm 来处理!

 

[root@linux ~]# rpm -qf /usr/libexec/postfix/master

postfix-2.2.2-2

# 找到了!就是这个套件!所以将他关闭的方法可能就是:

 

[root@linux ~]# rpm -qc postfix | grep init

/etc/rc.d/init.d/postfix

[root@linux ~]# /etc/init.d/postfix stop

透过上面的这个分析的流程,你可以利用系统提供的很多方便的工具来达成某个服务的关闭! 为啥这么麻烦?不是利用 kill -9 2030 就可以删掉该服务了吗? 是没错啦!不过,你知道该服务是做啥用的吗?你知道将他关闭之后,你的系统会出什么问题吗?如果不知道的话,那么利用上面的流程不就可以找出该服务套件,再利用 rpm 查询功能, 不就能够知道该服务的作用了?所以说,这个方式还是对您会有帮助的。

设置开机时启动服务的方法

如果以文字方式登录,文字界面的run-level为3,所以就在/etc/rc.d/rc3.d里可以找到服务的启动参数,就是以S开头的文件.如果不要启动一些服务,就将服务对应的文件(以S开头的文件)删除即可.

一般情况下不需要手工删除文件,Linux一般为我们提供了程序可以完成:

ntsysv

setup

是不是要将所有的Linux默认的服务关闭?因为系统有很多服务是一定要启动的,否则反而变的不安全.

以下列出一些完全没有对外开放端口,但却是系统必须的服务,这些服务不要关闭.
atd:在例行命令里提到的,只执行一次的预约执行任务,务必启动
cron:在例行命令里提到的,循环执行的命令,务必启动
iptables:防火墙,无论如何,先启动它
keytables:设置键盘上的字母格式,当然需要读入,否则如何控制
network:网络功能
random:快速使系统在随即时间内保存到映象文件,对系统相当重要,因为在开机之后,系统回迅速回复到关机之前的状态
syslog:在系统日志文件提过,是相当重要的文件,务必启动
xinetd:服务器面理器super deamon,是必须启动的服务之一
xfs:如果使用run-level的图形界面,这个必须启动

关闭所有对外开放的端口
 
在装完Linux后,就要将不必要的程序或服务关闭,最重要的是将对外开放的端口先关闭,需要的时候在开启.如果要假设服务器,可以逐个开启这些端口.

1.使用ntsysv设置开机时启动哪些服务

一般只选择:atd,cron,iptables,keytables,network,random,syslog,xinetd,xfs(如有图形界面)

2.重新启动

reboot

3.查看当前开启了多少端口

netstat -an

阅读(1963) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~