noip: set ACLs from environment variables.
[preload-hacks] / noip.1
CommitLineData
e4976bb0 1.de VS
2.sp 1
3.RS
4.nf
5.ft B
6..
7.de VE
8.ft R
9.fi
10.RE
11.sp 1
12..
13.TH noip 1 "5 May 2005" "Straylight/Edgeware" "Preload hacks"
14.SH NAME
15noip \- run programs without the ability to use IP sockets
16.SH SYNOPSIS
17.B noip
18.RI [ command
19.RI [ args ...]]
20.SH DESCRIPTION
21The
22.B noip
23program runs
24.I command
25(by default, the user's shell, as determined by the
26.B SHELL
27environment variable) in an environment where attempts to use TCP/IP
28networking are (mostly) transparently translated into the use of
29Unix-domain sockets in a private directory.
30.PP
31There are many programs which use TCP/IP for their own internal
32communications needs, largely unnecessarily. This can present security
33problems: even if a program binds its listening sockets to
34.BR localhost ,
35other users on the same system can still connect, and many such programs
36don't seem to have authentication systems.
37.PP
38.B noip
39addresses this problem by intercepting a program's networking calls and
40making it use Unix-domain sockets in a private directory instead of
41TCP/IP. Now its communications are truly private to the running user.
42.SS The socket directory
43The
44.B noip
45program keeps its sockets in a directory whose name can be configured,
46but by default is
47.BI noip- \c
48.IR username ,
49where
50.I username
51is determined by the
52.B USER
53or
54.B LOGNAME
55environment variables, or is
56.BI uid- \c
57.IR realuid
58in the temporary directory, which in turn is determined by the
59.B TMPDIR
60or
61.B TMP
62environment variables, or is
63.BR /tmp .
64The sockets in this directory are simply named
65.IB dottedquad : port
66after the Internet sockets they represent.
67.PP
68If the socket directory does not exist when a program running under
69.B noip
70starts up, it is created and made readable and writable only by the
71current user. Also, it is scanned and any apparently stale sockets are
72removed.
73.SS Configuration
74The operation of
75.B noip
76is controlled by a configuration file. By default,
77.B noip
78reads configuration from
79.B .noip
80in the calling user's home directory, as determined by the
81.B HOME
82environment, or, failing that, looking up the
83.I real
a6d9626b 84(not effective) user id in the password database. However, if the
85environment variable
86.B NOIP_CONFIG
87is set, then the file it names is read instead (assuming it exists; if
88it doesn't, no configuration is read).
e4976bb0 89.PP
90The configuration file has a simple line-based format. A line is
91ignored if it consists only of whitespace, or if its first whitespace
92character is
93.RB ` # '.
94Otherwise, the first whitespace-delimited word is a keyword and the
95remainder of the line is a value. The following keywords are
96recognized.
97.TP
98.BR "debug " [\fInumber\fR]
99If
100.I number
101is nonzero, turn debugging on; if it is zero, turn debugging off. The
102default, if no
103.I number
104is given, is to turn debugging on. Debugging is written to standard
105error. Some debugging is produced before the configuration file is
106read; the environment variable
107.B NOIP_DEBUG
108can be used to control this.
109.TP
110.BI "socketdir " directory
111Store the Unix-domain sockets in
112.IR directory
a6d9626b 113rather than the default. The environment variable
114.B NOIP_SOCKETDIR
115can also be used to control which directory is used for sockets.
e4976bb0 116.TP
117.BI "realbind " acl-entry
118Add an entry to the
119.B realbind
120access control list (ACL). When a program attempts to
121.BR bind (2)
122a socket to an address, the
123.B realbind
124ACL is consulted. If the address is matched, then the program is
125allowed to bind a real Internet socket to that address; otherwise, the
a6d9626b 126socket is bound to a Unix-domain socket. Three environment variables
127are consulted too:
128.BR NOIP_REALBIND_BEFORE ,
129.BR NOIP_REALBIND ,
130and
131.BR NOIP_REALBIND_AFTER .
132The
133.B _BEFORE
134rules are inserted at the front of the list; the
135.B _AFTER
136rules are appended on the end. Currently, the rules in
137.B NOIP_REALBIND
138are also put at the end (before the
139.B _AFTER
140rules), though this may change later.
e4976bb0 141.TP
a6d9626b 142.BI "realconnect " acl-entry
e4976bb0 143Add an entry to the
144.B realconnect
145access control list (ACL). When a program attempts to
146.BR connect (2)
147a socket to an address, or to contact another socket using
148.BR sendto (2)
149or
150.BR sendmsg (2),
151the
152.B realconnect
153ACL is consulted. If the destination address is matched, then the
154program is allowed to contact the real Internet socket; otherwise, the
a6d9626b 155attempt is made to contact a Unix-domain socket. Three environment variables
156are consulted too:
157.BR NOIP_REALCONNET_BEFORE ,
158.BR NOIP_REALCONNECT ,
159and
160.BR NOIP_REALCONNECT_AFTER .
161The
162.B _BEFORE
163rules are inserted at the front of the list; the
164.B _AFTER
165rules are appended on the end. Currently, the rules in
166.B NOIP_REALCONNECT
167are also put at the end (before the
168.B _AFTER
169rules), though this may change later.
e4976bb0 170.PP
171(Aside: An attempt to connect to a remote host may not be a hopeless failure,
172even if a real IP socket is denied:
173.B noip
174deliberately makes no attempt to check that addresses being bound to
175sockets correspond to locally available addresses; and besides, sockets
176can be introduced into the directory by other programs simulating remote
177servers.)
178.PP
179An
180.I acl-entry
a6d9626b 181is a comma-separated list of entries of the form:
e4976bb0 182.IP
183.BR + | \-
184.IR address \c
185.RB [ \- \c
186.IR address | \c
187.BR / \c
188.IR mask ]| \c
189.BR local | any
190.RB [ : \c
191.IR port [ \c
192.BI \- \c
193.IR port ]]
194.PP
195(The spaces in the above are optional.)
196.PP
197The leading sign says whether
198matching addresses should be
199.I accepted
200.RB (` + ')
201or
202.I denied
203.RB (` \- ').
204.PP
205The IP-address portion may be any of the following
206.TP
207.B any
208Matches all addresses.
209.TP
210.B local
211Matches the address of one of the machine's network interfaces.
212.TP
213.I address
214Matches just the given address
215.TP
216.IB address \- address
217Matches any address which falls in the given range. Addresses are
218compared lexicographically, with octets to the left given precedence
219over octets to the right.
220.TP
221.IB address / mask
222Matches an address in the given network. The
223.I mask
224may be a netmask in dotted-quad form, or a one-bit-count.
225.PP
226The port portion may be omitted (which means `match any port'), or may
227be a single
228.I port
229or a range
230.IB port \- port
231to match.
232.PP
233Range comparisons are always inclusive of both endpoints.
234.PP
235ACL entries are processed in the order they appear in the configuration
236file. The default action of an ACL, used if none of its entries match,
237is the opposite of the last actual entry in the list: if the last entry
238says `accept', then the default is to deny, and vice-versa. If the ACL
239is empty, the default is to deny all addresses.
240.PP
241For example, it may be useful to allow access at least to a DNS server.
242This can be accomplished by adding a line
243.VS
244realconnect +1.2.3.4:52
245.VE
246to the configuration file, where 1.2.3.4 is the IP address of one of
247your DNS server.
248.SS Example applications
249SLIME is an Emacs extension for doing interactive programming with Lisp
250systems. It communicates with the Lisp system using TCP sockets, since
251Unix-domain sockets are unavailable on Windows, and besides, they are
252less well supported by Lisp implementations. Unfortunately, when the
253author wrote this program, SLIME applied no authentication on its TCP
254port, allowing any local user to take over the running Lisp. Worse,
255some Lisps are unable to bind a listening socket to a particular
256address, leaving the socket potentially available to anyone on the
257network. By running Emacs under
258.BR noip ,
259the security hole is closed completely and no messing with
260authentication secrets is needed.
261.PP
262SSH is an excellent tool for secure communications over hostile
263networks. In particular, its ability to forward TCP connections to a
264port on one side of an SSH tunnel to the other side is very useful.
265However, such a forwarded port is available to all users on the source
266side of the tunnel. Using
267.B noip
268and a suitable configuration, a user can restrict access to a forwarded
269port to himself or a small group.
270.SH BUGS
271.B noip
272is implemented as an
273.B LD_PRELOAD
274hack. It won't work on setuid programs. Also, perhaps more
275importantly, it can't do anything a
276.I malicious
277program use of networking: a program could theoretically issue sockets
278system calls directly instead of using the C library calls that
279.B noip
280intercepts. It is intended only as a tool for enhancing the security of
281software written by well-meaning programmers who don't understand the
282security aspects of writing networking code.
283.PP
284It's very hard to tell exactly what state a Unix-domain socket is in.
285If the filesystem object isn't there, it's not active, but if it
286.I is
287then the socket might be in use or it might be stale.
288.B noip
289consults
290.B /proc/net/unix
291to decide whether a socket is in use, but this can fail in two ways.
292Firstly, if the socket is created and renamed, the kernel doesn't
293notice, and
294.B noip
295will think that the new name is stale. Secondly, if the socket is
296created, used, unlinked while it's still in use, and recreated, then
297.B noip
298will think that it's in use when in fact it's gone stale. Don't mess
299with
300.BR noip 's
301sockets unless you know what you're doing.
302.PP
303The procedure to replace a Unix-domain socket by an Internet one is
304fairly thorough, but there are some missing cases. In particular, if
305the socket being bound or connected is a duplicate (using
306.BR dup (2))
307then only one of the copies will be fixed. Similarly, copies owned by
308child processes will be unaffected.
309.PP
310This manual is surprisingly long and complicated for such a simple hack.
311.SH AUTHOR
312Mark Wooding, <mdw@nsict.org>