The idea behind this proposal is making Solaris "Software Installation" RBAC profile more fine grained.

In some deployments it would be useful to have administrators that
can install only "blessed" software and updates but not to be able
to install any arbitrary software (say setuid binaries or config files
that give them more rights).  In some use cases a linked image would be
appropriate for this but in others it is the system image we want to update.

For example allowing DBAs to update the database binaries without requiring an OS administrator. Or allowing a class of administrator that is allowed to apply OS vendor patches/updates but not to change the system configuration.

The current "Software Installation" RBAC profile is basically root equivalent because it allows installation of any arbitary software via pkg(1).

With a few minor enhancements to pkg(1) this is actually fixable.

The pkg(1) command has three relatively distinct purposes:

        1. Actual software installation and update
        2. Policy for the image - wither signing is in use
           what variants and facets to apply, where the publishers are.
        3. Searching and information about packages.  This
           part generally needs no privilege to operate with.

If we could create an RBAC profile that allowed using pkg(1) to do just
the installation an update but not allow changing the image policy we
would be able to provide a "safe" use of pkg(1) that wasn't root equivalent.

By controlling which publishers are used we can ensure only "blessed"
software can be installed via pkg(1).  Even more so if the image policy
has a requirement for signed packages.

To be able to do the installation pkg(1) needs to continue running as
uid 0 with all privilege.  To provide the necessary separation between
image policy and installation the pkg(1) system can check RBAC authorisations.

The default case needs to remain that someone running pkg(1) via sudo or logged in as the root account/role is allowed to do anything - after all they are root anyway. While still allowing delegated administration.

To implement this pkg(1) becomes RBAC authorisation aware - just like SMF and passwd(1) etc.

A first cut at the possible break down of authorisations would be:

solaris.pkg.install
        Allow installation and update of packages including creating
        a new BE if required.

solaris.pkg.facet
solaris.pkg.variant
        Set or change a variant or facet

solaris.pkg.publisher
        Add or change publishers, including mirrors and requirements for
        SSL

solaris.pkg.property
        Allows changing (security sensitive) policy of the image such as
        the signature-policy, ca-path.

[ The reason that 'solaris' is part of the prefix is because by default
the root user on Solaris has all authorisations in the 'solaris.*' namespace ].

The current "Software Installation" profile will be updated so that
it provides the solaris.pkg.install authorisation but not any of the
others.  A new RBAC profile named named "Software Installation Policy"
will be added that has solaris.pkg.{facet,variant,publisher,property" but not solaris.pkg.install. This provides for a separation of duty between those that define the policy and those that do the installation. If a single user needs to do both they can be granted both RBAC profiles.

Implementation Notes
--------------------
Ideally the authorisation checks should be in the pkg.client.api or
pkg.client.image layers for the relevant actions.  Unfortunatley though
some of the subcommands for pkg(1) are implemented in client.py
directly at this time.  This means that there will be a mix of where
the authorisation checks will be done.

Since the majority of the pkg(1) code is python a python binding to the
libc`chkauthattr(3C) call.

The current calls to portable.os.is_admin() that are being used to
check for permission to modify the system image can be updated so that
is_admin() takes the authorisation name we need to check.  For those
platforms that don't support Solaris RBAC authorisations they can have have a different implementation or they can check their equivalent of root (which is what portable.os.is_admin() does today on unix systems).

Some of the calls to pkg.client.image.lock may also be appropriate places for an authorisation based check.

--
Darren J Moffat
_______________________________________________
security-discuss mailing list
[email protected]

Reply via email to