Re: [PATCH] policycoreutils: setfiles - Add option to stop setting the digest

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 09/25/2016 10:49 AM, Richard Haines wrote:
> Add -D option to setfiles and restorecon - Do not set or update
> directory SHA1 digests when relabeling files. This will allow
> users the option of not using the "security.restorecon_last"
> extended attribute feature.
> 
> Also review and update the man pages.

I think we need to flip the default here.  Rationale:
1) Users often use restorecon to fix labels on files whose labels are
wrong even through nothing has changed in file_contexts, e.g. after
copying/moving files to a different location.  They won't expect
restorecon to suddenly stop relabeling by default because the hash of
file_contexts hasn't changed.

2) Only processes running with CAP_SYS_ADMIN can set
security.restorecon_last, so this will fail for non-root users anyway.

Any objection?

> 
> Signed-off-by: Richard Haines <richard_c_haines@xxxxxxxxxxxxxx>
> ---
>  policycoreutils/setfiles/restorecon.8 |  76 ++++++++++++++++-----
>  policycoreutils/setfiles/setfiles.8   | 122 +++++++++++++++++++++++++---------
>  policycoreutils/setfiles/setfiles.c   |  26 +++++---
>  3 files changed, 167 insertions(+), 57 deletions(-)
> 
> diff --git a/policycoreutils/setfiles/restorecon.8 b/policycoreutils/setfiles/restorecon.8
> index 4851f0f..f996467 100644
> --- a/policycoreutils/setfiles/restorecon.8
> +++ b/policycoreutils/setfiles/restorecon.8
> @@ -4,10 +4,33 @@ restorecon \- restore file(s) default SELinux security contexts.
>  
>  .SH "SYNOPSIS"
>  .B restorecon
> -.I [\-R] [\-m] [\-n] [\-p] [\-v] [\-I] [\-e directory] pathname...
> +.RB [ \-r | \-R ]
> +.RB [ \-m ]
> +.RB [ \-n ]
> +.RB [ \-p ]
> +.RB [ \-v ]
> +.RB [ \-i ]
> +.RB [ \-F ]
> +.RB [ \-W ]
> +.RB [ \-I | \-D ]
> +.RB [ \-e
> +.IR directory ]
> +.IR pathname \ ...
>  .P
>  .B restorecon
> -.I \-f infilename [\-e directory] [\-R] [\-m] [\-n] [\-p] [\-v] [\-F] [\-I]
> +.RB [ \-f
> +.IR infilename ]
> +.RB [ \-e
> +.IR directory ]
> +.RB [ \-r | \-R ]
> +.RB [ \-m ]
> +.RB [ \-n ]
> +.RB [ \-p ]
> +.RB [ \-v ]
> +.RB [ \-i ]
> +.RB [ \-F ]
> +.RB [ \-W ]
> +.RB [ \-I | \-D ]
>  
>  .SH "DESCRIPTION"
>  This manual page describes the
> @@ -18,14 +41,22 @@ This program is primarily used to set the security context
>  (extended attributes) on one or more files.
>  .P
>  It can also be run at any other time to correct inconsistent labels, to add
> -support for newly-installed policy or, by using the \-n option, to passively
> +support for newly-installed policy or, by using the
> +.B \-n
> +option, to passively
>  check whether the file contexts are all set as specified by the active policy
>  (default behavior).
>  .P
> -If a file object does not have a context, restorecon will write the default
> +If a file object does not have a context,
> +.B restorecon
> +will write the default
>  context to the file object's extended attributes. If a file object has a
> -context, restorecon will only modify the type portion of the security context.
> -The \-F option will force a replacement of the entire context.
> +context,
> +.B restorecon
> +will only modify the type portion of the security context.
> +The
> +.B \-F
> +option will force a replacement of the entire context.
>  .P
>  It is the same executable as
>  .BR setfiles
> @@ -33,11 +64,15 @@ but operates in a slightly different manner depending on its argv[0].
>  
>  .SH "OPTIONS"
>  .TP
> -.B \-e directory
> +.BI \-e \ directory
>  exclude a directory (repeat the option to exclude more than one directory, Requires full path).
>  .TP
> -.B \-f infilename
> -infilename contains a list of files to be processed. Use \- for stdin.
> +.BI \-f \ infilename
> +.I infilename
> +contains a list of files to be processed. Use
> +.RB \*(lq \- \*(rq
> +for
> +.BR stdin .
>  .TP
>  .B \-F
>  Force reset of context to match file_context for customizable files, and the
> @@ -56,6 +91,14 @@ there are no errors. See the
>  .B NOTES
>  section for further details.
>  .TP
> +.B \-D
> +do not set or update any directory SHA1 digests. Use this option to
> +effectively disable usage of the
> +.IR security.restorecon_last
> +extended attribute. Note that using this option will override the
> +.B \-I
> +option.
> +.TP
>  .B \-m
>  do not read
>  .B /proc/mounts
> @@ -64,9 +107,10 @@ Setting this option is useful where there is a non-seclabel fs mounted with a
>  seclabel fs mounted on a directory below this.
>  .TP
>  .B \-n
> -don't change any file labels (passive check).  To display the files whose labels would be changed, add \-v.
> +don't change any file labels (passive check).  To display the files whose labels would be changed, add
> +.BR \-v .
>  .TP
> -.B \-o outfilename
> +.BI \-o \ outfilename
>  Deprecated, SELinux policy will probably block this access.  Use shell redirection to save list of files with incorrect context in filename.
>  .TP
>  .B \-p
> @@ -106,7 +150,7 @@ option of GNU
>  produces input suitable for this mode.
>  .TP
>  .SH "ARGUMENTS"
> -.B pathname...
> +.IR pathname \ ...
>  The pathname for the file(s) to be relabeled.
>  .SH "NOTES"
>  .IP "1." 4
> @@ -115,7 +159,7 @@ does not follow symbolic links and by default it does not
>  operate recursively on directories.
>  .IP "2." 4
>  If the
> -.B pathname
> +.I pathname
>  specifies the root directory and the
>  .B \-vR
>  or
> @@ -135,12 +179,12 @@ will write an SHA1 digest of the default specfiles set to an extended
>  attribute named
>  .IR security.restorecon_last
>  to the directory specified in each
> -.B pathname...
> +.IR pathname \ ...
>  once the relabeling has been completed successfully. This digest will be
>  checked should
>  .B restorecon
>  be rerun with the same
> -.B pathname
> +.I pathname
>  parameters. See
>  .BR selinux_restorecon (3)
>  for further details.
> @@ -148,7 +192,7 @@ for further details.
>  The
>  .B \-I
>  option will ignore the SHA1 digest from each directory specified in
> -.B pathname...
> +.IR pathname \ ...
>  and provided the
>  .B \-n
>  option is NOT set and recursive mode is set, files will be relabeled as
> diff --git a/policycoreutils/setfiles/setfiles.8 b/policycoreutils/setfiles/setfiles.8
> index 35e38b2..11bc335 100644
> --- a/policycoreutils/setfiles/setfiles.8
> +++ b/policycoreutils/setfiles/setfiles.8
> @@ -4,7 +4,23 @@ setfiles \- set SELinux file security contexts.
>  
>  .SH "SYNOPSIS"
>  .B setfiles
> -.I [\-c policy] [\-d] [\-l] [\-m] [\-n] [\-e directory] [\-o filename] [\-p] [\-q] [\-s] [\-v] [\-W] [\-F] [\-I] spec_file pathname...
> +.RB [ \-c
> +.IR policy ]
> +.RB [ \-d ]
> +.RB [ \-l ]
> +.RB [ \-m ]
> +.RB [ \-n ]
> +.RB [ \-e
> +.IR directory ]
> +.RB [ \-p ]
> +.RB [ \-s ]
> +.RB [ \-v ]
> +.RB [ \-W ]
> +.RB [ \-F ]
> +.RB [ \-I | \-D ]
> +.I spec_file
> +.IR pathname \ ...
> +
>  .SH "DESCRIPTION"
>  This manual page describes the
>  .BR setfiles
> @@ -16,14 +32,24 @@ them).  Usually it is initially run as part of the SELinux installation
>  process (a step commonly known as labeling).
>  .P
>  It can also be run at any other time to correct inconsistent labels, to add
> -support for newly-installed policy or, by using the \-n option, to passively
> +support for newly-installed policy or, by using the
> +.B \-n
> +option, to passively
>  check whether the file contexts are all set as specified by the active policy
> -(default behavior) or by some other policy (see the \-c option).
> +(default behavior) or by some other policy (see the
> +.B \-c
> +option).
>  .P
> -If a file object does not have a context, setfiles will write the default
> +If a file object does not have a context,
> +.B setfiles
> +will write the default
>  context to the file object's extended attributes. If a file object has a
> -context, setfiles will only modify the type portion of the security context.
> -The \-F option will force a replacement of the entire context.
> +context,
> +.B setfiles
> +will only modify the type portion of the security context.
> +The
> +.B \-F
> +option will force a replacement of the entire context.
>  .SH "OPTIONS"
>  .TP
>  .B \-c
> @@ -33,11 +59,15 @@ check the validity of the contexts against the specified binary policy.
>  show what specification matched each file (do not abort validation
>  after ABORT_ON_ERRORS errors).
>  .TP
> -.B \-e directory
> +.BI \-e \ directory
>  directory to exclude (repeat option for more than one directory).
>  .TP
> -.B \-f
> -take a list of files to be processed from an input file.
> +.BI \-f \ infilename
> +.I infilename
> +contains a list of files to be processed. Use
> +.RB \*(lq \- \*(rq
> +for
> +.BR stdin .
>  .TP
>  .B \-F
>  Force reset of context to match file_context for customizable files, and the
> @@ -57,6 +87,14 @@ there are no errors. See the
>  .B NOTES
>  section for further details.
>  .TP
> +.B \-D
> +do not set or update any directory SHA1 digests. Use this option to
> +effectively disable usage of the
> +.IR security.restorecon_last
> +extended attribute. Note that using this option will override the
> +.B \-I
> +option.
> +.TP
>  .B \-l
>  log changes in file labels to syslog.
>  .TP
> @@ -70,7 +108,7 @@ seclabel fs mounted on a directory below this.
>  .B \-n
>  don't change any file labels (passive check).
>  .TP
> -.B \-o filename
> +.BI \-o \ filename
>  Deprecated, SELinux policy will probably block this access.  Use shell redirection to save list of files with incorrect context in filename.
>  .TP
>  .B \-p
> @@ -84,15 +122,18 @@ options are mutually exclusive.
>  .B \-q
>  Deprecated, was only used to stop printing inode association parameters.
>  .TP 
> -.B \-r rootpath
> +.BI \-r \ rootpath
>  use an alternate root path. Used in meta-selinux for OpenEmbedded/Yocto builds
>  to label files under
> -.B rootpath
> -as if they were at /
> +.I rootpath
> +as if they were at
> +.B /
>  .TP 
>  .B \-s
>  take a list of files from standard input instead of using a pathname from the
> -command line (equivalent to \-f \-).
> +command line (equivalent to
> +.RB \*(lq "\-f \-" \*(rq
> +).
>  .TP
>  .B \-v
>  show changes in file labels and output any inode association parameters.
> @@ -120,26 +161,43 @@ option of GNU
>  produces input suitable for this mode.
>  
>  .SH "ARGUMENTS"
> -.B spec_file
> -The specification file which contains lines of the following form
> -.br
> -.B regexp [ \-type ] ( context | <<none>> )
> -.br
> -The regular expression is anchored at both ends.  The optional type field 
> -specifies the file type as shown in the mode field by the
> -.B ls(1)
> -program, e.g. \-\- to match only regular files or \-d to match only
> -directories.  The context can be an ordinary security context or the
> -string <<none>> to specify that the file is not to have its context
> +.TP
> +.I spec_file
> +The specification file which contains lines of the following form:
> +.sp
> +.RS
> +.I regexp
> +.RI [ type ]
> +.IR context \ |
> +.B <<none>>
> +.RS
> +The regular expression is anchored at both ends.  The optional
> +.I type
> +field specifies the file type as shown in the mode field by the
> +.BR ls (1)
> +program, e.g.
> +.B \-\-
> +to match only regular files or
> +.B \-d
> +to match only
> +directories.  The
> +.I context
> +can be an ordinary security context or the
> +string
> +.B <<none>>
> +to specify that the file is not to have its context
>  changed.
>  .br
>  The last matching specification is used. If there are multiple hard
>  links to a file that match different specifications and those
>  specifications indicate different security contexts, then a warning is
>  displayed but the file is still labeled based on the last matching
> -specification other than <<none>>.
> +specification other than
> +.BR <<none>> \|.
> +.RE
> +.RE
>  .TP 
> -.B pathname...
> +.IR pathname \ ...
>  The pathname for the root directory of each file system to be relabeled
>  or a specific directory within a filesystem that should be recursively
>  descended and relabeled or the pathname of a file that should be
> @@ -156,7 +214,7 @@ option is used.
>  follows symbolic links and operates recursively on directories.
>  .IP "2." 4
>  If the
> -.B pathname
> +.I pathname
>  specifies the root directory and the
>  .B \-v
>  option is set and the audit system is running, then an audit event is
> @@ -171,15 +229,15 @@ will write an SHA1 digest of the
>  set to an extended attribute named
>  .IR security.restorecon_last
>  to the directory specified in each
> -.B pathname...
> +.IR pathname \ ...
>  once the relabeling has been completed successfully. This digest will be
>  checked should
>  .B setfiles
>  be rerun
>  with the same
> -.B spec_file
> +.I spec_file
>  and
> -.B pathname
> +.I pathname
>  parameters. See
>  .BR selinux_restorecon (3)
>  for further details.
> @@ -187,7 +245,7 @@ for further details.
>  The
>  .B \-I
>  option will ignore the SHA1 digest from each directory specified in
> -.B pathname...
> +.IR pathname \ ...
>  and provided the
>  .B \-n
>  option is NOT set, files will be relabeled as required with the digest then
> diff --git a/policycoreutils/setfiles/setfiles.c b/policycoreutils/setfiles/setfiles.c
> index b700228..520866e 100644
> --- a/policycoreutils/setfiles/setfiles.c
> +++ b/policycoreutils/setfiles/setfiles.c
> @@ -17,6 +17,7 @@
>  static char *policyfile;
>  static int warn_no_match;
>  static int null_terminated;
> +static int request_digest;
>  static struct restore_opts r_opts;
>  static int nerr;
>  
> @@ -42,14 +43,14 @@ void usage(const char *const name)
>  {
>  	if (iamrestorecon) {
>  		fprintf(stderr,
> -			"usage:  %s [-iIFmnprRv0] [-e excludedir] pathname...\n"
> -			"usage:  %s [-iIFmnprRv0] [-e excludedir] -f filename\n",
> +			"usage:  %s [-iIDFmnprRv0] [-e excludedir] pathname...\n"
> +			"usage:  %s [-iIDFmnprRv0] [-e excludedir] -f filename\n",
>  			name, name);
>  	} else {
>  		fprintf(stderr,
> -			"usage:  %s [-diIlmnpqvFW] [-e excludedir] [-r alt_root_path] spec_file pathname...\n"
> -			"usage:  %s [-diIlmnpqvFW] [-e excludedir] [-r alt_root_path] spec_file -f filename\n"
> -			"usage:  %s -s [-diIlmnpqvFW] spec_file\n"
> +			"usage:  %s [-diIDlmnpqvFW] [-e excludedir] [-r alt_root_path] spec_file pathname...\n"
> +			"usage:  %s [-diIDlmnpqvFW] [-e excludedir] [-r alt_root_path] spec_file -f filename\n"
> +			"usage:  %s -s [-diIDlmnpqvFW] spec_file\n"
>  			"usage:  %s -c policyfile spec_file\n",
>  			name, name, name, name);
>  	}
> @@ -147,8 +148,8 @@ int main(int argc, char **argv)
>  	size_t buf_len;
>  	const char *base;
>  	int mass_relabel = 0, errors = 0;
> -	const char *ropts = "e:f:hiIlmno:pqrsvFRW0";
> -	const char *sopts = "c:de:f:hiIlmno:pqr:svFR:W0";
> +	const char *ropts = "e:f:hiIDlmno:pqrsvFRW0";
> +	const char *sopts = "c:de:f:hiIDlmno:pqr:svFR:W0";
>  	const char *opts;
>  
>  	/* Initialize variables */
> @@ -156,6 +157,7 @@ int main(int argc, char **argv)
>  	altpath = NULL;
>  	null_terminated = 0;
>  	warn_no_match = 0;
> +	request_digest = 1;
>  	policyfile = NULL;
>  	nerr = 0;
>  
> @@ -278,6 +280,12 @@ int main(int argc, char **argv)
>  			r_opts.ignore_digest =
>  					   SELINUX_RESTORECON_IGNORE_DIGEST;
>  			break;
> +		case 'D': /*
> +			   * Don't request file_contexts digest in selabel_open
> +			   * This will effectively disable usage of the
> +			   * security.restorecon_last extended attribute.
> +			   */
> +			request_digest = 0;
>  		case 'l':
>  			r_opts.syslog_changes =
>  					   SELINUX_RESTORECON_SYSLOG_CHANGES;
> @@ -409,9 +417,9 @@ int main(int argc, char **argv)
>  	} else if (argc == 1)
>  		usage(argv[0]);
>  
> -	/* Set selabel_open options. Always request a digest. */
> +	/* Set selabel_open options. */
>  	r_opts.selabel_opt_validate = (ctx_validate ? (char *)1 : NULL);
> -	r_opts.selabel_opt_digest = (char *)1;
> +	r_opts.selabel_opt_digest = (request_digest ? (char *)1 : NULL);
>  	r_opts.selabel_opt_path = altpath;
>  
>  	if (nerr)
> 

_______________________________________________
Selinux mailing list
Selinux@xxxxxxxxxxxxx
To unsubscribe, send email to Selinux-leave@xxxxxxxxxxxxx.
To get help, send an email containing "help" to Selinux-request@xxxxxxxxxxxxx.



[Index of Archives]     [Selinux Refpolicy]     [Linux SGX]     [Fedora Users]     [Fedora Desktop]     [Yosemite Photos]     [Yosemite Camping]     [Yosemite Campsites]     [KDE Users]     [Gnome Users]

  Powered by Linux