如何检查Linux系统服务器的安全性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何检查Linux系统服务器的安全性相关的知识,希望对你有一定的参考价值。

  但由于该操作系统是一个多用户操作系统,黑客们为了在攻击中隐藏自己,往往会选择 Linux作为首先攻击的对象。那么,作为一名Linux用户,我们该如何通过合理的方法来防范Linux的安全呢?下面笔者搜集和整理了一些防范 Linux安全的几则措施,现在把它们贡献出来,恳请各位网友能不断补充和完善。 1、禁止使用Ping命令Ping命令是计算机之间进行相互检测线路完好的一个应用程序,计算机间交流数据的传输没有 经过任何的加密处理,因此我们在用ping命令来检测某一个服务器时,可能在因特网上存在某个非法分子,通过专门的黑客程序把在网络线路上传输的信息中途 窃取,并利用偷盗过来的信息对指定的服务器或者系统进行攻击,为此我们有必要在Linux系统中禁止使用Linux命令。在Linux里,如果要想使 ping没反应也就是用来忽略icmp包,因此我们可以在Linux的命令行中输入如下命令: echo 1 > /proc/sys/net/ipv4/icmp_echo_igore_all 如果想恢复使用ping命令,就可以输入 echo 0 > /proc/sys/net/ipv4/icmp_echo_igore_all2、注意对系统及时备份为了防止系统在使用的过程中发生以外情况而难以正常运行,我们应该对Linux完好的系统进 行备份,最好是在一完成Linux系统的安装任务后就对整个系统进行备份,以后可以根据这个备份来验证系统的完整性,这样就可以发现系统文件是否被非法修 改过。如果发生系统文件已经被破坏的情况,也可以使用系统备份来恢复到正常的状态。备份信息时,我们可以把完好的系统信息备份在CD-ROM光盘上,以后 可以定期将系统与光盘内容进行比较以验证系统的完整性是否遭到破坏。如果对安全级别的要求特别高,那么可以将光盘设置为可启动的并且将验证工作作为系统启 动过程的一部分。这样只要可以通过光盘启动,就说明系统尚未被破坏过。 3、改进登录服务器将系统的登录服务器移到一个单独的机器中会增加系统的安全级别,使用一个更安全的登录服务器 来取代Linux自身的登录工具也可以进一步提高安全。在大的Linux网络中,最好使用一个单独的登录服务器用于syslog服务。它必须是一个能够满 足所有系统登录需求并且拥有足够的磁盘空间的服务器系统,在这个系统上应该没有其它的服务运行。更安全的登录服务器会大大削弱入侵者透过登录系统窜改日志 文件的能力。 4、取消Root命令历史记录在Linux下,系统会自动记录用户输入过的命令,而root用户发出的命令往往具有敏感的 信息,为了保证安全性,一般应该不记录或者少记录root的命令历史记录。为了设置系统不记录每个人执行过的命令,我们可以在Linux的命令行下,首先 用cd命令进入到/etc命令,然后用编辑命令来打开该目录下面的profile文件,并在其中输入如下内容: HISTFILESIZE=0
HISTSIZE=0当然,我们也可以直接在命令行中输入如下命令: ln -s /dev/null ~/.bash_history5、为关键分区建立只读属性Linux的文件系统可以分成几个主要的分区,每个分区分别进行不同的配置和安装,一般情况 下至少要建立/、/usr/local、/var和/home等分区。/usr可以安装成只读并且可以被认为是不可修改的。如果/usr中有任何文件发生 了改变,那么系统将立即发出安全报警。当然这不包括用户自己改变/usr中的内容。/lib、/boot和/sbin的安装和设置也一样。在安装时应该尽 量将它们设置为只读,并且对它们的文件、目录和属性进行的任何修改都会导致系统报警。 当然将所有主要的分区都设置为只读是不可能的,有的分区如/var等,其自身的性质就决定了不能将它们设置为只读,但应该不允许它具有执行权限。 6、杀掉攻击者的所有进程假设我们从系统的日志文件中发现了一个用户从我们未知的主机登录,而且我们确定该用户在这台 主机上没有相应的帐号,这表明此时我们正在受到攻击。为了保证系统的安全被进一步破坏,我们应该马上锁住指定的帐号,如果攻击者已经登录到指定的系统,我 们应该马上断开主机与网络的物理连接。如有可能,我们还要进一步查看此用户的历史记录,再仔细查看一下其他用户是否也已经被假冒,攻击者是否拥有有限权 限;最后应该杀掉此用户的所有进程,并把此主机的IP地址掩码加入到文件hosts.deny中。 7、改进系统内部安全机制我们可以通过改进Linux操作系统的内部功能来防止缓冲区溢出,从而达到增强Linux系 统内部安全机制的目的,大大提高了整个系统的安全性。但缓冲区溢出实施起来是相当困难的,因为入侵者必须能够判断潜在的缓冲区溢出何时会出现以及它在内存 中的什么位置出现。缓冲区溢出预防起来也十分困难,系统管理员必须完全去掉缓冲区溢出存在的条件才能防止这种方式的攻击。正因为如此,许多人甚至包括 Linux Torvalds本人也认为这个安全Linux补丁十分重要,因为它防止了所有使用缓冲区溢出的攻击。但是需要引起注意的是,这些补丁也会导致对执行栈的 某些程序和库的依赖问题,这些问题也给系统管理员带来的新的挑战。 8、对系统进行跟踪记录为了能密切地监视黑客的攻击活动,我们应该启动日志文件,来记录系统的运行情况,当黑客在攻 击系统时,它的蛛丝马迹都会被记录在日志文件中的,因此有许多黑客在开始攻击系统时,往往首先通过修改系统的日志文件,来隐藏自己的行踪,为此我们必须限 制对/var/log文件的访问,禁止一般权限的用户去查看日志文件。当然,系统中内置的日志管理程序功能可能不是太强,我们应该采用专门的日志程序,来 观察那些可疑的多次连接尝试。另外,我们还要小心保护好具有根权限的密码和用户,因为黑客一旦知道了这些具有根权限的帐号后,他们就可以修改日志文件来隐 藏其踪迹了。 9、使用专用程序来防范安全有时,我们通过人工的方法来监视系统的安全比较麻烦,或者是不周密,因此我们还可以通过专业 程序来防范系统的安全,目前最典型的方法为设置陷井和设置蜜罐两种方法。所谓陷井就是激活时能够触发报警事件的软件,而蜜罐(honey pot)程序是指设计来引诱有入侵企图者触发专门的报警的陷井程序。通过设置陷井和蜜罐程序,一旦出现入侵事件系统可以很快发出报警。在许多大的网络中, 一般都设计有专门的陷井程序。陷井程序一般分为两种:一种是只发现入侵者而不对其采取报复行动,另一种是同时采取报复行动。 10、将入侵消灭在萌芽状态入侵者进行攻击之前最常做的一件事情就是端号扫瞄,如果能够及时发现和阻止入侵者的端号扫瞄 行为,那么可以大大减少入侵事件的发生率。反应系统可以是一个简单的状态检查包过滤器,也可以是一个复杂的入侵检测系统或可配置的防火墙。我们可以采用诸 如Abacus Port Sentry这样专业的工具,来监视网络接口并且与防火墙交互操作,最终达到关闭端口扫瞄攻击的目的。当发生正在进行的端口扫瞄时,Abacus Sentry可以迅速阻止它继续执行。但是如果配置不当,它也可能允许敌意的外部者在你的系统中安装拒绝服务攻击。正确地使用这个软件将能够有效地防止对 端号大量的并行扫瞄并且阻止所有这样的入侵者。 11、严格管理好口令前面我们也曾经说到过,黑客一旦获取具有根权限的帐号时,就可以对系统进行任意的破坏和攻 击,因此我们必须保护好系统的操作口令。通常用户的口令是保存在文件/etc/passwd文件中的,尽管/etc/passwd是一个经过加密的文件, 但黑客们可以通过许多专用的搜索方法来查找口令,如果我们的口令选择不当,就很容易被黑客搜索到。因此,我们一定要选择一个确保不容易被搜索的口令。另外,我们最好能安装一个口令过滤工具,并借用该工具来帮助自己检查设置的口令是否耐得住攻击。
参考技术A 有一种公用的检查端口漏洞的工具,Nessus,你可以装一个,他可以用来检测你系统中的端口漏洞

Linux系统是否被植入木马的排查流程梳理

在日常繁琐的运维工作中,对linux服务器进行安全检查是一个非常重要的环节。今天,分享一下如何检查linux系统是否遭受了入侵?


一、是否入侵检查

1)检查系统日志
检查系统错误登陆日志,统计IP重试次数(last命令是查看系统登陆日志,比如系统被reboot或登陆情况)
[[email protected] ~]# last

2)检查系统用户
查看是否有异常的系统用户
[[email protected] ~]# cat /etc/passwd
 
查看是否产生了新用户,UID和GID为0的用户
[[email protected] ~]# grep "0" /etc/passwd
 
查看passwd的修改时间,判断是否在不知的情况下添加用户
[[email protected] ~]# ls -l /etc/passwd
 
查看是否存在特权用户
[[email protected] ~]# awk -F: '$3==0 {print $1}' /etc/passwd
 
查看是否存在空口令帐户
[[email protected] ~]# awk -F: 'length($2)==0 {print $1}' /etc/shadow

3)检查异常进程
注意UID为0的进程
使用ps -ef命令查看进程
 
察看该进程所打开的端口和文件
[[email protected] ~]# lsof -p pid命令查看
 
检查隐藏进程
[[email protected] ~]# ps -ef | awk '{print }' | sort -n | uniq >1
[[email protected] ~]# ls /porc |sort -n|uniq >2
[[email protected] ~]# diff 1 2

4)检查异常系统文件
[[email protected] ~]# find / -uid 0 –perm -4000 –print
[[email protected] ~]# find / -size +10000k –print
[[email protected] ~]# find / -name "…" –print
[[email protected] ~]# find / -name ".." –print
[[email protected]host ~]# find / -name "." –print
[[email protected] ~]# find / -name " " –print

5)检查系统文件完整性
[[email protected] ~]# rpm –qf /bin/ls
[[email protected] ~]# rpm -qf /bin/login
[[email protected] ~]# md5sum –b 文件名
[[email protected] ~]# md5sum –t 文件名

6)检查RPM的完整性
[[email protected] ~]# rpm -Va #注意相关的/sbin,/bin,/usr/sbin,/usr/bin
输出格式说明:
S – File size differs 
M – Mode differs (permissions)
5 – MD5 sum differs 
D – Device number mismatch
L – readLink path mismatch
U – user ownership differs
G – group ownership differs
T – modification time differs

7)检查网络
[[email protected] ~]# ip link | grep PROMISC(正常网卡不该在promisc模式,可能存在sniffer)
[[email protected] ~]# lsof –i
[[email protected] ~]# netstat –nap(察看不正常打开的TCP/UDP端口)
[[email protected] ~]# arp –a

8)检查系统计划任务
[[email protected] ~]# crontab –u root –l
[[email protected] ~]# cat /etc/crontab
[[email protected] ~]# ls /etc/cron.*

9)检查系统后门
[[email protected] ~]# cat /etc/crontab
[[email protected] ~]# ls /var/spool/cron/
[[email protected] ~]# cat /etc/rc.d/rc.local
[[email protected] ~]# ls /etc/rc.d
[[email protected] ~]# ls /etc/rc3.d

10)检查系统服务
[[email protected] ~]# chkconfig —list
[[email protected] ~]# rpcinfo -p(查看RPC服务)

11)检查rootkit
[[email protected] ~]# rkhunter -c
[[email protected] ~]# chkrootkit -q


二、linux系统被入侵/中毒的表象

比较常见的中毒表现在以下三个方面:
1)服务器出去的带宽会跑高这个是中毒的一个特征。
因为服务器中毒之后被别人拿去利用,常见的就是拿去当肉鸡攻击别人;再者就是拿你的数据之类的。
所以服务器带宽方面需要特别注意下,如果服务器出去的带宽跑很高,那肯定有些异常,需要及时检查一下!
 
2)系统里会产生多余的不明的用户
中毒或者被入侵之后会导致系统里产生一些不明用户或者登陆日志,所以这方面的检查也是可以看出一些异常的。
 
3)开机是否启动一些不明服务和crond任务里是否有一些来历不明的任务?
因为中毒会随系统的启动而启动的,所以一般会开机启动,检查一下启动的服务或者文件是否有异常,一般会在/etc/rc.local和crondtab -l 显示出来。


三、顺便说下一次Linux系统被入侵/中毒的解决过程

在工作中碰到系统经常卡,而且有时候远程连接不上,从本地以及远程检查一下这个系统,发现有不明的系统进程。
初步判断就是可能中毒了!!!
 
解决过程:
1)在监控里检查一下这台服务器的带宽,发现服务器出去的带宽跑很高,所以才会导致远程连接卡甚至连接不上,这是一个原因。
为什么服务器出去的带宽这么高且超出了开通的带宽值?这个原因只能进入服务器系统里检查了。
 
2)远程进入系统里检查了下, ps -aux查到不明进程 ,立刻关闭它。
 
3)检查一下开机启动项:
#chkconfig --list | grep 3:on
服务器启动级别是3的,我检查一下了开机启动项,没有特别明显的服务。
然后检查了一下开机启动的一个文件
#more /etc/rc.local
看到这个文件里被添加了很多未知项,注释了它。
 
4)然后在远程连接这台服务器的时候,还是有些卡。
检查了一下系统的计划任务crond,使用crondtab -l 命令进行查看,看到很多注释行。
这些注释行与/etc/rc.local的内容差不多。最后备份下/var/spool/cron/root文件(也就是root下的crontab计划任务内容),就删除了crontab内容,然后停止crond任务,并chkconfig crond off 禁用它开机启动。
 
5)为了彻底清除危害,我检查了一下系统的登陆日志(last命令查看),看到除了root用户之外还有其它的用户登陆过。
检查了一下/etc/passwd ,看到有不明的用户,立刻用usermod -L XXX 禁用这些用户。
然后更新了下系统的复杂密码。
----------------------------------------------------
禁用/锁定用户登录系统的方法
1. usermod -L username 锁定用户
    usermod -U username 解锁
2. passwd -l username 锁定用户
    passwd -u username 解锁
3.修改用户的shell类型为/sbin/nologin(/etc/passwd文件里修改)
4.在/etc/下创建空文件nologin,这样就锁定了除root之外的全部用户
----------------------------------------------------


四、怎样确保linux系统安全

1)从以往碰到的实例来分析,密码太简单是一个错
用户名默认,密码太简单是最容易被入侵的对象,所以切忌不要使用太过于简单的密码,先前碰到的那位客户就是使用了太简单的且规则的密码 1q2w3e4r5t, 这种密码在扫描的软件里是通用的,所以很容易被别人扫描出来的。
 
2)不要使用默认的远程端口,避免被扫描到
扫描的人都是根据端口扫描,然后再进行密码扫描,默认的端口往往就是扫描器的对象,他们扫描一个大的IP 段,哪些开放22端口且认为是ssh服务的linux系统,所以才会猜这机器的密码。更改远程端口也是安全的一个措施!
 
3)使用一些安全策略进行保护系统开放的端口
使用iptables或者配置/etc/hosts.deny 和/etc/hosts.allow进行白名单设置
可以对/etc/passwd、/etc/group、/etc/sudoers、/etc/shadow等用户信息文件进行锁定(chattr +ai)
 
4)禁ping设置
# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
---------------------------------------------------------
发现一次服务器被getshell渗透的解决办法:
1)使用top命令发现一个python程序占用了95%的cpu
2)使用ps -ef|grep python发现下面程序:
   python -c import pty;pty.spamn("/bin/sh")
这个程序命令表示通过webshell反弹shell回来之后获取真正的ttyshell进行渗透到服务器里。kill掉这个进程!
3)发现在/var/spool/cron下面设置了一个nobody的定时执行上面获取getshell的渗透命令!果断删除这个任务!
4)ss -a发现一个可疑ip以及它的进程,果断在iptables里禁止这个ip的所有请求:
   -I INPUT -s 180.125.131.192 -j DROP
-----------------------------------------------------------------------------------------------------------
比如:
在一台服务器上,已经启动了80端口的nginx进程,但是执行“lsof -i:80”或者"ps -ef"命令后,没有任何信息输出!这是为什么?
怀疑机器上的ps命令被人黑了!执行:

[[email protected] ~]# which ps
/bin/ps
[[email protected] ~]# ls -l /bin/ps
-rwxr-xr-x. 1 root root 85304 5月  11 2016 /bin/ps
[[email protected] ~]# stat /bin/ps
  File: "/bin/ps"
  Size: 85304       Blocks: 168        IO Block: 4096   普通文件
Device: fc02h/64514d    Inode: 13549       Links: 1
Access: (0755/-rwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2017-05-07 17:14:37.862999884 +0800
Modify: 2016-05-11 07:23:09.000000000 +0800
Change: 2017-05-07 17:14:37.146999967 +0800
 
发现ps命令的二进制文件果然在近期被改动过。
解决办法:可以拷贝别的机器上的/bin/ps二进制文件覆盖本机的这个文件。
-------------------------记一次Linux操作系统被入侵的排查过程--------------------------------------

某天突然发现IDC机房一台测试服务器的流量异常,几乎占满了机房的总带宽,导致其他服务器程序运行业务受阻!
意识到了这台测试机被人种了木马,于是开始了紧张的排查过程:
 
1)运行ps和top命令
发现了两个陌生名称的程序(比如mei34hu)占用了大部分CPU资源,显然这是别人植入的程序!
果断尝试kill掉这两个进程,kill后,测试机流量明显降下去。然而不幸的是,不一会儿又恢复了之前的状态。
 
2)将IDC这台测试机的外网关闭。远程通过跳板机内网登陆这台机器。
 
3)查看这些陌生程序所在路径
查找程序路径:
ls /proc/进程号/exe,然后再次kill掉进程,又会生成一个新的进程名,发现路径也是随机在PATH变量的路径中变换,有时在/bin目录,有时在/sbin,有时在/usr/bin目录中。
看来还有后台主控程序在作怪,继续查找。
 
4)尝试查找跟踪程序
查看/bin,/sbin,/usr/bin等目录下是否存在以.开头的文件名,发现不少,而且部分程序移除后会自动生成。
[[email protected] ~]# ls /usr/bin/.    //按Tab键补全
./  ../  .ssh.hmac
 
这说明还没找到主控程序。
 
5)接着用strace命令跟踪这些陌生程序:
[[email protected] ~]# strace /bin/mei34hu
 
结果发现在跟踪了这个程序后,它居然自杀了(把自己进程文件干掉了)!然后想用netstat看下网络连接情况,结果居然查不到任何对外的网络连接,于是开始怀疑命令被修改过了。
使用stat 查看系统命令ps、ls 、netstat、pstree等等:
[[email protected] ~]# which ps
/usr/bin/ps
[[email protected] ~]# which ls
alias ls='ls --color=auto'
    /usr/bin/ls
[[email protected] ~]# which netstat
/usr/bin/netstat
[[email protected] ~]# stat /usr/bin/netstat
[[email protected] ~]# stat /usr/bin/ps
[[email protected] ~]# stat /usr/bin/ls
......
 
发现修改时间都是在最近的3天内,这让我猛然想起传说中的rootkit用户态级病毒!!
有可能是这台测试机刚安装好系统后,设置了root密码为123456,之后又把它放到过公网上被人入侵了。
 
接着查一下它在相关路径中还放了哪些程序:
[[email protected] ~]# find /bin -mtime -3 -type f | xargs rm -f
[[email protected] ~]# find /usr/bin -mtime -3 -type f | xargs rm -f
[[email protected] ~]# find /use/sbin -mtime -3 -type f | xargs rm -f
[[email protected] ~]# find /sbin -mtime -3 -type f | xargs rm -f
 
将上面查找出的3天前的程序统统都删掉,并强制断电,重启服务器!然而可恨的是这些程序在机器重启后又好端端的运行以来!
很明显,这些程序都被设置了开机自启动
 
6)查看系统启动项
[[email protected] ~]# find /etc/rc.d/ -mtime -3 ! -type d
 
果然这些程序都被设置了开机自启动。于是,就再来一次删除,然后暴力重启服务器。
[[email protected] ~]# find /bin -mtime -3 -type f | xargs rm -f
[[email protected] ~]# find /usr/bin -mtime -3 -type f | xargs rm -f
[[email protected] ~]# find /use/sbin -mtime -3 -type f | xargs rm -f
[[email protected] ~]# find /sbin -mtime -3 -type f | xargs rm -f
[[email protected] ~]# find /etc/rc.d/ -mtime -3 ! -type d | xargs rm -f
 
重启完服务器后,用top命令查看,系统CPU使用率也不高了。居然这样就被干掉了。
 
7)顾虑到系统常用命令中(如ls,ps等)可能会隐藏启动进程,这样一旦执行又会拉起木马程序。于是再查看下系统中是否创建了除root以外的管理员账号:
[[email protected] ~]# awk -F":" '{if($3 == 0) print $1}' /etc/passwd
root
 
结果发现只输入了root这一个用户,说明系统用户是正常的。
其实,当系统被感染rootkit后,系统已经变得不可靠了,唯一的办法就是重装系统了。
 
8)对于一些常用命令程序的修复思路:找出常用命令所在的rpm包,然后强制删除,最后在通过yum安装(由于外网已拿掉,可以通过squid代理上网的yum下载)
[[email protected] ~]# rpm -qf /bin/ps
[[email protected] ~]# rpm -qf /bin/ls
[[email protected] ~]# rpm -qf /bin/netstat
[[email protected] ~]# rpm -qf /usr/bin/pstree
 
然后将上面命令查找出来的rpm包强制卸载
[[email protected] ~]# rpm -e --nodeps ......
[[email protected] ~]# rpm -e --nodeps ......
[[email protected] ~]# rpm -e --nodeps ......
[[email protected] ~]# rpm -e --nodeps ......
 
接着再重新安装
[[email protected] ~]# yum install -y procps coreutils net-tools psmisc
 
最后重启下系统即可。除了上面这次排查之外,还可以:
1)结合服务器的系统日志/var/log/messages、/var/log/secure进行仔细检查。
2)将可疑文件设为不可执行,用chattr +ai将几个重要目录改为不可添加和修改,再将进程杀了,再重启
3)chkrootkit之类的工具查一下
 
对于以上这些梳理的木马排查的思路要清楚,排查手段要熟练。遇到问题不要慌,静下心,细查系统日志,根据上面的排查思路来一步步处理,这样Hacker就基本"投降"了~~~


以上是关于如何检查Linux系统服务器的安全性的主要内容,如果未能解决你的问题,请参考以下文章

Linux系统的服务器怎么提高安全性

25个Linux服务器安全小技巧

25个Linux服务器安全小技巧

25个Linux服务器安全小技巧

Lynis:linux系统安全检查工具

linux安全加固应关闭啥服务