On Oct 30, 2007, at 10:32 PM, Alex Karasulu wrote:
Hi David,
On 10/30/07, David Jencks <[EMAIL PROTECTED]> wrote:
On Oct 24, 2007, at 10:36 AM, Alex Karasulu wrote:
> Role Assignment
> -------------------------
Snipped out what we agree on ...
> Role assignment during and after deployment is required for
> identities to fulfill their
> designated functions within applications and systems. Role
> assignment can be done
> on a per principal basis and should be allowed. However doing so
> for every assignment
> would not be very tractible especially within the scale of an
> enterprise. Role assignment
> to groups must be possible to make management feasible at medium to
> large scales.
> Role assignment is a task required of application and system
> administrators. Role
> assignment begins as part of an application's deployment yet it
> continues indefinately as
> an operational overhead while identities are created, destroyed,
> regrouped and allowed to
> access the application at with various roles.
>
Here's where I start having problems. As noted earlier, to me the
only grouping we can be thinking about in the context of an
authorization manager is to say that we want to grant a set of people
the same permissions.
Yes but how you do that and their implications to manageability hence
a feasible authorization manager (a successful easy to use product) is
the question.
We already have the Role concept which is the
set of permissions we're interested in, whether they are directly
assigned to the role or via the role partial ordering or
inheritance.
That's fine let's do it with or without Role hierarchies.
So the simplest thing to do is to, as we identify the
people in this set, associate them with the role that represents the
set of permissions we want them to have.
No this is just simpler for naive implementations that don't
consider the perspective
of our users. This will create issues for us downstream.
First the set of users may not be defined locally. In fact, most
medium to large
corporations which would bother to use an authorization manager in
the first place,
already have external credential stores which already group their
users.
I don't know exactly what the figures are but I would venture to
guess that over 90%
of companies with enterprise scale mass and operations, Active
Directory, is the data
base of record (DBOR) for network (LAN) users. Users that don't
fall under the domain of the
network, those users external to the organization, needed for
Internet Applications, are
often stored in other LDAP servers or within an RDBMS with a schema
containing some
kind of users table and groups table.
You may think this is unfortunate but it is the reality. The stone
cold realization is we cannot
force these people to transition to using Triplesec as the DBOR in
these environments which
already AD and/or other credential stores.
So we need either a form of very specialized virtual directory or a
mechanism for referring to
these external users and groups. Copying group information into
Triplesec and transforming
the groups into Roles is not the answer since it introduces the
synchronization and
authoritative copy problems.
How do I know that my changes to a Role (which was a group in the
external system) will
stick and propagate? When the group changes in the external
system, how can I be notified
of that to update my copy?
Are we going to invest time in building synchronization tools?
This is not where I want to go.
If we were going to define all the groups in Triplesec in an ideal
world than I don't have as much
of an issue going along with the idea of modeling them as roles.
This however is not the case,
groups and users exist and they're defined by external systems as
well as within Triplesec.
Forcing the use of roles to represent groups will create these
massive integration issues for
us in the near future.
I want to be really clear that I am not suggesting that we need to
copy, synchronize, deny the existence of, or hide any existing
systems. I'm only talking about a model so far. Code is relatively
easy to write compared to acquiring data. I figure that if we decide
that groups as distinct from roles are not conceptually necessary,
even though they are in most existing systems, we can then think
about whether it's practical to write code that only uses roles, not
groups. I don't know if this is practical, but I think it's worth
thinking about without throwing up our hands and saying its too
hard. For instance, it might be possible for our role objects to be
backed by either tsec roles (in the part of ldap we control) or AD
groups. Obviously the role objects backed by AD groups are likely to
be read-only from tsec.
Plus it's just not natural. Groups exist. Roles exist. They are
not the same to the majority
of administrators out there. So why push it if it's going to
alienate people and create more
problems and work for us.
Isn't this a UI question? Administrators are not likely to be poking
around in our code to see what we named our objects. What if
whenever you get to group users together or construct a "group
hierarchy" we call the unnameable object a group and whenever you get
to associate permissions to it or construct a "permission hierarchy"
we call it a role?
Another way to say this is that I think roles and groups are the same
concept so we should only use one name for it.
This is not going to fly for the reasons above.
We certainly agree
that we want to be able to associate users and roles.
Yes but this is to be done by using something called a role-
assignment object.
Presently Triplesec associates users with roles in something called
a Profile. In
this way it's a simple role assignment to individual users.
This has a serious deficiency. It makes it so administrators now
need to define a
profile for each user. This is not feasible for anything other
than a small number of
users. To do this right (make it useful) you need to be able
associate groups of
users with roles.
My approach now after analyzing existing products is to use a role-
assignment
not only to users but to groups. Hence a role-assignment
associates either a user
or a group with a set of roles.
If we have groups, we obviously need to associate groups with roles.
If we agree to call the "groups" roles, the group-role association
becomes part of the role hierarchy.
Now if I
understand what you are proposing it is to have a "group" which has a
set of users associated with it (like a role) and has roles
associated with it.
No the group is just a group. It sits out there. The role-
assignment is what is our
join table used to associate the group with the roles.
I'm not claiming that the association is stored in any particular
place. If you want to claim that the role-assignment is an object
then we will have to make all the associations objects so we don't
bias the discussion by implementation details about which end of an n-
n relationship we store the pointers.
Except for you calling it a group, that's a role
that happens to get all its permissions from the partial ordering or
inheritance rather than through direct assignment.
Roles assigned to the group in a role-assignment can be utilizing
inheritance. But
you need this intermediate role-assignment object because the group
may need to
be referred to if external to the system. You just cannot compose
the group in a
role object as you've defined it. Doing so removes a required
layer of indirection.
I'm not claiming all the roles are in tsec controlled ldap. I'm
perfectly happy to have lots of the roles stored in AD where they are
called groups. That doesn't mean we have to call them groups, and it
also does't mean when we are showing that data to our users we have
to call them either roles or groups.
I don't think we
need two names for the same concept.
Is it the same concept? I still don't see how you can say that.
I recognize that there are existing systems that already have lots of
users registered in them and the users organized into "groups".
However, my understanding is that we are trying to come up with terms
we agree will be most useful for discussing an authorization manager,
so I don't think basing our terminology on someone else's
implementation decisions no matter how popular they are is
necessarily the best idea.
It's not just some ONE else. It's the majority of systems out
there. I'm telling
you that by pissing straight against the wind on this one your
going to have us wet
and dirty :).
Let's look again at the division of labor:
(1) operator/administrator
- creates, deletes, modifies users
- creates, and deletes groups
- adds and removes users from groups
so AFAICT the model I'm talking about supports this just fine,
provided the UI these people use labels the roles "groups". When you
hire joe, you have to group him with the other people who do the
same kind of work. Whether we call the object a role or a group, its
the same amount of work.
(2) policy maker (technical security officers)
- create, delete, role assignments
I think these are the group-role associations? To me these are some
of the role-role hierarchy relationships.
- create, delete role exclusions (for static separation of duty)
(3) application architects (engineers & developers)
- create, delete, modify permissions
- create, delete, modify role names
- add, remove permissions from roles
With role hierarchies:
- add, remove roles from roles
I agree with all these tasks. I don't agree that they favor or
disfavor having groups in the model.
And another thing :-). I think there's this idea floating around to
the effect that sometimes a user may be authorized to do one kind of
job and sometimes authorized to do another kind of job, although they
are the same user. My understanding of the Profile idea in triplesec
trunk is that it was intended to support this. There are probably
other ways to describe this, but until someone has a problem with it
lets describe this as the user being in one set of roles or another
set of roles for the two kinds of jobs. AFAICT the only reason to
separate the sets of roles is if there is some kind of constraint
preventing the user from being in all the roles at once.
Yep this can be done using role exclusions. These are constraints
that are
managed by the policy making authority. It prevents certain roles
from being
assigned to the same user or group. Furthermore it should also detect
conditions where the membership of the same user in separate groups
would
result in violations, hence this would constrain role assignments
to groups
that would result in this case.
When the groups and users are external to the system. Nothing
prevents the
external system from violating this constraint. However at runtime
since authentication
is also handled or routed through Triplesec, violations of these
constraints can be
caught and dealt with to disable user authentications.
Some people
(well the NIST guys anyway) call this kind of constraint "separation
of duty".
Sure I call it that too since this is where I learned about it.
They suggest modeling them by saying, a user has
associations with a set of roles, which are all the roles they could
possibly be in. In addition, there's a user Session, which is the
set of roles they happen to be in right now.
This can be implemented by allowing for multiple named role-
assignments to users.
This goes back to the profiles concept. Triplesec allowed the same
user which could
be defined externally, to have two separate "authorization
profiles". Say I had a regular
user profile called akarasulu, then I can have an administrator
profile called
akarasulu_admin. I like this since I don't want to be a super user
while doing regular
things. I don't want to be concerned with having to watch out for
busting up the system.
Only when needed I can put on my admin cap and do what I have to do
but with the
same identity for auditing etc.
Having multiple named role-assignments accomplishes this same goal.
Maybe. If these are group-role assignments I think this is a much
more complicated harder to understand way of implementing separation
of duty constraints. If we have groups I think having a session that
contains the currently active groups and (directly assigned roles)
will be much easier to implement and understand than trying to do SOD
at the group-role assignment level. I could be wrong but I think this
might well outweigh the difficulties in writing java-ldap mapping
code from a role object to both ldap roles and groups.
Anyway I'm not sure we need to implement all of SOD right away.
Well I'm sure you completely agree with my arguments by now :-) but
in case you don't :-D I wonder if we can move forward anyway? If we
allow both user-role and user-group assignments then I can have
models without groups and you can have models with groups. If we do
this I would prefer that the associations be represented differently
in the ldap schema as far as practical so user-role and group-role
assignments can be distinguished.
SNIP ... too tired to continue for tonight.
I am always amazed at how little sleep you need :-)
thanks
david jencks
Alex