Re: staff_r

Dominick Grift <[email protected]> Wed, 13 May 2026 17:15:00 +0200
Newsgroups org.kernel.vger.selinux-refpolicy
Message-ID <[email protected]>
Russell Coker <[email protected]> writes:

> On Wednesday, 13 May 2026 21:20:21 AEST Dominick Grift wrote:
>> Russell Coker <[email protected]> writes:
>> > Is there any point to staff_r?
>> > 
>> > Currently it is a long way from usable for GUI sessions.
>> > 
>> > For terminal sessions the isolation between staff_r and user_r is matched
>> > by the isolation between user identities.
>> 
>> The idea, I believe, is that the difference between user_t and staff_t
>> is that the latter has access to privileges via su, sudo and
>> etc. staff_t is user user_t with access to root.
>
> My idea when I created staff_r was to have a role that's protected from user_r 
> but not with the full access of sysadm_r.  If MCS was a thing then I would 
> have just used different categories.  Logging in via ssh to staff_r and then 
> "newrole -r sysadm_r" was a thing.  At least one "Play Machine" was broken due 
> to allowing "newrole -r sysadm_r" from user_r, but I'm not aware of any 
> scenarios in which a staff_r is needed in real life since MCS became a thing.
>
> The uses of things can evolve so it would be possible to have certain roles 
> only used for su/sudo, but in the current policy they are all allowed it.
>
> auditadm.te:	sudo_role_template(auditadm, auditadm_t, 
> auditadm_application_exec_domain, auditadm_r)
> secadm.te:	sudo_role_template(secadm, secadm_t, 
> secadm_application_exec_domain, secadm_r)
> staff.te:	sudo_role_template(staff, staff_t, 
> staff_application_exec_domain, staff_r)
> sysadm.te:	sudo_role_template(sysadm, sysadm_t, 
> sysadm_application_exec_domain, sysadm_r)
> unprivuser.te:		sudo_role_template(user, user_t, 
> user_application_exec_domain, user_r)
>
> auditadm.te:	su_role_template(auditadm, auditadm_t, 
> auditadm_application_exec_domain, auditadm_r)
> secadm.te:	su_role_template(secadm, secadm_t, 
> secadm_application_exec_domain, secadm_r)
> staff.te:		su_role_template(staff, staff_t, 
> staff_application_exec_domain, staff_r)
> sysadm.te:	su_role_template(sysadm, sysadm_t, 
> sysadm_application_exec_domain, sysadm_r)
> unprivuser.te:		su_role_template(user, user_t, 
> user_application_exec_domain, user_r)

Interesting. Maybe I am wrong but in my opinion those su_role_template()
and sudo_role_template() calls do not belong in the unprivuser.te module.

>
>> Practically that makes staff_r useful for confined
>> administration. Whereas user_t is not useful for that because user_t
>> cannot gain root.
>
> auditadm.te:	sysadm_role_change(auditadm_r, auditadm_t)
> secadm.te:	sysadm_role_change(secadm_r, secadm_t)
> staff.te:	sysadm_role_change(staff_r, staff_t)
>
> It can gain root but only auditadm_r, secadm_r, and staff_r can get sysadm_r.

Yes that seems inconsistent. See above.

>
> The staff_t domain has a handful of extra sysadmin type permissions such as 
> corenet_ib_access_unlabeled_pkeys(), why does it have that?
>
> Also that corenet_ib_access_unlabeled_pkeys() interface is just a wrapper for 
> kernel_ib_access_unlabeled_pkeys() - why?

unclear: https://github.com/SELinuxProject/refpolicy/commit/25a5b2427447eb14edb07ce302217d37528813bc

>
> Is staff_r supposed to be used for graphical logins or just for text based 
> admin tasks?

I don't see why it couldnt be used for graphical logins. This
functionality is not used much and so it does not receive much attention
(especially in a gui scenario)

>
> What about sysadm_r is that supposed to be used for graphical tasks like 
> evolution_role() and gnome_role_template() as well as things like games_role() 
> and irc_role()?

In my view sysadm_r should not be allowed to log in with a desktop
manager because root gui logins are discouraged to say the least and
sysadm_r is a privileged role (privileged roles are meant to be used
with root)

>
>> These days things are more complicated with other ways to gain
>> privileges like policykit and others but the essence is, AFAIK, still
>> the same and even though systemd and others can leverage policykit even
>> in a non-gui environment it is still optional functionality.
>
> One of the advantages of SE Linux is the ability to analise rules.  But as 
> such analysis is based on domain/type not on identity and role we can't see 
> the distinction between different roles (which don't make it to labels for 
> objects).  So when you have staff_r and user_r using the same types for home 
> directories etc you have to just know that only the identity keeps them apart.
>
>> > The role transition rules generally aren't used for anything and the roles
>> > permitted to an identity determine what role transitions can be used.
>> > 
>> > The vast majority of use of the reference policy is for "targeted"
>> > configurations without even using user_r.
>> > 
>> > Is there any reason for keeping staff_r?
>> 
>> Reference policy is a hybrid between strict and targeted. You can remove
>> or disable the targeted aspect and effectively enforce a strict policy
>> and this is where these confined login user domains are essential.
>
> You have to remove the unconfined module to have fully confined users.  The 
> mono_t and wine_t domains can be entered from user_t and are unconfined.  So 
> the limitations on user_t when you have the unconfined module loaded and wine 
> or mono installed are those which the wine and mono runtimes decide to put in 
> place.

I guess its a compromise and in practice few will probably login with a
gui as user_t unless they have the unconfined module disabled and that then in
turn will make wine and mono confined.

>
> The problem we have is that we have a lot of roles with no plans that haven't 
> been lost to time and no documentation that I'm aware of.  So we have *_admin 
> interfaces called from sysadm.te for all the daemons that were around when we 
> transitioned to modular policy (which makes sysadm.te larger than all the 
> other  role files combined) but no such interfaces for newer domains.  

I don't necessarily believe that it is a "problem" that
allow rules are missing unless/until someone actually has a valid/good
use-case for them and is also contributing/maintaining those rules
upstream.

Just my personal view on these matters though. I haven't used reference
policy and derivatives for more than a decade.

-- 
gpg --auto-key-locate clear,nodefault,wkd --locate-external-keys [email protected]
Key fingerprint = FCD2 3660 5D6B 9D27 7FC6  E0FF DA7E 521F 10F6 4098
Dominick Grift
Mastodon: @[email protected]