858 lines
		
	
	
		
			32 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			858 lines
		
	
	
		
			32 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
=====
 | 
						|
Smack
 | 
						|
=====
 | 
						|
 | 
						|
 | 
						|
    "Good for you, you've decided to clean the elevator!"
 | 
						|
    - The Elevator, from Dark Star
 | 
						|
 | 
						|
Smack is the Simplified Mandatory Access Control Kernel.
 | 
						|
Smack is a kernel based implementation of mandatory access
 | 
						|
control that includes simplicity in its primary design goals.
 | 
						|
 | 
						|
Smack is not the only Mandatory Access Control scheme
 | 
						|
available for Linux. Those new to Mandatory Access Control
 | 
						|
are encouraged to compare Smack with the other mechanisms
 | 
						|
available to determine which is best suited to the problem
 | 
						|
at hand.
 | 
						|
 | 
						|
Smack consists of three major components:
 | 
						|
 | 
						|
    - The kernel
 | 
						|
    - Basic utilities, which are helpful but not required
 | 
						|
    - Configuration data
 | 
						|
 | 
						|
The kernel component of Smack is implemented as a Linux
 | 
						|
Security Modules (LSM) module. It requires netlabel and
 | 
						|
works best with file systems that support extended attributes,
 | 
						|
although xattr support is not strictly required.
 | 
						|
It is safe to run a Smack kernel under a "vanilla" distribution.
 | 
						|
 | 
						|
Smack kernels use the CIPSO IP option. Some network
 | 
						|
configurations are intolerant of IP options and can impede
 | 
						|
access to systems that use them as Smack does.
 | 
						|
 | 
						|
Smack is used in the Tizen operating system. Please
 | 
						|
go to http://wiki.tizen.org for information about how
 | 
						|
Smack is used in Tizen.
 | 
						|
 | 
						|
The current git repository for Smack user space is:
 | 
						|
 | 
						|
	git://github.com/smack-team/smack.git
 | 
						|
 | 
						|
This should make and install on most modern distributions.
 | 
						|
There are five commands included in smackutil:
 | 
						|
 | 
						|
chsmack:
 | 
						|
	display or set Smack extended attribute values
 | 
						|
 | 
						|
smackctl:
 | 
						|
	load the Smack access rules
 | 
						|
 | 
						|
smackaccess:
 | 
						|
	report if a process with one label has access
 | 
						|
	to an object with another
 | 
						|
 | 
						|
These two commands are obsolete with the introduction of
 | 
						|
the smackfs/load2 and smackfs/cipso2 interfaces.
 | 
						|
 | 
						|
smackload:
 | 
						|
	properly formats data for writing to smackfs/load
 | 
						|
 | 
						|
smackcipso:
 | 
						|
	properly formats data for writing to smackfs/cipso
 | 
						|
 | 
						|
In keeping with the intent of Smack, configuration data is
 | 
						|
minimal and not strictly required. The most important
 | 
						|
configuration step is mounting the smackfs pseudo filesystem.
 | 
						|
If smackutil is installed the startup script will take care
 | 
						|
of this, but it can be manually as well.
 | 
						|
 | 
						|
Add this line to ``/etc/fstab``::
 | 
						|
 | 
						|
    smackfs /sys/fs/smackfs smackfs defaults 0 0
 | 
						|
 | 
						|
The ``/sys/fs/smackfs`` directory is created by the kernel.
 | 
						|
 | 
						|
Smack uses extended attributes (xattrs) to store labels on filesystem
 | 
						|
objects. The attributes are stored in the extended attribute security
 | 
						|
name space. A process must have ``CAP_MAC_ADMIN`` to change any of these
 | 
						|
attributes.
 | 
						|
 | 
						|
The extended attributes that Smack uses are:
 | 
						|
 | 
						|
SMACK64
 | 
						|
	Used to make access control decisions. In almost all cases
 | 
						|
	the label given to a new filesystem object will be the label
 | 
						|
	of the process that created it.
 | 
						|
 | 
						|
SMACK64EXEC
 | 
						|
	The Smack label of a process that execs a program file with
 | 
						|
	this attribute set will run with this attribute's value.
 | 
						|
 | 
						|
SMACK64MMAP
 | 
						|
	Don't allow the file to be mmapped by a process whose Smack
 | 
						|
	label does not allow all of the access permitted to a process
 | 
						|
	with the label contained in this attribute. This is a very
 | 
						|
	specific use case for shared libraries.
 | 
						|
 | 
						|
SMACK64TRANSMUTE
 | 
						|
	Can only have the value "TRUE". If this attribute is present
 | 
						|
	on a directory when an object is created in the directory and
 | 
						|
	the Smack rule (more below) that permitted the write access
 | 
						|
	to the directory includes the transmute ("t") mode the object
 | 
						|
	gets the label of the directory instead of the label of the
 | 
						|
	creating process. If the object being created is a directory
 | 
						|
	the SMACK64TRANSMUTE attribute is set as well.
 | 
						|
 | 
						|
SMACK64IPIN
 | 
						|
	This attribute is only available on file descriptors for sockets.
 | 
						|
	Use the Smack label in this attribute for access control
 | 
						|
	decisions on packets being delivered to this socket.
 | 
						|
 | 
						|
SMACK64IPOUT
 | 
						|
	This attribute is only available on file descriptors for sockets.
 | 
						|
	Use the Smack label in this attribute for access control
 | 
						|
	decisions on packets coming from this socket.
 | 
						|
 | 
						|
There are multiple ways to set a Smack label on a file::
 | 
						|
 | 
						|
    # attr -S -s SMACK64 -V "value" path
 | 
						|
    # chsmack -a value path
 | 
						|
 | 
						|
A process can see the Smack label it is running with by
 | 
						|
reading ``/proc/self/attr/current``. A process with ``CAP_MAC_ADMIN``
 | 
						|
can set the process Smack by writing there.
 | 
						|
 | 
						|
Most Smack configuration is accomplished by writing to files
 | 
						|
in the smackfs filesystem. This pseudo-filesystem is mounted
 | 
						|
on ``/sys/fs/smackfs``.
 | 
						|
 | 
						|
access
 | 
						|
	Provided for backward compatibility. The access2 interface
 | 
						|
	is preferred and should be used instead.
 | 
						|
	This interface reports whether a subject with the specified
 | 
						|
	Smack label has a particular access to an object with a
 | 
						|
	specified Smack label. Write a fixed format access rule to
 | 
						|
	this file. The next read will indicate whether the access
 | 
						|
	would be permitted. The text will be either "1" indicating
 | 
						|
	access, or "0" indicating denial.
 | 
						|
 | 
						|
access2
 | 
						|
	This interface reports whether a subject with the specified
 | 
						|
	Smack label has a particular access to an object with a
 | 
						|
	specified Smack label. Write a long format access rule to
 | 
						|
	this file. The next read will indicate whether the access
 | 
						|
	would be permitted. The text will be either "1" indicating
 | 
						|
	access, or "0" indicating denial.
 | 
						|
 | 
						|
ambient
 | 
						|
	This contains the Smack label applied to unlabeled network
 | 
						|
	packets.
 | 
						|
 | 
						|
change-rule
 | 
						|
	This interface allows modification of existing access control rules.
 | 
						|
	The format accepted on write is::
 | 
						|
 | 
						|
		"%s %s %s %s"
 | 
						|
 | 
						|
	where the first string is the subject label, the second the
 | 
						|
	object label, the third the access to allow and the fourth the
 | 
						|
	access to deny. The access strings may contain only the characters
 | 
						|
	"rwxat-". If a rule for a given subject and object exists it will be
 | 
						|
	modified by enabling the permissions in the third string and disabling
 | 
						|
	those in the fourth string. If there is no such rule it will be
 | 
						|
	created using the access specified in the third and the fourth strings.
 | 
						|
 | 
						|
cipso
 | 
						|
	Provided for backward compatibility. The cipso2 interface
 | 
						|
	is preferred and should be used instead.
 | 
						|
	This interface allows a specific CIPSO header to be assigned
 | 
						|
	to a Smack label. The format accepted on write is::
 | 
						|
 | 
						|
		"%24s%4d%4d"["%4d"]...
 | 
						|
 | 
						|
	The first string is a fixed Smack label. The first number is
 | 
						|
	the level to use. The second number is the number of categories.
 | 
						|
	The following numbers are the categories::
 | 
						|
 | 
						|
		"level-3-cats-5-19          3   2   5  19"
 | 
						|
 | 
						|
cipso2
 | 
						|
	This interface allows a specific CIPSO header to be assigned
 | 
						|
	to a Smack label. The format accepted on write is::
 | 
						|
 | 
						|
		"%s%4d%4d"["%4d"]...
 | 
						|
 | 
						|
	The first string is a long Smack label. The first number is
 | 
						|
	the level to use. The second number is the number of categories.
 | 
						|
	The following numbers are the categories::
 | 
						|
 | 
						|
		"level-3-cats-5-19   3   2   5  19"
 | 
						|
 | 
						|
direct
 | 
						|
	This contains the CIPSO level used for Smack direct label
 | 
						|
	representation in network packets.
 | 
						|
 | 
						|
doi
 | 
						|
	This contains the CIPSO domain of interpretation used in
 | 
						|
	network packets.
 | 
						|
 | 
						|
ipv6host
 | 
						|
	This interface allows specific IPv6 internet addresses to be
 | 
						|
	treated as single label hosts. Packets are sent to single
 | 
						|
	label hosts only from processes that have Smack write access
 | 
						|
	to the host label. All packets received from single label hosts
 | 
						|
	are given the specified label. The format accepted on write is::
 | 
						|
 | 
						|
		"%h:%h:%h:%h:%h:%h:%h:%h label" or
 | 
						|
		"%h:%h:%h:%h:%h:%h:%h:%h/%d label".
 | 
						|
 | 
						|
	The "::" address shortcut is not supported.
 | 
						|
	If label is "-DELETE" a matched entry will be deleted.
 | 
						|
 | 
						|
load
 | 
						|
	Provided for backward compatibility. The load2 interface
 | 
						|
	is preferred and should be used instead.
 | 
						|
	This interface allows access control rules in addition to
 | 
						|
	the system defined rules to be specified. The format accepted
 | 
						|
	on write is::
 | 
						|
 | 
						|
		"%24s%24s%5s"
 | 
						|
 | 
						|
	where the first string is the subject label, the second the
 | 
						|
	object label, and the third the requested access. The access
 | 
						|
	string may contain only the characters "rwxat-", and specifies
 | 
						|
	which sort of access is allowed. The "-" is a placeholder for
 | 
						|
	permissions that are not allowed. The string "r-x--" would
 | 
						|
	specify read and execute access. Labels are limited to 23
 | 
						|
	characters in length.
 | 
						|
 | 
						|
load2
 | 
						|
	This interface allows access control rules in addition to
 | 
						|
	the system defined rules to be specified. The format accepted
 | 
						|
	on write is::
 | 
						|
 | 
						|
		"%s %s %s"
 | 
						|
 | 
						|
	where the first string is the subject label, the second the
 | 
						|
	object label, and the third the requested access. The access
 | 
						|
	string may contain only the characters "rwxat-", and specifies
 | 
						|
	which sort of access is allowed. The "-" is a placeholder for
 | 
						|
	permissions that are not allowed. The string "r-x--" would
 | 
						|
	specify read and execute access.
 | 
						|
 | 
						|
load-self
 | 
						|
	Provided for backward compatibility. The load-self2 interface
 | 
						|
	is preferred and should be used instead.
 | 
						|
	This interface allows process specific access rules to be
 | 
						|
	defined. These rules are only consulted if access would
 | 
						|
	otherwise be permitted, and are intended to provide additional
 | 
						|
	restrictions on the process. The format is the same as for
 | 
						|
	the load interface.
 | 
						|
 | 
						|
load-self2
 | 
						|
	This interface allows process specific access rules to be
 | 
						|
	defined. These rules are only consulted if access would
 | 
						|
	otherwise be permitted, and are intended to provide additional
 | 
						|
	restrictions on the process. The format is the same as for
 | 
						|
	the load2 interface.
 | 
						|
 | 
						|
logging
 | 
						|
	This contains the Smack logging state.
 | 
						|
 | 
						|
mapped
 | 
						|
	This contains the CIPSO level used for Smack mapped label
 | 
						|
	representation in network packets.
 | 
						|
 | 
						|
netlabel
 | 
						|
	This interface allows specific internet addresses to be
 | 
						|
	treated as single label hosts. Packets are sent to single
 | 
						|
	label hosts without CIPSO headers, but only from processes
 | 
						|
	that have Smack write access to the host label. All packets
 | 
						|
	received from single label hosts are given the specified
 | 
						|
	label. The format accepted on write is::
 | 
						|
 | 
						|
		"%d.%d.%d.%d label" or "%d.%d.%d.%d/%d label".
 | 
						|
 | 
						|
	If the label specified is "-CIPSO" the address is treated
 | 
						|
	as a host that supports CIPSO headers.
 | 
						|
 | 
						|
onlycap
 | 
						|
	This contains labels processes must have for CAP_MAC_ADMIN
 | 
						|
	and ``CAP_MAC_OVERRIDE`` to be effective. If this file is empty
 | 
						|
	these capabilities are effective at for processes with any
 | 
						|
	label. The values are set by writing the desired labels, separated
 | 
						|
	by spaces, to the file or cleared by writing "-" to the file.
 | 
						|
 | 
						|
ptrace
 | 
						|
	This is used to define the current ptrace policy
 | 
						|
 | 
						|
	0 - default:
 | 
						|
	    this is the policy that relies on Smack access rules.
 | 
						|
	    For the ``PTRACE_READ`` a subject needs to have a read access on
 | 
						|
	    object. For the ``PTRACE_ATTACH`` a read-write access is required.
 | 
						|
 | 
						|
	1 - exact:
 | 
						|
	    this is the policy that limits ``PTRACE_ATTACH``. Attach is
 | 
						|
	    only allowed when subject's and object's labels are equal.
 | 
						|
	    ``PTRACE_READ`` is not affected. Can be overridden with ``CAP_SYS_PTRACE``.
 | 
						|
 | 
						|
	2 - draconian:
 | 
						|
	    this policy behaves like the 'exact' above with an
 | 
						|
	    exception that it can't be overridden with ``CAP_SYS_PTRACE``.
 | 
						|
 | 
						|
revoke-subject
 | 
						|
	Writing a Smack label here sets the access to '-' for all access
 | 
						|
	rules with that subject label.
 | 
						|
 | 
						|
unconfined
 | 
						|
	If the kernel is configured with ``CONFIG_SECURITY_SMACK_BRINGUP``
 | 
						|
	a process with ``CAP_MAC_ADMIN`` can write a label into this interface.
 | 
						|
	Thereafter, accesses that involve that label will be logged and
 | 
						|
	the access permitted if it wouldn't be otherwise. Note that this
 | 
						|
	is dangerous and can ruin the proper labeling of your system.
 | 
						|
	It should never be used in production.
 | 
						|
 | 
						|
relabel-self
 | 
						|
	This interface contains a list of labels to which the process can
 | 
						|
	transition to, by writing to ``/proc/self/attr/current``.
 | 
						|
	Normally a process can change its own label to any legal value, but only
 | 
						|
	if it has ``CAP_MAC_ADMIN``. This interface allows a process without
 | 
						|
	``CAP_MAC_ADMIN`` to relabel itself to one of labels from predefined list.
 | 
						|
	A process without ``CAP_MAC_ADMIN`` can change its label only once. When it
 | 
						|
	does, this list will be cleared.
 | 
						|
	The values are set by writing the desired labels, separated
 | 
						|
	by spaces, to the file or cleared by writing "-" to the file.
 | 
						|
 | 
						|
If you are using the smackload utility
 | 
						|
you can add access rules in ``/etc/smack/accesses``. They take the form::
 | 
						|
 | 
						|
    subjectlabel objectlabel access
 | 
						|
 | 
						|
access is a combination of the letters rwxatb which specify the
 | 
						|
kind of access permitted a subject with subjectlabel on an
 | 
						|
object with objectlabel. If there is no rule no access is allowed.
 | 
						|
 | 
						|
Look for additional programs on http://schaufler-ca.com
 | 
						|
 | 
						|
The Simplified Mandatory Access Control Kernel (Whitepaper)
 | 
						|
===========================================================
 | 
						|
 | 
						|
Casey Schaufler
 | 
						|
casey@schaufler-ca.com
 | 
						|
 | 
						|
Mandatory Access Control
 | 
						|
------------------------
 | 
						|
 | 
						|
Computer systems employ a variety of schemes to constrain how information is
 | 
						|
shared among the people and services using the machine. Some of these schemes
 | 
						|
allow the program or user to decide what other programs or users are allowed
 | 
						|
access to pieces of data. These schemes are called discretionary access
 | 
						|
control mechanisms because the access control is specified at the discretion
 | 
						|
of the user. Other schemes do not leave the decision regarding what a user or
 | 
						|
program can access up to users or programs. These schemes are called mandatory
 | 
						|
access control mechanisms because you don't have a choice regarding the users
 | 
						|
or programs that have access to pieces of data.
 | 
						|
 | 
						|
Bell & LaPadula
 | 
						|
---------------
 | 
						|
 | 
						|
From the middle of the 1980's until the turn of the century Mandatory Access
 | 
						|
Control (MAC) was very closely associated with the Bell & LaPadula security
 | 
						|
model, a mathematical description of the United States Department of Defense
 | 
						|
policy for marking paper documents. MAC in this form enjoyed a following
 | 
						|
within the Capital Beltway and Scandinavian supercomputer centers but was
 | 
						|
often sited as failing to address general needs.
 | 
						|
 | 
						|
Domain Type Enforcement
 | 
						|
-----------------------
 | 
						|
 | 
						|
Around the turn of the century Domain Type Enforcement (DTE) became popular.
 | 
						|
This scheme organizes users, programs, and data into domains that are
 | 
						|
protected from each other. This scheme has been widely deployed as a component
 | 
						|
of popular Linux distributions. The administrative overhead required to
 | 
						|
maintain this scheme and the detailed understanding of the whole system
 | 
						|
necessary to provide a secure domain mapping leads to the scheme being
 | 
						|
disabled or used in limited ways in the majority of cases.
 | 
						|
 | 
						|
Smack
 | 
						|
-----
 | 
						|
 | 
						|
Smack is a Mandatory Access Control mechanism designed to provide useful MAC
 | 
						|
while avoiding the pitfalls of its predecessors. The limitations of Bell &
 | 
						|
LaPadula are addressed by providing a scheme whereby access can be controlled
 | 
						|
according to the requirements of the system and its purpose rather than those
 | 
						|
imposed by an arcane government policy. The complexity of Domain Type
 | 
						|
Enforcement and avoided by defining access controls in terms of the access
 | 
						|
modes already in use.
 | 
						|
 | 
						|
Smack Terminology
 | 
						|
-----------------
 | 
						|
 | 
						|
The jargon used to talk about Smack will be familiar to those who have dealt
 | 
						|
with other MAC systems and shouldn't be too difficult for the uninitiated to
 | 
						|
pick up. There are four terms that are used in a specific way and that are
 | 
						|
especially important:
 | 
						|
 | 
						|
  Subject:
 | 
						|
	A subject is an active entity on the computer system.
 | 
						|
	On Smack a subject is a task, which is in turn the basic unit
 | 
						|
	of execution.
 | 
						|
 | 
						|
  Object:
 | 
						|
	An object is a passive entity on the computer system.
 | 
						|
	On Smack files of all types, IPC, and tasks can be objects.
 | 
						|
 | 
						|
  Access:
 | 
						|
	Any attempt by a subject to put information into or get
 | 
						|
	information from an object is an access.
 | 
						|
 | 
						|
  Label:
 | 
						|
	Data that identifies the Mandatory Access Control
 | 
						|
	characteristics of a subject or an object.
 | 
						|
 | 
						|
These definitions are consistent with the traditional use in the security
 | 
						|
community. There are also some terms from Linux that are likely to crop up:
 | 
						|
 | 
						|
  Capability:
 | 
						|
	A task that possesses a capability has permission to
 | 
						|
	violate an aspect of the system security policy, as identified by
 | 
						|
	the specific capability. A task that possesses one or more
 | 
						|
	capabilities is a privileged task, whereas a task with no
 | 
						|
	capabilities is an unprivileged task.
 | 
						|
 | 
						|
  Privilege:
 | 
						|
	A task that is allowed to violate the system security
 | 
						|
	policy is said to have privilege. As of this writing a task can
 | 
						|
	have privilege either by possessing capabilities or by having an
 | 
						|
	effective user of root.
 | 
						|
 | 
						|
Smack Basics
 | 
						|
------------
 | 
						|
 | 
						|
Smack is an extension to a Linux system. It enforces additional restrictions
 | 
						|
on what subjects can access which objects, based on the labels attached to
 | 
						|
each of the subject and the object.
 | 
						|
 | 
						|
Labels
 | 
						|
~~~~~~
 | 
						|
 | 
						|
Smack labels are ASCII character strings. They can be up to 255 characters
 | 
						|
long, but keeping them to twenty-three characters is recommended.
 | 
						|
Single character labels using special characters, that being anything
 | 
						|
other than a letter or digit, are reserved for use by the Smack development
 | 
						|
team. Smack labels are unstructured, case sensitive, and the only operation
 | 
						|
ever performed on them is comparison for equality. Smack labels cannot
 | 
						|
contain unprintable characters, the "/" (slash), the "\" (backslash), the "'"
 | 
						|
(quote) and '"' (double-quote) characters.
 | 
						|
Smack labels cannot begin with a '-'. This is reserved for special options.
 | 
						|
 | 
						|
There are some predefined labels::
 | 
						|
 | 
						|
	_ 	Pronounced "floor", a single underscore character.
 | 
						|
	^ 	Pronounced "hat", a single circumflex character.
 | 
						|
	* 	Pronounced "star", a single asterisk character.
 | 
						|
	? 	Pronounced "huh", a single question mark character.
 | 
						|
	@ 	Pronounced "web", a single at sign character.
 | 
						|
 | 
						|
Every task on a Smack system is assigned a label. The Smack label
 | 
						|
of a process will usually be assigned by the system initialization
 | 
						|
mechanism.
 | 
						|
 | 
						|
Access Rules
 | 
						|
~~~~~~~~~~~~
 | 
						|
 | 
						|
Smack uses the traditional access modes of Linux. These modes are read,
 | 
						|
execute, write, and occasionally append. There are a few cases where the
 | 
						|
access mode may not be obvious. These include:
 | 
						|
 | 
						|
  Signals:
 | 
						|
	A signal is a write operation from the subject task to
 | 
						|
	the object task.
 | 
						|
 | 
						|
  Internet Domain IPC:
 | 
						|
	Transmission of a packet is considered a
 | 
						|
	write operation from the source task to the destination task.
 | 
						|
 | 
						|
Smack restricts access based on the label attached to a subject and the label
 | 
						|
attached to the object it is trying to access. The rules enforced are, in
 | 
						|
order:
 | 
						|
 | 
						|
	1. Any access requested by a task labeled "*" is denied.
 | 
						|
	2. A read or execute access requested by a task labeled "^"
 | 
						|
	   is permitted.
 | 
						|
	3. A read or execute access requested on an object labeled "_"
 | 
						|
	   is permitted.
 | 
						|
	4. Any access requested on an object labeled "*" is permitted.
 | 
						|
	5. Any access requested by a task on an object with the same
 | 
						|
	   label is permitted.
 | 
						|
	6. Any access requested that is explicitly defined in the loaded
 | 
						|
	   rule set is permitted.
 | 
						|
	7. Any other access is denied.
 | 
						|
 | 
						|
Smack Access Rules
 | 
						|
~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
With the isolation provided by Smack access separation is simple. There are
 | 
						|
many interesting cases where limited access by subjects to objects with
 | 
						|
different labels is desired. One example is the familiar spy model of
 | 
						|
sensitivity, where a scientist working on a highly classified project would be
 | 
						|
able to read documents of lower classifications and anything she writes will
 | 
						|
be "born" highly classified. To accommodate such schemes Smack includes a
 | 
						|
mechanism for specifying rules allowing access between labels.
 | 
						|
 | 
						|
Access Rule Format
 | 
						|
~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
The format of an access rule is::
 | 
						|
 | 
						|
	subject-label object-label access
 | 
						|
 | 
						|
Where subject-label is the Smack label of the task, object-label is the Smack
 | 
						|
label of the thing being accessed, and access is a string specifying the sort
 | 
						|
of access allowed. The access specification is searched for letters that
 | 
						|
describe access modes:
 | 
						|
 | 
						|
	a: indicates that append access should be granted.
 | 
						|
	r: indicates that read access should be granted.
 | 
						|
	w: indicates that write access should be granted.
 | 
						|
	x: indicates that execute access should be granted.
 | 
						|
	t: indicates that the rule requests transmutation.
 | 
						|
	b: indicates that the rule should be reported for bring-up.
 | 
						|
 | 
						|
Uppercase values for the specification letters are allowed as well.
 | 
						|
Access mode specifications can be in any order. Examples of acceptable rules
 | 
						|
are::
 | 
						|
 | 
						|
	TopSecret Secret  rx
 | 
						|
	Secret    Unclass R
 | 
						|
	Manager   Game    x
 | 
						|
	User      HR      w
 | 
						|
	Snap      Crackle rwxatb
 | 
						|
	New       Old     rRrRr
 | 
						|
	Closed    Off     -
 | 
						|
 | 
						|
Examples of unacceptable rules are::
 | 
						|
 | 
						|
	Top Secret Secret     rx
 | 
						|
	Ace        Ace        r
 | 
						|
	Odd        spells     waxbeans
 | 
						|
 | 
						|
Spaces are not allowed in labels. Since a subject always has access to files
 | 
						|
with the same label specifying a rule for that case is pointless. Only
 | 
						|
valid letters (rwxatbRWXATB) and the dash ('-') character are allowed in
 | 
						|
access specifications. The dash is a placeholder, so "a-r" is the same
 | 
						|
as "ar". A lone dash is used to specify that no access should be allowed.
 | 
						|
 | 
						|
Applying Access Rules
 | 
						|
~~~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
The developers of Linux rarely define new sorts of things, usually importing
 | 
						|
schemes and concepts from other systems. Most often, the other systems are
 | 
						|
variants of Unix. Unix has many endearing properties, but consistency of
 | 
						|
access control models is not one of them. Smack strives to treat accesses as
 | 
						|
uniformly as is sensible while keeping with the spirit of the underlying
 | 
						|
mechanism.
 | 
						|
 | 
						|
File system objects including files, directories, named pipes, symbolic links,
 | 
						|
and devices require access permissions that closely match those used by mode
 | 
						|
bit access. To open a file for reading read access is required on the file. To
 | 
						|
search a directory requires execute access. Creating a file with write access
 | 
						|
requires both read and write access on the containing directory. Deleting a
 | 
						|
file requires read and write access to the file and to the containing
 | 
						|
directory. It is possible that a user may be able to see that a file exists
 | 
						|
but not any of its attributes by the circumstance of having read access to the
 | 
						|
containing directory but not to the differently labeled file. This is an
 | 
						|
artifact of the file name being data in the directory, not a part of the file.
 | 
						|
 | 
						|
If a directory is marked as transmuting (SMACK64TRANSMUTE=TRUE) and the
 | 
						|
access rule that allows a process to create an object in that directory
 | 
						|
includes 't' access the label assigned to the new object will be that
 | 
						|
of the directory, not the creating process. This makes it much easier
 | 
						|
for two processes with different labels to share data without granting
 | 
						|
access to all of their files.
 | 
						|
 | 
						|
IPC objects, message queues, semaphore sets, and memory segments exist in flat
 | 
						|
namespaces and access requests are only required to match the object in
 | 
						|
question.
 | 
						|
 | 
						|
Process objects reflect tasks on the system and the Smack label used to access
 | 
						|
them is the same Smack label that the task would use for its own access
 | 
						|
attempts. Sending a signal via the kill() system call is a write operation
 | 
						|
from the signaler to the recipient. Debugging a process requires both reading
 | 
						|
and writing. Creating a new task is an internal operation that results in two
 | 
						|
tasks with identical Smack labels and requires no access checks.
 | 
						|
 | 
						|
Sockets are data structures attached to processes and sending a packet from
 | 
						|
one process to another requires that the sender have write access to the
 | 
						|
receiver. The receiver is not required to have read access to the sender.
 | 
						|
 | 
						|
Setting Access Rules
 | 
						|
~~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
The configuration file /etc/smack/accesses contains the rules to be set at
 | 
						|
system startup. The contents are written to the special file
 | 
						|
/sys/fs/smackfs/load2. Rules can be added at any time and take effect
 | 
						|
immediately. For any pair of subject and object labels there can be only
 | 
						|
one rule, with the most recently specified overriding any earlier
 | 
						|
specification.
 | 
						|
 | 
						|
Task Attribute
 | 
						|
~~~~~~~~~~~~~~
 | 
						|
 | 
						|
The Smack label of a process can be read from /proc/<pid>/attr/current. A
 | 
						|
process can read its own Smack label from /proc/self/attr/current. A
 | 
						|
privileged process can change its own Smack label by writing to
 | 
						|
/proc/self/attr/current but not the label of another process.
 | 
						|
 | 
						|
File Attribute
 | 
						|
~~~~~~~~~~~~~~
 | 
						|
 | 
						|
The Smack label of a filesystem object is stored as an extended attribute
 | 
						|
named SMACK64 on the file. This attribute is in the security namespace. It can
 | 
						|
only be changed by a process with privilege.
 | 
						|
 | 
						|
Privilege
 | 
						|
~~~~~~~~~
 | 
						|
 | 
						|
A process with CAP_MAC_OVERRIDE or CAP_MAC_ADMIN is privileged.
 | 
						|
CAP_MAC_OVERRIDE allows the process access to objects it would
 | 
						|
be denied otherwise. CAP_MAC_ADMIN allows a process to change
 | 
						|
Smack data, including rules and attributes.
 | 
						|
 | 
						|
Smack Networking
 | 
						|
~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
As mentioned before, Smack enforces access control on network protocol
 | 
						|
transmissions. Every packet sent by a Smack process is tagged with its Smack
 | 
						|
label. This is done by adding a CIPSO tag to the header of the IP packet. Each
 | 
						|
packet received is expected to have a CIPSO tag that identifies the label and
 | 
						|
if it lacks such a tag the network ambient label is assumed. Before the packet
 | 
						|
is delivered a check is made to determine that a subject with the label on the
 | 
						|
packet has write access to the receiving process and if that is not the case
 | 
						|
the packet is dropped.
 | 
						|
 | 
						|
CIPSO Configuration
 | 
						|
~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
It is normally unnecessary to specify the CIPSO configuration. The default
 | 
						|
values used by the system handle all internal cases. Smack will compose CIPSO
 | 
						|
label values to match the Smack labels being used without administrative
 | 
						|
intervention. Unlabeled packets that come into the system will be given the
 | 
						|
ambient label.
 | 
						|
 | 
						|
Smack requires configuration in the case where packets from a system that is
 | 
						|
not Smack that speaks CIPSO may be encountered. Usually this will be a Trusted
 | 
						|
Solaris system, but there are other, less widely deployed systems out there.
 | 
						|
CIPSO provides 3 important values, a Domain Of Interpretation (DOI), a level,
 | 
						|
and a category set with each packet. The DOI is intended to identify a group
 | 
						|
of systems that use compatible labeling schemes, and the DOI specified on the
 | 
						|
Smack system must match that of the remote system or packets will be
 | 
						|
discarded. The DOI is 3 by default. The value can be read from
 | 
						|
/sys/fs/smackfs/doi and can be changed by writing to /sys/fs/smackfs/doi.
 | 
						|
 | 
						|
The label and category set are mapped to a Smack label as defined in
 | 
						|
/etc/smack/cipso.
 | 
						|
 | 
						|
A Smack/CIPSO mapping has the form::
 | 
						|
 | 
						|
	smack level [category [category]*]
 | 
						|
 | 
						|
Smack does not expect the level or category sets to be related in any
 | 
						|
particular way and does not assume or assign accesses based on them. Some
 | 
						|
examples of mappings::
 | 
						|
 | 
						|
	TopSecret 7
 | 
						|
	TS:A,B    7 1 2
 | 
						|
	SecBDE    5 2 4 6
 | 
						|
	RAFTERS   7 12 26
 | 
						|
 | 
						|
The ":" and "," characters are permitted in a Smack label but have no special
 | 
						|
meaning.
 | 
						|
 | 
						|
The mapping of Smack labels to CIPSO values is defined by writing to
 | 
						|
/sys/fs/smackfs/cipso2.
 | 
						|
 | 
						|
In addition to explicit mappings Smack supports direct CIPSO mappings. One
 | 
						|
CIPSO level is used to indicate that the category set passed in the packet is
 | 
						|
in fact an encoding of the Smack label. The level used is 250 by default. The
 | 
						|
value can be read from /sys/fs/smackfs/direct and changed by writing to
 | 
						|
/sys/fs/smackfs/direct.
 | 
						|
 | 
						|
Socket Attributes
 | 
						|
~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
There are two attributes that are associated with sockets. These attributes
 | 
						|
can only be set by privileged tasks, but any task can read them for their own
 | 
						|
sockets.
 | 
						|
 | 
						|
  SMACK64IPIN:
 | 
						|
	The Smack label of the task object. A privileged
 | 
						|
	program that will enforce policy may set this to the star label.
 | 
						|
 | 
						|
  SMACK64IPOUT:
 | 
						|
	The Smack label transmitted with outgoing packets.
 | 
						|
	A privileged program may set this to match the label of another
 | 
						|
	task with which it hopes to communicate.
 | 
						|
 | 
						|
Smack Netlabel Exceptions
 | 
						|
~~~~~~~~~~~~~~~~~~~~~~~~~
 | 
						|
 | 
						|
You will often find that your labeled application has to talk to the outside,
 | 
						|
unlabeled world. To do this there's a special file /sys/fs/smackfs/netlabel
 | 
						|
where you can add some exceptions in the form of::
 | 
						|
 | 
						|
	@IP1	   LABEL1 or
 | 
						|
	@IP2/MASK  LABEL2
 | 
						|
 | 
						|
It means that your application will have unlabeled access to @IP1 if it has
 | 
						|
write access on LABEL1, and access to the subnet @IP2/MASK if it has write
 | 
						|
access on LABEL2.
 | 
						|
 | 
						|
Entries in the /sys/fs/smackfs/netlabel file are matched by longest mask
 | 
						|
first, like in classless IPv4 routing.
 | 
						|
 | 
						|
A special label '@' and an option '-CIPSO' can be used there::
 | 
						|
 | 
						|
	@      means Internet, any application with any label has access to it
 | 
						|
	-CIPSO means standard CIPSO networking
 | 
						|
 | 
						|
If you don't know what CIPSO is and don't plan to use it, you can just do::
 | 
						|
 | 
						|
	echo 127.0.0.1 -CIPSO > /sys/fs/smackfs/netlabel
 | 
						|
	echo 0.0.0.0/0 @      > /sys/fs/smackfs/netlabel
 | 
						|
 | 
						|
If you use CIPSO on your 192.168.0.0/16 local network and need also unlabeled
 | 
						|
Internet access, you can have::
 | 
						|
 | 
						|
	echo 127.0.0.1      -CIPSO > /sys/fs/smackfs/netlabel
 | 
						|
	echo 192.168.0.0/16 -CIPSO > /sys/fs/smackfs/netlabel
 | 
						|
	echo 0.0.0.0/0      @      > /sys/fs/smackfs/netlabel
 | 
						|
 | 
						|
Writing Applications for Smack
 | 
						|
------------------------------
 | 
						|
 | 
						|
There are three sorts of applications that will run on a Smack system. How an
 | 
						|
application interacts with Smack will determine what it will have to do to
 | 
						|
work properly under Smack.
 | 
						|
 | 
						|
Smack Ignorant Applications
 | 
						|
---------------------------
 | 
						|
 | 
						|
By far the majority of applications have no reason whatever to care about the
 | 
						|
unique properties of Smack. Since invoking a program has no impact on the
 | 
						|
Smack label associated with the process the only concern likely to arise is
 | 
						|
whether the process has execute access to the program.
 | 
						|
 | 
						|
Smack Relevant Applications
 | 
						|
---------------------------
 | 
						|
 | 
						|
Some programs can be improved by teaching them about Smack, but do not make
 | 
						|
any security decisions themselves. The utility ls(1) is one example of such a
 | 
						|
program.
 | 
						|
 | 
						|
Smack Enforcing Applications
 | 
						|
----------------------------
 | 
						|
 | 
						|
These are special programs that not only know about Smack, but participate in
 | 
						|
the enforcement of system policy. In most cases these are the programs that
 | 
						|
set up user sessions. There are also network services that provide information
 | 
						|
to processes running with various labels.
 | 
						|
 | 
						|
File System Interfaces
 | 
						|
----------------------
 | 
						|
 | 
						|
Smack maintains labels on file system objects using extended attributes. The
 | 
						|
Smack label of a file, directory, or other file system object can be obtained
 | 
						|
using getxattr(2)::
 | 
						|
 | 
						|
	len = getxattr("/", "security.SMACK64", value, sizeof (value));
 | 
						|
 | 
						|
will put the Smack label of the root directory into value. A privileged
 | 
						|
process can set the Smack label of a file system object with setxattr(2)::
 | 
						|
 | 
						|
	len = strlen("Rubble");
 | 
						|
	rc = setxattr("/foo", "security.SMACK64", "Rubble", len, 0);
 | 
						|
 | 
						|
will set the Smack label of /foo to "Rubble" if the program has appropriate
 | 
						|
privilege.
 | 
						|
 | 
						|
Socket Interfaces
 | 
						|
-----------------
 | 
						|
 | 
						|
The socket attributes can be read using fgetxattr(2).
 | 
						|
 | 
						|
A privileged process can set the Smack label of outgoing packets with
 | 
						|
fsetxattr(2)::
 | 
						|
 | 
						|
	len = strlen("Rubble");
 | 
						|
	rc = fsetxattr(fd, "security.SMACK64IPOUT", "Rubble", len, 0);
 | 
						|
 | 
						|
will set the Smack label "Rubble" on packets going out from the socket if the
 | 
						|
program has appropriate privilege::
 | 
						|
 | 
						|
	rc = fsetxattr(fd, "security.SMACK64IPIN, "*", strlen("*"), 0);
 | 
						|
 | 
						|
will set the Smack label "*" as the object label against which incoming
 | 
						|
packets will be checked if the program has appropriate privilege.
 | 
						|
 | 
						|
Administration
 | 
						|
--------------
 | 
						|
 | 
						|
Smack supports some mount options:
 | 
						|
 | 
						|
  smackfsdef=label:
 | 
						|
	specifies the label to give files that lack
 | 
						|
	the Smack label extended attribute.
 | 
						|
 | 
						|
  smackfsroot=label:
 | 
						|
	specifies the label to assign the root of the
 | 
						|
	file system if it lacks the Smack extended attribute.
 | 
						|
 | 
						|
  smackfshat=label:
 | 
						|
	specifies a label that must have read access to
 | 
						|
	all labels set on the filesystem. Not yet enforced.
 | 
						|
 | 
						|
  smackfsfloor=label:
 | 
						|
	specifies a label to which all labels set on the
 | 
						|
	filesystem must have read access. Not yet enforced.
 | 
						|
 | 
						|
These mount options apply to all file system types.
 | 
						|
 | 
						|
Smack auditing
 | 
						|
--------------
 | 
						|
 | 
						|
If you want Smack auditing of security events, you need to set CONFIG_AUDIT
 | 
						|
in your kernel configuration.
 | 
						|
By default, all denied events will be audited. You can change this behavior by
 | 
						|
writing a single character to the /sys/fs/smackfs/logging file::
 | 
						|
 | 
						|
	0 : no logging
 | 
						|
	1 : log denied (default)
 | 
						|
	2 : log accepted
 | 
						|
	3 : log denied & accepted
 | 
						|
 | 
						|
Events are logged as 'key=value' pairs, for each event you at least will get
 | 
						|
the subject, the object, the rights requested, the action, the kernel function
 | 
						|
that triggered the event, plus other pairs depending on the type of event
 | 
						|
audited.
 | 
						|
 | 
						|
Bringup Mode
 | 
						|
------------
 | 
						|
 | 
						|
Bringup mode provides logging features that can make application
 | 
						|
configuration and system bringup easier. Configure the kernel with
 | 
						|
CONFIG_SECURITY_SMACK_BRINGUP to enable these features. When bringup
 | 
						|
mode is enabled accesses that succeed due to rules marked with the "b"
 | 
						|
access mode will logged. When a new label is introduced for processes
 | 
						|
rules can be added aggressively, marked with the "b". The logging allows
 | 
						|
tracking of which rules actual get used for that label.
 | 
						|
 | 
						|
Another feature of bringup mode is the "unconfined" option. Writing
 | 
						|
a label to /sys/fs/smackfs/unconfined makes subjects with that label
 | 
						|
able to access any object, and objects with that label accessible to
 | 
						|
all subjects. Any access that is granted because a label is unconfined
 | 
						|
is logged. This feature is dangerous, as files and directories may
 | 
						|
be created in places they couldn't if the policy were being enforced.
 |