513 lines
19 KiB
Plaintext
513 lines
19 KiB
Plaintext
=cut
|
|
Copyright (c) 1994-1996,1998-2003 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.
|
|
|
|
$Sudo$
|
|
=pod
|
|
|
|
=head1 NAME
|
|
|
|
sudo, sudoedit - execute a command as another user
|
|
|
|
=head1 SYNOPSIS
|
|
|
|
B<sudo> B<-K> | B<-L> | B<-V> | B<-h> | B<-k> | B<-v>
|
|
|
|
B<sudo> S<[B<-U> I<username>]> S<[B<-u> I<username>|I<#uid>]> B<-l> [I<command>]
|
|
|
|
B<sudo> [B<-HPSb>] S<[B<-a> I<auth_type>]> S<[B<-c> I<class>|I<->]>
|
|
S<[B<-p> I<prompt>]> S<[B<-u> I<username>|I<#uid>]>
|
|
S<{B<-e> file [...] | B<-i> | B<-s> | I<command>}>
|
|
|
|
B<sudoedit> [B<-S>] S<[B<-a> I<auth_type>]>
|
|
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 giving B<sudo> the B<-v> flag 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> flags. 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>
|
|
flag 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 4
|
|
|
|
=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(@mansectform@). By default, B<sudo> does not modify C<HOME>
|
|
(see I<set_home> and I<always_set_home> in L<sudoers(@mansectform@)>).
|
|
|
|
=item -K
|
|
|
|
The B<-K> (sure I<kill>) option is like B<-k> except that it removes
|
|
the user's timestamp entirely. Like B<-k>, this option does not
|
|
require a password.
|
|
|
|
=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 grep(1).
|
|
|
|
=item -P
|
|
|
|
The B<-P> (I<preserve 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 -S
|
|
|
|
The B<-S> (I<stdin>) option causes B<sudo> to read the password from
|
|
the standard input instead of the terminal device.
|
|
|
|
=item -U
|
|
|
|
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 -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 -a
|
|
|
|
The B<-a> (I<authentication type>) option causes B<sudo> to use the
|
|
specified authentication type when validating the user, as allowed
|
|
by /etc/login.conf. The system administrator may specify a list
|
|
of sudo-specific authentication methods by adding an "auth-sudo"
|
|
entry in /etc/login.conf. This option is only available on systems
|
|
that support BSD authentication where B<sudo> has been configured
|
|
with the --with-bsdauth option.
|
|
|
|
=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
|
|
|
|
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 /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
|
|
where B<sudo> has been configured with the --with-logincap option.
|
|
|
|
=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 8
|
|
|
|
=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<VISUAL> or C<EDITOR> environment
|
|
variables is run to edit the temporary files. If neither C<VISUAL>
|
|
nor C<EDITOR> are set, the 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 -h
|
|
|
|
The B<-h> (I<help>) option causes B<sudo> to print a usage message and exit.
|
|
|
|
=item -i
|
|
|
|
The B<-i> (I<simulate initial login>) option runs the shell specified
|
|
in the L<passwd(@mansectform@)> entry of the user that the command is
|
|
being run as. The command name argument given to the shell begins
|
|
with a `C<->' to tell the shell to run as a login shell. B<sudo>
|
|
attempts to change to that user's home directory before running the
|
|
shell. It also initializes the environment, leaving I<TERM>
|
|
unchanged, setting I<HOME>, I<SHELL>, I<USER>, I<LOGNAME>, and
|
|
I<PATH>, and unsetting all other environment variables.
|
|
|
|
=item -k
|
|
|
|
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.
|
|
|
|
=item -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 not allowed, B<sudo> will
|
|
exit with a return value of 1.
|
|
|
|
=item -p
|
|
|
|
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 8
|
|
|
|
=item C<%u>
|
|
|
|
expanded to the invoking user's login name
|
|
|
|
=item C<%U>
|
|
|
|
expanded to the login name of the user the command will
|
|
be run as (defaults to root)
|
|
|
|
=item C<%h>
|
|
|
|
expanded to the local hostname without the domain name
|
|
|
|
=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>
|
|
sudoers option is set)
|
|
|
|
=item C<%%>
|
|
|
|
two consecutive C<%> characters are collapsed into a single C<%> character
|
|
|
|
=back
|
|
|
|
=item -s
|
|
|
|
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(@mansectform@)>.
|
|
|
|
=item -u
|
|
|
|
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<username>, use I<#uid>. Note that if the I<targetpw> Defaults
|
|
option is set (see L<sudoers(@mansectform@)>) it is not possible
|
|
to run commands with a uid not listed in the password database.
|
|
|
|
=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<--> flag indicates that B<sudo> should stop processing command
|
|
line arguments. It is most useful in conjunction with the B<-s> flag.
|
|
|
|
=back
|
|
|
|
=head1 RETURN VALUES
|
|
|
|
Upon successful execution of a program, the return value from B<sudo>
|
|
will simply be the return value 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. Variables
|
|
that control how dynamic loading and binding is done can be used
|
|
to subvert the program that B<sudo> runs. To combat this the
|
|
C<LD_*>, C<_RLD_*>, C<SHLIB_PATH> (HP-UX only), and C<LIBPATH> (AIX
|
|
only) environment variables are removed from the environment passed
|
|
on to all commands executed. B<sudo> will also remove the C<IFS>,
|
|
C<CDPATH>, C<ENV>, C<BASH_ENV>, C<KRB_CONF>, C<KRBCONFDIR>, C<KRBTKFILE>,
|
|
C<KRB5_CONFIG>, C<LOCALDOMAIN>, C<RES_OPTIONS>, C<HOSTALIASES>,
|
|
C<NLSPATH>, C<PATH_LOCALE>, C<TERMINFO>, C<TERMINFO_DIRS> and
|
|
C<TERMPATH> variables as they too can pose a threat. If the
|
|
C<TERMCAP> variable is set and is a pathname, it too is ignored.
|
|
Additionally, if the C<LC_*> or C<LANGUAGE> variables contain the
|
|
C</> or C<%> characters, they are ignored. Environment variables
|
|
with a value beginning with C<()> are also removed as they could
|
|
be interpreted as B<bash> functions. If B<sudo> has been
|
|
compiled with SecurID support, the C<VAR_ACE>, C<USR_ACE> and
|
|
C<DLC_ACE> variables are cleared as well. The list of environment
|
|
variables that B<sudo> clears is contained in the output of
|
|
C<sudo -V> when run as root.
|
|
|
|
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.
|
|
|
|
For security reasons, if your OS supports shared libraries and does
|
|
not disable user-defined library search paths for setuid programs
|
|
(most do), you should either use a linker option that disables this
|
|
behavior or link B<sudo> statically.
|
|
|
|
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 and only writable by 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(@mansectform@)>.
|
|
|
|
=head1 ENVIRONMENT
|
|
|
|
B<sudo> utilizes the following environment variables:
|
|
|
|
EDITOR Default editor to use in -e (sudoedit) mode if
|
|
VISUAL is not set
|
|
|
|
HOME In -s or -H mode (or if sudo was configured with
|
|
the --enable-shell-sets-home option), set to
|
|
homedir of the target user
|
|
|
|
PATH Set to a sane value if sudo was configured with
|
|
the --with-secure-path option
|
|
|
|
SHELL Used to determine shell to run with -s option
|
|
|
|
SUDO_PROMPT Used as the default password prompt
|
|
|
|
SUDO_COMMAND Set to the command run by sudo
|
|
|
|
SUDO_USER Set to the login of the user who invoked sudo
|
|
|
|
SUDO_UID Set to the uid of the user who invoked sudo
|
|
|
|
SUDO_GID Set to the gid of the user who invoked sudo
|
|
|
|
SUDO_PS1 If set, PS1 will be set to its value
|
|
|
|
USER Set to the target user (root unless the -u option
|
|
is specified)
|
|
|
|
VISUAL Default editor to use in -e (sudoedit) mode
|
|
|
|
=head1 FILES
|
|
|
|
@sysconfdir@/sudoers List of who can run what
|
|
@timedir@ Directory containing timestamps
|
|
|
|
=head1 EXAMPLES
|
|
|
|
Note: the following examples assume suitable L<sudoers(@mansectform@)> entries.
|
|
|
|
To get a file listing of an unreadable directory:
|
|
|
|
$ sudo ls /usr/local/protected
|
|
|
|
To list the home directory of user yazza on a machine where the
|
|
file system holding ~yazza is not exported as root:
|
|
|
|
$ sudo -u yazza ls ~yazza
|
|
|
|
To edit the F<index.html> file as user www:
|
|
|
|
$ sudo -u www vi ~www/htdocs/index.html
|
|
|
|
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<sudoers(@mansectform@)>,
|
|
L<passwd(@mansectform@)>, L<visudo(@mansectsu@)>
|
|
|
|
=head1 AUTHORS
|
|
|
|
Many people have worked on B<sudo> over the years; this
|
|
version consists of code written primarily by:
|
|
|
|
Todd Miller
|
|
Chris Jepeway
|
|
|
|
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(@mansectform@)> 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 whe 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
|
|
|
|
Commercial support is available for B<sudo>, see
|
|
http://www.sudo.ws/sudo/support.html for details.
|
|
|
|
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.
|