On 09/30/2016 10:44 AM, Stephen Smalley wrote: > 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? I guess (2) means that (1) won't be a problem for non-root users, since the attribute won't ever be set. But typical instructions for fixing labels on files copied manually to /var/www are restorecon -R /var/www, and now we'll get this: # restorecon -R /var/www # restorecon -R /var/www Skipping restorecon as matching digest on: /var/www With no hint to the user on how to force it to happen. > >> >> 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. > _______________________________________________ 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.