[yocto] [meta-selinux][PATCH] selinux-init: use systemd (re)labelling

Mark Asselstine mark.asselstine at windriver.com
Thu Sep 5 10:55:33 PDT 2019


On Friday, August 23, 2019 2:19:53 P.M. EDT Mark Asselstine wrote:
> Boot loops were being seen when booting with selinux enabled, when the
> init system in use is systemd. Once logs were retrieved from the
> failing system the error was found to be
> 
> selinux-init.sh[284]: /sbin/restorecon: Could not set context for
> /sys/fs/cgroup/cpuacct:  Read-only file system selinux-init.sh[284]:
> /sbin/restorecon: Could not set context for /sys/fs/cgroup/cpu:  Read-only
> file system
> 
> Systemd mounts /sys/fs/cgroup read-only and the (re)labelling code
> used by selinux-init.sh is unable to handle this. On top of this the
> system is basically presenting two methods of (re)labelling; using the
> built in systemd approach via selinux-autorelabel.service *and* the
> code we have in selinux-init.sh. This can get confusing especially
> given that most online resources will speak to the systemd approach
> using selinux-autorelabel.service and /.autorelabel.
> 
> These changes leave the current approach in place when sysvinit is the
> init system used, but if systemd is being used we make use of it's
> internal (re)labelling functionality. Overall the workflow remains the
> same but we now avoid boot loops (systemd remounts /sys/fs/cgroup rw
> during the (re)labelling procedure).
> 
> Signed-off-by: Mark Asselstine <mark.asselstine at windriver.com>
> ---

Joe, any thoughts on this change?

MarkA

>  .../selinux/selinux-init/selinux-init.sh           | 14 +-------------
>  .../selinux/selinux-init/selinux-init.sh.sysvinit  | 14 ++++++++++++++
>  recipes-security/selinux/selinux-init_0.1.bb       |  8 +++++---
>  recipes-security/selinux/selinux-initsh.inc        |  8 ++++++++
>  4 files changed, 28 insertions(+), 16 deletions(-)
>  create mode 100644
> recipes-security/selinux/selinux-init/selinux-init.sh.sysvinit
> 
> diff --git a/recipes-security/selinux/selinux-init/selinux-init.sh
> b/recipes-security/selinux/selinux-init/selinux-init.sh index
> ead4f00..f93d231 100644
> --- a/recipes-security/selinux/selinux-init/selinux-init.sh
> +++ b/recipes-security/selinux/selinux-init/selinux-init.sh
> @@ -33,18 +33,6 @@ check_rootfs()
>  	/sbin/shutdown -f -h now
>  }
> 
> -# If first booting, the security context type of init would be
> -# "kernel_t", and the whole file system should be relabeled.
> -if [ "`${SECON} -t --pid 1`" = "kernel_t" ]; then
> -	echo "Checking SELinux security contexts:"
> -	check_rootfs
> -	echo " * First booting, filesystem will be relabeled..."
> -	test -x /etc/init.d/auditd && /etc/init.d/auditd start
> -	${SETENFORCE} 0
> -	${RESTORECON} -RF /
> -	${RESTORECON} -F /
> -	echo " * Relabel done, rebooting the system."
> -	/sbin/reboot
> -fi
> +# sysvinit firstboot relabel placeholder HERE
> 
>  exit 0
> diff --git a/recipes-security/selinux/selinux-init/selinux-init.sh.sysvinit
> b/recipes-security/selinux/selinux-init/selinux-init.sh.sysvinit new file
> mode 100644
> index 0000000..d4f3f71
> --- /dev/null
> +++ b/recipes-security/selinux/selinux-init/selinux-init.sh.sysvinit
> @@ -0,0 +1,14 @@
> +# Contents will be added to selinux-init.sh to support relabelling with
> sysvinit +# If first booting, the security context type of init would be
> +# "kernel_t", and the whole file system should be relabeled.
> +if [ "`${SECON} -t --pid 1`" = "kernel_t" ]; then
> +	echo "Checking SELinux security contexts:"
> +	check_rootfs
> +	echo " * First booting, filesystem will be relabeled..."
> +	test -x /etc/init.d/auditd && /etc/init.d/auditd start
> +	${SETENFORCE} 0
> +	${RESTORECON} -RF /
> +	${RESTORECON} -F /
> +	echo " * Relabel done, rebooting the system."
> +	/sbin/reboot
> +fi
> diff --git a/recipes-security/selinux/selinux-init_0.1.bb
> b/recipes-security/selinux/selinux-init_0.1.bb index 38b5900..78f571c
> 100644
> --- a/recipes-security/selinux/selinux-init_0.1.bb
> +++ b/recipes-security/selinux/selinux-init_0.1.bb
> @@ -14,9 +14,11 @@ ${PN}_RDEPENDS = " \
>      policycoreutils-setfiles \
>  "
> 
> -SRC_URI = "file://${BPN}.sh \
> -		file://${BPN}.service \
> -	"
> +SRC_URI = " \
> +    file://${BPN}.sh \
> +    file://${BPN}.sh.sysvinit \
> +    file://${BPN}.service \
> +"
> 
>  INITSCRIPT_PARAMS = "start 01 S ."
> 
> diff --git a/recipes-security/selinux/selinux-initsh.inc
> b/recipes-security/selinux/selinux-initsh.inc index bcdd449..8e31cda 100644
> --- a/recipes-security/selinux/selinux-initsh.inc
> +++ b/recipes-security/selinux/selinux-initsh.inc
> @@ -17,9 +17,15 @@ inherit update-rc.d systemd
> 
>  SYSTEMD_SERVICE_${PN} = "${SELINUX_SCRIPT_SRC}.service"
> 
> +FILES_${PN} += "/.autorelabel"
> +
>  do_install () {
>  	install -d ${D}${sysconfdir}/init.d/
>  	install -m 0755 ${WORKDIR}/${SELINUX_SCRIPT_SRC}.sh
> ${D}${sysconfdir}/init.d/${SELINUX_SCRIPT_DST} +	# Insert the relabelling
> code which is only needed with sysvinit +	sed -i -e '/HERE/r
> ${WORKDIR}/${SELINUX_SCRIPT_SRC}.sh.sysvinit' \ +	       -e '/.*HERE$/d' -e
> '/.*Contents.*sysvinit/d' \
> +	       ${D}${sysconfdir}/init.d/${SELINUX_SCRIPT_DST}
> 
>  	install -d ${D}${systemd_unitdir}/system
>  	install -m 0644 ${WORKDIR}/${SELINUX_SCRIPT_SRC}.service
> ${D}${systemd_unitdir}/system @@ -27,6 +33,8 @@ do_install () {
>  	if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 
'false',
> d)}; then install -d ${D}${bindir}
>  		install -m 0755 ${WORKDIR}/${SELINUX_SCRIPT_SRC}.sh ${D}$
{bindir}
> +		sed -i -e '/.*HERE$/d' ${D}${bindir}/$
{SELINUX_SCRIPT_SRC}.sh
> +		echo "# first boot relabelling" > ${D}/.autorelabel
>  	fi
>  }






More information about the yocto mailing list