On 08/30/2016 02:21 PM, Sumit Bose wrote:
On Mon, Aug 29, 2016 at 05:18:58PM -0400, Simo Sorce wrote:
On Mon, 2016-08-29 at 22:47 +0200, Sumit Bose wrote:
About Simo's concern. If there are groups defined in the session_recording configuration you look up those groups with cache_req_group_by_name_send(). As long as the groups are in the cache and not expired they are returned directly from the cache. I think this lookup cannot be avoided because in theory the groups name, be it the original name or an override name, might change. And you want to be sure that the name listed in the configuration is still a valid group name.
My concern is that an initgroups call can be quite expensive in certain domains where a user is a member of many groups. If we really want to check memberships based on session recording configuration *at query time* rather than at storing time, I would think it would be more efficient to resolve only the group memberships of the groups listed in the session recording configuration, and then check if the user is member of any of those groups.
Given in general this kind of access is geared toward auditing the work of small groups of people (admins with root access or similar), it would probably be more efficient than calling initgroups, as it will end up pulling a less data, less often.
If session recording is invoked often those groups will be cached so very few lookups would be made even if many different users log into the system. If you call initgroups instead you may end up updating several dozen groups for each user login.
What do you think ?
I share your concerns but I think we are between a rock and a hard place here. For AD e.g. I think we have quite a efficient way to do initgroups with the tokenGroups request and hopefully will have the PAC with S4U2Self soon. Group lookups on AD might be more costly due to nested groups.
Additionally we have to take the ignore_group_members options into account which might be enabled in environments with a larger number of users and groups.
As mentioned in my previous mail I would recommend to only do an initgroups request to the backend if SYSDB_INITGR_EXPIRE is exprired and not the user entry (SYSDB_CACHE_EXPIRE). Currently the timeout for both is configured with entry_cache_user_timeout. But we can add an option which would allow to set a higher timeout to SYSDB_INITGR_EXPIRE so that initgroups in the backend is called more rarely. This might mitigate the situation a bit.
Unfortunately we cannot rely on the forced initgroups request we do during authentication because "all" applications (I haven't checked all but it is a very typical pattern) call getpwnam() first and then call pam_authenticate(). And chances are high that they just use the shell returned by this getpwnam().
While thinking about it a session recording attribute in the user entry as you suggested might help in the following way (maybe this is even what you suggested but I didn't understood it while reading :-):
- attribute present:
- getpw* requests in the NSS responder will return the result according to the value of the attribute
- only initgroups requests will update the attribute
- attribute not present:
- all requests will set the attribute but only if SYSDB_INITGR_EXPIRE is expired a plain user request is replaced by an initgroups request to the backends
I would prefer that the handling of this attribute happens in the NSS responder because I think the backends should not be aware of this "application specific" attribute.
So only the first getpwnam() for a user might have extra costs (besides the refresh of the session recording groups which should typically be covered by the mid-point refresh).
What do you think?
Simo, I know this was a long time ago, but could you please answer Sumit?
AFAIU, he suggests we don't change the approach in general, but only do replace a user info request with initgroups if SYSDB_INITGR_EXPIRE has elapsed.
Sumit, I like your suggestion regarding the attribute, but what we're going to do with local overrides? E.g. what if a group listed in the groups to record was renamed locally? How would it work?
Thank you.
Nick