Contents
You are ready to build Novell AppArmor
profiles after you select the programs to profile. To do so, it is important
to understand the components and syntax of profiles. AppArmor profiles contain
several building blocks that help build simple and reusable profile code:
#include files, abstractions, program chunks, and
capability entries. #include statements are used to pull
in parts of other AppArmor profiles to simplify the structure of new profiles.
Abstractions are #include statements grouped by common
application tasks. Program chunks are chunks of profiles that are specific to
program suites. Capability entries are profile entries for any of the
POSIX.1e Linux capabilities.
For help determining the programs to profile, refer to Section 1.2, “Determining Programs to Immunize”. To start building AppArmor profiles with YaST, proceed to Chapter 3, Building and Managing Profiles with YaST. To build profiles using the AppArmor command line interface, proceed to Chapter 4, Building Profiles from the Command Line.
Novell AppArmor profile components are called Novell AppArmor rules. Currently there are two main types of Novell AppArmor rules, path entries and capability entries. Path entries specify what the process can access in the file system and capability entries provide a more fine-grained control over what a confined process is allowed to do through other system calls that require privileges. Includes are a type of meta rule or directives that pull in path and capability entries from other files.
The easiest way of explaining what a profile consists of and how to create one is to show the details of a sample profile, in this case for a hypothetical application called /usr/bin/foo:
#include <tunables/global># a comment naming the application to confine /usr/bin/foo
{
#include <abstractions/base>
capability setgid
, /bin/mount ux, /dev/{,u}
random r, /etc/ld.so.cache r, /etc/foo.conf r, /etc/foo/* r, /lib/ld-*.so* mr, /lib/lib*.so* mr, /proc/[0-9]** r, /usr/lib/** mr, /tmp/
r, /tmp/foo.pid wr, /tmp/foo.* lrw, /@{HOME}
/.foo_file rw, /@{HOME}/.foo_lock w, # a comment about foo's subprofile, bar. ^bar
{ /lib/ld-*.so* mr, /usr/bin/bar px, /var/spool/* rwl, } }
This loads a file containing variable definitions. | |
The normalized path to the program that is confined. | |
The curly braces ( | |
This directive pulls in components of AppArmor profiles to simplify profiles. | |
Capability entry statements enable each of the 29 POSIX.1e draft capabilities. | |
The curly braces ( | |
A path entry specifying what areas of the file system the program
can access. The first part of a path entry specifies the absolute path of
a file (including regular expression globbing) and the second part
indicates permissible access modes ( | |
This variable expands to a value that can be changed without changing the entire profile. | |
This section references a subprofile of the application, also known as a “hat”. For more details on AppArmor's ChangeHat feature, refer to Chapter 5, Profiling Your Web Applications Using ChangeHat. |
![]() | Using Variables in Profiles |
|---|---|
With the current AppArmor tools, variables as presented in the above example can only be used when manually editing and maintaining a profile. A typical example when variables come in handy are network scenarios
in which user home directories are not mounted in the standard location
| |
When a profile is created for a program, the program can access only the files, modes, and POSIX capabilities specified in the profile. These restrictions are in addition to the native Linux access controls.
Example: .
To gain the capability CAP_CHOWN, the program
must have both access to CAP_CHOWN under
conventional Linux access controls (typically, be a root-owned
process) and have the capability chown in its profile. Similarly, to be
able to write to the file /foo/bar the program must
have both the correct user ID and mode bits set in the files attributes
(see the chmod and chown
man pages) and have /foo/bar w in its profile.
Attempts to violate Novell AppArmor rules are recorded in
/var/log/audit/audit.log if the audit package is installed or otherwise in
/var/log/messages. In many cases, Novell AppArmor rules prevent
an attack from working because necessary files are not accessible and, in
all cases, Novell AppArmor confinement restricts the damage that the attacker can do
to the set of files permitted by Novell AppArmor.