`
ZeaLoVe
  • 浏览: 89906 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

etcd权限系统认证过程加cache

    博客分类:
  • etcd
 
阅读更多

最近在研究etcd的权限机制,etcd用的认证方式比较简单basic auth。原理也比较简单易懂,但轻率上线后,发现一个大坑,就是认证时候用来比较密码的哈希是bcript,而且是每个请求都会调。这个耗时很大,导致集群性能下降的厉害,基本不能用了。

 

查遍官方文档,说3.1+ 用https common name的方式可以解决这个问题,但是我就不想上https,涉及改造的工作量有点大,就想通过auth简单的把误操作的行为隔离一下。

 

于是乎只能开始动手改了,简单的加一个cache先用。

 

首先我们用的etcd版本为2.1.1

git clone https://github.com/coreos/etcd.git

git checkout v2.1.1

下载代码后,切换到 v2.1.1 tag下

打开目录 etcdserver

在目录下添加新文件,姑且叫做 password_map.go

添加如下代码

// author:ZeaLoVe
// password map of etcd v2 api
 
package auth
 
import (
    "fmt"
    "sync"
)
 
// key  : string  meke by hashed password + plaintext password
// value: error   the result of CompareHashAndPassword
type PasswordMap struct {
    sync.RWMutex
    M map[string]error
}
 
var DefaultPasswdMap = PasswordMap{
    M: make(map[string]error),
}
 
func (this *PasswordMap) Hit(hashed, pt string) bool {
    this.RLock()
    defer this.RUnlock()
    if _, ok := this.M[hashed+pt]; ok {
        return ok
    }
    return false
}
 
// Get must called after Hit
func (this *PasswordMap) Get(hashed, pt string) error {
    this.RLock()
    defer this.RUnlock()
    if val, ok := this.M[hashed+pt]; ok {
        return val
    }
    return fmt.Errorf("no hit")
}
 
func (this *PasswordMap) Set(hashed string, pt string, err error) {
    if hashed == "" {
        return
    }
    this.Lock()
    defer this.Unlock()
    this.M[hashed+pt] = err
}

打开该文件夹下的auth.go 找到 CheckPassword函数

修改为

func (u User) CheckPassword(password string) bool {
    if DefaultPasswdMap.Hit(u.Password, password) {
        return DefaultPasswdMap.Get(u.Password, password) == nil
    }
    err := bcrypt.CompareHashAndPassword([]byte(u.Password), []byte(password))
    DefaultPasswdMap.Set(u.Password, password, err)
    return err == nil
}

对于其他版本,虽然实现上可能有些区别,但整个原理是一样的(我看过3.1的基本没怎么改变)。此改造不会影响第一次请求的耗时,但后面不会对相同的密码再次调用bcript,会直接返回缓存的结果,极大提高了性能

 

但该实现没有回收缓存的空间,所以如果有人对同一个账号用各种不同的密码轮番攻击,可能会导致内存持续上升。但经过压测,发现即使试十万次内存也只上涨不到30M。可以暂时忽略这个问题。

即使内存大到一定程度,重启也可以恢复。

 

分享到:
评论

相关推荐

    cache系统介绍

    CPU cache系统介绍,详细介绍了cache的组成等等内容。

    cache实验 cache实验 cache实验

    cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验...

    Cache一致性-计算机系统结构论文

    为了缓和CPU与存储器之间的速度差距,在计算机系统的CPU与主存之间引入了cache。但在多处理器系统中,由于多个处理器可能对同一数据块进行读写操作,当某个处理器对共享的数据块进行写操作时,其它处理器的cache中该...

    流水cpu加cache

    五级流水cpu,cache存储,30条指令,延时槽实现

    Supercache X86 win7版本

    SuperCache实现专利的数据块级别的缓存技术,除提高系统性能之外,还能独自进行 NT 文件级别缓存。 SuperCache使用获得专利的块级高速缓存技术来提升系统的性能,这种技术远胜于单纯使用NT文件级的高速缓存。通过...

    cache数据库基础操作资料

    cache数据库基础操作资料,包含建库建表,关联查询

    Linux系统内核文件Cache管理机制

    自从诞生以来,Linux 就被不断完善和普及,目前它已经成为主流通用操作系统之一,使用得非常广泛,它与 Windows、UNIX 一起占据了操作系统领域几乎所有的市场份额。特别是在高性能计算领域,Linux 已经成为一个占...

    Cache对系统性能的影响

    通过实验获得的真实数据记录与分析,Cache的大小对系统性能的影响。

    等待事件row cache lock,latch row cache objects处理过程.txt

    等待事件row cache lock,latch row cache objects处理过程

    处理器系统中的Cache-Memory

    Cache-Memory处于Memory Hierarch的最顶端,其下是主存储器和外部存储器,合理使用Cache是降低存储器访问时间的有效途径。介绍了的Cache的工作原理组成结构等。

    Cache数据库系统开发培训,非常好的资料.zip

    Cache数据库系统开发培训,非常好的资料。 Cache数据库系统开发培训 Cache

    cache性能分析实验报告.docx

    cache性能分析实验报告

    高速缓存(Cache)的Verilog代码

    该工程包含数据缓存D_Cache和指令缓存I_Cache的Verilog代码和仿真文件,Cache的详细技术参数包含在.v文件的注释中。 直接相连16KB D_Cache Cache写策略: 写回法+写分配 (二路)组相连16KB I_Cache Cache替换策略: ...

    Cachecloud文档

    Cachecloud文档Cachecloud文档

    论文研究-基于分布式合作cache的私有cache划分方法.pdf

    当片上多处理器系统上运行多个不同程序时,如何给这些不同的应用程序分配适当的cache空间成为一个难题。Cache划分就是解决这一难题的有效方法,目前大部分的划分方法都是针对最后一级共享cache设计的。私有cache划分...

    PC系统高速缓冲存储器Cache的原理

    PC系统高速缓冲存储器Cache的原理、设计及实现

    头歌计算机组成原理2路组相联cache设计

    头歌计算机组成原理2路组相联cache设计头歌计算机组成原理2路组相联cache设计头歌计算机组成原理2路组相联cache设计头歌计算机组成原理2路组相联cache设计头歌计算机组成原理2路组相联cache设计头歌计算机组成原理2...

    介绍L2 cache

    关于二级缓存的介绍 L2cache存储方式有set way等概念,具体有实例图的

    primocache3.09破解

    primocache3.09+破解批处理,

    PrimoCache V2.6.0 重置试用期

    执行BAT脚本,对PrimoCache软件重置试用期60天。 支持版本如下: 2.4.0 2.5.0 2.6.0 脚本原始主体来自网络,非我原创。 虽然没见过原始脚本之前就发现了准确的文件和注册表信息位置, 但是对于重置标志开关,自己...

Global site tag (gtag.js) - Google Analytics