diff options
author | Todd C. Miller <millert@cvs.openbsd.org> | 2012-08-17 20:57:46 +0000 |
---|---|---|
committer | Todd C. Miller <millert@cvs.openbsd.org> | 2012-08-17 20:57:46 +0000 |
commit | 42ff0ab11058b614a449a10edb99646735ff1973 (patch) | |
tree | ba2c94be4f5cf4d71236373ea85c1f2e37ad918f | |
parent | c3601d5861a5e8e211a96d2fd1b12be9d55fcbe7 (diff) |
Native mdoc versions of the sudo manuals, back-ported from sudo trunk.
-rw-r--r-- | usr.bin/sudo/sudo.mdoc.in | 1506 | ||||
-rw-r--r-- | usr.bin/sudo/sudo.pod | 660 | ||||
-rw-r--r-- | usr.bin/sudo/sudo/Makefile | 21 | ||||
-rw-r--r-- | usr.bin/sudo/sudoers.ldap.mdoc.in | 809 | ||||
-rw-r--r-- | usr.bin/sudo/sudoers.ldap.pod | 730 | ||||
-rw-r--r-- | usr.bin/sudo/sudoers.mdoc.in | 2772 | ||||
-rw-r--r-- | usr.bin/sudo/sudoers.pod | 1586 | ||||
-rw-r--r-- | usr.bin/sudo/varsub | 4 | ||||
-rw-r--r-- | usr.bin/sudo/visudo.mdoc.in | 310 | ||||
-rw-r--r-- | usr.bin/sudo/visudo.pod | 207 | ||||
-rw-r--r-- | usr.bin/sudo/visudo/Makefile | 12 |
11 files changed, 5409 insertions, 3208 deletions
diff --git a/usr.bin/sudo/sudo.mdoc.in b/usr.bin/sudo/sudo.mdoc.in new file mode 100644 index 00000000000..86f185ae70c --- /dev/null +++ b/usr.bin/sudo/sudo.mdoc.in @@ -0,0 +1,1506 @@ +.\" +.\" Copyright (c) 1994-1996, 1998-2005, 2007-2012 +.\" Todd C. Miller <Todd.Miller@courtesan.com> +.\" +.\" Permission to use, copy, modify, and distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.\" Sponsored in part by the Defense Advanced Research Projects +.\" Agency (DARPA) and Air Force Research Laboratory, Air Force +.\" Materiel Command, USAF, under agreement number F39502-99-1-0512. +.\" +.Dd $Mdocdate: August 17 2012 $ +.Dt SUDO @mansectsu@ +.Os +.Sh NAME +.Nm sudo , +.Nm sudoedit +.Nd execute a command as another user +.Sh SYNOPSIS +.Nm sudo +.Fl h No | Fl K No | Fl k No | Fl L No | Fl V +.Nm sudo +.Fl v +.Op Fl AknS +.Bk -words +.Op Fl a Ar auth_type +.Ek +.Bk -words +.Op Fl g Ar group name No | Ar #gid +.Ek +.Bk -words +.Op Fl p Ar prompt +.Ek +.Bk -words +.Op Fl u Ar user name No | Ar #uid +.Ek +.Nm sudo +.Fl l Ns Op Ar l +.Op Fl AknS +.Bk -words +.Op Fl a Ar auth_type +.Ek +.Bk -words +.Op Fl g Ar group name No | Ar #gid +.Ek +.Bk -words +.Op Fl p Ar prompt +.Ek +.Bk -words +.Op Fl U Ar user name +.Ek +.Bk -words +.Op Fl u Ar user name No | Ar #uid +.Ek +.Op Ar command +.Nm sudo +.Op Fl AbEHnPS +.Bk -words +.Op Fl a Ar auth_type +.Ek +.Bk -words +.Op Fl C Ar fd +.Ek +.Bk -words +.Op Fl c Ar class No | Ar - +.Ek +.Bk -words +.Op Fl g Ar group name No | Ar #gid +.Ek +.Bk -words +.Op Fl p Ar prompt +.Ek +.Bk -words +.Op Fl u Ar user name No | Ar #uid +.Ek +.Bk -words +.Op Sy VAR Ns = Ns Ar value +.Ek +.Bk -words +.Fl i No | Fl s +.Ek +.Op Ar command +.Nm sudoedit +.Op Fl AnS +.Bk -words +.Op Fl a Ar auth_type +.Ek +.Bk -words +.Op Fl C Ar fd +.Ek +.Bk -words +.Op Fl c Ar class No | Ar - +.Ek +.Bk -words +.Op Fl g Ar group name No | Ar #gid +.Ek +.Bk -words +.Op Fl p Ar prompt +.Ek +.Bk -words +.Op Fl u Ar user name No | Ar #uid +.Ek +.Bk -words +file ... +.Ek +.Sh DESCRIPTION +.Nm sudo +allows a permitted user to execute a +.Ar command +as the superuser or another user, as specified by the +.Em sudoers +file. +The real and effective uid and gid are set to match those of the +target user, as specified in the password database, and the group +vector is initialized based on the group database (unless the +.Fl P +option was specified). +See the +.Sx Command Environment +section below for more details. +.Pp +.Nm sudo +determines who is an authorized user by consulting the file +.Pa @sysconfdir@/sudoers . +By running +.Nm sudo +with the +.Fl v +option, a user can update the time stamp without running a +.Ar command . +If authentication is required, +.Nm sudo +will exit if the user's password is not entered within a configurable +time limit. +The default password prompt timeout is +.Li @password_timeout@ +minutes. +.Pp +When invoked as +.Nm sudoedit , +the +.Fl e +option (described below), is implied. +.Pp +The options are as follows: +.Bl -tag -width Fl +.It Fl A +Normally, if +.Nm sudo +requires a password, it will read it from the user's terminal. +If the +.Fl A No ( Em askpass Ns No ) +option is specified, a (possibly graphical) helper program is +executed to read the user's password and output the password to the +standard output. +If the +.Ev SUDO_ASKPASS +environment variable is set, it specifies the path to the helper +program. +Otherwise, the value specified by the +.Em askpass +option in +.Xr sudoers @mansectform@ +is used. +If no askpass program is available, +.Nm sudo +will exit with an error. +.It Fl a Ar type +The +.Fl a No ( Em "authentication type" Ns No ) +option causes +.Nm sudo +to use the specified authentication type when validating the user, +as allowed by +.Pa /etc/login.conf . +The system administrator may specify a list of sudo-specific +authentication methods by adding an +.Dq auth-sudo +entry in +.Pa /etc/login.conf . +This option is only available on systems that support BSD authentication. +.It Fl b +The +.Fl b No ( Em background Ns No ) +option tells +.Nm sudo +to run the given command in the background. +Note that if you use the +.Fl b +option you cannot use shell job control to manipulate the process. +Most interactive commands will fail to work properly in background +mode. +.It Fl C Ar fd +Normally, +.Nm sudo +will close all open file descriptors other than standard input, +standard output and standard error. +The +.Fl C No ( Em close from Ns No ) +option allows the user to specify a starting point above the standard +error (file descriptor three). +Values less than three are not permitted. +This option is only available when the administrator has enabled the +.Em closefrom_override +option in +.Xr sudoers @mansectform@ . +.It Fl c Ar class +The +.Fl c No ( Em class Ns No ) +option causes +.Nm sudo +to run the specified command with resources limited by the specified +login class. +The +.Em class +argument can be either a class name as defined in +.Pa /etc/login.conf , +or a single +.Ql \- +character. +Specifying a +.Ar class +of +.Li - +indicates that the command should be run restricted by the default +login capabilities for the user the command is run as. +If the +.Ar class +argument specifies an existing user class, the command must be run +as root, or the +.Nm sudo +command must be run from a shell that is already root. +This option is only available on systems with BSD login classes. +.It Fl E +The +.Fl E No ( Em preserve environment Ns No ) +option will override the +.Em env_reset +option in +.Xr sudoers @mansectform@ . +It is only available when either the matching command has the +.Li SETENV +tag or the +.Em setenv +option is set in +.Xr sudoers @mansectform@ . +.Nm sudo +will return an error if the +.Fl E +option is specified and the user does not have permission to preserve +the environment. +.It Fl e +The +.Fl e No ( Em edit Ns No ) +option indicates that, instead of running a command, the user wishes +to edit one or more files. +In lieu of a command, the string "sudoedit" is used when consulting the +.Em sudoers +file. +If the user is authorized by +.Em sudoers , +the following steps are taken: +.Bl -enum -offset 4 +.It +Temporary copies are made of the files to be edited with the owner +set to the invoking user. +.It +The editor specified by the +.Ev SUDO_EDITOR , +.Ev VISUAL +or +.Ev EDITOR +environment variables (in that order) is run to edit the temporary files. +If none of +.Ev SUDO_EDITOR , +.Ev VISUAL +or +.Ev EDITOR +are set, the first program listed in the +.Em editor +.Xr sudoers @mansectform@ +option is used. +.It +If they have been modified, the temporary files are copied back to +their original location and the temporary versions are removed. +.El +.Pp +If the specified file does not exist, it will be created. +Note that unlike most commands run by +.Em sudo , +the editor is run with the invoking user's environment unmodified. +If, for some reason, +.Nm sudo +is unable to update a file with its edited version, the user will +receive a warning and the edited copy will remain in a temporary +file. +.It Fl g Ar group +Normally, +.Nm sudo +runs a command with the primary group set to the one specified by +the password database for the user the command is being run as (by +default, root). +The +.Fl g No ( Em group Ns No ) +option causes +.Nm sudo +to run the command with the primary group set to +.Ar group +instead. +To specify a +.Em gid +instead of a +.Em "group name" , +use +.Em #gid . +When running commands as a +.Em gid , +many shells require that the +.Ql # +be escaped with a backslash +.Pq Ql \e . +If no +.Fl u +option is specified, the command will be run as the invoking user +(not root). +In either case, the primary group will be set to +.Em group . +.It Fl H +The +.Fl H No ( Em HOME Ns No ) +option option sets the +.Ev HOME +environment variable to the home directory of the target user (root +by default) as specified by the password database. +The default handling of the +.Ev HOME +environment variable depends on +.Xr sudoers @mansectform@ +settings. +By default, +.Nm sudo +will not modify +.Ev HOME +(see +.Em set_home +and +.Em always_set_home +in +.Xr sudoers @mansectform@ ) . +.It Fl h +The +.Fl h No ( Em help Ns No ) +option causes +.Nm sudo +to print a short help message to the standard output and exit. +.It Fl i Op Ar command +The +.Fl i No ( Em simulate initial login Ns No ) +option runs the shell specified by the password database entry of +the target user as a login shell. +This means that login-specific resource files such as +.Pa .profile +or +.Pa .login +will be read by the shell. +If a command is specified, it is passed to the shell for execution +via the shell's +.Fl c +option. +If no command is specified, an interactive shell is executed. +.Nm sudo +attempts to change to that user's home directory before running the +shell. +It also initializes the environment to a minimal +set of variables, similar to what is present when a user logs in. +The +.Sx Command Environment +section below documents in detail how the +.Fl i +option affects the environment in which a command is run. +.It Fl K +The +.Fl K No ( sure Em kill Ns No ) +option is like +.Fl k +except that it removes the user's time stamp file entirely and +may not be used in conjunction with a command or other option. +This option does not require a password. +.It Fl k Op Ar command +When used alone, the +.Fl k No ( Em kill Ns No ) +option to +.Nm sudo +invalidates the user's time stamp file. +The next time +.Nm sudo +is run a password will be required. +This option does not require a password and was added to allow a +user to revoke +.Nm sudo +permissions from a +.Pa .logout +file. +.Pp +When used in conjunction with a command or an option that may require +a password, the +.Fl k +option will cause +.Nm sudo +to ignore the user's time stamp file. +As a result, +.Nm sudo +will prompt for a password (if one is required by +.Em sudoers ) +and will not update the user's time stamp file. +.It Fl L +The +.Fl L No ( Em list No defaults Ns ) +option will list the parameters that +may be set in a +.Em Defaults +line along with a short description for each. +This option will be removed from a future version of +.Nm sudo . +.It Fl l Ns Oo Sy l Oc Op Ar command +If no +.Ar command +is specified, the +.Fl l No ( Em list Ns No ) +option will list the allowed (and forbidden) commands for the +invoking user (or the user specified by the +.Fl U +option) on the current host. +If a +.Ar command +is specified and is permitted by +.Em sudoers , +the fully-qualified +path to the command is displayed along with any command line +arguments. +If +.Ar command +is specified but not allowed, +.Nm sudo +will exit with a status value of 1. +If the +.Fl l +option is specified with an +.Ar l +argument +.Pq i.e.\& Fl ll , +or if +.Fl l +is specified multiple times, a longer list format is used. +.It Fl n +The +.Fl n No ( Em non-interactive Ns No ) +option prevents +.Nm sudo +from prompting the user for a password. +If a password is required for the command to run, +.Nm sudo +will display an error message and exit. +.It Fl P +The +.Fl P No ( Em preserve group vector Ns No ) +option causes +.Nm sudo +to preserve the invoking user's group vector unaltered. +By default, +.Nm sudo +will initialize the group vector to the list of groups the +target user is in. +The real and effective group IDs, however, are still set to match +the target user. +.It Fl p Ar prompt +The +.Fl p No ( Em prompt Ns No ) +option allows you to override the default password prompt and use +a custom one. +The following percent +.Pq Ql % +escapes are supported: +.Bl -tag -width 2n +.It Li %H +expanded to the host name including the domain name (on if the +machine's host name is fully qualified or the +.Em fqdn +option is set in +.Xr sudoers @mansectform@ ) +.It Li %h +expanded to the local host name without the domain name +.It Li %p +expanded to the name of the user whose password is being requested +(respects the +.Em rootpw , +.Em targetpw , +and +.Em runaspw +flags in +.Xr sudoers @mansectform@ ) +.It Li \&%U +expanded to the login name of the user the command will be run as +(defaults to root unless the +.Fl u +option is also specified) +.It Li %u +expanded to the invoking user's login name +.It Li %% +two consecutive +.Ql % +characters are collapsed into a single +.Ql % +character +.El +.Pp +The prompt specified by the +.Fl p +option will override the system password prompt on systems that +support PAM unless the +.Em passprompt_override +flag is disabled in +.Em sudoers . +.It Fl S +The +.Fl S ( Em stdin Ns No ) +option causes +.Nm sudo +to read the password from the standard input instead of the terminal +device. +The password must be followed by a newline character. +.It Fl s Op Ar command +The +.Fl s ( Em shell Ns No ) +option runs the shell specified by the +.Ev SHELL +environment variable if it is set or the shell as specified in the +password database. +If a command is specified, it is passed to the shell for execution +via the shell's +.Fl c +option. +If no command is specified, an interactive shell is executed. +.It Fl U Ar user +The +.Fl U ( Em other user Ns No ) +option is used in conjunction with the +.Fl l +option to specify the user whose privileges should be listed. +Only root or a user with the +.Li ALL +privilege on the current host may use this option. +.It Fl u Ar user +The +.Fl u ( Em user Ns No ) +option causes +.Nm sudo +to run the specified command as a user other than +.Em root . +To specify a +.Em uid +instead of a +.Em user name , +.Em #uid . +When running commands as a +.Em uid , +many shells require that the +.Ql # +be escaped with a backslash +.Pq Ql \e . +Note that if the +.Em targetpw +Defaults option is set (see +.Xr sudoers @mansectform@ ) , +it is not possible to run commands with a uid not listed in the +password database. +.It Fl V +The +.Fl V ( Em version Ns No ) +option causes +.Nm sudo +to print its version string and exit. +If the invoking user is already root the +.Fl V +option will display the arguments passed to configure when +.Nm sudo +was built as well a list of the defaults +.Nm sudo +was compiled with as well as the machine's local network addresses. +.It Fl v +When given the +.Fl v ( Em validate Ns No ) +option, +.Nm sudo +will update the user's time stamp file, authenticating the user's +password if necessary. +This extends the +.Nm sudo +timeout for another +.Li @timeout@ +minutes (or whatever the timeout is set to in +.Em sudoers ) +but does not run a command. +.It Fl - +The +.Fl - +option indicates that +.Nm sudo +should stop processing command line arguments. +.El +.Pp +Environment variables to be set for the command may also be passed +on the command line in the form of +.Sy VAR Ns No = Ns Em value , +e.g.\& +.Sy LD_LIBRARY_PATH Ns No = Ns Em /usr/local/pkg/lib . +Variables passed on the command line are subject to the same +restrictions as normal environment variables with one important +exception. +If the +.Em setenv +option is set in +.Em sudoers , +the command to be run has the +.Li SETENV +tag set or the command matched is +.Li ALL , +the user may set variables that would otherwise be forbidden. +See +.Xr sudoers @mansectform@ +for more information. +.Ss Authentication and Logging +.Nm sudo +requires that most users authenticate themselves by default. +A password is not required +if the invoking user is root, if the target user is the same as the +invoking user, or if the authentication has been disabled for the +user or command in the +.Em sudoers +file. +Unlike +.Xr su 1 , +when +.Nm sudo +requires +authentication, it validates the invoking user's credentials, not +the target user's (or root's) credentials. +This can be changed via +the +.Em rootpw , +.Em targetpw +and +.Em runaspw +Defaults entries in +.Em sudoers . +.Pp +If a user who is not listed in +.Em sudoers +tries to run a command via +.Nm sudo , +mail is sent to the proper authorities. +The address +used for such mail is configurable via the +.Em mailto +.Em sudoers +Defaults entry and defaults to +.Li @mailto@ . +.Pp +Note that mail will not be sent if an unauthorized user tries to +run +.Nm sudo +with the +.Fl l +or +.Fl v +option. +This allows users to +determine for themselves whether or not they are allowed to use +.Nm sudo . +.Pp +If +.Nm sudo +is run by root and the +.Ev SUDO_USER +environment variable +is set, its value will be used to determine who the actual user is. +This can be used by a user to log commands +through +.Nm sudo +even when a root shell has been invoked. +It also +allows the +.Fl e +option to remain useful even when invoked via a +sudo-run script or program. +Note, however, that the +.Em sudoers +lookup is still done for root, not the user specified by +.Ev SUDO_USER . +.Pp +.Nm sudo +uses time stamp files for credential caching. +Once a +user has been authenticated, the time stamp is updated and the user +may then use sudo without a password for a short period of time +.Po +.Li @timeout@ +minutes unless overridden by the +.Em timeout +option +.Pc . +By default, +.Nm sudo +uses a tty-based time stamp which means that +there is a separate time stamp for each of a user's login sessions. +The +.Em tty_tickets +option can be disabled to force the use of a +single time stamp for all of a user's sessions. +.Pp +.Nm sudo +can log both successful and unsuccessful attempts (as well +as errors) to +.Xr syslog 3 , +a log file, or both. +By default, +.Nm sudo +will log via +.Xr syslog 3 +but this is changeable via the +.Em syslog +and +.Em logfile +Defaults settings. +.Pp +.Nm sudo +also supports logging a command's input and output +streams. +I/O logging is not on by default but can be enabled using +the +.Em log_input +and +.Em log_output +Defaults flags as well as the +.Li LOG_INPUT +and +.Li LOG_OUTPUT +command tags. +.Ss Command Environment +Since environment variables can influence program behavior, +.Nm sudo +provides a means to restrict which variables from the user's +environment are inherited by the command to be run. +There are two +distinct ways +.Em sudoers +can be configured to handle with environment variables. +.Pp +By default, the +.Em env_reset +option is enabled. +This causes commands +to be executed with a new, minimal environment. +On AIX (and Linux +systems without PAM), the environment is initialized with the +contents of the +.Pa /etc/environment +file. +On BSD systems, if the +.Em use_loginclass +option is enabled, the environment is initialized +based on the +.Em path +and +.Em setenv +settings in +.Pa /etc/login.conf . +The new environment contains the +.Ev TERM , +.Ev PATH , +.Ev HOME , +.Ev MAIL , +.Ev SHELL , +.Ev LOGNAME , +.Ev USER , +.Ev USERNAME +and +.Ev SUDO_* +variables +in addition to variables from the invoking process permitted by the +.Em env_check +and +.Em env_keep +options. +This is effectively a whitelist +for environment variables. +.Pp +If, however, the +.Em env_reset +option is disabled, any variables not +explicitly denied by the +.Em env_check +and +.Em env_delete +options are +inherited from the invoking process. +In this case, +.Em env_check +and +.Em env_delete +behave like a blacklist. +Since it is not possible +to blacklist all potentially dangerous environment variables, use +of the default +.Em env_reset +behavior is encouraged. +.Pp +In all cases, environment variables with a value beginning with +.Li () +are removed as they could be interpreted as +.Sy bash +functions. +The list of environment variables that +.Nm sudo +allows or denies is +contained in the output of +.Dq Li sudo -V +when run as root. +.Pp +Note that the dynamic linker on most operating systems will remove +variables that can control dynamic linking from the environment of +setuid executables, including +.Nm sudo . +Depending on the operating +system this may include +.Ev _RLD* , +.Ev DYLD_* , +.Ev LD_* , +.Ev LDR_* , +.Ev LIBPATH , +.Ev SHLIB_PATH , +and others. +These type of variables are +removed from the environment before +.Nm sudo +even begins execution +and, as such, it is not possible for +.Nm sudo +to preserve them. +.Pp +As a special case, if +.Nm sudo Ns No 's +.Fl i +option (initial login) is +specified, +.Nm sudo +will initialize the environment regardless +of the value of +.Em env_reset . +The +.Ev DISPLAY , +.Ev PATH +and +.Ev TERM +variables remain unchanged; +.Ev HOME , +.Ev MAIL , +.Ev SHELL , +.Ev USER , +and +.Ev LOGNAME +are set based on the target user. +On AIX (and Linux +systems without PAM), the contents of +.Pa /etc/environment +are also +included. +On BSD systems, if the +.Em use_loginclass +option is +enabled, the +.Em path +and +.Em setenv +variables in +.Pa /etc/login.conf +are also applied. +All other environment variables are removed. +.Pp +Finally, if the +.Em env_file +option is defined, any variables present +in that file will be set to their specified values as long as they +would not conflict with an existing environment variable. +.Sh EXIT VALUE +Upon successful execution of a program, the exit status from +.Em sudo +will simply be the exit status of the program that was executed. +.Pp +Otherwise, +.Nm sudo +exits with a value of 1 if there is a configuration/permission +problem or if +.Nm sudo +cannot execute the given command. +In the latter case the error string is printed to the standard error. +If +.Nm sudo +cannot +.Xr stat 2 +one or more entries in the user's +.Ev PATH , +an error is printed on stderr. +(If the directory does not exist or if it is not really a directory, +the entry is ignored and no error is printed.) +This should not happen under normal circumstances. +The most common reason for +.Xr stat 2 +to return +.Dq permission denied +is if you are running an automounter and one of the directories in +your +.Ev PATH +is on a machine that is currently unreachable. +.Sh LOG FORMAT +.Nm sudo +can log events using either +.Xr syslog 3 +or a simple log file. +In each case the log format is almost identical. +.Ss Accepted command log entries +Commands that sudo runs are logged using the following format (split +into multiple lines for readability): +.Bd -literal -offset 4n +date hostname progname: username : TTY=ttyname ; PWD=cwd ; \e + USER=runasuser ; GROUP=runasgroup ; TSID=logid ; \e + ENV=env_vars COMMAND=command +.Ed +.Pp +Where the fields are as follows: +.Bl -tag -width 12n +.It date +The date the command was run. +Typically, this is in the format +.Dq MMM, DD, HH:MM:SS . +If logging via +.Xr syslog 3 , +the actual date format is controlled by the syslog daemon. +If logging to a file and the +.Em log_year +option is enabled, +the date will also include the year. +.It hostname +The name of the host +.Nm sudo +was run on. +This field is only present when logging via +.Xr syslog 3 . +.It progname +The name of the program, usually +.Em sudo +or +.Em sudoedit . +This field is only present when logging via +.Xr syslog 3 . +.It username +The login name of the user who ran +.Nm sudo . +.It ttyname +The short name of the terminal (e.g.\& +.Dq console , +.Dq tty01 , +or +.Dq pts/0 ) +.Nm sudo +was run on, or +.Dq unknown +if there was no terminal present. +.It cwd +The current working directory that +.Nm sudo +was run in. +.It runasuser +The user the command was run as. +.It runasgroup +The group the command was run as if one was specified on the command line. +.It logid +An I/O log identifier that can be used to replay the command's output. +This is only present when the +.Em log_input +or +.Em log_output +option is enabled. +.It env_vars +A list of environment variables specified on the command line, +if specified. +.It command +The actual command that was executed. +.El +.Pp +Messages are logged using the locale specified by +.Em sudoers_locale , +which defaults to the +.Dq Li C +locale. +.Ss Denied command log entries +If the user is not allowed to run the command, the reason for the denial +will follow the user name. +Possible reasons include: +.Bl -tag -width 4 +.It user NOT in sudoers +The user is not listed in the +.Em sudoers +file. +.It user NOT authorized on host +The user is listed in the +.Em sudoers +file but is not allowed to run commands on the host. +.It command not allowed +The user is listed in the +.Em sudoers +file for the host but they are not allowed to run the specified command. +.It 3 incorrect password attempts +The user failed to enter their password after 3 tries. +The actual number of tries will vary based on the number of +failed attempts and the value of the +.Em passwd_tries +.Em sudoers +option. +.It a password is required +The +.Fl n +option was specified but a password was required. +.It sorry, you are not allowed to set the following environment variables +The user specified environment variables on the command line that +were not allowed by +.Em sudoers . +.El +.Ss Error log entries +If an error occurs, +.Nm sudo +will log a message and, in most cases, send a message to the +administrator via email. +Possible errors include: +.Bl -tag -width 4 +.It parse error in @sysconfdir@/sudoers near line N +.Nm sudo +encountered an error when parsing the specified file. +In some cases, the actual error may be one line above or below the +line number listed, depending on the type of error. +.It problem with defaults entries +The +.Em sudoers +file contains one or more unknown Defaults settings. +This does not prevent +.Nm sudo +from running, but the +.Em sudoers +file should be checked using +.Nm visudo . +.It timestamp owner (username): \&No such user +The time stamp directory owner, as specified by the +.Em timestampowner +setting, could not be found in the password database. +.It unable to open/read @sysconfdir@/sudoers +The +.Em sudoers +file could not be opened for reading. +This can happen when the +.Em sudoers +file is located on a remote file system that maps user ID 0 to +a different value. +Normally, +.Nm sudo +tries to open +.Em sudoers +using group permissions to avoid this problem. +.It unable to stat @sysconfdir@/sudoers +The +.Pa @sysconfdir@/sudoers +file is missing. +.It @sysconfdir@/sudoers is not a regular file +The +.Pa @sysconfdir@/sudoers +file exists but is not a regular file or symbolic link. +.It @sysconfdir@/sudoers is owned by uid N, should be 0 +The +.Em sudoers +file has the wrong owner. +.It @sysconfdir@/sudoers is world writable +The permissions on the +.Em sudoers +file allow all users to write to it. +The +.Em sudoers +file must not be world-writable, the default file mode +is 0440 (readable by owner and group, writable by none). +.It @sysconfdir@/sudoers is owned by gid N, should be 1 +The +.Em sudoers +file has the wrong group ownership. +.It unable to open @timedir@/username/ttyname +.Em sudoers +was unable to read or create the user's time stamp file. +.It unable to write to @timedir@/username/ttyname +.Em sudoers +was unable to write to the user's time stamp file. +.It unable to mkdir to @timedir@/username +.Em sudoers +was unable to create the user's time stamp directory. +.El +.Ss Notes on logging via syslog +By default, +.Em sudoers +logs messages via +.Xr syslog 3 . +The +.Em date , +.Em hostname , +and +.Em progname +fields are added by the syslog daemon, not +.Em sudoers +itself. +As such, they may vary in format on different systems. +.Pp +On most systems, +.Xr syslog 3 +has a relatively small log buffer. +To prevent the command line arguments from being truncated, +.Nm sudo +will split up log messages that are larger than 960 characters +(not including the date, hostname, and the string +.Dq sudo ) . +When a message is split, additional parts will include the string +.Dq Pq command continued +after the user name and before the continued command line arguments. +.Ss Notes on logging to a file +If the +.Em logfile +option is set, +.Em sudoers +will log to a local file, such as +.Pa /var/log/sudo . +When logging to a file, +.Em sudoers +uses a format similar to +.Xr syslog 3 , +with a few important differences: +.Bl -enum +.It +The +.Em progname +and +.Em hostname +fields are not present. +.It +If the +.Em log_year +.Em sudoers +option is enabled, +the date will also include the year. +.It +Lines that are longer than +.Em loglinelen +characters (80 by default) are word-wrapped and continued on the +next line with a four character indent. +This makes entries easier to read for a human being, but makes it +more difficult to use +.Xr grep 1 +on the log files. +If the +.Em loglinelen +.Em sudoers +option is set to 0 (or negated with a +.Ql \&! ) , +word wrap will be disabled. +.El +.Sh SECURITY NOTES +.Nm sudo +tries to be safe when executing external commands. +.Pp +To prevent command spoofing, +.Nm sudo +checks "." and "" (both denoting current directory) last when +searching for a command in the user's +.Ev PATH +(if one or both are in the +.Ev PATH ) . +Note, however, that the actual +.Ev PATH +environment variable is +.Em not +modified and is passed unchanged to the program that +.Nm sudo +executes. +.Pp +.Nm sudo +will check the ownership of its time stamp directory +.Po +.Pa @timedir@ +by default +.Pc +and ignore the directory's contents if it is not owned by root or +if it is writable by a user other than root. +On systems that allow non-root users to give away files via +.Xr chown 2 , +if the time stamp directory is located in a world-writable +directory (e.g.\&, +.Pa /tmp ) , +it is possible for a user to create the time stamp directory before +.Nm sudo +is run. +However, because +.Nm sudo +checks the ownership and mode of the directory and its +contents, the only damage that can be done is to +.Dq hide +files by putting them in the time stamp dir. +This is unlikely to happen since once the time stamp dir is owned by root +and inaccessible by any other user, the user placing files there would be +unable to get them back out. +.Pp +.Nm sudo +will not honor time stamps set far in the future. +Time stamps with a date greater than current_time + 2 * +.Li TIMEOUT +will be ignored and sudo will log and complain. +This is done to keep a user from creating his/her own time stamp with a +bogus date on systems that allow users to give away files if the time +stamp directory is located in a world-writable directory. +.Pp +Since time stamp files live in the file system, they can outlive a +user's login session. +As a result, a user may be able to login, run a command with +.Nm sudo +after authenticating, logout, login again, and run +.Nm sudo +without authenticating so long as the time stamp file's modification +time is within +.Li @timeout@ +minutes (or whatever the timeout is set to in +.Em sudoers ) . +When the +.Em tty_tickets +.Em sudoers +option is enabled, the time stamp has per-tty granularity but still +may outlive the user's session. +.Pp +Please note that +.Nm sudo +will normally only log the command it explicitly runs. +If a user runs a command such as +.Li sudo su +or +.Li sudo sh , +subsequent commands run from that shell are not subject to +.Nm sudo Ns No 's +security policy. +The same is true for commands that offer shell escapes (including +most editors). +If I/O logging is enabled, subsequent commands will have their input and/or +output logged, but there will not be traditional logs for those commands. +Because of this, care must be taken when giving users access to commands via +.Nm sudo +to verify that the command does not inadvertently give the user an +effective root shell. +For more information, please see the +.Em PREVENTING SHELL ESCAPES +section in +.Xr sudoers @mansectform@ . +.Pp +To prevent the disclosure of potentially sensitive information, +.Nm sudo +disables core dumps by default while it is executing (they are +re-enabled for the command that is run). +.Pp +For information on the security implications of +.Em sudoers +entries, please see the +.Em SECURITY NOTES +section in +.Xr sudoers @mansectform@ . +.Sh ENVIRONMENT +.Nm sudo +utilizes the following environment variables: +.Bl -tag -width 15n +.It Ev EDITOR +Default editor to use in +.Fl e +(sudoedit) mode if neither +.Ev SUDO_EDITOR +nor +.Ev VISUAL +is set. +.It Ev MAIL +In +.Fl i +mode or when +.Em env_reset +is enabled in +.Em sudoers , +set to the mail spool of the target user. +.It Ev HOME +Set to the home directory of the target user if +.Fl H +it specified, +.Em always_set_home +is set in +.Em sudoers , +or when the +.Fl s +option is specified and +.Em set_home +is set in +.Em sudoers . +.It Ev PATH +Set to a sane value if the +.Em secure_path +option is set in the +.Em sudoers +file. +.It Ev SHELL +Used to determine shell to run with +.Fl s +option. +.It Ev SUDO_ASKPASS +Specifies the path to a helper program used to read the password +if no terminal is available or if the +.Fl A +option is specified. +.It Ev SUDO_COMMAND +Set to the command run by sudo. +.It Ev SUDO_EDITOR +Default editor to use in +.Fl e +(sudoedit) mode. +.It Ev SUDO_GID +Set to the group ID of the user who invoked sudo. +.It Ev SUDO_PROMPT +Used as the default password prompt. +.It Ev SUDO_PS1 +If set, +.Ev PS1 +will be set to its value for the program being run. +.It Ev SUDO_UID +Set to the user ID of the user who invoked sudo. +.It Ev SUDO_USER +Set to the login name of the user who invoked sudo. +.It Ev USER +Set to the target user (root unless the +.Fl u +option is specified). +.It Ev VISUAL +Default editor to use in +.Fl e +(sudoedit) mode if +.Ev SUDO_EDITOR +is not set. +.El +.Sh FILES +.Bl -tag -width 24n +.It Pa @sysconfdir@/sudoers +List of who can run what +.It Pa @timedir@ +Directory containing time stamps +.It Pa /etc/environment +Initial environment for +.Fl i +mode on AIX and Linux systems +.El +.Sh EXAMPLES +Note: the following examples assume suitable +.Xr sudoers 5 +entries. +.Pp +To get a file listing of an unreadable directory: +.Bd -literal -offset indent +$ sudo ls /usr/local/protected +.Ed +.Pp +To list the home directory of user yaz on a machine where the file +system holding ~yaz is not exported as root: +.Bd -literal -offset indent +$ sudo -u yaz ls ~yaz +.Ed +.Pp +To edit the +.Pa index.html +file as user www: +.Bd -literal -offset indent +$ sudo -u www vi ~www/htdocs/index.html +.Ed +.Pp +To view system logs only accessible to root and users in the adm +group: +.Bd -literal -offset indent +$ sudo -g adm view /var/log/syslog +.Ed +.Pp +To run an editor as jim with a different primary group: +.Bd -literal -offset indent +$ sudo -u jim -g audio vi ~jim/sound.txt +.Ed +.Pp +To shut down a machine: +.Bd -literal -offset indent +$ sudo shutdown -r +15 "quick reboot" +.Ed +.Pp +To make a usage listing of the directories in the /home partition. +Note that this runs the commands in a sub-shell to make the +.Li cd +and file redirection work. +.Bd -literal -offset indent +$ sudo sh -c "cd /home ; du -s * | sort -rn > USAGE" +.Ed +.Sh SEE ALSO +.Xr grep 1 , +.Xr su 1 , +.Xr stat 2 , +.Xr login_cap 3 , +.Xr passwd @mansectform@ , +.Xr sudoers @mansectform@ , +.Xr sudoreplay @mansectsu@ , +.Xr visudo @mansectsu@ +.Sh HISTORY +See the HISTORY file in the +.Nm sudo +distribution (http://www.sudo.ws/sudo/history.html) for a brief +history of sudo. +.Sh AUTHORS +Many people have worked on +.Nm sudo +over the years; this version consists of code written primarily by: +.Bd -ragged -offset indent +Todd C. Miller +.Ed +.Pp +See the CONTRIBUTORS file in the +.Nm sudo +distribution (http://www.sudo.ws/sudo/contributors.html) for an +exhaustive list of people who have contributed to +.Nm sudo . +.Sh CAVEATS +There is no easy way to prevent a user from gaining a root shell +if that user is allowed to run arbitrary commands via +.Nm sudo . +Also, many programs (such as editors) allow the user to run commands +via shell escapes, thus avoiding +.Nm sudo Ns No 's +checks. +However, on most systems it is possible to prevent shell escapes with +.Nm sudo ' s +.Em noexec +functionality. +See the +.Xr sudoers @mansectform@ +manual for details. +.Pp +It is not meaningful to run the +.Li cd +command directly via sudo, e.g., +.Bd -literal -offset indent +$ sudo cd /usr/local/protected +.Ed +.Pp +since when the command exits the parent process (your shell) will +still be the same. +Please see the +.Sx EXAMPLES +section for more information. +.Pp +Running shell scripts via +.Nm sudo +can expose the same kernel bugs that make setuid shell scripts +unsafe on some operating systems (if your OS has a /dev/fd/ directory, +setuid shell scripts are generally safe). +.Sh BUGS +If you feel you have found a bug in +.Nm sudo , +please submit a bug report at http://www.sudo.ws/sudo/bugs/ +.Sh SUPPORT +Limited free support is available via the sudo-users mailing list, +see http://www.sudo.ws/mailman/listinfo/sudo-users to subscribe or +search the archives. +.Sh DISCLAIMER +.Nm sudo +is provided +.Dq AS IS +and any express or implied warranties, including, but not limited +to, the implied warranties of merchantability and fitness for a +particular purpose are disclaimed. +See the LICENSE file distributed with +.Nm sudo +or http://www.sudo.ws/sudo/license.html for complete details. diff --git a/usr.bin/sudo/sudo.pod b/usr.bin/sudo/sudo.pod deleted file mode 100644 index 963338d05f0..00000000000 --- a/usr.bin/sudo/sudo.pod +++ /dev/null @@ -1,660 +0,0 @@ -Copyright (c) 1994-1996, 1998-2005, 2007-2009 - Todd C. Miller <Todd.Miller@courtesan.com> - -Permission to use, copy, modify, and distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -Sponsored in part by the Defense Advanced Research Projects -Agency (DARPA) and Air Force Research Laboratory, Air Force -Materiel Command, USAF, under agreement number F39502-99-1-0512. - -=pod - -=head1 NAME - -sudo, sudoedit - execute a command as another user - -=head1 SYNOPSIS - -B<sudo> B<-h> | B<-K> | B<-k> | B<-L> | B<-V> - -B<sudo> B<-v> [B<-AknS>] -S<[B<-a> I<auth_type>]> -S<[B<-p> I<prompt>]> - -B<sudo> B<-l[l]> [B<-AknS>] -S<[B<-a> I<auth_type>]> -S<[B<-g> I<groupname>|I<#gid>]> S<[B<-p> I<prompt>]> -S<[B<-U> I<username>]> S<[B<-u> I<username>|I<#uid>]> [I<command>] - -B<sudo> [B<-AbEHnPS>] -S<[B<-a> I<auth_type>]> -S<[B<-C> I<fd>]> -S<[B<-c> I<class>|I<->]> -S<[B<-g> I<groupname>|I<#gid>]> S<[B<-p> I<prompt>]> -S<[B<-u> I<username>|I<#uid>]> -S<[B<VAR>=I<value>]> S<[B<-i> | B<-s>]> [I<command>] - -B<sudoedit> [B<-AnS>] -S<[B<-a> I<auth_type>]> -S<[B<-C> I<fd>]> -S<[B<-c> I<class>|I<->]> -S<[B<-g> I<groupname>|I<#gid>]> S<[B<-p> I<prompt>]> -S<[B<-u> I<username>|I<#uid>]> file ... - -=head1 DESCRIPTION - -B<sudo> allows a permitted user to execute a I<command> as the -superuser or another user, as specified in the I<sudoers> file. -The real and effective uid and gid are set to match those of the -target user as specified in the passwd file and the group vector -is initialized based on the group file (unless the B<-P> option was -specified). If the invoking user is root or if the target user is -the same as the invoking user, no password is required. Otherwise, -B<sudo> requires that users authenticate themselves with a password -by default (NOTE: in the default configuration this is the user's -password, not the root password). Once a user has been authenticated, -a timestamp is updated and the user may then use sudo without a -password for a short period of time (C<@timeout@> minutes unless -overridden in I<sudoers>). - -When invoked as B<sudoedit>, the B<-e> option (described below), -is implied. - -B<sudo> determines who is an authorized user by consulting the file -F<@sysconfdir@/sudoers>. By running B<sudo> with the B<-v> option, -a user can update the time stamp without running a I<command>. The -password prompt itself will also time out if the user's password -is not entered within C<@password_timeout@> minutes (unless overridden -via I<sudoers>). - -If a user who is not listed in the I<sudoers> file tries to run a -command via B<sudo>, mail is sent to the proper authorities, as -defined at configure time or in the I<sudoers> file (defaults to -C<@mailto@>). Note that the mail will not be sent if an unauthorized -user tries to run sudo with the B<-l> or B<-v> option. This allows -users to determine for themselves whether or not they are allowed -to use B<sudo>. - -If B<sudo> is run by root and the C<SUDO_USER> environment variable -is set, B<sudo> will use this value to determine who the actual -user is. This can be used by a user to log commands through sudo -even when a root shell has been invoked. It also allows the B<-e> -option to remain useful even when being run via a sudo-run script or -program. Note however, that the sudoers lookup is still done for -root, not the user specified by C<SUDO_USER>. - -B<sudo> can log both successful and unsuccessful attempts (as well -as errors) to syslog(3), a log file, or both. By default B<sudo> -will log via syslog(3) but this is changeable at configure time -or via the I<sudoers> file. - -=head1 OPTIONS - -B<sudo> accepts the following command line options: - -=over 12 - -=item -A - -Normally, if B<sudo> requires a password, it will read it from the -current terminal. If the B<-A> (I<askpass>) option is specified, -a (possibly graphical) helper program is executed to read the -user's password and output the password to the standard output. If -the C<SUDO_ASKPASS> environment variable is set, it specifies the -path to the helper program. Otherwise, the value specified by the -I<askpass> option in L<sudoers(5)> is used. - -=item -a I<type> - -The B<-a> (I<authentication type>) option causes B<sudo> to use the -specified authentication type when validating the user, as allowed -by F</etc/login.conf>. The system administrator may specify a list -of sudo-specific authentication methods by adding an "auth-sudo" -entry in F</etc/login.conf>. This option is only available on systems -that support BSD authentication. - -=item -b - -The B<-b> (I<background>) option tells B<sudo> to run the given -command in the background. Note that if you use the B<-b> -option you cannot use shell job control to manipulate the process. - -=item -C I<fd> - -Normally, B<sudo> will close all open file descriptors other than -standard input, standard output and standard error. The B<-C> -(I<close from>) option allows the user to specify a starting point -above the standard error (file descriptor three). Values less than -three are not permitted. This option is only available if the -administrator has enabled the I<closefrom_override> option in -L<sudoers(5)>. - -=item -c I<class> - -The B<-c> (I<class>) option causes B<sudo> to run the specified command -with resources limited by the specified login class. The I<class> -argument can be either a class name as defined in F</etc/login.conf>, -or a single '-' character. Specifying a I<class> of C<-> indicates -that the command should be run restricted by the default login -capabilities for the user the command is run as. If the I<class> -argument specifies an existing user class, the command must be run -as root, or the B<sudo> command must be run from a shell that is already -root. This option is only available on systems with BSD login classes. - -=item -E - -The B<-E> (I<preserve> I<environment>) option will override the -I<env_reset> option in L<sudoers(5)>). It is only -available when either the matching command has the C<SETENV> tag -or the I<setenv> option is set in L<sudoers(5)>. - -=item -e - -The B<-e> (I<edit>) option indicates that, instead of running -a command, the user wishes to edit one or more files. In lieu -of a command, the string "sudoedit" is used when consulting -the I<sudoers> file. If the user is authorized by I<sudoers> -the following steps are taken: - -=over 4 - -=item 1. - -Temporary copies are made of the files to be edited with the owner -set to the invoking user. - -=item 2. - -The editor specified by the C<SUDO_EDITOR>, C<VISUAL> or C<EDITOR> -environment variables is run to edit the temporary files. If none -of C<SUDO_EDITOR>, C<VISUAL> or C<EDITOR> are set, the first program -listed in the I<editor> I<sudoers> variable is used. - -=item 3. - -If they have been modified, the temporary files are copied back to -their original location and the temporary versions are removed. - -=back - -If the specified file does not exist, it will be created. Note -that unlike most commands run by B<sudo>, the editor is run with -the invoking user's environment unmodified. If, for some reason, -B<sudo> is unable to update a file with its edited version, the -user will receive a warning and the edited copy will remain in a -temporary file. - -=item -g I<group> - -Normally, B<sudo> sets the primary group to the one specified by -the passwd database for the user the command is being run as (by -default, root). The B<-g> (I<group>) option causes B<sudo> to run -the specified command with the primary group set to I<group>. To -specify a I<gid> instead of a I<group name>, use I<#gid>. When -running commands as a I<gid>, many shells require that the '#' be -escaped with a backslash ('\'). If no B<-u> option is specified, -the command will be run as the invoking user (not root). In either -case, the primary group will be set to I<group>. - -=item -H - -The B<-H> (I<HOME>) option sets the C<HOME> environment variable -to the homedir of the target user (root by default) as specified -in passwd(5). By default, B<sudo> does not modify C<HOME> -(see I<set_home> and I<always_set_home> in L<sudoers(5)>). - -=item -h - -The B<-h> (I<help>) option causes B<sudo> to print a usage message and exit. - -=item -i [command] - -The B<-i> (I<simulate initial login>) option runs the shell specified -in the L<passwd(5)> entry of the target user as a login shell. This -means that login-specific resource files such as C<.profile> or -C<.login> will be read by the shell. If a command is specified, -it is passed to the shell for execution. Otherwise, an interactive -shell is executed. B<sudo> attempts to change to that user's home -directory before running the shell. It also initializes the -environment, leaving I<DISPLAY> and I<TERM> unchanged, setting -I<HOME>, I<SHELL>, I<USER>, I<LOGNAME>, and I<PATH>, as well as -the contents of F</etc/environment> on Linux and AIX systems. -All other environment variables are removed. - -=item -K - -The B<-K> (sure I<kill>) option is like B<-k> except that it removes -the user's timestamp entirely and may not be used in conjunction -with a command or other option. This option does not require a -password. - -=item -k - -When used by itself, the B<-k> (I<kill>) option to B<sudo> invalidates -the user's timestamp by setting the time on it to the Epoch. The -next time B<sudo> is run a password will be required. This option -does not require a password and was added to allow a user to revoke -B<sudo> permissions from a .logout file. - -When used in conjunction with a command or an option that may require -a password, the B<-k> option will cause B<sudo> to ignore the user's -timestamp file. As a result, B<sudo> will prompt for a password -(if one is required by I<sudoers>) and will not update the user's -timestamp file. - -=item -L - -The B<-L> (I<list> defaults) option will list out the parameters -that may be set in a I<Defaults> line along with a short description -for each. This option is useful in conjunction with L<grep(1)>. - -=item -l[l] [I<command>] - -If no I<command> is specified, the B<-l> (I<list>) option will list -the allowed (and forbidden) commands for the invoking user (or the -user specified by the B<-U> option) on the current host. If a -I<command> is specified and is permitted by I<sudoers>, the -fully-qualified path to the command is displayed along with any -command line arguments. If I<command> is specified but not allowed, -B<sudo> will exit with a status value of 1. If the B<-l> option is -specified with an B<l> argument (i.e. B<-ll>), or if B<-l> -is specified multiple times, a longer list format is used. - -=item -n - -The B<-n> (I<non-interactive>) option prevents B<sudo> from prompting -the user for a password. If a password is required for the command -to run, B<sudo> will display an error messages and exit. - -=item -P - -The B<-P> (I<preserve> I<group vector>) option causes B<sudo> to -preserve the invoking user's group vector unaltered. By default, -B<sudo> will initialize the group vector to the list of groups the -target user is in. The real and effective group IDs, however, are -still set to match the target user. - -=item -p I<prompt> - -The B<-p> (I<prompt>) option allows you to override the default -password prompt and use a custom one. The following percent (`C<%>') -escapes are supported: - -=over 4 - -=item C<%H> - -expanded to the local hostname including the domain name -(on if the machine's hostname is fully qualified or the I<fqdn> -I<sudoers> option is set) - -=item C<%h> - -expanded to the local hostname without the domain name - -=item C<%p> - -expanded to the user whose password is being asked for (respects the -I<rootpw>, I<targetpw> and I<runaspw> flags in I<sudoers>) - -=item C<%U> - -expanded to the login name of the user the command will -be run as (defaults to root) - -=item C<%u> - -expanded to the invoking user's login name - -=item C<%%> - -two consecutive C<%> characters are collapsed into a single C<%> character - -=back - -The prompt specified by the B<-p> option will override the system -password prompt on systems that support PAM unless the -I<passprompt_override> flag is disabled in I<sudoers>. - -=item -S - -The B<-S> (I<stdin>) option causes B<sudo> to read the password from -the standard input instead of the terminal device. The password must -be followed by a newline character. - -=item -s [command] - -The B<-s> (I<shell>) option runs the shell specified by the I<SHELL> -environment variable if it is set or the shell as specified in -L<passwd(5)>. If a command is specified, it is passed to the shell -for execution. Otherwise, an interactive shell is executed. - -=item -U I<user> - -The B<-U> (I<other user>) option is used in conjunction with the B<-l> -option to specify the user whose privileges should be listed. Only -root or a user with B<sudo> C<ALL> on the current host may use this -option. - -=item -u I<user> - -The B<-u> (I<user>) option causes B<sudo> to run the specified -command as a user other than I<root>. To specify a I<uid> instead -of a I<user name>, use I<#uid>. When running commands as a I<uid>, -many shells require that the '#' be escaped with a backslash ('\'). -Note that if the I<targetpw> Defaults option is set (see L<sudoers(5)>) -it is not possible to run commands with a uid not listed in the -password database. - -=item -V - -The B<-V> (I<version>) option causes B<sudo> to print the version -number and exit. If the invoking user is already root the B<-V> -option will print out a list of the defaults B<sudo> was compiled -with as well as the machine's local network addresses. - -=item -v - -If given the B<-v> (I<validate>) option, B<sudo> will update the -user's timestamp, prompting for the user's password if necessary. -This extends the B<sudo> timeout for another C<@timeout@> minutes -(or whatever the timeout is set to in I<sudoers>) but does not run -a command. - -=item -- - -The B<--> option indicates that B<sudo> should stop processing command -line arguments. It is most useful in conjunction with the B<-s> option. - -=back - -Environment variables to be set for the command may also be passed -on the command line in the form of B<VAR>=I<value>, e.g. -B<LD_LIBRARY_PATH>=I</usr/local/pkg/lib>. Variables passed on the -command line are subject to the same restrictions as normal environment -variables with one important exception. If the I<setenv> option -is set in I<sudoers>, the command to be run has the C<SETENV> tag -set or the command matched is C<ALL>, the user may set variables -that would overwise be forbidden. See L<sudoers(5)> for more information. - -=head1 RETURN VALUES - -Upon successful execution of a program, the exit status from B<sudo> -will simply be the exit status of the program that was executed. - -Otherwise, B<sudo> quits with an exit value of 1 if there is a -configuration/permission problem or if B<sudo> cannot execute the -given command. In the latter case the error string is printed to -stderr. If B<sudo> cannot L<stat(2)> one or more entries in the user's -C<PATH> an error is printed on stderr. (If the directory does not -exist or if it is not really a directory, the entry is ignored and -no error is printed.) This should not happen under normal -circumstances. The most common reason for L<stat(2)> to return -"permission denied" is if you are running an automounter and one -of the directories in your C<PATH> is on a machine that is currently -unreachable. - -=head1 SECURITY NOTES - -B<sudo> tries to be safe when executing external commands. - -There are two distinct ways to deal with environment variables. -By default, the I<env_reset> I<sudoers> option is enabled. -This causes commands to be executed with a minimal environment -containing C<TERM>, C<PATH>, C<HOME>, C<SHELL>, C<LOGNAME>, C<USER> -and C<USERNAME> in addition to variables from the invoking process -permitted by the I<env_check> and I<env_keep> I<sudoers> options. -There is effectively a whitelist for environment variables. - -If, however, the I<env_reset> option is disabled in I<sudoers>, any -variables not explicitly denied by the I<env_check> and I<env_delete> -options are inherited from the invoking process. In this case, -I<env_check> and I<env_delete> behave like a blacklist. Since it -is not possible to blacklist all potentially dangerous environment -variables, use of the default I<env_reset> behavior is encouraged. - -In all cases, environment variables with a value beginning with -C<()> are removed as they could be interpreted as B<bash> functions. -The list of environment variables that B<sudo> allows or denies is -contained in the output of C<sudo -V> when run as root. - -Note that the dynamic linker on most operating systems will remove -variables that can control dynamic linking from the environment of -setuid executables, including B<sudo>. Depending on the operating -system this may include C<_RLD*>, C<DYLD_*>, C<LD_*>, C<LDR_*>, -C<LIBPATH>, C<SHLIB_PATH>, and others. These type of variables are -removed from the environment before B<sudo> even begins execution -and, as such, it is not possible for B<sudo> to preserve them. - -To prevent command spoofing, B<sudo> checks "." and "" (both denoting -current directory) last when searching for a command in the user's -PATH (if one or both are in the PATH). Note, however, that the -actual C<PATH> environment variable is I<not> modified and is passed -unchanged to the program that B<sudo> executes. - -B<sudo> will check the ownership of its timestamp directory -(F<@timedir@> by default) and ignore the directory's contents if -it is not owned by root or if it is writable by a user other than -root. On systems that allow non-root users to give away files via -L<chown(2)>, if the timestamp directory is located in a directory -writable by anyone (e.g., F</tmp>), it is possible for a user to -create the timestamp directory before B<sudo> is run. However, -because B<sudo> checks the ownership and mode of the directory and -its contents, the only damage that can be done is to "hide" files -by putting them in the timestamp dir. This is unlikely to happen -since once the timestamp dir is owned by root and inaccessible by -any other user, the user placing files there would be unable to get -them back out. To get around this issue you can use a directory -that is not world-writable for the timestamps (F</var/adm/sudo> for -instance) or create F<@timedir@> with the appropriate owner (root) -and permissions (0700) in the system startup files. - -B<sudo> will not honor timestamps set far in the future. -Timestamps with a date greater than current_time + 2 * C<TIMEOUT> -will be ignored and sudo will log and complain. This is done to -keep a user from creating his/her own timestamp with a bogus -date on systems that allow users to give away files. - -Please note that B<sudo> will normally only log the command it -explicitly runs. If a user runs a command such as C<sudo su> or -C<sudo sh>, subsequent commands run from that shell will I<not> be -logged, nor will B<sudo>'s access control affect them. The same -is true for commands that offer shell escapes (including most -editors). Because of this, care must be taken when giving users -access to commands via B<sudo> to verify that the command does not -inadvertently give the user an effective root shell. For more -information, please see the C<PREVENTING SHELL ESCAPES> section in -L<sudoers(5)>. - -=head1 ENVIRONMENT - -B<sudo> utilizes the following environment variables: - -=over 16 - -=item C<EDITOR> - -Default editor to use in B<-e> (sudoedit) mode if neither C<SUDO_EDITOR> -nor C<VISUAL> is set - -=item C<HOME> - -In B<-s> or B<-H> mode (or if sudo was configured with the ---enable-shell-sets-home option), set to homedir of the target user - -=item C<PATH> - -Set to a sane value if the I<secure_path> sudoers option is set. - -=item C<SHELL> - -Used to determine shell to run with C<-s> option - -=item C<SUDO_ASKPASS> - -Specifies the path to a helper program used to read the password -if no terminal is available or if the C<-A> option is specified. - -=item C<SUDO_COMMAND> - -Set to the command run by sudo - -=item C<SUDO_EDITOR> - -Default editor to use in B<-e> (sudoedit) mode - -=item C<SUDO_GID> - -Set to the group ID of the user who invoked sudo - -=item C<SUDO_PROMPT> - -Used as the default password prompt - -=item C<SUDO_PS1> - -If set, C<PS1> will be set to its value for the program being run - -=item C<SUDO_UID> - -Set to the user ID of the user who invoked sudo - -=item C<SUDO_USER> - -Set to the login of the user who invoked sudo - -=item C<USER> - -Set to the target user (root unless the B<-u> option is specified) - -=item C<VISUAL> - -Default editor to use in B<-e> (sudoedit) mode if C<SUDO_EDITOR> -is not set - -=back - -=head1 FILES - -=over 24 - -=item F<@sysconfdir@/sudoers> - -List of who can run what - -=item F<@timedir@> - -Directory containing timestamps - -=item F</etc/environment> - -Initial environment for B<-i> mode on Linux and AIX - -=back - -=head1 EXAMPLES - -Note: the following examples assume suitable L<sudoers(5)> entries. - -To get a file listing of an unreadable directory: - - $ sudo ls /usr/local/protected - -To list the home directory of user yaz on a machine where the -file system holding ~yaz is not exported as root: - - $ sudo -u yaz ls ~yaz - -To edit the F<index.html> file as user www: - - $ sudo -u www vi ~www/htdocs/index.html - -To view system logs only accessible to root and users in the adm group: - - $ sudo -g adm view /var/log/syslog - -To run an editor as jim with a different primary group: - - $ sudo -u jim -g audio vi ~jim/sound.txt - -To shutdown a machine: - - $ sudo shutdown -r +15 "quick reboot" - -To make a usage listing of the directories in the /home -partition. Note that this runs the commands in a sub-shell -to make the C<cd> and file redirection work. - - $ sudo sh -c "cd /home ; du -s * | sort -rn > USAGE" - -=head1 SEE ALSO - -L<grep(1)>, L<su(1)>, L<stat(2)>, -L<login_cap(3)>, -L<passwd(5)>, L<sudoers(5)>, L<visudo(8)> - -=head1 AUTHORS - -Many people have worked on B<sudo> over the years; this -version consists of code written primarily by: - - Todd C. Miller - -See the HISTORY file in the B<sudo> distribution or visit -http://www.sudo.ws/sudo/history.html for a short history -of B<sudo>. - -=head1 CAVEATS - -There is no easy way to prevent a user from gaining a root shell -if that user is allowed to run arbitrary commands via B<sudo>. -Also, many programs (such as editors) allow the user to run commands -via shell escapes, thus avoiding B<sudo>'s checks. However, on -most systems it is possible to prevent shell escapes with B<sudo>'s -I<noexec> functionality. See the L<sudoers(5)> manual -for details. - -It is not meaningful to run the C<cd> command directly via sudo, e.g., - - $ sudo cd /usr/local/protected - -since when the command exits the parent process (your shell) will -still be the same. Please see the EXAMPLES section for more information. - -If users have sudo C<ALL> there is nothing to prevent them from -creating their own program that gives them a root shell regardless -of any '!' elements in the user specification. - -Running shell scripts via B<sudo> can expose the same kernel bugs that -make setuid shell scripts unsafe on some operating systems (if your OS -has a /dev/fd/ directory, setuid shell scripts are generally safe). - -=head1 BUGS - -If you feel you have found a bug in B<sudo>, please submit a bug report -at http://www.sudo.ws/sudo/bugs/ - -=head1 SUPPORT - -Limited free support is available via the sudo-users mailing list, -see http://www.sudo.ws/mailman/listinfo/sudo-users to subscribe or -search the archives. - -=head1 DISCLAIMER - -B<sudo> is provided ``AS IS'' and any express or implied warranties, -including, but not limited to, the implied warranties of merchantability -and fitness for a particular purpose are disclaimed. See the LICENSE -file distributed with B<sudo> or http://www.sudo.ws/sudo/license.html -for complete details. diff --git a/usr.bin/sudo/sudo/Makefile b/usr.bin/sudo/sudo/Makefile index 6e9ae4de0fa..442d573d594 100644 --- a/usr.bin/sudo/sudo/Makefile +++ b/usr.bin/sudo/sudo/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.7 2009/04/11 11:48:06 millert Exp $ +# $OpenBSD: Makefile,v 1.8 2012/08/17 20:57:45 millert Exp $ .PATH: ${.CURDIR}/.. ${.CURDIR}/../auth @@ -14,26 +14,17 @@ SRCS= audit.c check.c env.c getspwuid.c interfaces.c lbuf.c logging.c \ CPPFLAGS+= -I.. BINDIR= /usr/bin -POD2MAN=/usr/bin/pod2man MAN= sudo.8 sudoers.5 MLINKS= sudo.8 sudoedit.8 -VERSION!=uname -rs -MANDATE!=date '+%B %e, %Y' CLEANFILES+= ${MAN} -sudo.8: sudo.pod - sed -f ${.CURDIR}/../varsub ${.ALLSRC} | ${POD2MAN} --quotes=none \ - --name="SUDO" --section=8 --release="${VERSION}" \ - --date="${MANDATE}" --center="OpenBSD Reference Manual" | \ - sed '1s/^/.if n .ll 78n /' > $@ - -sudoers.5: sudoers.pod - sed -f ${.CURDIR}/../varsub ${.ALLSRC} | ${POD2MAN} --quotes=none \ - --name="SUDOERS" --section=5 --release="${VERSION}" \ - --date="${MANDATE}" --center="OpenBSD Reference Manual" | \ - sed '1s/^/.if n .ll 78n /' > $@ +sudo.8: ${.CURDIR}/../varsub sudo.mdoc.in + sed -f ${.ALLSRC} > $@ + +sudoers.5: ${.CURDIR}/../varsub sudoers.mdoc.in + sed -f ${.ALLSRC} > $@ afterdepend: ${MAN} diff --git a/usr.bin/sudo/sudoers.ldap.mdoc.in b/usr.bin/sudo/sudoers.ldap.mdoc.in new file mode 100644 index 00000000000..f395522bffb --- /dev/null +++ b/usr.bin/sudo/sudoers.ldap.mdoc.in @@ -0,0 +1,809 @@ +.\" +.\" Copyright (c) 2003-2012 Todd C. Miller <Todd.Miller@courtesan.com> +.\" +.\" Permission to use, copy, modify, and distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd $Mdocdate: August 17 2012 $ +.Dt SUDOERS.LDAP @mansectsu@ +.Os +.Sh NAME +.Nm sudoers.ldap +.Nd sudo LDAP configuration +.Sh DESCRIPTION +In addition to the standard +.Em sudoers +file, +.Nm sudo +may be configured +via LDAP. +This can be especially useful for synchronizing +.Em sudoers +in a large, distributed environment. +.Pp +Using LDAP for +.Em sudoers +has several benefits: +.Bl -bullet +.It +.Nm sudo +no longer needs to read +.Em sudoers +in its entirety. +When LDAP is used, there are only two or three LDAP queries per invocation. +This makes it especially fast and particularly usable in LDAP environments. +.It +.Nm sudo +no longer exits if there is a typo in +.Em sudoers . +It is not possible to load LDAP data into the server that does +not conform to the sudoers schema, so proper syntax is guaranteed. +It is still possible to have typos in a user or host name, but +this will not prevent +.Nm sudo +from running. +.It +It is possible to specify per-entry options that override the global +default options. +.Pa @sysconfdir@/sudoers +only supports default options and limited options associated with +user/host/commands/aliases. +The syntax is complicated and can be difficult for users to understand. +Placing the options directly in the entry is more natural. +.It +The +.Nm visudo +program is no longer needed. +.Nm visudo +provides locking and syntax checking of the +.Pa @sysconfdir@/sudoers +file. +Since LDAP updates are atomic, locking is no longer necessary. +Because syntax is checked when the data is inserted into LDAP, there +is no need for a specialized tool to check syntax. +.El +.Pp +Another major difference between LDAP and file-based +.Em sudoers +is that in LDAP, +.Nm sudo Ns No -specific +Aliases are not supported. +.Pp +For the most part, there is really no need for +.Nm sudo Ns No -specific +Aliases. +Unix groups or user netgroups can be used in place of User_Aliases and +Runas_Aliases. +Host netgroups can be used in place of Host_Aliases. +Since Unix groups and netgroups can also be stored in LDAP there is no +real need for +.Nm sudo Ns No -specific +aliases. +.Pp +Cmnd_Aliases are not really required either since it is possible +to have multiple users listed in a +.Li sudoRole . +Instead of defining a Cmnd_Alias that is referenced by multiple users, +one can create a +.Li sudoRole +that contains the commands and assign multiple users to it. +.Ss SUDOers LDAP container +The +.Em sudoers +configuration is contained in the +.Li ou=SUDOers +LDAP container. +.Pp +Sudo first looks for the +.Li cn=default +entry in the SUDOers container. +If found, the multi-valued +.Li sudoOption +attribute is parsed in the same manner as a global +.Li Defaults +line in +.Pa @sysconfdir@/sudoers . +In the following example, the +.Ev SSH_AUTH_SOCK +variable will be preserved in the environment for all users. +.Bd -literal -offset 4n +dn: cn=defaults,ou=SUDOers,dc=example,dc=com +objectClass: top +objectClass: sudoRole +cn: defaults +description: Default sudoOption's go here +sudoOption: env_keep+=SSH_AUTH_SOCK +.Ed +.Pp +The equivalent of a sudoer in LDAP is a +.Li sudoRole . +It consists of the following attributes: +.Bl -tag -width 4n +.It Sy sudoUser +A user name, user ID (prefixed with +.Ql # ) , +Unix group (prefixed with +.Ql % ) , +Unix group ID (prefixed with +.Ql %# ) , +or user netgroup (prefixed with +.Ql + ) . +.It Sy sudoHost +A host name, IP address, IP network, or host netgroup (prefixed with a +.Ql + ) . +The special value +.Li ALL +will match any host. +.It Sy sudoCommand +A Unix command with optional command line arguments, potentially +including globbing characters (aka wild cards). +The special value +.Li ALL +will match any command. +If a command is prefixed with an exclamation point +.Ql \&! , +the user will be prohibited from running that command. +.It Sy sudoOption +Identical in function to the global options described above, but +specific to the +.Li sudoRole +in which it resides. +.It Sy sudoRunAsUser +A user name or uid (prefixed with +.Ql # ) +that commands may be run as or a Unix group (prefixed with a +.Ql % ) +or user netgroup (prefixed with a +.Ql + ) +that contains a list of users that commands may be run as. +The special value +.Li ALL +will match any user. +.Pp +The +.Li sudoRunAsUser +attribute is only available in +.Nm sudo +versions +1.7.0 and higher. +Older versions of +.Nm sudo +use the +.Li sudoRunAs +attribute instead. +.It Sy sudoRunAsGroup +A Unix group or gid (prefixed with +.Ql # ) +that commands may be run as. +The special value +.Li ALL +will match any group. +.Pp +The +.Li sudoRunAsGroup +attribute is only available in +.Nm sudo +versions +1.7.0 and higher. +.It Sy URI Ar ldap[s]://[hostname[:port]] ... +Specifies a whitespace-delimited list of one or more URIs describing +the LDAP server(s) to connect to. +The +.Em protocol +may be either +.Em ldap +.Em ldaps , +the latter being for servers that support TLS (SSL) encryption. +If no +.Em port +is specified, the default is port 389 for +.Li ldap:// +or port 636 for +.Li ldaps:// . +If no +.Em hostname +is specified, +.Nm sudo +will connect to +.Em localhost . +Multiple +.Sy URI +lines are treated identically to a +.Sy URI +line containing multiple entries. +Only systems using the OpenSSL libraries support the mixing of +.Li ldap:// +and +.Li ldaps:// +URIs. +Both the Netscape-derived and Tivoli LDAP libraries used on most commercial +versions of Unix are only capable of supporting one or the other. +.It Sy HOST Ar name[:port] ... +If no +.Sy URI +is specified, the +.Sy HOST +parameter specifies a whitespace-delimited list of LDAP servers to connect to. +Each host may include an optional +.Em port +separated by a colon +.Pq Ql :\& . +The +.Sy HOST +parameter is deprecated in favor of the +.Sy URI +specification and is included for backwards compatibility. +.It Sy PORT Ar port_number +If no +.Sy URI +is specified, the +.Sy PORT +parameter specifies the default port to connect to on the LDAP server if a +.Sy HOST +parameter does not specify the port itself. +If no +.Sy PORT +parameter is used, the default is port 389 for LDAP and port 636 for LDAP +over TLS (SSL). +The +.Sy PORT +parameter is deprecated in favor of the +.Sy URI +specification and is included for backwards compatibility. +.It Sy BIND_TIMELIMIT Ar seconds +The +.Sy BIND_TIMELIMIT +parameter specifies the amount of time, in seconds, to wait while trying +to connect to an LDAP server. +If multiple +.Sy URI Ns No s +or +.Sy HOST Ns No s +are specified, this is the amount of time to wait before trying +the next one in the list. +.It Sy TIMELIMIT Ar seconds +The +.Sy TIMELIMIT +parameter specifies the amount of time, in seconds, to wait for a +response to an LDAP query. +.It Sy SUDOERS_BASE Ar base +The base DN to use when performing +.Nm sudo +LDAP queries. +Typically this is of the form +.Li ou=SUDOers,dc=example,dc=com +for the domain +.Li example.com . +Multiple +.Sy SUDOERS_BASE +lines may be specified, in which case they are queried in the order specified. +.It Sy SUDOERS_DEBUG Ar debug_level +This sets the debug level for +.Nm sudo +LDAP queries. +Debugging information is printed to the standard error. +A value of 1 results in a moderate amount of debugging information. +A value of 2 shows the results of the matches themselves. +This parameter should not be set in a production environment as the +extra information is likely to confuse users. +.It Sy BINDDN Ar DN +The +.Sy BINDDN +parameter specifies the identity, in the form of a Distinguished Name (DN), +to use when performing LDAP operations. +If not specified, LDAP operations are performed with an anonymous identity. +By default, most LDAP servers will allow anonymous access. +.It Sy BINDPW Ar secret +The +.Sy BINDPW +parameter specifies the password to use when performing LDAP operations. +This is typically used in conjunction with the +.Sy BINDDN +parameter. +.It Sy ROOTBINDDN Ar DN +The +.Sy ROOTBINDDN +parameter specifies the identity, in the form of a Distinguished Name (DN), +to use when performing privileged LDAP operations, such as +.Em sudoers +queries. +The password corresponding +to the identity should be stored in +.Pa @ldap_secret@ . +If not specified, the +.Sy BINDDN +identity is used (if any). +.It Sy LDAP_VERSION Ar number +The version of the LDAP protocol to use when connecting to the server. +The default value is protocol version 3. +.It Sy SSL Ar on/true/yes/off/false/no +If the +.Sy SSL +parameter is set to +.Li on , +.Li true +.Li or +.Li yes , +TLS (SSL) encryption is always used when communicating with the LDAP server. +Typically, this involves connecting to the server on port 636 (ldaps). +.It Sy SSL Ar start_tls +If the +.Sy SSL +parameter is set to +.Li start_tls , +the LDAP server connection is initiated normally and TLS encryption is +begun before the bind credentials are sent. +This has the advantage of not requiring a dedicated port for encrypted +communications. +This parameter is only supported by LDAP servers that honor the +.Em start_tls +extension, such as the OpenLDAP and Tivoli Directory servers. +.It Sy TLS_CHECKPEER Ar on/true/yes/off/false/no +If enabled, +.Sy TLS_CHECKPEER +will cause the LDAP server's TLS certificated to be verified. +If the server's TLS certificate cannot be verified (usually because it +is signed by an unknown certificate authority), +.Nm sudo +will be unable to connect to it. +If +.Sy TLS_CHECKPEER +is disabled, no check is made. +Note that disabling the check creates an opportunity for man-in-the-middle +attacks since the server's identity will not be authenticated. +If possible, the CA's certificate should be installed locally so it can +be verified. +This option is not supported by the Tivoli Directory Server LDAP libraries. +.It Sy TLS_CACERTFILE Ar file name +The path to a certificate authority bundle which contains the certificates +for all the Certificate Authorities the client knows to be valid, e.g.\& +.Pa /etc/ssl/ca-bundle.pem . +This option is only supported by the OpenLDAP libraries. +Netscape-derived LDAP libraries use the same certificate +database for CA and client certificates (see +.Sy TLS_CERT ) . +.It Sy TLS_CACERTDIR Ar directory +Similar to +.Sy TLS_CACERTFILE +but instead of a file, it is a directory containing individual +Certificate Authority certificates, e.g.\& +.Pa /etc/ssl/certs . +The directory specified by +.Sy TLS_CACERTDIR +is checked after +.Sy TLS_CACERTFILE . +This option is only supported by the OpenLDAP libraries. +.It Sy TLS_CERT Ar file name +The path to a file containing the client certificate which can +be used to authenticate the client to the LDAP server. +The certificate type depends on the LDAP libraries used. +.Bl -tag -width 4n +.It OpenLDAP: +.Li tls_cert /etc/ssl/client_cert.pem +.It Netscape-derived: +.Li tls_cert /var/ldap/cert7.db +.It Tivoli Directory Server: +Unused, the key database specified by +.Sy TLS_KEY +contains both keys and certificates. +.Pp +When using Netscape-derived libraries, this file may also contain +Certificate Authority certificates. +.El +.It Sy TLS_KEY Ar file name +The path to a file containing the private key which matches the +certificate specified by +.Sy TLS_CERT . +The private key must not be password-protected. +The key type depends on the LDAP libraries used. +.Bl -tag -width 4n +.It OpenLDAP: +.Li tls_key /etc/ssl/client_key.pem +.It Netscape-derived: +.Li tls_key /var/ldap/key3.db +.It Tivoli Directory Server: +.Li tls_cert /usr/ldap/ldapkey.kdb +.El +When using Tivoli LDAP libraries, this file may also contain +Certificate Authority and client certificates and may be encrypted. +.It Sy TLS_KEYPW Ar secret +The +.Sy TLS_KEYPW +contains the password used to decrypt the key database on clients +using the Tivoli Directory Server LDAP library. +If no +.Sy TLS_KEYPW +is specified, a +.Em stash file +will be used if it exists. +The +.Em stash file +must have the same path as the file specified by +.Sy TLS_KEY , +but use a +.Li .sth +file extension instead of +.Li .kdb , +e.g.\& +.Li ldapkey.sth . +The default +.Li ldapkey.kdb +that ships with Tivoli Directory Server is encrypted with the password +.Li ssl_password . +This option is only supported by the Tivoli LDAP libraries. +.It Sy TLS_RANDFILE Ar file name +The +.Sy TLS_RANDFILE +parameter specifies the path to an entropy source for systems that lack +a random device. +It is generally used in conjunction with +.Em prngd +or +.Em egd . +This option is only supported by the OpenLDAP libraries. +.It Sy TLS_CIPHERS Ar cipher list +The +.Sy TLS_CIPHERS +parameter allows the administer to restrict which encryption algorithms +may be used for TLS (SSL) connections. +See the OpenLDAP or Tivoli Directory Server manual for a list of valid +ciphers. +This option is not supported by Netscape-derived libraries. +.It Sy USE_SASL Ar on/true/yes/off/false/no +Enable +.Sy USE_SASL +for LDAP servers that support SASL authentication. +.It Sy SASL_AUTH_ID Ar identity +The SASL user name to use when connecting to the LDAP server. +By default, +.Nm sudo +will use an anonymous connection. +.It Sy ROOTUSE_SASL Ar on/true/yes/off/false/no +Enable +.Sy ROOTUSE_SASL +to enable SASL authentication when connecting +to an LDAP server from a privileged process, such as +.Nm sudo . +.It Sy ROOTSASL_AUTH_ID Ar identity +The SASL user name to use when +.Sy ROOTUSE_SASL +is enabled. +.It Sy SASL_SECPROPS Ar none/properties +SASL security properties or +.Em none +for no properties. +See the SASL programmer's manual for details. +.It Sy KRB5_CCNAME Ar file name +The path to the Kerberos 5 credential cache to use when authenticating +with the remote server. +.El +.Pp +See the +.Pa ldap.conf +entry in the +.Sx EXAMPLES +section. +.Ss Configuring nsswitch.conf +Unless it is disabled at build time, +.Nm sudo +consults the Name Service Switch file, +.Pa @nsswitch_conf@ , +to specify the +.Em sudoers +search order. +Sudo looks for a line beginning with +.Li sudoers : +and uses this to determine the search order. +Note that +.Nm sudo +does +not stop searching after the first match and later matches take +precedence over earlier ones. +The following sources are recognized: +.Pp +.Bl -tag -width 8n -offset 4n -compact +.It files +read sudoers from +.Pa @sysconfdir@/sudoers +.It ldap +read sudoers from LDAP +.El +.Pp +In addition, the entry +.Li [NOTFOUND=return] +will short-circuit the search if the user was not found in the +preceding source. +.Pp +To consult LDAP first followed by the local sudoers file (if it +exists), use: +.Bd -literal -offset 4n +sudoers: ldap files +.Ed +.Pp +The local +.Em sudoers +file can be ignored completely by using: +.Bd -literal -offset 4n +sudoers: ldap +.Ed +.Pp +If the +.Pa @nsswitch_conf@ +file is not present or there is no sudoers line, the following +default is assumed: +.Bd -literal -offset 4n +sudoers: files +.Ed +.Pp +Note that +.Pa @nsswitch_conf@ +is supported even when the underlying operating system does not use +an nsswitch.conf file, except on AIX (see below). +.Ss Configuring netsvc.conf +On AIX systems, the +.Pa @netsvc_conf@ +file is consulted instead of +.Pa @nsswitch_conf@ . +.Nm sudo +simply treats +.Pa netsvc.conf +as a variant of +.Pa nsswitch.conf ; +information in the previous section unrelated to the file format +itself still applies. +.Pp +To consult LDAP first followed by the local sudoers file (if it +exists), use: +.Bd -literal -offset 4n +sudoers = ldap, files +.Ed +.Pp +The local +.Em sudoers +file can be ignored completely by using: +.Bd -literal -offset 4n +sudoers = ldap +.Ed +.Pp +To treat LDAP as authoratative and only use the local sudoers file +if the user is not present in LDAP, use: +.Bd -literal -offset 4n +sudoers = ldap = auth, files +.Ed +.Pp +Note that in the above example, the +.Li auth +qualfier only affects user lookups; both LDAP and +.Em sudoers +will be queried for +.Li Defaults +entries. +.Pp +If the +.Pa @netsvc_conf@ +file is not present or there is no sudoers line, the following +default is assumed: +.Bd -literal -offset 4n +sudoers = files +.Ed +.Sh FILES +.Bl -tag -width 24n +.It Pa @ldap_conf@ +LDAP configuration file +.It Pa @nsswitch_conf@ +determines sudoers source order +.It Pa @netsvc_conf@ +determines sudoers source order on AIX +.El +.Sh EXAMPLES +.Ss Example ldap.conf +.Bd -literal -offset 2n +# Either specify one or more URIs or one or more host:port pairs. +# If neither is specified sudo will default to localhost, port 389. +# +#host ldapserver +#host ldapserver1 ldapserver2:390 +# +# Default port if host is specified without one, defaults to 389. +#port 389 +# +# URI will override the host and port settings. +uri ldap://ldapserver +#uri ldaps://secureldapserver +#uri ldaps://secureldapserver ldap://ldapserver +# +# The amount of time, in seconds, to wait while trying to connect to +# an LDAP server. +bind_timelimit 30 +# +# The amount of time, in seconds, to wait while performing an LDAP query. +timelimit 30 +# +# Must be set or sudo will ignore LDAP; may be specified multiple times. +sudoers_base ou=SUDOers,dc=example,dc=com +# +# verbose sudoers matching from ldap +#sudoers_debug 2 +# +# optional proxy credentials +#binddn <who to search as> +#bindpw <password> +#rootbinddn <who to search as, uses /etc/ldap.secret for bindpw> +# +# LDAP protocol version, defaults to 3 +#ldap_version 3 +# +# Define if you want to use an encrypted LDAP connection. +# Typically, you must also set the port to 636 (ldaps). +#ssl on +# +# Define if you want to use port 389 and switch to +# encryption before the bind credentials are sent. +# Only supported by LDAP servers that support the start_tls +# extension such as OpenLDAP. +#ssl start_tls +# +# Additional TLS options follow that allow tweaking of the +# SSL/TLS connection. +# +#tls_checkpeer yes # verify server SSL certificate +#tls_checkpeer no # ignore server SSL certificate +# +# If you enable tls_checkpeer, specify either tls_cacertfile +# or tls_cacertdir. Only supported when using OpenLDAP. +# +#tls_cacertfile /etc/certs/trusted_signers.pem +#tls_cacertdir /etc/certs +# +# For systems that don't have /dev/random +# use this along with PRNGD or EGD.pl to seed the +# random number pool to generate cryptographic session keys. +# Only supported when using OpenLDAP. +# +#tls_randfile /etc/egd-pool +# +# You may restrict which ciphers are used. Consult your SSL +# documentation for which options go here. +# Only supported when using OpenLDAP. +# +#tls_ciphers <cipher-list> +# +# Sudo can provide a client certificate when communicating to +# the LDAP server. +# Tips: +# * Enable both lines at the same time. +# * Do not password protect the key file. +# * Ensure the keyfile is only readable by root. +# +# For OpenLDAP: +#tls_cert /etc/certs/client_cert.pem +#tls_key /etc/certs/client_key.pem +# +# For SunONE or iPlanet LDAP, tls_cert and tls_key may specify either +# a directory, in which case the files in the directory must have the +# default names (e.g. cert8.db and key4.db), or the path to the cert +# and key files themselves. However, a bug in version 5.0 of the LDAP +# SDK will prevent specific file names from working. For this reason +# it is suggested that tls_cert and tls_key be set to a directory, +# not a file name. +# +# The certificate database specified by tls_cert may contain CA certs +# and/or the client's cert. If the client's cert is included, tls_key +# should be specified as well. +# For backward compatibility, "sslpath" may be used in place of tls_cert. +#tls_cert /var/ldap +#tls_key /var/ldap +# +# If using SASL authentication for LDAP (OpenSSL) +# use_sasl yes +# sasl_auth_id <SASL user name> +# rootuse_sasl yes +# rootsasl_auth_id <SASL user name for root access> +# sasl_secprops none +# krb5_ccname /etc/.ldapcache +.Ed +.Ss Sudo schema for OpenLDAP +The following schema, in OpenLDAP format, is included with +.Nm sudo +source and binary distributions as +.Pa schema.OpenLDAP . +Simply copy +it to the schema directory (e.g.\& +.Pa /etc/openldap/schema ) , +add the proper +.Li include +line in +.Pa slapd.conf +and restart +.Nm slapd . +.Bd -literal -offset 2n +attributetype ( 1.3.6.1.4.1.15953.9.1.1 + NAME 'sudoUser' + DESC 'User(s) who may run sudo' + EQUALITY caseExactIA5Match + SUBSTR caseExactIA5SubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) + +attributetype ( 1.3.6.1.4.1.15953.9.1.2 + NAME 'sudoHost' + DESC 'Host(s) who may run sudo' + EQUALITY caseExactIA5Match + SUBSTR caseExactIA5SubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) + +attributetype ( 1.3.6.1.4.1.15953.9.1.3 + NAME 'sudoCommand' + DESC 'Command(s) to be executed by sudo' + EQUALITY caseExactIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) + +attributetype ( 1.3.6.1.4.1.15953.9.1.4 + NAME 'sudoRunAs' + DESC 'User(s) impersonated by sudo' + EQUALITY caseExactIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) + +attributetype ( 1.3.6.1.4.1.15953.9.1.5 + NAME 'sudoOption' + DESC 'Options(s) followed by sudo' + EQUALITY caseExactIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) + +attributetype ( 1.3.6.1.4.1.15953.9.1.6 + NAME 'sudoRunAsUser' + DESC 'User(s) impersonated by sudo' + EQUALITY caseExactIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) + +attributetype ( 1.3.6.1.4.1.15953.9.1.7 + NAME 'sudoRunAsGroup' + DESC 'Group(s) impersonated by sudo' + EQUALITY caseExactIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) + +objectclass ( 1.3.6.1.4.1.15953.9.2.1 NAME 'sudoRole' SUP top STRUCTURAL + DESC 'Sudoer Entries' + MUST ( cn ) + MAY ( sudoUser $ sudoHost $ sudoCommand $ sudoRunAs $ sudoRunAsUser $ + sudoRunAsGroup $ sudoOption $ description ) + ) +.Ed +.Sh SEE ALSO +.Xr ldap.conf @mansectsu@ , +.Xr sudoers @mansectsu@ +.Sh CAVEATS +Note that there are differences in the way that LDAP-based +.Em sudoers +is parsed compared to file-based +.Em sudoers . +See the +.Sx Differences between LDAP and non-LDAP sudoers +section for more information. +.Sh BUGS +If you feel you have found a bug in +.Nm sudo , +please submit a bug report at http://www.sudo.ws/sudo/bugs/ +.Sh SUPPORT +Limited free support is available via the sudo-users mailing list, +see http://www.sudo.ws/mailman/listinfo/sudo-users to subscribe or +search the archives. +.Sh DISCLAIMER +.Nm sudo +is provided +.Dq AS IS +and any express or implied warranties, including, but not limited +to, the implied warranties of merchantability and fitness for a +particular purpose are disclaimed. +See the LICENSE file distributed with +.Nm sudo +or http://www.sudo.ws/sudo/license.html for complete details. diff --git a/usr.bin/sudo/sudoers.ldap.pod b/usr.bin/sudo/sudoers.ldap.pod deleted file mode 100644 index a194651ca28..00000000000 --- a/usr.bin/sudo/sudoers.ldap.pod +++ /dev/null @@ -1,730 +0,0 @@ -Copyright (c) 2003-2009 - Todd C. Miller <Todd.Miller@courtesan.com> - -Permission to use, copy, modify, and distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -=pod - -=head1 NAME - -sudoers.ldap - sudo LDAP configuration - -=head1 DESCRIPTION - -In addition to the standard I<sudoers> file, B<sudo> may be configured -via LAP. This can be especially useful for synchronizing I<sudoers> -in a large, distributed environment. - -Using LDAP for I<sudoers> has several benefits: - -=over 4 - -=item * - -B<sudo> no longer needs to read I<sudoers> in its entirety. When -LDAP is used, there are only two or three LDAP queries per invocation. -This makes it especially fast and particularly usable in LDAP -environments. - -=item * - -B<sudo> no longer exits if there is a typo in I<sudoers>. -It is not possible to load LDAP data into the server that does -not conform to the sudoers schema, so proper syntax is guaranteed. -It is still possible to have typos in a user or host name, but -this will not prevent B<sudo> from running. - -=item * - -It is possible to specify per-entry options that override the global -default options. F<@sysconfdir@/sudoers> only supports default options and -limited options associated with user/host/commands/aliases. The -syntax is complicated and can be difficult for users to understand. -Placing the options directly in the entry is more natural. - -=item * - -The B<visudo> program is no longer needed. B<visudo> provides -locking and syntax checking of the F<@sysconfdir@/sudoers> file. -Since LDAP updates are atomic, locking is no longer necessary. -Because syntax is checked when the data is inserted into LDAP, there -is no need for a specialized tool to check syntax. - -=back - -Another major difference between LDAP and file-based I<sudoers> -is that in LDAP, B<sudo>-specific Aliases are not supported. - -For the most part, there is really no need for B<sudo>-specific -Aliases. Unix groups or user netgroups can be used in place of -User_Aliases and RunasAliases. Host netgroups can be used in place -of HostAliases. Since Unix groups and netgroups can also be stored -in LDAP there is no real need for B<sudo>-specific aliases. - -Cmnd_Aliases are not really required either since it is possible -to have multiple users listed in a sudoRole. Instead of defining -a Cmnd_Alias that is referenced by multiple users, one can create -a sudoRole that contains the commands and assign multiple users -to it. - -=head2 SUDOers LDAP container - -The I<sudoers> configuration is contained in the C<ou=SUDOers> LDAP -container. - -Sudo first looks for the C<cn=default> entry in the SUDOers container. -If found, the multi-valued C<sudoOption> attribute is parsed in the -same manner as a global C<Defaults> line in F<@sysconfdir@/sudoers>. In -the following example, the C<SSH_AUTH_SOCK> variable will be preserved -in the environment for all users. - - dn: cn=defaults,ou=SUDOers,dc=example,dc=com - objectClass: top - objectClass: sudoRole - cn: defaults - description: Default sudoOption's go here - sudoOption: env_keep+=SSH_AUTH_SOCK - -The equivalent of a sudoer in LDAP is a C<sudoRole>. It consists of -the following components: - -=over 4 - -=item B<sudoUser> - -A user name, uid (prefixed with C<'#'>), Unix group (prefixed with -a C<'%'>) or user netgroup (prefixed with a C<'+'>). - -=item B<sudoHost> - -A host name, IP address, IP network, or host netgroup (prefixed -with a C<'+'>). -The special value C<ALL> will match any host. - -=item B<sudoCommand> - -A Unix command with optional command line arguments, potentially -including globbing characters (aka wild cards). -The special value C<ALL> will match any command. -If a command is prefixed with an exclamation point C<'!'>, the -user will be prohibited from running that command. - -=item B<sudoOption> - -Identical in function to the global options described above, but -specific to the C<sudoRole> in which it resides. - -=item B<sudoRunAsUser> - -A user name or uid (prefixed with C<'#'>) that commands may be run -as or a Unix group (prefixed with a C<'%'>) or user netgroup (prefixed -with a C<'+'>) that contains a list of users that commands may be -run as. -The special value C<ALL> will match any user. - -=item B<sudoRunAsGroup> - -A Unix group or gid (prefixed with C<'#'>) that commands may be run as. -The special value C<ALL> will match any group. - -=back - -Each component listed above should contain a single value, but there -may be multiple instances of each component type. A sudoRole must -contain at least one C<sudoUser>, C<sudoHost> and C<sudoCommand>. - -The following example allows users in group wheel to run any command -on any host via B<sudo>: - - dn: cn=%wheel,ou=SUDOers,dc=example,dc=com - objectClass: top - objectClass: sudoRole - cn: %wheel - sudoUser: %wheel - sudoHost: ALL - sudoCommand: ALL - -=head2 Anatomy of LDAP sudoers lookup - -When looking up a sudoer using LDAP there are only two or three -LDAP queries per invocation. The first query is to parse the global -options. The second is to match against the user's name and the -groups that the user belongs to. (The special ALL tag is matched -in this query too.) If no match is returned for the user's name -and groups, a third query returns all entries containing user -netgroups and checks to see if the user belongs to any of them. - -=head2 Differences between LDAP and non-LDAP sudoers - -There are some subtle differences in the way sudoers is handled -once in LDAP. Probably the biggest is that according to the RFC, -LDAP ordering is arbitrary and you cannot expect that Attributes -and Entries are returned in any specific order. If there are -conflicting command rules on an entry, the negative takes precedence. -This is called paranoid behavior (not necessarily the most specific -match). - -Here is an example: - - # /etc/sudoers: - # Allow all commands except shell - johnny ALL=(root) ALL,!/bin/sh - # Always allows all commands because ALL is matched last - puddles ALL=(root) !/bin/sh,ALL - - # LDAP equivalent of johnny - # Allows all commands except shell - dn: cn=role1,ou=Sudoers,dc=my-domain,dc=com - objectClass: sudoRole - objectClass: top - cn: role1 - sudoUser: johnny - sudoHost: ALL - sudoCommand: ALL - sudoCommand: !/bin/sh - - # LDAP equivalent of puddles - # Notice that even though ALL comes last, it still behaves like - # role1 since the LDAP code assumes the more paranoid configuration - dn: cn=role2,ou=Sudoers,dc=my-domain,dc=com - objectClass: sudoRole - objectClass: top - cn: role2 - sudoUser: puddles - sudoHost: ALL - sudoCommand: !/bin/sh - sudoCommand: ALL - -Another difference is that negations on the Host, User or Runas are -currently ignorred. For example, the following attributes do not -behave the way one might expect. - - # does not match all but joe - # rather, does not match anyone - sudoUser: !joe - - # does not match all but joe - # rather, matches everyone including Joe - sudoUser: ALL - sudoUser: !joe - - # does not match all but web01 - # rather, matches all hosts including web01 - sudoHost: ALL - sudoHost: !web01 - -=head2 Sudoers Schema - -In order to use B<sudo>'s LDAP support, the B<sudo> schema must be -installed on your LDAP server. In addition, be sure to index the -'sudoUser' attribute. - -Three versions of the schema: one for OpenLDAP servers (F<schema.OpenLDAP>), -one for Netscape-derived servers (F<schema.iPlanet>), and one for -Microsoft Active Directory (F<schema.ActiveDirectory>) may -be found in the B<sudo> distribution. - -The schema for B<sudo> in OpenLDAP form is included in the L<EXAMPLES> -section. - -=head2 Configuring ldap.conf - -Sudo reads the F<@ldap_conf@> file for LDAP-specific configuration. -Typically, this file is shared amongst different LDAP-aware clients. -As such, most of the settings are not B<sudo>-specific. Note that -B<sudo> parses F<@ldap_conf@> itself and may support options -that differ from those described in the L<ldap.conf(5)> manual. - -Also note that on systems using the OpenLDAP libraries, default -values specified in F</etc/openldap/ldap.conf> or the user's -F<.ldaprc> files are not used. - -Only those options explicitly listed in F<@ldap_conf@> that are -supported by B<sudo> are honored. Configuration options are listed -below in upper case but are parsed in a case-independent manner. - -=over 4 - -=item B<URI> ldap[s]://[hostname[:port]] ... - -Specifies a whitespace-delimited list of one or more URIs describing -the LDAP server(s) to connect to. The I<protocol> may be either B<ldap> -or B<ldaps>, the latter being for servers that support TLS (SSL) -encryption. If no I<port> is specified, the default is port 389 for -C<ldap://> or port 636 for C<ldaps://>. If no I<hostname> is specified, -B<sudo> will connect to B<localhost>. Only systems using the OpenSSL -libraries support the mixing of C<ldap://> and C<ldaps://> URIs. -The Netscape-derived libraries used on most commercial versions of -Unix are only capable of supporting one or the other. - -=item B<HOST> name[:port] ... - -If no B<URI> is specified, the B<HOST> parameter specifies a -whitespace-delimited list of LDAP servers to connect to. Each host -may include an optional I<port> separated by a colon (':'). The -B<HOST> parameter is deprecated in favor of the B<URI> specification -and is included for backwards compatibility. - -=item B<PORT> port_number - -If no B<URI> is specified, the B<PORT> parameter specifies the -default port to connect to on the LDAP server if a B<HOST> parameter -does not specify the port itself. If no B<PORT> parameter is used, -the default is port 389 for LDAP and port 636 for LDAP over TLS -(SSL). The B<PORT> parameter is deprecated in favor of the B<URI> -specification and is included for backwards compatibility. - -=item B<BIND_TIMELIMIT> seconds - -The B<BIND_TIMELIMIT> parameter specifies the amount of time, in seconds, -to wait while trying to connect to an LDAP server. If multiple B<URI>s or -B<HOST>s are specified, this is the amount of time to wait before trying -the next one in the list. - -=item B<TIMELIMIT> seconds - -The B<TIMELIMIT> parameter specifies the amount of time, in seconds, -to wait for a response to an LDAP query. - -=item B<SUDOERS_BASE> base - -The base DN to use when performing B<sudo> LDAP queries. Typically -this is of the form C<ou=SUDOers,dc=example,dc=com> for the domain -C<example.com>. - -=item B<SUDOERS_DEBUG> debug_level - -This sets the debug level for B<sudo> LDAP queries. Debugging -information is printed to the standard error. A value of 1 results -in a moderate amount of debugging information. A value of 2 shows -the results of the matches themselves. This parameter should not -be set in a production environment as the extra information is -likely to confuse users. - -=item B<BINDDN> DN - -The B<BINDDN> parameter specifies the identity, in the form of a -Distinguished Name (DN), to use when performing LDAP operations. -If not specified, LDAP operations are performed with an anonymous -identity. By default, most LDAP servers will allow anonymous access. - -=item B<BINDPW> secret - -The B<BINDPW> parameter specifies the password to use when performing -LDAP operations. This is typically used in conjunction with the -B<BINDDN> parameter. - -=item B<ROOTBINDDN> DN - -The B<ROOTBINDDN> parameter specifies the identity, in the form of -a Distinguished Name (DN), to use when performing privileged LDAP -operations, such as I<sudoers> queries. The password corresponding -to the identity should be stored in F<@ldap_secret@>. -If not specified, the B<BINDDN> identity is used (if any). - -=item B<LDAP_VERSION> number - -The version of the LDAP protocol to use when connecting to the server. -The default value is protocol version 3. - -=item B<SSL> on/true/yes/off/false/no - -If the B<SSL> parameter is set to C<on>, C<true> or C<yes>, TLS -(SSL) encryption is always used when communicating with the LDAP -server. Typically, this involves connecting to the server on port -636 (ldaps). - -=item B<SSL> start_tls - -If the B<SSL> parameter is set to C<start_tls>, the LDAP server -connection is initiated normally and TLS encryption is begun before -the bind credentials are sent. This has the advantage of not -requiring a dedicated port for encrypted communications. This -parameter is only supported by LDAP servers that honor the C<start_tls> -extension, such as the OpenLDAP server. - -=item B<TLS_CHECKPEER> on/true/yes/off/false/no - -If enabled, B<TLS_CHECKPEER> will cause the LDAP server's TLS -certificated to be verified. If the server's TLS certificate cannot -be verified (usually because it is signed by an unknown certificate -authority), B<sudo> will be unable to connect to it. If B<TLS_CHECKPEER> -is disabled, no check is made. - -=item B<TLS_CACERTFILE> file name - -The path to a certificate authority bundle which contains the certificates -for all the Certificate Authorities the client knows to be valid, -e.g. F</etc/ssl/ca-bundle.pem>. -This option is only supported by the OpenLDAP libraries. - -=item B<TLS_CACERTDIR> directory - -Similar to B<TLS_CACERTFILE> but instead of a file, it is a -directory containing individual Certificate Authority certificates, -e.g. F</etc/ssl/certs>. -The directory specified by B<TLS_CACERTDIR> is checked after -B<TLS_CACERTFILE>. -This option is only supported by the OpenLDAP libraries. - -=item B<TLS_CERT> file name - -The path to a file containing the client certificate which can -be used to authenticate the client to the LDAP server. -The certificate type depends on the LDAP libraries used. - -OpenLDAP: - C<tls_cert /etc/ssl/client_cert.pem> - -Netscape-derived: - C<tls_cert /var/ldap/cert7.db> - -When using Netscape-derived libraries, this file may also contain -Certificate Authority certificates. - -=item B<TLS_KEY> file name - -The path to a file containing the private key which matches the -certificate specified by B<TLS_CERT>. The private key must not be -password-protected. The key type depends on the LDAP libraries -used. - -OpenLDAP: - C<tls_key /etc/ssl/client_key.pem> - -Netscape-derived: - C<tls_key /var/ldap/key3.db> - -=item B<TLS_RANDFILE> file name - -The B<TLS_RANDFILE> parameter specifies the path to an entropy -source for systems that lack a random device. It is generally used -in conjunction with I<prngd> or I<egd>. -This option is only supported by the OpenLDAP libraries. - -=item B<TLS_CIPHERS> cipher list - -The B<TLS_CIPHERS> parameter allows the administer to restrict -which encryption algorithms may be used for TLS (SSL) connections. -See the OpenSSL manual for a list of valid ciphers. -This option is only supported by the OpenLDAP libraries. - -=item B<USE_SASL> on/true/yes/off/false/no - -Enable B<USE_SASL> for LDAP servers that support SASL authentication. - -=item B<SASL_AUTH_ID> identity - -The SASL user name to use when connecting to the LDAP server. -By default, B<sudo> will use an anonymous connection. - -=item B<ROOTUSE_SASL> on/true/yes/off/false/no - -Enable B<ROOTUSE_SASL> to enable SASL authentication when connecting -to an LDAP server from a privileged process, such as B<sudo>. - -=item B<ROOTSASL_AUTH_ID> identity - -The SASL user name to use when B<ROOTUSE_SASL> is enabled. - -=item B<SASL_SECPROPS> none/properties - -SASL security properties or I<none> for no properties. See the -SASL programmer's manual for details. - -=item B<KRB5_CCNAME> file name - -The path to the Kerberos 5 credential cache to use when authenticating -with the remote server. - -=back - -See the C<ldap.conf> entry in the L<EXAMPLES> section. - -=head2 Configuring nsswitch.conf - -Unless it is disabled at build time, B<sudo> consults the Name -Service Switch file, F<@nsswitch_conf@>, to specify the I<sudoers> -search order. Sudo looks for a line beginning with C<sudoers>: and -uses this to determine the search order. Note that B<sudo> does -not stop searching after the first match and later matches take -precedence over earlier ones. - -The following sources are recognized: - - files read sudoers from F<@sysconfdir@/sudoers> - ldap read sudoers from LDAP - -In addition, the entry C<[NOTFOUND=return]> will short-circuit the -search if the user was not found in the preceding source. - -To consult LDAP first followed by the local sudoers file (if it -exists), use: - - sudoers: ldap files - -The local I<sudoers> file can be ignored completely by using: - - sudoers: ldap - -If the F<@nsswitch_conf@> file is not present or there is no -sudoers line, the following default is assumed: - - sudoers: files - -Note that F<@nsswitch_conf@> is supported even when the underlying -operating system does not use an nsswitch.conf file. - -=head2 Configuring netsvc.conf - -On AIX systems, the F<@netsvc_conf@> file is consulted instead of -F<@nsswitch_conf@>. B<sudo> simply treats I<netsvc.conf> as a -variant of I<nsswitch.conf>; information in the previous section -unrelated to the file format itself still applies. - -To consult LDAP first followed by the local sudoers file (if it -exists), use: - - sudoers = ldap, files - -The local I<sudoers> file can be ignored completely by using: - - sudoers = ldap - -To treat LDAP as authoratative and only use the local sudoers file -if the user is not present in LDAP, use: - - sudoers = ldap = auth, files - -Note that in the above example, the C<auth> qualfier only affects -user lookups; both LDAP and I<sudoers> will be queried for C<Defaults> -entries. - -If the F<@netsvc_conf@> file is not present or there is no -sudoers line, the following default is assumed: - - sudoers = files - -=head1 FILES - -=over 24 - -=item F<@ldap_conf@> - -LDAP configuration file - -=item F<@nsswitch_conf@> - -determines sudoers source order - -=item F<@netsvc_conf@> - -determines sudoers source order on AIX - -=back - -=head1 EXAMPLES - -=head2 Example ldap.conf - - # Either specify one or more URIs or one or more host:port pairs. - # If neither is specified sudo will default to localhost, port 389. - # - #host ldapserver - #host ldapserver1 ldapserver2:390 - # - # Default port if host is specified without one, defaults to 389. - #port 389 - # - # URI will override the host and port settings. - uri ldap://ldapserver - #uri ldaps://secureldapserver - #uri ldaps://secureldapserver ldap://ldapserver - # - # The amount of time, in seconds, to wait while trying to connect to - # an LDAP server. - bind_timelimit 30 - # - # The amount of time, in seconds, to wait while performing an LDAP query. - timelimit 30 - # - # must be set or sudo will ignore LDAP - sudoers_base ou=SUDOers,dc=example,dc=com - # - # verbose sudoers matching from ldap - #sudoers_debug 2 - # - # optional proxy credentials - #binddn <who to search as> - #bindpw <password> - #rootbinddn <who to search as, uses /etc/ldap.secret for bindpw> - # - # LDAP protocol version, defaults to 3 - #ldap_version 3 - # - # Define if you want to use an encrypted LDAP connection. - # Typically, you must also set the port to 636 (ldaps). - #ssl on - # - # Define if you want to use port 389 and switch to - # encryption before the bind credentials are sent. - # Only supported by LDAP servers that support the start_tls - # extension such as OpenLDAP. - #ssl start_tls - # - # Additional TLS options follow that allow tweaking of the - # SSL/TLS connection. - # - #tls_checkpeer yes # verify server SSL certificate - #tls_checkpeer no # ignore server SSL certificate - # - # If you enable tls_checkpeer, specify either tls_cacertfile - # or tls_cacertdir. Only supported when using OpenLDAP. - # - #tls_cacertfile /etc/certs/trusted_signers.pem - #tls_cacertdir /etc/certs - # - # For systems that don't have /dev/random - # use this along with PRNGD or EGD.pl to seed the - # random number pool to generate cryptographic session keys. - # Only supported when using OpenLDAP. - # - #tls_randfile /etc/egd-pool - # - # You may restrict which ciphers are used. Consult your SSL - # documentation for which options go here. - # Only supported when using OpenLDAP. - # - #tls_ciphers <cipher-list> - # - # Sudo can provide a client certificate when communicating to - # the LDAP server. - # Tips: - # * Enable both lines at the same time. - # * Do not password protect the key file. - # * Ensure the keyfile is only readable by root. - # - # For OpenLDAP: - #tls_cert /etc/certs/client_cert.pem - #tls_key /etc/certs/client_key.pem - # - # For SunONE or iPlanet LDAP, tls_cert and tls_key may specify either - # a directory, in which case the files in the directory must have the - # default names (e.g. cert8.db and key4.db), or the path to the cert - # and key files themselves. However, a bug in version 5.0 of the LDAP - # SDK will prevent specific file names from working. For this reason - # it is suggested that tls_cert and tls_key be set to a directory, - # not a file name. - # - # The certificate database specified by tls_cert may contain CA certs - # and/or the client's cert. If the client's cert is included, tls_key - # should be specified as well. - # For backward compatibility, "sslpath" may be used in place of tls_cert. - #tls_cert /var/ldap - #tls_key /var/ldap - # - # If using SASL authentication for LDAP (OpenSSL) - # use_sasl yes - # sasl_auth_id <SASL username> - # rootuse_sasl yes - # rootsasl_auth_id <SASL username for root access> - # sasl_secprops none - # krb5_ccname /etc/.ldapcache - -=head2 Sudo schema for OpenLDAP - -The following schema is in OpenLDAP format. Simply copy it to the -schema directory (e.g. F</etc/openldap/schema>), add the proper -C<include> line in C<slapd.conf> and restart B<slapd>. - - attributetype ( 1.3.6.1.4.1.15953.9.1.1 - NAME 'sudoUser' - DESC 'User(s) who may run sudo' - EQUALITY caseExactIA5Match - SUBSTR caseExactIA5SubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) - - attributetype ( 1.3.6.1.4.1.15953.9.1.2 - NAME 'sudoHost' - DESC 'Host(s) who may run sudo' - EQUALITY caseExactIA5Match - SUBSTR caseExactIA5SubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) - - attributetype ( 1.3.6.1.4.1.15953.9.1.3 - NAME 'sudoCommand' - DESC 'Command(s) to be executed by sudo' - EQUALITY caseExactIA5Match - SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) - - attributetype ( 1.3.6.1.4.1.15953.9.1.4 - NAME 'sudoRunAs' - DESC 'User(s) impersonated by sudo' - EQUALITY caseExactIA5Match - SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) - - attributetype ( 1.3.6.1.4.1.15953.9.1.5 - NAME 'sudoOption' - DESC 'Options(s) followed by sudo' - EQUALITY caseExactIA5Match - SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) - - attributetype ( 1.3.6.1.4.1.15953.9.1.6 - NAME 'sudoRunAsUser' - DESC 'User(s) impersonated by sudo' - EQUALITY caseExactIA5Match - SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) - - attributetype ( 1.3.6.1.4.1.15953.9.1.7 - NAME 'sudoRunAsGroup' - DESC 'Group(s) impersonated by sudo' - EQUALITY caseExactIA5Match - SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) - - objectclass ( 1.3.6.1.4.1.15953.9.2.1 NAME 'sudoRole' SUP top STRUCTURAL - DESC 'Sudoer Entries' - MUST ( cn ) - MAY ( sudoUser $ sudoHost $ sudoCommand $ sudoRunAs $ sudoRunAsUser $ - sudoRunAsGroup $ sudoOption $ description ) - ) - -=head1 SEE ALSO - -L<ldap.conf(5)>, L<sudoers(5)> - -=head1 CAVEATS - -The way that I<sudoers> is parsed differs between Note that there -are differences in the way that LDAP-based I<sudoers> is parsed -compared to file-based I<sudoers>. See the L<Differences between -LDAP and non-LDAP sudoers> section for more information. - -=head1 BUGS - -If you feel you have found a bug in B<sudo>, please submit a bug report -at http://www.sudo.ws/sudo/bugs/ - -=head1 SUPPORT - -Limited free support is available via the sudo-users mailing list, -see http://www.sudo.ws/mailman/listinfo/sudo-users to subscribe or -search the archives. - -=head1 DISCLAIMER - -B<sudo> is provided ``AS IS'' and any express or implied warranties, -including, but not limited to, the implied warranties of merchantability -and fitness for a particular purpose are disclaimed. See the LICENSE -file distributed with B<sudo> or http://www.sudo.ws/sudo/license.html -for complete details. diff --git a/usr.bin/sudo/sudoers.mdoc.in b/usr.bin/sudo/sudoers.mdoc.in new file mode 100644 index 00000000000..5d4d6a1ccc9 --- /dev/null +++ b/usr.bin/sudo/sudoers.mdoc.in @@ -0,0 +1,2772 @@ +.\" +.\" Copyright (c) 1994-1996, 1998-2005, 2007-2012 +.\" Todd C. Miller <Todd.Miller@courtesan.com> +.\" +.\" Permission to use, copy, modify, and distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.\" Sponsored in part by the Defense Advanced Research Projects +.\" Agency (DARPA) and Air Force Research Laboratory, Air Force +.\" Materiel Command, USAF, under agreement number F39502-99-1-0512. +.\" +.Dd $Mdocdate: August 17 2012 $ +.Dt SUDOERS @mansectform@ +.Os +.Sh NAME +.Nm sudoers +.Nd list of which users may execute what +.Sh DESCRIPTION +The +.Em sudoers +file is composed of two types of entries: aliases +(basically variables) and user specifications (which specify who +may run what). +.Pp +When multiple entries match for a user, they are applied in order. +Where there are multiple matches, the last match is used (which is +not necessarily the most specific match). +.Pp +The +.Em sudoers +grammar will be described below in Extended Backus-Naur +Form (EBNF). +Don't despair if you are unfamiliar with EBNF; it is fairly simple, +and the definitions below are annotated. +.Ss Quick guide to EBNF +EBNF is a concise and exact way of describing the grammar of a language. +Each EBNF definition is made up of +.Em production rules . +E.g., +.Pp +.Li symbol ::= definition | alternate1 | alternate2 ... +.Pp +Each +.Em production rule +references others and thus makes up a +grammar for the language. +EBNF also contains the following +operators, which many readers will recognize from regular +expressions. +Do not, however, confuse them with +.Dq wildcard +characters, which have different meanings. +.Bl -tag -width 4n +.It Li \&? +Means that the preceding symbol (or group of symbols) is optional. +That is, it may appear once or not at all. +.It Li * +Means that the preceding symbol (or group of symbols) may appear +zero or more times. +.It Li + +Means that the preceding symbol (or group of symbols) may appear +one or more times. +.El +.Pp +Parentheses may be used to group symbols together. +For clarity, +we will use single quotes +.Pq '' +to designate what is a verbatim character string (as opposed to a symbol name). +.Ss Aliases +There are four kinds of aliases: +.Li User_Alias , +.Li Runas_Alias , +.Li Host_Alias +and +.Li Cmnd_Alias . +.Bd -literal +Alias ::= 'User_Alias' User_Alias (':' User_Alias)* | + 'Runas_Alias' Runas_Alias (':' Runas_Alias)* | + 'Host_Alias' Host_Alias (':' Host_Alias)* | + 'Cmnd_Alias' Cmnd_Alias (':' Cmnd_Alias)* + +User_Alias ::= NAME '=' User_List + +Runas_Alias ::= NAME '=' Runas_List + +Host_Alias ::= NAME '=' Host_List + +Cmnd_Alias ::= NAME '=' Cmnd_List + +NAME ::= [A-Z]([A-Z][0-9]_)* +.Ed +.Pp +Each +.Em alias +definition is of the form +.Bd -literal +Alias_Type NAME = item1, item2, ... +.Ed +.Pp +where +.Em Alias_Type +is one of +.Li User_Alias , +.Li Runas_Alias , +.Li Host_Alias , +or +.Li Cmnd_Alias . +A +.Li NAME +is a string of uppercase letters, numbers, +and underscore characters +.Pq Ql _ . +A +.Li NAME +.Sy must +start with an +uppercase letter. +It is possible to put several alias definitions +of the same type on a single line, joined by a colon +.Pq Ql :\& . +E.g., +.Bd -literal +Alias_Type NAME = item1, item2, item3 : NAME = item4, item5 +.Ed +.Pp +The definitions of what constitutes a valid +.Em alias +member follow. +.Bd -literal +User_List ::= User | + User ',' User_List + +User ::= '!'* user name | + '!'* #uid | + '!'* %group | + '!'* %#gid | + '!'* +netgroup | + '!'* %:nonunix_group | + '!'* %:#nonunix_gid | + '!'* User_Alias +.Ed +.Pp +A +.Li User_List +is made up of one or more user names, user ids +(prefixed with +.Ql # ) , +system group names and ids (prefixed with +.Ql % +and +.Ql %# +respectively), netgroups (prefixed with +.Ql + ) , +non-Unix group names and IDs (prefixed with +.Ql %: +and +.Ql %:# +respectively) and +.Li User_Alias Ns No es. +Each list item may be prefixed with zero or more +.Ql \&! +operators. +An odd number of +.Ql \&! +operators negate the value of +the item; an even number just cancel each other out. +.Pp +A +.Li user name , +.Li uid , +.Li group , +.Li gid , +.Li netgroup , +.Li nonunix_group +or +.Li nonunix_gid +may be enclosed in double quotes to avoid the +need for escaping special characters. +Alternately, special characters +may be specified in escaped hex mode, e.g.\& \ex20 for space. +When +using double quotes, any prefix characters must be included inside +the quotes. +.Pp +The actual +.Li nonunix_group +and +.Li nonunix_gid +syntax depends on +the underlying implementation. +For instance, the QAS AD backend supports the following formats: +.Bl -bullet -width 4n +.It +Group in the same domain: "%:Group Name" +.It +Group in any domain: "%:Group Name@FULLY.QUALIFIED.DOMAIN" +.It +Group SID: "%:S-1-2-34-5678901234-5678901234-5678901234-567" +.El +.Pp +Note that quotes around group names are optional. +Unquoted strings must use a backslash +.Pq Ql \e +to escape spaces and special characters. +See +.Sx Other special characters and reserved words +for a list of +characters that need to be escaped. +.Bd -literal +Runas_List ::= Runas_Member | + Runas_Member ',' Runas_List + +Runas_Member ::= '!'* user name | + '!'* #uid | + '!'* %group | + '!'* %#gid | + '!'* %:nonunix_group | + '!'* %:#nonunix_gid | + '!'* +netgroup | + '!'* Runas_Alias +.Ed +.Pp +A +.Li Runas_List +is similar to a +.Li User_List +except that instead +of +.Li User_Alias Ns No es +it can contain +.Li Runas_Alias Ns No es . +Note that +user names and groups are matched as strings. +In other words, two +users (groups) with the same uid (gid) are considered to be distinct. +If you wish to match all user names with the same uid (e.g.\& +root and toor), you can use a uid instead (#0 in the example given). +.Bd -literal +Host_List ::= Host | + Host ',' Host_List + +Host ::= '!'* host name | + '!'* ip_addr | + '!'* network(/netmask)? | + '!'* +netgroup | + '!'* Host_Alias +.Ed +.Pp +A +.Li Host_List +is made up of one or more host names, IP addresses, +network numbers, netgroups (prefixed with +.Ql + ) +and other aliases. +Again, the value of an item may be negated with the +.Ql \&! +operator. +If you do not specify a netmask along with the network number, +.Nm sudo +will query each of the local host's network interfaces and, +if the network number corresponds to one of the hosts's network +interfaces, the corresponding netmask will be used. +The netmask +may be specified either in standard IP address notation +(e.g.\& 255.255.255.0 or ffff:ffff:ffff:ffff::), +or CIDR notation (number of bits, e.g.\& 24 or 64). +A host name may include shell-style wildcards (see the +.Sx Wildcards +section below), +but unless the +.Li host name +command on your machine returns the fully +qualified host name, you'll need to use the +.Em fqdn +option for wildcards to be useful. +Note that +.Nm sudo +only inspects actual network interfaces; this means that IP address +127.0.0.1 (localhost) will never match. +Also, the host name +.Dq localhost +will only match if that is the actual host name, which is usually +only the case for non-networked systems. +.Bd -literal +Cmnd_List ::= Cmnd | + Cmnd ',' Cmnd_List + +command name ::= file name | + file name args | + file name '""' + +Cmnd ::= '!'* command name | + '!'* directory | + '!'* "sudoedit" | + '!'* Cmnd_Alias +.Ed +.Pp +A +.Li Cmnd_List +is a list of one or more command names, directories, and other aliases. +A command name is a fully qualified file name which may include +shell-style wildcards (see the +.Sx Wildcards +section below). +A simple file name allows the user to run the command with any +arguments he/she wishes. +However, you may also specify command line arguments (including +wildcards). +Alternately, you can specify +.Li \&"" +to indicate that the command +may only be run +.Sy without +command line arguments. +A directory is a +fully qualified path name ending in a +.Ql / . +When you specify a directory in a +.Li Cmnd_List , +the user will be able to run any file within that directory +(but not in any sub-directories therein). +.Pp +If a +.Li Cmnd +has associated command line arguments, then the arguments +in the +.Li Cmnd +must match exactly those given by the user on the command line +(or match the wildcards if there are any). +Note that the following characters must be escaped with a +.Ql \e +if they are used in command arguments: +.Ql ,\& , +.Ql :\& , +.Ql =\& , +.Ql \e . +The special command +.Dq Li sudoedit +is used to permit a user to run +.Nm sudo +with the +.Fl e +option (or as +.Nm sudoedit ) . +It may take command line arguments just as a normal command does. +.Ss Defaults +Certain configuration options may be changed from their default +values at run-time via one or more +.Li Default_Entry +lines. +These may affect all users on any host, all users on a specific host, a +specific user, a specific command, or commands being run as a specific user. +Note that per-command entries may not include command line arguments. +If you need to specify arguments, define a +.Li Cmnd_Alias +and reference +that instead. +.Bd -literal +Default_Type ::= 'Defaults' | + 'Defaults' '@' Host_List | + 'Defaults' ':' User_List | + 'Defaults' '!' Cmnd_List | + 'Defaults' '>' Runas_List + +Default_Entry ::= Default_Type Parameter_List + +Parameter_List ::= Parameter | + Parameter ',' Parameter_List + +Parameter ::= Parameter '=' Value | + Parameter '+=' Value | + Parameter '-=' Value | + '!'* Parameter +.Ed +.Pp +Parameters may be +.Sy flags , +.Sy integer +values, +.Sy strings , +or +.Sy lists . +Flags are implicitly boolean and can be turned off via the +.Ql \&! +operator. +Some integer, string and list parameters may also be +used in a boolean context to disable them. +Values may be enclosed +in double quotes +.Pq \&"" +when they contain multiple words. +Special characters may be escaped with a backslash +.Pq Ql \e . +.Pp +Lists have two additional assignment operators, +.Li += +and +.Li -= . +These operators are used to add to and delete from a list respectively. +It is not an error to use the +.Li -= +operator to remove an element +that does not exist in a list. +.Pp +Defaults entries are parsed in the following order: generic, host +and user Defaults first, then runas Defaults and finally command +defaults. +.Pp +See +.Sx SUDOERS OPTIONS +for a list of supported Defaults parameters. +.Ss User Specification +.Bd -literal +User_Spec ::= User_List Host_List '=' Cmnd_Spec_List \e + (':' Host_List '=' Cmnd_Spec_List)* + +Cmnd_Spec_List ::= Cmnd_Spec | + Cmnd_Spec ',' Cmnd_Spec_List + +Cmnd_Spec ::= Runas_Spec? Tag_Spec* Cmnd + +Runas_Spec ::= '(' Runas_List? (':' Runas_List)? ')' + +Tag_Spec ::= ('NOPASSWD:' | 'PASSWD:' | 'NOEXEC:' | 'EXEC:' | + 'SETENV:' | 'NOSETENV:') +.Ed +.Pp +A +.Sy user specification +determines which commands a user may run +(and as what user) on specified hosts. +By default, commands are +run as +.Sy root , +but this can be changed on a per-command basis. +.Pp +The basic structure of a user specification is +.Dq who where = (as_whom) what . +Let's break that down into its constituent parts: +.Ss Runas_Spec +A +.Li Runas_Spec +determines the user and/or the group that a command +may be run as. +A fully-specified +.Li Runas_Spec +consists of two +.Li Runas_List Ns No s +(as defined above) separated by a colon +.Pq Ql :\& +and enclosed in a set of parentheses. +The first +.Li Runas_List +indicates +which users the command may be run as via +.Nm sudo Ns No 's +.Fl u +option. +The second defines a list of groups that can be specified via +.Nm sudo Ns No 's +.Fl g +option. +If both +.Li Runas_List Ns No s +are specified, the command may be run with any combination of users +and groups listed in their respective +.Li Runas_List Ns No s. +If only the first is specified, the command may be run as any user +in the list but no +.Fl g +option +may be specified. +If the first +.Li Runas_List +is empty but the +second is specified, the command may be run as the invoking user +with the group set to any listed in the +.Li Runas_List . +If no +.Li Runas_Spec +is specified the command may be run as +.Sy root +and +no group may be specified. +.Pp +A +.Li Runas_Spec +sets the default for the commands that follow it. +What this means is that for the entry: +.Bd -literal +dgb boulder = (operator) /bin/ls, /bin/kill, /usr/bin/lprm +.Ed +.Pp +The user +.Sy dgb +may run +.Pa /bin/ls , +.Pa /bin/kill , +and +.Pa /usr/bin/lprm Ns No \(em Ns but +only as +.Sy operator . +E.g., +.Bd -literal +$ sudo -u operator /bin/ls +.Ed +.Pp +It is also possible to override a +.Li Runas_Spec +later on in an entry. +If we modify the entry like so: +.Bd -literal +dgb boulder = (operator) /bin/ls, (root) /bin/kill, /usr/bin/lprm +.Ed +.Pp +Then user +.Sy dgb +is now allowed to run +.Pa /bin/ls +as +.Sy operator , +but +.Pa /bin/kill +and +.Pa /usr/bin/lprm +as +.Sy root . +.Pp +We can extend this to allow +.Sy dgb +to run +.Li /bin/ls +with either +the user or group set to +.Sy operator : +.Bd -literal +dgb boulder = (operator : operator) /bin/ls, (root) /bin/kill,\e + /usr/bin/lprm +.Ed +.Pp +Note that while the group portion of the +.Li Runas_Spec +permits the +user to run as command with that group, it does not force the user +to do so. +If no group is specified on the command line, the command +will run with the group listed in the target user's password database +entry. +The following would all be permitted by the sudoers entry above: +.Bd -literal +$ sudo -u operator /bin/ls +$ sudo -u operator -g operator /bin/ls +$ sudo -g operator /bin/ls +.Ed +.Pp +In the following example, user +.Sy tcm +may run commands that access +a modem device file with the dialer group. +.Bd -literal +tcm boulder = (:dialer) /usr/bin/tip, /usr/bin/cu,\e + /usr/local/bin/minicom +.Ed +.Pp +Note that in this example only the group will be set, the command +still runs as user +.Sy tcm . +E.g.\& +.Bd -literal +$ sudo -g dialer /usr/bin/cu +.Ed +.Pp +Multiple users and groups may be present in a +.Li Runas_Spec , +in which case the user may select any combination of users and groups via the +.Fl u +and +.Fl g +options. +In this example: +.Bd -literal +alan ALL = (root, bin : operator, system) ALL +.Ed +.Pp +user +.Sy alan +may run any command as either user root or bin, +optionally setting the group to operator or system. +.Ss Tag_Spec +A command may have zero or more tags associated with it. +There are +six possible tag values: +.Li NOPASSWD , +.Li PASSWD , +.Li NOEXEC , +.Li EXEC , +.Li SETENV , +and +.Li NOSETENV . +Once a tag is set on a +.Li Cmnd , +subsequent +.Li Cmnd Ns No s +in the +.Li Cmnd_Spec_List , +inherit the tag unless it is overridden by the opposite tag (in other words, +.Li PASSWD +overrides +.Li NOPASSWD +and +.Li NOEXEC +overrides +.Li EXEC ) . +.Pp +.Em NOPASSWD and PASSWD +.Pp +By default, +.Nm sudo +requires that a user authenticate him or herself +before running a command. +This behavior can be modified via the +.Li NOPASSWD +tag. +Like a +.Li Runas_Spec , +the +.Li NOPASSWD +tag sets +a default for the commands that follow it in the +.Li Cmnd_Spec_List . +Conversely, the +.Li PASSWD +tag can be used to reverse things. +For example: +.Bd -literal +ray rushmore = NOPASSWD: /bin/kill, /bin/ls, /usr/bin/lprm +.Ed +.Pp +would allow the user +.Sy ray +to run +.Pa /bin/kill , +.Pa /bin/ls , +and +.Pa /usr/bin/lprm +as +.Sy root +on the machine rushmore without authenticating himself. +If we only want +.Sy ray +to be able to +run +.Pa /bin/kill +without a password the entry would be: +.Bd -literal +ray rushmore = NOPASSWD: /bin/kill, PASSWD: /bin/ls, /usr/bin/lprm +.Ed +.Pp +Note, however, that the +.Li PASSWD +tag has no effect on users who are in the group specified by the +.Em exempt_group +option. +.Pp +By default, if the +.Li NOPASSWD +tag is applied to any of the entries for a user on the current host, +he or she will be able to run +.Dq Li sudo -l +without a password. +Additionally, a user may only run +.Dq Li sudo -v +without a password if the +.Li NOPASSWD +tag is present for all a user's entries that pertain to the current host. +This behavior may be overridden via the +.Em verifypw +and +.Em listpw +options. +.Pp +.Em NOEXEC and EXEC +.Pp +If +.Nm sudo +has been compiled with +.Em noexec +support and the underlying operating system supports it, the +.Li NOEXEC +tag can be used to prevent a dynamically-linked executable from +running further commands itself. +.Pp +In the following example, user +.Sy aaron +may run +.Pa /usr/bin/more +and +.Pa /usr/bin/vi +but shell escapes will be disabled. +.Bd -literal +aaron shanty = NOEXEC: /usr/bin/more, /usr/bin/vi +.Ed +.Pp +See the +.Sx Preventing Shell Escapes +section below for more details on how +.Li NOEXEC +works and whether or not it will work on your system. +.Pp +.Em SETENV and NOSETENV +.Pp +These tags override the value of the +.Em setenv +option on a per-command basis. +Note that if +.Li SETENV +has been set for a command, the user may disable the +.Em env_reset +option from the command line via the +.Fl E +option. +Additionally, environment variables set on the command +line are not subject to the restrictions imposed by +.Em env_check , +.Em env_delete , +or +.Em env_keep . +As such, only trusted users should be allowed to set variables in this manner. +If the command matched is +.Sy ALL , +the +.Li SETENV +tag is implied for that command; this default may be overridden by use of the +.Li NOSETENV +tag. +.Ss Wildcards +.Nm sudo +allows shell-style +.Em wildcards +(aka meta or glob characters) +to be used in host names, path names and command line arguments in the +.Em sudoers +file. +Wildcard matching is done via the +.Sy POSIX +.Xr glob 3 +and +.Xr fnmatch 3 +routines. +Note that these are +.Em not +regular expressions. +.Bl -tag -width 8n +.It Li * +Matches any set of zero or more characters. +.It Li \&? +Matches any single character. +.It Li [...] +Matches any character in the specified range. +.It Li [!...] +Matches any character +.Sy not +in the specified range. +.It Li \ex +For any character +.Sq x , +evaluates to +.Sq x . +This is used to escape special characters such as: +.Ql * , +.Ql \&? , +.Ql [\& , +and +.Ql ]\& . +.El +.Pp +POSIX character classes may also be used if your system's +.Xr glob 3 +and +.Xr fnmatch 3 +functions support them. +However, because the +.Ql :\& +character has special meaning in +.Em sudoers , +it must be +escaped. +For example: +.Bd -literal -offset 4n +/bin/ls [[\:alpha\:]]* +.Ed +.Pp +Would match any file name beginning with a letter. +.Pp +Note that a forward slash +.Pq Ql / +will +.Sy not +be matched by +wildcards used in the path name. +This is to make a path like: +.Bd -literal -offset 4n +/usr/bin/* +.Ed +.Pp +match +.Pa /usr/bin/who +but not +.Pa /usr/bin/X11/xterm . +.Pp +When matching the command line arguments, however, a slash +.Sy does +get matched by wildcards since command line arguments may contain +arbitrary strings and not just path names. +.Pp +Wildcards in command line arguments should be used with care. +Because command line arguments are matched as a single, concatenated +string, a wildcard such as +.Ql \&? +or +.Ql * +can match multiple words. +For example, while a sudoers entry like: +.Bd -literal -offset 4n +%operator ALL = /bin/cat /var/log/messages* +.Ed +.Pp +will allow command like: +.Bd -literal -offset 4n +$ sudo cat /var/log/messages.1 +.Ed +.Pp +It will also allow: +.Bd -literal -offset 4n +$ sudo cat /var/log/messages /etc/shadow +.Ed +.Pp +which is probably not what was intended. +.Ss Exceptions to wildcard rules +The following exceptions apply to the above rules: +.Bl -tag -width 8n +.It Li \&"" +If the empty string +.Li \&"" +is the only command line argument in the +.Em sudoers +entry it means that command is not allowed to be run with +.Sy any +arguments. +.It sudoedit +Command line arguments to the +.Em sudoedit +built-in command should always be path names, so a forward slash +.Pq Ql / +will not be matched by a wildcard. +.El +.Ss Including other files from within sudoers +It is possible to include other +.Em sudoers +files from within the +.Em sudoers +file currently being parsed using the +.Li #include +and +.Li #includedir +directives. +.Pp +This can be used, for example, to keep a site-wide +.Em sudoers +file in addition to a local, per-machine file. +For the sake of this example the site-wide +.Em sudoers +will be +.Pa /etc/sudoers +and the per-machine one will be +.Pa /etc/sudoers.local . +To include +.Pa /etc/sudoers.local +from within +.Pa /etc/sudoers +we would use the +following line in +.Pa /etc/sudoers : +.Bd -literal -offset 4n +#include /etc/sudoers.local +.Ed +.Pp +When +.Nm sudo +reaches this line it will suspend processing of the current file +.Pq Pa /etc/sudoers +and switch to +.Pa /etc/sudoers.local . +Upon reaching the end of +.Pa /etc/sudoers.local , +the rest of +.Pa /etc/sudoers +will be processed. +Files that are included may themselves include other files. +A hard limit of 128 nested include files is enforced to prevent include +file loops. +.Pp +If the path to the include file is not fully-qualified (does not +begin with a +.Ql / , +it must be located in the same directory as the sudoers file it was +included from. +For example, if +.Pa /etc/sudoers +contains the line: +.Bd -literal -offset 4n +.Li #include sudoers.local +.Ed +.Pp +the file that will be included is +.Pa /etc/sudoers.local . +.Pp +The file name may also include the +.Li %h +escape, signifying the short form of the host name. +In other words, if the machine's host name is +.Dq xerxes , +then +.Bd -literal -offset 4n +#include /etc/sudoers.%h +.Ed +.Pp +will cause +.Nm sudo +to include the file +.Pa /etc/sudoers.xerxes . +.Pp +The +.Li #includedir +directive can be used to create a +.Pa sudo.d +directory that the system package manager can drop +.Em sudoers +rules +into as part of package installation. +For example, given: +.Bd -literal -offset 4n +#includedir /etc/sudoers.d +.Ed +.Pp +.Nm sudo +will read each file in +.Pa /etc/sudoers.d , +skipping file names that end in +.Ql ~ +or contain a +.Ql .\& +character to avoid causing problems with package manager or editor +temporary/backup files. +Files are parsed in sorted lexical order. +That is, +.Pa /etc/sudoers.d/01_first +will be parsed before +.Pa /etc/sudoers.d/10_second . +Be aware that because the sorting is lexical, not numeric, +.Pa /etc/sudoers.d/1_whoops +would be loaded +.Sy after +.Pa /etc/sudoers.d/10_second . +Using a consistent number of leading zeroes in the file names can be used +to avoid such problems. +.Pp +Note that unlike files included via +.Li #include , +.Nm visudo +will not edit the files in a +.Li #includedir +directory unless one of them contains a syntax error. +It is still possible to run +.Nm visudo +with the +.Fl f +flag to edit the files directly. +.Ss Other special characters and reserved words +The pound sign +.Pq Ql # +is used to indicate a comment (unless it is part of a #include +directive or unless it occurs in the context of a user name and is +followed by one or more digits, in which case it is treated as a +uid). +Both the comment character and any text after it, up to the end of +the line, are ignored. +.Pp +The reserved word +.Sy ALL +is a built-in +.Em alias +that always causes a match to succeed. +It can be used wherever one might otherwise use a +.Li Cmnd_Alias , +.Li User_Alias , +.Li Runas_Alias , +or +.Li Host_Alias . +You should not try to define your own +.Em alias +called +.Sy ALL +as the built-in alias will be used in preference to your own. +Please note that using +.Sy ALL +can be dangerous since in a command context, it allows the user to run +.Sy any +command on the system. +.Pp +An exclamation point +.Pq Ql \&! +can be used as a logical +.Em not +operator both in an +.Em alias +and in front of a +.Li Cmnd . +This allows one to exclude certain values. +Note, however, that using a +.Ql \&! +in conjunction with the built-in +.Sy ALL +alias to allow a user to run +.Dq all but a few +commands rarely works as intended (see +.Sx SECURITY NOTES +below). +.Pp +Long lines can be continued with a backslash +.Pq Ql \e +as the last character on the line. +.Pp +White space between elements in a list as well as special syntactic +characters in a +.Em User Specification +.Po +.Ql =\& , +.Ql :\& , +.Ql (\& , +.Ql )\& +.Pc +is optional. +.Pp +The following characters must be escaped with a backslash +.Pq Ql \e +when used as part of a word (e.g.\& a user name or host name): +.Ql \&! , +.Ql =\& , +.Ql :\& , +.Ql ,\& , +.Ql (\& , +.Ql )\& , +.Ql \e . +.Sh SUDOERS OPTIONS +.Nm sudo Ns No 's +behavior can be modified by +.Li Default_Entry +lines, as explained earlier. +A list of all supported Defaults parameters, grouped by type, are listed below. +.Pp +.Sy Boolean Flags : +.Bl -tag -width 16n +.It always_set_home +If enabled, +.Nm sudo +will set the +.Ev HOME +environment variable to the home directory of the target user +(which is root unless the +.Fl u +option is used). +This effectively means that the +.Fl H +option is always implied. +This flag is +.Em off +by default. +.It authenticate +If set, users must authenticate themselves via a password (or other +means of authentication) before they may run commands. +This default may be overridden via the +.Li PASSWD +and +.Li NOPASSWD +tags. +This flag is +.Em on +by default. +.It closefrom_override +If set, the user may use +.Nm sudo Ns No 's +.Fl C +option which overrides the default starting point at which +.Nm sudo +begins closing open file descriptors. +This flag is +.Em off +by default. +.It env_editor +If set, +.Nm visudo +will use the value of the +.Ev EDITOR +or +.Ev VISUAL +environment variables before falling back on the default editor list. +Note that this may create a security hole as it allows the user to +run any arbitrary command as root without logging. +A safer alternative is to place a colon-separated list of editors +in the +.Li editor +variable. +.Nm visudo +will then only use the +.Ev EDITOR +or +.Ev VISUAL +if they match a value specified in +.Li editor . +This flag is +.Em @env_editor@ +by +default. +.It env_reset +If set, +.Nm sudo +will run the command in a minimal environment containing the +.Ev TERM , +.Ev PATH , +.Ev HOME , +.Ev MAIL , +.Ev SHELL , +.Ev LOGNAME , +.Ev USER , +.Ev USERNAME +and +.Ev SUDO_* +variables. +Any +variables in the caller's environment that match the +.Li env_keep +and +.Li env_check +lists are then added, followed by any variables present in the file +specified by the +.Em env_file +option (if any). +The default contents of the +.Li env_keep +and +.Li env_check +lists are displayed when +.Nm sudo +is run by root with the +.Fl V +option. +If the +.Em secure_path +option is set, its value will be used for the +.Ev PATH +environment variable. +This flag is +.Em @env_reset@ +by default. +.It fast_glob +Normally, +.Nm sudo +uses the +.Xr glob 3 +function to do shell-style globbing when matching path names. +However, since it accesses the file system, +.Xr glob 3 +can take a long time to complete for some patterns, especially +when the pattern references a network file system that is mounted +on demand (auto mounted). +The +.Em fast_glob +option causes +.Nm sudo +to use the +.Xr fnmatch 3 +function, which does not access the file system to do its matching. +The disadvantage of +.Em fast_glob +is that it is unable to match relative path names such as +.Pa ./ls +or +.Pa ../bin/ls . +This has security implications when path names that include globbing +characters are used with the negation operator, +.Ql !\& , +as such rules can be trivially bypassed. +As such, this option should not be used when +.Em sudoers +contains rules that contain negated path names which include globbing +characters. +This flag is +.Em off +by default. +.It fqdn +Set this flag if you want to put fully qualified host names in the +.Em sudoers +file when the local host name (as returned by the +.Li hostname +command) does not contain the domain name. +In other words, instead of myhost you would use myhost.mydomain.edu. +You may still use the short form if you wish (and even mix the two). +This option is only effective when the +.Dq canonical +host name, as returned by the +.Fn getaddrinfo +or +.Fn gethostbyname +function, is a fully-qualified domain name. +This is usually the case when the system is configured to use DNS +for host name resolution. +.Pp +If the system is configured to use the +.Pa /etc/hosts +file in preference to DNS, the +.Dq canonical +host name may not be fully-qualified. +The order that sources are queried for hosts name resolution +is specified in the +.Pa /etc/resolv.conf +file. +In the +.Pa /etc/hosts +file, the first host name of the entry is considered to be the +.Dq canonical +name; subsequent names are aliases that are not used by +.Nm sudoers . +For example, the following hosts file line for the machine +.Dq xyzzy +has the fully-qualified domain name as the +.Dq canonical +host name, and the short version as an alias. +.sp +.Dl 192.168.1.1 xyzzy.sudo.ws xyzzy +.sp +If the machine's hosts file entry is not formatted properly, the +.Em fqdn +option will not be effective if it is queried before DNS. +.Pp +Beware that when using DNS for host name resolution, turning on +.Em fqdn +requires +.Nm sudoers +to make DNS lookups which renders +.Nm sudo +unusable if DNS stops working (for example if the machine is disconnected +from the network). +Also note that just like with the hosts file, you must use the +.Dq canonical +name as DNS knows it. +That is, you may not use a host alias +.Po +.Li CNAME +entry +.Pc +due to performance issues and the fact that there is no way to get all +aliases from DNS. +.Pp +This flag is +.Em @fqdn@ +by default. +.It ignore_dot +If set, +.Nm sudo +will ignore "." or "" (both denoting current directory) in the +.Ev PATH +environment variable; the +.Ev PATH +itself is not modified. +This flag is +.Em @ignore_dot@ +by default. +.It ignore_local_sudoers +If set via LDAP, parsing of +.Pa @sysconfdir@/sudoers +will be skipped. +This is intended for Enterprises that wish to prevent the usage of local +sudoers files so that only LDAP is used. +This thwarts the efforts of rogue operators who would attempt to add roles to +.Pa @sysconfdir@/sudoers . +When this option is present, +.Pa @sysconfdir@/sudoers +does not even need to exist. +Since this option tells +.Nm sudo +how to behave when no specific LDAP entries have been matched, this +sudoOption is only meaningful for the +.Li cn=defaults +section. +This flag is +.Em off +by default. +.It insults +If set, +.Nm sudo +will insult users when they enter an incorrect password. +This flag is +.Em @insults@ +by default. +.It log_host +If set, the host name will be logged in the (non-syslog) +.Nm sudo +log file. +This flag is +.Em off +by default. +.It log_year +If set, the four-digit year will be logged in the (non-syslog) +.Nm sudo +log file. +This flag is +.Em off +by default. +.It long_otp_prompt +When validating with a One Time Password (OTP) scheme such as +.Sy S/Key +or +.Sy OPIE , +a two-line prompt is used to make it easier +to cut and paste the challenge to a local window. +It's not as pretty as the default but some people find it more convenient. +This flag is +.Em @long_otp_prompt@ +by default. +.It mail_always +Send mail to the +.Em mailto +user every time a users runs +.Nm sudo . +This flag is +.Em off +by default. +.It mail_badpass +Send mail to the +.Em mailto +user if the user running +.Nm sudo +does not enter the correct password. +If the command the user is attempting to run is not permitted by +.Em sudoers +and one of the +.Em mail_always , +.Em mail_no_host , +.Em mail_no_perms +or +.Em mail_no_user +flags are set, this flag will have no effect. +This flag is +.Em off +by default. +.It mail_no_host +If set, mail will be sent to the +.Em mailto +user if the invoking user exists in the +.Em sudoers +file, but is not allowed to run commands on the current host. +This flag is +.Em @mail_no_host@ +by default. +.It mail_no_perms +If set, mail will be sent to the +.Em mailto +user if the invoking user is allowed to use +.Nm sudo +but the command they are trying is not listed in their +.Em sudoers +file entry or is explicitly denied. +This flag is +.Em @mail_no_perms@ +by default. +.It mail_no_user +If set, mail will be sent to the +.Em mailto +user if the invoking user is not in the +.Em sudoers +file. +This flag is +.Em @mail_no_user@ +by default. +.It noexec +If set, all commands run via +.Nm sudo +will behave as if the +.Li NOEXEC +tag has been set, unless overridden by a +.Li EXEC +tag. +See the description of +.Em NOEXEC and EXEC +below as well as the +.Sx Preventing Shell Escapes +section at the end of this manual. +This flag is +.Em off +by default. +.It path_info +Normally, +.Nm sudo +will tell the user when a command could not be +found in their +.Ev PATH +environment variable. +Some sites may wish to disable this as it could be used to gather +information on the location of executables that the normal user does +not have access to. +The disadvantage is that if the executable is simply not in the user's +.Ev PATH , +.Nm sudo +will tell the user that they are not allowed to run it, which can be confusing. +This flag is +.Em @path_info@ +by default. +.It passprompt_override +The password prompt specified by +.Em passprompt +will normally only be used if the password prompt provided by systems +such as PAM matches the string +.Dq Password: . +If +.Em passprompt_override +is set, +.Em passprompt +will always be used. +This flag is +.Em off +by default. +.It preserve_groups +By default, +.Nm sudo +will initialize the group vector to the list of groups the target user is in. +When +.Em preserve_groups +is set, the user's existing group vector is left unaltered. +The real and effective group IDs, however, are still set to match the +target user. +This flag is +.Em off +by default. +.It pwfeedback +By default, +.Nm sudo +reads the password like most other Unix programs, +by turning off echo until the user hits the return (or enter) key. +Some users become confused by this as it appears to them that +.Nm sudo +has hung at this point. +When +.Em pwfeedback +is set, +.Nm sudo +will provide visual feedback when the user presses a key. +Note that this does have a security impact as an onlooker may be able to +determine the length of the password being entered. +This flag is +.Em off +by default. +.It requiretty +If set, +.Nm sudo +will only run when the user is logged in to a real tty. +When this flag is set, +.Nm sudo +can only be run from a login session and not via other means such as +.Xr cron @mansectsu@ +or cgi-bin scripts. +This flag is +.Em off +by default. +.It root_sudo +If set, root is allowed to run +.Nm sudo +too. +Disabling this prevents users from +.Dq chaining +.Nm sudo +commands to get a root shell by doing something like +.Dq Li sudo sudo /bin/sh . +Note, however, that turning off +.Em root_sudo +will also prevent root from running +.Nm sudoedit . +Disabling +.Em root_sudo +provides no real additional security; it exists purely for historical reasons. +This flag is +.Em @root_sudo@ +by default. +.It rootpw +If set, +.Nm sudo +will prompt for the root password instead of the password of the invoking user. +This flag is +.Em off +by default. +.It runaspw +If set, +.Nm sudo +will prompt for the password of the user defined by the +.Em runas_default +option (defaults to +.Li @runas_default@ ) +instead of the password of the invoking user. +This flag is +.Em off +by default. +.It set_home +If enabled and +.Nm sudo +is invoked with the +.Fl s +option the +.Ev HOME +environment variable will be set to the home directory of the target +user (which is root unless the +.Fl u +option is used). +This effectively makes the +.Fl s +option imply +.Fl H . +This flag is +.Em off +by default. +.It set_logname +Normally, +.Nm sudo +will set the +.Ev LOGNAME , +.Ev USER +and +.Ev USERNAME +environment variables to the name of the target user (usually root unless the +.Fl u +option is given). +However, since some programs (including the RCS revision control system) use +.Ev LOGNAME +to determine the real identity of the user, it may be desirable to +change this behavior. +This can be done by negating the set_logname option. +Note that if the +.Em env_reset +option has not been disabled, entries in the +.Em env_keep +list will override the value of +.Em set_logname . +This flag is +.Em on +by default. +.It setenv +Allow the user to disable the +.Em env_reset +option from the command line via the +.Fl E +option. +Additionally, environment variables set via the command line are +not subject to the restrictions imposed by +.Em env_check , +.Em env_delete , +or +.Em env_keep . +As such, only trusted users should be allowed to set variables in this manner. +This flag is +.Em off +by default. +.It shell_noargs +If set and +.Nm sudo +is invoked with no arguments it acts as if the +.Fl s +option had been given. +That is, it runs a shell as root (the shell is determined by the +.Ev SHELL +environment variable if it is set, falling back on the shell listed +in the invoking user's /etc/passwd entry if not). +This flag is +.Em off +by default. +.It stay_setuid +Normally, when +.Nm sudo +executes a command the real and effective UIDs are set to the target +user (root by default). +This option changes that behavior such that the real UID is left +as the invoking user's UID. +In other words, this makes +.Nm sudo +act as a setuid wrapper. +This can be useful on systems that disable some potentially +dangerous functionality when a program is run setuid. +This option is only effective on systems that support either the +.Xr setreuid 2 +or +.Xr setresuid 2 +system call. +This flag is +.Em off +by default. +.It targetpw +If set, +.Nm sudo +will prompt for the password of the user specified +by the +.Fl u +option (defaults to +.Li root ) +instead of the password of the invoking user. +In addition, the time stamp file name will include the target user's name. +Note that this flag precludes the use of a uid not listed in the passwd +database as an argument to the +.Fl u +option. +This flag is +.Em off +by default. +.It tty_tickets +If set, users must authenticate on a per-tty basis. +With this flag enabled, +.Nm sudo +will use a file named for the tty the user is +logged in on in the user's time stamp directory. +If disabled, the time stamp of the directory is used instead. +This flag is +.Em @tty_tickets@ +by default. +.It umask_override +If set, +.Nm sudo +will set the umask as specified by +.Em sudoers +without modification. +This makes it possible to specify a more permissive umask in +.Em sudoers +than the user's own umask and matches historical behavior. +If +.Em umask_override +is not set, +.Nm sudo +will set the umask to be the union of the user's umask and what is specified in +.Em sudoers . +This flag is +.Em @umask_override@ +by default. +.It use_loginclass +If set, +.Nm sudo +will apply the defaults specified for the target user's login class +if one exists. +Only available if +.Nm sudo +is configured with the +.Li --with-logincap +option. +This flag is +.Em off +by default. +.It use_pty +If set, +.Nm sudo +will run the command in a pseudo-pty even if no I/O logging is being gone. +A malicious program run under +.Nm sudo +could conceivably fork a background process that retains to the user's +terminal device after the main program has finished executing. +Use of this option will make that impossible. +This flag is +.Em off +by default. +.It visiblepw +By default, +.Nm sudo +will refuse to run if the user must enter a password but it is not +possible to disable echo on the terminal. +If the +.Em visiblepw +flag is set, +.Nm sudo +will prompt for a password even when it would be visible on the screen. +This makes it possible to run things like +.Dq Li ssh somehost sudo ls +since by default, +.Xr ssh 1 +does +not allocate a tty when running a command. +This flag is +.Em off +by default. +.El +.Pp +.Sy Integers : +.Bl -tag -width 16n +.It closefrom +Before it executes a command, +.Nm sudo +will close all open file descriptors other than standard input, +standard output and standard error (ie: file descriptors 0-2). +The +.Em closefrom +option can be used to specify a different file descriptor at which +to start closing. +The default is +.Li 3 . +.It passwd_tries +The number of tries a user gets to enter his/her password before +.Nm sudo +logs the failure and exits. +The default is +.Li @passwd_tries@ . +.El +.Pp +.Sy Integers that can be used in a boolean context : +.Bl -tag -width 16n +.It loglinelen +Number of characters per line for the file log. +This value is used to decide when to wrap lines for nicer log files. +This has no effect on the syslog log file, only the file log. +The default is +.Li @loglen@ +(use 0 or negate the option to disable word wrap). +.It passwd_timeout +Number of minutes before the +.Nm sudo +password prompt times out, or +.Li 0 +for no timeout. +The timeout may include a fractional component +if minute granularity is insufficient, for example +.Li 2.5 . +The +default is +.Li @password_timeout@ . +.It timestamp_timeout +Number of minutes that can elapse before +.Nm sudo +will ask for a passwd again. +The timeout may include a fractional component if +minute granularity is insufficient, for example +.Li 2.5 . +The default is +.Li @timeout@ . +Set this to +.Li 0 +to always prompt for a password. +If set to a value less than +.Li 0 +the user's time stamp will never expire. +This can be used to allow users to create or delete their own time stamps via +.Dq Li sudo -v +and +.Dq Li sudo -k +respectively. +.It umask +Umask to use when running the command. +Negate this option or set it to 0777 to preserve the user's umask. +The actual umask that is used will be the union of the user's umask +and the value of the +.Em umask +option, which defaults to +.Li @sudo_umask@ . +This guarantees +that +.Nm sudo +never lowers the umask when running a command. +Note: on systems that use PAM, the default PAM configuration may specify +its own umask which will override the value set in +.Em sudoers . +.El +.Pp +.Sy Strings : +.Bl -tag -width 16n +.It badpass_message +Message that is displayed if a user enters an incorrect password. +The default is +.Li @badpass_message@ +unless insults are enabled. +.It editor +A colon +.Pq Ql :\& +separated list of editors allowed to be used with +.Nm visudo . +.Nm visudo +will choose the editor that matches the user's +.Ev EDITOR +environment variable if possible, or the first editor in the +list that exists and is executable. +The default is +.Pa @editor@ . +.It mailsub +Subject of the mail sent to the +.Em mailto +user. +The escape +.Li %h +will expand to the host name of the machine. +Default is +.Dq Li @mailsub@ . +.It noexec_file +The +.Em noexec +option specifies the the fully-qualified path to a shared library +containing dummy versions of the +.Fn execv , +.Fn execve +and +.Fn fexecve +library functions that just return an error. +This is used to implement the +.Em noexec +functionality on systems that support +.Ev LD_PRELOAD +or its equivalent. +Defaults to +.Pa @noexec_file@ . +.It passprompt +The default prompt to use when asking for a password; can be overridden via the +.Fl p +option or the +.Ev SUDO_PROMPT +environment variable. +The following percent +.Pq Ql % +escape sequences are supported: +.Bl -tag -width 4n +.It Li %H +expanded to the local host name including the domain name +(only if the machine's host name is fully qualified or the +.Em fqdn +option is set) +.It Li %h +expanded to the local host name without the domain name +.It Li %p +expanded to the user whose password is being asked for (respects the +.Em rootpw , +.Em targetpw +and +.Em runaspw +flags in +.Em sudoers ) +.It Li \&%U +expanded to the login name of the user the command will +be run as (defaults to root) +.It Li %u +expanded to the invoking user's login name +.It Li %% +two consecutive +.Li % +characters are collapsed into a single +.Li % +character +.El +.Pp +The default value is +.Dq Li @passprompt@ . +.It runas_default +The default user to run commands as if the +.Fl u +option is not specified on the command line. +This defaults to +.Li @runas_default@ . +.It syslog_badpri +Syslog priority to use when user authenticates unsuccessfully. +Defaults to +.Li @badpri@ . +.Pp +The following syslog priorities are supported: +.Sy alert , +.Sy crit , +.Sy debug , +.Sy emerg , +.Sy err , +.Sy info , +.Sy notice , +and +.Sy warning . +.It syslog_goodpri +Syslog priority to use when user authenticates successfully. +Defaults to +.Li @goodpri@ . +.Pp +See +.Sx syslog_badpri +for the list of supported syslog priorities. +.It sudoers_locale +Locale to use when parsing the sudoers file, logging commands, and +sending email. +Note that changing the locale may affect how sudoers is interpreted. +Defaults to +.Dq Li C . +.It timestampdir +The directory in which +.Nm sudo +stores its time stamp files. +The default is +.Pa @timedir@ . +.It timestampowner +The owner of the time stamp directory and the time stamps stored therein. +The default is +.Li root . +.It askpass +The +.Em askpass +option specifies the fully qualified path to a helper program used +to read the user's password when no terminal is available. +This may be the case when +.Nm sudo +is executed from a graphical (as opposed to text-based) application. +The program specified by +.Em askpass +should display the argument passed to it as the prompt and write +the user's password to the standard output. +The value of +.Em askpass +may be overridden by the +.Ev SUDO_ASKPASS +environment variable. +.It env_file +The +.Em env_file +option specifies the fully qualified path to a file containing variables +to be set in the environment of the program being run. +Entries in this file should either be of the form +.Dq Li VARIABLE=value +or +.Dq Li export VARIABLE=value . +The value may optionally be surrounded by single or double quotes. +Variables in this file are subject to other +.Nm sudo +environment settings such as +.Em env_keep +and +.Em env_check . +.It exempt_group +Users in this group are exempt from password and PATH requirements. +The group name specified should not include a +.Li % +prefix. +This is not set by default. +.It lecture +This option controls when a short lecture will be printed along with +the password prompt. +It has the following possible values: +.Bl -tag -width 6n +.It always +Always lecture the user. +.It never +Never lecture the user. +.It once +Only lecture the user the first time they run +.Nm sudo . +.El +.Pp +If no value is specified, a value of +.Em once +is implied. +Negating the option results in a value of +.Em never +being used. +The default value is +.Em @lecture@ . +.It lecture_file +Path to a file containing an alternate +.Nm sudo +lecture that will be used in place of the standard lecture if the named +file exists. +By default, +.Nm sudo +uses a built-in lecture. +.It listpw +This option controls when a password will be required when a user runs +.Nm sudo +with the +.Fl l +option. +It has the following possible values: +.Bl -tag -width 8n +.It all +All the user's +.Em sudoers +entries for the current host must have +the +.Li NOPASSWD +flag set to avoid entering a password. +.It always +The user must always enter a password to use the +.Fl l +option. +.It any +At least one of the user's +.Em sudoers +entries for the current host +must have the +.Li NOPASSWD +flag set to avoid entering a password. +.It never +The user need never enter a password to use the +.Fl l +option. +.El +.Pp +If no value is specified, a value of +.Em any +is implied. +Negating the option results in a value of +.Em never +being used. +The default value is +.Em any . +.It logfile +Path to the +.Nm sudo +log file (not the syslog log file). +Setting a path turns on logging to a file; +negating this option turns it off. +By default, +.Nm sudo +logs via syslog. +.It mailerflags +Flags to use when invoking mailer. Defaults to +.Fl t . +.It mailerpath +Path to mail program used to send warning mail. +Defaults to the path to sendmail found at configure time. +.It mailfrom +Address to use for the +.Dq from +address when sending warning and error mail. +The address should be enclosed in double quotes +.Pq \&"" +to protect against +.Nm sudo +interpreting the +.Li @ +sign. +Defaults to the name of the user running +.Nm sudo . +.It mailto +Address to send warning and error mail to. +The address should be enclosed in double quotes +.Pq \&"" +to protect against +.Nm sudo +interpreting the +.Li @ +sign. +Defaults to +.Li @mailto@ . +.It secure_path +Path used for every command run from +.Nm sudo . +If you don't trust the +people running +.Nm sudo +to have a sane +.Ev PATH +environment variable you may want to use this. +Another use is if you want to have the +.Dq root path +be separate from the +.Dq user path . +Users in the group specified by the +.Em exempt_group +option are not affected by +.Em secure_path . +This option is @secure_path@ by default. +.It syslog +Syslog facility if syslog is being used for logging (negate to +disable syslog logging). +Defaults to +.Li @logfac@ . +.Pp +The following syslog facilities are supported: +.Sy authpriv +(if your +OS supports it), +.Sy auth , +.Sy daemon , +.Sy user , +.Sy local0 , +.Sy local1 , +.Sy local2 , +.Sy local3 , +.Sy local4 , +.Sy local5 , +.Sy local6 , +and +.Sy local7 . +.It verifypw +This option controls when a password will be required when a user runs +.Nm sudo +with the +.Fl v +option. +It has the following possible values: +.Bl -tag -width 6n +.It all +All the user's +.Em sudoers +entries for the current host must have the +.Li NOPASSWD +flag set to avoid entering a password. +.It always +The user must always enter a password to use the +.Fl v +option. +.It any +At least one of the user's +.Em sudoers +entries for the current host must have the +.Li NOPASSWD +flag set to avoid entering a password. +.It never +The user need never enter a password to use the +.Fl v +option. +.El +.Pp +If no value is specified, a value of +.Em all +is implied. +Negating the option results in a value of +.Em never +being used. +The default value is +.Em all . +.El +.Pp +.Sy Lists that can be used in a boolean context : +.Bl -tag -width 16n +.It env_check +Environment variables to be removed from the user's environment if +the variable's value contains +.Ql % +or +.Ql / +characters. +This can be used to guard against printf-style format vulnerabilities +in poorly-written programs. +The argument may be a double-quoted, space-separated list or a +single value without double-quotes. +The list can be replaced, added to, deleted from, or disabled by using +the +.Li = , +.Li += , +.Li -= , +and +.Li \&! +operators respectively. +Regardless of whether the +.Li env_reset +option is enabled or disabled, variables specified by +.Li env_check +will be preserved in the environment if they pass the aforementioned check. +The default list of environment variables to check is displayed when +.Nm sudo +is run by root with +the +.Fl V +option. +.It env_delete +Environment variables to be removed from the user's environment when the +.Em env_reset +option is not in effect. +The argument may be a double-quoted, space-separated list or a +single value without double-quotes. +The list can be replaced, added to, deleted from, or disabled by using the +.Li = , +.Li += , +.Li -= , +and +.Li \&! +operators respectively. +The default list of environment variables to remove is displayed when +.Nm sudo +is run by root with the +.Fl V +option. +Note that many operating systems will remove potentially dangerous +variables from the environment of any setuid process (such as +.Nm sudo ) . +.It env_keep +Environment variables to be preserved in the user's environment when the +.Em env_reset +option is in effect. +This allows fine-grained control over the environment +.Nm sudo Ns No -spawned +processes will receive. +The argument may be a double-quoted, space-separated list or a +single value without double-quotes. +The list can be replaced, added to, deleted from, or disabled by using the +.Li = , +.Li += , +.Li -= , +and +.Li \&! +operators respectively. +The default list of variables to keep +is displayed when +.Nm sudo +is run by root with the +.Fl V +option. +.El +.Sh FILES +.Bl -tag -width 24n +.It Pa @sysconfdir@/sudoers +List of who can run what +.It Pa /etc/group +Local groups file +.It Pa /etc/netgroup +List of network groups +.El +.Sh EXAMPLES +Below are example +.Em sudoers +entries. +Admittedly, some of these are a bit contrived. +First, we allow a few environment variables to pass and then define our +.Em aliases : +.Bd -literal +# Run X applications through sudo; HOME is used to find the +# .Xauthority file. Note that other programs use HOME to find +# configuration files and this may lead to privilege escalation! +Defaults env_keep += "DISPLAY HOME" + +# User alias specification +User_Alias FULLTIMERS = millert, mikef, dowdy +User_Alias PARTTIMERS = bostley, jwfox, crawl +User_Alias WEBMASTERS = will, wendy, wim + +# Runas alias specification +Runas_Alias OP = root, operator +Runas_Alias DB = oracle, sybase +Runas_Alias ADMINGRP = adm, oper + +# Host alias specification +Host_Alias SPARC = bigtime, eclipse, moet, anchor :\e + SGI = grolsch, dandelion, black :\e + ALPHA = widget, thalamus, foobar :\e + HPPA = boa, nag, python +Host_Alias CUNETS = 128.138.0.0/255.255.0.0 +Host_Alias CSNETS = 128.138.243.0, 128.138.204.0/24, 128.138.242.0 +Host_Alias SERVERS = master, mail, www, ns +Host_Alias CDROM = orion, perseus, hercules + +# Cmnd alias specification +Cmnd_Alias DUMPS = /usr/bin/mt, /usr/sbin/dump, /usr/sbin/rdump,\e + /usr/sbin/restore, /usr/sbin/rrestore +Cmnd_Alias KILL = /usr/bin/kill +Cmnd_Alias PRINTING = /usr/sbin/lpc, /usr/bin/lprm +Cmnd_Alias SHUTDOWN = /usr/sbin/shutdown +Cmnd_Alias HALT = /usr/sbin/halt +Cmnd_Alias REBOOT = /usr/sbin/reboot +Cmnd_Alias SHELLS = /usr/bin/sh, /usr/bin/csh, /usr/bin/ksh,\e + /usr/local/bin/tcsh, /usr/bin/rsh,\e + /usr/local/bin/zsh +Cmnd_Alias SU = /usr/bin/su +Cmnd_Alias PAGERS = /usr/bin/more, /usr/bin/pg, /usr/bin/less +.Ed +.Pp +Here we override some of the compiled in default values. +We want +.Nm sudo +to log via +.Xr syslog 3 +using the +.Em auth +facility in all cases. +We don't want to subject the full time staff to the +.Nm sudo +lecture, user +.Sy millert +need not give a password, and we don't want to reset the +.Ev LOGNAME , +.Ev USER +or +.Ev USERNAME +environment variables when running commands as root. +Additionally, on the machines in the +.Em SERVERS +.Li Host_Alias , +we keep an additional local log file and make sure we log the year +in each log line since the log entries will be kept around for several years. +Lastly, we disable shell escapes for the commands in the PAGERS +.Li Cmnd_Alias +.Po +.Pa /usr/bin/more , +.Pa /usr/bin/pg +and +.Pa /usr/bin/less +.Pc . +.Bd -literal +# Override built-in defaults +Defaults syslog=auth +Defaults>root !set_logname +Defaults:FULLTIMERS !lecture +Defaults:millert !authenticate +Defaults@SERVERS log_year, logfile=/var/log/sudo.log +Defaults!PAGERS noexec +.Ed +.Pp +The +.Em User specification +is the part that actually determines who may run what. +.Bd -literal +root ALL = (ALL) ALL +%wheel ALL = (ALL) ALL +.Ed +.Pp +We let +.Sy root +and any user in group +.Sy wheel +run any command on any host as any user. +.Bd -literal +FULLTIMERS ALL = NOPASSWD: ALL +.Ed +.Pp +Full time sysadmins +.Po +.Sy millert , +.Sy mikef , +and +.Sy dowdy +.Pc +may run any command on any host without authenticating themselves. +.Bd -literal +PARTTIMERS ALL = ALL +.Ed +.Pp +Part time sysadmins +.Sy bostley , +.Sy jwfox , +and +.Sy crawl ) +may run any command on any host but they must authenticate themselves +first (since the entry lacks the +.Li NOPASSWD +tag). +.Bd -literal +jack CSNETS = ALL +.Ed +.Pp +The user +.Sy jack +may run any command on the machines in the +.Em CSNETS +alias (the networks +.Li 128.138.243.0 , +.Li 128.138.204.0 , +and +.Li 128.138.242.0 ) . +Of those networks, only +.Li 128.138.204.0 +has an explicit netmask (in CIDR notation) indicating it is a class C network. +For the other networks in +.Em CSNETS , +the local machine's netmask will be used during matching. +.Bd -literal +lisa CUNETS = ALL +.Ed +.Pp +The user +.Sy lisa +may run any command on any host in the +.Em CUNETS +alias (the class B network +.Li 128.138.0.0 ) . +.Bd -literal +operator ALL = DUMPS, KILL, SHUTDOWN, HALT, REBOOT, PRINTING,\e + sudoedit /etc/printcap, /usr/oper/bin/ +.Ed +.Pp +The +.Sy operator +user may run commands limited to simple maintenance. +Here, those are commands related to backups, killing processes, the +printing system, shutting down the system, and any commands in the +directory +.Pa /usr/oper/bin/ . +.Bd -literal +joe ALL = /usr/bin/su operator +.Ed +.Pp +The user +.Sy joe +may only +.Xr su 1 +to operator. +.Bd -literal +pete HPPA = /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root + +%opers ALL = (: ADMINGRP) /usr/sbin/ +.Ed +.Pp +Users in the +.Sy opers +group may run commands in +.Pa /usr/sbin/ +as themselves +with any group in the +.Em ADMINGRP +.Li Runas_Alias +(the +.Sy adm +and +.Sy oper +groups). +.Pp +The user +.Sy pete +is allowed to change anyone's password except for +root on the +.Em HPPA +machines. +Note that this assumes +.Xr passwd 1 +does not take multiple user names on the command line. +.Bd -literal +bob SPARC = (OP) ALL : SGI = (OP) ALL +.Ed +.Pp +The user +.Sy bob +may run anything on the +.Em SPARC +and +.Em SGI +machines as any user listed in the +.Em OP +.Li Runas_Alias +.Po +.Sy root +and +.Sy operator . +.Pc +.Bd -literal +jim +biglab = ALL +.Ed +.Pp +The user +.Sy jim +may run any command on machines in the +.Em biglab +netgroup. +.Nm sudo +knows that +.Dq biglab +is a netgroup due to the +.Ql + +prefix. +.Bd -literal ++secretaries ALL = PRINTING, /usr/bin/adduser, /usr/bin/rmuser +.Ed +.Pp +Users in the +.Sy secretaries +netgroup need to help manage the printers as well as add and remove users, +so they are allowed to run those commands on all machines. +.Bd -literal +fred ALL = (DB) NOPASSWD: ALL +.Ed +.Pp +The user +.Sy fred +can run commands as any user in the +.Em DB +.Li Runas_Alias +.Po +.Sy oracle +or +.Sy sybase +.Pc +without giving a password. +.Bd -literal +john ALPHA = /usr/bin/su [!-]*, !/usr/bin/su *root* +.Ed +.Pp +On the +.Em ALPHA +machines, user +.Sy john +may su to anyone except root but he is not allowed to specify any options +to the +.Xr su 1 +command. +.Bd -literal +jen ALL, !SERVERS = ALL +.Ed +.Pp +The user +.Sy jen +may run any command on any machine except for those in the +.Em SERVERS +.Li Host_Alias +(master, mail, www and ns). +.Bd -literal +jill SERVERS = /usr/bin/, !SU, !SHELLS +.Ed +.Pp +For any machine in the +.Em SERVERS +.Li Host_Alias , +.Sy jill +may run +any commands in the directory +.Pa /usr/bin/ +except for those commands +belonging to the +.Em SU +and +.Em SHELLS +.Li Cmnd_Aliases . +.Bd -literal +steve CSNETS = (operator) /usr/local/op_commands/ +.Ed +.Pp +The user +.Sy steve +may run any command in the directory /usr/local/op_commands/ +but only as user operator. +.Bd -literal +matt valkyrie = KILL +.Ed +.Pp +On his personal workstation, valkyrie, +.Sy matt +needs to be able to kill hung processes. +.Bd -literal +WEBMASTERS www = (www) ALL, (root) /usr/bin/su www +.Ed +.Pp +On the host www, any user in the +.Em WEBMASTERS +.Li User_Alias +(will, wendy, and wim), may run any command as user www (which owns the +web pages) or simply +.Xr su 1 +to www. +.Bd -literal +ALL CDROM = NOPASSWD: /sbin/umount /CDROM,\e + /sbin/mount -o nosuid\,nodev /dev/cd0a /CDROM +.Ed +.Pp +Any user may mount or unmount a CD-ROM on the machines in the CDROM +.Li Host_Alias +(orion, perseus, hercules) without entering a password. +This is a bit tedious for users to type, so it is a prime candidate +for encapsulating in a shell script. +.Sh SECURITY NOTES +.Ss Limitations of the So !\& Sc operator +It is generally not effective to +.Dq subtract +commands from +.Sy ALL +using the +.Ql !\& +operator. +A user can trivially circumvent this by copying the desired command +to a different name and then executing that. +For example: +.Bd -literal +bill ALL = ALL, !SU, !SHELLS +.Ed +.Pp +Doesn't really prevent +.Sy bill +from running the commands listed in +.Em SU +or +.Em SHELLS +since he can simply copy those commands to a different name, or use +a shell escape from an editor or other program. +Therefore, these kind of restrictions should be considered +advisory at best (and reinforced by policy). +.Pp +In general, if a user has sudo +.Sy ALL +there is nothing to prevent them from creating their own program that gives +them a root shell (or making their own copy of a shell) regardless of any +.Ql !\& +elements in the user specification. +.Ss Security implications of Em fast_glob +If the +.Em fast_glob +option is in use, it is not possible to reliably negate commands where the +path name includes globbing (aka wildcard) characters. +This is because the C library's +.Xr fnmatch 3 +function cannot resolve relative paths. +While this is typically only an inconvenience for rules that grant privileges, +it can result in a security issue for rules that subtract or revoke privileges. +.Pp +For example, given the following +.Em sudoers +entry: +.Bd -literal +john ALL = /usr/bin/passwd [a-zA-Z0-9]*, /usr/bin/chsh [a-zA-Z0-9]*,\e + /usr/bin/chfn [a-zA-Z0-9]*, !/usr/bin/* root +.Ed +.Pp +User +.Sy john +can still run +.Li /usr/bin/passwd root +if +.Em fast_glob +is enabled by changing to +.Pa /usr/bin +and running +.Li ./passwd root +instead. +.Ss Preventing Shell Escapes +Once +.Nm sudo +executes a program, that program is free to do whatever +it pleases, including run other programs. +This can be a security issue since it is not uncommon for a program to +allow shell escapes, which lets a user bypass +.Nm sudo Ns No 's +access control and logging. +Common programs that permit shell escapes include shells (obviously), +editors, paginators, mail and terminal programs. +.Pp +There are two basic approaches to this problem: +.Bl -tag -width 8n +.It restrict +Avoid giving users access to commands that allow the user to run +arbitrary commands. +Many editors have a restricted mode where shell +escapes are disabled, though +.Nm sudoedit +is a better solution to +running editors via +.Nm sudo . +Due to the large number of programs that +offer shell escapes, restricting users to the set of programs that +do not is often unworkable. +.It noexec +Many systems that support shared libraries have the ability to +override default library functions by pointing an environment +variable (usually +.Ev LD_PRELOAD ) +to an alternate shared library. +On such systems, +.Nm sudo Ns No 's +.Em noexec +functionality can be used to prevent a program run by +.Nm sudo +from executing any other programs. +Note, however, that this applies only to native dynamically-linked +executables. +Statically-linked executables and foreign executables +running under binary emulation are not affected. +.Pp +The +.Em noexec +feature is known to work on SunOS, Solaris, *BSD, +Linux, IRIX, Tru64 UNIX, MacOS X, HP-UX 11.x and AIX 5.3 and above. +It should be supported on most operating systems that support the +.Ev LD_PRELOAD +environment variable. +Check your operating system's manual pages for the dynamic linker +(usually ld.so, ld.so.1, dyld, dld.sl, rld, or loader) to see if +.Ev LD_PRELOAD +is supported. +.Pp +To enable +.Em noexec +for a command, use the +.Li NOEXEC +tag as documented +in the User Specification section above. +Here is that example again: +.Bd -literal +aaron shanty = NOEXEC: /usr/bin/more, /usr/bin/vi +.Ed +.Pp +This allows user +.Sy aaron +to run +.Pa /usr/bin/more +and +.Pa /usr/bin/vi +with +.Em noexec +enabled. +This will prevent those two commands from +executing other commands (such as a shell). +If you are unsure whether or not your system is capable of supporting +.Em noexec +you can always just try it out and check whether shell escapes work when +.Em noexec +is enabled. +.El +.Pp +Note that restricting shell escapes is not a panacea. +Programs running as root are still capable of many potentially hazardous +operations (such as changing or overwriting files) that could lead +to unintended privilege escalation. +In the specific case of an editor, a safer approach is to give the +user permission to run +.Nm sudoedit . +.Sh SEE ALSO +.Xr ssh 1 , +.Xr su 1 , +.Xr fnmatch 3 , +.Xr glob 3 , +.Xr mktemp 3 , +.Xr strftime 3 , +.Xr sudoers.ldap @mansectform@ , +.Xr sudo @mansectsu@ , +.Xr visudo @mansectsu@ +.Sh CAVEATS +The +.Em sudoers +file should +.Sy always +be edited by the +.Nm visudo +command which locks the file and does grammatical checking. +It is +imperative that +.Em sudoers +be free of syntax errors since +.Nm sudo +will not run with a syntactically incorrect +.Em sudoers +file. +.Pp +When using netgroups of machines (as opposed to users), if you +store fully qualified host name in the netgroup (as is usually the +case), you either need to have the machine's host name be fully qualified +as returned by the +.Li hostname +command or use the +.Em fqdn +option in +.Em sudoers . +.Sh BUGS +If you feel you have found a bug in +.Nm sudo , +please submit a bug report at http://www.sudo.ws/sudo/bugs/ +.Sh SUPPORT +Limited free support is available via the sudo-users mailing list, +see http://www.sudo.ws/mailman/listinfo/sudo-users to subscribe or +search the archives. +.Sh DISCLAIMER +.Nm sudo +is provided +.Dq AS IS +and any express or implied warranties, including, but not limited +to, the implied warranties of merchantability and fitness for a +particular purpose are disclaimed. +See the LICENSE file distributed with +.Nm sudo +or http://www.sudo.ws/sudo/license.html for complete details. diff --git a/usr.bin/sudo/sudoers.pod b/usr.bin/sudo/sudoers.pod deleted file mode 100644 index 4c1f1428f9b..00000000000 --- a/usr.bin/sudo/sudoers.pod +++ /dev/null @@ -1,1586 +0,0 @@ -Copyright (c) 1994-1996, 1998-2005, 2007-2010 - Todd C. Miller <Todd.Miller@courtesan.com> - -Permission to use, copy, modify, and distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -Sponsored in part by the Defense Advanced Research Projects -Agency (DARPA) and Air Force Research Laboratory, Air Force -Materiel Command, USAF, under agreement number F39502-99-1-0512. - -=pod - -=head1 NAME - -sudoers - list of which users may execute what - -=head1 DESCRIPTION - -The I<sudoers> file is composed of two types of entries: aliases -(basically variables) and user specifications (which specify who -may run what). - -When multiple entries match for a user, they are applied in order. -Where there are multiple matches, the last match is used (which is -not necessarily the most specific match). - -The I<sudoers> grammar will be described below in Extended Backus-Naur -Form (EBNF). Don't despair if you don't know what EBNF is; it is -fairly simple, and the definitions below are annotated. - -=head2 Quick guide to EBNF - -EBNF is a concise and exact way of describing the grammar of a language. -Each EBNF definition is made up of I<production rules>. E.g., - - symbol ::= definition | alternate1 | alternate2 ... - -Each I<production rule> references others and thus makes up a -grammar for the language. EBNF also contains the following -operators, which many readers will recognize from regular -expressions. Do not, however, confuse them with "wildcard" -characters, which have different meanings. - -=over 4 - -=item C<?> - -Means that the preceding symbol (or group of symbols) is optional. -That is, it may appear once or not at all. - -=item C<*> - -Means that the preceding symbol (or group of symbols) may appear -zero or more times. - -=item C<+> - -Means that the preceding symbol (or group of symbols) may appear -one or more times. - -=back - -Parentheses may be used to group symbols together. For clarity, -we will use single quotes ('') to designate what is a verbatim character -string (as opposed to a symbol name). - -=head2 Aliases - -There are four kinds of aliases: C<User_Alias>, C<Runas_Alias>, -C<Host_Alias> and C<Cmnd_Alias>. - - Alias ::= 'User_Alias' User_Alias (':' User_Alias)* | - 'Runas_Alias' Runas_Alias (':' Runas_Alias)* | - 'Host_Alias' Host_Alias (':' Host_Alias)* | - 'Cmnd_Alias' Cmnd_Alias (':' Cmnd_Alias)* - - User_Alias ::= NAME '=' User_List - - Runas_Alias ::= NAME '=' Runas_List - - Host_Alias ::= NAME '=' Host_List - - Cmnd_Alias ::= NAME '=' Cmnd_List - - NAME ::= [A-Z]([A-Z][0-9]_)* - -Each I<alias> definition is of the form - - Alias_Type NAME = item1, item2, ... - -where I<Alias_Type> is one of C<User_Alias>, C<Runas_Alias>, C<Host_Alias>, -or C<Cmnd_Alias>. A C<NAME> is a string of uppercase letters, numbers, -and underscore characters ('_'). A C<NAME> B<must> start with an -uppercase letter. It is possible to put several alias definitions -of the same type on a single line, joined by a colon (':'). E.g., - - Alias_Type NAME = item1, item2, item3 : NAME = item4, item5 - -The definitions of what constitutes a valid I<alias> member follow. - - User_List ::= User | - User ',' User_List - - User ::= '!'* username | - '!'* '#'uid | - '!'* '%'group | - '!'* '+'netgroup | - '!'* '%:'nonunix_group | - '!'* User_Alias - -A C<User_List> is made up of one or more usernames, uids (prefixed -with '#'), system groups (prefixed with '%'), netgroups (prefixed -with '+') and C<User_Alias>es. Each list item may be prefixed with -zero or more '!' operators. An odd number of '!' operators negate -the value of the item; an even number just cancel each other out. - -A C<username>, C<group>, C<netgroup> and C<nonunix_groups> may -be enclosed in double quotes to avoid the need for escaping special -characters. Alternately, special characters may be specified in -escaped hex mode, e.g. \x20 for space. - -The C<nonunix_group> syntax depends on the underlying implementation. -For instance, the QAS AD backend supports the following formats: - -=over 4 - -=item * - -Group in the same domain: "Group Name" - -=item * - -Group in any domain: "Group Name@FULLY.QUALIFIED.DOMAIN" - -=item * - -Group SID: "S-1-2-34-5678901234-5678901234-5678901234-567" - -=back - -Note that quotes around group names are optional. Unquoted strings must -use a backslash (\) to escape spaces and the '@' symbol. - - Runas_List ::= Runas_Member | - Runas_Member ',' Runas_List - - Runas_Member ::= '!'* username | - '!'* '#'uid | - '!'* '%'group | - '!'* +netgroup | - '!'* Runas_Alias - -A C<Runas_List> is similar to a C<User_List> except that instead -of C<User_Alias>es it can contain C<Runas_Alias>es. Note that -usernames and groups are matched as strings. In other words, two -users (groups) with the same uid (gid) are considered to be distinct. -If you wish to match all usernames with the same uid (e.g.E<nbsp>root -and toor), you can use a uid instead (#0 in the example given). - - Host_List ::= Host | - Host ',' Host_List - - Host ::= '!'* hostname | - '!'* ip_addr | - '!'* network(/netmask)? | - '!'* '+'netgroup | - '!'* Host_Alias - -A C<Host_List> is made up of one or more hostnames, IP addresses, -network numbers, netgroups (prefixed with '+') and other aliases. -Again, the value of an item may be negated with the '!' operator. -If you do not specify a netmask along with the network number, -B<sudo> will query each of the local host's network interfaces and, -if the network number corresponds to one of the hosts's network -interfaces, the corresponding netmask will be used. The netmask -may be specified either in standard IP address notation -(e.g.E<nbsp>255.255.255.0 or ffff:ffff:ffff:ffff::), -or CIDR notation (number of bits, e.g.E<nbsp>24 or 64). A hostname may -include shell-style wildcards (see the L<Wildcards> section below), -but unless the C<hostname> command on your machine returns the fully -qualified hostname, you'll need to use the I<fqdn> option for -wildcards to be useful. - - Cmnd_List ::= Cmnd | - Cmnd ',' Cmnd_List - - commandname ::= filename | - filename args | - filename '""' - - Cmnd ::= '!'* commandname | - '!'* directory | - '!'* "sudoedit" | - '!'* Cmnd_Alias - -A C<Cmnd_List> is a list of one or more commandnames, directories, and other -aliases. A commandname is a fully qualified filename which may include -shell-style wildcards (see the L<Wildcards> section below). A simple -filename allows the user to run the command with any arguments he/she -wishes. However, you may also specify command line arguments (including -wildcards). Alternately, you can specify C<""> to indicate that the command -may only be run B<without> command line arguments. A directory is a -fully qualified pathname ending in a '/'. When you specify a directory -in a C<Cmnd_List>, the user will be able to run any file within that directory -(but not in any subdirectories therein). - -If a C<Cmnd> has associated command line arguments, then the arguments -in the C<Cmnd> must match exactly those given by the user on the command line -(or match the wildcards if there are any). Note that the following -characters must be escaped with a '\' if they are used in command -arguments: ',', ':', '=', '\'. The special command C<"sudoedit"> -is used to permit a user to run B<sudo> with the B<-e> option (or -as B<sudoedit>). It may take command line arguments just as -a normal command does. - -=head2 Defaults - -Certain configuration options may be changed from their default -values at runtime via one or more C<Default_Entry> lines. These -may affect all users on any host, all users on a specific host, a -specific user, a specific command, or commands being run as a specific user. -Note that per-command entries may not include command line arguments. -If you need to specify arguments, define a C<Cmnd_Alias> and reference -that instead. - - Default_Type ::= 'Defaults' | - 'Defaults' '@' Host_List | - 'Defaults' ':' User_List | - 'Defaults' '!' Cmnd_List | - 'Defaults' '>' Runas_List - - Default_Entry ::= Default_Type Parameter_List - - Parameter_List ::= Parameter | - Parameter ',' Parameter_List - - Parameter ::= Parameter '=' Value | - Parameter '+=' Value | - Parameter '-=' Value | - '!'* Parameter - -Parameters may be B<flags>, B<integer> values, B<strings>, or B<lists>. -Flags are implicitly boolean and can be turned off via the '!' -operator. Some integer, string and list parameters may also be -used in a boolean context to disable them. Values may be enclosed -in double quotes (C<">) when they contain multiple words. Special -characters may be escaped with a backslash (C<\>). - -Lists have two additional assignment operators, C<+=> and C<-=>. -These operators are used to add to and delete from a list respectively. -It is not an error to use the C<-=> operator to remove an element -that does not exist in a list. - -Defaults entries are parsed in the following order: generic, host -and user Defaults first, then runas Defaults and finally command -defaults. - -See L<"SUDOERS OPTIONS"> for a list of supported Defaults parameters. - -=head2 User Specification - - User_Spec ::= User_List Host_List '=' Cmnd_Spec_List \ - (':' Host_List '=' Cmnd_Spec_List)* - - Cmnd_Spec_List ::= Cmnd_Spec | - Cmnd_Spec ',' Cmnd_Spec_List - - Cmnd_Spec ::= Runas_Spec? Tag_Spec* Cmnd - - Runas_Spec ::= '(' Runas_List? (':' Runas_List)? ')' - - Tag_Spec ::= ('NOPASSWD:' | 'PASSWD:' | 'NOEXEC:' | 'EXEC:' | - 'SETENV:' | 'NOSETENV:' ) - -A B<user specification> determines which commands a user may run -(and as what user) on specified hosts. By default, commands are -run as B<root>, but this can be changed on a per-command basis. - -The basic structure of a user specification is `who = where (as_whom) -what'. Let's break that down into its constituent parts: - -=head2 Runas_Spec - -A C<Runas_Spec> determines the user and/or the group that a command -may be run as. A fully-specified C<Runas_Spec> consists of two -C<Runas_List>s (as defined above) separated by a colon (':') and -enclosed in a set of parentheses. The first C<Runas_List> indicates -which users the command may be run as via B<sudo>'s B<-u> option. -The second defines a list of groups that can be specified via -B<sudo>'s B<-g> option. If both C<Runas_List>s are specified, the -command may be run with any combination of users and groups listed -in their respective C<Runas_List>s. If only the first is specified, -the command may be run as any user in the list but no B<-g> option -may be specified. If the first C<Runas_List> is empty but the -second is specified, the command may be run as the invoking user -with the group set to any listed in the C<Runas_List>. If no -C<Runas_Spec> is specified the command may be run as B<root> and -no group may be specified. - -A C<Runas_Spec> sets the default for the commands that follow it. -What this means is that for the entry: - - dgb boulder = (operator) /bin/ls, /bin/kill, /usr/bin/lprm - -The user B<dgb> may run F</bin/ls>, F</bin/kill>, and -F</usr/bin/lprm> -- but only as B<operator>. E.g., - - $ sudo -u operator /bin/ls. - -It is also possible to override a C<Runas_Spec> later on in an -entry. If we modify the entry like so: - - dgb boulder = (operator) /bin/ls, (root) /bin/kill, /usr/bin/lprm - -Then user B<dgb> is now allowed to run F</bin/ls> as B<operator>, -but F</bin/kill> and F</usr/bin/lprm> as B<root>. - -We can extend this to allow B<dgb> to run C</bin/ls> with either -the user or group set to B<operator>: - - dgb boulder = (operator : operator) /bin/ls, (root) /bin/kill, \ - /usr/bin/lprm - -In the following example, user B<tcm> may run commands that access -a modem device file with the dialer group. Note that in this example -only the group will be set, the command still runs as user B<tcm>. - - tcm boulder = (:dialer) /usr/bin/tip, /usr/bin/cu, \ - /usr/local/bin/minicom - -=head2 Tag_Spec - -A command may have zero or more tags associated with it. There are -eight possible tag values, C<NOPASSWD>, C<PASSWD>, C<NOEXEC>, C<EXEC>, -C<SETENV> and C<NOSETENV>. -Once a tag is set on a C<Cmnd>, subsequent C<Cmnd>s in the -C<Cmnd_Spec_List>, inherit the tag unless it is overridden by the -opposite tag (i.e.: C<PASSWD> overrides C<NOPASSWD> and C<NOEXEC> -overrides C<EXEC>). - -=head3 NOPASSWD and PASSWD - -By default, B<sudo> requires that a user authenticate him or herself -before running a command. This behavior can be modified via the -C<NOPASSWD> tag. Like a C<Runas_Spec>, the C<NOPASSWD> tag sets -a default for the commands that follow it in the C<Cmnd_Spec_List>. -Conversely, the C<PASSWD> tag can be used to reverse things. -For example: - - ray rushmore = NOPASSWD: /bin/kill, /bin/ls, /usr/bin/lprm - -would allow the user B<ray> to run F</bin/kill>, F</bin/ls>, and -F</usr/bin/lprm> as B<root> on the machine rushmore without -authenticating himself. If we only want B<ray> to be able to -run F</bin/kill> without a password the entry would be: - - ray rushmore = NOPASSWD: /bin/kill, PASSWD: /bin/ls, /usr/bin/lprm - -Note, however, that the C<PASSWD> tag has no effect on users who are -in the group specified by the I<exempt_group> option. - -By default, if the C<NOPASSWD> tag is applied to any of the entries -for a user on the current host, he or she will be able to run -C<sudo -l> without a password. Additionally, a user may only run -C<sudo -v> without a password if the C<NOPASSWD> tag is present -for all a user's entries that pertain to the current host. -This behavior may be overridden via the verifypw and listpw options. - -=head3 NOEXEC and EXEC - -If B<sudo> has been compiled with I<noexec> support and the underlying -operating system supports it, the C<NOEXEC> tag can be used to prevent -a dynamically-linked executable from running further commands itself. - -In the following example, user B<aaron> may run F</usr/bin/more> -and F</usr/bin/vi> but shell escapes will be disabled. - - aaron shanty = NOEXEC: /usr/bin/more, /usr/bin/vi - -See the L<PREVENTING SHELL ESCAPES> section below for more details -on how C<NOEXEC> works and whether or not it will work on your system. - -=head3 SETENV and NOSETENV - -These tags override the value of the I<setenv> option on a per-command -basis. Note that if C<SETENV> has been set for a command, any -environment variables set on the command line way are not subject -to the restrictions imposed by I<env_check>, I<env_delete>, or -I<env_keep>. As such, only trusted users should be allowed to set -variables in this manner. If the command matched is B<ALL>, the -C<SETENV> tag is implied for that command; this default may -be overridden by use of the C<UNSETENV> tag. - -=head2 Wildcards - -B<sudo> allows shell-style I<wildcards> (aka meta or glob characters) -to be used in hostnames, pathnames and command line arguments in -the I<sudoers> file. Wildcard matching is done via the B<POSIX> -L<glob(3)> and L<fnmatch(3)> routines. Note that these are I<not> -regular expressions. - -=over 8 - -=item C<*> - -Matches any set of zero or more characters. - -=item C<?> - -Matches any single character. - -=item C<[...]> - -Matches any character in the specified range. - -=item C<[!...]> - -Matches any character B<not> in the specified range. - -=item C<\x> - -For any character "x", evaluates to "x". This is used to -escape special characters such as: "*", "?", "[", and "}". - -=back - -POSIX character classes may also be used if your system's L<glob(3)> -and L<fnmatch(3)> functions support them. However, because the -C<':'> character has special meaning in I<sudoers>, it must be -escaped. For example: - - /bin/ls [[\:alpha\:]]* - -Would match any filename beginning with a letter. - -Note that a forward slash ('/') will B<not> be matched by -wildcards used in the pathname. When matching the command -line arguments, however, a slash B<does> get matched by -wildcards. This is to make a path like: - - /usr/bin/* - -match F</usr/bin/who> but not F</usr/bin/X11/xterm>. - -=head2 Exceptions to wildcard rules - -The following exceptions apply to the above rules: - -=over 8 - -=item C<""> - -If the empty string C<""> is the only command line argument in the -I<sudoers> entry it means that command is not allowed to be run -with B<any> arguments. - -=back - -=head2 Including other files from within sudoers - -It is possible to include other I<sudoers> files from within the -I<sudoers> file currently being parsed using the C<#include> and -C<#includedir> directives. - -This can be used, for example, to keep a site-wide I<sudoers> file -in addition to a local, per-machine file. For the sake of this -example the site-wide I<sudoers> will be F</etc/sudoers> and the -per-machine one will be F</etc/sudoers.local>. To include -F</etc/sudoers.local> from within F</etc/sudoers> we would use the -following line in F</etc/sudoers>: - -=over 4 - -C<#include /etc/sudoers.local> - -=back - -When B<sudo> reaches this line it will suspend processing of the -current file (F</etc/sudoers>) and switch to F</etc/sudoers.local>. -Upon reaching the end of F</etc/sudoers.local>, the rest of -F</etc/sudoers> will be processed. Files that are included may -themselves include other files. A hard limit of 128 nested include -files is enforced to prevent include file loops. - -The filename may include the C<%h> escape, signifying the short form -of the hostname. I.e., if the machine's hostname is "xerxes", then - -C<#include /etc/sudoers.%h> - -will cause B<sudo> to include the file F</etc/sudoers.xerxes>. - -The C<#includedir> directive can be used to create a F<sudo.d> -directory that the system package manager can drop I<sudoers> rules -into as part of package installation. For example, given: - -C<#includedir /etc/sudoers.d> - -B<sudo> will read each file in F</etc/sudoers.d>, skipping file -names that end in C<~> or contain a C<.> character to avoid causing -problems with package manager or editor temporary/backup files. -Files are parsed in sorted lexical order. That is, -F</etc/sudoers.d/01_first> will be parsed before -F</etc/sudoers.d/10_second>. Be aware that because the sorting is -lexical, not numeric, F</etc/sudoers.d/1_whoops> would be loaded -B<after> F</etc/sudoers.d/10_second>. Using a consistent number -of leading zeroes in the file names can be used to avoid such -problems. - -Note that unlike files included via C<#include>, B<visudo> will not -edit the files in a C<#includedir> directory unless one of them -contains a syntax error. It is still possible to run B<visudo> -with the C<-f> flag to edit the files directly. - -=head2 Other special characters and reserved words - -The pound sign ('#') is used to indicate a comment (unless it is -part of a #include directive or unless it occurs in the context of -a user name and is followed by one or more digits, in which case -it is treated as a uid). Both the comment character and any text -after it, up to the end of the line, are ignored. - -The reserved word B<ALL> is a built-in I<alias> that always causes -a match to succeed. It can be used wherever one might otherwise -use a C<Cmnd_Alias>, C<User_Alias>, C<Runas_Alias>, or C<Host_Alias>. -You should not try to define your own I<alias> called B<ALL> as the -built-in alias will be used in preference to your own. Please note -that using B<ALL> can be dangerous since in a command context, it -allows the user to run B<any> command on the system. - -An exclamation point ('!') can be used as a logical I<not> operator -both in an I<alias> and in front of a C<Cmnd>. This allows one to -exclude certain values. Note, however, that using a C<!> in -conjunction with the built-in C<ALL> alias to allow a user to -run "all but a few" commands rarely works as intended (see SECURITY -NOTES below). - -Long lines can be continued with a backslash ('\') as the last -character on the line. - -Whitespace between elements in a list as well as special syntactic -characters in a I<User Specification> ('=', ':', '(', ')') is optional. - -The following characters must be escaped with a backslash ('\') when -used as part of a word (e.g.E<nbsp>a username or hostname): -'@', '!', '=', ':', ',', '(', ')', '\'. - -=head1 SUDOERS OPTIONS - -B<sudo>'s behavior can be modified by C<Default_Entry> lines, as -explained earlier. A list of all supported Defaults parameters, -grouped by type, are listed below. - -B<Flags>: - -=over 16 - -=item always_set_home - -If set, B<sudo> will set the C<HOME> environment variable to the home -directory of the target user (which is root unless the B<-u> option is used). -This effectively means that the B<-H> option is always implied. -This flag is I<off> by default. - -=item authenticate - -If set, users must authenticate themselves via a password (or other -means of authentication) before they may run commands. This default -may be overridden via the C<PASSWD> and C<NOPASSWD> tags. -This flag is I<on> by default. - -=item closefrom_override - -If set, the user may use B<sudo>'s B<-C> option which -overrides the default starting point at which B<sudo> begins -closing open file descriptors. This flag is I<off> by default. - -=item env_editor - -If set, B<visudo> will use the value of the EDITOR or VISUAL -environment variables before falling back on the default editor list. -Note that this may create a security hole as it allows the user to -run any arbitrary command as root without logging. A safer alternative -is to place a colon-separated list of editors in the C<editor> -variable. B<visudo> will then only use the EDITOR or VISUAL if -they match a value specified in C<editor>. This flag is I<@env_editor@> by -default. - -=item env_reset - -If set, B<sudo> will reset the environment to only contain the -LOGNAME, SHELL, USER, USERNAME and the C<SUDO_*> variables. Any -variables in the caller's environment that match the C<env_keep> -and C<env_check> lists are then added. The default contents of the -C<env_keep> and C<env_check> lists are displayed when B<sudo> is -run by root with the I<-V> option. If the I<secure_path> option -is set, its value will be used for the C<PATH> environment variable. -This flag is I<on> by default. - -=item fqdn - -Set this flag if you want to put fully qualified hostnames in the -I<sudoers> file. I.e., instead of myhost you would use myhost.mydomain.edu. -You may still use the short form if you wish (and even mix the two). -Beware that turning on I<fqdn> requires B<sudo> to make DNS lookups -which may make B<sudo> unusable if DNS stops working (for example -if the machine is not plugged into the network). Also note that -you must use the host's official name as DNS knows it. That is, -you may not use a host alias (C<CNAME> entry) due to performance -issues and the fact that there is no way to get all aliases from -DNS. If your machine's hostname (as returned by the C<hostname> -command) is already fully qualified you shouldn't need to set -I<fqdn>. This flag is I<@fqdn@> by default. - -=item ignore_dot - -If set, B<sudo> will ignore '.' or '' (current dir) in the C<PATH> -environment variable; the C<PATH> itself is not modified. This -flag is I<@ignore_dot@> by default. - -=item ignore_local_sudoers - -If set via LDAP, parsing of F<@sysconfdir@/sudoers> will be skipped. -This is intended for Enterprises that wish to prevent the usage of local -sudoers files so that only LDAP is used. This thwarts the efforts of -rogue operators who would attempt to add roles to F<@sysconfdir@/sudoers>. -When this option is present, F<@sysconfdir@/sudoers> does not even need to -exist. Since this option tells B<sudo> how to behave when no specific LDAP -entries have been matched, this sudoOption is only meaningful for the -C<cn=defaults> section. This flag is I<off> by default. - -=item insults - -If set, B<sudo> will insult users when they enter an incorrect -password. This flag is I<@insults@> by default. - -=item log_host - -If set, the hostname will be logged in the (non-syslog) B<sudo> log file. -This flag is I<off> by default. - -=item log_year - -If set, the four-digit year will be logged in the (non-syslog) B<sudo> log file. -This flag is I<off> by default. - -=item long_otp_prompt - -When validating with a One Time Password (OPT) scheme such as -B<S/Key> or B<OPIE>, a two-line prompt is used to make it easier -to cut and paste the challenge to a local window. It's not as -pretty as the default but some people find it more convenient. This -flag is I<@long_otp_prompt@> by default. - -=item mail_always - -Send mail to the I<mailto> user every time a users runs B<sudo>. -This flag is I<off> by default. - -=item mail_badpass - -Send mail to the I<mailto> user if the user running B<sudo> does not -enter the correct password. This flag is I<off> by default. - -=item mail_no_host - -If set, mail will be sent to the I<mailto> user if the invoking -user exists in the I<sudoers> file, but is not allowed to run -commands on the current host. This flag is I<@mail_no_host@> by default. - -=item mail_no_perms - -If set, mail will be sent to the I<mailto> user if the invoking -user is allowed to use B<sudo> but the command they are trying is not -listed in their I<sudoers> file entry or is explicitly denied. -This flag is I<@mail_no_perms@> by default. - -=item mail_no_user - -If set, mail will be sent to the I<mailto> user if the invoking -user is not in the I<sudoers> file. This flag is I<@mail_no_user@> -by default. - -=item noexec - -If set, all commands run via B<sudo> will behave as if the C<NOEXEC> -tag has been set, unless overridden by a C<EXEC> tag. See the -description of I<NOEXEC and EXEC> below as well as the L<PREVENTING SHELL -ESCAPES> section at the end of this manual. This flag is I<off> by default. - -=item path_info - -Normally, B<sudo> will tell the user when a command could not be -found in their C<PATH> environment variable. Some sites may wish -to disable this as it could be used to gather information on the -location of executables that the normal user does not have access -to. The disadvantage is that if the executable is simply not in -the user's C<PATH>, B<sudo> will tell the user that they are not -allowed to run it, which can be confusing. This flag is I<@path_info@> -by default. - -=item passprompt_override - -The password prompt specified by I<passprompt> will normally only -be used if the password prompt provided by systems such as PAM matches -the string "Password:". If I<passprompt_override> is set, I<passprompt> -will always be used. This flag is I<off> by default. - -=item preserve_groups - -By default, B<sudo> will initialize the group vector to the list of -groups the target user is in. When I<preserve_groups> is set, the -user's existing group vector is left unaltered. The real and -effective group IDs, however, are still set to match the target -user. This flag is I<off> by default. - -=item pwfeedback - -By default, B<sudo> reads the password like most other Unix programs, -by turning off echo until the user hits the return (or enter) key. -Some users become confused by this as it appears to them that B<sudo> -has hung at this point. When I<pwfeedback> is set, B<sudo> will -provide visual feedback when the user presses a key. Note that -this does have a security impact as an onlooker may be able to -determine the length of the password being entered. -This flag is I<off> by default. - -=item requiretty - -If set, B<sudo> will only run when the user is logged in to a real -tty. When this flag is set, B<sudo> can only be run from a login -session and not via other means such as L<cron(8)> or cgi-bin scripts. -This flag is I<off> by default. - -=item root_sudo - -If set, root is allowed to run B<sudo> too. Disabling this prevents users -from "chaining" B<sudo> commands to get a root shell by doing something -like C<"sudo sudo /bin/sh">. Note, however, that turning off I<root_sudo> -will also prevent root and from running B<sudoedit>. -Disabling I<root_sudo> provides no real additional security; it -exists purely for historical reasons. -This flag is I<@root_sudo@> by default. - -=item rootpw - -If set, B<sudo> will prompt for the root password instead of the password -of the invoking user. This flag is I<off> by default. - -=item runaspw - -If set, B<sudo> will prompt for the password of the user defined by the -I<runas_default> option (defaults to C<@runas_default@>) instead of the -password of the invoking user. This flag is I<off> by default. - -=item set_home - -If set and B<sudo> is invoked with the B<-s> option the C<HOME> -environment variable will be set to the home directory of the target -user (which is root unless the B<-u> option is used). This effectively -makes the B<-s> option imply B<-H>. This flag is I<off> by default. - -=item set_logname - -Normally, B<sudo> will set the C<LOGNAME>, C<USER> and C<USERNAME> -environment variables to the name of the target user (usually root -unless the B<-u> option is given). However, since some programs -(including the RCS revision control system) use C<LOGNAME> to -determine the real identity of the user, it may be desirable to -change this behavior. This can be done by negating the set_logname -option. Note that if the I<env_reset> option has not been disabled, -entries in the I<env_keep> list will override the value of -I<set_logname>. This flag is I<off> by default. - -=item setenv - -Allow the user to disable the I<env_reset> option from the command -line. Additionally, environment variables set via the command line -are not subject to the restrictions imposed by I<env_check>, -I<env_delete>, or I<env_keep>. As such, only trusted users should -be allowed to set variables in this manner. This flag is I<off> -by default. - -=item shell_noargs - -If set and B<sudo> is invoked with no arguments it acts as if the -B<-s> option had been given. That is, it runs a shell as root (the -shell is determined by the C<SHELL> environment variable if it is -set, falling back on the shell listed in the invoking user's -/etc/passwd entry if not). This flag is I<off> by default. - -=item fast_glob - -Normally, B<sudo> uses the L<glob(3)> function to do shell-style -globbing when matching pathnames. However, since it accesses the -file system, L<glob(3)> can take a long time to complete for some -patterns, especially when the pattern references a network file -system that is mounted on demand (automounted). The I<fast_glob> -option causes B<sudo> to use the L<fnmatch(3)> function, which does -not access the file system to do its matching. The disadvantage -of I<fast_glob> is that it is unable to match relative pathnames -such as F<./ls> or F<../bin/ls>. This has security implications -when path names that include globbing characters are used with the -negation operator, C<'!'>, as such rules can be trivially bypassed. -As such, this option should not be used when I<sudoers> contains rules -that contain negated path names which include globbing characters. -This flag is I<off> by default. - -=item stay_setuid - -Normally, when B<sudo> executes a command the real and effective -UIDs are set to the target user (root by default). This option -changes that behavior such that the real UID is left as the invoking -user's UID. In other words, this makes B<sudo> act as a setuid -wrapper. This can be useful on systems that disable some potentially -dangerous functionality when a program is run setuid. This option -is only effective on systems with either the setreuid() or setresuid() -function. This flag is I<off> by default. - -=item targetpw - -If set, B<sudo> will prompt for the password of the user specified by -the B<-u> option (defaults to C<root>) instead of the password of the -invoking user. Note that this precludes the use of a uid not listed -in the passwd database as an argument to the B<-u> option. -This flag is I<off> by default. - -=item tty_tickets - -If set, users must authenticate on a per-tty basis. Normally, -B<sudo> uses a directory in the ticket dir with the same name as -the user running it. With this flag enabled, B<sudo> will use a -file named for the tty the user is logged in on in that directory. -This flag is I<@tty_tickets@> by default. - -=item umask_override - -If set, B<sudo> will set the umask as specified by I<sudoers> without -modification. This makes it possible to specify a more permissive -umask in I<sudoers> than the user's own umask and matches historical -behavior. If I<umask_override> is not set, B<sudo> will set the -umask to be the union of the user's umask and what is specified in -I<sudoers>. This flag is I<off> by default. - -=item use_loginclass - -If set, B<sudo> will apply the defaults specified for the target user's -login class if one exists. Only available if B<sudo> is configured with -the --with-logincap option. This flag is I<off> by default. - -=item visiblepw - -By default, B<sudo> will refuse to run if the user must enter a -password but it is not possible to disable echo on the terminal. -If the I<visiblepw> flag is set, B<sudo> will prompt for a password -even when it would be visible on the screen. This makes it possible -to run things like C<"rsh somehost sudo ls"> since L<rsh(1)> does -not allocate a tty. This flag is I<off> by default. - -=back - -B<Integers>: - -=over 16 - -=item closefrom - -Before it executes a command, B<sudo> will close all open file -descriptors other than standard input, standard output and standard -error (ie: file descriptors 0-2). The I<closefrom> option can be used -to specify a different file descriptor at which to start closing. -The default is C<3>. - -=item passwd_tries - -The number of tries a user gets to enter his/her password before -B<sudo> logs the failure and exits. The default is C<@passwd_tries@>. - -=back - -B<Integers that can be used in a boolean context>: - -=over 16 - -=item loglinelen - -Number of characters per line for the file log. This value is used -to decide when to wrap lines for nicer log files. This has no -effect on the syslog log file, only the file log. The default is -C<@loglen@> (use 0 or negate the option to disable word wrap). - -=item passwd_timeout - -Number of minutes before the B<sudo> password prompt times out. -The default is C<@password_timeout@>; set this to C<0> for no password timeout. - -=item timestamp_timeout - -Number of minutes that can elapse before B<sudo> will ask for a -passwd again. The default is C<@timeout@>. Set this to C<0> to always -prompt for a password. -If set to a value less than C<0> the user's timestamp will never -expire. This can be used to allow users to create or delete their -own timestamps via C<sudo -v> and C<sudo -k> respectively. - -=item umask - -Umask to use when running the command. Negate this option or set -it to 0777 to preserve the user's umask. The actual umask that is -used will be the union of the user's umask and C<@sudo_umask@>. -This guarantees that B<sudo> never lowers the umask when running a -command. Note on systems that use PAM, the default PAM configuration -may specify its own umask which will override the value set in -I<sudoers>. - -=back - -B<Strings>: - -=over 16 - -=item badpass_message - -Message that is displayed if a user enters an incorrect password. -The default is C<@badpass_message@> unless insults are enabled. - -=item editor - -A colon (':') separated list of editors allowed to be used with -B<visudo>. B<visudo> will choose the editor that matches the user's -EDITOR environment variable if possible, or the first editor in the -list that exists and is executable. The default is the path to vi -on your system. - -=item mailsub - -Subject of the mail sent to the I<mailto> user. The escape C<%h> -will expand to the hostname of the machine. -Default is C<@mailsub@>. - -=item noexec_file - -Path to a shared library containing dummy versions of the execv(), -execve() and fexecve() library functions that just return an error. -This is used to implement the I<noexec> functionality on systems that -support C<LD_PRELOAD> or its equivalent. Defaults to F<@noexec_file@>. - -=item passprompt - -The default prompt to use when asking for a password; can be overridden -via the B<-p> option or the C<SUDO_PROMPT> environment variable. -The following percent (`C<%>') escapes are supported: - -=over 4 - -=item C<%H> - -expanded to the local hostname including the domain name -(on if the machine's hostname is fully qualified or the I<fqdn> -option is set) - -=item C<%h> - -expanded to the local hostname without the domain name - -=item C<%p> - -expanded to the user whose password is being asked for (respects the -I<rootpw>, I<targetpw> and I<runaspw> flags in I<sudoers>) - -=item C<%U> - -expanded to the login name of the user the command will -be run as (defaults to root) - -=item C<%u> - -expanded to the invoking user's login name - -=item C<%%> - -two consecutive C<%> characters are collapsed into a single C<%> character - -=back - -The default value is C<@passprompt@>. - -=item runas_default - -The default user to run commands as if the B<-u> option is not specified -on the command line. This defaults to C<@runas_default@>. -Note that if I<runas_default> is set it B<must> occur before -any C<Runas_Alias> specifications. - -=item syslog_badpri - -Syslog priority to use when user authenticates unsuccessfully. -Defaults to C<@badpri@>. - -=item syslog_goodpri - -Syslog priority to use when user authenticates successfully. -Defaults to C<@goodpri@>. - -=item sudoers_locale - -Locale to use when parsing the sudoers file. Note that changing -the locale may affect how sudoers is interpreted. -Defaults to C<"C">. - -=item timestampdir - -The directory in which B<sudo> stores its timestamp files. -The default is F<@timedir@>. - -=item timestampowner - -The owner of the timestamp directory and the timestamps stored therein. -The default is C<root>. - -=back - -B<Strings that can be used in a boolean context>: - -=over 12 - -=item askpass - -The I<askpass> option specifies the fully qualified path to a helper -program used to read the user's password when no terminal is -available. This may be the case when B<sudo> is executed from a -graphical (as opposed to text-based) application. The program -specified by I<askpass> should display the argument passed to it -as the prompt and write the user's password to the standard output. -The value of I<askpass> may be overridden by the C<SUDO_ASKPASS> -environment variable. - -=item env_file - -The I<env_file> options specifies the fully qualified path to a -file containing variables to be set in the environment of the program -being run. Entries in this file should either be of the form -C<VARIABLE=value> or C<export VARIABLE=value>. The value may -optionally be surrounded by single or double quotes. Variables in -this file are subject to other B<sudo> environment settings such -as I<env_keep> and I<env_check>. - -=item exempt_group - -Users in this group are exempt from password and PATH requirements. -This is not set by default. - -=item lecture - -This option controls when a short lecture will be printed along with -the password prompt. It has the following possible values: - -=over 8 - -=item always - -Always lecture the user. - -=item never - -Never lecture the user. - -=item once - -Only lecture the user the first time they run B<sudo>. - -=back - -If no value is specified, a value of I<once> is implied. -Negating the option results in a value of I<never> being used. -The default value is I<@lecture@>. - -=item lecture_file - -Path to a file containing an alternate B<sudo> lecture that will -be used in place of the standard lecture if the named file exists. -By default, B<sudo> uses a built-in lecture. - -=item listpw - -This option controls when a password will be required when a -user runs B<sudo> with the B<-l> option. It has the following possible values: - -=over 8 - -=item all - -All the user's I<sudoers> entries for the current host must have -the C<NOPASSWD> flag set to avoid entering a password. - -=item always - -The user must always enter a password to use the B<-l> option. - -=item any - -At least one of the user's I<sudoers> entries for the current host -must have the C<NOPASSWD> flag set to avoid entering a password. - -=item never - -The user need never enter a password to use the B<-l> option. - -=back - -If no value is specified, a value of I<any> is implied. -Negating the option results in a value of I<never> being used. -The default value is I<any>. - -=item logfile - -Path to the B<sudo> log file (not the syslog log file). Setting a path -turns on logging to a file; negating this option turns it off. -By default, B<sudo> logs via syslog. - -=item mailerflags - -Flags to use when invoking mailer. Defaults to B<-t>. - -=item mailerpath - -Path to mail program used to send warning mail. -Defaults to the path to sendmail found at configure time. - -=item mailfrom - -Address to use for the "from" address when sending warning and error -mail. The address should be enclosed in double quotes (C<">) to -protect against B<sudo> interpreting the C<@> sign. Defaults to -the name of the user running B<sudo>. - -=item mailto - -Address to send warning and error mail to. The address should -be enclosed in double quotes (C<">) to protect against B<sudo> -interpreting the C<@> sign. Defaults to C<@mailto@>. - -=item secure_path - -Path used for every command run from B<sudo>. If you don't trust the -people running B<sudo> to have a sane C<PATH> environment variable you may -want to use this. Another use is if you want to have the "root path" -be separate from the "user path." Users in the group specified by the -I<exempt_group> option are not affected by I<secure_path>. -This option is @secure_path@ by default. - -=item syslog - -Syslog facility if syslog is being used for logging (negate to -disable syslog logging). Defaults to C<@logfac@>. - -=item verifypw - -This option controls when a password will be required when a user runs -B<sudo> with the B<-v> option. It has the following possible values: - -=over 8 - -=item all - -All the user's I<sudoers> entries for the current host must have -the C<NOPASSWD> flag set to avoid entering a password. - -=item always - -The user must always enter a password to use the B<-v> option. - -=item any - -At least one of the user's I<sudoers> entries for the current host -must have the C<NOPASSWD> flag set to avoid entering a password. - -=item never - -The user need never enter a password to use the B<-v> option. - -=back - -If no value is specified, a value of I<all> is implied. -Negating the option results in a value of I<never> being used. -The default value is I<all>. - -=back - -B<Lists that can be used in a boolean context>: - -=over 16 - -=item env_check - -Environment variables to be removed from the user's environment if -the variable's value contains C<%> or C</> characters. This can -be used to guard against printf-style format vulnerabilities in -poorly-written programs. The argument may be a double-quoted, -space-separated list or a single value without double-quotes. The -list can be replaced, added to, deleted from, or disabled by using -the C<=>, C<+=>, C<-=>, and C<!> operators respectively. Regardless -of whether the C<env_reset> option is enabled or disabled, variables -specified by C<env_check> will be preserved in the environment if -they pass the aforementioned check. The default list of environment -variables to check is displayed when B<sudo> is run by root with -the I<-V> option. - -=item env_delete - -Environment variables to be removed from the user's environment -when the I<env_reset> option is not in effect. The argument may -be a double-quoted, space-separated list or a single value without -double-quotes. The list can be replaced, added to, deleted from, -or disabled by using the C<=>, C<+=>, C<-=>, and C<!> operators -respectively. The default list of environment variables to remove -is displayed when B<sudo> is run by root with the I<-V> option. -Note that many operating systems will remove potentially dangerous -variables from the environment of any setuid process (such as -B<sudo>). - -=item env_keep - -Environment variables to be preserved in the user's environment -when the I<env_reset> option is in effect. This allows fine-grained -control over the environment B<sudo>-spawned processes will receive. -The argument may be a double-quoted, space-separated list or a -single value without double-quotes. The list can be replaced, added -to, deleted from, or disabled by using the C<=>, C<+=>, C<-=>, and -C<!> operators respectively. The default list of variables to keep -is displayed when B<sudo> is run by root with the I<-V> option. - -=back - -When logging via L<syslog(3)>, B<sudo> accepts the following values -for the syslog facility (the value of the B<syslog> Parameter): -B<authpriv> (if your OS supports it), B<auth>, B<daemon>, B<user>, -B<local0>, B<local1>, B<local2>, B<local3>, B<local4>, B<local5>, -B<local6>, and B<local7>. The following syslog priorities are -supported: B<alert>, B<crit>, B<debug>, B<emerg>, B<err>, B<info>, -B<notice>, and B<warning>. - -=head1 FILES - -=over 24 - -=item F<@sysconfdir@/sudoers> - -List of who can run what - -=item F</etc/group> - -Local groups file - -=item F</etc/netgroup> - -List of network groups - -=back - -=head1 EXAMPLES - -Below are example I<sudoers> entries. Admittedly, some of -these are a bit contrived. First, we define our I<aliases>: - - # User alias specification - User_Alias FULLTIMERS = millert, mikef, dowdy - User_Alias PARTTIMERS = bostley, jwfox, crawl - User_Alias WEBMASTERS = will, wendy, wim - - # Runas alias specification - Runas_Alias OP = root, operator - Runas_Alias DB = oracle, sybase - Runas_Alias ADMINGRP = adm, oper - - # Host alias specification - Host_Alias SPARC = bigtime, eclipse, moet, anchor :\ - SGI = grolsch, dandelion, black :\ - ALPHA = widget, thalamus, foobar :\ - HPPA = boa, nag, python - Host_Alias CUNETS = 128.138.0.0/255.255.0.0 - Host_Alias CSNETS = 128.138.243.0, 128.138.204.0/24, 128.138.242.0 - Host_Alias SERVERS = master, mail, www, ns - Host_Alias CDROM = orion, perseus, hercules - - # Cmnd alias specification - Cmnd_Alias DUMPS = /usr/bin/mt, /usr/sbin/dump, /usr/sbin/rdump,\ - /usr/sbin/restore, /usr/sbin/rrestore - Cmnd_Alias KILL = /usr/bin/kill - Cmnd_Alias PRINTING = /usr/sbin/lpc, /usr/bin/lprm - Cmnd_Alias SHUTDOWN = /usr/sbin/shutdown - Cmnd_Alias HALT = /usr/sbin/halt - Cmnd_Alias REBOOT = /usr/sbin/reboot - Cmnd_Alias SHELLS = /usr/bin/sh, /usr/bin/csh, /usr/bin/ksh, \ - /usr/local/bin/tcsh, /usr/bin/rsh, \ - /usr/local/bin/zsh - Cmnd_Alias SU = /usr/bin/su - Cmnd_Alias PAGERS = /usr/bin/more, /usr/bin/pg, /usr/bin/less - -Here we override some of the compiled in default values. We want -B<sudo> to log via L<syslog(3)> using the I<auth> facility in all -cases. We don't want to subject the full time staff to the B<sudo> -lecture, user B<millert> need not give a password, and we don't -want to reset the C<LOGNAME>, C<USER> or C<USERNAME> environment -variables when running commands as root. Additionally, on the -machines in the I<SERVERS> C<Host_Alias>, we keep an additional -local log file and make sure we log the year in each log line since -the log entries will be kept around for several years. Lastly, we -disable shell escapes for the commands in the PAGERS C<Cmnd_Alias> -(F</usr/bin/more>, F</usr/bin/pg> and F</usr/bin/less>). - - # Override built-in defaults - Defaults syslog=auth - Defaults>root !set_logname - Defaults:FULLTIMERS !lecture - Defaults:millert !authenticate - Defaults@SERVERS log_year, logfile=/var/log/sudo.log - Defaults!PAGERS noexec - -The I<User specification> is the part that actually determines who may -run what. - - root ALL = (ALL) ALL - %wheel ALL = (ALL) ALL - -We let B<root> and any user in group B<wheel> run any command on any -host as any user. - - FULLTIMERS ALL = NOPASSWD: ALL - -Full time sysadmins (B<millert>, B<mikef>, and B<dowdy>) may run any -command on any host without authenticating themselves. - - PARTTIMERS ALL = ALL - -Part time sysadmins (B<bostley>, B<jwfox>, and B<crawl>) may run any -command on any host but they must authenticate themselves first -(since the entry lacks the C<NOPASSWD> tag). - - jack CSNETS = ALL - -The user B<jack> may run any command on the machines in the I<CSNETS> alias -(the networks C<128.138.243.0>, C<128.138.204.0>, and C<128.138.242.0>). -Of those networks, only C<128.138.204.0> has an explicit netmask (in -CIDR notation) indicating it is a class C network. For the other -networks in I<CSNETS>, the local machine's netmask will be used -during matching. - - lisa CUNETS = ALL - -The user B<lisa> may run any command on any host in the I<CUNETS> alias -(the class B network C<128.138.0.0>). - - operator ALL = DUMPS, KILL, SHUTDOWN, HALT, REBOOT, PRINTING,\ - sudoedit /etc/printcap, /usr/oper/bin/ - -The B<operator> user may run commands limited to simple maintenance. -Here, those are commands related to backups, killing processes, the -printing system, shutting down the system, and any commands in the -directory F</usr/oper/bin/>. - - joe ALL = /usr/bin/su operator - -The user B<joe> may only L<su(1)> to operator. - - pete HPPA = /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root - - %opers ALL = (: ADMINGRP) /usr/sbin/ - -Users in the B<opers> group may run commands in F</usr/sbin/> as themselves -with any group in the I<ADMINGRP> C<Runas_Alias> (the B<adm> and B<oper> -groups). - -The user B<pete> is allowed to change anyone's password except for -root on the I<HPPA> machines. Note that this assumes L<passwd(1)> -does not take multiple usernames on the command line. - - bob SPARC = (OP) ALL : SGI = (OP) ALL - -The user B<bob> may run anything on the I<SPARC> and I<SGI> machines -as any user listed in the I<OP> C<Runas_Alias> (B<root> and B<operator>). - - jim +biglab = ALL - -The user B<jim> may run any command on machines in the I<biglab> netgroup. -B<sudo> knows that "biglab" is a netgroup due to the '+' prefix. - - +secretaries ALL = PRINTING, /usr/bin/adduser, /usr/bin/rmuser - -Users in the B<secretaries> netgroup need to help manage the printers -as well as add and remove users, so they are allowed to run those -commands on all machines. - - fred ALL = (DB) NOPASSWD: ALL - -The user B<fred> can run commands as any user in the I<DB> C<Runas_Alias> -(B<oracle> or B<sybase>) without giving a password. - - john ALPHA = /usr/bin/su [!-]*, !/usr/bin/su *root* - -On the I<ALPHA> machines, user B<john> may su to anyone except root -but he is not allowed to specify any options to the L<su(1)> command. - - jen ALL, !SERVERS = ALL - -The user B<jen> may run any command on any machine except for those -in the I<SERVERS> C<Host_Alias> (master, mail, www and ns). - - jill SERVERS = /usr/bin/, !SU, !SHELLS - -For any machine in the I<SERVERS> C<Host_Alias>, B<jill> may run -any commands in the directory F</usr/bin/> except for those commands -belonging to the I<SU> and I<SHELLS> C<Cmnd_Aliases>. - - steve CSNETS = (operator) /usr/local/op_commands/ - -The user B<steve> may run any command in the directory /usr/local/op_commands/ -but only as user operator. - - matt valkyrie = KILL - -On his personal workstation, valkyrie, B<matt> needs to be able to -kill hung processes. - - WEBMASTERS www = (www) ALL, (root) /usr/bin/su www - -On the host www, any user in the I<WEBMASTERS> C<User_Alias> (will, -wendy, and wim), may run any command as user www (which owns the -web pages) or simply L<su(1)> to www. - - ALL CDROM = NOPASSWD: /sbin/umount /CDROM,\ - /sbin/mount -o nosuid\,nodev /dev/cd0a /CDROM - -Any user may mount or unmount a CD-ROM on the machines in the CDROM -C<Host_Alias> (orion, perseus, hercules) without entering a password. -This is a bit tedious for users to type, so it is a prime candidate -for encapsulating in a shell script. - -=head1 SECURITY NOTES - -It is generally not effective to "subtract" commands from C<ALL> -using the '!' operator. A user can trivially circumvent this -by copying the desired command to a different name and then -executing that. For example: - - bill ALL = ALL, !SU, !SHELLS - -Doesn't really prevent B<bill> from running the commands listed in -I<SU> or I<SHELLS> since he can simply copy those commands to a -different name, or use a shell escape from an editor or other -program. Therefore, these kind of restrictions should be considered -advisory at best (and reinforced by policy). - -Furthermore, if the I<fast_glob> option is in use, it is not possible -to reliably negate commands where the path name includes globbing -(aka wildcard) characters. This is because the C library's -L<fnmatch(3)> function cannot resolve relative paths. While this -is typically only an inconvenience for rules that grant privileges, -it can result in a security issue for rules that subtract or revoke -privileges. - -For example, given the following I<sudoers> entry: - - john ALL = /usr/bin/passwd [a-zA-Z0-9]*, /usr/bin/chsh [a-zA-Z0-9]*, - /usr/bin/chfn [a-zA-Z0-9]*, !/usr/bin/* root - -User B<john> can still run C</usr/bin/passwd root> if I<fast_glob> is -enabled by changing to F</usr/bin> and running C<./passwd root> instead. - -=head1 PREVENTING SHELL ESCAPES - -Once B<sudo> executes a program, that program is free to do whatever -it pleases, including run other programs. This can be a security -issue since it is not uncommon for a program to allow shell escapes, -which lets a user bypass B<sudo>'s access control and logging. -Common programs that permit shell escapes include shells (obviously), -editors, paginators, mail and terminal programs. - -There are two basic approaches to this problem: - -=over 10 - -=item restrict - -Avoid giving users access to commands that allow the user to run -arbitrary commands. Many editors have a restricted mode where shell -escapes are disabled, though B<sudoedit> is a better solution to -running editors via B<sudo>. Due to the large number of programs that -offer shell escapes, restricting users to the set of programs that -do not if often unworkable. - -=item noexec - -Many systems that support shared libraries have the ability to -override default library functions by pointing an environment -variable (usually C<LD_PRELOAD>) to an alternate shared library. -On such systems, B<sudo>'s I<noexec> functionality can be used to -prevent a program run by B<sudo> from executing any other programs. -Note, however, that this applies only to native dynamically-linked -executables. Statically-linked executables and foreign executables -running under binary emulation are not affected. - -To tell whether or not B<sudo> supports I<noexec>, you can run -the following as root: - - sudo -V | grep "dummy exec" - -If the resulting output contains a line that begins with: - - File containing dummy exec functions: - -then B<sudo> may be able to replace the exec family of functions -in the standard library with its own that simply return an error. -Unfortunately, there is no foolproof way to know whether or not -I<noexec> will work at compile-time. I<noexec> should work on -SunOS, Solaris, *BSD, Linux, IRIX, Tru64 UNIX, MacOS X, and HP-UX -11.x. It is known B<not> to work on AIX and UnixWare. I<noexec> -is expected to work on most operating systems that support the -C<LD_PRELOAD> environment variable. Check your operating system's -manual pages for the dynamic linker (usually ld.so, ld.so.1, dyld, -dld.sl, rld, or loader) to see if C<LD_PRELOAD> is supported. - -To enable I<noexec> for a command, use the C<NOEXEC> tag as documented -in the User Specification section above. Here is that example again: - - aaron shanty = NOEXEC: /usr/bin/more, /usr/bin/vi - -This allows user B<aaron> to run F</usr/bin/more> and F</usr/bin/vi> -with I<noexec> enabled. This will prevent those two commands from -executing other commands (such as a shell). If you are unsure -whether or not your system is capable of supporting I<noexec> you -can always just try it out and see if it works. - -=back - -Note that restricting shell escapes is not a panacea. Programs -running as root are still capable of many potentially hazardous -operations (such as changing or overwriting files) that could lead -to unintended privilege escalation. In the specific case of an -editor, a safer approach is to give the user permission to run -B<sudoedit>. - -=head1 SEE ALSO - -L<rsh(1)>, L<su(1)>, L<fnmatch(3)>, L<glob(3)>, L<sudo(8)>, L<visudo(8)> - -=head1 CAVEATS - -The I<sudoers> file should B<always> be edited by the B<visudo> -command which locks the file and does grammatical checking. It is -imperative that I<sudoers> be free of syntax errors since B<sudo> -will not run with a syntactically incorrect I<sudoers> file. - -When using netgroups of machines (as opposed to users), if you -store fully qualified hostnames in the netgroup (as is usually the -case), you either need to have the machine's hostname be fully qualified -as returned by the C<hostname> command or use the I<fqdn> option in -I<sudoers>. - -=head1 BUGS - -If you feel you have found a bug in B<sudo>, please submit a bug report -at http://www.sudo.ws/sudo/bugs/ - -=head1 SUPPORT - -Limited free support is available via the sudo-users mailing list, -see http://www.sudo.ws/mailman/listinfo/sudo-users to subscribe or -search the archives. - -=head1 DISCLAIMER - -B<sudo> is provided ``AS IS'' and any express or implied warranties, -including, but not limited to, the implied warranties of merchantability -and fitness for a particular purpose are disclaimed. See the LICENSE -file distributed with B<sudo> or http://www.sudo.ws/sudo/license.html -for complete details. diff --git a/usr.bin/sudo/varsub b/usr.bin/sudo/varsub index e3939672654..23c4ca8dd25 100644 --- a/usr.bin/sudo/varsub +++ b/usr.bin/sudo/varsub @@ -1,9 +1,10 @@ -/^=head1 OPTIONS$/d s/^.*accepts the following command line options:.*$/The options are as follows:/ s/@passprompt@/Password:/g s:@badpass_message@:Sorry, try again.:g s:@badpri@:alert:g +s:@editor@:/usr/bin/vi:g s:@env_editor@:on:g +s:@env_reset@:on:g s:@fqdn@:off:g s:@goodpri@:notice:g s:@ignore_dot@:off:g @@ -31,3 +32,4 @@ s:@timeout@:5:g s:@tty_tickets@:off:g s:@path_info@:off:g s:@secure_path@:not set:g +s:@umask_override@:off:g diff --git a/usr.bin/sudo/visudo.mdoc.in b/usr.bin/sudo/visudo.mdoc.in new file mode 100644 index 00000000000..f29d3207918 --- /dev/null +++ b/usr.bin/sudo/visudo.mdoc.in @@ -0,0 +1,310 @@ +.\" +.\" Copyright (c) 1996,1998-2005, 2007-2012 +.\" Todd C. Miller <Todd.Miller@courtesan.com> +.\" +.\" Permission to use, copy, modify, and distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.\" ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.\" Sponsored in part by the Defense Advanced Research Projects +.\" Agency (DARPA) and Air Force Research Laboratory, Air Force +.\" Materiel Command, USAF, under agreement number F39502-99-1-0512. +.\" +.Dd $Mdocdate: August 17 2012 $ +.Dt VISUDO @mansectsu@ +.Os +.Sh NAME +.Nm visudo +.Nd edit the sudoers file +.Sh SYNOPSIS +.Nm visudo +.Op Fl cqsV +.Bk -words +.Op Fl f Ar sudoers +.Ek +.Sh DESCRIPTION +.Nm visudo +edits the +.Em sudoers +file in a safe fashion, analogous to +.Xr vipw @mansectsu@ . +.Nm visudo +locks the +.Em sudoers +file against multiple simultaneous edits, provides basic sanity checks, +and checks for parse errors. +If the +.Em sudoers +file is currently being edited you will receive a message to try again later. +.Pp +There is a hard-coded list of one or more editors that +.Nm visudo +will use set at compile-time that may be overridden via the +.Em editor +.Em sudoers +.Li Default +variable. +This list defaults to +.Li "@editor@" . +Normally, +.Nm visudo +does not honor the +.Ev VISUAL +or +.Ev EDITOR +environment variables unless they contain an editor in the aforementioned +editors list. +However, if +.Nm visudo +is configured with the +.Li --with-env-editor +option or the +.Em env_editor +.Li Default +variable is set in +.Em sudoers , +.Nm visudo +will use any the editor defines by +.Ev VISUAL +or +.Ev EDITOR . +Note that this can be a security hole since it allows the user to +execute any program they wish simply by setting +.Ev VISUAL +or +.Ev EDITOR . +.Pp +.Nm visudo +parses the +.Em sudoers +file after the edit and will +not save the changes if there is a syntax error. +Upon finding an error, +.Nm visudo +will print a message stating the line number(s) +where the error occurred and the user will receive the +.Dq What now? +prompt. +At this point the user may enter +.Ql e +to re-edit the +.Em sudoers +file, +.Ql x +to exit without saving the changes, or +.Ql Q +to quit and save changes. +The +.Ql Q +option should be used with extreme care because if +.Nm visudo +believes there to be a parse error, so will +.Nm sudo +and no one +will be able to +.Nm sudo +again until the error is fixed. +If +.Ql e +is typed to edit the +.Em sudoers +file after a parse error has been detected, the cursor will be placed on +the line where the error occurred (if the editor supports this feature). +.Pp +The options are as follows: +.Bl -tag -width Fl +.It Fl c +Enable +.Em check-only +mode. +The existing +.Em sudoers +file will be +checked for syntax errors, owner and mode. +A message will be printed to the standard output describing the status of +.Em sudoers +unless the +.Fl q +option was specified. +If the check completes successfully, +.Nm visudo +will exit with a value of 0. +If an error is encountered, +.Nm visudo +will exit with a value of 1. +.It Fl f Ar sudoers +Specify and alternate +.Em sudoers +file location. +With this option +.Nm visudo +will edit (or check) the +.Em sudoers +file of your choice, +instead of the default, +.Pa @sysconfdir@/sudoers . +The lock file used is the specified +.Em sudoers +file with +.Dq \.tmp +appended to it. +In +.Em check-only +mode only, the argument to +.Fl f +may be +.Ql - , +indicating that +.Em sudoers +will be read from the standard input. +.It Fl q +Enable +.Em quiet +mode. +In this mode details about syntax errors are not printed. +This option is only useful when combined with +the +.Fl c +option. +.It Fl s +Enable +.Em strict +checking of the +.Em sudoers +file. +If an alias is used before it is defined, +.Nm visudo +will consider this a parse error. +Note that it is not possible to differentiate between an +alias and a host name or user name that consists solely of uppercase +letters, digits, and the underscore +.Pq Ql _ +character. +.It Fl V +The +.Fl V ( Em version Ns No ) +option causes +.Nm visudo +to print its version number +and exit. +.El +.Sh ENVIRONMENT +The following environment variables may be consulted depending on +the value of the +.Em editor +and +.Em env_editor +.Em sudoers +settings: +.Bl -tag -width 15n +.It Ev VISUAL +Invoked by +.Nm visudo +as the editor to use +.It Ev EDITOR +Used by +.Nm visudo +if +.Ev VISUAL +is not set +.El +.Sh FILES +.Bl -tag -width 24n +.It Pa @sysconfdir@/sudoers +List of who can run what +.It Pa @sysconfdir@/sudoers.tmp +Lock file for visudo +.El +.Sh DIAGNOSTICS +.Bl -tag -width 4n +.It Li sudoers file busy, try again later. +Someone else is currently editing the +.Em sudoers +file. +.It Li @sysconfdir@/sudoers.tmp: Permission denied +You didn't run +.Nm visudo +as root. +.It Li Can't find you in the passwd database +Your user ID does not appear in the system passwd file. +.It Li Warning: {User,Runas,Host,Cmnd}_Alias referenced but not defined +Either you are trying to use an undeclared {User,Runas,Host,Cmnd}_Alias +or you have a user or host name listed that consists solely of +uppercase letters, digits, and the underscore +.Pq Ql _ +character. +In the latter case, you can ignore the warnings +.Po +.Nm sudo +will not complain +.Pc . +In +.Fl s +(strict) mode these are errors, not warnings. +.It Li Warning: unused {User,Runas,Host,Cmnd}_Alias +The specified {User,Runas,Host,Cmnd}_Alias was defined but never +used. +You may wish to comment out or remove the unused alias. +In +.Fl s +(strict) mode this is an error, not a warning. +.It Li Warning: cycle in {User,Runas,Host,Cmnd}_Alias +The specified {User,Runas,Host,Cmnd}_Alias includes a reference to +itself, either directly or through an alias it includes. +This is only a warning by default as +.Nm sudo +will ignore cycles when parsing +the +.Em sudoers +file. +.El +.Sh SEE ALSO +.Xr vi 1 , +.Xr sudoers @mansectform@ , +.Xr sudo @mansectsu@ , +.Xr vipw @mansectsu@ +.Sh AUTHORS +Many people have worked on +.Nm sudo +over the years; this version consists of code written primarily by: +.Bd -ragged -offset indent +Todd C. Miller +.Ed +.Pp +See the CONTRIBUTORS file in the +.Nm sudo +distribution (http://www.sudo.ws/sudo/contributors.html) for an +exhaustive list of people who have contributed to +.Nm sudo . +.Sh CAVEATS +There is no easy way to prevent a user from gaining a root shell if +the editor used by +.Nm visudo +allows shell escapes. +.Sh BUGS +If you feel you have found a bug in +.Nm visudo , +please submit a bug report at http://www.sudo.ws/sudo/bugs/ +.Sh SUPPORT +Limited free support is available via the sudo-users mailing list, +see http://www.sudo.ws/mailman/listinfo/sudo-users to subscribe or +search the archives. +.Sh DISCLAIMER +.Nm visudo +is provided +.Dq AS IS +and any express or implied warranties, including, but not limited +to, the implied warranties of merchantability and fitness for a +particular purpose are disclaimed. +See the LICENSE file distributed with +.Nm sudo +or http://www.sudo.ws/sudo/license.html for complete details. diff --git a/usr.bin/sudo/visudo.pod b/usr.bin/sudo/visudo.pod deleted file mode 100644 index d5da5f763dc..00000000000 --- a/usr.bin/sudo/visudo.pod +++ /dev/null @@ -1,207 +0,0 @@ -Copyright (c) 1996,1998-2005, 2007-2008 - Todd C. Miller <Todd.Miller@courtesan.com> - -Permission to use, copy, modify, and distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -Sponsored in part by the Defense Advanced Research Projects -Agency (DARPA) and Air Force Research Laboratory, Air Force -Materiel Command, USAF, under agreement number F39502-99-1-0512. - -=pod - -=head1 NAME - -visudo - edit the sudoers file - -=head1 SYNOPSIS - -B<visudo> [B<-c>] [B<-q>] [B<-s>] [B<-V>] [B<-f> I<sudoers>] - -=head1 DESCRIPTION - -B<visudo> edits the I<sudoers> file in a safe fashion, analogous to -L<vipw(8)>. B<visudo> locks the I<sudoers> file against multiple -simultaneous edits, provides basic sanity checks, and checks -for parse errors. If the I<sudoers> file is currently being -edited you will receive a message to try again later. - -There is a hard-coded list of editors that B<visudo> will use set -at compile-time that may be overridden via the I<editor> I<sudoers> -C<Default> variable. This list defaults to the path to L<vi(1)> on -your system, as determined by the I<configure> script. Normally, -B<visudo> does not honor the C<VISUAL> or C<EDITOR> environment -variables unless they contain an editor in the aforementioned editors -list. However, if B<visudo> is configured with the I<--with-enveditor> -option or the I<env_editor> C<Default> variable is set in I<sudoers>, -B<visudo> will use any the editor defines by C<VISUAL> or C<EDITOR>. -Note that this can be a security hole since it allows the user to -execute any program they wish simply by setting C<VISUAL> or C<EDITOR>. - -B<visudo> parses the I<sudoers> file after the edit and will -not save the changes if there is a syntax error. Upon finding -an error, B<visudo> will print a message stating the line number(s) -where the error occurred and the user will receive the -"What now?" prompt. At this point the user may enter "e" -to re-edit the I<sudoers> file, "x" to exit without -saving the changes, or "Q" to quit and save changes. The -"Q" option should be used with extreme care because if B<visudo> -believes there to be a parse error, so will B<sudo> and no one -will be able to B<sudo> again until the error is fixed. -If "e" is typed to edit the I<sudoers> file after a parse error -has been detected, the cursor will be placed on the line where the -error occurred (if the editor supports this feature). - -=head1 OPTIONS - -B<visudo> accepts the following command line options: - -=over 12 - -=item -c - -Enable B<check-only> mode. The existing I<sudoers> file will be -checked for syntax and a message will be printed to the -standard output detailing the status of I<sudoers>. -If the syntax check completes successfully, B<visudo> will -exit with a value of 0. If a syntax error is encountered, -B<visudo> will exit with a value of 1. - -=item -f I<sudoers> - -Specify and alternate I<sudoers> file location. With this option -B<visudo> will edit (or check) the I<sudoers> file of your choice, -instead of the default, F<@sysconfdir@/sudoers>. The lock file used -is the specified I<sudoers> file with ".tmp" appended to it. - -=item -q - -Enable B<quiet> mode. In this mode details about syntax errors -are not printed. This option is only useful when combined with -the B<-c> option. - -=item -s - -Enable B<strict> checking of the I<sudoers> file. If an alias is -used before it is defined, B<visudo> will consider this a parse -error. Note that it is not possible to differentiate between an -alias and a hostname or username that consists solely of uppercase -letters, digits, and the underscore ('_') character. - -=item -V - -The B<-V> (version) option causes B<visudo> to print its version number -and exit. - -=back - -=head1 ENVIRONMENT - -The following environment variables may be consulted depending on -the value of the I<editor> and I<env_editor> I<sudoers> variables: - -=over 16 - -=item C<VISUAL> - -Invoked by visudo as the editor to use - -=item C<EDITOR> - -Used by visudo if VISUAL is not set - -=back - -=head1 FILES - -=over 24 - -=item F<@sysconfdir@/sudoers> - -List of who can run what - -=item F<@sysconfdir@/sudoers.tmp> - -Lock file for visudo - -=back - -=head1 DIAGNOSTICS - -=over 4 - -=item sudoers file busy, try again later. - -Someone else is currently editing the I<sudoers> file. - -=item @sysconfdir@/sudoers.tmp: Permission denied - -You didn't run B<visudo> as root. - -=item Can't find you in the passwd database - -Your userid does not appear in the system passwd file. - -=item Warning: {User,Runas,Host,Cmnd}_Alias referenced but not defined - -Either you are trying to use an undeclare {User,Runas,Host,Cmnd}_Alias -or you have a user or hostname listed that consists solely of -uppercase letters, digits, and the underscore ('_') character. In -the latter case, you can ignore the warnings (B<sudo> will not -complain). In B<-s> (strict) mode these are errors, not warnings. - -=item Warning: unused {User,Runas,Host,Cmnd}_Alias - -The specified {User,Runas,Host,Cmnd}_Alias was defined but never -used. You may wish to comment out or remove the unused alias. In -B<-s> (strict) mode this is an error, not a warning. - -=back - -=head1 SEE ALSO - -L<vi(1)>, L<sudoers(5)>, L<sudo(8)>, L<vipw(8)> - -=head1 AUTHOR - -Many people have worked on I<sudo> over the years; this version of -B<visudo> was written by: - - Todd Miller - -See the HISTORY file in the sudo distribution or visit -http://www.sudo.ws/sudo/history.html for more details. - -=head1 CAVEATS - -There is no easy way to prevent a user from gaining a root shell if -the editor used by B<visudo> allows shell escapes. - -=head1 BUGS - -If you feel you have found a bug in B<visudo>, please submit a bug report -at http://www.sudo.ws/sudo/bugs/ - -=head1 SUPPORT - -Limited free support is available via the sudo-users mailing list, -see http://www.sudo.ws/mailman/listinfo/sudo-users to subscribe or -search the archives. - -=head1 DISCLAIMER - -B<visudo> is provided ``AS IS'' and any express or implied warranties, -including, but not limited to, the implied warranties of merchantability -and fitness for a particular purpose are disclaimed. See the LICENSE -file distributed with B<sudo> or http://www.sudo.ws/sudo/license.html -for complete details. diff --git a/usr.bin/sudo/visudo/Makefile b/usr.bin/sudo/visudo/Makefile index bba29b0db3e..e3c76d6baee 100644 --- a/usr.bin/sudo/visudo/Makefile +++ b/usr.bin/sudo/visudo/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.3 2008/11/14 11:58:08 millert Exp $ +# $OpenBSD: Makefile,v 1.4 2012/08/17 20:57:45 millert Exp $ .PATH: ${.CURDIR}/.. @@ -7,18 +7,12 @@ SRCS= pwutil.c visudo.c BINDIR= /usr/sbin CPPFLAGS+= -I.. -POD2MAN=/usr/bin/pod2man MAN= visudo.8 -VERSION!=uname -rs -MANDATE!=date '+%B %e, %Y' CLEANFILES+= ${MAN} -visudo.8: visudo.pod - sed -f ${.CURDIR}/../varsub ${.ALLSRC} | ${POD2MAN} --quotes=none \ - --name="VISUDO" --section=8 --release="${VERSION}" \ - --date="${MANDATE}" --center="OpenBSD Reference Manual" | \ - sed '1s/^/.if n .ll 78n /' > $@ +visudo.8: ${.CURDIR}/../varsub visudo.mdoc.in + sed -f ${.ALLSRC} > $@ afterdepend: ${MAN} |