使用vault管理ETCD RBAC

ETCD RBAC功能简介

ETCD的介绍网上已经烂大街了,我就不赘述了。因为本文主要是使用ETCD的RBAC功能,所以重点介绍一下此功能。

RBAC及Role-based access control,直译就是基于角色的访问控制。核心就是三个部分,权限、角色、用户。为角色绑定权限,为用户分配角色,目的是简化权限的管理。相同角色的用户拥有相同的权限,不需要对每个用户分配权限。

ETCD 在版本2.1后实现了此功能。ETCD使用RBAC主要作用是隔离不同用户的访问空间,我们知道ETCD是一个键值储存系统用来存贮用户的关键信息。如果不开启RBAC,所用用户都可以访问及操作所有的内容,这对一个存贮关键信息的系统来说是有安全隐患的。使用RBAC可以为不同的角色分配不同的键值访问权限,这样就保证了关键信息的安全。

vault简介

vault是由HashiCorp开发的一个secrets管理工具。所谓secrets,按照vault官网的介绍就是指token、password、certificate 以及encryption key等私密信息。对于secrets的管理,vault主要使用一个叫做secrets engine的模块实现。 secrets engine能够对于不同后端的secrets进行存储、生成、加密等。通过HTTP-API对外提供统一的密码访问入口,并且提供权限控制以及详细的日志审计功能。vault原生实现了多种secrets engine,如aws、google cloud、consul等。

但是很遗憾,vault原生并不支持针对ETCD的secrets engine,这导致ETCD用户无法使用vault来管理etcd rbac用户角色及密码。好在vault提供了用户接口,用户可以实现这些接口来开发一个plugin,使vault具有与ETCD交互的能力。

plugin设计

plugin相对于vault是独立编译的,运行的plugin是一个grpc server,vault通过plugin与secrets engine交互及本文中的ETCD。因为使用的是grpc进行交互,所以按理说任何支持grpc的语言都可以用来开发grpc。我使用的是golang,因为vault本身就是golang开发的。

这里仅贴出部分代码对plugin运行流程做一个简单的介绍,以下为plugin的目录结构。

plugin

    ├── engine

    │  ├── connection_Producer.go

    │  ├── doc.go

    │  ├── plugin.go

    │  └── plugin_test.go

    ├── main.go

    └── vendor.tgz

plugin/main.go

func main() {

        apiClientMeta := &pluginutil.APIClientMeta{}

        flags := apiClientMeta.FlagSet()

        flags.Parse(os.Args[1:])

        err := engine.Run(apiClientMeta.GetTLSConfig())

        if err != nil {

                log.Println(apiClientMeta.GetTLSConfig())

                os.Exit(1)

        }

}

main函数用来接收flag,并调用engine中的run函数,启动运行plugin,实际就是运行了一个grpc server。

对于ETCD操作的实现主要在engine文件中,

plugin/engine/connection_Producer.go

func (c *etcdConnectionProducer) Connection(ctx context.Context) (interface{}, error)

      if !c.Initialized {

                return nil, connutil.ErrNotInitialized

        }

        if c.client != nil {

                return c.client, nil

        }

    tlsInfo := transport.TLSInfo{

                CertFile: c.CertFile,

                KeyFile: c.KeyFIle,

                TrustedCAFile: c.TrustedCAFile,

        }

        tlsConfig, err := tlsInfo.ClientConfig()

        endpoints := strings.Split(c.Endpoints, ",")

        cfg := clientv3.Config{

                Endpoints:            endpoints,

                TLS:                  tlsConfig,

                Username:            "root",

                Password:            c.RootPassword,

                DialTimeout:          5 * time.Second,

                DialKeepAliveTime:    10 * time.Second,

                DialKeepAliveTimeout: 3 * time.Second,

        }

        client, err := clientv3.New(cfg)

        if err != nil {

                return nil, err

        }

        c.client = client

        return c.client, nil

}

Connection为与ETCD建立链接的函数,实际调用了etcd.io/etcd包中的clientv3模块生成了etcd client。

plugin/engine/plugin.go

通过plugin/engine/connection_Producer.go建立链接后,可以使用client实例对ETCD进行操作,并且需要实现vault提供的接口。

type Database interface { 

 Type() (string, error) 

 CreateUser(ctx context.Context, statements Statements, usernameConfig UsernameConfig, expiration time.Time)(username string, password string, err error)

 RenewUser(ctx context.Context, statements Statements, username string, expiration time.Time) error 

 RevokeUser(ctx context.Context, statements Statements, username string) error 

 RotateRootCredentials(ctx context.Context, statements []string) (config map[string]interface{}, err error) 

 Init(ctx context.Context, config map[string]interface{}, verifyConnection bool) (saveConfig map[string]interface{}, err error) 

 Close() error

}

CreateUser    新建ETCD用户并分配权限,并且可以设置ttl

RenewUser    如果新建用户时设置ttl,此命令用于刷新ttl

RevokeUser    删除用户及角色

使用plugin

在vault的config文件中,添加plugin_directory及api_addr两字段。

plugin_directory = "/vault/plugin"

api_addr = "https://0.0.0.0:8200"

将build成功的plugin放在plugin_directory指定的目录下,进行以下操作,来通过vault获得ETCD用户名及密码。

注册plugin

./vault plugin register -sha256=4b03d14761de35910dfedb49b07bc026e94b8a866e2eee6d4af518b67dbff9a0 -command="plugin -tls-skip-verify" etcd-plugin

secrets enable database

./vault secrets enable database

write config //启动plugin

./vault write database/config/etcd-role plugin_name=etcd-plugin endpoints="http://xxx:2379"rootpassword="123" allowed_roles="my-role" 

endpints是etcd的地址,rootpassword是ETCD RBAC的root用户密码

write role

./vault write database/roles/my-role db_name=etcd-role creation_statements='{"role_name":"role1", "roles":[{"role":"readwirte","dir":"/app1"},{"role":"readwrite","dir":"/services"}]}' revocation_statements='{"role_name":"role1"}'  default_ttl="180"

read creds //执行create_user

./vault read database/creds/my-role

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容