Russel Coker explained how to generate a local policy module from the error log.

Note that this approach (audit2allow) suffers from the same problems that automatic policy learning suffers from (at least when not done very smartly). The generated policy will exactly cover the behaviour you had during logging; functionality that you didn’t use is not covered, but misbehaviour that occured during this time is.

Thats basically why SELinux doesn’t use this autolearning approach considered a “benefit” of AppArmor by some (as you’ve just seen, you can do that with SELinux, too).

So let me show you an alternate way: First of all, install the refpolicy-*-dev (from my experimental repository on alioth) or selinux-policy-refpolicy-dev (unstable) packages.

Next you’ll need an audit error to fix, e.g.:

audit(1173577161.426:3436296): avc:  denied  { search } for  pid=23862 comm="amavisd-new" name="lib" dev=md2 ino=63745 scontext=system_u:system_r:amavis_t tcontext=system_u:object_r:var_lib_t tclass=dir

So that obviously is amavis trying to access /var/lib (you can verify this by checking that ino= is the inode number of this directory). Looking at /var/lib/amavis reveals that these files are labeled amavis_var_lib_t, so the amavis policy is lacking just this simple tweak.

While Russel’s approach would work fine, I’ll try to show how this would be fixed in the actual policy. The approach I use is documented somewhat in the README.Debian at least in my packages.

I’ll create a file named amavisfix.te:

policy_module(amavisfix,1.0.0);
require {
        type amavis_t;
}
files_list_var_lib( amavis_t )

The name “files_list_var_lib” was looked up in the Refpolicy API documentation. Granted, it takes some time to get used to their naming scheme, but it’s actually quite consistent.

Now I run

make -f /usr/share/selinux/refpolicy-strict/include/Makefile

and it creates a compiled module, amavisfix.pp, for me that I can install with “semodule -i amavisfix.pp”. The audit error should now be gone, and amavis should function. I can now file a bug report with upstream that the amavis policy is lacking “files_list_var_lib( amavis_t )” and they’ll be happy to add that. :-)

Note that “files_list_var_lib” has an actual semantic meaning what the process is being granted; audit2allow lines are just technical representations of the access violations seen.

Some of the more advanced SELinux IDEs might be able to suggest you appropriate interfaces by looking at the audit errors; I havn’t tried them yet.