分类: 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 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: |
看到否?你的环境当中有三部主机活着吶!并且该 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) tcp 0 0 127.0.0.1:25 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- # 找到了!就是这个套件!所以将他关闭的方法可能就是: [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