> From: "Mickey Spiegel" <[email protected]>
> To: "Lance Richardson" <[email protected]>
> Cc: "Russell Bryant" <[email protected]>, "devovs" <[email protected]>
> Sent: Tuesday, March 14, 2017 3:06:53 PM
> Subject: Re: [ovs-dev] OVN: Compromised Chassis Mitigation
>
Hi Mickey,
Thanks for the excellent feedback. Here's the latest pass:
1) Add a new column, "role", of type "string" to the remote connection
table. If set, role-based access control is applied to transactions
on these connections using "role" as the index to the "RBAC_Roles"
table. If not set, role-based access control is not applied (e.g.
local unix: remotes between northd and ovsdb will not require RBAC
and will therefore not set the "role" column).
For connections having role-based ACLs enabled, a reliable client ID
is required. This will require the use of SSL and client certificates
with CN field containing the client ID.
2) Add a new table, "RBAC_Roles", which is indexed by a role name
and contains two columns:
"name": Name of role, type string. Corresponds to "role"
column in remote connection table.
"permissions": A map of string (table name) to UUID (row in the
"RBAC_Permissions" table).
The purpose of this table is to select a row in the RBAC_Permissions
table based on the transaction client's "role" and the name of a
table to be modified by an operation within a transaction. Having
this level of indirection allows new roles and access controls to
be created and managed dynamically, without having to update code
or schemas.
3) Add a new table, "RBAC_Permissions" which is initialized to contain one
row for each table in the schema that can be modified by ovn-controller.
Each row contains:
- An "authorization" column containing a set of "string" type, where
each string is the name of a column (or column:key) whose contents
are to be compared against the ID of client attempting the transaction
(CN field from client certificate). If this set is empty, all IDs are
considered to be authorized. If this set contains more than one string,
at least one must contain the client ID in order for the action to be
considered authorized.
- An "insert_delete" column of type boolean. If true, insertions
are allowed by any client and deletions are allowed for rows
meeting the authorization requirement.
- An "update" column of type "set of strings". Each string is the
name of a column (or column:key) for which modification is allowed
in rows meeting the authorization requirement.
For the current implementation of the OVN_Southbound schema, these tables
would have the following contents:
RBAC_Roles:
name: "controller"
permissions: "Chassis": <UUID of Chassis row in RBAC_Permissions>,
"Encap": <UUID of Encap row in RBAC_Permissions>,
"Port_Binding":<UUID of Port_Binding row in RBAC_Permissions>,
"MAC_Binding": <UUID of MAC_Binding row in RBAC_Permissions>
RBAC_Permissions:
Chassis row:
authorization: "chassis"
insert_delete: "true"
update: "nb_cfg", "external_ids", "encaps", "vtep_logical_switches"
Modification of these columns is allowed for rows which in
which the authorization check passes.
Encap row:
authorization: "chassis" New column containing CN ID of row creator.
insert_delete: "true"
update: "type", "options", "ip"
Port_Binding row:
authorization: "" All chassis are authorized. In a recent
live migration proposal, this column would contain
"options:chassis" and "options:migration-destination".
insert_delete: "false"
update: "chassis"
MAC_Binding row:
authorization: "" All chassis are allowed to update/delete any row.
Long- term plan would be to eliminate this table.
insert_delete: "true"
update: "logical_port", "ip", "mac", "datapath"
4) Implementation logic:
- Extract CN ID from client certificate and store with session state
when remote connection is established.
- Modify ovsdb_execute_{insert,delete,update,mutate} and related functions
to pass the client session state (need to know whether RBAC is enabled
for the session and client ID for the session).
- Modify ovsdb_execute_{insert,delete,update,mutate} to apply access
controls.
- Logging, statistics.
- Unit tests.
- Documentation.
Open questions:
1) Is "list of columns/column:keys" with implied boolean OR sufficient,
or do we need something more powerful (e.g. a mini-language supporting
comparison/boolean/set/... operations).
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev