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 -t procfs proc /data/jail/192.168.11.100/proc 338jail /data/jail/192.168.11.100 testhostname 192.168.11.100 \\ 339 /bin/sh /etc/rc 340.Ed 341.Pp 342A few warnings will be produced, because most 343.Xr sysctl 8 344configuration variables cannot be set from within the jail, as they are 345global across all jails and the host environment. 346However, it should all 347work properly. 348You should be able to see 349.Xr inetd 8 , 350.Xr syslogd 8 , 351and other processes running within the jail using 352.Xr ps 1 , 353with the 354.Ql J 355flag appearing beside jailed processes. 356To see an active list of jails, use the 357.Xr jls 8 358utility. 359You should also be able to 360.Xr telnet 1 361to the hostname or IP address of the jailed environment, and log 362in using the accounts you created previously. 363.Pp 364It is possible to have jails started at boot time. 365Please refer to the 366.Dq jail_* 367variables in 368.Xr rc.conf 5 369for more information. 370The 371.Xr rc 8 372jail script provides a flexible system to start/stop jails: 373.Bd -literal 374/etc/rc.d/jail start 375/etc/rc.d/jail stop 376/etc/rc.d/jail start myjail 377/etc/rc.d/jail stop myjail 378.Ed 379.Ss "Managing the Jail" 380Normal machine shutdown commands, such as 381.Xr halt 8 , 382.Xr reboot 8 , 383and 384.Xr shutdown 8 , 385cannot be used successfully within the jail. 386To kill all processes in a 387jail, you may log into the jail and, as root, use one of the following 388commands, depending on what you want to accomplish: 389.Pp 390.Bd -literal -offset indent 391kill -TERM -1 392kill -KILL -1 393.Ed 394.Pp 395This will send the 396.Dv SIGTERM 397or 398.Dv SIGKILL 399signals to all processes in the jail from within the jail. 400Depending on 401the intended use of the jail, you may also want to run 402.Pa /etc/rc.shutdown 403from within the jail. 404To kill processes from outside the jail, use the 405.Xr jexec 8 406utility in conjunction with the one of the 407.Xr kill 1 408commands above. 409.Pp 410The 411.Pa /proc/ Ns Ar pid Ns Pa /status 412file contains, as its last field, the hostname of the jail in which the 413process runs, or 414.Dq Li - 415to indicate that the process is not running within a jail. 416The 417.Xr ps 1 418command also shows a 419.Ql J 420flag for processes in a jail. 421However, the hostname for a jail may be, by 422default, modified from within the jail, so the 423.Pa /proc 424status entry is unreliable by default. 425To disable the setting of the hostname 426from within a jail, set the 427.Va security.jail.set_hostname_allowed 428sysctl variable in the host environment to 0, which will affect all jails. 429You can have this sysctl set on each boot using 430.Xr sysctl.conf 5 . 431Just add the following line to 432.Pa /etc/sysctl.conf : 433.Pp 434.Dl security.jail.set_hostname_allowed=0 435.Pp 436You can also list/kill processes based on their jail ID. 437To show processes and their jail ID, use the following command: 438.Pp 439.Dl "ps ax -o pid,jid,args" 440.Pp 441To show and then kill processes in jail number 3 use the following commands: 442.Bd -literal -offset indent 443pgrep -lfj 3 444pkill -j 3 445.Ed 446or: 447.Pp 448.Dl "killall -j 3" 449.Ss "Sysctl MIB Entries" 450Certain aspects of the jail containments environment may be modified from 451the host environment using 452.Xr sysctl 8 453MIB variables. 454Currently, these variables affect all jails on the system, although in 455the future this functionality may be finer grained. 456.Bl -tag -width XXX 457.It Va security.jail.allow_raw_sockets 458This MIB entry determines whether or not prison root is allowed to 459create raw sockets. 460Setting this MIB to 1 allows utilities like 461.Xr ping 8 462and 463.Xr traceroute 8 464to operate inside the prison. 465If this MIB 466is set, the source IP addresses are enforced to comply 467with the IP address bound to the jail, regardless of whether or not 468the 469.Dv IP_HDRINCL 470flag has been set on the socket. 471Since raw sockets can be used to configure 472and interact with various network subsystems, extra caution should be used 473where privileged access to jails is given out to untrusted parties. 474As such, 475by default this option is disabled. 476.It Va security.jail.enforce_statfs 477This MIB entry determines which information processes in a jail are 478able to get about mount-points. 479It affects the behaviour of the following syscalls: 480.Xr statfs 2 , 481.Xr fstatfs 2 , 482.Xr getfsstat 2 483and 484.Xr fhstatfs 2 485(as well as similar compatibility syscalls). 486When set to 0, all mount-points are available without any restrictions. 487When set to 1, only mount-points below the jail's chroot directory are 488visible. 489In addition to that, the path to the jail's chroot directory is removed 490from the front of their pathnames. 491When set to 2 (default), above syscalls can operate only on a mount-point 492where the jail's chroot directory is located. 493.It Va security.jail.set_hostname_allowed 494This MIB entry determines whether or not processes within a jail are 495allowed to change their hostname via 496.Xr hostname 1 497or 498.Xr sethostname 3 . 499In the current jail implementation, the ability to set the hostname from 500within the jail can impact management tools relying on the accuracy of jail 501information in 502.Pa /proc . 503As such, this should be disabled in environments where privileged access to 504jails is given out to untrusted parties. 505.It Va security.jail.socket_unixiproute_only 506The jail functionality binds an IPv4 address to each jail, and limits 507access to other network addresses in the IPv4 space that may be available 508in the host environment. 509However, jail is not currently able to limit access to other network 510protocol stacks that have not had jail functionality added to them. 511As such, by default, processes within jails may only access protocols 512in the following domains: 513.Dv PF_LOCAL , PF_INET , 514and 515.Dv PF_ROUTE , 516permitting them access to 517.Ux 518domain sockets, 519IPv4 addresses, and routing sockets. 520To enable access to other domains, this MIB variable may be set to 5210. 522.It Va security.jail.sysvipc_allowed 523This MIB entry determines whether or not processes within a jail have access 524to System V IPC primitives. 525In the current jail implementation, System V primitives share a single 526namespace across the host and jail environments, meaning that processes 527within a jail would be able to communicate with (and potentially interfere 528with) processes outside of the jail, and in other jails. 529As such, this functionality is disabled by default, but can be enabled 530by setting this MIB entry to 1. 531.It Va security.jail.chflags_allowed 532This MIB entry determines how a privileged user inside a jail will be 533treated by 534.Xr chflags 2 . 535If zero, such users are treated as unprivileged, and are unable to set 536or clear system file flags; if non-zero, such users are treated as 537privileged, and may manipulate system file flags subject to the usual 538constraints on 539.Va kern.securelevel . 540.El 541.Pp 542There are currently two MIB related variables that have per-jail settings. 543Changes to these variables by a jailed process do not effect the host 544environment, only the jail environment. 545The variables are 546.Va kern.securelevel 547and 548.Va kern.hostname . 549.Sh SEE ALSO 550.Xr killall 1 , 551.Xr newaliases 1 , 552.Xr pgrep 1 , 553.Xr pkill 1 , 554.Xr ps 1 , 555.Xr chroot 2 , 556.Xr jail 2 , 557.Xr jail_attach 2 , 558.Xr procfs 5 , 559.Xr rc.conf 5 , 560.Xr sysctl.conf 5 , 561.Xr devfs 8 , 562.Xr halt 8 , 563.Xr inetd 8 , 564.Xr jexec 8 , 565.Xr jls 8 , 566.Xr mount_devfs 8 , 567.Xr named 8 , 568.Xr reboot 8 , 569.Xr rpcbind 8 , 570.Xr sendmail 8 , 571.Xr shutdown 8 , 572.Xr sysctl 8 , 573.Xr syslogd 8 574.Sh HISTORY 575The 576.Nm 577utility appeared in 578.Fx 4.0 . 579.Sh AUTHORS 580.An -nosplit 581The jail feature was written by 582.An Poul-Henning Kamp 583for R&D Associates 584.Pa http://www.rndassociates.com/ 585who contributed it to 586.Fx . 587.Pp 588.An Robert Watson 589wrote the extended documentation, found a few bugs, added 590a few new features, and cleaned up the userland jail environment. 591.Sh BUGS 592Jail currently lacks the ability to allow access to 593specific jail information via 594.Xr ps 1 595as opposed to 596.Xr procfs 5 . 597Similarly, it might be a good idea to add an 598address alias flag such that daemons listening on all IPs 599.Pq Dv INADDR_ANY 600will not bind on that address, which would facilitate building a safe 601host environment such that host daemons do not impose on services offered 602from within jails. 603Currently, the simplest answer is to minimize services 604offered on the host, possibly limiting it to services offered from 605.Xr inetd 8 606which is easily configurable. 607