There are many aspects to a formal security policy analysis. In this
guide, policy analysis refers to analyzing SELinux
policy to discover the relationship between types defined in the policy.
This section presents apol, which is designed specifically for analyzing
policy.
Policy analysis is not only performed on running systems, but is an
integral part of designing and writing a policy. You can analyze your
custom policy using apol as part of your testing process, before you
load it on a machine. apol can help you discover unexpected and
undesirable results of your policy writing decisions. It helps show the
differences between versions or kinds of policy. For example, you can
analyze each iteration of your policy, reusing saved queries, looking for
information leaks or unwanted transitions.
Policy analysis with apol is many magnitudes more complex than audit log
analysis with seaudit. The setools package comes
with several important documents to read in order to understand how to
properly utilize apol, as well as how to interpret your results.
Reading the documentation from
/usr/share/doc/setools-<version>
is recommended:
apol_help.txt — This detailed help file
describes how to use all of the features of apol, as well as a
walkthrough of the tabbed interface.
dta_help.txt — This is an overview of
domain transition analysis
(DTA), which studies the
ability of processes to change their domains in a particular policy.
iflow_help.txt — This is an overview of
information flow analysis, which finds the
expected and unexpected possible routes information can travel between
two types in a policy.
types_relation_help.txt — This help
file discusses analyzing the relationship between two types.
Information flow analysis is essentially what you are doing when you
analyze the policy.
The topics each of these help files covers is central to the task of
analyzing SELinux policy. The apol UI is organized around these tasks.
The following sections explain these tasks, discussing how to utilize the
GUI for your analysis work.
| Note |
---|
| Both the source policy.conf and binary
policy.<XY> files
can be analyzed by apol. Much of the results are similar, but there
are noteworthy differences. This is because the binary compilation
process strips out attributes as well as the initial SIDs. It is the
lack of attributes that most affects the analysis process. When
analyzing a binary policy, attributes cannot be included as search
parameters.
The policy.conf tab is disabled for the binary
policy, as well as the Initial SIDs tab under the
Policy Components tab. The field
Attributes is empty, and although you can select
in various search parameters, it
has no effect when analyzing a binary policy.
|
When opening the policy file, apol gathers and organizes information.
The same information is difficult to identify and extrapolate manually
going through the policy files. For example, there is no master list
within the policy source of which types belong to which attributes.
This information is scattered throughout the policy. apol gathers and
displays these SELinux categories.
Figure 6-6 shows the Policy
Components tab. Within this tab there are tabs for
Types, Classes/Perms,
Roles, Users,
Booleans, and Initial SIDs.
Under each tab is the capability to perform basic searches.
| Note |
---|
| There are declared types that do not have any rules written for them
or file contexts set for them. For example,
swapfile_t is declared in
$SELINUX_SRC/types/file.te, so it appears in the
menu within the Types
tab. However, the file type is not assigned to any file nor are there
rules about it.
If you are wondering if a particular type is used in the policy, you
can search for it under the Policy Rules tab. If
no rules are found, then it is an unused type.
|
| Tip |
---|
| One feature of the Booleans tab is that you can
set Boolean values within the policy loaded into apol. This does
not affect the Boolean value on the disk or in memory. This lets you
test the effect on the policy of changing different Booleans, entirely
within apol. You can then do TE rule and information flow analysis
with the new Boolean settings.
|
Rule analysis looks into the relationship between a pair of types,
trying to find the ways they interact. The interaction could be direct
or indirect due to the use of attributes, and enabled or disabled by a
Boolean setting.
Under the Policy Rules tab are search options and
regular expression fields for defining the source and target type or
attribute. The menu lets you choose
the kind of rule, such as allow,
neverallow, and
auditallow. In Figure 6-7, the menu for is squeezed in the image since it is disabled:
The menu lets you pick search
parameters. The selection for refers to the Boolean value for a rule, or if a
conditional expression (ifdef
statement) is true. This selection is a filter that can hide or reveal
a large number of possible routes between a pair of types.
If you expand your search to include disabled conditional rules, you can
have the results highlighted. By selecting and , the conditional rules are identified
and marked with their status of Enabled or
Disabled.
The search parameter tabs Types/Attributes and
Classes/Permissions let you describe details about
the source and target you are analyzing. An asterisk
* appears on the tab if a parameter from that tab
is set and affecting the search. You can define the source by using the
exact type or using a regular expression. Automatically, the expression
is anchored at both ends, so a caret ^
and dollar sign $ surround the search
terms unless you explicitly change them.
You can choose to ,
which expands the search to include attributes. You may choose to
search by type and/or by attribute, with searching by attribute being
similar to including indirect matches.
You can further refine or expand the search using the object classes and
associated permissions under the
Classes/Permissions tab.
The search results are displayed in a tabular format, with a different
search result and its search parameters for each tab. Switching between
search result tabs changes the search parameters. You can keep up to
ten results open at a time.
To start a new search, you click New, which
displays the results in a new tab. You can change the search parameters
and click Update, which updates the search within
the existing tab. This allows you to keep track of many different parts
of an analysis. You can save queries for later recall using
=> .
Example 6-1 shows
the contents of a search result field from the Type Enforcement
Rules Display area. The search that generated these
results included searching for enabled and
disabled conditional rules with display. The type searched for is
^httpd_t$ as a source and/or target. The
comments following the mark ## are
explanations inserted for this guide and are not part of the standard
apol output.
278 rules match the search criteria
Number of enabled conditional rules: 23
Number of disabled conditional rules: 34
(3813) allow httpd_t var_log_t:dir { read getattr lock \
search ioctl add_name write };
(3815) allow httpd_t httpd_log_t:file { create ioctl read \
getattr lock append };
(3821) allow httpd_t httpd_log_t:dir { setattr read \
getattr lock search ioctl add_name write };
(3825) allow httpd_t httpd_log_t:lnk_file read;
(3882) allow httpd_t unconfined_t:fd use;
(3884) allow httpd_t unconfined_t:process sigchld;
## These are related to the Boolean httpd_disable_trans,
## showing that it is not set to true:
(4024) allow unconfined_t httpd_t:process transition; [Enabled]
(4074) allow httpd_t unconfined_t:process sigchld; [Enabled]
(4086) allow httpd_t unconfined_t:fd use; [Enabled]
(4088) allow unconfined_t httpd_t:fd use; [Enabled]
(4098) allow httpd_t unconfined_t:fifo_file { ioctl read \
getattr lock write append }; [Enabled]
(4108) allow httpd_t httpd_exec_t:file { read getattr lock \
execute ioctl }; [Enabled]
(4118) allow httpd_t httpd_exec_t:file entrypoint; [Enabled]
(4126) allow unconfined_t httpd_t:process { noatsecure \
siginh rlimitinh }; [Enabled]
## These are part of other httpd_* Booleans that are set
## to false in the file /etc/selinux/targeted/booleans:
(4554) allow httpd_t httpd_sys_script_t:process transition; \
[Disabled]
(4594) allow httpd_t httpd_sys_script_exec_t:file { read getattr \
execute }; [Disabled]
(4604) allow httpd_sys_script_t httpd_t:process sigchld; [Disabled]
(4616) allow httpd_sys_script_t httpd_t:fd use; [Disabled]
(4618) allow httpd_t httpd_sys_script_t:fd use; [Disabled] |
Example 6-1. apol TE Rules Search Results
Within the search results, there are hyperlinks to the left of each
rule. The number corresponds to the line number in
policy.conf, and clicking on, for example,
(3813) switches your view to the
policy.conf tab, taking you directly to line 3813.
These hyperlinks are only visible if you have apol analyzing the
policy.conf file.
If you are using a binary policy file such as
policy.18, the rules are compiled and not available
for viewing. The top-level tab policy.conf is not
present when analyzing the binary policy.
There are two other search capabilities within the Policy
Rules tab, the Conditional Expressions
and RBAC Rules tabs.
The Conditional Expressions tab allows you to
search just the conditional expressions, viewing the rules within them.
The only searchable rule types are
allow,
audit, and
transition. All conditional
expressions are displayed in the default view; you can narrow the view
using .
You can search either by specific Boolean or with regular expressions.
You can reduce the quantity of output by deselecting
.
Each rule is marked if it is [enabled]
or [disabled], which shows the current
state of that conditional in the policy. Changing a value in the
Booleans tab within the Policy
Components tab is reflected in the Conditional
Expressions Display by running your search again. This is
another way of analyzing the consequences of toggling a Boolean value,
entirely within apol.
The last tab under the Policy Rules tab is the
RBAC Rules tab. Effectively, you only use the
choice, since role transitions are
deprecated. Using the selection is
only useful in analyzing roles in older versions of the SELinux policy,
which will not appear in Red Hat Enterprise Linux. The menu is disabled because it is only used in the
deprecated role_transition analysis.
To search, set a , either as source
or any if you want to search for it in both positions in an
allow rule. Then you set a
value. The search result shows if the
source role may assume the targeted role.
Domain transition is one important aspect of TE. Since being in a
particular domain is the key to controlling that domain's derivative
types, the strict control of what domains can transition to what other
domains is essential to SELinux security.
Domain transition is looked at from two directions, forward and reverse.
In a forward analysis, you select a source type and search to find all
target types it can transition to. You can use search parameters to
refine the results. For a reverse analysis, you select a target type and
discover all the source types that can transition to the target type.
For a domain transition to occur, there must be three particular
allow rules. These rules control the
source domain that is attempting to transition to the target domain. One
rule permits the process transition itself, a second rule allows the
source access to the entry point executable for the target domain, and
the third rule allows the target domain itself to use the executable as
an entry point.
Domain transition analysis with apol centers around identifying these
three rules. In some cases, more than one appropriate rule is found.
The extensive help file,
/usr/share/doc/setools-<version>/dta_help.txt
, is useful in explaining this analysis.
Information flow analysis is a central and challenging part of analyzing
an SELinux policy. Your analysis may find unexpected or dangerous
information flows. For example, if you want to be sure that the content
in your /home/ directories
(user_home_dir_t) is flowing as you
configured it into the httpd_t domain,
apol searches through the policy to reveal all the ways information
flows between the two types. This search is show in Figure 6-8:
Information flow analysis can be a challenging and daunting task. The
policy holds thousands or tens of thousands of rules with hundreds of
types, all interacting in multiple ways. The help file
/usr/share/doc/setooles-<version>/iflow_help.txt
is essential reading for understanding information flow analysis in
SELinux.
In doing transitive information flow analysis, apol attempts to string
together different direct flows, looking for ways that information can
transit between direct flows. This looks for ways that allow the
farthest ends of the different direct flows to pass information to each
other.