FreeBSD Jails
FreeBSD Jails
boot
rc.d
etc
FreeBSD proc
lib kernel
sbin root
bin
e
use
m
ho
in usr r
sb us
bin loc er
al
jails
in
sb
src ports
bin
BSD UNIX
boot
rc.d
etc
FreeBSD proc
lib kernel
sbin root
bin
e
use
m
ho
in usr r
sb us
bin loc er
al
jails
in
sb
src ports
bin
BSD UNIX
boot
rc.d
etc
FreeBSD proc
lib kernel
sbin root
bin
e
use
m
ho
in usr r
sb us
bin loc er
al
jails
in
sb
src ports
bin
BSD UNIX
de
v
boot
rc.d
etc
FreeBSD proc
lib kernel
sbin root
bin
e
use
m
ho
in usr r
sb us
n
bi loc er
al
in
sb
src ports
n
bi
UNIX
devices
de
v
kernel
userland
1
da
UNIX hd2 da0
ed0
ed1
tmp
em
m
var mnt m
e
km
dev
null
de
v
boot
rc.d
etc
FreeBSD proc
lib kernel
sbin root
bin
e
use
m
ho
in usr r
sb us
n
bi loc er
al
in
sb
src ports
n
bi
UNIX Spiral Galaxy
1
da
ed0
hd2 da0 ed1
tmp
em
m
var mnt em
km
dev
null
de
rc.d boot
v
etc
FreeBSD proc
lib kernel
sbin root
bin
e
use
m
ho
in usr r
sb us
n
bi loc er
al
in
sb
src ports
n
bi
devices
de
v
kernel
userland
de
v
boot
rc.d
etc
FreeBSD proc
lib kernel
sbin root
bin
e
use
m
ho
in usr r
sb us
n
bi loc er
al
in
sb
src ports
n
bi
Mandelbrot Fractal - Julia set
1
da
ed0
hd2 da0 ed1
tmp
em
m
var mnt
mem
k
dev
de
v
boot
rc.d
etc
FreeBSD proc
lib kernel
sbin root
bin
e
use
m
in usr ho r
sb us
n
bi loc e r
al
in
sb
src ports
jails
virtual
n
bi
UNIXs
d
ed0
hd 2 d a0 ed1
tmp
em
m
var mnt
mem
k
dev
de
v
boot
rc.d
etc
FreeBSD proc
lib kernel
sbin root
bin
e
use
m
ho
in u sr r
sb us
n
bi loc er
al
in
sb
de
v
boot
rc.d
etc
FreeBSD proc
lib kernel
sbin root
bin
e
use
m
ho
in us r r
sb
n us
bi loc e r
al
in
sb
e
use
m
ho
n usr r
n us
bi loc er
al
in
sb
e
use
m
ho
usr r
us
loc e r
al
e
use
m
ho
us r r
us
er
src ports
us
er
ort s
us
er
ts
us
er
ts
virtual
UNIXs
You get the idea-
development
messes
Mutually Untrusted Users
Mutually Untrusted Users
Mutually Untrusted Users
Mutually Untrusted Users
telnet forever!
Mutually Untrusted Users
login:admin su
pass:love 24/7 ?
Mutually Untrusted Users
Mutually Untrusted Users
Mutually Untrusted Users
You run
*WHAT* as
CGI?
Mutually Untrusted Users
http://mckusick.com/beastie/
maintaining old junk?
Rack full of stuff Example:
3 webservers
1 local-use dns cache
fileserver (for 2 people)
2 dev servers
jail(8)!
Rack full of stuff ,
becomes 1u server!
host:/path/to/jaildir/
ed0
hd2 da0 ed1
tmp
em
m
var mnt em
km
dev
null
de
v
boot
rc.d
etc
/dev/null proc
kernel
user
m
ho
in usr
sb us
bin loca er
l
in
sb
src ports
bin
1
da
ed0
hd2 da0 ed1
tmp
m
me
var mnt em
km
Jail 1 192.168.1.11
dev
de
v
boot
rc.d
etc
FreeBSD proc
lib kernel
sbin root
bin
me
use
ho
n usr r
sbi use
bin loca r
l
in
sb
1
da
ed0
hd2 da0 ed1
tmp
m
me
var mnt em
Jail 2 192.168.1.12
3 webservers
km
dev
de
v
boot
rc.d
etc
FreeBSD proc
lib kernel
sbin root
bin
me
use
ho
n usr r
sbi use
bin loca r
l
in
sb
1
da
ed0
hd2 da0 ed1
tmp
m
me
Jail 3 192.168.1.13
var mnt em
km
dev
de
v
boot
rc.d
etc
FreeBSD proc
lib kernel
use
ho
n usr r
sbi use
bin loca r
l
in
sb
1
da
ed0
hd2 da0 ed1
tmp
Jail 4 192.168.1.14
m
me
var mnt em
km
dev
de
v
boot
rc.d
etc
FreeBSD proc
lib kernel
sbin root
bin
me
use
ho
n usr r
sbi use
bin loca r
l
in
1
da
ed0
hd2 da0 ed1
tmp
m
me
Jail 5 192.168.1.15
var mnt em
km
dev
de
v
boot
rc.d
etc
FreeBSD proc
lib kernel
sbin root
bin
me
use
ho
n usr r
sbi use
bin loca r
l
in
sb
2 dev servers
1
da
ed0
hd2 da0 ed1
tmp
m
me
Jail 6 192.168.1.16
var mnt em
km
dev
de
v
boot
rc.d
etc
FreeBSD proc
lib kernel
sbin root
bin
me
use
ho
n usr r
sbi use
bin loca r
l
in
sb
1
da
ed0
hd2 da0 ed1
tmp
m
me
var mnt em
Jail 7 192.168.1.17
km
dev
de
v
boot
rc.d
etc
FreeBSD proc
lib kernel
sbin root
bin
me
use
ho
n usr r
sbi use
bin loca r
l
in
sb
1 host:/path/to/jaildir/
da
ed0
da0 ed 0
hd2 ed 1 da0
tmp
tmp hd2 ed 1
em
var
m em
mnt em var
m
km mnt em
km
dev
null dev
de
null
de
v
boot
rc.d
v
boot
etc rc.d
FreeBSD proc etc
/dev/null proc
lib kernel kernel
lib
sbin root root
sbin
bin bin
e
use
m
e
use
m
ho
in usr r
ho
sb in usr r
n us sb us
bi loc er
bi
n
loc er
a l a l
in
in
sb
src ports
sb
src ports
n
n
bi
bi
making a jail
Host Machine
preflight (simple)
1. get source to build with (cvsup is great)
e
m
ho
in usr
sb u
i n
b loc
al
in
sb
ja ils s rc p
n
bi
$D
preflight- (build from src)
compile!
preflight- (build from src)
compile!
preflight host:/path/to/jaildir/
lib
ports
preflight host:/path/to/jaildir/
tmp
var mnt
etc
lib
sbin
bin
e
m
ho
in usr
sb
n
bi loc
al
ports
preflight- (mount /dev)
preflight- (mount /dev)
preflight- (null kernel)
preflight- (null kernel)
preflight host:/path/to/jaildir/
tmp
var mnt
etc
lib
sbin
bin
e
m
ho
in usr
sb
n
bi loc
al
ports
preflight host:/path/to/jaildir/
1 ed0
da da0 ed1
tmp
em
m
var mnt m
e
km
dev
null
de
v
etc
lib
sbin
bin
e
m
ho
in usr
sb
n
bi loc
al
preflight Common Question:
Why isnt there an
automated build
system for this stage?
(network, users,
packages, time, etc.)
preflight- (config host)
jailinghost:/etc/rc.conf (stock)
preflight- (config host)
jailinghost:/etc/rc.conf
preflight- (master system)
jailinghost:/etc/ssh/sshd_conf
1
da
ed0
hd2 da0 ed1
tmp
em
m
var mnt m
e
km
dev
de
v
boot
rc.d
etc
lib
sbin
FreeBSD
kernel
proc
root
?
bin
e
use
m
ho
in usr r
sb us
n
bi loc e r
al
in
sb
Text
configure - call jailed sh
(analagous to booting a machine in su mode)
Text
configure - call jailed sh
(analagous to booting a machine in su mode)
Text
configure - call jailed sh
configure the jail, inside the jail
Text
configure - call jailed sh
configure the jail, inside the jail
Text
configure - call jailed sh
sysctl, whee!
Text
configure - call jailed sh
root pw
Text
configure - call jailed sh
root pw
Text
configure - call jailed sh
add users
Text
configure - call jailed sh
add users
Text
configure - call jailed sh
add users
Text
configure - call jailed sh
set timezone
Text
configure - call jailed sh
set timezone
Text
configure - call jailed sh
set timezone
Text
configure - call jailed sh
set timezone
Text
configure - call jailed sh
set timezone
Text
configure - call jailed sh
network options...
Text
configure - call jailed sh
run ssh, important
Text
configure - call jailed sh
check rc.conf in jail
Text
configure - call jailed sh
check rc.conf in jail
Text
configure - call jailed sh
jail-specific stuff (just use common sense)
Text
configure host:/path/to/jaildir/
1 ed0
da da0 ed1
tmp
em
m
var mnt m
e
km
dev
null
de
v
etc
/dev/null
lib kernel
sbin
bin
e
m
ho
in usr
sb
n
bi loc
al
configure host:/path/to/jaildir/
re0 1 ed 0
tmp da da0 ed 1
em
m
var mnt
mem
k
dev
null
de
v
rc.d
etc
/dev/null
lib kernel
sbin root
bin
e
use
m
ho
in usr r
sb us
n
bi loc er
al
in
sb
n
bi
configure - call jailed sh
were finished configuring jailed system!
Text
configure - assign ip alias
(use ifconfig)
Text
configure - assign ip alias
(ip for the jail)
Text
configure - assign ip alias
(original ip for the host machine)
Text
configure - call jailed sh
(analagous to booting a machine in su mode)
Text
configure - call jailed sh
(analagous to booting a machine in su mode)
Text
preflight host:/path/to/jaildir/
re0 1 ed 0
tmp da da0 ed 1
em
m
var mnt
mem
k
dev
null
de
v
rc.d
etc
/dev/null
lib kernel
sbin root
bin
e
use
m
ho
in usr r
sb us
n
bi loc er
al
in
sb
n
bi
preflight host:/path/to/jaildir/
192.168.1.200
1 ed 0
tmp da da0 ed 1
em
m
var mnt
mem
k
re0 dev
null
de
v
rc.d
etc
/dev/null proc
192.168.1.2 lib kernel
sbin root
192.168.1.200
192.168.1.x bin
e
use
m
ho
in usr r
sb us
n
bi loc er
al
in
sb
n
bi
start tangent! (script),
remember how I said rc.d is usually a bad idea?
start!
were gonna start the jail manually here....
start!
were gonna start the jail manually here....
start!
type some random junk to seed entropy,
start!
jail finished starting
running
jls(8) lists running jails, gives a jail ID
using the jail
ssh into the jail, treat it like a server.
using the jail
ssh into the jail, treat it like a server.
using the jail
ssh into the jail, treat it like a server.
inside the jail
just like any new server
inside the jail
just like any new server
inside the jail
just like any new server
inside the jail
you have root!
inside the jail
how do you know you are inside a jail?
1 host:/path/to/jaildir/
da
ed0
d a0 ed 0
hd2 ed1 da0
tmp
tmp hd2 ed 1
em
var
m em
mnt em var
m
km mnt em
km
dev
dev
de
null
de
v
boot
rc.d
v
boot
etc rc.d
FreeBSD proc etc
/dev/null proc
lib kernel kernel
lib
sbin root
sbin root
bin bin
e
use
m
e
use
m
ho
in usr r
ho
sb in usr r
n us sb us
bi loc e r bi
n
loc er
al a l
n
in
i
sb
src ports
sb
jails src ports
n
n
bi
bi
host jail
Process Tree:
JailingServer
\_init
\_daemon/process etc...
\_daemon/process etc...
host \_daemon/process etc...
\_daemon/process etc...
jail
d1 \_jail (Jail 1)
\_daemon/process etc... host:/path/to/jaildir/
em \_daemon/process etc... e d0
m \_daemon/process etc...
tmp hd2 da0 e d1
em
em
m
var mnt em
m \_jail (Jail 2) km
k dev
null
de
\_daemon/process etc...
v
boot
rc.d
etc
/dev/null proc
\_daemon/process etc... lib kernel
root
sbin
\_daemon/process etc... bin
e
use
m
ho
in usr r
sb
\_jail (Jail 3) bi
n
loc
al
us
er
\_daemon/process etc...
in
sb
src ports
n
proc
bi
\_daemon/process etc...
\_daemon/process etc...
root \_jail (Jail 4)
\_daemon/process etc...
\_daemon/process etc...
use \_daemon/process etc...
r
us
er
d1
em
m
mem
k
host:/path/to/jaildir/
e d0
proc tmp hd2 da0 e d1
em
m
var mnt em
km
dev
null
de
root
v
boot
rc.d
etc
/dev/null proc
lib kernel
sbin root
bin
e
use
m
ho
in r
use
usr
sb us
n
bi loc er
r al
host jail
n
i
sb
src ports
n
bi
us
er
d1
em
m
mem
k
host:/path/to/jaildir/
e d0
proc tmp hd2 da0 e d1
em
m
var mnt em
km
dev
null
de
root
v
boot
rc.d
etc
/dev/null proc
lib kernel
sbin root
bin
e
use
m
ho
in r
use
usr
sb us
n
bi loc er
r al
host jail
n
i
sb
src ports
n
bi
us
er
d1
em
m
mem
k
host:/path/to/jaildir/
e d0
proc tmp hd2 da0 e d1
em
m
var mnt em
km
dev
null
de
root
v
boot
rc.d
etc
/dev/null proc
lib kernel
sbin root
bin
e
use
m
ho
in r
use
usr
sb us
n
bi loc er
r al
host jail
n
i
sb
src ports
n
bi
us
er
jail(8) best practices
diagrams from A City is Not A Tree , essay by urban designer Christopher Alexander
and opportunities...
break out of jail?
Poul-Henning Kamp (PHK) wrote the
jail feature for R&D Associates http://
www.rndassociates.com/ who
contributed it to FreeBSD around 1998.
1 host:/path/to/jaildir/
da
ed0
d a0 ed 0
hd2 ed1 da0
tmp
tmp hd2 ed 1
em
var
m em
mnt em var
m
km mnt em
km
dev
dev
de
null
de
v
boot
rc.d
v
boot
etc rc.d
FreeBSD proc etc
/dev/null proc
lib kernel kernel
lib
sbin root
sbin root
bin bin
e
use
m
e
use
m
ho
in usr r
ho
sb in usr r
n us sb us
bi loc e r bi
n
loc er
al a l
n
in
i
sb
src ports
sb
jails src ports
n
n
bi
bi
memory/process attacks
http://www.samag.com/documents/s=1151/sam0105d/0105d.htm
http://www.freebsd.org/doc/en_US.ISO8859-1/books/arch-handbook/jail.html
cc hog.c -o hog
hog 10
# and the hog will do just that- sit and hog 10mb of ram.
# To run a hog stampede, (a fork bomb):
while (1)
hog 99m&
end
memory/process attacks
(check the Defcon 14 CD)
# STEP 1)
# jailed /etc/login.conf file, example of restricted values:
:maxproc=30:\
:memoryuse=25M:\
# STEP 2)
# Set immutable flags on jailed /etc/login.conf, example:
chflags schg $D/etc/login.conf
# STEP 3)
# Set a higher securelevel on a per-jail basis
# (5.x onward, 4.x jailing only securlevels for entire host)
# add the following line to the jailed /etc/sysctl.conf:
kern.securelevel=2
# securelevel 1 is minimum, read the man page for securelevel
honeypot?
compile and give the jail a kernel, fix sysctl:
http://www.freebsd.org/cgi/query-pr.cgi?pr=95977
disk resource control
# later in script,
jail /path/to/jail_userland_mount_dir \
hostname.fqdn.com \
10.0.1.200 \
/bin/sh /etc/rc
</snip>
automation
# Uncomment this to prevent users from seeing information about processes that
# are being run under another UID.
#security.bsd.see_other_uids=0
# define a hostname,
H=fqdn.com
# comment out the following, just to keep syslog quiet for irrelevant items.
# Adjust the time zone if the CMOS clock keeps local time, as opposed to
# UTC time. See adjkerntz(8) for details.
# 1,31 0-5 * * * root adjkerntz -a
future directions...
important fun:
switch1 switch2
switchA switchB
ike is proud to be a part of the New York City *BSD Users Group,
and the Lower East Side Mac Unix Users Group
[email protected]
ike is proud to be a part of the New York City *BSD Users Group,
and the Lower East Side Mac Unix Users Group