管理users和permissions
Managing users and permissions
从tsuru0.13.0版本开始,引入了新的用户和权限管理机制。这个新的机制允许更好地控制每个用户可用的动作。当尝试允许更大的权限时,可以避免需要每次交互来判断新的可用权限。
为了获得这个目标,一些概念需要在下面解释一下:
概念
权限
tsuru包含一个固定的权限号,权限号可能在每次发布时会改变。为列出所有可用的权限,应该使用tsuru permission-list命令。
在tsuru中的权限工作在水平的形式,且使用点符号来代表。授权获取高层次的权限意味着接入了所有下面的权限。
比如,考虑下面的权限:
- app.update.env.set
- app.update.env.unset
- app.deploy
如果用户只有获取app.update.env.set的权限,那么只有这个特殊的动作是可用的。然而,也可能授权更大的app.update权限,允许用户set和unset环境变量,但是不能部署应用。如果我们想允许用户执行一个应用的所有相关的动作,更大的权限app可以被使用。
上下文
当给用户应用权限,必须在一个上下文去做。每个权限声明了在哪个上下文可以使用。可能的上下文可以通过使用命令tsuru permission-list来获取。当权限富裕一个用户,需要一个上下文和赋予给选定的上下文的值。可用的上下文的例子如下:
- team
- app
- global
如果用户有app.deploy的权限,为名为myteam的team,意味着他们只能部署myteam可以接入的应用。同样,可能带有app上下文赋予用户相同的app.deploy权限,为名为myappname。这意味着用户可以部署这个名为myappname的特定的应用。
这个global上下文是一个特殊的情形。它允许所有的权限,意味着权限一直可以生效。在之前的场景中,如果用户有带有global上下文的app.deploy权限,意味着他们可以部署任何应用。
角色
为了更好地管理权限,不可能直接赋予用户权限。首先你必须创建一个包含想要的权限的角色,然后赋予这个角色一个上下文的值,这可以适用于一个或者更多用户。
下面的命令可以用来管理角色和权限,然后赋予用户权限:
- tsuru permission-list
- tsuru role-add
- tsuru role-remove
- tsuru role-list
- tsuru role-permission-add
- tsuru role-permission-remove
- tsuru role-assign
- tsuru role-dissociate
关于每个命令的更多的细节可以参考client documentation。
增加一个角色,然后赋予它给一个用户的典型例子如下:
$ tsuru role-add app_reader_restarter team
Role successfully created!
$ tsuru role-list
+----------------------+---------+-------------+
| Role | Context | Permissions |
+----------------------+---------+-------------+
| AllowAll | global | * |
+----------------------+---------+-------------+
| app_reader_restarter | team | |
+----------------------+---------+-------------+
$ tsuru role-permission-add app_reader_restarter app.read app.update.restart
Permission successfully added!
$ tsuru role-list
+----------------------+---------+--------------------+
| Role | Context | Permissions |
+----------------------+---------+--------------------+
| AllowAll | global | * |
+----------------------+---------+--------------------+
| app_reader_restarter | team | app.read |
| | | app.update.restart |
+----------------------+---------+--------------------+
$ tsuru user-list
+-------------------+------------------+-------------+
| User | Roles | Permissions |
+-------------------+------------------+-------------+
| admin@example.com | AllowAll(global) | *(global) |
+-------------------+------------------+-------------+
| myuser@corp.com | | |
+-------------------+------------------+-------------+
$ tsuru role-assign app_reader_restarter myuser@corp.com myteamname
Role successfully assigned!
$ tsuru user-list
+-------------------+---------------------------------------+-------------------------------------+
| User | Roles | Permissions |
+-------------------+---------------------------------------+-------------------------------------+
| admin@example.com | AllowAll(global) | *(global) |
+-------------------+---------------------------------------+-------------------------------------+
| myuser@corp.com | app_reader_restarter(team myteamname) | app.read(team myteamname) |
| | | app.update.restart(team myteamname) |
+-------------------+---------------------------------------+-------------------------------------+
从现在开始,名为myuser@corp.com的用户可以读取和重启所有属于名为myteamname的应用。
默认角色
当一些事件在偶然在tsuru上发生时,可能把默认角色赋予用户。这种事件的例子是user-create和team-create命令。所有可能事件的列表可以通过执行tsuru role-default-list命令获取。在一个事件中,可以使用命令tsuru role-default-add和tsuru role-default-remove来包含或移除新的角色。
默认角色的一种常见使用方法是在0.13.0之前的版本上复制tsuru的行为。新的用户应该一直被允许创建新的team和被允许在新创建的team上创建新的应用。
为了使用默认的角色达到这个目的,首先两个角色需要被创建,我们称之为team-creator和team-member。team-creator应该使用global上下文和包含team.create权限。team-member应该使用team上下文和包含app权限。
使用这些创建的角色,我们只需要把他们作为默认值,在合适的事件上:
$ tsuru role-default-add --user-create team-creator --team-create team-member
迁移
当你已经有安装了的的tsuru,有必要创建角色,然后赋予所有存在的用户,否则他们不能在tsuru中执行任何动作。
为了让这个过程更简单,我们创建了一个迁移来帮助这种转换。这个迁移的目标是粗糙地给存在的用户已经在tsuru上拥有的相同的权限集合。为了实现这个目标,需要创建三种不同的角色:admin、team-member和team-creator。
admin角色会有一个全局的上下文给root权限,并且会赋予给在tsuru.conf文件中描述的admin-team的所有成员。这些用户可以在任何地方做任何事情了。
team-member角色有一个team上下文和以下的权限:
- app
- team
- service-instance
还会赋予给用户所属的team中的所有用户。
team-ceator角色只会包含带有global上下文的team.create权限,也会赋予给所有的用户。
角色team-creator也会被赋予默认角色,当新的用户被创建。team-member角色会是默认角色,被赋予一个用户当他们创建一个新的team时。
执行这个迁移是可选的。如果你选择执行,只需要:
$ tsurud [--config <path to tsuru.conf>] migrate --name migrate-roles
Bootstrapping
对于新的tsuru安装,第一个创建的用户应该有root权限的角色。为了创建这个用户,tsuru守护进程应用(tsuru)创建了一个新的命令。这个命令应该在它安装后马上被执行:
$ tsurud [--config <path to tsuru.conf>] root-user-create myemail@somewhere.com
# type a password and confirmation (only if using native auth scheme)