AA-EASYPROF(8)
π aa-easyprof(8) β AppArmor manual, bestie! π
Okay so this is the AppArmor manual page for aa-easyprof, section 8, and it is literally your shortcut to profile generation. Let's get into it π
β¨ NAME β¨
aa-easyprof β AppArmor profile generation made easy. No cap.
πΈ SYNOPSIS πΈ
aa-easyprof [option] <path to binary>
π DESCRIPTION π
aa-easyprof gives you a genuinely easy-to-use interface for AppArmor policy generation. It supports templates and policy groups so you can quickly profile an application. Obsessed.
But bestie, real talk: while this tool can help with policy generation, how useful it is depends on the quality of the templates, policy groups, and abstractions you use. Also, this tool may create policy that is less restricted than creating policy by hand or with aa-genprof and aa-logprof. So yeah, vibe check your policy before you ship it π
π OPTIONS π
aa-easyprof accepts the following arguments:
-t TEMPLATE,--template=TEMPLATEβ Specify which template to use. You can specify either a system template from/usr/share/apparmor/easyprof/templatesor a filename for the template to use. If not specified, it uses/usr/share/apparmor/easyprof/templates/default.-p POLICYGROUPS,--policy-groups=POLICYGROUPSβ SpecifyPOLICYas a comma-separated list of policy groups. See--list-templatesfor supported policy groups. The available policy groups are in/usr/share/apparmor/easyprof/policy. Policy groups are simply groupings of AppArmor rules or policies. They are similar to AppArmor abstractions, but usually encompass more policy rules.--parser PATHβ Specify thePATHof theapparmor_parserbinary to use when verifying policy. If this option is not specified,aa-easyprofwill attempt to locate the path starting with/sbin/apparmor_parser.-a ABSTRACTIONS,--abstractions=ABSTRACTIONSβ SpecifyABSTRACTIONSas a comma-separated list of AppArmor abstractions. It is usually recommended you use policy groups instead, but this is provided as a convenience. AppArmor abstractions are located in/etc/apparmor.d/abstractions. Seeapparmor.d(5)for details.-b PATH,--base=PATHβ Set the basePATHfor resolving abstractions specified by--abstractions. See the same option inapparmor_parser(8)for details.-I PATH,--Include=PATHβ AddPATHto the search paths used for resolving abstractions specified by--abstractions. See the same option inapparmor_parser(8)for details.-r PATH,--read-path=PATHβ Specify aPATHto allow owner reads. May be specified multiple times. If thePATHends in a/, thenPATHis treated as a directory and reads are allowed to all files under this directory. Can optionally use/*at the end of thePATHto only allow reads to files directly inPATH.-w PATH,--write-dir=PATHβ Like--read-pathbut also allow owner writes in addition to reads.-n NAME,--name=NAMEβ SpecifyNAMEof policy. If not specified,NAMEis set to the name of the binary. TheNAMEof the policy is typically only used for profile meta data and does not specify the AppArmor profile name.--profile-name=PROFILENAMEβ Specify the AppArmor profile name. When set, uses'profile PROFILENAME'in the profile. When set and specifying a binary, uses'profile PROFILENAME BINARY'in the profile. If not set, the binary will be used as the profile name and profile attachment.--template-var="@{VAR}=VALUE"β SetVARtoVALUEin the resulting policy. This typically only makes sense if the specified template uses this value. May be specified multiple times.--list-templatesβ List available templates.--show-templateβ Display template specified with--template.--templates-dir=PATHβ UsePATHinstead of system templates directory.--include-templates-dir=PATHβ IncludePATHwhen searching for templates in addition to the system templates directory (or the one specified with--templates-dir). System templates will match before those inPATH.--list-policy-groupsβ List available policy groups.--show-policy-groupβ Display policy groups specified with--policy-groups.--policy-groups-dir=PATHβ UsePATHinstead of system policy-groups directory.--include-policy-groups-dir=PATHβ IncludePATHwhen searching for policy groups in addition to the system policy-groups directory (or the one specified with--policy-groups-dir). System policy-groups will match before those inPATH.--policy-version=VERSIONβ Must be used with--policy-vendorand is used to specify the version of policy groups and templates. When specified,aa-easyproflooks for the subdirectoryVENDOR/VERSIONwithin the policy-groups and templates directory. The specified version must be a positive decimal number compatible with the JSON Number type. Eg, when using:
$ aa-easyprof --templates-dir=/usr/share/apparmor/easyprof/templates \
--policy-groups-dir=/usr/share/apparmor/easyprof/policygroups \
--policy-vendor="foo" \
--policy-version=1.0
Then /usr/share/apparmor/easyprof/templates/foo/1.0 will be searched for templates and /usr/share/apparmor/easyprof/policygroups/foo/1.0 for policy groups.
--policy-vendor=VENDORβ Must be used with--policy-versionand is used to specify the vendor for policy groups and templates. See--policy-versionfor more information.--authorβ Specify author of the policy.--copyrightβ Specify copyright of the policy.--commentβ Specify comment for the policy.-m MANIFEST,--manifest=MANIFESTβaa-easyprofalso supports using a JSON manifest file for specifying options related to policy. Unlike command line arguments, the JSON file may specify multiple profiles. The structure of the JSON is:
{
"security": {
"profiles": {
"<profile name 1>": {
... attributes specific to this profile ...
},
"<profile name 2>": {
...
}
}
}
}
Each profile JSON object (ie, everything under a profile name) may specify any fields related to policy. The "security" JSON container object is optional and may be omitted. An example manifest file demonstrating all fields is:
{
"security": {
"profiles": {
"com.example.foo": {
"abstractions": [
"audio",
"gnome"
],
"author": "Your Name",
"binary": "/opt/foo/**",
"comment": "Unstructured single-line comment",
"copyright": "Unstructured single-line copyright statement",
"name": "My Foo App",
"policy_groups": [
"networking",
"user-application"
],
"policy_vendor": "somevendor",
"policy_version": 1.0,
"read_path": [
"/tmp/foo_r",
"/tmp/bar_r/"
],
"template": "user-application",
"template_variables": {
"APPNAME": "foo",
"VAR1": "bar",
"VAR2": "baz"
},
"write_path": [
"/tmp/foo_w",
"/tmp/bar_w/"
]
}
}
}
}
A manifest file does not have to include all the fields. Eg, a manifest file for an Ubuntu SDK application might be:
{
"security": {
"profiles": {
"com.ubuntu.developer.myusername.MyCoolApp": {
"policy_groups": [
"networking",
"online-accounts"
],
"policy_vendor": "ubuntu",
"policy_version": 1.0,
"template": "ubuntu-sdk",
"template_variables": {
"APPNAME": "MyCoolApp",
"APPVERSION": "0.1.2"
}
}
}
}
}
--verify-manifestβ When used with--manifest, warn about potentially unsafe definitions in the manifest file.--output-format=FORMATβ Specify eithertext(default if unspecified) for AppArmor policy output orjsonfor JSON manifest format.--output-directory=DIRβ Specify output directory for profile. If unspecified, policy is sent to stdout.
π¦ EXAMPLES π¦
Example usage for a program named 'foo' which is installed in /opt/foo:
$ aa-easyprof --template=user-application --template-var="@{APPNAME}=foo" \
--policy-groups=opt-application,user-application \
/opt/foo/bin/FooApp
When using a manifest file:
$ aa-easyprof --manifest=manifest.json
To output a manifest file based on aa-easyprof arguments:
$ aa-easyprof --output-format=json \
--author="Your Name" \
--comment="Unstructured single-line comment" \
--copyright="Unstructured single-line copyright statement" \
--name="My Foo App" \
--profile-name="com.example.foo" \
--template="user-application" \
--policy-groups="user-application,networking" \
--abstractions="audio,gnome" \
--read-path="/tmp/foo_r" \
--read-path="/tmp/bar_r/" \
--write-path="/tmp/foo_w" \
--write-path=/tmp/bar_w/ \
--template-var="@{APPNAME}=foo" \
--template-var="@{VAR1}=bar" \
--template-var="@{VAR2}=baz" \
"/opt/foo/**"
π BUGS π
If you find any additional bugs, please report them to GitLab at https://gitlab.com/apparmor/apparmor/-/issues. Do it for the culture π«Ά
π SEE ALSO π
That's the whole page, bestie β AppArmor 4.1.7, dated 2026-05-19, manual page aa-easyprof(8). Now go profile something iconic πβ¨
π¦ where this page comes from
- opensuse-leap 16.0: apparmor-utils 4.1.7-160000.2.1 Β· GPL-2.0-only AND LGPL-2.1-or-later
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms