379 lines
15 KiB
Groff
379 lines
15 KiB
Groff
|
.TH HOSTS_ACCESS 5
|
||
|
.SH NAME
|
||
|
hosts_access \- format of host access control files
|
||
|
.SH DESCRIPTION
|
||
|
This manual page describes a simple access control language that is
|
||
|
based on client (host name/address, user name), and server (process
|
||
|
name, host name/address) patterns. Examples are given at the end. The
|
||
|
impatient reader is encouraged to skip to the EXAMPLES section for a
|
||
|
quick introduction.
|
||
|
.PP
|
||
|
An extended version of the access control language is described in the
|
||
|
\fIhosts_options\fR(5) document. The extensions are turned on at
|
||
|
program build time by building with -DPROCESS_OPTIONS.
|
||
|
.PP
|
||
|
In the following text, \fIdaemon\fR is the the process name of a
|
||
|
network daemon process, and \fIclient\fR is the name and/or address of
|
||
|
a host requesting service. Network daemon process names are specified
|
||
|
in the inetd configuration file.
|
||
|
.SH ACCESS CONTROL FILES
|
||
|
The access control software consults two files. The search stops
|
||
|
at the first match:
|
||
|
.IP \(bu
|
||
|
Access will be granted when a (daemon,client) pair matches an entry in
|
||
|
the \fI/etc/hosts.allow\fR file.
|
||
|
.IP \(bu
|
||
|
Otherwise, access will be denied when a (daemon,client) pair matches an
|
||
|
entry in the \fI/etc/hosts.deny\fR file.
|
||
|
.IP \(bu
|
||
|
Otherwise, access will be granted.
|
||
|
.PP
|
||
|
A non-existing access control file is treated as if it were an empty
|
||
|
file. Thus, access control can be turned off by providing no access
|
||
|
control files.
|
||
|
.SH ACCESS CONTROL RULES
|
||
|
Each access control file consists of zero or more lines of text. These
|
||
|
lines are processed in order of appearance. The search terminates when a
|
||
|
match is found.
|
||
|
.IP \(bu
|
||
|
A newline character is ignored when it is preceded by a backslash
|
||
|
character. This permits you to break up long lines so that they are
|
||
|
easier to edit.
|
||
|
.IP \(bu
|
||
|
Blank lines or lines that begin with a `#\' character are ignored.
|
||
|
This permits you to insert comments and whitespace so that the tables
|
||
|
are easier to read.
|
||
|
.IP \(bu
|
||
|
All other lines should satisfy the following format, things between []
|
||
|
being optional:
|
||
|
.sp
|
||
|
.ti +3
|
||
|
daemon_list : client_list [ : shell_command ]
|
||
|
.PP
|
||
|
\fIdaemon_list\fR is a list of one or more daemon process names
|
||
|
(argv[0] values) or wildcards (see below).
|
||
|
.PP
|
||
|
\fIclient_list\fR is a list
|
||
|
of one or more host names, host addresses, patterns or wildcards (see
|
||
|
below) that will be matched against the client host name or address.
|
||
|
.PP
|
||
|
The more complex forms \fIdaemon@host\fR and \fIuser@host\fR are
|
||
|
explained in the sections on server endpoint patterns and on client
|
||
|
username lookups, respectively.
|
||
|
.PP
|
||
|
List elements should be separated by blanks and/or commas.
|
||
|
.PP
|
||
|
With the exception of NIS (YP) netgroup lookups, all access control
|
||
|
checks are case insensitive.
|
||
|
.ne 4
|
||
|
.SH PATTERNS
|
||
|
The access control language implements the following patterns:
|
||
|
.IP \(bu
|
||
|
A string that begins with a `.\' character. A host name is matched if
|
||
|
the last components of its name match the specified pattern. For
|
||
|
example, the pattern `.tue.nl\' matches the host name
|
||
|
`wzv.win.tue.nl\'.
|
||
|
.IP \(bu
|
||
|
A string that ends with a `.\' character. A host address is matched if
|
||
|
its first numeric fields match the given string. For example, the
|
||
|
pattern `131.155.\' matches the address of (almost) every host on the
|
||
|
Eind\%hoven University network (131.155.x.x).
|
||
|
.IP \(bu
|
||
|
A string that begins with an `@\' character is treated as an NIS
|
||
|
(formerly YP) netgroup name. A host name is matched if it is a host
|
||
|
member of the specified netgroup. Netgroup matches are not supported
|
||
|
for daemon process names or for client user names.
|
||
|
.IP \(bu
|
||
|
An expression of the form `n.n.n.n/m.m.m.m\' is interpreted as a
|
||
|
`net/mask\' pair. A host address is matched if `net\' is equal to the
|
||
|
bitwise AND of the address and the `mask\'. For example, the net/mask
|
||
|
pattern `131.155.72.0/255.255.254.0\' matches every address in the
|
||
|
range `131.155.72.0\' through `131.155.73.255\'.
|
||
|
.SH WILDCARDS
|
||
|
The access control language supports explicit wildcards:
|
||
|
.IP ALL
|
||
|
The universal wildcard, always matches.
|
||
|
.IP LOCAL
|
||
|
Matches any host whose name does not contain a dot character.
|
||
|
.IP UNKNOWN
|
||
|
Matches any user whose name is unknown, and matches any host whose name
|
||
|
\fIor\fR address are unknown. This pattern should be used with care:
|
||
|
host names may be unavailable due to temporary name server problems. A
|
||
|
network address will be unavailable when the software cannot figure out
|
||
|
what type of network it is talking to.
|
||
|
.IP KNOWN
|
||
|
Matches any user whose name is known, and matches any host whose name
|
||
|
\fIand\fR address are known. This pattern should be used with care:
|
||
|
host names may be unavailable due to temporary name server problems. A
|
||
|
network address will be unavailable when the software cannot figure out
|
||
|
what type of network it is talking to.
|
||
|
.IP PARANOID
|
||
|
Matches any host whose name does not match its address. When tcpd is
|
||
|
built with -DPARANOID (default mode), it drops requests from such
|
||
|
clients even before looking at the access control tables. Build
|
||
|
without -DPARANOID when you want more control over such requests.
|
||
|
.ne 6
|
||
|
.SH OPERATORS
|
||
|
.IP EXCEPT
|
||
|
Intended use is of the form: `list_1 EXCEPT list_2\'; this construct
|
||
|
matches anything that matches \fIlist_1\fR unless it matches
|
||
|
\fIlist_2\fR. The EXCEPT operator can be used in daemon_lists and in
|
||
|
client_lists. The EXCEPT operator can be nested: if the control
|
||
|
language would permit the use of parentheses, `a EXCEPT b EXCEPT c\'
|
||
|
would parse as `(a EXCEPT (b EXCEPT c))\'.
|
||
|
.br
|
||
|
.ne 6
|
||
|
.SH SHELL COMMANDS
|
||
|
If the first-matched access control rule contains a shell command, that
|
||
|
command is subjected to %<letter> substitutions (see next section).
|
||
|
The result is executed by a \fI/bin/sh\fR child process with standard
|
||
|
input, output and error connected to \fI/dev/null\fR. Specify an `&\'
|
||
|
at the end of the command if you do not want to wait until it has
|
||
|
completed.
|
||
|
.PP
|
||
|
Shell commands should not rely on the PATH setting of the inetd.
|
||
|
Instead, they should use absolute path names, or they should begin with
|
||
|
an explicit PATH=whatever statement.
|
||
|
.PP
|
||
|
The \fIhosts_options\fR(5) document describes an alternative language
|
||
|
that uses the shell command field in a different and incompatible way.
|
||
|
.SH % EXPANSIONS
|
||
|
The following expansions are available within shell commands:
|
||
|
.IP "%a (%A)"
|
||
|
The client (server) host address.
|
||
|
.IP %c
|
||
|
Client information: user@host, user@address, a host name, or just an
|
||
|
address, depending on how much information is available.
|
||
|
.IP %d
|
||
|
The daemon process name (argv[0] value).
|
||
|
.IP "%h (%H)"
|
||
|
The client (server) host name or address, if the host name is
|
||
|
unavailable.
|
||
|
.IP "%n (%N)"
|
||
|
The client (server) host name (or "unknown" or "paranoid").
|
||
|
.IP %p
|
||
|
The daemon process id.
|
||
|
.IP %s
|
||
|
Server information: daemon@host, daemon@address, or just a daemon name,
|
||
|
depending on how much information is available.
|
||
|
.IP %u
|
||
|
The client user name (or "unknown").
|
||
|
.IP %%
|
||
|
Expands to a single `%\' character.
|
||
|
.PP
|
||
|
Characters in % expansions that may confuse the shell are replaced by
|
||
|
underscores.
|
||
|
.SH SERVER ENDPOINT PATTERNS
|
||
|
In order to distinguish clients by the network address that they
|
||
|
connect to, use patterns of the form:
|
||
|
.sp
|
||
|
.ti +3
|
||
|
process_name@host_pattern : client_list ...
|
||
|
.sp
|
||
|
Patterns like these can be used when the machine has different internet
|
||
|
addresses with different internet hostnames. Service providers can use
|
||
|
this facility to offer FTP, GOPHER or WWW archives with internet names
|
||
|
that may even belong to different organizations. See also the `twist'
|
||
|
option in the hosts_options(5) document. Some systems (Solaris,
|
||
|
FreeBSD) can have more than one internet address on one physical
|
||
|
interface; with other systems you may have to resort to SLIP or PPP
|
||
|
pseudo interfaces that live in a dedicated network address space.
|
||
|
.sp
|
||
|
The host_pattern obeys the same syntax rules as host names and
|
||
|
addresses in client_list context. Usually, server endpoint information
|
||
|
is available only with connection-oriented services.
|
||
|
.SH CLIENT USERNAME LOOKUP
|
||
|
When the client host supports the RFC 931 protocol or one of its
|
||
|
descendants (TAP, IDENT, RFC 1413) the wrapper programs can retrieve
|
||
|
additional information about the owner of a connection. Client username
|
||
|
information, when available, is logged together with the client host
|
||
|
name, and can be used to match patterns like:
|
||
|
.PP
|
||
|
.ti +3
|
||
|
daemon_list : ... user_pattern@host_pattern ...
|
||
|
.PP
|
||
|
The daemon wrappers can be configured at compile time to perform
|
||
|
rule-driven username lookups (default) or to always interrogate the
|
||
|
client host. In the case of rule-driven username lookups, the above
|
||
|
rule would cause username lookup only when both the \fIdaemon_list\fR
|
||
|
and the \fIhost_pattern\fR match.
|
||
|
.PP
|
||
|
A user pattern has the same syntax as a daemon process pattern, so the
|
||
|
same wildcards apply (netgroup membership is not supported). One
|
||
|
should not get carried away with username lookups, though.
|
||
|
.IP \(bu
|
||
|
The client username information cannot be trusted when it is needed
|
||
|
most, i.e. when the client system has been compromised. In general,
|
||
|
ALL and (UN)KNOWN are the only user name patterns that make sense.
|
||
|
.IP \(bu
|
||
|
Username lookups are possible only with TCP-based services, and only
|
||
|
when the client host runs a suitable daemon; in all other cases the
|
||
|
result is "unknown".
|
||
|
.IP \(bu
|
||
|
A well-known UNIX kernel bug may cause loss of service when username
|
||
|
lookups are blocked by a firewall. The wrapper README document
|
||
|
describes a procedure to find out if your kernel has this bug.
|
||
|
.IP \(bu
|
||
|
Username lookups may cause noticeable delays for non-UNIX users. The
|
||
|
default timeout for username lookups is 10 seconds: too short to cope
|
||
|
with slow networks, but long enough to irritate PC users.
|
||
|
.PP
|
||
|
Selective username lookups can alleviate the last problem. For example,
|
||
|
a rule like:
|
||
|
.PP
|
||
|
.ti +3
|
||
|
daemon_list : @pcnetgroup ALL@ALL
|
||
|
.PP
|
||
|
would match members of the pc netgroup without doing username lookups,
|
||
|
but would perform username lookups with all other systems.
|
||
|
.SH DETECTING ADDRESS SPOOFING ATTACKS
|
||
|
A flaw in the sequence number generator of many TCP/IP implementations
|
||
|
allows intruders to easily impersonate trusted hosts and to break in
|
||
|
via, for example, the remote shell service. The IDENT (RFC931 etc.)
|
||
|
service can be used to detect such and other host address spoofing
|
||
|
attacks.
|
||
|
.PP
|
||
|
Before accepting a client request, the wrappers can use the IDENT
|
||
|
service to find out that the client did not send the request at all.
|
||
|
When the client host provides IDENT service, a negative IDENT lookup
|
||
|
result (the client matches `UNKNOWN@host') is strong evidence of a host
|
||
|
spoofing attack.
|
||
|
.PP
|
||
|
A positive IDENT lookup result (the client matches `KNOWN@host') is
|
||
|
less trustworthy. It is possible for an intruder to spoof both the
|
||
|
client connection and the IDENT lookup, although doing so is much
|
||
|
harder than spoofing just a client connection. It may also be that
|
||
|
the client\'s IDENT server is lying.
|
||
|
.PP
|
||
|
Note: IDENT lookups don\'t work with UDP services.
|
||
|
.SH EXAMPLES
|
||
|
The language is flexible enough that different types of access control
|
||
|
policy can be expressed with a minimum of fuss. Although the language
|
||
|
uses two access control tables, the most common policies can be
|
||
|
implemented with one of the tables being trivial or even empty.
|
||
|
.PP
|
||
|
When reading the examples below it is important to realize that the
|
||
|
allow table is scanned before the deny table, that the search
|
||
|
terminates when a match is found, and that access is granted when no
|
||
|
match is found at all.
|
||
|
.PP
|
||
|
The examples use host and domain names. They can be improved by
|
||
|
including address and/or network/netmask information, to reduce the
|
||
|
impact of temporary name server lookup failures.
|
||
|
.SH MOSTLY CLOSED
|
||
|
In this case, access is denied by default. Only explicitly authorized
|
||
|
hosts are permitted access.
|
||
|
.PP
|
||
|
The default policy (no access) is implemented with a trivial deny
|
||
|
file:
|
||
|
.PP
|
||
|
.ne 2
|
||
|
/etc/hosts.deny:
|
||
|
.in +3
|
||
|
ALL: ALL
|
||
|
.PP
|
||
|
This denies all service to all hosts, unless they are permitted access
|
||
|
by entries in the allow file.
|
||
|
.PP
|
||
|
The explicitly authorized hosts are listed in the allow file.
|
||
|
For example:
|
||
|
.PP
|
||
|
.ne 2
|
||
|
/etc/hosts.allow:
|
||
|
.in +3
|
||
|
ALL: LOCAL @some_netgroup
|
||
|
.br
|
||
|
ALL: .foobar.edu EXCEPT terminalserver.foobar.edu
|
||
|
.PP
|
||
|
The first rule permits access from hosts in the local domain (no `.\'
|
||
|
in the host name) and from members of the \fIsome_netgroup\fP
|
||
|
netgroup. The second rule permits access from all hosts in the
|
||
|
\fIfoobar.edu\fP domain (notice the leading dot), with the exception of
|
||
|
\fIterminalserver.foobar.edu\fP.
|
||
|
.SH MOSTLY OPEN
|
||
|
Here, access is granted by default; only explicitly specified hosts are
|
||
|
refused service.
|
||
|
.PP
|
||
|
The default policy (access granted) makes the allow file redundant so
|
||
|
that it can be omitted. The explicitly non-authorized hosts are listed
|
||
|
in the deny file. For example:
|
||
|
.PP
|
||
|
/etc/hosts.deny:
|
||
|
.in +3
|
||
|
ALL: some.host.name, .some.domain
|
||
|
.br
|
||
|
ALL EXCEPT in.fingerd: other.host.name, .other.domain
|
||
|
.PP
|
||
|
The first rule denies some hosts and domains all services; the second
|
||
|
rule still permits finger requests from other hosts and domains.
|
||
|
.SH BOOBY TRAPS
|
||
|
The next example permits tftp requests from hosts in the local domain
|
||
|
(notice the leading dot). Requests from any other hosts are denied.
|
||
|
Instead of the requested file, a finger probe is sent to the offending
|
||
|
host. The result is mailed to the superuser.
|
||
|
.PP
|
||
|
.ne 2
|
||
|
/etc/hosts.allow:
|
||
|
.in +3
|
||
|
.nf
|
||
|
in.tftpd: LOCAL, .my.domain
|
||
|
.PP
|
||
|
.ne 2
|
||
|
/etc/hosts.deny:
|
||
|
.in +3
|
||
|
.nf
|
||
|
in.tftpd: ALL: (/some/where/safe_finger -l @%h | \\
|
||
|
/usr/ucb/mail -s %d-%h root) &
|
||
|
.fi
|
||
|
.PP
|
||
|
The safe_finger command comes with the tcpd wrapper and should be
|
||
|
installed in a suitable place. It limits possible damage from data sent
|
||
|
by the remote finger server. It gives better protection than the
|
||
|
standard finger command.
|
||
|
.PP
|
||
|
The expansion of the %h (client host) and %d (service name) sequences
|
||
|
is described in the section on shell commands.
|
||
|
.PP
|
||
|
Warning: do not booby-trap your finger daemon, unless you are prepared
|
||
|
for infinite finger loops.
|
||
|
.PP
|
||
|
On network firewall systems this trick can be carried even further.
|
||
|
The typical network firewall only provides a limited set of services to
|
||
|
the outer world. All other services can be "bugged" just like the above
|
||
|
tftp example. The result is an excellent early-warning system.
|
||
|
.br
|
||
|
.ne 4
|
||
|
.SH DIAGNOSTICS
|
||
|
An error is reported when a syntax error is found in a host access
|
||
|
control rule; when the length of an access control rule exceeds the
|
||
|
capacity of an internal buffer; when an access control rule is not
|
||
|
terminated by a newline character; when the result of %<letter>
|
||
|
expansion would overflow an internal buffer; when a system call fails
|
||
|
that shouldn\'t. All problems are reported via the syslog daemon.
|
||
|
.SH FILES
|
||
|
.na
|
||
|
.nf
|
||
|
/etc/hosts.allow, (daemon,client) pairs that are granted access.
|
||
|
/etc/hosts.deny, (daemon,client) pairs that are denied access.
|
||
|
.ad
|
||
|
.fi
|
||
|
.SH SEE ALSO
|
||
|
.nf
|
||
|
tcpd(8) tcp/ip daemon wrapper program.
|
||
|
tcpdchk(8), tcpdmatch(8), test programs.
|
||
|
.SH BUGS
|
||
|
If a name server lookup times out, the host name will not be available
|
||
|
to the access control software, even though the host is registered.
|
||
|
.PP
|
||
|
Domain name server lookups are case insensitive; NIS (formerly YP)
|
||
|
netgroup lookups are case sensitive.
|
||
|
.SH AUTHOR
|
||
|
.na
|
||
|
.nf
|
||
|
Wietse Venema (wietse@wzv.win.tue.nl)
|
||
|
Department of Mathematics and Computing Science
|
||
|
Eindhoven University of Technology
|
||
|
Den Dolech 2, P.O. Box 513,
|
||
|
5600 MB Eindhoven, The Netherlands
|
||
|
\" @(#) hosts_access.5 1.20 95/01/30 19:51:46
|