NutzCN Logo
问答 系统运行一段时间 redis就会挂了
发布于 2815天前 作者 Hamming 14251 次浏览 复制 上一个帖子 下一个帖子
标签:

redis配置如下

var ioc = {
// 参考 https://github.com/xetorthio/jedis/wiki/Getting-started
		jedisPoolConfig : {
			type : "redis.clients.jedis.JedisPoolConfig",
			fields : {
				testWhileIdle : true, // 空闲时测试,免得redis连接空闲时间长了断线
				maxTotal : 100 // 一般都够了吧
			}
		},
		jedisPool : {
			type : "redis.clients.jedis.JedisPool",
			args : [
			        {refer : "jedisPoolConfig"},
			        // 从配置文件中读取redis服务器信息
			        {java : "$conf.get('redis.host', 'localhost')"}, 
			        {java : "$conf.getInt('redis.port', 6379)"}, 
			        {java : "$conf.getInt('redis.timeout', 2000)"}, 
			        {java : "$conf.get('redis.password')"}, 
			        ],
			fields : {},
			events : {
				depose : "destroy" // 关闭应用时必须关掉呢
			}
		}
};
@IocBean(args = {"refer:dao"})
public class ApiService extends Service<Sys_api> {
    private static final Log log = Logs.get();

    public ApiService(Dao dao) {
        super(dao);
    }

    private static final String at="accessToken";

    public static Key key;

    /**
     * 生成token
     * Key以字节流形式存入redis
     *
     * @param date  失效时间
     * @param appId AppId
     * @return
     */
    @Aop("redis")
    public String generateToken(Date date, String appId){
        try{
            byte[] buf = jedis().get("api:key".getBytes());
            if (buf == null) { // 建新的key
                key = MacProvider.generateKey();
                ByteArrayOutputStream bao = new ByteArrayOutputStream();
                ObjectOutputStream oos = new ObjectOutputStream(bao);
                oos.writeObject(key);
                buf = bao.toByteArray();
                jedis().set("api:key".getBytes(), buf);
            } else { // 重用老key
                key = (Key) new ObjectInputStream(new ByteArrayInputStream(buf)).readObject();
            }
        }catch (IOException io){
            System.out.println(io);
        }catch (ClassNotFoundException c){
            System.out.println(c);
        }
        String token = Jwts.builder()
                .setSubject(appId)
                .signWith(SignatureAlgorithm.HS512, key)
                .setExpiration(date)
                .compact();
        // 计算失效秒,7889400秒三个月
        Date temp = new Date();
        long interval = (date.getTime() - temp.getTime())/1000;
        jedis().setex(at+appId ,(int)interval,token);
        return token;
    }

    /**
     * 验证token
     * @param appId AppId
     * @param token token
     * @return
     */
    @Aop("redis")
    public boolean verifyToken(String appId, String token) {
        try {
            if (key == null) {
                byte[] buf = jedis().get("api:key".getBytes());
                if(buf==null){
                    return false;
                }
                key = (Key) new ObjectInputStream(new ByteArrayInputStream(buf)).readObject();
            }
            Jwts.parser().setSigningKey(key).parseClaimsJws(token).getBody().getSubject().equals(appId);
            return true;
        } catch (Exception e) {
            log.debug(e.getMessage());
            return false;
        }
    }

    /**
     * 获取token
     * @param appId
     * @return
     */
    @Aop("redis")
    public String getToken(String appId) {

        return jedis().get(at+appId);
    }

    /**
     * 验证会员ID,用于首页接口、产品查看、收藏等接口
     * @param appId
     * @return
     */
    public boolean verifyId(String appId) {
        try {
            App_user user = dao().fetch(App_user.class, Cnd.where("id","=",Long.parseLong(appId)));
            if (user!=null){
                return true;
            }else {
                return false;
            }
        } catch (Exception e) {
            log.debug(e.getMessage());
            return false;
        }
    }

10 回复

挂掉的体现是什么?报错信息? redis-cli也连不上?

页面访问 就报错

HTTP Status 500 - Filtered request failed.

type Exception report

message Filtered request failed.

description The server encountered an internal error that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: Filtered request failed.
	org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:384)
	org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
root cause

redis.clients.jedis.exceptions.JedisDataException: NOAUTH Authentication required.
	redis.clients.jedis.Protocol.processError(Protocol.java:117)
	redis.clients.jedis.Protocol.process(Protocol.java:151)
	redis.clients.jedis.Protocol.read(Protocol.java:205)
	redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:297)
	redis.clients.jedis.Connection.getBinaryBulkReply(Connection.java:216)
	redis.clients.jedis.BinaryJedis.hget(BinaryJedis.java:765)
	nuoshang.bluejay.common.shiro.cache.RedisCache.get(RedisCache.java:44)
	nuoshang.bluejay.common.shiro.cache.LCache.get(LCache.java:32)
	org.apache.shiro.session.mgt.eis.CachingSessionDAO.getCachedSession(CachingSessionDAO.java:217)
	org.apache.shiro.session.mgt.eis.CachingSessionDAO.getCachedSession(CachingSessionDAO.java:202)
	org.apache.shiro.session.mgt.eis.CachingSessionDAO.readSession(CachingSessionDAO.java:259)
	org.apache.shiro.session.mgt.DefaultSessionManager.retrieveSessionFromDataSource(DefaultSessionManager.java:236)
	org.apache.shiro.session.mgt.DefaultSessionManager.retrieveSession(DefaultSessionManager.java:222)
	org.apache.shiro.session.mgt.AbstractValidatingSessionManager.doGetSession(AbstractValidatingSessionManager.java:118)
	org.apache.shiro.session.mgt.AbstractNativeSessionManager.lookupSession(AbstractNativeSessionManager.java:148)
	org.apache.shiro.session.mgt.AbstractNativeSessionManager.getSession(AbstractNativeSessionManager.java:140)
	org.apache.shiro.mgt.SessionsSecurityManager.getSession(SessionsSecurityManager.java:156)
	org.apache.shiro.mgt.DefaultSecurityManager.resolveContextSession(DefaultSecurityManager.java:456)
	org.apache.shiro.mgt.DefaultSecurityManager.resolveSession(DefaultSecurityManager.java:442)
	org.apache.shiro.mgt.DefaultSecurityManager.createSubject(DefaultSecurityManager.java:338)
	org.apache.shiro.subject.Subject$Builder.buildSubject(Subject.java:846)
	org.apache.shiro.web.subject.WebSubject$Builder.buildWebSubject(WebSubject.java:148)
	org.apache.shiro.web.servlet.AbstractShiroFilter.createSubject(AbstractShiroFilter.java:292)
	org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:359)
	org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)

后台错误

2017-03-03 09:11:48,767 org.nutz.ioc.impl.NutIoc.get(NutIoc.java:151) DEBUG - Get 'permission'<class nuoshang.bluejay.common.shiro.view.Permission>
2017-03-03 09:11:48,777 org.nutz.ioc.impl.NutIoc.get(NutIoc.java:151) DEBUG - Get 'permission'<class nuoshang.bluejay.common.shiro.view.Permission>
2017-03-03 09:11:48,777 org.apache.shiro.web.servlet.AbstractShiroFilter.updateSessionLastAccessTime(AbstractShiroFilter.java:317) ERROR - session.touch() method invocation has failed.  Unable to upda
tethe corresponding session's last access time based on the incoming request.
redis.clients.jedis.exceptions.JedisDataException: NOAUTH Authentication required.
        at redis.clients.jedis.Protocol.processError(Protocol.java:117)
        at redis.clients.jedis.Protocol.process(Protocol.java:151)
        at redis.clients.jedis.Protocol.read(Protocol.java:205)
        at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:297)
        at redis.clients.jedis.Connection.getIntegerReply(Connection.java:222)
        at redis.clients.jedis.BinaryJedis.hset(BinaryJedis.java:749)
        at nuoshang.bluejay.common.shiro.cache.RedisCache.put(RedisCache.java:56)
        at nuoshang.bluejay.common.shiro.cache.LCache.put(LCache.java:42)
        at org.apache.shiro.session.mgt.eis.CachingSessionDAO.cache(CachingSessionDAO.java:247)
        at org.apache.shiro.session.mgt.eis.CachingSessionDAO.cache(CachingSessionDAO.java:235)
        at org.apache.shiro.session.mgt.eis.CachingSessionDAO.update(CachingSessionDAO.java:280)
        at org.apache.shiro.session.mgt.DefaultSessionManager.onChange(DefaultSessionManager.java:212)
        at org.apache.shiro.session.mgt.AbstractNativeSessionManager.touch(AbstractNativeSessionManager.java:233)
        at org.apache.shiro.session.mgt.DelegatingSession.touch(DelegatingSession.java:120)
        at org.apache.shiro.session.ProxiedSession.touch(ProxiedSession.java:100)
        at org.apache.shiro.web.servlet.AbstractShiroFilter.updateSessionLastAccessTime(AbstractShiroFilter.java:315)
        at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:364)
        at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
        at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
        at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383)
        at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362)
        at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)

把这一行注释掉试试

{java : "$conf.get('redis.password')"}

不对,这是redis要密码,但没有提供密码.

是不是被黑了?

redis 没有设置密码

所以被黑了

T_T不是吧 那怎么设置密码

Redis未授权访问漏洞
更新时间:2017-01-06 12:09:40
一.漏洞描述

Redis因配置不当可以导致未授权访问,被攻击者恶意利用。当前流行的针对Redis未授权访问的一种新型攻击方式,在特定条件下,如果Redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器,可导致服务器权限被获取和数据删除、泄露或加密勒索事件发生,严重危害业务正常服务。

二.Redis安全漏洞影响

一旦入侵成功,Redis数据会丢失,攻击者可直接添加账号用于ssh远程登录控制服务器,会给用户的 Redis 运行环境以及 Linux 主机造成安全风险,引发重要数据删除、泄露或加密勒索事件发生。

三.已确认被成功利用的软件及系统

使用redis客户端直接无账号成功登录redis:

root@kali:~# redis-cli -h 10.16.10.2 redis 10.16.10.2:6379&gt; keys * 1) "1"
从登录的结果可以看出该redis服务对公网开放,且未启用认证。

三.建议修复方案

网络层加固
1.指定redis服务使用的网卡 (需要重启redis才能生效)redis默认是监听的127.0.0.1上,如果仅仅是本地通信,请确保监听在本地。这种方式缓解了redis的风险,当然并不能绝对保证安全了,假如攻击者有了一个webshell,并且redis以root用户运行,就可以通过该redis来反弹shell,来实现提权。

在 redis.conf 文件中找到 “# bind 127.0.0.1” ,把前面的#号去掉,然后保存。注:修改后只有本机才能访问Redis,也可以指定访问源IP访问Redis。

bind 192.168.1.100 10.0.0.1

2.设置防火墙策略如果正常业务中Redis服务需要被其他服务器来访问,可以设置iptables策略仅允许指定的IP来访问Redis服务。

iptables -A INPUT -s x.x.x.x -p tcp --dport 6379 -j ACCEPT
账号与认证
1.设置访问密码 (需要重启redis才能生效)在 redis.conf 中找到“requirepass”字段,在后面填上你需要的密码,Redis客户端也需要使用此密码来访问Redis服务。

打开/etc/redis/redis.conf配置文件:

#requirepass !QE%^E3323BDWEwwwe1839
确保密码的复杂度,配置完毕后重启服务即可生效。

服务运行权限最小化
1.修改Redis服务运行账号 (需要重启redis才能生效)请以较低权限账号运行Redis服务,并禁用该账号的登录权限。以下为创建一个无home目录和无法登陆的普通权限账号:

useradd -M -s /sbin/nologin [username]

服务精细化授权
redis没有权限分离之说,无管理员账号和普通账户之分,导致攻击者登陆后可执行任意操作,因此需要隐藏重要命令,具体如下:

FLUSHDB, FLUSHALL, KEYS,PEXPIRE, DEL, CONFIG, SHUTDOWN, BGREWRITEAOF, BGSAVE, SAVE, SPOP, SREM, RENAME,DEBUG, EVAL等。

在redis2.8.1 及 redis3.x(<3.0.2) 版本下存在eval沙箱逃逸漏洞,攻击者可通过该漏洞执行任意Lua代码。

具体缓解攻击操作,供参考:下述配置将config/flushdb/flushall设置为空,即禁用该命令;也可命名一些攻击者难以猜解的名字。

rename-command CONFIG “”

rename-command flushall “”

rename-command flushdb “”

rename-command shutdown shotdown_test

保存后,执行/etc/init.d/redis-server restart重启生效。

安全补丁
不定期关注最新软件版本,并升级redis到最新版,防止新漏洞被利用。

原文地址

https://help.aliyun.com/knowledge_detail/37447.html
Redis未授权访问漏洞
更新时间:2017-01-06 12:09:40
一.漏洞描述

Redis因配置不当可以导致未授权访问,被攻击者恶意利用。当前流行的针对Redis未授权访问的一种新型攻击方式,在特定条件下,如果Redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器,可导致服务器权限被获取和数据删除、泄露或加密勒索事件发生,严重危害业务正常服务。

二.Redis安全漏洞影响

一旦入侵成功,Redis数据会丢失,攻击者可直接添加账号用于ssh远程登录控制服务器,会给用户的 Redis 运行环境以及 Linux 主机造成安全风险,引发重要数据删除、泄露或加密勒索事件发生。

三.已确认被成功利用的软件及系统

使用redis客户端直接无账号成功登录redis:

`root@kali:~# redis-cli -h 10.16.10.2
redis 10.16.10.2:6379&gt; keys *
1) "1"`
从登录的结果可以看出该redis服务对公网开放,且未启用认证。

三.建议修复方案

网络层加固
1.指定redis服务使用的网卡 (需要重启redis才能生效)redis默认是监听的127.0.0.1上,如果仅仅是本地通信,请确保监听在本地。这种方式缓解了redis的风险,当然并不能绝对保证安全了,假如攻击者有了一个webshell,并且redis以root用户运行,就可以通过该redis来反弹shell,来实现提权。

在 redis.conf 文件中找到 “# bind 127.0.0.1” ,把前面的#号去掉,然后保存。注:修改后只有本机才能访问Redis,也可以指定访问源IP访问Redis。

# bind 192.168.1.100 10.0.0.1
2.设置防火墙策略如果正常业务中Redis服务需要被其他服务器来访问,可以设置iptables策略仅允许指定的IP来访问Redis服务。

iptables -A INPUT -s x.x.x.x -p tcp --dport 6379 -j ACCEPT
账号与认证
1.设置访问密码 (需要重启redis才能生效)在 redis.conf 中找到“requirepass”字段,在后面填上你需要的密码,Redis客户端也需要使用此密码来访问Redis服务。

打开/etc/redis/redis.conf配置文件:

 #requirepass !QE%^E3323BDWEwwwe1839
确保密码的复杂度,配置完毕后重启服务即可生效。

服务运行权限最小化
1.修改Redis服务运行账号 (需要重启redis才能生效)请以较低权限账号运行Redis服务,并禁用该账号的登录权限。以下为创建一个无home目录和无法登陆的普通权限账号:

#useradd -M -s /sbin/nologin [username]
服务精细化授权
redis没有权限分离之说,无管理员账号和普通账户之分,导致攻击者登陆后可执行任意操作,因此需要隐藏重要命令,具体如下:

FLUSHDB, FLUSHALL, KEYS,PEXPIRE, DEL, CONFIG, SHUTDOWN, BGREWRITEAOF, BGSAVE, SAVE, SPOP, SREM, RENAME,DEBUG, EVAL等。

在redis2.8.1 及 redis3.x(<3.0.2) 版本下存在eval沙箱逃逸漏洞,攻击者可通过该漏洞执行任意Lua代码。

具体缓解攻击操作,供参考:下述配置将config/flushdb/flushall设置为空,即禁用该命令;也可命名一些攻击者难以猜解的名字。

rename-command CONFIG “”

rename-command flushall “”

rename-command flushdb “”

rename-command shutdown shotdown_test

保存后,执行/etc/init.d/redis-server restart重启生效。

安全补丁
不定期关注最新软件版本,并升级redis到最新版,防止新漏洞被利用。
添加回复
请先登陆
回到顶部