今天一机房刚刚给一客户安装好操作系统centos6.x 64位系统,默认可能是他们idc机房统一的。结果几分钟服务器远程就登陆卡的要命,带宽耗尽。经过分析发现,这个网络其他服务器遭黑客攻击了,在整个网络上进行ssh爆破。具体体现如下图所示:
我们可以看见,黑客启动了向121.12.110.96 112.90.22.197服务器的10991端口进行大量的连接。
我在网络流量满载,而且极卡的情况下,查看了进程。如下图:
上面那些./*dxd ./*dd结尾的进程全为黑客ddos进程。
希望广大运维人员,及时加固你的linux和ssh,最好把管理端口放在防火墙保护内。
具体加固做如下建议:
1.修改默认ssh端口
2.将ssh端口放在防火墙后,限定特定ip访问
3.关闭远程root,设置PermitRootLogin no,linux默认为yes,允许root登陆很危险,这点Freebsd做的不错。
4.禁止明文密码登陆。PasswordAuthentication no
5.设置ssh为key认证登陆。RSAAuthentication yes
6.限制SSH验证重试次数,MaxAuthTries 1
一般我们查看系统性能主要是在以下几个方面
1.用户使用CPU情况 展现为 %user 2.系统使用CPU情况 展现为 %sys 3.wio或iowait 展现为 %iowait 进程由于等待磁盘IO而使CPU处于空闲状态的比率 4.CPU的空闲率 5.CPU上下文的交换的比率,也有说明为CPU上下文的切换。即内存和寄存器中数据的切换 6.nice 这个还不是很明白是啥意思 7.real-time 还是未知 8.运行队列的长度 9.平均负载 二 常用命令 1.mpstat 2.top 3.vmstat 4.sar 5.iostat 6.uptime三命令详解
1. mpstat -P ALL 5 //需要注意的P和ALL一定要大写17时22分24秒 CPU %user %nice %sys %iowait %irq %soft %steal %idle intr/s
17时22分29秒 all 0.30 0.00 0.10 0.67 0.02 0.07 0.00 98.83 821.40 17时22分29秒 0 1.00 0.00 0.60 1.00 0.20 0.60 0.00 96.60 560.00 17时22分29秒 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.20 0.00 17时22分29秒 2 0.60 0.00 0.20 0.20 0.00 0.20 0.00 99.00 250.20 17时22分29秒 3 0.00 0.00 0.00 4.00 0.00 0.00 0.00 96.00 11.20 17时22分29秒 4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.20 0.00 17时22分29秒 5 0.80 0.00 0.00 0.00 0.00 0.00 0.00 99.20 0.00 17时22分29秒 6 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 0.00 17时22分29秒 7 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 0.00上面信息我们可以看出,有8个CPU。
%user :在internal时间段里,即为用户态的CPU时间,及登录用户所消耗的CPU时间比。 %sys :在internal时间段里,负进程消耗的CPU时间,占所有CPU的百分比 %nice :优先进程占用时间 %iowait:在internal时间段里,所有未等待磁盘IO操作进程占CPU的百分比 %irq : 这个还是未知 %soft : 在internal时间段里,软中断时间(%) softirq/total*100 %idle : 在internal时间段里,CPU除去等待磁盘IO操作外的因为任何原因而空闲的时间闲置时间 (%) intr/s: 在internal时间段里,每秒CPU接收的中断的次数3.vmstat
procs ———–memory———- —swap– —–io—- -system– —–cpu——
r b swpd free buff cache si so bi bo in cs us sy id wa st 1 1 1385712 66752 112164 1429992 3 4 14 50 14 2 10 2 88 1 0 1 0 1385712 64540 112208 1430976 0 0 3 104 2599 6595 15 2 81 3 0 0 0 1385712 62084 112232 1433008 0 0 1 1276 2068 7772 18 1 77 4 0 0 0 1385712 60808 112232 1434036 0 0 1 29 730 3686 9 1 90 1 0参数详解:
r:当前系统中等待CPU的进程数(所有的CPU),若是改值连续都大于CPU的个数,表明有多数进程在等待CPU进行处理。若是该值大于CPU个数4倍的话,那么表明该服务器缺少CPU,或者CPU的处理速度过慢in :cpu每秒产生的中断数
cs :每秒产生的上下文切换us:用户占用的CPU时间百分比,同mpstat 的%user,说明用户进程消耗的CPU时间多,但是如果长期超50%的使用,那么我们就该考虑优化程序算法或者进行加速(比如PHP/PERL)
sy:系统占用的CPU时间百分比,同mpstat 的%sys。内核进程消耗的CPU时间百分比(sy的值高时,说明系统内核消耗的CPU资源多,这并不是良性表现,我们应该检查原因) id:CPU处于空闲状态时间百分比,如果空闲时间(cpu id)持续为0并且系统时间(cpu sy)是用户时间的两倍(cpu us) 系统则面临着CPU资源的短缺. wa:IO等待消耗的CPU时间百分比,wa的值高时,说明IO等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)。us+sy+id = 100%
常见用法:
vmstat -n 3 //每三秒获取一次数据 vmstat 4 5 //间隔4次输出5次数据概念详解:
上下文切换:CPU的切换就是将轮到该时间片的进程,将该进程中的数据从内容中刷到CPU的寄存器中,同时将原寄存器中的数据刷到内存中保存。 4.sar sar [options] [-A] [-o file] t [n] t 和 n两个参数指定了采样间隔和采样次数 - o 较日志记录到某个文件中 sar 5 6 //每5秒采用一次,共采样6次。Linux 2.6.18-53.el5PAE (localhost.localdomain) 03/28/2009
07:40:17 PM CPU %user %nice %system %iowait %steal %idle 07:40:19 PM all 12.44 0.00 6.97 1.74 0.00 78.86 07:40:21 PM all 26.75 0.00 12.50 16.00 0.00 44.75 07:40:23 PM all 16.96 0.00 7.98 0.00 0.00 75.06参数详解:
大部分的参数同mpstat top等命令。%idle :等同于vmstat 中的id .就是空闲CPU百分比.如果该值高,表明CPU较空闲,但是处理速度还是很慢,则表明CPU在等待内存分配,应该加大服务器的内存。若是该值持续低于10%,表明CPU处理能力较弱,需要增加CPU。
%steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比。 5.iostat 主要是为了查看磁盘IOLinux 2.6.16.46-0.12-smp (iread-85) 03/29/2010
avg-cpu: %user %nice %system %iowait %steal %idle
9.47 0.00 1.59 1.27 0.00 86.67Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 15.46 114.45 401.22 44378459 155576936参数详解:
avg-cpu中参数不做过多解释,详细可见其他命令,类似。rrqm/s: 每秒进行 merge 的读操作数目。即 delta(rmerge)/s
wrqm/s: 每秒进行 merge 的写操作数目。即 delta(wmerge)/s r/s: 每秒完成的读 I/O 设备次数。即 delta(rio)/s w/s: 每秒完成的写 I/O 设备次数。即 delta(wio)/s rsec/s: 每秒读扇区数。即 delta(rsect)/s wsec/s: 每秒写扇区数。即 delta(wsect)/s rkB/s: 每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。(需要计算) wkB/s: 每秒写K字节数。是 wsect/s 的一半。(需要计算) avgrq-sz:平均每次设备I/O操作的数据大小 (扇区)。delta(rsect+wsect)/delta(rio+wio) avgqu-sz:平均I/O队列长度。即 delta(aveq)/s/1000 (因为aveq的单位为毫秒)。 await: 平均每次设备I/O操作的等待时间 (毫秒)。即 delta(ruse+wuse)/delta(rio+wio) svctm: 平均每次设备I/O操作的服务时间 (毫秒)。即 delta(use)/delta(rio+wio) %util: 一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的。即 delta(use)/s/1000 (因为use的单位为毫秒)如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘
可能存在瓶颈。 idle小于70% IO压力就较大了,一般读取速度有较多的wait. 同时可以结合vmstat 查看查看b参数(等待资源的进程数)和wa参数(IO等待所占用的CPU时间的百分比,高过30%时IO压力高) 2. top //直接敲TOP即可。//系统当前时间、启动时间、当前登录数、平均负载 1、5、15分钟负载值
top – 19:43:46 up 4 days, 10:46, 7 users, load average: 0.25, 0.37, 0.38 //进程总数、运行进程数、休眠进程数、终止进程数、僵死进程数 Tasks: 222 total, 1 running, 221 sleeping, 0 stopped, 0 zombie //用户占用、系统占用、优先线程占用、闲置线程占用、 Cpu(s): 0.3%us, 0.1%sy, 0.0%ni, 98.5%id, 1.0%wa, 0.0%hi, 0.1%si, 0.0%st //内存状态(总内存、已用内存、闲置内存、缓存使用内容) Mem: 8183648k total, 8124052k used, 59596k free, 115072k buffers //交换内存(总交换内存、已用内存、闲置内存、高速缓存容量) Swap: 2104472k total, 1369376k used, 735096k free, 1462236k cachedPID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 16 0 784 72 40 S 0 0.0 0:06.28 init 2 root RT 0 0 0 0 S 0 0.0 0:00.08 migration/0 3 root 34 19 0 0 0 S 0 0.0 0:00.01 ksoftirqd/0 4 root RT 0 0 0 0 S 0 0.0 0:00.29 migration/1 5 root 34 19 0 0 0 S 0 0.0 0:00.00 ksoftirqd/1 6 root RT 0 0 0 0 S 0 0.0 0:00.21 migration/2 7 root 34 19 0 0 0 S 0 0.0 0:00.05 ksoftirqd/2 8 root RT 0 0 0 0 S 0 0.0 0:00.08 migration/3 9 root 34 19 0 0 0 S 0 0.0 0:00.01 ksoftirqd/3 10 root 10 -5 0 0 0 S 0 0.0 0:00.02 events/0 11 root 10 -5 0 0 0 S 0 0.0 0:00.00 events/1 参数详解:top命令式将系统最敏感的参数信息列出来。 PR :系统进程的分配的处理时间,若是16,则表示分配了16*10毫秒的时间长度来处理该线程。数值越大,代表处理时间越长。 NI :该进程的优先级 RES :该进程占用的物理内存的总数量,单位是KB。 SHR(SHARE) :该进程使用共享内存的数量。单位是KB S(STAT) :该线程的状态 S:代表休眠状态; D:代表不可中断的休眠状态; R:代表运行状态; Z:代表僵死状态; T:代表停止或跟踪状态。 %CPU :该进程自最近一次刷新以来所占用的CPU时间和总时间的百分比 %MEM :该进程占用的物理内存占总内存的百分比。 TIME+:该线程启动以来,占CPU的时间常见用法:
top -d 3 //每三秒刷新一次数据 默认是每5秒刷新一次数据 Ctrl+L //擦除并且重写屏幕。概念详解:
load average: 可以理解为每秒钟CPU等待运行的进程个数. 在Linux系统中,sar -q、uptime、w、top等命令都会有系统平均负载load average的输出,那么什么是系统平均负载呢? 系统平均负载被定义为在特定时间间隔内运行队列中的平均任务数。如果一个进程满足以下条件则其就会位于运行队列中: - 它没有在等待I/O操作的结果 - 它没有主动进入等待状态(也就是没有调用’wait’) - 没有被停止(例如:等待终止) # iostat -x 1 avg-cpu: %user %nice %sys %idle 16.24 0.00 4.31 79.44 Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util /dev/cciss/c0d0 0.00 44.90 1.02 27.55 8.16 579.59 4.08 289.80 20.57 22.35 78.21 5.00 14.29 /dev/cciss/c0d0p1 0.00 44.90 1.02 27.55 8.16 579.59 4.08 289.80 20.57 22.35 78.21 5.00 14.29 /dev/cciss/c0d0p2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00上面的 iostat 输出表明秒有 28.57 次设备 I/O 操作: 总IO(io)/s = r/s(读) +w/s(写) = 1.02+27.55 = 28.57 (次/秒) 其中写操作占了主体 (w:r = 27:1)。
平均每次设备 I/O 操作只需要 5ms 就可以完成,但每个 I/O 请求却需要等上 78ms,为什么? 因为发出的 I/O 请求太多 (每秒钟约 29 个),假设这些请求是同时发出的,那么平均等待时间可以这样计算:
平均等待时间 = 单个 I/O 服务时间 * ( 1 + 2 + … + 请求总数-1) / 请求总数
应用到上面的例子: 平均等待时间 = 5ms * (1+2+…+28)/29 = 70ms,和 iostat 给出的78ms 的平均等待时间很接近。这反过来表明 I/O 是同时发起的。
每秒发出的 I/O 请求很多 (约 29 个),平均队列却不长 (只有 2 个 左右),这表明这 29 个请求的到来并不均匀,大部分时间 I/O 是空闲的。
一秒中有 14.29% 的时间 I/O 队列中是有请求的,也就是说,85.71% 的时间里 I/O 系统无事可做,所有 29 个 I/O 请求都在142毫秒之内处理掉了。
delta(ruse+wuse)/delta(io) = await = 78.21 => delta(ruse+wuse)/s =78.21 * delta(io)/s = 78.21*28.57 = 2232.8,表明每秒内的I/O请求总共需要等待2232.8ms。所以平均队列长度应为 2232.8ms/1000ms = 2.23,而 iostat 给出的平均队列长度 (avgqu-sz) 却为 22.35,为什么?! 因为 iostat 中有 bug,avgqu-sz 值应为 2.23,而不是 22.35。
开启IO监控:
sysctl vm.block_dump=1
#或 echo 1 >/proc/sys/vm/block_dump开启后内核会将IO读写dump到日记,用dmesg查看:
dmesg
进程读写block到磁盘dm-0:
mysqld(7822): READ block 78196624 on dm-0
kjournald(529): WRITE block 211136 on dm-0 bash(8336): dirtied inode 7391146 (dmesg) on dm-0统计当前占用IO最高的10个进程:
dmesg |awk -F: ‘{print $1}’|sort|uniq -c|sort -rn|head -n 10
站点:某韩国在线商城
程序架构:java+mysql 系统:redhat linux 6.1 故障现象:CPU高达1000%+ 网站无法访问,数据库无任何请求,java阻塞
服务器硬件配置较高,dell r720高配24核 2.4G 32G
网络流量20Mbps左右
程序员总是爱说:“按道理没理由这样” 。
果然应了
经过十多年的发展,Linux的功能在不断增强,其安全机制亦在逐步完善。按照TCSEC评估标准,目前Linux的安全级基本达到了C2,更高安全级别的Linux系统正在开发之中。
下面我们来看一看Linux已有的安全机制,这些机制有些已被标准的Linux所接纳,有些只是提供了“补丁”程序。
PAM机制
PAM(Pluggable Authentication Modules)是一套共享库,其目的是提供一个框架和一套编程接口,将认证工作由程序员交给管理员,PAM允许管理员在多种认证方法之间作出选择,它能够改变本地认证方法而不需要重新编译与认证相关的应用程序。
PAM的功能包括:
● 加密口令(包括DES以外的算法);
● 对用户进行资源限制,防止DOS攻击;
● 允许随意Shadow口令;
● 限制特定用户在指定时间从指定地点登录;
● 引入概念“client plug-in agents”,使PAM支持C/S应用中的机器——机器认证成为可能。
PAM为更有效的认证方法的开发提供了便利,在此基础上可以很容易地开发出替代常规的用户名加口令的认证方法,如智能卡、指纹识别等认证方法。
入侵检测系统
入侵检测技术是一项相对比较新的技术,很少有操作系统安装了入侵检测工具,事实上,标准的Linux发布版本也是最近才配备了这种工具。尽管入侵检测系统的历史很短,但发展却很快,目前比较流行的入侵检测系统有Snort、Portsentry、 Lids等。
利用Linux配备的工具和从因特网下载的工具,就可以使Linux具备高级的入侵检测能力,这些能力包括:
● 记录入侵企图,当攻击发生时及时通知管理员;
● 在规定情况的攻击发生时,采取事先规定的措施;
● 发送一些错误信息,比如伪装成其他操作系统,这样攻击者会认为他们正在攻击一个Windows NT 或Solaris系统。
加密文件系统
加密技术在现代计算机系统安全中扮演着越来越重要的角色。加密文件系统就是将加密服务引入文件系统,从而提高计算机系统的安全性。有太多的理由需要加密文件系统,比如防止硬盘被偷窃、防止未经授权的访问等。
目前Linux已有多种加密文件系统,如CFS、TCFS、CRYPTFS等,较有代表性的是TCFS(Transparent CryptogrAPhic File System)。它通过将加密服务和文件系统紧密集成,使用户感觉不到文件的加密过程。TCFS不修改文件系统的数据结构,备份与修复以及用户访问保密文件的语义也不变。
TCFS能够做到让保密文件对以下用户不可读:
● 合法拥有者以外的用户;
● 用户和远程文件系统通信线路上的偷听者;
● 文件系统服务器的超级用户。
而对于合法用户,访问保密文件与访问普通文件几乎没有区别。
安全审计
即使系统管理员十分精明地采取了各种安全措施,但还会不幸地发现一些新漏洞。攻击者在漏洞被修补之前会迅速抓住机会攻破尽可能多的机器。虽然Linux不能预测何时主机会受到攻击,但是它可以记录攻击者的行踪。
Linux还可以进行检测、记录时间信息和网络连接情况。这些信息将被重定向到日志中备查。
日志是Linux安全结构中的一个重要内容,它是提供攻击发生的唯一真实证据。因为现在的攻击方法多种多样,所以Linux提供网络、主机和用户级的日志信息。例如,Linux可以记录以下内容:
● 记录所有系统和内核信息;
● 记录每一次网络连接和它们的源IP地址、长度,有时还包括攻击者的用户名和使用的操作系统;
● 记录远程用户申请访问哪些文件;
● 记录用户可以控制哪些进程;
● 记录具体用户使用的每条命令。
在调查网络入侵者的时候,日志信息是不可缺少的,即使这种调查是在实际攻击发生之后进行。
强制访问控制
强制访问控制(MAC,Mandatory Access Control)是一种由系统管理员从全系统的角度定义和实施的访问控制,它通过标记系统中的主客体,强制性地限制信息的共享和流动,使不同的用户只能访问到与其有关的、指定范围的信息,从根本上防止信息的失泄密和访问混乱的现象。
传统的MAC实现都是基于TCSEC中定义的MLS策略,但因MLS本身存在着这样或那样的缺点(不灵活、兼容性差、难于管理等),研究人员已经提出了多种MAC策略,如DTE、RBAC等。由于Linux是一种自由操作系统,目前在其上实现强制访问控制的就有好几家,其中比较典型的包括SElinux、RSBAC、MAC等,采用的策略也各不相同。
NSA推出的SELinux安全体系结构称为 Flask,在这一结构中,安全性策略的逻辑和通用接口一起封装在与操作系统独立的组件中,这个单独的组件称为安全服务器。SELinux的安全服务器定义了一种混合的安全性策略,由类型实施 (TE)、基于角色的访问控制 (RBAC) 和多级安全(MLS) 组成。通过替换安全服务器,可以支持不同的安全策略。SELinux使用策略配置语言定义安全策略,然后通过checkpolicy 编译成二进制形式,存储在文件 /ss_policy中,在内核引导时读到内核空间。这意味着安全性策略在每次系统引导时都会有所不同。策略甚至可以通过使用 security_load_policy 接口在系统操作期间更改(只要将策略配置成允许这样的更改)。
RSBAC的全称是Rule Set Based Access Control(基于规则集的访问控制),它是根据Abrams和LaPadula提出的Generalized Framework for Access Control(GFAC)模型开发的,可以基于多个模块提供灵活的访问控制。所有与安全相关的系统调用都扩展了安全实施代码,这些代码调用中央决策部件,该部件随后调用所有激活的决策模块,形成一个综合的决定,然后由系统调用扩展来实施这个决定。RSBAC目前包含的模块主要有MAC、RBAC、ACL等。
MAC是英国的Malcolm Beattie针对Linux 2.2编写的一个非常初级的MAC访问控制,它将一个运行的Linux系统分隔成多个互不可见的(或者互相限制的)子系统,这些子系统可以作为单一的系统来管理。MAC是基于传统的Biba完整性模型和BLP模型实现的,但作者目前似乎没有延续他的工作。
防火墙
防火墙是在被保护网络和因特网之间,或者在其他网络之间限制访问的一种部件或一系列部件。
Linux防火墙系统提供了如下功能:
● 访问控制,可以执行基于地址(源和目标)、用户和时间的访问控制策略,从而可以杜绝非授权的访问,同时保护内部用户的合法访问不受影响。
● 审计,对通过它的网络访问进行记录,建立完备的日志、审计和追踪网络访问记录,并可以根据需要产生报表。
● 抗攻击,防火墙系统直接暴露在非信任网络中,对外界来说,受到防火墙保护的内部网络如同一个点,所有的攻击都是直接针对它的,该点称为堡垒机,因此要求堡垒机具有高度的安全性和抵御各种攻击的能力。
● 其他附属功能,如与审计相关的报警和入侵检测,与访问控制相关的身份验证、加密和认证,甚至VPN等