Re: certmonger post-save scripts & certmonger_unconfined_t domain

Zdenek Pytela <[email protected]> Wed, 28 Apr 2021 14:43:29 +0200
Newsgroups gmane.linux.redhat.fedora.selinux
Message-ID <CAO4UijD5-Twx_H6i4iXQv_nR6--jmS7nJQCR2Yjprhuyw10vgg@mail.gmail.com>
Hi,

If I understand correctly, your problem is gone now. If you need some
additional help, feel free to reply back.

I spotted one more thing:

On Wed, Apr 28, 2021 at 2:25 PM Sam Morris <[email protected]> wrote:

> On Tue, 2021-04-27 at 21:11 +0200, Zdenek Pytela wrote:
> > runcon is a useful tool, but its usage is a bit tricky: it can be
> > used to run a process in a different context, but only if policy
> > allows it. Namely, it uses setexeccon(3) to set the new process
> > context and on the very next execvp(2) the context is checked and the
> > change evaluated.
> >
> > You are right with your commands how to check the 3 important parts
> > to allow a transition. However, in your first command, you see the
> > shell is running in unconfined_t. Is there a transition allowed to
> > certmonger_t?
> >
> > # sesearch -T -s unconfined_t -c process |grep certmonger_t
> > <>
> >
> > No. You would actually need a 3-link chain (certmonger_initrc_exec_t,
> > certmonger_exec_t, certmonger_unconfined_exec_t), so it'd be
> > worth writing a custom policy if you need to have it working from
> > console.
>
>
> Ah, so I needed to look at the SYSCALL event, which has
> subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023, in order to
> realise that I wasn't really launching the script from the domain that
> I thought I was...
>
> Thanks for explaining that.
>
> > I still don't quite understand what is to be done there though. For
> > instance, which process executes the post-save commands? Are there
> > any audit records when it fails? Are there additional error messages
> > in journal?
>
>
> In the particular case I was debugging, it looks like certmonger
> renewed the certificate a long time ago an this useful information
> has been rotated away.
>
> So, rather than repeatedly renewing the certificate until I got the
> script working, I wanted to use runcon to simulate certmonger running
> my script so that I could find out if it was SELinux that prevented the
> script from working.
>
> Now I understand that the problem was really my assumption that I
> understood how to use runcon to diagnose this sort of problem. :)
>
> I've now gone back to certmonger and created a tracking request using
> the SelfSign CA, which I can renew as many times as I want while
> debugging the script. I've used that to prove that
> certmonger_unconfined_exec_t does work as expected, and that the
> problem was therefore with my post-save script and nothing to do with
> SELinux policy.
>
> Since the existence and usage of certmonger_unconfined_t is a bit
> under-documented IMO, here's how I proved to myself that this domain
> can be used to allow certmonger to launch post-save command scripts
> that are able to do things that certmonger itself is not:
>
> This script tries to create a file in /etc, which SELinux policy will
> prevent:
>
>     $ cat /tmp/fakescript.unconfined
>     #!/bin/sh
>     set -eu -o pipefail
>     id > /etc/fakercert-id -Z
>
> Here's how to use the SelfSign CA to creat a certificate and then
> invoke the
> script:
>
>     # selfsign-getcert request -w -v -I fakecert -f
> /etc/pki/tls/certs/fakescript.crt -k
> /etc/pki/tls/private/fakescript.key -C /tmp/fakescript.unconfined
>     New signing request "fakecert" added.
>     State NEWLY_ADDED_READING_CERT, stuck: no.
>     State GENERATING_CSR, stuck: no.
>     State POST_SAVED_CERT, stuck: no.
>     State MONITORING, stuck: no.
>
>
> That causes this avc denial; as expected, certmonger_t is not allowed
> to modify
> etc_t:
>
>     type=AVC msg=audit(28/04/21 11:10:01.147:164884) : avc:  denied  {
> create }
>     for pid=187115 comm=fakescript.unconfined name=fakercert-id
>     scontext=system_u:system_r:certmonger_t:s0
> tcontext=system_u:object_r:etc_t:s0
>     tclass=file permissive=0
>

The target context is etc_t, but the only file/dir in the path with this
type should be /etc.
It is a good idea to relabel some parts of the filesystem before in-deep
troubleshooting:

 # /sbin/restorecon -Rv /etc

or setup the machine to relabel all filesystems on the next reboot:

 # fixfiles onboot
and reboot the system.



> After using chcon to change the type of the script to
> certmonger_unconfined_exec_t:
>
>     $ ls -Z /tmp/fakescript.unconfined
>     unconfined_u:object_r:certmonger_unconfined_exec_t:s0
> /tmp/fakescript.unconfined
>
>
> ... I can tell certmonger to renew the certificate. In doing so it will
> launch the script--now with the right type to trigger transition to
> certmonger_unconfined_t:
>
>     # getcert resubmit -i fakecert -w -v
>     Resubmitting "fakecert" to "SelfSign".
>     State GENERATING_CSR, stuck: no.
>     State NOTIFYING_ISSUED_SAVED, stuck: no.
>     State MONITORING, stuck: no.
>
>
> There's now no avc denial, hurrah! And here's the created file:
>
>     # cat /etc/fakercert-id
>     context=system_u:system_r:certmonger_unconfined_t:s0
>
>
> I hope someone else finds that helpful some day!
>
> --
> Sam Morris <https://robots.org.uk/>
> PGP: rsa4096/CAAA AA1A CA69 A83A 892B 1855 D20B 4202 5CDA 27B9
>
>
>

-- 

Zdenek Pytela
Security SELinux team

_______________________________________________
selinux mailing list -- [email protected]
To unsubscribe send an email to [email protected]
Fedora Code of Conduct: https://docs.fedoraproject.org/en-US/project/code-of-conduct/
List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
List Archives: https://lists.fedoraproject.org/archives/list/[email protected]
Do not reply to spam on the list, report it: https://pagure.io/fedora-infrastructure