[Pkg-libvirt-commits] [libguestfs] 129/233: builder: Add --selinux-relabel option to perform SELinux relabelling.
Hilko Bengen
bengen at moszumanska.debian.org
Wed Feb 19 21:11:44 UTC 2014
This is an automated email from the git hooks/post-receive script.
bengen pushed a commit to branch experimental
in repository libguestfs.
commit 90e23b4e566f88595ac697b45d2531de851be6df
Author: Richard W.M. Jones <rjones at redhat.com>
Date: Fri Jan 24 19:38:26 2014 +0000
builder: Add --selinux-relabel option to perform SELinux relabelling.
This adds the --selinux-relabel option which enables selinux in the
appliance and runs:
if load_policy && fixfiles restore; then
rm -f /.autorelabel
else
touch /.autorelabel
fi
at the end of installation.
When possible this fixes SELinux labels in the guest and makes the
autorelabel step unnecessary.
Notes:
- The previous commit is required so that load_policy works.
- During the build, SELinux is enabled but no policy is loaded. This
works because SELinux is in permissive mode.
- This flag does not work if the appliance kernel and the guest have
greatly differing versions, eg. a RHEL 6 guest with a Fedora 20
appliance. This is because SELinux changes the policy format and
breaks backwards compatibility. You would see errors like this:
libsepol.policydb_write: policy version 15 cannot support MLS
libsepol.policydb_to_image: could not compute policy length
libsepol.policydb_to_image: could not create policy image
SELinux: Could not downgrade policy file /etc/selinux/targeted/policy/policy.24, searching for an older version.
SELinux: Could not open policy file <= /etc/selinux/targeted/policy/policy.24: No such file or directory
These errors are ignored (they go to the log file) and relabelling
is done at boot instead.
- It's not clear if loading guest policy is safe. You should trust
the virt-builder templates and to use libguestfs confinement for
additional protection.
---
builder/builder.ml | 19 +++++++++++++--
builder/cmdline.ml | 8 ++++--
builder/virt-builder.pod | 63 ++++++++++++++++++++++++++++++++----------------
3 files changed, 65 insertions(+), 25 deletions(-)
diff --git a/builder/builder.ml b/builder/builder.ml
index f3ada95..3c45fa5 100644
--- a/builder/builder.ml
+++ b/builder/builder.ml
@@ -40,8 +40,8 @@ let main () =
edit, firstboot, run, format, gpg, hostname, install, list_format, links,
memsize, mkdirs,
network, output, password_crypto, quiet, root_password, scrub,
- scrub_logfile, size, smp, sources, sync, timezone, update, upload,
- writes =
+ scrub_logfile, selinux_relabel, size, smp, sources, sync, timezone,
+ update, upload, writes =
parse_cmdline () in
(* Timestamped messages in ordinary, non-debug non-quiet mode. *)
@@ -578,6 +578,8 @@ let main () =
(match smp with None -> () | Some smp -> g#set_smp smp);
g#set_network network;
+ g#set_selinux selinux_relabel;
+
(* The output disk is being created, so use cache=unsafe here. *)
g#add_drive_opts ~format:output_format ~cachemode:"unsafe" output_filename;
@@ -890,6 +892,19 @@ exec >>%s 2>&1
do_run ~display:cmd cmd
) run;
+ if selinux_relabel then (
+ msg (f_"SELinux relabelling");
+ let cmd = sprintf "
+ if load_policy && fixfiles restore; then
+ rm -f /.autorelabel
+ else
+ touch /.autorelabel
+ echo '%s: SELinux relabelling failed, will relabel at boot instead.'
+ fi
+ " prog in
+ do_run ~display:"load_policy && fixfiles restore" cmd
+ );
+
(* Clean up the log file:
*
* If debugging, dump out the log file.
diff --git a/builder/cmdline.ml b/builder/cmdline.ml
index e3b1484..a6cb6c5 100644
--- a/builder/cmdline.ml
+++ b/builder/cmdline.ml
@@ -180,6 +180,7 @@ let parse_cmdline () =
let add_scrub s = scrub := s :: !scrub in
let scrub_logfile = ref false in
+ let selinux_relabel = ref false in
let size = ref None in
let set_size arg = size := Some (parse_size ~prog arg) in
@@ -287,6 +288,8 @@ let parse_cmdline () =
"--run", Arg.String add_run, "script" ^ " " ^ s_"Run script in disk image";
"--run-command", Arg.String add_run_cmd, "cmd+args" ^ " " ^ s_"Run command in disk image";
"--scrub", Arg.String add_scrub, "name" ^ " " ^ s_"Scrub a file";
+ "--selinux-relabel", Arg.Set selinux_relabel,
+ " " ^ s_"Relabel files with correct SELinux labels";
"--size", Arg.String set_size, "size" ^ " " ^ s_"Set output disk size";
"--smp", Arg.Int set_smp, "vcpus" ^ " " ^ s_"Set number of vCPUs";
"--source", Arg.String add_source, "URL" ^ " " ^ s_"Set source URL";
@@ -351,6 +354,7 @@ read the man page virt-builder(1).
let root_password = !root_password in
let scrub = List.rev !scrub in
let scrub_logfile = !scrub_logfile in
+ let selinux_relabel = !selinux_relabel in
let size = !size in
let smp = !smp in
let sources = List.rev !sources in
@@ -457,5 +461,5 @@ read the man page virt-builder(1).
edit, firstboot, run, format, gpg, hostname, install, list_format, links,
memsize, mkdirs,
network, output, password_crypto, quiet, root_password, scrub,
- scrub_logfile, size, smp, sources, sync, timezone, update, upload,
- writes
+ scrub_logfile, selinux_relabel, size, smp, sources, sync, timezone,
+ update, upload, writes
diff --git a/builder/virt-builder.pod b/builder/virt-builder.pod
index f72ab30..de12c0f 100644
--- a/builder/virt-builder.pod
+++ b/builder/virt-builder.pod
@@ -27,6 +27,7 @@ virt-builder - Build virtual machine images quickly
[--link TARGET:LINK[:LINK]]
[--edit FILE:EXPR]
[--delete FILE] [--scrub FILE]
+ [--selinux-relabel]
[--run SCRIPT] [--run-command 'CMD ARGS ...']
[--firstboot SCRIPT] [--firstboot-command 'CMD ARGS ...']
[--firstboot-install PKG,[PKG...]]
@@ -136,6 +137,16 @@ To install packages from the ordinary (guest) software repository
(In Fedora, C<@> is used to install groups of packages. On Debian
you would install a meta-package instead.)
+To update the core packages to the latest version:
+
+ virt-builder debian-7 --update
+
+For guests which use SELinux, like Fedora and Red Hat Enterprise
+Linux, you may need to do SELinux relabelling after installing or
+updating packages (see L</SELINUX> below):
+
+ virt-builder fedora-20 --update --selinux-relabel
+
=head2 Customizing the installation
There are many options that let you customize the installation. These
@@ -593,6 +604,12 @@ It cannot delete directories, only regular files.
=back
+=item B<--selinux-relabel>
+
+Relabel files in the guest so that they have the correct SELinux label.
+
+You should only use this option for guests which support SELinux.
+
=item B<--size> SIZE
Select the size of the output disk, where the size can be specified
@@ -1029,6 +1046,10 @@ Scripts are run (I<--run>, I<--run-command>).
Scripts run in the order they appear on the command line.
+=item *
+
+SELinux relabelling is done (I<--selinux-relabel>).
+
=back
=head2 IMPORTING THE DISK IMAGE
@@ -1714,30 +1735,29 @@ raw-format guests.
Guests which use SELinux (such as Fedora and Red Hat Enterprise Linux)
require that each file has a correct SELinux label.
-Since virt-builder does not know how to give new files a correct
-label, the guest templates have an empty file C</.autorelabel> and
-this causes the guest to relabel itself at first boot.
+Virt-builder does not know how to give new files a label, so there are
+two possible strategies it can use to ensure correct labelling:
-This usually means that these guests will reboot themselves once the
-first time you use them. B<This is normal, and harmless.> However if
-you want to perform the relabelling at build time instead of delaying
-it to the first boot, you can boot the guest with the qemu
-I<-no-reboot> option (which means it will shut down after the relabel
-is complete without booting "for real"). Only do this if you are sure
-it is an SELinux guest:
+=over 4
- qemu-system-x86_64 \
- -no-reboot \
- -nographic \
- -machine accel=kvm:tcg \
- -cpu host \
- -m 2048 \
- -drive file=disk.img,format=raw,if=virtio \
- -serial stdio \
- -monitor none
+=item Using I<--selinux-relabel>
+
+This runs L<fixfiles(8)> just before finalizing the guest, which sets
+SELinux labels correctly in the disk image.
-(For further information on the topic of SELinux labelling, see:
-L<https://www.redhat.com/archives/libguestfs/2014-January/msg00183.html>)
+Sometimes fixfiles is not possible during installation, in which case
+this option falls back on:
+
+=item Touching C</.autorelabel>
+
+Guest templates may already contain a file called C</.autorelabel>, or
+it is touched if I<--selinux-relabel> cannot run fixfiles.
+
+For guests that use SELinux, this causes fixfiles to run at first
+boot. Guests will reboot themselves once the first time you use them,
+which is normal and harmless.
+
+=back
=head1 ENVIRONMENT VARIABLES
@@ -1795,6 +1815,7 @@ L<gpg(1)>,
L<curl(1)>,
L<virt-make-fs(1)>,
L<genisoimage(1)>,
+L<fixfiles(8)>,
L<http://libguestfs.org/>.
=head1 AUTHOR
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-libvirt/libguestfs.git
More information about the Pkg-libvirt-commits
mailing list