Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 21 Feb 2007 13:14:21 +0300
From:      Stanislav Sedov <stas@FreeBSD.org>
To:        Alexis Susset <admin@munai.com>
Cc:        freebsd-security@freebsd.org
Subject:   Re: Secure shared web hosting using MAC Framework
Message-ID:  <20070221131421.1709206a.stas@FreeBSD.org>
In-Reply-To: <E6A3BDDE-909D-4217-A773-9C8106358CD2@munai.com>
References:  <E6A3BDDE-909D-4217-A773-9C8106358CD2@munai.com>

next in thread | previous in thread | raw e-mail | index | archive | help
--Signature=_Wed__21_Feb_2007_13_14_21_+0300_dCiNF.Yd8.525Egq
Content-Type: text/plain; charset=US-ASCII
Content-Disposition: inline
Content-Transfer-Encoding: 7bit

On Sun, 18 Feb 2007 14:53:58 +0100
Alexis Susset <admin@munai.com> mentioned:

> Hi all,
>
> I am looking at securing a web server using the FreeBSD MAC Framework.
>
> To make things clear I will call the hosted users "web users". Those
> are the issues I am dealing with:
>
> ** Network Security **
> - Web users shouldn't be able to connect to reserved local ports
> apart from 25(smtp); 80(http); 443(https) and 3306(MySQL)
>     Solution:
> 	run the web server and web users shell in a jail, use ipfw to limit
> the jail access to localhost
> 	Those are the rules I have set:
> 		${fwcmd} add 60 pass ip from any to any dst-port 25 jail 1 via lo0
> 		${fwcmd} add 61 pass ip from any to any dst-port 80 jail 1 via lo0
> 		${fwcmd} add 62 pass ip from any to any dst-port 443 jail 1 via lo0
> 		${fwcmd} add 63 pass ip from any to any dst-port 3306 jail 1 via lo0
> 		${fwcmd} add 80 deny ip from any to any jail 1 via lo0
> 	Here, I allow 80 and 443 in case the users want to locally use some
> web APi. MySQL and smtp use are obvious.
>
> - Web users shouldn't be able to open any socket, but, they should
> still be able to connect to the outside
>      This is where I do not have a solution.
> 	I think the use of mac_bsdextended would work here, but there are no
> clear way of doing this.
> 	Anyone has a good configuration in place ?
>

You can use mac_portacl or net.inet.ip.portrange.reserved{high,low} to
deny users from opening listening sockets.

>
> ** Resources Security **
>      Solution:
> 	This is a straight forward one, configure login.conf and the virtual
> hosts with resources limits.
> 	This can be adjusted for specific user who may need more than usual.
>

This isn't so straightforward as you can think. At least you should
ensure all apps correctly initializes pam_session (e.g. suexec doesn't
do that). Same for cron.

>
> ** File System Security **
> - Jail Security
>      Solution:
> 	Build the jail with only required files, this is done via make.conf
> 	Deny access
>

You can probably use read-only nullfs mounts to disallow file
modifications inside jails.

> - Web users and executed web scripts shouldn't be able to read other
> users data
>      Solution:
> 	run suPHP for php scripts as well as suEXEC for cgi-scripts
> 	implement ufs_acl so that the www (Web Server) user can access any
> user directory
> 	Add a ufs_acl to the Web users home directory which says:
> 		read-write-exec only from $owner and www
> 	Those rights should have priority on any traditional unix file
> system rights.

I believe the suphp will be a amazingly slow solution as it executes
php executable on each request, IIRC. Thus, the speed will not be
faster then php in cgi.

Regarding acls - you should also develop some solution, that allows
acls to be inherited, as your users will complain when their newly
created files will be unreadable by web-server (they will not set
acls by hand, as you can see). The better solution will be probably to
allow web-server group to read all files owned by users (via umask)
and than separate users from each other via bsd_extended.

>
> - For the user's own security, prevent them from writing to /tmp
>      Solution:
> 	add a ufs_acl rule to /tmp, this should be read only (for mysql
> socket and other things that might reside here)
>
> - As much as possible, web users should have a limited view of the
> systems
>     Solution:
> 	use the follwing sysctl variable
> 		security.bsd.see_other_uids=0
> 		security.bsd.unprivileged_read_msgbuf=0
> 	Since the web users are in a jail, set restricted devfs ruleset
> (this is easily done via rc.conf)
> 		jail_web_devfs_enable="YES"
> 		jail_web_devfs_ruleset="devfsrules_jail"
>
> - Web users and executed web scripts shouldn't be able to read
> important system files
>      Solution:
> 	use ufs_acl to prevent the users from accessing the following:
> 		/boot /root
> 		/sbin /usr/sbin /usr/local/sbin
> 		/var
> 		/etc/(apart from resolv.conf, group, hosts, pwd.db, nsswitch.conf,
> services, mailer.conf, ssh/ssh_config and mail/)
> 		/usr/local/etc (appart from tools/configs which are normally
> required by the user. eg: nss-ldap)
> 	Those rights should have priority on any traditional unix file
> system rights.
> 	I could make a longer list, this one's just ot get started.
> 	I am sure there's a better way to do that, maybe a MAC ruleset
> already exists for that, has anyone done that already?
>
> - Web users should be able to access their own crontab
>      Solution: use ufs_acl to give rights to the crontab directory
>
> - Web users should be able to send emails
>      Solution: use ufs_acl to give rights to the mail spool
>
> - Web users shouldn't be able to install binaries but still be able
> to install CGi scripts
>      This is where I do not have a solution.
> 	Has anyone implemented such policy?

How will you differ CGI scripts and binaries? Binaries effectively cgi
scripts too.

--
Stanislav Sedov
ST4096-RIPE

--Signature=_Wed__21_Feb_2007_13_14_21_+0300_dCiNF.Yd8.525Egq
Content-Type: application/pgp-signature

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (FreeBSD)

iD8DBQFF3BuBK/VZk+smlYERApWyAJsGKX0Yr8t92Q8yCB2jzXFwlXAeIgCfY09a
eX1JEBkR96JfuQHPguiC1RE=
=zleH
-----END PGP SIGNATURE-----

--Signature=_Wed__21_Feb_2007_13_14_21_+0300_dCiNF.Yd8.525Egq--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20070221131421.1709206a.stas>