Distro CentOS

From AppArmor
Jump to: navigation, search

Experimental AppArmor on CentOS 5.5, x86_64

Warning! This is an experimental (RC) version of the kernel with experimental AppArmor patch in it, use at your own risk!


Currently we ignore the CentOS-specific instructions, we build a simple vanilla kernel instead.


We need GIT. Either grab it from the RPMForge repository (yum install git) or if that doesn't work, then:

 rpm -i http://dag.linux.iastate.edu/dag/redhat/el5/en/x86_64/rpmforge/RPMS/git-1.7.1-3.el5.rf.x86_64.rpm http://dag.linux.iastate.edu/dag/redhat/el5/en/x86_64/rpmforge/RPMS/perl-Git-1.7.1-3.el5.rf.x86_64.rpm

Now we can check out the kernel:

 mkdir -p ~/apparmor/ && cd ~/apparmor/
 git clone git://git.kernel.org/pub/scm/linux/kernel/git/jj/apparmor-dev.git
 cd apparmor-dev/
 git checkout --track -b AA2.5-2.6.33 origin/AA2.5-2.6.33


 cd ~/apparmor/apparmor-dev/

See if we can reuse the existing kernel configuration (CONFIG_IKCONFIG=y, CONFIG_IKCONFIG_PROC=y):

 cp /proc/config.gz ./ && gzip -d config.gz

Tweak the kernel, enable AppArmor and CONFIG_SYSFS_DEPRECATED_V2:

 yum install ncurses-devel
 make menuconfig

"Security options" ---> "AppArmor support".

Warning! To boot CentOS 5.5 we have to switch on the old init tools support: CONFIG_SYSFS_DEPRECATED_V2=Y.


 cd ~/apparmor/apparmor-dev/
 yum install rpm-build
 make rpm
 rpm -i /usr/src/redhat/RPMS/x86_64/kernel-2.6.33-1.x86_64.rpm
 mkinitrd -f /boot/initrd-2.6.33.img 2.6.33

Try booting the new kernel with kexec:

 yum install kexec-tools
 kexec -l /boot/vmlinuz-2.6.33 --initrd=/boot/initrd-2.6.33.img --append="ro root=LABEL=/ noapic"
 kexec -e

Edit "/boot/grub/grub.conf" and add:

 title AppArmor(2.6.33-1)
   root (hd0,0)
   kernel /vmlinuz-2.6.33 ro root=LABEL=/ noapic
   initrd /initrd-2.6.33.img

If this is your first grub.conf title, it makes sense to add



Reboot under new kernel:

 /sbin/shutdown -r now



Now see if AppArmor is loaded and enabled (should print "Y"):

 cat /sys/module/apparmor/parameters/enabled


For CentOS we will be building the AppArmor tools from source.

Necessary Perl packages

AppArmor tools depend on these additional Perl packages which we will let CentOS to maintain:

 yum install perl-libxml-perl

We also need Term::ReadKey, but it isn't avaliable in the default CentOS install, perhaps you have it from RPMForge or some oether repository:

 yum whatprovides "*/perl(Term::ReadKey)"
 yum whatprovides "*/perl(Locale::gettext)"
 yum whatprovides "*/perl(RPC::XML)"

with RPMForge it is:

 yum install perl-TermReadKey
 yum install perl-Locale-gettext
 yum install perl-RPC-XML

otherwise just grab it from the nearest RedHat repository:

 rpm -i http://dag.linux.iastate.edu/dag/redhat/el5/en/x86_64/rpmforge/RPMS/perl-TermReadKey-2.30-3.el5.rf.x86_64.rpm
 rpm -i http://dag.linux.iastate.edu/dag/redhat/el5/en/x86_64/rpmforge/RPMS/perl-Locale-gettext-1.05-1.el5.rf.x86_64.rpm
 rpm -i http://dag.linux.iastate.edu/dag/redhat/el5/en/x86_64/rpmforge/RPMS/perl-XML-Parser-2.36-1.el5.rf.x86_64.rpm
 rpm -i http://dag.linux.iastate.edu/dag/redhat/el5/en/x86_64/rpmforge/RPMS/perl-RPC-XML-0.71-1.el5.rf.noarch.rpm

Fetch and build

Make sure the necessary build tools and libraries are installed:

 yum install bison gcc-c++ tetex-latex gettext-devel

We need a version of flex with "yypop_buffer_state" (the version from "yum install flex" is too old). Grab the fresh version from http://flex.sourceforge.net/:

 mkdir -p ~/apparmor/ && cd ~/apparmor/
 wget "http://downloads.sourceforge.net/project/flex/flex/flex-2.5.35/flex-2.5.35.tar.bz2"
 tar -xjf flex-2.5.35.tar.bz2
 cd flex-2.5.35/
 ./configure && make && make install && echo okay

Fetch a stable tools build from launchpad

 mkdir -p ~/apparmor/ && cd ~/apparmor/
 wget http://launchpad.net/apparmor/2.5/2.5.1/+download/apparmor-2.5.1.tar.gz
 tar -xzf apparmor-2.5.1.tar.gz

Build parser:

 cd ~/apparmor/apparmor-2.5.1/parser/
 make LEX=/usr/local/bin/flex
 make install

Build apparmor utils:

 cd ~/apparmor/apparmor-2.5.1/utils/
 make && make install && echo okay

Create profiles directory:

 cd ~/apparmor/apparmor-2.5.1/profiles/
 make install


Manual restart:

 /etc/init.d/apparmor restart

Automatic startup:

 cd /etc/init.d/
 chkconfig --add apparmor


The "aa-status" tool now should print a list of known and used profiles, like this:

 apparmor module is loaded.
 25 profiles are loaded.
 25 profiles are in enforce mode.
 0 profiles are in complain mode.
 2 processes have profiles defined.
 0 processes are in enforce mode :
 0 processes are in complain mode.
 2 processes are unconfined but have a profile defined.
    /sbin/klogd (2282)
    /sbin/syslogd (2278)

Tuning logs

Audit data by default is dropped into /var/log/messages via syslogd. That way, the data is severely capped by the kernel in order not to overload the messages log. To make audit data usable with AppArmor we should install auditd and tune it to keep large amounts of data:

 yum install audit
 joe /etc/audit/auditd.conf # num_logs = 2, max_log_file = 200
 /etc/init.d/auditd restart