1.\" 2.\" Copyright (c) 2000, 2003 Robert N. M. Watson 3.\" All rights reserved. 4.\" 5.\" Redistribution and use in source and binary forms, with or without 6.\" modification, are permitted provided that the following conditions 7.\" are met: 8.\" 1. Redistributions of source code must retain the above copyright 9.\" notice, this list of conditions and the following disclaimer. 10.\" 2. Redistributions in binary form must reproduce the above copyright 11.\" notice, this list of conditions and the following disclaimer in the 12.\" documentation and/or other materials provided with the distribution. 13.\" 14.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24.\" SUCH DAMAGE. 25.\" 26.\" 27.\" ---------------------------------------------------------------------------- 28.\" "THE BEER-WARE LICENSE" (Revision 42): 29.\" <phk@FreeBSD.ORG> wrote this file. As long as you retain this notice you 30.\" can do whatever you want with this stuff. If we meet some day, and you think 31.\" this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp 32.\" ---------------------------------------------------------------------------- 33.\" 34.\" $FreeBSD$ 35.\" 36.Dd August 7, 2005 37.Dt JAIL 8 38.Os 39.Sh NAME 40.Nm jail 41.Nd "imprison process and its descendants" 42.Sh SYNOPSIS 43.Nm 44.Op Fl i 45.Op Fl J Ar jid_file 46.Op Fl l u Ar username | Fl U Ar username 47.Ar path hostname ip-number command ... 48.Sh DESCRIPTION 49The 50.Nm 51utility imprisons a process and all future descendants. 52.Pp 53The options are as follows: 54.Bl -tag -width ".Fl u Ar username" 55.It Fl i 56Output the jail identifier of the newly created jail. 57.It Fl J Ar jid_file 58Write a JidFile, like a PidFile, containing jailid, path, hostname, ip and 59command used to start the jail. 60.It Fl l 61Run program in the clean environment. 62The environment is discarded except for 63.Ev HOME , SHELL , TERM 64and 65.Ev USER . 66.Ev HOME 67and 68.Ev SHELL 69are set to the target login's default values. 70.Ev USER 71is set to the target login. 72.Ev TERM 73is imported from the current environment. 74The environment variables from the login class capability database for the 75target login are also set. 76.It Fl u Ar username 77The user name from host environment as whom the 78.Ar command 79should run. 80.It Fl U Ar username 81The user name from jailed environment as whom the 82.Ar command 83should run. 84.It Ar path 85Directory which is to be the root of the prison. 86.It Ar hostname 87Hostname of the prison. 88.It Ar ip-number 89IP number assigned to the prison. 90.It Ar command 91Pathname of the program which is to be executed. 92.El 93.Pp 94Jails are typically set up using one of two philosophies: either to 95constrain a specific application (possibly running with privilege), or 96to create a 97.Dq "virtual system image" 98running a variety of daemons and services. 99In both cases, a fairly complete file system install of 100.Fx 101is 102required, so as to provide the necessary command line tools, daemons, 103libraries, application configuration files, etc. 104However, for a virtual server configuration, a fair amount of 105additional work is required so as to configure the 106.Dq boot 107process. 108This manual page documents the configuration steps necessary to support 109either of these steps, although the configuration steps may be 110refined based on local requirements. 111.Pp 112Please see the 113.Xr jail 2 114man page for further details. 115.Sh EXAMPLES 116.Ss "Setting up a Jail Directory Tree" 117To set up a jail directory tree containing an entire 118.Fx 119distribution, the following 120.Xr sh 1 121command script can be used: 122.Bd -literal 123D=/here/is/the/jail 124cd /usr/src 125mkdir -p $D 126make world DESTDIR=$D 127make distribution DESTDIR=$D 128mount_devfs devfs $D/dev 129.Ed 130.Pp 131NOTE: It is important that only appropriate device nodes in devfs be 132exposed to a jail; access to disk devices in the jail may permit processes 133in the jail to bypass the jail sandboxing by modifying files outside of 134the jail. 135See 136.Xr devfs 8 137for information on how to use devfs rules to limit access to entries 138in the per-jail devfs. 139.Pp 140In many cases this example would put far more in the jail than needed. 141In the other extreme case a jail might contain only one file: 142the executable to be run in the jail. 143.Pp 144We recommend experimentation and caution that it is a lot easier to 145start with a 146.Dq fat 147jail and remove things until it stops working, 148than it is to start with a 149.Dq thin 150jail and add things until it works. 151.Ss "Setting Up a Jail" 152Do what was described in 153.Sx "Setting Up a Jail Directory Tree" 154to build the jail directory tree. 155For the sake of this example, we will 156assume you built it in 157.Pa /data/jail/192.168.11.100 , 158named for the jailed IP address. 159Substitute below as needed with your 160own directory, IP address, and hostname. 161.Ss "Setting up the Host Environment" 162First, you will want to set up your real system's environment to be 163.Dq jail-friendly . 164For consistency, we will refer to the parent box as the 165.Dq "host environment" , 166and to the jailed virtual machine as the 167.Dq "jail environment" . 168Since jail is implemented using IP aliases, one of the first things to do 169is to disable IP services on the host system that listen on all local 170IP addresses for a service. 171If a network service is present in the host environment that binds all 172available IP addresses rather than specific IP addresses, it may service 173requests sent to jail IP addresses. 174This means changing 175.Xr inetd 8 176to only listen on the 177appropriate IP address, and so forth. 178Add the following to 179.Pa /etc/rc.conf 180in the host environment: 181.Bd -literal -offset indent 182sendmail_enable="NO" 183inetd_flags="-wW -a 192.168.11.23" 184rpcbind_enable="NO" 185.Ed 186.Pp 187.Li 192.168.11.23 188is the native IP address for the host system, in this example. 189Daemons that run out of 190.Xr inetd 8 191can be easily set to use only the specified host IP address. 192Other daemons 193will need to be manually configured\(emfor some this is possible through 194the 195.Xr rc.conf 5 196flags entries; for others it is necessary to modify per-application 197configuration files, or to recompile the applications. 198The following frequently deployed services must have their individual 199configuration files modified to limit the application to listening 200to a specific IP address: 201.Pp 202To configure 203.Xr sshd 8 , 204it is necessary to modify 205.Pa /etc/ssh/sshd_config . 206.Pp 207To configure 208.Xr sendmail 8 , 209it is necessary to modify 210.Pa /etc/mail/sendmail.cf . 211.Pp 212For 213.Xr named 8 , 214it is necessary to modify 215.Pa /etc/namedb/named.conf . 216.Pp 217In addition, a number of services must be recompiled in order to run 218them in the host environment. 219This includes most applications providing services using 220.Xr rpc 3 , 221such as 222.Xr rpcbind 8 , 223.Xr nfsd 8 , 224and 225.Xr mountd 8 . 226In general, applications for which it is not possible to specify which 227IP address to bind should not be run in the host environment unless they 228should also service requests sent to jail IP addresses. 229Attempting to serve 230NFS from the host environment may also cause confusion, and cannot be 231easily reconfigured to use only specific IPs, as some NFS services are 232hosted directly from the kernel. 233Any third-party network software running 234in the host environment should also be checked and configured so that it 235does not bind all IP addresses, which would result in those services' also 236appearing to be offered by the jail environments. 237.Pp 238Once 239these daemons have been disabled or fixed in the host environment, it is 240best to reboot so that all daemons are in a known state, to reduce the 241potential for confusion later (such as finding that when you send mail 242to a jail, and its sendmail is down, the mail is delivered to the host, 243etc.). 244.Ss "Configuring the Jail" 245Start any jail for the first time without configuring the network 246interface so that you can clean it up a little and set up accounts. 247As 248with any machine (virtual or not) you will need to set a root password, time 249zone, etc. 250Some of these steps apply only if you intend to run a full virtual server 251inside the jail; others apply both for constraining a particular application 252or for running a virtual server. 253.Pp 254Start a shell in the jail: 255.Pp 256.Dl "jail /data/jail/192.168.11.100 testhostname 192.168.11.100 /bin/sh" 257.Pp 258Assuming no errors, you will end up with a shell prompt within the jail. 259You can now run 260.Pa /usr/sbin/sysinstall 261and do the post-install configuration to set various configuration options, 262or perform these actions manually by editing 263.Pa /etc/rc.conf , 264etc. 265.Pp 266.Bl -bullet -offset indent -compact 267.It 268Create an empty 269.Pa /etc/fstab 270to quell startup warnings about missing fstab (virtual server only) 271.It 272Disable the port mapper 273.Pa ( /etc/rc.conf : 274.Li rpcbind_enable="NO" ) 275(virtual server only) 276.It 277Configure 278.Pa /etc/resolv.conf 279so that name resolution within the jail will work correctly 280.It 281Run 282.Xr newaliases 1 283to quell 284.Xr sendmail 8 285warnings. 286.It 287Disable interface configuration to quell startup warnings about 288.Xr ifconfig 8 289.Pq Li network_interfaces="" 290(virtual server only) 291.It 292Set a root password, probably different from the real host system 293.It 294Set the timezone 295.It 296Add accounts for users in the jail environment 297.It 298Install any packages the environment requires 299.El 300.Pp 301You may also want to perform any package-specific configuration (web servers, 302SSH servers, etc), patch up 303.Pa /etc/syslog.conf 304so it logs as you would like, etc. 305If you are not using a virtual server, you may wish to modify 306.Xr syslogd 8 307in the host environment to listen on the syslog socket in the jail 308environment; in this example, the syslog socket would be stored in 309.Pa /data/jail/192.168.11.100/var/run/log . 310.Pp 311Exit from the shell, and the jail will be shut down. 312.Ss "Starting the Jail" 313You are now ready to restart the jail and bring up the environment with 314all of its daemons and other programs. 315If you are running a single application in the jail, substitute the 316command used to start the application for 317.Pa /etc/rc 318in the examples below. 319To start a virtual server environment, 320.Pa /etc/rc 321is run to launch various daemons and services. 322To do this, first bring up the 323virtual host interface, and then start the jail's 324.Pa /etc/rc 325script from within the jail. 326.Pp 327NOTE: If you plan to allow untrusted users to have root access inside the 328jail, you may wish to consider setting the 329.Va security.jail.set_hostname_allowed 330sysctl variable to 0. 331Please see the management discussion later in this document as to why this 332may be a good idea. 333If you do decide to set this variable, 334it must be set before starting any jails, and once each boot. 335.Bd -literal -offset indent 336ifconfig ed0 inet alias 192.168.11.100/32 337mount_devfs devfs /data/jail/192.168.11.100/dev 338mount -t procfs proc /data/jail/192.168.11.100/proc 339jail /data/jail/192.168.11.100 testhostname 192.168.11.100 \\ 340 /bin/sh /etc/rc 341.Ed 342.Pp 343A few warnings will be produced, because most 344.Xr sysctl 8 345configuration variables cannot be set from within the jail, as they are 346global across all jails and the host environment. 347However, it should all 348work properly. 349You should be able to see 350.Xr inetd 8 , 351.Xr syslogd 8 , 352and other processes running within the jail using 353.Xr ps 1 , 354with the 355.Ql J 356flag appearing beside jailed processes. 357To see an active list of jails, use the 358.Xr jls 8 359utility. 360You should also be able to 361.Xr telnet 1 362to the hostname or IP address of the jailed environment, and log 363in using the accounts you created previously. 364.Pp 365It is possible to have jails started at boot time. 366Please refer to the 367.Dq jail_* 368variables in 369.Xr rc.conf 5 370for more information. 371The 372.Xr rc 8 373jail script provides a flexible system to start/stop jails: 374.Bd -literal 375/etc/rc.d/jail start 376/etc/rc.d/jail stop 377/etc/rc.d/jail start myjail 378/etc/rc.d/jail stop myjail 379.Ed 380.Ss "Managing the Jail" 381Normal machine shutdown commands, such as 382.Xr halt 8 , 383.Xr reboot 8 , 384and 385.Xr shutdown 8 , 386cannot be used successfully within the jail. 387To kill all processes in a 388jail, you may log into the jail and, as root, use one of the following 389commands, depending on what you want to accomplish: 390.Pp 391.Bd -literal -offset indent 392kill -TERM -1 393kill -KILL -1 394.Ed 395.Pp 396This will send the 397.Dv SIGTERM 398or 399.Dv SIGKILL 400signals to all processes in the jail from within the jail. 401Depending on 402the intended use of the jail, you may also want to run 403.Pa /etc/rc.shutdown 404from within the jail. 405To kill processes from outside the jail, use the 406.Xr jexec 8 407utility in conjunction with the one of the 408.Xr kill 1 409commands above. 410.Pp 411The 412.Pa /proc/ Ns Ar pid Ns Pa /status 413file contains, as its last field, the hostname of the jail in which the 414process runs, or 415.Dq Li - 416to indicate that the process is not running within a jail. 417The 418.Xr ps 1 419command also shows a 420.Ql J 421flag for processes in a jail. 422However, the hostname for a jail may be, by 423default, modified from within the jail, so the 424.Pa /proc 425status entry is unreliable by default. 426To disable the setting of the hostname 427from within a jail, set the 428.Va security.jail.set_hostname_allowed 429sysctl variable in the host environment to 0, which will affect all jails. 430You can have this sysctl set on each boot using 431.Xr sysctl.conf 5 . 432Just add the following line to 433.Pa /etc/sysctl.conf : 434.Pp 435.Dl security.jail.set_hostname_allowed=0 436.Pp 437You can also list/kill processes based on their jail ID. 438To show processes and their jail ID, use the following command: 439.Pp 440.Dl "ps ax -o pid,jid,args" 441.Pp 442To show and then kill processes in jail number 3 use the following commands: 443.Bd -literal -offset indent 444pgrep -lfj 3 445pkill -j 3 446.Ed 447or: 448.Pp 449.Dl "killall -j 3" 450.Ss "Sysctl MIB Entries" 451Certain aspects of the jail containments environment may be modified from 452the host environment using 453.Xr sysctl 8 454MIB variables. 455Currently, these variables affect all jails on the system, although in 456the future this functionality may be finer grained. 457.Bl -tag -width XXX 458.It Va security.jail.allow_raw_sockets 459This MIB entry determines whether or not prison root is allowed to 460create raw sockets. 461Setting this MIB to 1 allows utilities like 462.Xr ping 8 463and 464.Xr traceroute 8 465to operate inside the prison. 466If this MIB 467is set, the source IP addresses are enforced to comply 468with the IP address bound to the jail, regardless of whether or not 469the 470.Dv IP_HDRINCL 471flag has been set on the socket. 472Since raw sockets can be used to configure 473and interact with various network subsystems, extra caution should be used 474where privileged access to jails is given out to untrusted parties. 475As such, 476by default this option is disabled. 477.It Va security.jail.enforce_statfs 478This MIB entry determines which information processes in a jail are 479able to get about mount-points. 480It affects the behaviour of the following syscalls: 481.Xr statfs 2 , 482.Xr fstatfs 2 , 483.Xr getfsstat 2 484and 485.Xr fhstatfs 2 486(as well as similar compatibility syscalls). 487When set to 0, all mount-points are available without any restrictions. 488When set to 1, only mount-points below the jail's chroot directory are 489visible. 490In addition to that, the path to the jail's chroot directory is removed 491from the front of their pathnames. 492When set to 2 (default), above syscalls can operate only on a mount-point 493where the jail's chroot directory is located. 494.It Va security.jail.set_hostname_allowed 495This MIB entry determines whether or not processes within a jail are 496allowed to change their hostname via 497.Xr hostname 1 498or 499.Xr sethostname 3 . 500In the current jail implementation, the ability to set the hostname from 501within the jail can impact management tools relying on the accuracy of jail 502information in 503.Pa /proc . 504As such, this should be disabled in environments where privileged access to 505jails is given out to untrusted parties. 506.It Va security.jail.socket_unixiproute_only 507The jail functionality binds an IPv4 address to each jail, and limits 508access to other network addresses in the IPv4 space that may be available 509in the host environment. 510However, jail is not currently able to limit access to other network 511protocol stacks that have not had jail functionality added to them. 512As such, by default, processes within jails may only access protocols 513in the following domains: 514.Dv PF_LOCAL , PF_INET , 515and 516.Dv PF_ROUTE , 517permitting them access to 518.Ux 519domain sockets, 520IPv4 addresses, and routing sockets. 521To enable access to other domains, this MIB variable may be set to 5220. 523.It Va security.jail.sysvipc_allowed 524This MIB entry determines whether or not processes within a jail have access 525to System V IPC primitives. 526In the current jail implementation, System V primitives share a single 527namespace across the host and jail environments, meaning that processes 528within a jail would be able to communicate with (and potentially interfere 529with) processes outside of the jail, and in other jails. 530As such, this functionality is disabled by default, but can be enabled 531by setting this MIB entry to 1. 532.It Va security.jail.chflags_allowed 533This MIB entry determines how a privileged user inside a jail will be 534treated by 535.Xr chflags 2 . 536If zero, such users are treated as unprivileged, and are unable to set 537or clear system file flags; if non-zero, such users are treated as 538privileged, and may manipulate system file flags subject to the usual 539constraints on 540.Va kern.securelevel . 541.El 542.Pp 543There are currently two MIB related variables that have per-jail settings. 544Changes to these variables by a jailed process do not effect the host 545environment, only the jail environment. 546The variables are 547.Va kern.securelevel 548and 549.Va kern.hostname . 550.Sh SEE ALSO 551.Xr killall 1 , 552.Xr newaliases 1 , 553.Xr pgrep 1 , 554.Xr pkill 1 , 555.Xr ps 1 , 556.Xr chroot 2 , 557.Xr jail 2 , 558.Xr jail_attach 2 , 559.Xr procfs 5 , 560.Xr rc.conf 5 , 561.Xr sysctl.conf 5 , 562.Xr devfs 8 , 563.Xr halt 8 , 564.Xr inetd 8 , 565.Xr jexec 8 , 566.Xr jls 8 , 567.Xr mount_devfs 8 , 568.Xr named 8 , 569.Xr reboot 8 , 570.Xr rpcbind 8 , 571.Xr sendmail 8 , 572.Xr shutdown 8 , 573.Xr sysctl 8 , 574.Xr syslogd 8 575.Sh HISTORY 576The 577.Nm 578utility appeared in 579.Fx 4.0 . 580.Sh AUTHORS 581.An -nosplit 582The jail feature was written by 583.An Poul-Henning Kamp 584for R&D Associates 585.Pa http://www.rndassociates.com/ 586who contributed it to 587.Fx . 588.Pp 589.An Robert Watson 590wrote the extended documentation, found a few bugs, added 591a few new features, and cleaned up the userland jail environment. 592.Sh BUGS 593Jail currently lacks the ability to allow access to 594specific jail information via 595.Xr ps 1 596as opposed to 597.Xr procfs 5 . 598Similarly, it might be a good idea to add an 599address alias flag such that daemons listening on all IPs 600.Pq Dv INADDR_ANY 601will not bind on that address, which would facilitate building a safe 602host environment such that host daemons do not impose on services offered 603from within jails. 604Currently, the simplest answer is to minimize services 605offered on the host, possibly limiting it to services offered from 606.Xr inetd 8 607which is easily configurable. 608