mirror of
https://github.com/SELinuxProject/setools
synced 2025-05-16 23:29:16 +00:00
sechecker: Implement sechecker.
This is a command line tool for the configuration file-driven automated policy analysis. Signed-off-by: Chris PeBenito <chpebeni@linux.microsoft.com>
This commit is contained in:
parent
bf03b6749c
commit
b58fdc00cd
190
man/sechecker.1
Normal file
190
man/sechecker.1
Normal file
@ -0,0 +1,190 @@
|
|||||||
|
.TH sechecker 1 2020-06-09 "SELinux Project" "SETools: SELinux Policy Analysis Tools"
|
||||||
|
|
||||||
|
.SH NAME
|
||||||
|
sechecker \- Configuration-driven automated SELinux policy analysis
|
||||||
|
|
||||||
|
.SH SYNOPSIS
|
||||||
|
\fBsechecker\fR [OPTIONS] config.ini [POLICY]
|
||||||
|
|
||||||
|
.SH DESCRIPTION
|
||||||
|
.PP
|
||||||
|
\fBsechecker\fR is an automated SELinux policy analysis tool. It uses a
|
||||||
|
configuration file to define one or more analysis checks.
|
||||||
|
|
||||||
|
.SH POLICY
|
||||||
|
.PP
|
||||||
|
A single file containing a binary policy. This file is usually named by version
|
||||||
|
on Linux systems, for example, \fIpolicy.30\fR. This file is usually named
|
||||||
|
\fIsepolicy\fR on Android systems. If not provided, \fBsechecker\fR will attempt
|
||||||
|
to locate and open the current policy running on the system.
|
||||||
|
|
||||||
|
.SH OPTIONS
|
||||||
|
.IP "-o <path>"
|
||||||
|
Output the results to the specified path instead of stdout.
|
||||||
|
.IP "-h, --help"
|
||||||
|
Print help information and exit.
|
||||||
|
.IP "--version"
|
||||||
|
Print version information and exit.
|
||||||
|
.IP "-v, --verbose"
|
||||||
|
Print additional informational messages.
|
||||||
|
.IP "--debug"
|
||||||
|
Enable debugging output.
|
||||||
|
|
||||||
|
.SH RETURN CODES
|
||||||
|
\fBsechecker\fR has the following return codes:
|
||||||
|
.TP
|
||||||
|
.B 0
|
||||||
|
All checks passed.
|
||||||
|
.TP
|
||||||
|
.B 1
|
||||||
|
One or more checks failed.
|
||||||
|
.TP
|
||||||
|
.B 2
|
||||||
|
Error in the configuration file.
|
||||||
|
.TP
|
||||||
|
.B 3
|
||||||
|
Other errors, such as policy open error.
|
||||||
|
|
||||||
|
.SH "CONFIGURATION FILE"
|
||||||
|
The configuration file is in the .ini format. Each section is considered
|
||||||
|
a check, with the configuration section name being the name of the check. All
|
||||||
|
checks have the following options:
|
||||||
|
|
||||||
|
.IP "check_type = <name>"
|
||||||
|
This selects the type of test be be used in this check. This is required.
|
||||||
|
.IP "desc = <text>"
|
||||||
|
This is an optional text field. If set, the contents are printed in the output
|
||||||
|
and is typically used to explain the purpose of the check.
|
||||||
|
.IP "disable = <text>"
|
||||||
|
This is an optional text field. If it is set, the check will not run and the
|
||||||
|
contents of this text will be added to the report to explain why the check
|
||||||
|
was not ran.
|
||||||
|
|
||||||
|
.SH "TYPE ENFORCEMENT ALLOW RULE ASSERTION"
|
||||||
|
This checks for the nonexistence of type enforcement allow rules. The check_type
|
||||||
|
is \fBassert_te\fR. It will run the query and any results from the query,
|
||||||
|
removing any exempted sources or targets, will be listed as failures.
|
||||||
|
If a rule has an empty attribute, rendering it useless, it will
|
||||||
|
be ignored. If a rule has an attribute, it will be considered
|
||||||
|
a failure unless all of the member types are exempted.
|
||||||
|
|
||||||
|
.PP
|
||||||
|
Criteria options:
|
||||||
|
.IP "source = <type or type attribute>"
|
||||||
|
The source type/attribute criteria for the query.
|
||||||
|
.IP "target = <type or type attribute>"
|
||||||
|
The target type/attribute criteria for the query.
|
||||||
|
.IP "tclass = <type or type attribute>[, ....]"
|
||||||
|
A comma-separated list of object class criteria for the query.
|
||||||
|
.IP "perms = <type or type attribute>[, ....]"
|
||||||
|
A comma-separated list of permissions for the query.
|
||||||
|
|
||||||
|
.PP
|
||||||
|
\fBA least one of the above options must be set in this check.\fR
|
||||||
|
|
||||||
|
.PP
|
||||||
|
Additional Options:
|
||||||
|
|
||||||
|
.IP "exempt_source = <type or type attribute>[, ....]"
|
||||||
|
A comma-separated list of types and type attributes. Rules with these
|
||||||
|
as the source will be ignored. This is optional.
|
||||||
|
.IP "exempt_target = <type or type attribute>[, ....]"
|
||||||
|
A comma-separated list of types and type attributes. Rules with these
|
||||||
|
as the target will be ignored. This is optional.
|
||||||
|
|
||||||
|
.SH "EMPTY TYPE ATTRIBUTE ASSERTION"
|
||||||
|
This checks that the specified attribute is empty. This can optionally
|
||||||
|
be set to also pass if the attribute does not exist.
|
||||||
|
The check_type is \fBempty_typeattr\fR.
|
||||||
|
|
||||||
|
.PP
|
||||||
|
Options:
|
||||||
|
.IP "attr = <type attribute>"
|
||||||
|
The type attribute to check. This is required.
|
||||||
|
.IP "missing_ok = <type attribute>"
|
||||||
|
Consider the check passing if the attribute does not exist.
|
||||||
|
This is optional. Default is false.
|
||||||
|
|
||||||
|
.SH "READ-ONLY EXECUTABLES ASSERTION"
|
||||||
|
This checks that all file types that are executable are read-only.
|
||||||
|
The check_type is \fBro_execs\fR.
|
||||||
|
|
||||||
|
.PP
|
||||||
|
Options:
|
||||||
|
.IP "exempt_file = <type or type attribute>[, ....]"
|
||||||
|
A comma-separated list of types and type attributes. These
|
||||||
|
will not be considered executable. This is optional.
|
||||||
|
.IP "exempt_exec_domain = <type or type attribute>[, ....]"
|
||||||
|
A comma-separated list of types and type attributes. Rules with these
|
||||||
|
as the source will be ignored if they allow file execute permission.
|
||||||
|
This is optional.
|
||||||
|
.IP "exempt_write_domain = <type or type attribute>[, ....]"
|
||||||
|
A comma-separated list of types and type attributes. Rules with these
|
||||||
|
as the source will be ignored if they allow file write or append permissions
|
||||||
|
on types determined executable. This is optional.
|
||||||
|
|
||||||
|
.SH "CONFIGURATION EXAMPLES"
|
||||||
|
|
||||||
|
.PP
|
||||||
|
\fBExample\ \&1.\ \&A check called "no_unconfined" that will determine if the
|
||||||
|
domain_unconfined_type attribute is empty or missing.\fR
|
||||||
|
.sp
|
||||||
|
.if n \{\
|
||||||
|
.RS 4
|
||||||
|
.\}
|
||||||
|
.nf
|
||||||
|
[no_unconfined]
|
||||||
|
check_type = empty_typeattr
|
||||||
|
desc = Verify that the domain_unconfined_type attribute is missing or empty.
|
||||||
|
attr = domain_unconfined_type
|
||||||
|
missing_ok = True
|
||||||
|
.fi
|
||||||
|
.if n \{\
|
||||||
|
.RE
|
||||||
|
.\}
|
||||||
|
|
||||||
|
.PP
|
||||||
|
\fBExample\ \&2.\ \&A check called "ro_execs" that will determine if all
|
||||||
|
executable types are read-only.\fR
|
||||||
|
.sp
|
||||||
|
.if n \{\
|
||||||
|
.RS 4
|
||||||
|
.\}
|
||||||
|
.nf
|
||||||
|
[ro_execs]
|
||||||
|
check_type = empty_typeattr
|
||||||
|
desc = Verify that the all executables and libraries are read-only.
|
||||||
|
.fi
|
||||||
|
.if n \{\
|
||||||
|
.RE
|
||||||
|
.\}
|
||||||
|
|
||||||
|
.PP
|
||||||
|
\fBExample\ \&3.\ \&A check called "execheap" that will determine that
|
||||||
|
there are no domains with the execheap permission except for
|
||||||
|
unconfined_execheap_t.\fR
|
||||||
|
.sp
|
||||||
|
.if n \{\
|
||||||
|
.RS 4
|
||||||
|
.\}
|
||||||
|
.nf
|
||||||
|
[execheap]
|
||||||
|
check_type = assert_te
|
||||||
|
desc = Verify no domains have executable heap.
|
||||||
|
tclass = process
|
||||||
|
perms = execheap
|
||||||
|
exempt_source = unconfined_execheap_t
|
||||||
|
.fi
|
||||||
|
.if n \{\
|
||||||
|
.RE
|
||||||
|
.\}
|
||||||
|
.PP
|
||||||
|
|
||||||
|
.SH AUTHOR
|
||||||
|
Chris PeBenito <chpebeni@linux.microsoft.com>
|
||||||
|
|
||||||
|
.SH BUGS
|
||||||
|
Please report bugs via the SETools bug tracker, https://github.com/SELinuxProject/setools/issues
|
||||||
|
|
||||||
|
.SH SEE ALSO
|
||||||
|
apol(1), sediff(1), sedta(1), seinfo(1), seinfoflow(1), sesearch(1)
|
74
sechecker
Executable file
74
sechecker
Executable file
@ -0,0 +1,74 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# Copyright 2020 Microsoft Corporation
|
||||||
|
#
|
||||||
|
# This file is part of SETools.
|
||||||
|
#
|
||||||
|
# SETools is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# SETools is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with SETools. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
|
||||||
|
import setools
|
||||||
|
import argparse
|
||||||
|
import sys
|
||||||
|
import logging
|
||||||
|
import signal
|
||||||
|
|
||||||
|
signal.signal(signal.SIGPIPE, signal.SIG_DFL)
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser(description="SELinux policy checker tool.")
|
||||||
|
parser.add_argument("--version", action="version", version=setools.__version__)
|
||||||
|
parser.add_argument("config", help="Path to the checker configuration file.")
|
||||||
|
parser.add_argument("policy", help="Path to the SELinux policy to check.", nargs="?")
|
||||||
|
parser.add_argument("-o", "--output_file", help="Path to log output.", required=False)
|
||||||
|
parser.add_argument("-v", "--verbose", action="store_true",
|
||||||
|
help="Print extra informational messages")
|
||||||
|
parser.add_argument("--debug", action="store_true", dest="debug", help="Enable debugging.")
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
if args.debug:
|
||||||
|
logging.basicConfig(level=logging.DEBUG,
|
||||||
|
format='%(asctime)s|%(levelname)s|%(name)s|%(message)s')
|
||||||
|
elif args.verbose:
|
||||||
|
logging.basicConfig(level=logging.INFO, format='%(message)s')
|
||||||
|
else:
|
||||||
|
logging.basicConfig(level=logging.WARNING, format='%(message)s')
|
||||||
|
|
||||||
|
try:
|
||||||
|
p = setools.SELinuxPolicy(args.policy)
|
||||||
|
c = setools.PolicyChecker(p, args.config)
|
||||||
|
|
||||||
|
if args.output_file:
|
||||||
|
with open(args.output_file, "w") as fd:
|
||||||
|
failures = c.run(output=fd)
|
||||||
|
|
||||||
|
else:
|
||||||
|
failures = c.run()
|
||||||
|
|
||||||
|
sys.exit(1 if failures else 0)
|
||||||
|
|
||||||
|
except setools.exception.InvalidCheckerConfig as err:
|
||||||
|
if args.debug:
|
||||||
|
raise
|
||||||
|
else:
|
||||||
|
print(err)
|
||||||
|
|
||||||
|
sys.exit(2)
|
||||||
|
|
||||||
|
except Exception as err:
|
||||||
|
if args.debug:
|
||||||
|
raise
|
||||||
|
else:
|
||||||
|
print(err)
|
||||||
|
|
||||||
|
sys.exit(3)
|
Loading…
Reference in New Issue
Block a user