I run fedora and on *many* message boards I see the first trouble shooting
idea is to turn off SELinux. What most people forget is that you can set SELinux
to be permissive, so it is still turned on, and it lets you know when applications
would be doing something that would be prevented. I think changing to permissive
mode SELinux is more useful than turning it off as it lets you know what applications
are misbehaving. I think part of this problem is that previously there has been
no easy way to look as SELinux messages and manage the policies.
The main disadvantage of AppArmor is that it relies on file paths, not the inodes.
All you need to do is be able to create a hard link in the right directory to
get around it.
===
Permissive mode is only useful for policy development.
I wholeheartedly agree.
Step 1: Install RHEL, disable SELinux
Step 2: Install and configure your stack (apache, jboss, tomcat, mysql, whatever)
Step 3: Enable permissive mode, light up the stack, watch logs
Step 4: Tweak the rules, repeat step 3 until the logs are clean.
Step 5: Enable Enforcing Mode
You can now rest a little bit easier knowing that you have SELinux enabled.
The only drawback is that you sometimes have to repeat the process as new versions
of your stack are released (mysql, jboss). It's basically a monthly process.
==
100% agree that there is no such thing as 100% protection. I think both SELinux
and AppArmor are great things (I did my
MS thesis
(woefully out of date) [cmu.edu] on Domain & Type enforcement which is one
of the major systems (along with RBAC & Bell-Lepadula/Biba) in Mandatory Access
Control (MAC). The SELinux approach is (usually) a more 'pure' variety in that
it encompasses the entire system, all of the namespaces in the system in one
setup. When I say 'namespace' think of that scene in the Matrix when Neo can't
open his mouth to make a phone call..... Tell me Mr. HAcker, how are you
going to steal my passwords when you can't even name the
/etc/shadow file? SELinux will allow policies where even the root
user (under certain contexts) cannot screw with the system. This can make administration
harder like in some SELinux setups you literally have to login as root from
the physical console to have full access, su'ing to root or SSHing in as root
will not get the same privileges. In the most extreme cases,
an SELinux policy could literally require you to
reboot the box off of a rescue CD to get full access to certain files.
The controls are extremely fine grained and very powerful, but potentially cumbersome.
AppArmor's main approach is somewhat less broad. It is more like putting
certain applications into a MAC container to limit what an application can do,
no matter who the user using the application is.
A great example of this that most Slashdot readers should look into is putting
the browser into a safety container.
I've been using Linux since right before 2.4 came out, and I can't count
the number of times I've heard 'Linux is more secure because even if your account
gets hacked the system isn't hacked' While there is certainly truth to that
from the perspective of the full system, it fails to mention that the only data
I actually give a rat's ass about is the data in my account, I can always
get the rest of the crap from CD/downloading! AppArmor can help fix this by
saying: Hey Firefox, just because you are running as user CajunArson, you DON'T
get to do everything CajunArson can do, we will only let you operate on some
files, and you can't get full access to his data, you can't fork/exec any ol'
program that CajunArson can, and in general you are limited to doing what you
are supposed to do: Browse the Web.
The underlying concepts are still based on the MAC used by SELinux, but the
implementation, while not as air-tight theoretically, is also easier to adjust.
If there is something I really need firefox to do that the profile will not
allow, AppArmor makes the process of tweaking the security easier than SELinux
in general (although RedHat could be working on better SELinux tools to fix
that).
Sorry for the long post, but remember: the next time someone says Linux is
more secure than Windows, remember that things like SELinux and AppArmor really
are what make it better, not just because it has a mean looking penguin!
===
AppArmor's main approach is somewhat less broad. It is more like putting
certain applications into a MAC container to limit what an application can do,
no matter who the user using the application is. A great example of this that
most Slashdot readers should look into is putting the browser into a safety
container.
Some time ago, I wrote a
review of AppArmor [osreviews.net], finding that it solves problems that
don't exist. Looking at your browser example, the functionality provided by
AppArmor can be implemented completely by setting up a different user and setting
appropriate file ACLs.
For the real problems AppArmor provides little help. Can you confine network
usage of a program, meaning your internal network cannot be accessed once your
browser has been hacked? No. Can you limit the syscalls a program may use, reducing
the risk of successful kernel exploits? No.
As long as it stays this way, I recommend to everyone to use SELinux, even though
it is much more difficult to setup and configure.
===
Good GUIs are a wonderful thing, but I want to emphasize that SELinux isn't
really all that difficult to begin with. High quality SELinux rules shipped
with solid distributions such as RHEL 5 eliminate many of the problems that
early adopters faced; indeed, that's more or less the subject of this article.
Many people (such as myself) consider SELinux much less of a "patch job" than
AppArmor. For instance, with AppArmor security attributes are not stored with
the filesystem inodes, but are specified according to path name. That might
simplify AppArmor's implementation a bit, but consider what happens to the security
policy when you have two different path names hard linked to the same inode...
Those of us who are partial to SELinux's implementation of mandatory access
controls are thrilled to see the strides that Red Hat has made in their latest
enterprise release.
==
The problem in using a selinux system is when most of the software on the
system is custom written or custom configured. Although I believe that the using
the common combinations of web servers and database servers are easy to combine
now, I can easily imagine wanting my web application to do things that are prohibited
by policy. Customizing selinux looks somewhat challenging. If you just run a
standard mail server or something it is probably great.
Everybody says that app-armor sucks with hard links, but I just don't see it.
If your configuration looks like
allow all
deny read,write /root/mysecretfile
then you have a problem with hard links, but it isn't relevant. In that case
you have already decided to try to solve the impossible problem of listing every
important file on the system. Anyone interested in security would write:
deny all
allow read /etc/daemon.conf
allow read,write /var/daemon/data
Then I don't have to attempt to list all the secure files on the system.
All I have to do is decide what I want to grant the daemon access to. If there
is a hard link to /etc/daemon.conf, the program can't read
it and shouldn't be trying to read it anyway.
Storing the labels in the filesystem only works if you are the distribution
maintainer. If all the programs that create a particular kind of file don't
agree on the label, the on-disk labels can get messed up. The simple config
file in app-armor allows easy auditing.
That said, I like the possibility of securing dbus and X with the same framework
as the filesystem. I'm hoping that we will see a document file access daemon
for linux that allows the user to securely load and save files from a sandboxed
firefox or openoffice process. Until selinux gets used for this type of desktop
security instead of just network daemon security, the added power of selinux
is mostly useless.
===
It can save a system from being compromised due to other services which are
either weaker, or poorly configured. Taking some time to get SELinux working
properly in ones production environment (if that system is important) is more
than worth the time it takes to read up on it. Being a lazy sys admin rarely
pays off in the long run.
===
But it all really boils down to your needs.
For example, consider the typical LAMP server (linux + apache + mysql + php)
that hosts a web application. What does it need to protect ? It needs to protect
the database with all the user data, the publicly accessible html documents
and php scripts and possibly the log files.
You may also argue that it needs to protect the overall system from compromises
involving using the system as a zombie or irc server etc. but in that situation
a well managed server could simply have the software reinstalled. If the admins
are competent and have access to spare servers they could configure the replacement
machine and do a swap without incurring any downtime at all.
In this situation SE Linux might just be total overkill. The extra paranoid
could have the publicly accessible html docs + php scripts on a read-only partition.
This is a production environment we're talking about so the need to upload new
documents will only be when upgrading software versions. If the web application
allows users to upload data then that will need to be handled separately. A
cron job could change file permissions on newly updated documents so apache
no longer has write access. The log files can be moved to a separate location
once per day when they're rotated where apache (or any other services) don't
have access to them. MySQL can run chrooted, only bind to 127.0.0.1 and the
database files can only have read/write access from the mysql user. Daily, or
even hourly, backups of the database to read-only media can be implemented.
This is on top of running an intrusion detection system, installing security
updates asap, and doing all of your other post-install locking down before the
network cable is even plugged in to the machine (setting up your ssh keys, firewalls,
uninstalling unnecessary software - including compilers - and obviously unused
daemons and anything else the paranoid admin does before the machine goes live
etc.)
We're already talking about way more security than most LAMP based servers out
there.
I agree that the setup could still benefit from SE Linux, particularly for the
database since it's still the weakest link and one of the areas in the most
need of protection. MySQL needs to read/write to the database on a regular basis
and so you need to allow write access to the data files, trust your software,
trust your mysql binaries (all binary files and static config files can be on
read-only partitions) and nothing is preventing a root process from changing
the file permissions or corrupting the data. However, for most people this setup
would be more than adequate and SE Linux would be total overkill.
==
The short version: it's very good. But a huge pain in the ass.
The slightly longer version: IPtables is about network access, firewalls, et
cetera. SELinux is about ensuring the integrity and access rights of software
on your system. It's designed to prevent, say, one process on your machine from
overwriting a file it should be able to. There's a pretty good explanation of
exactly what it buys you
here [nsa.gov].
(Warning: government site. They're watching youuuuuu!)
The problem with SELinux is that up until recently it has been a royal pain
in the ass to configure. You'd go, "Sure, this sounds like a good idea", turn
it on, and then curse it roundly when you tried updating MySQL from the version
that ships with RHEL to the most recent supported release from MySQL. As a result,
most folks just turned it off - they figured it wasn't worth the hassle.
RHEL 5 apparently includes tools (see the article) for figuring out what's wrong
with your SELinux configuration. Definitely worth looking into. But if you're
not concerned with validating application integrity on your home box... and
let's face it, it's a home box... probably not worth it for you until it becomes
dead simple.
===
Ignoring for now that nowhere in the article does he claim that SELinux provides
or is required for "100% security", there's no such damn thing. Unless you pull
out the power cord, of course.
Yes, we disable SELinux at our shop. As the article mentions, it's a pain
in the ass, and the tools to manage it are not mature enough. If all you have
is RHEL, and you have nothing else to do, you can look at configuring it. If
you have a bunch of corporate mucky-mucks breathing down your neck, and you
have to get the latest version of GnuWhatever compiled for 5 different OSs,
there's no time to deal with this nonsense.
SELinux probably works just great for what it was designed for - NSA top-secret
systems. There's always a tradeoff between security and usability, and right
now, SELinux is just above yanking the power cord.
===
I've never once hit an SE Linux problem when running the stuff shipped with
Fedora Core 6 and Fedora 7.
Stuff can get painful if you go grabbing 3rd-party crap from proprietary developers
without neither a clue nor a care.
Even there though, the popular stuff has already been figured out. For example,
suppose you want acroread or flash or vmware. Use google, and search for the
stuff being spewed into the log. Skip past the idiots who just disable SE Linux;
it may help to add "chcon" (an SE Linux command that fixes many such problems)
to your google query.
Typically you find instructions for some "chcon -t foo_t
/usr/lib/libfoo.so" command, often needed because the app developers
were total idiots who couldn't figure out how to run gcc correctly. Run that
and be happy.
(not that you should trust 3rd-party binaries to be free of malware, but hey
I understand...)
===
SELinux probably works just great for what it was designed for - NSA top-secret
systems. There's always a tradeoff between security and usability
If it's for a webserver/ftpserver/mailserver
with ssh access it's pretty trivial to set up and use. If it's
for something running a commercial *nix app that uses a dozen ports for weird
undocumented stuff plus NFS disk access via amd it then becomes a pain.