These rules are defined in $SELINUX_SRC/constraints, and
provide final and overarching constraints on the use of permissions that
are enforced during runtime by the kernel security server. The
constraints are in the form of Boolean expressions. The expression must
be satisfied for the given permission to be granted.
For example, the following constraint pertains to a process transition.
It says that when a transition takes place, the user identity on the
process must remain the same through the transition. If
httpd_t tries to transition to
httpd_suexec_t, the user identity
user_u must remain the same. The
exception is if the source domain has the attribute
privuser. It then has the privilege to
change user identity:
constrain process transition ( u1 == u2 or t1 == privuser ); |
A constraint can make a restriction for the source and target based on
type, role, or user identity. This is different from the other rule
types. TE rules use only types, while role
allow rules use a pair of roles.
This is from the constraints file and further
explains syntax and constraints in the targeted policy:
# Define the constraints
#
# constrain class_set perm_set expression ;
#
# expression : ( expression )
# | not expression
# | expression and expression
# | expression or expression
# | u1 op u2
# | r1 role_op r2
# | t1 op t2
# | u1 op names
# | u2 op names
# | r1 op names
# | r2 op names
# | t1 op names
# | t2 op names
#
# op : == | !=
# role_op : == | != | eq | dom | domby | incomp
#
# names : name | { name_list }
# name_list : name | name_list name#
#
#
# Restrict the ability to transition to other users
# or roles to a few privileged types.
#
constrain process transition
( u1 == u2 or t1 == privuser );
constrain process transition
( r1 == r2 or t1 == privrole );
#
# Restrict the ability to label objects with other
# user identities to a few privileged types.
#
constrain dir_file_class_set { create relabelto relabelfrom }
( u1 == u2 or t1 == privowner );
constrain socket_class_set { create relabelto relabelfrom }
( u1 == u2 or t1 == privowner ); |