Allow tftpd to run as a specified user, not just `nobody'.
Update documentation to reflect new option. Also fix documentation style and add missing references. PR: 21268 Submitted by: "Aleksandr A. Babaylov" <babolo@links.ru> Reviewed by: imp
This commit is contained in:
parent
c137d6780d
commit
f62eaadff1
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=65850
@ -41,16 +41,16 @@
|
||||
Internet Trivial File Transfer Protocol server
|
||||
.Sh SYNOPSIS
|
||||
.Nm /usr/libexec/tftpd
|
||||
.Op Fl l
|
||||
.Op Fl n
|
||||
.Op Fl ln
|
||||
.Op Fl s Ar directory
|
||||
.Op Fl u Ar user
|
||||
.Op Ar directory ...
|
||||
.Sh DESCRIPTION
|
||||
.Nm Tftpd
|
||||
is a server which supports the
|
||||
Internet Trivial File Transfer
|
||||
Protocol (\c
|
||||
.Tn RFC 783).
|
||||
Protocol
|
||||
.Pq Tn RFC 1350 .
|
||||
The
|
||||
.Tn TFTP
|
||||
server operates
|
||||
@ -90,25 +90,39 @@ names are prefixed by the one of the given directories.
|
||||
The given directories are also treated as a search path for
|
||||
relative filename requests.
|
||||
.Pp
|
||||
The chroot option provides additional security by restricting access
|
||||
of
|
||||
.Nm
|
||||
to only a chroot'd file system. This is useful when moving
|
||||
from an OS that supported
|
||||
The
|
||||
.Fl s
|
||||
as a boot server. Because chroot is restricted to root, you must run
|
||||
option provides additional security by changing
|
||||
.Nm tftpd Ns No 's
|
||||
root directory, thereby prohibiting accesses outside of the specified
|
||||
.Ar directory .
|
||||
Because
|
||||
.Xr chroot 2
|
||||
requires super-user privileges,
|
||||
.Nm
|
||||
as root. However, if you chroot, then
|
||||
must be run as root.
|
||||
However, after performing the
|
||||
.Fn chroot ,
|
||||
.Nm
|
||||
will set its user id to nobody.
|
||||
will set its user id to that of the specified
|
||||
.Ar user ,
|
||||
or
|
||||
.Dq nobody
|
||||
if no
|
||||
.Fl u
|
||||
option is specified.
|
||||
.Pp
|
||||
The options are:
|
||||
.Bl -tag -width Ds
|
||||
.It Fl l
|
||||
Log all requests using
|
||||
.Xr syslog 3
|
||||
with the facility of LOG_FTP. Note: Logging of LOG_FTP messages
|
||||
will also need to be enabled in the syslog configuration file
|
||||
with the facility of
|
||||
.Dv LOG_FTP .
|
||||
Note: Logging of
|
||||
.Dv LOG_FTP
|
||||
messages
|
||||
must also be enabled in the syslog configuration file,
|
||||
.Xr syslog.conf 5 .
|
||||
.It Fl n
|
||||
Suppress negative acknowledgement of requests for nonexistent
|
||||
@ -116,23 +130,32 @@ relative filenames.
|
||||
.It Fl s Ar directory
|
||||
Cause
|
||||
.Nm
|
||||
to chroot to
|
||||
.Pa directory
|
||||
before accepting commands. In addition, the user id is set to
|
||||
nobody.
|
||||
.Pp
|
||||
If you are not running
|
||||
.Fl s ,
|
||||
no user id change will be
|
||||
attempted. You should not run
|
||||
to change its root directory to
|
||||
.Pa directory .
|
||||
After changing roots but before accepting commands,
|
||||
.Nm
|
||||
as root unless you are using
|
||||
.Fl s .
|
||||
will switch credentials to an unprivileged user.
|
||||
.It Fl u Ar user
|
||||
Switch credentials to
|
||||
.Ar user
|
||||
(default
|
||||
.Dq nobody )
|
||||
when the
|
||||
.Fl s
|
||||
option is used.
|
||||
The user must be specified by name, not a numeric UID.
|
||||
.El
|
||||
.Sh SEE ALSO
|
||||
.Xr tftp 1 ,
|
||||
.Xr chroot 2 ,
|
||||
.Xr inetd 8 ,
|
||||
.Xr syslogd 8
|
||||
.Rs
|
||||
.%A K. R. Sollins
|
||||
.%T The TFTP Protocol (Revision 2)
|
||||
.%D July 1992
|
||||
.%O RFC 1350, STD 33
|
||||
.Re
|
||||
.Sh HISTORY
|
||||
The
|
||||
.Nm
|
||||
|
@ -121,9 +121,10 @@ main(argc, argv)
|
||||
struct sockaddr_in sin;
|
||||
char *chroot_dir = NULL;
|
||||
struct passwd *nobody;
|
||||
char *chuser = "nobody";
|
||||
|
||||
openlog("tftpd", LOG_PID | LOG_NDELAY, LOG_FTP);
|
||||
while ((ch = getopt(argc, argv, "lns:")) != -1) {
|
||||
while ((ch = getopt(argc, argv, "lns:u:")) != -1) {
|
||||
switch (ch) {
|
||||
case 'l':
|
||||
logging = 1;
|
||||
@ -134,6 +135,9 @@ main(argc, argv)
|
||||
case 's':
|
||||
chroot_dir = optarg;
|
||||
break;
|
||||
case 'u':
|
||||
chuser = optarg;
|
||||
break;
|
||||
default:
|
||||
syslog(LOG_WARNING, "ignoring unknown option -%c", ch);
|
||||
}
|
||||
@ -226,8 +230,8 @@ main(argc, argv)
|
||||
*/
|
||||
if (chroot_dir) {
|
||||
/* Must get this before chroot because /etc might go away */
|
||||
if ((nobody = getpwnam("nobody")) == NULL) {
|
||||
syslog(LOG_ERR, "nobody: no such user");
|
||||
if ((nobody = getpwnam(chuser)) == NULL) {
|
||||
syslog(LOG_ERR, "%s: no such user", chuser);
|
||||
exit(1);
|
||||
}
|
||||
if (chroot(chroot_dir)) {
|
||||
|
Loading…
Reference in New Issue
Block a user