初创公司如何避免服务器被攻击

前不久和小伙伴们讨论了一个基础的安全问题:一个朋友开的公司的服务器集群被黑了,攻击者在机器上安装了远程操做程序——被肉鸡了。但通过讨论后发现,机器的最基本的防御都没有。这无异于大姑娘在街上裸奔——就算长得再丑也最终会被爆的。本文就这个讨论,总结一下在工程实践上,服务器集群的“入门级安全防御“该如何实施。mysql

 
安全第一

本文仅仅针对初创公司,没有资源创建完善运维团队的场景。本文介绍的方法都是一个开发手工能够搞定的。nginx

服务器是如何被攻破的

线上服务器,不管是自建机房仍是云服务,管理员都不太可能直接接触到机器自己。大多数时候管理者都是经过网络与服务器通信。这就涉及到了服务器必定要打开一些端口才能容许这种交互。做为管理员是经过网络使用服务器的资源,做为用户也是如此。做为攻击者固然也能够经过一样的方式来访问主机。毕竟都是大门嘛,你能进,他也能进。web

所以,从攻击者的角度,最低成本的攻击方式是用脚本自动扫描,看看一个服务器(IP)到底开了多少端口。若是是使用默认端口的话,攻击者就能够猜想这个端口背后的程序是否可能有漏洞。好比Web的默认端口是80,而80背后大几率可能就是nginx或者apache。而这些软件的某个版本存在漏洞或者配置不当,就会形成极大的安全隐患。好比apache若是配置不当,攻击者能够顺着apache用https://foo.com/../../etc 这样的url访问到很是敏感的信息,从而为下一步的提高权限、作任意的操做、安装黑客工具作第一步准备。而若是攻击者发现3306这种端口是开的,就会直接尝试用弱口令或者Mysql特定版本的漏洞来尝试访问Mysql,而后干他任何想干的事情。redis

众多端口中,SSH服务的安全风险至关的高,一旦被攻破,攻击者能够任何执行器想要执行的指令。而其余的协议,好比3306连通,背后是mysql,攻击者就必须按照mysql的通信协议来尝试各类机会,大部分状况只能对mysql自己作一些事情,但不能对机器作一些事情。但不管哪种,对于被攻击者来讲都是巨大的损失。轻则全部机器要reset,从新安装部署;重则一个公司完全信誉扫地,垮掉(好比大量用户信息丢失,被篡改)。算法

So, take it seriously.sql

那么如何防御呢?mongodb

总体思路

整个防御的思路就是,将生产服务器的对外网的接触面下降到最少。将全部的管理类访问收到以跳板机为中心的SSH主机上。其他的访问只能访问生产机器提供的服务自己。数据库

 
网络隔离

下面一一讲解。apache

限制开放端口

任什么时候候,只要是生产服务器,投入使用以前必须限制开放端口。你须要开放什么服务,就只开放那个服务必要的端口。例如,对于一个web服务来说只须要打开80/443两个端口。具体作法是,使用iptable命令来DROP掉除了必要端口外全部的INPUT的网络请求。浏览器

生产机之间最好也能够作这种封闭,可是若是运维资源实在紧张,能够只作对外出口的限制。毕竟,若是攻击者已经能够进入到生产机内网环境随意SSH了,就已经算是攻破了。

绝对不要把数据库的端口对外网打开。我已经见过太多案例,开发者在服务器上装了个mongo或者mysql就无论了,结果被别人整库拖库的事情。数据库属于内部服务,根本就没有打开的必要。

配置时切记不要把管理用的SSH端口给封住了,这样管理员本身也访问不了主机就尴尬了……

关闭没必要要的对外主动链接

生产服务通常也不须要主动发起对外的网络链接。一些例外的状况好比支付服务,微信受权服务,第三方的数据统计分析服务等。这些状况能够方便的经过IP/域名的白名单来处理。除此以外,生产机不该该可以主动发起任何对外网的访问。

修改默认端口

攻击者会尝试根据端口猜背后的程序是什么。好比对于端口22,攻击者会猜这是个SSH,而后会尝试弱口令等方式来攻击。若是你把SSH的端口随便改为一个好比4328,那么攻击者就得花更多的力气才能作这个猜想。若是攻击者不是针对你的话,也就不会废这个功夫猜了,毕竟不设防的机器多的是,何须死磕你的。

其余服务的端口也能够相似处理,好比MySql,Redis等。可是值得注意的是,由于浏览器访问Web时,若是不明确在URL里写端口,就会用80/443,而且端口还可能影响Cookie的有效性。因此Web的默认端口是不方便改的。

学会使用SSH

在*nix环境下,SSH是标准的远程主机访问的协议。全部对集群的管理都要使用SSH,所以对SSH的配置要格外留神。

老是使用生产级别的SSH认证方式

SSH支持至关多的认证方式。只有两种我认为是能够在生产中使用的:

  • 高强度公钥私钥对(好比用RSA-1024)

  • Kerberos

高强度公钥私钥由于配置方便,用得更普遍。而Kerberos须要比较复杂的配置,通常常见于大型企业内部。

不要使用任何基于密码的认证方式。若是你用了密码就要记住,为了记住这个密码必定是有某个含义的,这就为字典攻击提供了条件。而且密码在网络上传输也是很是不安全的。反复输入密码会进一步增长密码被记录的几率。记得,你和服务器之间隔着互联网,你永远不知道有谁在中间。

2015年已经有消息报道RSA-1024能够经过暴力破解,可是耗费了至关大的计算资源。目前看,对于小公司RSA-1024仍是安全的。可是你能够轻易地改用RSA-2048来产生公钥私钥对,指数级提升破解的难度。

RSA-1024的意思是用RSA算法产生长度为1024bit的公钥私钥对。越长的公钥私钥对越难被暴力破解。破解RSA-2048比RSA-1024须要的计算量大概大2^32倍。详情见这里

做为入口要定时更换认证key

若是是采用公钥私钥对做为SSH的认证,建议每一个季度/每半年更换一次公钥私钥对。如若是采用Kerberos做为SSH的认证,建议每一个季度/每半年换一次密码。之因此这样作是由于,这个更换的周期会远远小于常规暴力破解的时间。

访问生产资源时老是通过跳板机

也许你有不少服务器主机,可是若是运维资源部不足,无法很好的挨个配置主机的SSH端口设置,能够只开一台机器的SSH端口到外网,容许远程访问。这台对外网打开SSH的机器俗称“跳板机“。

为何使用跳板机呢?这是由于能够在一台机器上作全部的安全防御配置。在公司过规模小的时候,一我的就能够手工把全部的访问权限在这一台机器上搞了。

利用跳板机:

  • 可使用SSH的ProxyCommand。它可让你访问远程主机时必须通过跳板机。这样整个集群只须要在跳板机上开到外网的SSH端口了。

  • 可使用SSH的端口转发(Local Port Forwarding和Remote Port Forwarding)。这个功能能够容许你用SSH包装其余协议的数据,因而你能够通过跳板机的SSH端口访问其余主机的mysql、redis、mongodb……

    关于端口转发,这里推荐一个特别好的工具叫作SSL Tunnel Manager

固然,成熟的技术团队中,除了Lead、DBA和Ops,其余人不该该有权限访问生产服务。要作到这一点须要补充不少基础设施(好比带有Audit和ACL的生产数据库查询、比较方便的查询生产服务的log)。本文主要说小团队的低成本的事情,就不展开了。

确保你的软件源安全可靠

也许不少人对2015年的XCodeGhost不陌生。一些开发人员经过非官方渠道下载了XCode开发App。其中携带的被恶意篡改的基础库和App一块儿被打包,发布,最终安装在用户的设备上。这个问题可不必定只发生在XCode上。

天天开发者build程序都要使用各类开发工具,从外网各个地方下各类代码包。怎么确保这些东西就不出问题?最基础的防御是:老是从软件提供的官方渠道下载。就算再慢,被墙,也要想办法。若是技术手段没法约束,就必须行政手段强行禁止国内的各类下载网站下开发软件。

但若是访问这官方服务时断时续,或者比较浪费带宽(带宽费用相对比较贵),就要考虑自建“镜像”。像Artifactory就是很好的工具,能够充当内网的maven镜像库。

关注入口相关程序的漏洞

网络请求从链接到被执行,须要通过

  • 硬件(固件)

  • 操做系统

  • 系统库(好比openssl)

  • 程序库(好比jdk和依赖的各类jar)

  • 你的程序

时刻留意这个链条上的漏洞信息(新闻/社交网站讨论等),尤为是你开放的端口的对应服务的漏洞(好比开了443要特别留意操做系统、openssl和nginx的漏洞)。大多数时候漏洞比较偏门,或者说只有学术研究价值,这种能够忽略。但若是发现有漏洞的讨论已经很是广泛,就说明这个漏洞的影响至关大,而且很是容易被利用,抓紧时间升级和修复。

若是你用的是云服务,通常厂商都会有对受影响设施升级的公告,可能会形成停服务。请时刻留意。

管好你的秘钥

用了很强的认证方式后,还要记得好好保管。要是不注意,本身把私钥泄露到了公开的地方,再强的算法也保护不了你。任何状况下不要在网络上传递秘钥。若是要传递给别人,请用纸和笔。

此外,全部的私钥,密码最终都会记录在你本身的电脑上。因此若是你去上个厕所,别人偷偷跑过来从你的没锁的电脑上拿到私密的信息,那么以上全部的防御就都没有用了。所以,离开座位时请老是锁上你的屏幕

若是用Mac,推荐“触发角”功能。配置好后,鼠标一推就锁屏了。

总结

作到本文所说的全部策略,其实并不能保证绝对的安全。而且还有许多安全问题本文并无考虑,好比注入攻击,CRSF,带有密码的服务配置,内网服务API的ACL,DDoS,社工学骗管理密码,短信炸弹等。

可是按照本文作了,你的服务器毫不会被攻击者以毫无成本的扫描直接攻破。攻击者必须针对你作定制的攻击方案才有可能成功。这会极大的提升攻击成本。若是你的公司仍是个不起眼的小公司,那么基本上不会招眼——太不划算了。

值得注意的是,初创公司就算再怎么预算紧张,也必定要有人来负责运维。就算是开发顶一下也好,兼职也好,但机器不能没人管,无论是自建集群仍是云服务。只有这我的存在,上面说的这些事情才有期望能够作好。

随着业务的扩大,服务商业价值增长,随之而来的就是更多的关注和更多的有针对性的攻击的风险。这时候,也许公司已经能够雇得起一个专心作安全的团队,购买防御软件/硬件,或者能够找到一个靠谱的安全领域的合做机构,来处理更复杂的安全攻击。

祝好运!

相关文章
相关标签/搜索