【安全】redis配置不当可导致服务器被远程登录或权限提升

【安全】redis配置不当可导致服务器被远程登录或权限提升
今天看到了这篇文章: redis未授权访问缺陷导致系统被黑,  http://www.blogjava.net/writegull/archive/2015/12/15/428651.html
想起了前段时间也补过这个漏洞,不过没有像楼主服务器遭受到攻击!

总结下修复漏洞方案:

Redis服务器配置不当的体现:

1、redis服务已root账户/权限启动;

2、redis服务无需密码或弱密码进行认证;

3、redis服务器本身对互联网开放了SSH服务,允许key方式登录。


修复方案:

1、不要以root用户允许redis

2、修改运行redis的端口,编辑配置文件(/etc/redis.conf)

port 4321

3、如果只需要本地访问,编辑配置文件(/etc/redis.conf)

bind 127.0.0.1

4、设定密码,编辑配置文件

requirepass ******

5、在启动的时候需要指定配置文件的路径,这些设置才会生效

redis-server /etc/redis.conf

Redis安全配置参考:

http://wiki.wooyun.org/server:redis

服务器上操作过程大家可参考:

第一步:

非root权限启动,建立普通用户并设置密码,redis-server和redis.conf宿主权限修改为普通用户。


[root@cdn bin]# chown -R ugcstore:root /usr/loca/bin/redis-server 

[root@cdn bin]# chown -R ugcstore:root /usr/local/redis/redis.conf


切换到普通用户


su - ugcstore


后台启动redis:


nohup redis-server /usr/local/redis/redis.conf &


查看redis进程,验证宿主用户


ps -ef |grep redis

ugcstore 17602     1  0 22:06 ?        00:00:01 redis-server x.x.x.x:4321       


第二步:

一般是在/etc/redis.conf,如果/etc下没有找到,find搜索下.

操作的服务器redis.conf文件位置: /usr/local/redis/redis.conf


port 4321 #修改端口

requirepass ****** #设置密码

bind x.x.x.x  # 非本机可访问 



第三步:

调整连接redis的程序,设置密码,验证程序是否能正确获取数据.

测试数据:key:foo value:bar


[root@cdn ugc]# telnet x.x.x.x 4321

Trying 65.255.33.64...

Connected to 65.255.33.64.

Escape character is '^]'.

auth E38faeQGtxr##rOP

+OK

set foo bar

+OK

get foo

$3

bar



PHP程序测试:

/data/vfetch/public/test.php

<? php
/* *
 * @author david
 
*/

/* *
 * 创建redis链接
 
*/
function  createConn()
{
    
try
    {
        
$redis = new  Redis;
        
$redis -> connect( ' x.x.x.x ' ,   4321 );
        
$redis -> auth( ' ****** ' );
        
return   $redis ;
    }
    
catch (RedisException  $e )
    {
        
return   false ;
    }

}

$rediss   =  createConn();
echo   $rediss -> get( ' foo ' );



Java程序测试:

public   class  JedisTest {
    
static  JedisPool pool  =   null ;

    
public   static  JedisPool getPool() {
        
if  (pool  ==   null ) {
            JedisPoolConfig config 
=   new  JedisPoolConfig();
            config.setMaxActive(
500 );
            config.setMaxIdle(
20 );
            config.setMaxWait(
1000   *   30 );
            config.setTestOnBorrow(
true );
            pool 
=   new  JedisPool(config,  " x.x.x.x " 4321 5000 " ****** " );
        }
        System.out.println(pool);
        
return  pool;
    }

    
public   static   void  close(JedisPool pool, Jedis redis) {
        
if  (redis  !=   null ) {
            pool.returnResource(redis);
        }
    }

    
public   static  String get(String key) {
        String value 
=   null ;
        JedisPool pool 
=   null ;
        Jedis jedis 
=   null ;
        
try  {
            pool 
=  getPool();
            jedis 
=  pool.getResource();
            value 
=  jedis.get(key);
        } 
catch  (Exception e) {
            pool.returnBrokenResource(jedis);
        } 
finally  {
            close(pool, jedis);
        }
        
return  value;
    }

    
public   static   void  main(String[] args) {
        System.out.println(get(
" foo " ));
    }
}

你可能感兴趣的:(【安全】redis配置不当可导致服务器被远程登录或权限提升)