一次被劫持挂马经历--Elasticsearch的远程执行漏洞

OpenSkill 发表了文章 0 个评论 2772 次浏览 2015-07-22 19:11 来自相关话题

起因:            公司使用的是Ucloud的云主机服务,今天上午突然被告知有一台服务器的出口流量激增,对外发包量短时间内达到了100万,而且都是UDP类型的,第一感觉就是:诶呀,莫不是被黑了,被当肉鸡了呀! ...查看全部


起因:


           公司使用的是Ucloud的云主机服务,今天上午突然被告知有一台服务器的出口流量激增,对外发包量短时间内达到了100万,而且都是UDP类型的,第一感觉就是:诶呀,莫不是被黑了,被当肉鸡了呀!


探究:


           立马登录对应的服务器,首先使用iftop查看流量状况
e1.jpg

e2.jpg

           可以看出出口流量好吓人,1分钟内累计700M流量,查了一下这2个IP地址,一个是在美国,一个是在浙江电信;赶紧查看正在运行的进程,找出疑似进程,还真有所发现:
e3.jpg

           [.ECC6DFE919A382]这个进程还想冒充系统进程,疑点极大,而且/tmp/freeBSD也是一个很奇怪的东西,而498这个UID对应的用户是elasticsearch,想起来昨天部署了Elasticsearch + Logstash,以实现日志统计系统,不会是ES有bug吧,继续查看原因
e4.jpg

            疑/tmp/freeBSD就是被挂马的程序,可惜已经被删除了,无法查看了


原因:


            罪魁祸首查出来了,细致的原因还需要详查,所以现在最重要的就是解决问题,迅速kill掉相关进程,再次查看iftop发现流量迅速回落了,更加证实了我们的判断;
            接下来就需要查找被劫持挂马的原因和具体的劫持方式,以绝后患,而通过外部搜索引擎也是很快就定位了问题的原因,就是“Elasticsearch远程任意代码执行”漏洞:
    []ElasticSearch有脚本执行(scripting)的功能,可以很方便地对查询出来的数据再加工处理; ElasticSearch用的脚本引擎是MVEL,这个引擎没有做任何的防护,或者沙盒包装,所以直接可以执行任意代码。[/][]而在ElasticSearch 1.2之前的版本里,默认配置是打开动态脚本功能的,因此用户可以直接通过http请求,执行任意代码。[/][]其实官方是清楚这个漏洞的,在文档里有说明:[/][]First, you should not run Elasticsearch as the root user, as this would allow a script to access or do anything on your server, without limitations. Second, you should not expose Elasticsearch directly to users, but instead have a proxy application inbetween.            [/]
           终于找到原因,那就解决吧

解决方案:

           法一:手动关闭ES远程执行脚本的功能,即在每一个ES节点的配置文件elasticsearch.yml中添加如下一行即可
script.disable_dynamic: true
           然后重启ES即可.           法二:升级ES至1.2版本以上也可,因为在ES1.2版本中已默认关闭了远程执行脚本的功能,但需考虑与Logstash的兼容性问题

后续:

[list=1][]根据官方的资料,为了保证ES的安全性,不可以root身份启动ES,且可考虑使用代理(负载均衡器也可),对外开放非9200端口(如9300),转发至内网的9200端口,可有效防止小人们的恶意端口扫描;[/][]因为已经被挂马了一次,所以在重新启用ES之前,还需全面检查被入侵的主机是否还有其它隐患,这就涉及web安全扫描的内容了,暂时小白,还未了解,故希望有经验的前辈可以多多请教![/]
           最近我也遇到了这个问题,然后搜索发现这篇文章不错,然后就想分享给大家,希望大家可以避免踩坑!
原文地址

关于GlusterFS的可用空间

回复

OpenSkill 发起了问题 1 人关注 0 个回复 4753 次浏览 2015-07-19 11:35 来自相关话题

KVM管理平台与股市

OpenSkill 发表了文章 0 个评论 3521 次浏览 2015-07-17 09:30 来自相关话题

先吐槽下qq群的调查功能,先后搞了2次调查,都没有了,数据消失了。难道qq调查的理念是,玩“闪调”,调查完就消失? 说下调查结果 OpenStack从调查结果看,OpenStac ...查看全部
kvm.png

先吐槽下qq群的调查功能,先后搞了2次调查,都没有了,数据消失了。难道qq调查的理念是,玩“闪调”,调查完就消失?
kvm1.png

说下调查结果
OpenStack
从调查结果看,OpenStack无疑是王者,前几天刚过了5岁生日,已经5岁了,但是还没有成熟,依旧活力四射。有人说OpenStack就是一个框架,一个协议族,就像网络的TCP/IP模型,真正要实施还要靠自己。
大家形成的共识是,玩OpenStack没有一定规模的开发团队搞不定,对中小型企业来说,要使用OpenStack,买一个有支持的发行版也是一个思路。
OpenStack 评级 持有 还会继续升值
 
Cloudstack OpenNebula
Cloudstack OpenNebula 这一年来,明显社区活跃度在下降,尤其是思杰投入到OpenStack阵营,更是对Cloudstack的打击,如果一直在使用这两个平台,可以继续使用,如果没有使用过,这两个平台建议就不要选择了。
Cloudstack OpenNebula 评级 出售 升值空间已经不大了
 
oVirt/RHEV
oVirt/RHEV 更适合中小型企业使用,设计目标也是中小型企业的管理工具,从个人测试的结果看,也是大问题没有,小问题不断,而且更新频繁,经常造成安装都是问题,要稳定使用还需要打磨。
oVirt/RHEV 评级 持有 还会继续升值
 
ZStack
ZStack 是国人开发的开源管理软件,脱胎于Cloudstack,许多理念和Cloudstack一样,但是比Cloudstack部署、使用方便很多,现在版本迭代非常快,很快要推出中文版了。
ZStack 评级 关注 还会继续升值,建议考虑在1.0的时候买入
 
WebVirtMgr
WebVirtMgr 是一个纯Python写的管理工具,前端和后端都是Python,是Python用户者的最爱,许多Python爱好者都对WebVirtMgr做了二次定制,目前主要的问题是功能太少。
WebVirtMgr 评级 关注 又可能继续升值,建议考虑在成熟的时候买入
 
Virtsh+VirtManager
Virtsh+VirtManager 是老牌绩优股,是每个人必备的工具,这个就不多说了。
Virtsh+VirtManager 评级 持有 长期稳定升值
 
自己研发
自己研发也是一个思路,底层的Libvirt已经非常完善了,完全可以在这个基础上,根据自己需求,开发一个非常简单的,适合自己的平台就ok。
自己研发 评级 持有 会持续升值
 
热爱虚拟化技术的同学,可以扫描二维码,订阅哦!
kvm2.png

原文地址

Elasticsearch 安装

OpenSkill 发表了文章 0 个评论 2622 次浏览 2015-07-09 19:41 来自相关话题

因为ES是java语言编写的程序,所以安装Elasticsearch唯一的要求是安装官方新版的Java下载地址 64位系统java安装脚本如下:#!/usr/bin/env bash java_install () { ...查看全部
es_install.png

因为ES是java语言编写的程序,所以安装Elasticsearch唯一的要求是安装官方新版的Java下载地址
64位系统java安装脚本如下:
#!/usr/bin/env bash

java_install () {
rpm -qa | grep -i JDK;if [ $? -eq 0 ];then rpm -qa | grep -i JDK | xargs -n 1 -t rpm -e --nodeps;fi
os=$(uname -m)

if [ $os == "x86_64" ];then
cd /usr/local/src/
wget -c http://118.186.221.78:8080/jdk-7u51-linux-x64.gz (ip地址不是有效的,你换成你jdk下载地址就好)
tar zxf jdk-7u51-linux-x64.gz -C /usr/local/

sed -i 's@jdk.certpath.disabledAlgorithms=MD2, RSA keySize < 1024@#jdk.certpath.disabledAlgorithms=MD2, RSA keySize < 1024@g' /usr/local/jdk1.7.0_51/jre/lib/security/java.security
ls /usr/bin/java* > /dev/null 2>&1;

if [ $? -eq 0 ];then
ls /usr/bin/java* | xargs -n 1 -t rm -rf
else
ln -s /usr/local/jdk1.7.0_51/bin/java /usr/bin/java
ln -s /usr/local/jdk1.7.0_51/bin/javac /usr/bin/javac
ln -s /usr/local/jdk1.7.0_51/bin/javadoc /usr/bin/javadoc
ln -s /usr/local/jdk1.7.0_51/bin/javaws /usr/bin/javaws
fi

cd /usr/local/jdk1.7.0_51/
echo "export JAVA_HOME=/usr/local/jdk1.7.0_51/" >> /root/.bashrc
source /root/.bashrc
echo "export PATH=$JAVA_HOME/bin:$PATH" >> /root/.bashrc
echo "export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar" >> /root/.bashrc
source /root/.bashrc
echo "export JAVA_HOME=/usr/local/jdk1.7.0_51/" >> /etc/rc.local
fi

}
java_install
安装开始
你可以从 Downloads | Elasticsearch下载最新版本的Elasticsearch,进行安装:
curl -L -O “http://download.elasticsearch.org/PATH/TO/VERSION.zip”
unzip elasticsearch-$VERSION.zip
cd elasticsearch-$VERSION
Downloads | Elasticsearch 获得最新可用的版本号并填入URL中


在生产环境安装时,除了以上方法,你还可以使用Debian或者RPM安装包,地址在这里:downloads page,或者也可以使用官方提供的Puppet module或者Chef cookbook


安装Marvel
Marvel是Elasticsearch的管理和监控工具,在开发环境下免费使用。它包含了一个叫做Sense的交互式控制台,使用户方便的通过浏览器直接与Elasticsearch进行交互。
 
Elasticsearch线上文档中的很多示例代码都附带一个View in Sense的链接。点击进去,就会在Sense控制台打开相应的实例。安装Marvel不是必须的,但是它可以通过在你本地Elasticsearch集群中运行示例代码而增加与此书的互动性。
Marvel是一个插件,可在Elasticsearch目录中运行以下命令来下载和安装:
./bin/plugin -i elasticsearch/marvel/latest
你可能想要禁用监控,你可以通过以下命令关闭Marvel:
echo 'marvel.agent.enabled: false' >> ./config/elasticsearch.yml
运行Elasticsearch
Elasticsearch已经准备就绪,执行以下命令可在前台启动:
./bin/elasticsearch
如果想在后台以守护进程模式运行,添加-d参数。
 
打开另一个终端进行测试:
curl 'http://localhost:9200/?pretty'
你能看到以下返回信息:
{
"status": 200, //状态码
"name": "Shrunken Bones", //默认集群名称
"version": {
"number": "1.4.0", //ES版本号
"lucene_version": "4.10" //lucene版本号
},
"tagline": "You Know, for Search"
}
这说明你的ELasticsearch集群已经启动并且正常运行,接下来我们可以开始各种实验了。
 
集群和节点
[b]节点(node)[/b]是一个运行着的Elasticsearch实例。[b]集群(cluster)[/b]是一组具有相同cluster.name的节点集合,他们协同工作,共享数据并提供故障转移和扩展功能,当然一个节点也可以组成一个集群。

你最好找一个合适的名字来替代cluster.name的默认值,比如你自己的名字,这样可以防止一个新启动的节点加入到相同网络中的另一个同名的集群中。

你可以通过修改config/目录下的elasticsearch.yml文件,然后重启ELasticsearch来做到这一点。当Elasticsearch在前台运行,可以使用Ctrl-C快捷键终止,或者你可以调用shutdown API来关闭:


查看Marvel和Sense
如果你安装了Marvel(作为管理和监控的工具),就可以在浏览器里通过以下地址访问它:
http://localhost:9200/_plugin/marvel/

你可以在Marvel中通过点击dashboards,在下拉菜单中访问Sense开发者控制台,或者直接访问以下地址:
http://localhost:9200/_plugin/marvel/sense/

kvm网络桥接,宿主机网络变化,怎么动态修改宿主机里面的ip地址?

回复

OpenSkill 回复了问题 1 人关注 2 个回复 4655 次浏览 2015-07-09 14:34 来自相关话题

Elasticsearch介绍

OpenSkill 发表了文章 0 个评论 2659 次浏览 2015-07-08 22:27 来自相关话题

Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎。无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。   但是,Lucene只是一个库。想要使用它, ...查看全部
es.png

Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎。无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。
 
但是,Lucene只是一个库。想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,更糟糕的是,Lucene非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。
 
Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。
 
不过,Elasticsearch不仅仅是Lucene和全文搜索,我们还能这样去描述它:

    []分布式的实时文件存储,每个字段都被索引并可被搜索[/]
    []分布式的实时分析搜索引擎[/]
    []可以扩展到上百台服务器,处理PB级结构化或非结构化数据[/]

而且,所有的这些功能被集成到一个服务里面,你的应用可以通过简单的RESTful API、各种语言的客户端甚至命令行与之交互。
 
上手Elasticsearch非常容易。它提供了许多合理的缺省值,并对初学者隐藏了复杂的搜索引擎理论。安装即可使用,只需很少的学习既可在生产环境中使用。
 
Elasticsearch在Apache 2 license下许可使用,可以免费下载、使用和修改。
 
随着你对Elasticsearch的理解加深,你可以根据不同的问题领域定制Elasticsearch的高级特性,这一切都是可配置的,并且配置非常灵活。
 
ES诞生模糊记忆:
多年前,一个叫做Shay Banon的刚结婚不久的失业开发者,由于妻子要去伦敦学习厨师,他便跟着也去了。在他找工作的过程中,为了给妻子构建一个食谱的搜索引擎,他开始构建一个早期版本的Lucene。

直接基于Lucene工作会比较困难,所以Shay开始抽象Lucene代码以便Java程序员可以在应用中添加搜索功能。他发布了他的第一个开源项目,叫做“Compass”。

后来Shay找到一份工作,这份工作处在高性能和内存数据网格的分布式环境中,因此高性能的、实时的、分布式的搜索引擎也是理所当然需要的。然后他决定重写Compass库使其成为一个独立的服务叫做Elasticsearch。

第一个公开版本出现在2010年2月,在那之后Elasticsearch已经成为Github上最受欢迎的项目之一,代码贡献者超过300人。一家主营Elasticsearch的公司就此成立,他们一边提供商业支持一边开发新功能,不过Elasticsearch将永远开源且对所有人可用。

Shay的妻子依旧等待着她的食谱搜索……

在容器内部无法运行内部进程

Ansible 回复了问题 2 人关注 1 个回复 3764 次浏览 2015-07-02 22:18 来自相关话题

启动hadoop时,log中出现:java.io.IOException: NameNode is not formatted.

OpenSkill 回复了问题 2 人关注 1 个回复 6745 次浏览 2021-03-23 21:48 来自相关话题

为什么“hbase.zookeeper.quorum”必须配奇数个数的DataNode

空心菜 回复了问题 3 人关注 1 个回复 5927 次浏览 2015-06-29 00:48 来自相关话题

docker容器故障致无法启动解决实例

小白菜 发表了文章 0 个评论 3599 次浏览 2015-06-24 16:48 来自相关话题

内网断电后,有一台机器没有如往常一样起来,该服务器是docke上的一个容器,然后登录docker宿主机,开始问题分析及解决: 一、寻找问题 1、启动iframe-test机器 root@ubuntu:~#docker start ifr ...查看全部
内网断电后,有一台机器没有如往常一样起来,该服务器是docke上的一个容器,然后登录docker宿主机,开始问题分析及解决:
 
一、寻找问题
1、启动iframe-test机器
root@ubuntu:~#docker start iframe-test
iframe-test
2、发现没有容器进程
root@ubuntu:~#docker ps |grep iframe-test
3、查看日志,发现是nginx配置有问题,导致中断。
root@ubuntu:~# docker logs iframe-test

Startingnginx: Starting periodic command scheduler: cron.
nginx:[emerg] unexpected end of file, expecting ";" or "}" in/etc/nginx/nginx.conf:21
nginx:configuration file /etc/nginx/nginx.conf test failed
二、思考解决方法
问题原因找到,就是nginx文件检测不通过,导致中断。
解决思路暂有两个:
方法一:把这个问题容器用docker commit提交到一个新的镜像,然后用docker run -i -d基于新镜像运行一个临时终端进去改变配置文件,然后把临时终端的id提交到一个新的镜像,然后在基于新的镜像重新启动容器。(这个方法步骤多,而且提交了新的镜像,对于后续维护增加了复杂性)
方法二:直接改变容器里的配置文件,不需要新提交镜像。
三、修改宕机容器配置
所有的容器数据都存在/var/lib/docker/aufs/diff/路径下。下面容器ID目录,以init结尾的是放配置文件的,有/etc/host、reselv.conf,/dev等。另一个是放的文件目录,比如/home,/var/及自己安装的服务等等,aufs需要内核3.10以上的支持。
1、查看容器id
root@ubuntu:~#docker ps -a|grep iframe-test
fa02f8084b63 debian06-base:latest
2、查找nginx.conf配置文件路径
root@ubuntu:~#find / -name 'nginx.conf'
/root/nginx.conf
/var/lib/docker/aufs/diff/7c7b3438586e0653cdca7977a4f889cfdca300f008771462f8a2e6e9d3bc5b84/etc/nginx/nginx.conf
/var/lib/docker/aufs/diff/6bc6a9a5aeb59e19cae8bb78daa481cc465051069c7854528cbfdb3c9c1f2bfb/etc/nginx/nginx.conf
/var/lib/docker/aufs/diff/c7b6b87cfda72701229eebca868eb047aa01c255b62e56ad223dc75396c584e4/etc/nginx/nginx.conf
/var/lib/docker/aufs/diff/fa02f8084b631c371c6c050e5f0315017d327f84746b064246803a6a90a39456/etc/nginx/nginx.conf
3、进入对应容器id的目录,修改问题文件
root@ubuntu:cd /var/lib/docker/aufs/diff/fa02f8084b631c371c6c050e5f0315017d327f84746b064246803a6a90a39456
执行ls命令,容器的根目录展现在面前,是不是很熟悉?
root@ubuntu:/var/lib/docker/aufs/diff/fa02f8084b631c371c6c050e5f0315017d327f84746b064246803a6a90a39456#ls
etc root run srv tmp usr var
接下来找到这个容器里面nginx.conf的语法错误处修改。
4、修改后启动容器
root@ubuntu:~# docker start iframe-test

root@ubuntu:~# docker ps |grep iframe-test
fa02f8084b63 debian06-base:latest "/etc/rc.local" 6 weeks ago Up 13 minutes 10.18.103.2:22->22/tcp,10.18.103.2:80->80/tcp, 10.18.103.2:443->443/tcp,10.18.103.2:3306->3306/tcp, 10.18.103.2:6379->6379/tcp,10.18.103.2:6381->6381/tcp, 10.18.103.2:8000->8000/tcp,10.18.103.2:8888->8888/tcp  
iframe-test 
容器启动成功,问题解决。