[nycbug-talk] 5.4 Jails, nullfs or unionfs?

Isaac Levy ike
Tue Apr 19 02:14:38 EDT 2005


Turning on the -v flag here,

On Apr 19, 2005, at 12:49 AM, Isaac Levy wrote:

> All the filesystem mounts in 5.x are different- I'm not sure what's 
> inside and outside of stable any more, except now fundamental things 
> in 5.x, like devfs and procfs...

Actually, I didn't think it fair of me to just blurt that out without 
more explanation.

On Apr 19, 2005, at 1:04 AM, pete wright wrote:

> I remember these topics coming up, and from what I understood about
> most of the issues people where trying to address devfs seemed to
> handle most of the issues.  Specifically in regards to jailing, one is
> able to create devfs rulesets per jail.
Yes- absolutely- it's really WAY cleaner to work with devices now, 
inside and outside of jails IMHO.

> Thusly an admin is able to
> have some level of controll over what devices are accessable per jail,
> and how they are used.
Yes- as well as processes now too.  This stuff is cleaned up NIIIICE 
for 5.x,


All filesystems, real and abstracted, are heavily rebuilt for FreeBSD 
5.x.  For jailing, this deserves some attention for the record, with 
the jailing threads tonight (George mentioned all the new fabby 
jail-related sysctl variables, and devices play a big role in this for 
jailing):

----------
- devfs

In FreeBSD 4.x, devices are built statically- everything in /dev.  So, 
if one wants to limit access to various devices, one has to simply 
remove/delete them- it's that simple.  This has always had one pain in 
the tail drawback, what if one wants to re-enstate a device for a 
particular reason?  It means that one has to rebuild the devices for 
the jail from the master system, and go about re-deleting the devices 
which one still desires not to give jailed users access to.  Clumsy, 
but functional.

In FreeBSD 5.x devices are mounted using mount_devfs.  This is terrific 
for jailing, insomuch as the start scripts for a given jail can contain 
flags to mount_devfs to hide various devices, and the jail never gets 
them- it's that simple.  This makes reconfiguration of devices 
allocated to a particular jail pretty elegant and flexible.  So there's 
one nice big change which makes things simpler.
Sysctl variables affected:

security.jail.getfsstatroot_only
     This determines weather or not a jailed process can see all
     system mountpoints, a weakness somewhat swept under the rug in 4.x
kern.securelevel
     !Locking down a given jail's securelevel can be used to neatly
     mitigate the risks of memory hog fork-bombs, and other resource 
based attacks.
     In the 4.x era, these risks could really only be well mitigated by 
running an entire box at a
     given securelevel, which is a serious pain in the tail for day to 
day management IMHO.
     This enables a master server, and it's jails, to run at different 
securelevels- making
     things like locking down login.conf as immutable 
(maxproc/memoryuse) simple, and granular.

     I personally feel this is the most signifigant improvement in 
jailing over the 4.x era.


----------

- procfs

In FreeBSD 4.x procfs had some serious issues within jails, but was not 
really necessary for most practical applications, so there wasn't much 
fuss in simply not using it.  Early procfs had a massive hole where 
underprivileged local users could use procfs to gain superuser 
privileges based on insufficient access controll checks in procfs.  
This was fixed (around 2000 I believe, sorted out by 4.4), but procfs 
was slated for a full overhaul- and therefore was a waste of time to 
fix for jailing purposes.  This led to some of the more restricted feel 
of a jail, top needing patching (and breaking the patches every dot 
release of 4.x era, so much so that at the time of this writing, nobody 
is bothering to patch top for 4.10 or 4.11, to my knowledge).
The actual impact of not having procfs became moot in the context of 
*using* various applications, mostly internet applications, from jails- 
it just made for a fairly clumsy feel at times.
(note- this is where the PostgreSQL/jail disfunctional issues come from 
:)
Some folks graciously wrote some fine hacks for managing jails easier, 
jps, jtop, jkill- all perl wrappers which parse the output of their 
regular counterparts.
Also, there were only 3 real ways to control certain aspects of jails, 
and it was limited to all the jails on the system:

jail.set_hostname_allowed
     This lock is sane because a number of external jail mgmt utilities
     in 4.x use the jails hostname to get their job done.
jail.socket_unixiproute_only
     Opening this lets a jail access network protocol
     stacks that have not had jail functionality added to them,
     so one can use more than UNIX domain sockets, ipv4 addresses, and
     routing sockets.  Most internet apps don't call for any more than 
this.
jail.sysvipc_allowed
     This is dirty, and downright insecure- (but lets one
     use PostgreSQL from a 4.x jail, for example)



In FreeBSD 5.x, procfs is an entirely new animal, and thoughtfully 
enhances jail use and management.  The procfs rebuild has let the 
jls(8) and jexec(8) utilities come into being, created for listing and 
executing things in jails, respectively.  Also, killall now has a -j 
flag, to kill an entire jailed process tree cleanly, (retirement for 
jkill, thanks for all the bloodshed!).  It's really the way it ought to 
be now.
This enhances the entire way that one can lock down jails too- using 
the sysctl settings- and basically lets an administrator tweak out all 
the things which were previously almost impossible to enable in jails:

security.jail.allow_raw_sockets
     Want ping or traceroute from jails for some reason?  Have at it!
security.jail.set_hostname_allowed
     This is useful, as a number of utilities (and admins)
     may still use hostnames to manage jails from a master system- but 
jailing
    utilities now seem to be able to mitigate the risks of jails getting 
lost
    in the shuffle, by having more elegant ways to grab the jailed 
process trees.
security.jail.socket_unixiproute_only
     This is identical to the 4.x counterpart, and still leaves things 
like
     access to IPV6 stacks crudely wide open with access to every stack,
     for a practical example.
security.jail.sysvipc_allowed
     Again, this is identical again to the 4.x counterpart- and is a 
good lesson
     that complete backwards-compatibility breeds swiss-cheese insecure 
systems, IMHO.

--
Seems like a lot of jail-specific stuff, but in the end, it really 
isn't.  The defaults are setup to be as restrictive as is sane, (i.e. 
no securelevel choices are made in defaults, etc...) so there are no 
real surprises.

Now, with regard to nullfs and unionfs, I have *no idea* what the state 
of these are for FreeBSD, or for jails- but I'm not personally aware of 
any manditory use cases for these in jails to begin with- though I can 
think of things which would become nicer to manage, (a single update to 
a ports tree for all systems perhaps, or a single user-land image 
template for massively parallel jailed clusters, etc...), but these 
cases, to me, seem to be better suited to chrooted enviornments, 
because of the implied homogeneity- so I'm stumped, (and looking for a 
reason to get exited about nullfs or unionfs!)...

Rocket-
.ike





More information about the talk mailing list