Smack: Updates for Smack documentation
Document the Smack bringup features. Update the proper location for mounting smackfs from /smack to /sys/fs/smackfs. Fix some spelling errors. Suggest the use of the load2 interface instead of the load interface. Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
This commit is contained in:
parent
f43b65bad6
commit
18779b75e9
1 changed files with 79 additions and 50 deletions
|
@ -33,11 +33,18 @@ The current git repository for Smack user space is:
|
||||||
git://github.com/smack-team/smack.git
|
git://github.com/smack-team/smack.git
|
||||||
|
|
||||||
This should make and install on most modern distributions.
|
This should make and install on most modern distributions.
|
||||||
There are three commands included in smackutil:
|
There are five commands included in smackutil:
|
||||||
|
|
||||||
smackload - properly formats data for writing to /smack/load
|
|
||||||
smackcipso - properly formats data for writing to /smack/cipso
|
|
||||||
chsmack - display or set Smack extended attribute values
|
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
|
In keeping with the intent of Smack, configuration data is
|
||||||
minimal and not strictly required. The most important
|
minimal and not strictly required. The most important
|
||||||
|
@ -47,9 +54,9 @@ of this, but it can be manually as well.
|
||||||
|
|
||||||
Add this line to /etc/fstab:
|
Add this line to /etc/fstab:
|
||||||
|
|
||||||
smackfs /smack smackfs smackfsdef=* 0 0
|
smackfs /sys/fs/smackfs smackfs defaults 0 0
|
||||||
|
|
||||||
and create the /smack directory for mounting.
|
The /sys/fs/smackfs directory is created by the kernel.
|
||||||
|
|
||||||
Smack uses extended attributes (xattrs) to store labels on filesystem
|
Smack uses extended attributes (xattrs) to store labels on filesystem
|
||||||
objects. The attributes are stored in the extended attribute security
|
objects. The attributes are stored in the extended attribute security
|
||||||
|
@ -92,13 +99,13 @@ There are multiple ways to set a Smack label on a file:
|
||||||
# attr -S -s SMACK64 -V "value" path
|
# attr -S -s SMACK64 -V "value" path
|
||||||
# chsmack -a value path
|
# chsmack -a value path
|
||||||
|
|
||||||
A process can see the smack label it is running with by
|
A process can see the Smack label it is running with by
|
||||||
reading /proc/self/attr/current. A process with CAP_MAC_ADMIN
|
reading /proc/self/attr/current. A process with CAP_MAC_ADMIN
|
||||||
can set the process smack by writing there.
|
can set the process Smack by writing there.
|
||||||
|
|
||||||
Most Smack configuration is accomplished by writing to files
|
Most Smack configuration is accomplished by writing to files
|
||||||
in the smackfs filesystem. This pseudo-filesystem is usually
|
in the smackfs filesystem. This pseudo-filesystem is mounted
|
||||||
mounted on /smack.
|
on /sys/fs/smackfs.
|
||||||
|
|
||||||
access
|
access
|
||||||
This interface reports whether a subject with the specified
|
This interface reports whether a subject with the specified
|
||||||
|
@ -206,23 +213,30 @@ onlycap
|
||||||
file or cleared by writing "-" to the file.
|
file or cleared by writing "-" to the file.
|
||||||
ptrace
|
ptrace
|
||||||
This is used to define the current ptrace policy
|
This is used to define the current ptrace policy
|
||||||
0 - default: this is the policy that relies on smack access rules.
|
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
|
For the PTRACE_READ a subject needs to have a read access on
|
||||||
object. For the PTRACE_ATTACH a read-write access is required.
|
object. For the PTRACE_ATTACH a read-write access is required.
|
||||||
1 - exact: this is the policy that limits PTRACE_ATTACH. Attach is
|
1 - exact: this is the policy that limits PTRACE_ATTACH. Attach is
|
||||||
only allowed when subject's and object's labels are equal.
|
only allowed when subject's and object's labels are equal.
|
||||||
PTRACE_READ is not affected. Can be overriden with CAP_SYS_PTRACE.
|
PTRACE_READ is not affected. Can be overridden with CAP_SYS_PTRACE.
|
||||||
2 - draconian: this policy behaves like the 'exact' above with an
|
2 - draconian: this policy behaves like the 'exact' above with an
|
||||||
exception that it can't be overriden with CAP_SYS_PTRACE.
|
exception that it can't be overridden with CAP_SYS_PTRACE.
|
||||||
revoke-subject
|
revoke-subject
|
||||||
Writing a Smack label here sets the access to '-' for all access
|
Writing a Smack label here sets the access to '-' for all access
|
||||||
rules with that subject label.
|
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.
|
||||||
|
|
||||||
You can add access rules in /etc/smack/accesses. They take the form:
|
You can add access rules in /etc/smack/accesses. They take the form:
|
||||||
|
|
||||||
subjectlabel objectlabel access
|
subjectlabel objectlabel access
|
||||||
|
|
||||||
access is a combination of the letters rwxa which specify the
|
access is a combination of the letters rwxatb which specify the
|
||||||
kind of access permitted a subject with subjectlabel on an
|
kind of access permitted a subject with subjectlabel on an
|
||||||
object with objectlabel. If there is no rule no access is allowed.
|
object with objectlabel. If there is no rule no access is allowed.
|
||||||
|
|
||||||
|
@ -318,8 +332,9 @@ each of the subject and the object.
|
||||||
|
|
||||||
Labels
|
Labels
|
||||||
|
|
||||||
Smack labels are ASCII character strings, one to twenty-three characters in
|
Smack labels are ASCII character strings. They can be up to 255 characters
|
||||||
length. Single character labels using special characters, that being anything
|
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
|
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
|
team. Smack labels are unstructured, case sensitive, and the only operation
|
||||||
ever performed on them is comparison for equality. Smack labels cannot
|
ever performed on them is comparison for equality. Smack labels cannot
|
||||||
|
@ -335,10 +350,9 @@ There are some predefined labels:
|
||||||
? Pronounced "huh", a single question mark character.
|
? Pronounced "huh", a single question mark character.
|
||||||
@ Pronounced "web", a single at sign character.
|
@ Pronounced "web", a single at sign character.
|
||||||
|
|
||||||
Every task on a Smack system is assigned a label. System tasks, such as
|
Every task on a Smack system is assigned a label. The Smack label
|
||||||
init(8) and systems daemons, are run with the floor ("_") label. User tasks
|
of a process will usually be assigned by the system initialization
|
||||||
are assigned labels according to the specification found in the
|
mechanism.
|
||||||
/etc/smack/user configuration file.
|
|
||||||
|
|
||||||
Access Rules
|
Access Rules
|
||||||
|
|
||||||
|
@ -393,6 +407,7 @@ describe access modes:
|
||||||
w: indicates that write access should be granted.
|
w: indicates that write access should be granted.
|
||||||
x: indicates that execute access should be granted.
|
x: indicates that execute access should be granted.
|
||||||
t: indicates that the rule requests transmutation.
|
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.
|
Uppercase values for the specification letters are allowed as well.
|
||||||
Access mode specifications can be in any order. Examples of acceptable rules
|
Access mode specifications can be in any order. Examples of acceptable rules
|
||||||
|
@ -402,6 +417,7 @@ are:
|
||||||
Secret Unclass R
|
Secret Unclass R
|
||||||
Manager Game x
|
Manager Game x
|
||||||
User HR w
|
User HR w
|
||||||
|
Snap Crackle rwxatb
|
||||||
New Old rRrRr
|
New Old rRrRr
|
||||||
Closed Off -
|
Closed Off -
|
||||||
|
|
||||||
|
@ -413,7 +429,7 @@ Examples of unacceptable rules are:
|
||||||
|
|
||||||
Spaces are not allowed in labels. Since a subject always has access to files
|
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
|
with the same label specifying a rule for that case is pointless. Only
|
||||||
valid letters (rwxatRWXAT) and the dash ('-') character are allowed in
|
valid letters (rwxatbRWXATB) and the dash ('-') character are allowed in
|
||||||
access specifications. The dash is a placeholder, so "a-r" is the same
|
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.
|
as "ar". A lone dash is used to specify that no access should be allowed.
|
||||||
|
|
||||||
|
@ -462,16 +478,11 @@ receiver. The receiver is not required to have read access to the sender.
|
||||||
Setting Access Rules
|
Setting Access Rules
|
||||||
|
|
||||||
The configuration file /etc/smack/accesses contains the rules to be set at
|
The configuration file /etc/smack/accesses contains the rules to be set at
|
||||||
system startup. The contents are written to the special file /smack/load.
|
system startup. The contents are written to the special file
|
||||||
Rules can be written to /smack/load at any time and take effect immediately.
|
/sys/fs/smackfs/load2. Rules can be added at any time and take effect
|
||||||
For any pair of subject and object labels there can be only one rule, with the
|
immediately. For any pair of subject and object labels there can be only
|
||||||
most recently specified overriding any earlier specification.
|
one rule, with the most recently specified overriding any earlier
|
||||||
|
specification.
|
||||||
The program smackload is provided to ensure data is formatted
|
|
||||||
properly when written to /smack/load. This program reads lines
|
|
||||||
of the form
|
|
||||||
|
|
||||||
subjectlabel objectlabel mode.
|
|
||||||
|
|
||||||
Task Attribute
|
Task Attribute
|
||||||
|
|
||||||
|
@ -488,7 +499,10 @@ only be changed by a process with privilege.
|
||||||
|
|
||||||
Privilege
|
Privilege
|
||||||
|
|
||||||
A process with CAP_MAC_OVERRIDE is privileged.
|
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
|
Smack Networking
|
||||||
|
|
||||||
|
@ -510,14 +524,14 @@ intervention. Unlabeled packets that come into the system will be given the
|
||||||
ambient label.
|
ambient label.
|
||||||
|
|
||||||
Smack requires configuration in the case where packets from a system that is
|
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
|
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.
|
Solaris system, but there are other, less widely deployed systems out there.
|
||||||
CIPSO provides 3 important values, a Domain Of Interpretation (DOI), a level,
|
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
|
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
|
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
|
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 /smack/doi and
|
discarded. The DOI is 3 by default. The value can be read from
|
||||||
can be changed by writing to /smack/doi.
|
/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
|
The label and category set are mapped to a Smack label as defined in
|
||||||
/etc/smack/cipso.
|
/etc/smack/cipso.
|
||||||
|
@ -539,15 +553,13 @@ The ":" and "," characters are permitted in a Smack label but have no special
|
||||||
meaning.
|
meaning.
|
||||||
|
|
||||||
The mapping of Smack labels to CIPSO values is defined by writing to
|
The mapping of Smack labels to CIPSO values is defined by writing to
|
||||||
/smack/cipso. Again, the format of data written to this special file
|
/sys/fs/smackfs/cipso2.
|
||||||
is highly restrictive, so the program smackcipso is provided to
|
|
||||||
ensure the writes are done properly. This program takes mappings
|
|
||||||
on the standard input and sends them to /smack/cipso properly.
|
|
||||||
|
|
||||||
In addition to explicit mappings Smack supports direct CIPSO mappings. One
|
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
|
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
|
in fact an encoding of the Smack label. The level used is 250 by default. The
|
||||||
value can be read from /smack/direct and changed by writing to /smack/direct.
|
value can be read from /sys/fs/smackfs/direct and changed by writing to
|
||||||
|
/sys/fs/smackfs/direct.
|
||||||
|
|
||||||
Socket Attributes
|
Socket Attributes
|
||||||
|
|
||||||
|
@ -565,8 +577,8 @@ sockets.
|
||||||
Smack Netlabel Exceptions
|
Smack Netlabel Exceptions
|
||||||
|
|
||||||
You will often find that your labeled application has to talk to the outside,
|
You will often find that your labeled application has to talk to the outside,
|
||||||
unlabeled world. To do this there's a special file /smack/netlabel where you can
|
unlabeled world. To do this there's a special file /sys/fs/smackfs/netlabel
|
||||||
add some exceptions in the form of :
|
where you can add some exceptions in the form of :
|
||||||
@IP1 LABEL1 or
|
@IP1 LABEL1 or
|
||||||
@IP2/MASK LABEL2
|
@IP2/MASK LABEL2
|
||||||
|
|
||||||
|
@ -574,22 +586,22 @@ 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
|
write access on LABEL1, and access to the subnet @IP2/MASK if it has write
|
||||||
access on LABEL2.
|
access on LABEL2.
|
||||||
|
|
||||||
Entries in the /smack/netlabel file are matched by longest mask first, like in
|
Entries in the /sys/fs/smackfs/netlabel file are matched by longest mask
|
||||||
classless IPv4 routing.
|
first, like in classless IPv4 routing.
|
||||||
|
|
||||||
A special label '@' and an option '-CIPSO' can be used there :
|
A special label '@' and an option '-CIPSO' can be used there :
|
||||||
@ means Internet, any application with any label has access to it
|
@ means Internet, any application with any label has access to it
|
||||||
-CIPSO means standard CIPSO networking
|
-CIPSO means standard CIPSO networking
|
||||||
|
|
||||||
If you don't know what CIPSO is and don't plan to use it, you can just do :
|
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 > /smack/netlabel
|
echo 127.0.0.1 -CIPSO > /sys/fs/smackfs/netlabel
|
||||||
echo 0.0.0.0/0 @ > /smack/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
|
If you use CIPSO on your 192.168.0.0/16 local network and need also unlabeled
|
||||||
Internet access, you can have :
|
Internet access, you can have :
|
||||||
echo 127.0.0.1 -CIPSO > /smack/netlabel
|
echo 127.0.0.1 -CIPSO > /sys/fs/smackfs/netlabel
|
||||||
echo 192.168.0.0/16 -CIPSO > /smack/netlabel
|
echo 192.168.0.0/16 -CIPSO > /sys/fs/smackfs/netlabel
|
||||||
echo 0.0.0.0/0 @ > /smack/netlabel
|
echo 0.0.0.0/0 @ > /sys/fs/smackfs/netlabel
|
||||||
|
|
||||||
|
|
||||||
Writing Applications for Smack
|
Writing Applications for Smack
|
||||||
|
@ -676,7 +688,7 @@ Smack auditing
|
||||||
If you want Smack auditing of security events, you need to set CONFIG_AUDIT
|
If you want Smack auditing of security events, you need to set CONFIG_AUDIT
|
||||||
in your kernel configuration.
|
in your kernel configuration.
|
||||||
By default, all denied events will be audited. You can change this behavior by
|
By default, all denied events will be audited. You can change this behavior by
|
||||||
writing a single character to the /smack/logging file :
|
writing a single character to the /sys/fs/smackfs/logging file :
|
||||||
0 : no logging
|
0 : no logging
|
||||||
1 : log denied (default)
|
1 : log denied (default)
|
||||||
2 : log accepted
|
2 : log accepted
|
||||||
|
@ -686,3 +698,20 @@ 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
|
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
|
that triggered the event, plus other pairs depending on the type of event
|
||||||
audited.
|
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.
|
||||||
|
|
Loading…
Add table
Reference in a new issue