2 |
- |
1 |
.HTML "Security in Plan 9
|
|
|
2 |
.de SS
|
|
|
3 |
.NH 2
|
|
|
4 |
..
|
|
|
5 |
.EQ
|
|
|
6 |
delim $#
|
|
|
7 |
.EN
|
|
|
8 |
.TL
|
|
|
9 |
Security in Plan 9
|
|
|
10 |
.AU
|
|
|
11 |
Russ Cox, MIT LCS
|
|
|
12 |
.br
|
|
|
13 |
Eric Grosse, Bell Labs
|
|
|
14 |
.br
|
|
|
15 |
Rob Pike, Bell Labs
|
|
|
16 |
.br
|
|
|
17 |
Dave Presotto, Avaya Labs and Bell Labs
|
|
|
18 |
.br
|
|
|
19 |
Sean Quinlan, Bell Labs
|
|
|
20 |
.br
|
|
|
21 |
.CW {rsc,ehg,rob,presotto,seanq}@plan9.bell-labs.com
|
|
|
22 |
.AB
|
|
|
23 |
The security architecture of the Plan 9™
|
|
|
24 |
operating system has recently been redesigned
|
|
|
25 |
to address some technical shortcomings.
|
|
|
26 |
This redesign provided an opportunity also to make the system more
|
|
|
27 |
convenient to use securely.
|
|
|
28 |
Plan 9 has thus improved in two ways not usually seen together:
|
|
|
29 |
it has become more secure
|
|
|
30 |
.I and
|
|
|
31 |
easier to use.
|
|
|
32 |
.LP
|
|
|
33 |
The central component of the new architecture is a per-user
|
|
|
34 |
self-contained agent called
|
|
|
35 |
.CW factotum .
|
|
|
36 |
.CW Factotum
|
|
|
37 |
securely holds a
|
|
|
38 |
copy of the user's keys and negotiates authentication protocols, on
|
|
|
39 |
behalf of the user, with secure services around the network.
|
|
|
40 |
Concentrating security code in a single program offers several
|
|
|
41 |
advantages including: ease of update or repair to broken security
|
|
|
42 |
software and protocols; the ability to run secure services at a lower
|
|
|
43 |
privilege level; uniform management of keys for all services; and an
|
|
|
44 |
opportunity to provide single sign on, even to unchanged legacy
|
|
|
45 |
applications.
|
|
|
46 |
.CW Factotum
|
|
|
47 |
has an unusual architecture: it is implemented
|
|
|
48 |
as a Plan 9 file server.
|
|
|
49 |
.FS
|
|
|
50 |
Appeared, in a slightly different form, in
|
|
|
51 |
.I
|
|
|
52 |
Proc. of the 2002 Usenix Security Symposium,
|
|
|
53 |
.R
|
|
|
54 |
San Francisco.
|
|
|
55 |
.FE
|
|
|
56 |
.AE
|
|
|
57 |
.NH 1
|
|
|
58 |
Introduction
|
|
|
59 |
.LP
|
|
|
60 |
Secure computing systems face two challenges:
|
|
|
61 |
first, they must employ sophisticated technology that is difficult to design
|
|
|
62 |
and prove correct; and second,
|
|
|
63 |
they must be easy for regular people to use.
|
|
|
64 |
The question of ease of use is sometimes neglected, but it is essential:
|
|
|
65 |
weak but easy-to-use security can be more effective than strong but
|
|
|
66 |
difficult-to-use security if it is more likely to be used.
|
|
|
67 |
People lock their front doors when they leave the house, knowing
|
|
|
68 |
full well that a burglar is capable of picking the lock (or avoiding
|
|
|
69 |
the door altogether); yet few would accept the cost and
|
|
|
70 |
awkwardness of a bank vault door on the
|
|
|
71 |
house even though that might reduce the probability of a robbery.
|
|
|
72 |
A related point is that users need a clear model of how the security
|
|
|
73 |
operates (if not how it actually provides security) in order to use it
|
|
|
74 |
well; for example, the clarity of a lock icon on a web browser
|
|
|
75 |
is offset by the confusing and typically insecure
|
|
|
76 |
steps for installing X.509 certificates.
|
|
|
77 |
.LP
|
|
|
78 |
The security architecture of the Plan 9
|
|
|
79 |
operating system
|
|
|
80 |
[Pike95]
|
|
|
81 |
has recently been redesigned to make it both more secure
|
|
|
82 |
and easier to use.
|
|
|
83 |
By
|
|
|
84 |
.I security
|
|
|
85 |
we mean three things:
|
|
|
86 |
first, the business of authenticating users and services;
|
|
|
87 |
second, the safe handling, deployment, and use of keys
|
|
|
88 |
and other secret information; and
|
|
|
89 |
third, the use of encryption and integrity checks
|
|
|
90 |
to safeguard communications
|
|
|
91 |
from prying eyes.
|
|
|
92 |
.LP
|
|
|
93 |
The old security architecture of Plan 9
|
|
|
94 |
had several engineering problems in common with other operating systems.
|
|
|
95 |
First, it had an inadequate notion of security domain.
|
|
|
96 |
Once a user provided a password to connect to a local file store,
|
|
|
97 |
the system required that the same password be used to access all the other file
|
|
|
98 |
stores.
|
|
|
99 |
That is, the system treated all network services as
|
|
|
100 |
belonging to the same security domain.
|
|
|
101 |
.LP
|
|
|
102 |
Second, the algorithms and protocols used in authentication,
|
|
|
103 |
by nature tricky and difficult to get right, were compiled into the
|
|
|
104 |
various applications, kernel modules, and file servers.
|
|
|
105 |
Changes and fixes to a security protocol
|
|
|
106 |
required that all components using that protocol needed to be recompiled,
|
|
|
107 |
or at least relinked, and restarted.
|
|
|
108 |
.LP
|
|
|
109 |
Third, the file transport protocol, 9P
|
|
|
110 |
[Pike93],
|
|
|
111 |
that forms the core of
|
|
|
112 |
the Plan 9 system, had its authentication protocol embedded in its design.
|
|
|
113 |
This meant that fixing or changing the authentication used by 9P
|
|
|
114 |
required deep changes to the system.
|
|
|
115 |
If someone were to find a way to break the protocol, the system would
|
|
|
116 |
be wide open and very hard to fix.
|
|
|
117 |
.LP
|
|
|
118 |
These and a number of lesser problems, combined with a desire
|
|
|
119 |
for more widespread use of encryption in the system, spurred us to
|
|
|
120 |
rethink the entire security architecture of Plan 9.
|
|
|
121 |
.LP
|
|
|
122 |
The centerpiece of the new architecture is an agent,
|
|
|
123 |
called
|
|
|
124 |
.CW factotum ,
|
|
|
125 |
that handles the user's keys and negotiates all security
|
|
|
126 |
interactions with system services and applications.
|
|
|
127 |
Like a trusted assistant with a copy of the owner's keys,
|
|
|
128 |
.CW factotum
|
|
|
129 |
does all the negotiation for security and authentication.
|
|
|
130 |
Programs no longer need to be compiled with cryptographic
|
|
|
131 |
code; instead they communicate with
|
|
|
132 |
.CW factotum
|
|
|
133 |
agents
|
|
|
134 |
that represent distinct entities in the cryptographic exchange,
|
|
|
135 |
such as a user and server of a secure service.
|
|
|
136 |
If a security protocol needs to be added, deleted, or modified,
|
|
|
137 |
only
|
|
|
138 |
.CW factotum
|
|
|
139 |
needs to be updated for all system services
|
|
|
140 |
to be kept secure.
|
|
|
141 |
.LP
|
|
|
142 |
Building on
|
|
|
143 |
.CW factotum ,
|
|
|
144 |
we modified
|
|
|
145 |
secure services in the system to move
|
|
|
146 |
user authentication code into
|
|
|
147 |
.CW factotum ;
|
|
|
148 |
made authentication a separable component of the file server protocol;
|
|
|
149 |
deployed new security protocols;
|
|
|
150 |
designed a secure file store,
|
|
|
151 |
called
|
|
|
152 |
.CW secstore ,
|
|
|
153 |
to protect our keys but make them easy to get when they are needed;
|
|
|
154 |
designed a new kernel module to support transparent use of
|
|
|
155 |
Transport Layer Security (TLS)
|
|
|
156 |
[RFC2246];
|
|
|
157 |
and began using encryption for all communications within the system.
|
|
|
158 |
The overall architecture is illustrated in Figure 1a.
|
|
|
159 |
.if h .B1 10 60
|
|
|
160 |
.KF
|
|
|
161 |
.EQ
|
|
|
162 |
gsize 9
|
|
|
163 |
.EN
|
|
|
164 |
.PS 3i
|
|
|
165 |
|
|
|
166 |
# Secstore
|
|
|
167 |
Sec: box "Secstore" wid 1.3i ht .5i
|
|
|
168 |
|
|
|
169 |
# Terminal
|
|
|
170 |
Term0: box invis ht .1i with .e at Sec.e + (-1.1i, -.5i)
|
|
|
171 |
Term: box wid 1.1i ht 1i with .nw at Term0.ne
|
|
|
172 |
Termlab: "\s-2Terminal\s+2" at Term.s + (0, -.15i)
|
|
|
173 |
FT: ellipse "$ F sub T#" wid .40i ht .30i with .ne at Term.ne + (-.1i, -.1i)
|
|
|
174 |
PT: ellipse "$ P sub T#" wid .6i ht .45i with .sw at Term.sw + (.2i, .2i)
|
|
|
175 |
|
|
|
176 |
# CPU
|
|
|
177 |
Cpu0: box invis ht .1i with .w at Term0.w + (3i, 0)
|
|
|
178 |
Cpu: box wid 1.1i ht 1i with .nw at Cpu0.ne
|
|
|
179 |
Cpulab: "\s-2CPU Server\s+2" at Cpu.s + (0, -.15i)
|
|
|
180 |
FC: ellipse "$ F sub C#" wid .40 ht .30i with .nw at Cpu.nw + (.1i, -.1i)
|
|
|
181 |
PC: ellipse "$ P sub C#" wid .6i ht .45i with .se at Cpu.se + (-.2i, .2i)
|
|
|
182 |
|
|
|
183 |
# Authentication Server
|
|
|
184 |
Auth: box dashed "Auth Server" wid 1.3i ht .5i with .e at Sec.e + (0, -2.3i)
|
|
|
185 |
|
|
|
186 |
# File Server
|
|
|
187 |
File0: box invis ht .1i with .w at Cpu0.w + (0, -1.5i)
|
|
|
188 |
File: box wid 1.1i ht 1i with .nw at File0.ne
|
|
|
189 |
Filelab: "\s-2File Server\s+2" at File.s + (0, -.15i)
|
|
|
190 |
FF: ellipse "$ F sub F#" wid .40i ht .30i with .nw at File.nw + (.1i, -.1i)
|
|
|
191 |
PF: ellipse "$ P sub F#" wid .6i ht .45i with .se at File.se + (-.2i, .2i)
|
|
|
192 |
|
|
|
193 |
# Connections
|
|
|
194 |
line from PT.e + (0, +0.05i) to PC.w + (0, +0.05i)
|
|
|
195 |
spline from PT.e + (0, -0.05i) right 1i then down 1.5i right .5i then right to PF.w + (0, -0.05i)
|
|
|
196 |
spline from PC.w + (0, -0.05i) left 1.1i then down 1.4i then right to PF.w + (0, 0.05i)
|
|
|
197 |
line <-> from FC.se to PC.nw
|
|
|
198 |
line <-> from FT.sw to PT.ne
|
|
|
199 |
line <-> from FF.se to PF.nw
|
|
|
200 |
spline <-> from Sec.e right .5i then down .655i then left to FT.e
|
|
|
201 |
#spline from Auth.e + (0, 0.05i) right .5i then up 1i then to FT.se
|
|
|
202 |
#spline from Auth.e + (0, 0.00i) right .7i then up 1i then to FC.sw
|
|
|
203 |
#spline from Auth.e + (0, -0.05i) right .5i then to FF.w
|
|
|
204 |
.PE
|
|
|
205 |
.LP
|
|
|
206 |
.ps 9
|
|
|
207 |
.vs 10
|
|
|
208 |
Figure 1a. Components of the security architecture.
|
|
|
209 |
Each box is a (typically) separate machine; each ellipse a process.
|
|
|
210 |
The ellipses labeled $F sub X#
|
|
|
211 |
are
|
|
|
212 |
.CW factotum
|
|
|
213 |
processes; those labeled
|
|
|
214 |
$P sub X#
|
|
|
215 |
are the pieces and proxies of a distributed program.
|
|
|
216 |
The authentication server is one of several repositories for users' security information
|
|
|
217 |
that
|
|
|
218 |
.CW factotum
|
|
|
219 |
processes consult as required.
|
|
|
220 |
.CW Secstore
|
|
|
221 |
is a shared resource for storing private information such as keys;
|
|
|
222 |
.CW factotum
|
|
|
223 |
consults it for the user during bootstrap.
|
|
|
224 |
.sp
|
|
|
225 |
.KE
|
|
|
226 |
.if h .B2
|
|
|
227 |
.EQ
|
|
|
228 |
gsize 11
|
|
|
229 |
.EN
|
|
|
230 |
.LP
|
|
|
231 |
Secure protocols and algorithms are well understood
|
|
|
232 |
and are usually not the weakest link in a system's security.
|
|
|
233 |
In practice, most security problems arise from buggy servers,
|
|
|
234 |
confusing software, or administrative oversights.
|
|
|
235 |
It is these practical problems that we are addressing.
|
|
|
236 |
Although this paper describes the algorithms and protocols we are using,
|
|
|
237 |
they are included mainly for concreteness.
|
|
|
238 |
Our main intent is to present a simple security architecture built
|
|
|
239 |
upon a small trusted code base that is easy to verify (whether by manual or
|
|
|
240 |
automatic means), easy to understand, and easy to use.
|
|
|
241 |
.LP
|
|
|
242 |
Although it is a subjective assessment,
|
|
|
243 |
we believe we have achieved our goal of ease of use.
|
|
|
244 |
That we have achieved
|
|
|
245 |
our goal of improved security is supported by our plan to
|
|
|
246 |
move our currently private computing environment onto the Internet
|
|
|
247 |
outside the corporate firewall.
|
|
|
248 |
The rest of this paper explains the architecture and how it is used,
|
|
|
249 |
to explain why a system that is easy to use securely is also safe
|
|
|
250 |
enough to run in the open network.
|
|
|
251 |
.NH 1
|
|
|
252 |
An Agent for Security
|
|
|
253 |
.LP
|
|
|
254 |
One of the primary reasons for the redesign of the Plan 9
|
|
|
255 |
security infrastructure was to remove the authentication
|
|
|
256 |
method both from the applications and from the kernel.
|
|
|
257 |
Cryptographic code
|
|
|
258 |
is large and intricate, so it should
|
|
|
259 |
be packaged as a separate component that can be repaired or
|
|
|
260 |
modified without altering or even relinking applications
|
|
|
261 |
and services that depend on it.
|
|
|
262 |
If a security protocol is broken, it should be trivial to repair,
|
|
|
263 |
disable, or replace it on the fly.
|
|
|
264 |
Similarly, it should be possible for multiple programs to use
|
|
|
265 |
a common security protocol without embedding it in each program.
|
|
|
266 |
.LP
|
|
|
267 |
Some systems use dynamically linked libraries (DLLs) to address these configuration issues.
|
|
|
268 |
The problem with this approach is that it leaves
|
|
|
269 |
security code in the same address space as the program using it.
|
|
|
270 |
The interactions between the program and the DLL
|
|
|
271 |
can therefore accidentally or deliberately violate the interface,
|
|
|
272 |
weakening security.
|
|
|
273 |
Also, a program using a library to implement secure services
|
|
|
274 |
must run at a privilege level necessary to provide the service;
|
|
|
275 |
separating the security to a different program makes it possible
|
|
|
276 |
to run the services at a weaker privilege level, isolating the
|
|
|
277 |
privileged code to a single, more trustworthy component.
|
|
|
278 |
.LP
|
|
|
279 |
Following the lead of the SSH agent
|
|
|
280 |
[Ylon96],
|
|
|
281 |
we give each user
|
|
|
282 |
an agent process responsible
|
|
|
283 |
for holding and using the user's keys.
|
|
|
284 |
The agent program is called
|
|
|
285 |
.CW factotum
|
|
|
286 |
because of its similarity to the proverbial servant with the
|
|
|
287 |
power to act on behalf of his master because he holds the
|
|
|
288 |
keys to all the master's possessions. It is essential that
|
|
|
289 |
.CW factotum
|
|
|
290 |
keep the keys secret and use them only in the owner's interest.
|
|
|
291 |
Later we'll discuss some changes to the kernel to reduce the possibility of
|
|
|
292 |
.CW factotum
|
|
|
293 |
leaking information inadvertently.
|
|
|
294 |
.LP
|
|
|
295 |
.CW Factotum
|
|
|
296 |
is implemented, like most Plan 9 services, as a file server.
|
|
|
297 |
It is conventionally mounted upon the directory
|
|
|
298 |
.CW /mnt/factotum ,
|
|
|
299 |
and the files it serves there are analogous to virtual devices that provide access to,
|
|
|
300 |
and control of, the services of the
|
|
|
301 |
.CW factotum .
|
|
|
302 |
The next few sections describe the design of
|
|
|
303 |
.CW factotum
|
|
|
304 |
and how it operates with the other pieces of Plan 9 to provide
|
|
|
305 |
security services.
|
|
|
306 |
.SS
|
|
|
307 |
Logging in
|
|
|
308 |
.LP
|
|
|
309 |
To make the discussions that follow more concrete,
|
|
|
310 |
we begin with a couple of examples showing how the
|
|
|
311 |
Plan 9 security architecture appears to the user.
|
|
|
312 |
These examples both involve a user
|
|
|
313 |
.CW gre
|
|
|
314 |
logging in after booting a local machine.
|
|
|
315 |
The user may or may not have a secure store in which
|
|
|
316 |
all his keys are kept.
|
|
|
317 |
If he does,
|
|
|
318 |
.CW factotum
|
|
|
319 |
will prompt him for the password to the secure store
|
|
|
320 |
and obtain keys from it, prompting only when a key
|
|
|
321 |
isn't found in the store.
|
|
|
322 |
Otherwise,
|
|
|
323 |
.CW factotum
|
|
|
324 |
must prompt for each key.
|
|
|
325 |
.LP
|
|
|
326 |
In the typescripts, \f6\s9\en\s0\fP
|
|
|
327 |
represents a literal newline
|
|
|
328 |
character typed to force a default response.
|
|
|
329 |
User input is in italics, and
|
|
|
330 |
long lines are folded and indented to fit.
|
|
|
331 |
.LP
|
|
|
332 |
This first example shows a user logging in without
|
|
|
333 |
help from the secure store.
|
|
|
334 |
First,
|
|
|
335 |
.CW factotum
|
|
|
336 |
prompts for a user name that the local kernel
|
|
|
337 |
will use:
|
|
|
338 |
.P1
|
|
|
339 |
user[none]: \f6\s9gre\s0\fP
|
|
|
340 |
.P2
|
|
|
341 |
(Default responses appear in square brackets.)
|
|
|
342 |
The kernel then starts accessing local resources
|
|
|
343 |
and requests, through
|
|
|
344 |
.CW factotum ,
|
|
|
345 |
a user/password pair to do so:
|
|
|
346 |
.P1
|
|
|
347 |
!Adding key: dom=cs.bell-labs.com
|
|
|
348 |
proto=p9sk1
|
|
|
349 |
user[gre]: \f6\s9\en\s0\fP
|
|
|
350 |
password: \f6****\fP
|
|
|
351 |
.P2
|
|
|
352 |
Now the user is logged in to the local system, and
|
|
|
353 |
the mail client starts up:
|
|
|
354 |
.P1
|
|
|
355 |
!Adding key: proto=apop
|
|
|
356 |
server=plan9.bell-labs.com
|
|
|
357 |
user[gre]: \f6\s9\en\s0\fP
|
|
|
358 |
password: \f6****\fP
|
|
|
359 |
.P2
|
|
|
360 |
.CW Factotum
|
|
|
361 |
is doing all the prompting and the applications
|
|
|
362 |
being started are not even touching the keys.
|
|
|
363 |
Note that it's always clear which key is being requested.
|
|
|
364 |
.LP
|
|
|
365 |
Now consider the same login sequence, but in the case where
|
|
|
366 |
.CW gre
|
|
|
367 |
has a secure store account:
|
|
|
368 |
.P1
|
|
|
369 |
user[none]: \f6\s9gre\s0\fP
|
|
|
370 |
secstore password: \f6*********\fP
|
|
|
371 |
STA PIN+SecurID: \f6*********\fP
|
|
|
372 |
.P2
|
|
|
373 |
That's the last
|
|
|
374 |
.CW gre
|
|
|
375 |
will hear from
|
|
|
376 |
.CW factotum
|
|
|
377 |
unless an attempt is made to contact
|
|
|
378 |
a system for which no key is kept in the secure store.
|
|
|
379 |
.SS
|
|
|
380 |
The factotum
|
|
|
381 |
.LP
|
|
|
382 |
Each computer running Plan 9 has one user id that owns all the
|
|
|
383 |
resources on that system \(em the scheduler, local disks,
|
|
|
384 |
network interfaces, etc.
|
|
|
385 |
That user, the
|
|
|
386 |
.I "host owner" ,
|
|
|
387 |
is the closest analogue in Plan 9 to a Unix
|
|
|
388 |
.CW root
|
|
|
389 |
account (although it is far weaker;
|
|
|
390 |
rather than having special powers, as its name implies the host owner
|
|
|
391 |
is just a regular user that happens to own the
|
|
|
392 |
resources of the local machine).
|
|
|
393 |
On a single-user system, which we call a terminal,
|
|
|
394 |
the host owner is the id of the terminal's user.
|
|
|
395 |
Shared servers such as CPU servers normally have a pseudo-user
|
|
|
396 |
that initially owns all resources.
|
|
|
397 |
At boot time, the Plan 9 kernel starts a
|
|
|
398 |
.CW factotum
|
|
|
399 |
executing as, and therefore with the privileges of,
|
|
|
400 |
the host owner.
|
|
|
401 |
.LP
|
|
|
402 |
New processes run as
|
|
|
403 |
the same user as the process which created them.
|
|
|
404 |
When a process must take on the identity of a new user,
|
|
|
405 |
such as to provide a login shell
|
|
|
406 |
on a shared CPU server,
|
|
|
407 |
it does so by proving to the host owner's
|
|
|
408 |
.CW factotum
|
|
|
409 |
that it is
|
|
|
410 |
authorized to do so.
|
|
|
411 |
This is done by running an
|
|
|
412 |
authentication protocol with
|
|
|
413 |
.CW factotum
|
|
|
414 |
to
|
|
|
415 |
prove that the process has access to secret information
|
|
|
416 |
which only the new user should possess.
|
|
|
417 |
For example, consider the setup in Figure 1a.
|
|
|
418 |
If a user on the terminal
|
|
|
419 |
wants to log in to the CPU server using the
|
|
|
420 |
Plan 9
|
|
|
421 |
.CW cpu
|
|
|
422 |
service
|
|
|
423 |
[Pike93],
|
|
|
424 |
then
|
|
|
425 |
$P sub T#
|
|
|
426 |
might be the
|
|
|
427 |
.CW cpu
|
|
|
428 |
client program and
|
|
|
429 |
$P sub C#
|
|
|
430 |
the
|
|
|
431 |
.CW cpu
|
|
|
432 |
server.
|
|
|
433 |
Neither $P sub C# nor $P sub T#
|
|
|
434 |
knows the details of the authentication.
|
|
|
435 |
They
|
|
|
436 |
do need to be able to shuttle messages back and
|
|
|
437 |
forth between the two
|
|
|
438 |
.CW factotums ,
|
|
|
439 |
but this is
|
|
|
440 |
a generic function easily performed without
|
|
|
441 |
knowing, or being able to extract, secrets in
|
|
|
442 |
the messages.
|
|
|
443 |
$P sub T#
|
|
|
444 |
will make a network connection to $P sub C#.
|
|
|
445 |
$P sub T#
|
|
|
446 |
and
|
|
|
447 |
$P sub C#
|
|
|
448 |
will then relay messages between
|
|
|
449 |
the
|
|
|
450 |
.CW factotum
|
|
|
451 |
owned by the user, $F sub T#,
|
|
|
452 |
and the one owned by the CPU server, $F sub C#,
|
|
|
453 |
until mutual authentication has been established.
|
|
|
454 |
Later
|
|
|
455 |
sections describe the RPC between
|
|
|
456 |
.CW factotum
|
|
|
457 |
and
|
|
|
458 |
applications and the library functions to support proxy operations.
|
|
|
459 |
.LP
|
|
|
460 |
The kernel always uses a single local instance of
|
|
|
461 |
.CW factotum ,
|
|
|
462 |
running as the
|
|
|
463 |
host owner, for
|
|
|
464 |
its authentication purposes, but
|
|
|
465 |
a regular user may start other
|
|
|
466 |
.CW factotum
|
|
|
467 |
agents.
|
|
|
468 |
In fact, the
|
|
|
469 |
.CW factotum
|
|
|
470 |
representing the user need not be
|
|
|
471 |
running on the same machine as its client.
|
|
|
472 |
For instance, it is easy for a user on a CPU server,
|
|
|
473 |
through standard Plan 9 operations,
|
|
|
474 |
to replace the
|
|
|
475 |
.CW /mnt/factotum
|
|
|
476 |
in the user's private file name space on the server
|
|
|
477 |
with a connection to the
|
|
|
478 |
.CW factotum
|
|
|
479 |
running on the terminal.
|
|
|
480 |
(The usual file system permissions prevent interlopers
|
|
|
481 |
from doing so maliciously.)
|
|
|
482 |
This permits secure operations on the CPU server to be
|
|
|
483 |
transparently validated by the user's own
|
|
|
484 |
.CW factotum ,
|
|
|
485 |
so
|
|
|
486 |
secrets need never leave the user's terminal.
|
|
|
487 |
The SSH agent
|
|
|
488 |
[Ylon96]
|
|
|
489 |
does much the
|
|
|
490 |
same with special SSH protocol messages, but
|
|
|
491 |
an advantage to making our agent a file system
|
|
|
492 |
is that we need no new mechanism to access our remote
|
|
|
493 |
agent; remote file access is sufficient.
|
|
|
494 |
.LP
|
|
|
495 |
Within
|
|
|
496 |
.CW factotum ,
|
|
|
497 |
each protocol is implemented as a state
|
|
|
498 |
machine with a generic interface, so protocols are in
|
|
|
499 |
essence pluggable modules, easy to add, modify, or drop.
|
|
|
500 |
Writing a message to and reading a message from
|
|
|
501 |
.CW factotum
|
|
|
502 |
each require a separate RPC and result in
|
|
|
503 |
a single state transition.
|
|
|
504 |
Therefore
|
|
|
505 |
.CW factotum
|
|
|
506 |
always runs to completion on every RPC and never blocks
|
|
|
507 |
waiting for input during any authentication.
|
|
|
508 |
Moreover, the number of simultaneous
|
|
|
509 |
authentications is limited only by the amount of memory we're
|
|
|
510 |
willing to dedicate to representing the state machines.
|
|
|
511 |
.LP
|
|
|
512 |
Authentication protocols are implemented only
|
|
|
513 |
within
|
|
|
514 |
.CW factotum ,
|
|
|
515 |
but adding and removing
|
|
|
516 |
protocols does require relinking the binary, so
|
|
|
517 |
.CW factotum
|
|
|
518 |
processes (but no others)
|
|
|
519 |
need to be restarted in order to take advantage of
|
|
|
520 |
new or repaired protocols.
|
|
|
521 |
.LP
|
|
|
522 |
At the time of writing,
|
|
|
523 |
.CW factotum
|
|
|
524 |
contains authentication
|
|
|
525 |
modules for the Plan 9 shared key protocol (p9sk1),
|
|
|
526 |
SSH's RSA authentication, passwords in the clear, APOP, CRAM, PPP's CHAP,
|
|
|
527 |
Microsoft PPP's MSCHAP, and VNC's challenge/response.
|
|
|
528 |
.SS
|
|
|
529 |
Local capabilities
|
|
|
530 |
.LP
|
|
|
531 |
A capability system, managed by the kernel, is used to empower
|
|
|
532 |
.CW factotum
|
|
|
533 |
to grant permission to another process to change its user id.
|
|
|
534 |
A
|
|
|
535 |
kernel device driver
|
|
|
536 |
implements two files,
|
|
|
537 |
.CW /dev/caphash
|
|
|
538 |
and
|
|
|
539 |
.CW /dev/capuse .
|
|
|
540 |
The write-only file
|
|
|
541 |
.CW /dev/caphash
|
|
|
542 |
can be opened only by the host owner, and only once.
|
|
|
543 |
.CW Factotum
|
|
|
544 |
opens this file immediately after booting.
|
|
|
545 |
.LP
|
|
|
546 |
To use the files,
|
|
|
547 |
.CW factotum
|
|
|
548 |
creates a string of the form
|
|
|
549 |
.I userid1\f(CW@\fPuserid2\f(CW@\fPrandom-string ,
|
|
|
550 |
uses SHA1 HMAC to hash
|
|
|
551 |
.I userid1\f(CW@\fPuserid2
|
|
|
552 |
with key
|
|
|
553 |
.I random-string ,
|
|
|
554 |
and writes that hash to
|
|
|
555 |
.CW /dev/caphash .
|
|
|
556 |
.CW Factotum
|
|
|
557 |
then passes the original string to another
|
|
|
558 |
process on the same machine, running
|
|
|
559 |
as user
|
|
|
560 |
.I userid1 ,
|
|
|
561 |
which
|
|
|
562 |
writes the string to
|
|
|
563 |
.CW /dev/capuse .
|
|
|
564 |
The kernel hashes the string and looks for
|
|
|
565 |
a matching hash in its list.
|
|
|
566 |
If it finds one,
|
|
|
567 |
the writing process's user id changes from
|
|
|
568 |
.I userid1
|
|
|
569 |
to
|
|
|
570 |
.I userid2 .
|
|
|
571 |
Once used, or if a timeout expires,
|
|
|
572 |
the capability is discarded by the kernel.
|
|
|
573 |
.LP
|
|
|
574 |
The capabilities are local to the machine on which they are created.
|
|
|
575 |
Hence a
|
|
|
576 |
.CW factotum
|
|
|
577 |
running on one machine cannot pass capabilities
|
|
|
578 |
to processes on another and expect them to work.
|
|
|
579 |
.SS
|
|
|
580 |
Keys
|
|
|
581 |
.LP
|
|
|
582 |
We define the word
|
|
|
583 |
.I key
|
|
|
584 |
to mean not only a secret, but also a description of the
|
|
|
585 |
context in which that secret is to be used: the protocol,
|
|
|
586 |
server, user, etc. to which it applies.
|
|
|
587 |
That is,
|
|
|
588 |
a key is a combination of secret and descriptive information
|
|
|
589 |
used to authenticate the identities of parties
|
|
|
590 |
transmitting or receiving information.
|
|
|
591 |
The set of keys used
|
|
|
592 |
in any authentication depends both on the protocol and on
|
|
|
593 |
parameters passed by the program requesting the authentication.
|
|
|
594 |
.LP
|
|
|
595 |
Taking a tip from SDSI
|
|
|
596 |
[RiLa],
|
|
|
597 |
which represents security information as textual S-expressions,
|
|
|
598 |
keys in Plan 9 are represented as plain UTF-8 text.
|
|
|
599 |
Text is easily
|
|
|
600 |
understood and manipulated by users.
|
|
|
601 |
By contrast,
|
|
|
602 |
a binary or other cryptic format
|
|
|
603 |
can actually reduce overall security.
|
|
|
604 |
Binary formats are difficult for users to examine and can only be
|
|
|
605 |
cracked by special tools, themselves poorly understood by most users.
|
|
|
606 |
For example, very few people know or understand what's inside
|
|
|
607 |
their X.509 certificates.
|
|
|
608 |
Most don't even know where in the system to
|
|
|
609 |
find them.
|
|
|
610 |
Therefore, they have no idea what they are trusting, and why, and
|
|
|
611 |
are powerless to change their trust relationships.
|
|
|
612 |
Textual, centrally stored and managed keys are easier to use and safer.
|
|
|
613 |
.LP
|
|
|
614 |
Plan 9 has historically represented databases as attribute/value pairs,
|
|
|
615 |
since they are a good foundation for selection and projection operations.
|
|
|
616 |
.CW Factotum
|
|
|
617 |
therefore represents
|
|
|
618 |
the keys in the format
|
|
|
619 |
.I attribute\f(CW=\fPvalue ,
|
|
|
620 |
where
|
|
|
621 |
.I attribute
|
|
|
622 |
is an identifier, possibly with a single-character prefix, and
|
|
|
623 |
.I value
|
|
|
624 |
is an arbitrary quoted string.
|
|
|
625 |
The pairs themselves are separated by white space.
|
|
|
626 |
For example, a Plan 9 key and an APOP key
|
|
|
627 |
might be represented like this:
|
|
|
628 |
.P1
|
|
|
629 |
dom=bell-labs.com proto=p9sk1 user=gre
|
|
|
630 |
!password='don''t tell'
|
|
|
631 |
proto=apop server=x.y.com user=gre
|
|
|
632 |
!password='open sesame'
|
|
|
633 |
.P2
|
|
|
634 |
If a value is empty or contains white space or single quotes, it must be quoted;
|
|
|
635 |
quotes are represented by doubled single quotes.
|
|
|
636 |
Attributes that begin with an exclamation mark
|
|
|
637 |
.CW ! ) (
|
|
|
638 |
are considered
|
|
|
639 |
.I secret .
|
|
|
640 |
.CW Factotum
|
|
|
641 |
will never let a secret value escape its address space
|
|
|
642 |
and will suppress keyboard echo when asking the user to type one.
|
|
|
643 |
.LP
|
|
|
644 |
A program requesting authentication selects a key
|
|
|
645 |
by providing a
|
|
|
646 |
.I query ,
|
|
|
647 |
a list of elements to be matched by the key.
|
|
|
648 |
Each element in the list is either an
|
|
|
649 |
.I attribute\f(CW=\fPvalue
|
|
|
650 |
pair, which is satisfied by keys with
|
|
|
651 |
exactly that pair;
|
|
|
652 |
or an attribute followed by a question mark,
|
|
|
653 |
.I attribute\f(CW? ,
|
|
|
654 |
which is satisfied by keys with some pair specifying
|
|
|
655 |
the attribute.
|
|
|
656 |
A key matches a query if every element in the list
|
|
|
657 |
is satisfied.
|
|
|
658 |
For instance, to select the APOP key in the previous example,
|
|
|
659 |
an APOP client process might specify the query
|
|
|
660 |
.P1
|
|
|
661 |
server=x.y.com proto=apop
|
|
|
662 |
.P2
|
|
|
663 |
Internally,
|
|
|
664 |
.CW factotum 's
|
|
|
665 |
APOP module would add the requirements of
|
|
|
666 |
having
|
|
|
667 |
.CW user
|
|
|
668 |
and
|
|
|
669 |
.CW !password
|
|
|
670 |
attributes, forming the query
|
|
|
671 |
.P1
|
|
|
672 |
server=x.y.com proto=apop user? !password?
|
|
|
673 |
.P2
|
|
|
674 |
when searching for an appropriate key.
|
|
|
675 |
.LP
|
|
|
676 |
.CW Factotum
|
|
|
677 |
modules expect keys to have some well-known attributes.
|
|
|
678 |
For instance, the
|
|
|
679 |
.CW proto
|
|
|
680 |
attribute specifies the protocol module
|
|
|
681 |
responsible for using a particular key,
|
|
|
682 |
and protocol modules may expect other well-known attributes
|
|
|
683 |
(many expect keys to have
|
|
|
684 |
.CW !password
|
|
|
685 |
attributes, for example).
|
|
|
686 |
Additional attributes can be used as comments or for
|
|
|
687 |
further discrimination without intervention by
|
|
|
688 |
.CW factotum ;
|
|
|
689 |
for example, the APOP and IMAP mail clients conventionally
|
|
|
690 |
include a
|
|
|
691 |
.CW server
|
|
|
692 |
attribute to select an appropriate key for authentication.
|
|
|
693 |
.LP
|
|
|
694 |
Unlike in SDSI,
|
|
|
695 |
keys in Plan 9 have no nested structure. This design
|
|
|
696 |
keeps the representation simple and straightforward.
|
|
|
697 |
If necessary, we could add a nested attribute
|
|
|
698 |
or, in the manner of relational databases, an attribute that
|
|
|
699 |
selects another tuple, but so far the simple design has been sufficient.
|
|
|
700 |
.LP
|
|
|
701 |
A simple common structure for all keys makes them easy for users
|
|
|
702 |
to administer,
|
|
|
703 |
but the set of attributes and their interpretation is still
|
|
|
704 |
protocol-specific and can be subtle.
|
|
|
705 |
Users may still
|
|
|
706 |
need to consult a manual to understand all details.
|
|
|
707 |
Many attributes
|
|
|
708 |
.CW proto , (
|
|
|
709 |
.CW user ,
|
|
|
710 |
.CW password ,
|
|
|
711 |
.CW server )
|
|
|
712 |
are self-explanatory and our short experience
|
|
|
713 |
has not uncovered any particular difficulty in handling keys.
|
|
|
714 |
Things
|
|
|
715 |
will likely get messier, however,
|
|
|
716 |
when we grapple with public
|
|
|
717 |
keys and their myriad components.
|
|
|
718 |
.SS
|
|
|
719 |
Protecting keys
|
|
|
720 |
.LP
|
|
|
721 |
Secrets must be prevented from escaping
|
|
|
722 |
.CW factotum .
|
|
|
723 |
There are a number of ways they could leak:
|
|
|
724 |
another process might be able to debug the agent process, the
|
|
|
725 |
agent might swap out to disk, or the process might willingly
|
|
|
726 |
disclose the key.
|
|
|
727 |
The last is the easiest to avoid:
|
|
|
728 |
secret information in a key is marked
|
|
|
729 |
as such, and
|
|
|
730 |
whenever
|
|
|
731 |
.CW factotum
|
|
|
732 |
prints keys or queries for new
|
|
|
733 |
ones, it is careful to avoid displaying secret information.
|
|
|
734 |
(The only exception to this is the
|
|
|
735 |
``plaintext password'' protocol, which consists
|
|
|
736 |
of sending the values of the
|
|
|
737 |
.CW user
|
|
|
738 |
and
|
|
|
739 |
.CW !password
|
|
|
740 |
attributes.
|
|
|
741 |
Only keys tagged with
|
|
|
742 |
.CW proto=pass
|
|
|
743 |
can have their passwords disclosed by this mechanism.)
|
|
|
744 |
.LP
|
|
|
745 |
Preventing the first two forms of leakage
|
|
|
746 |
requires help from the kernel.
|
|
|
747 |
In Plan 9, every process is
|
|
|
748 |
represented by a directory in the
|
|
|
749 |
.CW /proc
|
|
|
750 |
file system.
|
|
|
751 |
Using the files in this directory,
|
|
|
752 |
other processes could (with appropriate access permission) examine
|
|
|
753 |
.CW factotum 's
|
|
|
754 |
memory and registers.
|
|
|
755 |
.CW Factotum
|
|
|
756 |
is protected from processes of other users
|
|
|
757 |
by the default access bits of its
|
|
|
758 |
.CW /proc
|
|
|
759 |
directory.
|
|
|
760 |
However, we'd also like to protect the
|
|
|
761 |
agent from other processes owned by the same user,
|
|
|
762 |
both to avoid honest mistakes and to prevent
|
|
|
763 |
an unattended terminal being
|
|
|
764 |
exploited to discover secret passwords.
|
|
|
765 |
To do this, we added a control message to
|
|
|
766 |
.CW /proc
|
|
|
767 |
called
|
|
|
768 |
.CW private .
|
|
|
769 |
Once the
|
|
|
770 |
.CW factotum
|
|
|
771 |
process has written
|
|
|
772 |
.CW private
|
|
|
773 |
to its
|
|
|
774 |
.CW /proc/\f2pid\fP/ctl
|
|
|
775 |
file, no process can access
|
|
|
776 |
.CW factotum 's
|
|
|
777 |
memory
|
|
|
778 |
through
|
|
|
779 |
.CW /proc .
|
|
|
780 |
(Plan 9 has no other mechanism, such as
|
|
|
781 |
.CW /dev/kmem ,
|
|
|
782 |
for accessing a process's memory.)
|
|
|
783 |
.LP
|
|
|
784 |
Similarly, the agent's address space should not be
|
|
|
785 |
swapped out, to prevent discovering unencrypted
|
|
|
786 |
keys on the swapping media.
|
|
|
787 |
The
|
|
|
788 |
.CW noswap
|
|
|
789 |
control message in
|
|
|
790 |
.CW /proc
|
|
|
791 |
prevents this scenario.
|
|
|
792 |
Neither
|
|
|
793 |
.CW private
|
|
|
794 |
nor
|
|
|
795 |
.CW noswap
|
|
|
796 |
is specific to
|
|
|
797 |
.CW factotum .
|
|
|
798 |
User-level file servers such as
|
|
|
799 |
.CW dossrv ,
|
|
|
800 |
which interprets FAT file systems,
|
|
|
801 |
could use
|
|
|
802 |
.CW noswap
|
|
|
803 |
to keep their buffer caches from being
|
|
|
804 |
swapped to disk.
|
|
|
805 |
.LP
|
|
|
806 |
Despite our precautions, attackers might still
|
|
|
807 |
find a way to gain access to a process running as the host
|
|
|
808 |
owner on a machine.
|
|
|
809 |
Although they could not directly
|
|
|
810 |
access the keys, attackers could use the local
|
|
|
811 |
.CW factotum
|
|
|
812 |
to perform authentications for them.
|
|
|
813 |
In the case
|
|
|
814 |
of some keys, for example those locking bank
|
|
|
815 |
accounts, we want a way to disable or at least
|
|
|
816 |
detect such access.
|
|
|
817 |
That is the role of the
|
|
|
818 |
.CW confirm
|
|
|
819 |
attribute in a key.
|
|
|
820 |
Whenever a key with a
|
|
|
821 |
.CW confirm
|
|
|
822 |
attribute is accessed, the local user must
|
|
|
823 |
confirm use of the key via a local GUI.
|
|
|
824 |
The next section describes the actual mechanism.
|
|
|
825 |
.LP
|
|
|
826 |
We have not addressed leaks possible as a result of
|
|
|
827 |
someone rebooting or resetting a machine running
|
|
|
828 |
.CW factotum .
|
|
|
829 |
For example, someone could reset a machine
|
|
|
830 |
and reboot it with a debugger instead of a kernel,
|
|
|
831 |
allowing them to examine the contents of memory
|
|
|
832 |
and find keys. We have not found a satisfactory
|
|
|
833 |
solution to this problem.
|
|
|
834 |
.SS
|
|
|
835 |
Factotum transactions
|
|
|
836 |
.LP
|
|
|
837 |
External programs manage
|
|
|
838 |
.CW factotum 's
|
|
|
839 |
internal key state
|
|
|
840 |
through its file interface,
|
|
|
841 |
writing textual
|
|
|
842 |
.CW key
|
|
|
843 |
and
|
|
|
844 |
.CW delkey
|
|
|
845 |
commands to the
|
|
|
846 |
.CW /mnt/factotum/ctl
|
|
|
847 |
file.
|
|
|
848 |
Both commands take a list of attributes as an argument.
|
|
|
849 |
.CW Key
|
|
|
850 |
creates a key with the given attributes, replacing any
|
|
|
851 |
extant key with an identical set of public attributes.
|
|
|
852 |
.CW Delkey
|
|
|
853 |
deletes all keys that match the given set of attributes.
|
|
|
854 |
Reading the
|
|
|
855 |
.CW ctl
|
|
|
856 |
file returns a list of keys, one per line, displaying only public attributes.
|
|
|
857 |
The following example illustrates these interactions.
|
|
|
858 |
.P1
|
|
|
859 |
% cd /mnt/factotum
|
|
|
860 |
% ls -l
|
|
|
861 |
-lrw------- gre gre 0 Jan 30 22:17 confirm
|
|
|
862 |
--rw------- gre gre 0 Jan 30 22:17 ctl
|
|
|
863 |
-lr-------- gre gre 0 Jan 30 22:17 log
|
|
|
864 |
-lrw------- gre gre 0 Jan 30 22:17 needkey
|
|
|
865 |
--r--r--r-- gre gre 0 Jan 30 22:17 proto
|
|
|
866 |
--rw-rw-rw- gre gre 0 Jan 30 22:17 rpc
|
|
|
867 |
% cat >ctl
|
|
|
868 |
key dom=bell-labs.com proto=p9sk1 user=gre
|
|
|
869 |
!password='don''t tell'
|
|
|
870 |
key proto=apop server=x.y.com user=gre
|
|
|
871 |
!password='bite me'
|
|
|
872 |
^D
|
|
|
873 |
% cat ctl
|
|
|
874 |
key dom=bell-labs.com proto=p9sk1 user=gre
|
|
|
875 |
key proto=apop server=x.y.com user=gre
|
|
|
876 |
% echo 'delkey proto=apop' >ctl
|
|
|
877 |
% cat ctl
|
|
|
878 |
key dom=bell-labs.com proto=p9sk1 user=gre
|
|
|
879 |
%
|
|
|
880 |
.P2
|
|
|
881 |
(A file with the
|
|
|
882 |
.CW l
|
|
|
883 |
bit set can be opened by only one process at a time.)
|
|
|
884 |
.LP
|
|
|
885 |
The heart of the interface is the
|
|
|
886 |
.CW rpc
|
|
|
887 |
file.
|
|
|
888 |
Programs authenticate with
|
|
|
889 |
.CW factotum
|
|
|
890 |
by writing a request to the
|
|
|
891 |
.CW rpc
|
|
|
892 |
file
|
|
|
893 |
and reading back the reply; this sequence is called an RPC
|
|
|
894 |
.I transaction .
|
|
|
895 |
Requests and replies have the same format:
|
|
|
896 |
a textual verb possibly followed by arguments,
|
|
|
897 |
which may be textual or binary.
|
|
|
898 |
The most common reply verb is
|
|
|
899 |
.CW ok ,
|
|
|
900 |
indicating success.
|
|
|
901 |
An RPC session begins with a
|
|
|
902 |
.CW start
|
|
|
903 |
transaction; the argument is a key query as described
|
|
|
904 |
earlier.
|
|
|
905 |
Once started, an RPC conversation usually consists of
|
|
|
906 |
a sequence of
|
|
|
907 |
.CW read
|
|
|
908 |
and
|
|
|
909 |
.CW write
|
|
|
910 |
transactions.
|
|
|
911 |
If the conversation is successful, an
|
|
|
912 |
.CW authinfo
|
|
|
913 |
transaction will return information about
|
|
|
914 |
the identities learned during the transaction.
|
|
|
915 |
The
|
|
|
916 |
.CW attr
|
|
|
917 |
transaction returns a list of attributes for the current
|
|
|
918 |
conversation; the list includes any attributes given in
|
|
|
919 |
the
|
|
|
920 |
.CW start
|
|
|
921 |
query as well as any public attributes from keys being used.
|
|
|
922 |
.LP
|
|
|
923 |
As an example of the
|
|
|
924 |
.CW rpc
|
|
|
925 |
file in action, consider a mail client
|
|
|
926 |
connecting to a mail server and authenticating using
|
|
|
927 |
the POP3 protocol's APOP challenge-response command.
|
|
|
928 |
There are four programs involved: the mail client $P sub C#, the client
|
|
|
929 |
.CW factotum
|
|
|
930 |
$F sub C#, the mail server $P sub S#, and the server
|
|
|
931 |
.CW factotum
|
|
|
932 |
$F sub S#.
|
|
|
933 |
All authentication computations are handled by the
|
|
|
934 |
.CW factotum
|
|
|
935 |
processes.
|
|
|
936 |
The mail programs' role is just to relay messages.
|
|
|
937 |
.LP
|
|
|
938 |
At startup, the mail server at
|
|
|
939 |
.CW x.y.com
|
|
|
940 |
begins an APOP conversation
|
|
|
941 |
with its
|
|
|
942 |
.CW factotum
|
|
|
943 |
to obtain the banner greeting, which
|
|
|
944 |
includes a challenge:
|
|
|
945 |
.P1
|
|
|
946 |
$P sub S -> F sub S#: start proto=apop role=server
|
|
|
947 |
$F sub S -> P sub S#: ok
|
|
|
948 |
$P sub S -> F sub S#: read
|
|
|
949 |
$F sub S -> P sub S#: ok +OK POP3 \f2challenge\fP
|
|
|
950 |
.P2
|
|
|
951 |
Having obtained the challenge, the server greets the client:
|
|
|
952 |
.P1
|
|
|
953 |
$P sub S -> P sub C#: +OK POP3 \f2challenge\fP
|
|
|
954 |
.P2
|
|
|
955 |
The client then uses an APOP conversation with its
|
|
|
956 |
.CW factotum
|
|
|
957 |
to obtain a response:
|
|
|
958 |
.P1
|
|
|
959 |
$P sub C -> F sub C#: start proto=apop role=client
|
|
|
960 |
server=x.y.com
|
|
|
961 |
$F sub C -> P sub C#: ok
|
|
|
962 |
$P sub C -> F sub C#: write +OK POP3 \f2challenge\fP
|
|
|
963 |
$F sub C -> P sub C#: ok
|
|
|
964 |
$P sub C -> F sub C#: read
|
|
|
965 |
$F sub C -> P sub C#: ok APOP gre \f2response\fP
|
|
|
966 |
.P2
|
|
|
967 |
.CW Factotum
|
|
|
968 |
requires that
|
|
|
969 |
.CW start
|
|
|
970 |
requests include a
|
|
|
971 |
.CW proto
|
|
|
972 |
attribute, and the APOP module requires an additional
|
|
|
973 |
.CW role
|
|
|
974 |
attribute, but the other attributes are optional and only
|
|
|
975 |
restrict the key space.
|
|
|
976 |
Before responding to the
|
|
|
977 |
.CW start
|
|
|
978 |
transaction, the client
|
|
|
979 |
.CW factotum
|
|
|
980 |
looks for a key to
|
|
|
981 |
use for the rest of the conversation.
|
|
|
982 |
Because of the arguments in the
|
|
|
983 |
.CW start
|
|
|
984 |
request, the key must have public attributes
|
|
|
985 |
.CW proto=apop
|
|
|
986 |
and
|
|
|
987 |
.CW server=x.y.com ;
|
|
|
988 |
as mentioned earlier,
|
|
|
989 |
the APOP module additionally requires that the key have
|
|
|
990 |
.CW user
|
|
|
991 |
and
|
|
|
992 |
.CW !password
|
|
|
993 |
attributes.
|
|
|
994 |
Now that the client has obtained a response
|
|
|
995 |
from its
|
|
|
996 |
.CW factotum ,
|
|
|
997 |
it echoes that response to the server:
|
|
|
998 |
.P1
|
|
|
999 |
$P sub C -> P sub S#: APOP gre \f2response\fP
|
|
|
1000 |
.P2
|
|
|
1001 |
Similarly, the server passes this message to
|
|
|
1002 |
its
|
|
|
1003 |
.CW factotum
|
|
|
1004 |
and obtains another to send back.
|
|
|
1005 |
.P1
|
|
|
1006 |
$P sub S -> F sub S#: write APOP gre \f2response\fP
|
|
|
1007 |
$F sub S -> P sub S#: ok
|
|
|
1008 |
$P sub S -> F sub S#: read
|
|
|
1009 |
$F sub S -> P sub S#: ok +OK welcome
|
|
|
1010 |
|
|
|
1011 |
$P sub S -> P sub C#: +OK welcome
|
|
|
1012 |
.P2
|
|
|
1013 |
Now the authentication protocol is done, and
|
|
|
1014 |
the server can retrieve information
|
|
|
1015 |
about what the protocol established.
|
|
|
1016 |
.P1
|
|
|
1017 |
$P sub S -> F sub S#: authinfo
|
|
|
1018 |
$F sub S -> P sub S#: ok client=gre
|
|
|
1019 |
capability=\f2capability\fP
|
|
|
1020 |
.P2
|
|
|
1021 |
The
|
|
|
1022 |
.CW authinfo
|
|
|
1023 |
data is a list of
|
|
|
1024 |
.I attr\f(CW=\fPvalue
|
|
|
1025 |
pairs, here a client user name and a capability.
|
|
|
1026 |
(Protocols that establish shared secrets or provide
|
|
|
1027 |
mutual authentication indicate this by adding
|
|
|
1028 |
appropriate
|
|
|
1029 |
.I attr\f(CW=\fPvalue
|
|
|
1030 |
pairs.)
|
|
|
1031 |
The capability can be used by the server to change its
|
|
|
1032 |
identity to that of the client, as described earlier.
|
|
|
1033 |
Once it has changed its identity, the server can access and serve
|
|
|
1034 |
the client's mailbox.
|
|
|
1035 |
.LP
|
|
|
1036 |
Two more files provide hooks for a graphical
|
|
|
1037 |
.CW factotum
|
|
|
1038 |
control interface.
|
|
|
1039 |
The first,
|
|
|
1040 |
.CW confirm ,
|
|
|
1041 |
allows the user detailed control over the use of certain keys.
|
|
|
1042 |
If a key has a
|
|
|
1043 |
.CW confirm=
|
|
|
1044 |
attribute, then the user must approve each use of the key.
|
|
|
1045 |
A separate program with a graphical interface reads from the
|
|
|
1046 |
.CW confirm
|
|
|
1047 |
file to see when a confirmation is necessary.
|
|
|
1048 |
The read blocks until a key usage needs to be approved, whereupon
|
|
|
1049 |
it will return a line of the form
|
|
|
1050 |
.P1
|
|
|
1051 |
confirm tag=1 \f2attributes\fP
|
|
|
1052 |
.P2
|
|
|
1053 |
requesting permission to use the key with those public attributes.
|
|
|
1054 |
The graphical interface then prompts the user for approval
|
|
|
1055 |
and writes back
|
|
|
1056 |
.P1
|
|
|
1057 |
tag=1 answer=yes
|
|
|
1058 |
.P2
|
|
|
1059 |
(or
|
|
|
1060 |
.CW answer=no ).
|
|
|
1061 |
.LP
|
|
|
1062 |
The second file,
|
|
|
1063 |
.CW needkey ,
|
|
|
1064 |
diverts key requests.
|
|
|
1065 |
In the APOP example, if a suitable key had not been found
|
|
|
1066 |
during the
|
|
|
1067 |
.CW start
|
|
|
1068 |
transaction,
|
|
|
1069 |
.CW factotum
|
|
|
1070 |
would have indicated failure by
|
|
|
1071 |
returning a response indicating
|
|
|
1072 |
what key was needed:
|
|
|
1073 |
.P1
|
|
|
1074 |
$F sub C -> P sub C#: needkey proto=apop
|
|
|
1075 |
server=x.y.com user? !password?
|
|
|
1076 |
.P2
|
|
|
1077 |
A typical client would then prompt the user for the desired
|
|
|
1078 |
key information, create a new key via the
|
|
|
1079 |
.CW ctl
|
|
|
1080 |
file, and then reissue the
|
|
|
1081 |
.CW start
|
|
|
1082 |
request.
|
|
|
1083 |
If the
|
|
|
1084 |
.CW needkey
|
|
|
1085 |
file is open,
|
|
|
1086 |
then instead of failing, the transaction
|
|
|
1087 |
will block, and the next read from the
|
|
|
1088 |
.CW /mnt/factotum/needkey
|
|
|
1089 |
file will return a line of the form
|
|
|
1090 |
.P1
|
|
|
1091 |
needkey tag=1 \f2attributes\f2
|
|
|
1092 |
.P2
|
|
|
1093 |
The graphical interface then prompts the user for the needed
|
|
|
1094 |
key information, creates the key via the
|
|
|
1095 |
.CW ctl
|
|
|
1096 |
file, and writes back
|
|
|
1097 |
.CW tag=1
|
|
|
1098 |
to resume the transaction.
|
|
|
1099 |
.LP
|
|
|
1100 |
The remaining files are informational and used for debugging.
|
|
|
1101 |
The
|
|
|
1102 |
.CW proto
|
|
|
1103 |
file contains a list of supported protocols (to see what protocols the
|
|
|
1104 |
system supports,
|
|
|
1105 |
.CW cat
|
|
|
1106 |
.CW /mnt/factotum/proto ),
|
|
|
1107 |
and the
|
|
|
1108 |
.CW log
|
|
|
1109 |
file contains a log of operations and debugging output
|
|
|
1110 |
enabled by a
|
|
|
1111 |
.CW debug
|
|
|
1112 |
control message.
|
|
|
1113 |
.LP
|
|
|
1114 |
The next few sections explain how
|
|
|
1115 |
.CW factotum
|
|
|
1116 |
is used by system services.
|
|
|
1117 |
.NH 1
|
|
|
1118 |
Authentication in 9P
|
|
|
1119 |
.LP
|
|
|
1120 |
Plan 9 uses a remote file access protocol, 9P
|
|
|
1121 |
[Pike93],
|
|
|
1122 |
to connect to resources such as the
|
|
|
1123 |
file server and remote processes.
|
|
|
1124 |
The original design for 9P included special messages at the start of a conversation
|
|
|
1125 |
to authenticate the user.
|
|
|
1126 |
Multiple users can share a single connection, such as when a CPU server
|
|
|
1127 |
runs processes for many users connected to a single file server,
|
|
|
1128 |
but each must authenticate separately.
|
|
|
1129 |
The authentication protocol, similar to that of Kerberos
|
|
|
1130 |
[Stei88],
|
|
|
1131 |
used a sequence of messages passed between client, file server, and authentication
|
|
|
1132 |
server to verify the identities of the user, calling machine, and serving machine.
|
|
|
1133 |
One major drawback to the design was that the authentication method was defined by 9P
|
|
|
1134 |
itself and could not be changed.
|
|
|
1135 |
Moreover, there was no mechanism to relegate
|
|
|
1136 |
authentication to an external (trusted) agent,
|
|
|
1137 |
so a process implementing 9P needed, besides support for file service,
|
|
|
1138 |
a substantial body of cryptographic code to implement a handful of startup messages
|
|
|
1139 |
in the protocol.
|
|
|
1140 |
.LP
|
|
|
1141 |
A recent redesign of 9P
|
|
|
1142 |
addressed a number of file service issues outside the scope of this paper.
|
|
|
1143 |
On issues of authentication, there were two goals:
|
|
|
1144 |
first, to remove details about authentication from the
|
|
|
1145 |
protocol itself; second, to allow an external program to execute the authentication
|
|
|
1146 |
part of the protocol.
|
|
|
1147 |
In particular, we wanted a way to quickly incorporate
|
|
|
1148 |
ideas found in other systems such as SFS
|
|
|
1149 |
[Mazi99].
|
|
|
1150 |
.LP
|
|
|
1151 |
Since 9P is a file service protocol, the solution involved creating a new type of file
|
|
|
1152 |
to be served: an
|
|
|
1153 |
.I authentication
|
|
|
1154 |
.I file .
|
|
|
1155 |
Connections to a 9P service begin in a state that
|
|
|
1156 |
allows no general file access but permits the client
|
|
|
1157 |
to open an authentication file
|
|
|
1158 |
by sending a special message, generated by the new
|
|
|
1159 |
.CW fauth
|
|
|
1160 |
system call:
|
|
|
1161 |
.P1
|
|
|
1162 |
afd = fauth(int fd, char *servicename);
|
|
|
1163 |
.P2
|
|
|
1164 |
Here
|
|
|
1165 |
.CW fd
|
|
|
1166 |
is the user's file descriptor for the established network connection to the 9P server
|
|
|
1167 |
and
|
|
|
1168 |
.CW servicename
|
|
|
1169 |
is the name of the desired service offered on that server, typically the file subsystem
|
|
|
1170 |
to be accessed.
|
|
|
1171 |
The returned file descriptor,
|
|
|
1172 |
.CW afd ,
|
|
|
1173 |
is a unique handle representing the authentication file
|
|
|
1174 |
created for this connection to authenticate to
|
|
|
1175 |
this service; it is analogous to a capability.
|
|
|
1176 |
The authentication file represented by
|
|
|
1177 |
.CW afd
|
|
|
1178 |
is not otherwise addressable on the server, such as through
|
|
|
1179 |
the file name hierarchy.
|
|
|
1180 |
In all other respects, it behaves like a regular file;
|
|
|
1181 |
most important, it accepts standard read and write operations.
|
|
|
1182 |
.LP
|
|
|
1183 |
To prove its identity, the user process (via
|
|
|
1184 |
.CW factotum )
|
|
|
1185 |
executes the authentication protocol,
|
|
|
1186 |
described in the next section of this paper,
|
|
|
1187 |
over the
|
|
|
1188 |
.CW afd
|
|
|
1189 |
file descriptor with ordinary reads and writes.
|
|
|
1190 |
When client and server have successfully negotiated, the authentication file
|
|
|
1191 |
changes state so it can be used as evidence of authority in
|
|
|
1192 |
.CW mount .
|
|
|
1193 |
.LP
|
|
|
1194 |
Once identity is established, the process presents the (now verified)
|
|
|
1195 |
.CW afd
|
|
|
1196 |
as proof of identity to the
|
|
|
1197 |
.CW mount
|
|
|
1198 |
system call:
|
|
|
1199 |
.P1
|
|
|
1200 |
mount(int fd, int afd, char *mountpoint,
|
|
|
1201 |
int flag, char *servicename)
|
|
|
1202 |
.P2
|
|
|
1203 |
If the
|
|
|
1204 |
.CW mount
|
|
|
1205 |
succeeds, the user now
|
|
|
1206 |
has appropriate permissions for the file hierarchy made
|
|
|
1207 |
visible at the mount point.
|
|
|
1208 |
.LP
|
|
|
1209 |
This sequence of events has several advantages.
|
|
|
1210 |
First, the actual authentication protocol is implemented using regular reads and writes,
|
|
|
1211 |
not special 9P messages, so
|
|
|
1212 |
they can be processed, forwarded, proxied, and so on by
|
|
|
1213 |
any 9P agent without special arrangement.
|
|
|
1214 |
Second, the business of negotiating the authentication by reading and writing the
|
|
|
1215 |
authentication file can be delegated to an outside agent, in particular
|
|
|
1216 |
.CW factotum ;
|
|
|
1217 |
the programs that implement the client and server ends of a 9P conversation need
|
|
|
1218 |
no authentication or cryptographic code.
|
|
|
1219 |
Third,
|
|
|
1220 |
since the authentication protocol is not defined by 9P itself, it is easy to change and
|
|
|
1221 |
can even be negotiated dynamically.
|
|
|
1222 |
Finally, since
|
|
|
1223 |
.CW afd
|
|
|
1224 |
acts like a capability, it can be treated like one:
|
|
|
1225 |
handed to another process to give it special permissions;
|
|
|
1226 |
kept around for later use when authentication is again required;
|
|
|
1227 |
or closed to make sure no other process can use it.
|
|
|
1228 |
.LP
|
|
|
1229 |
All these advantages stem from moving the authentication negotiation into
|
|
|
1230 |
reads and writes on a separate file.
|
|
|
1231 |
As is often the case in Plan 9,
|
|
|
1232 |
making a resource (here authentication) accessible with a file-like interface
|
|
|
1233 |
reduces
|
|
|
1234 |
.I a
|
|
|
1235 |
.I priori
|
|
|
1236 |
the need for special interfaces.
|
|
|
1237 |
.LP
|
|
|
1238 |
.SS
|
|
|
1239 |
Plan 9 shared key protocol
|
|
|
1240 |
.LP
|
|
|
1241 |
In addition to the various standard protocols supported by
|
|
|
1242 |
.CW factotum ,
|
|
|
1243 |
we use a shared key protocol for native
|
|
|
1244 |
Plan 9 authentication.
|
|
|
1245 |
This protocol provides backward compatibility with
|
|
|
1246 |
older versions of the system. One reason for the new
|
|
|
1247 |
architecture is to let us replace such protocols
|
|
|
1248 |
in the near future with more cryptographically secure ones.
|
|
|
1249 |
.LP
|
|
|
1250 |
.I P9sk1
|
|
|
1251 |
is a shared key protocol that uses tickets much like those
|
|
|
1252 |
in the original Kerberos.
|
|
|
1253 |
The difference is that we've
|
|
|
1254 |
replaced the expiration time in Kerberos tickets with
|
|
|
1255 |
a random nonce parameter and a counter.
|
|
|
1256 |
We summarize it here:
|
|
|
1257 |
.P1
|
|
|
1258 |
$C -> S: ~~ "nonce" sub C#
|
|
|
1259 |
$S -> C: ~~ "nonce" sub S , "uid" sub S , "domain" sub S#
|
|
|
1260 |
|
|
|
1261 |
$C -> A: ~~ "nonce" sub S , "uid" sub S , "domain" sub S , "uid" sub C ,#
|
|
|
1262 |
$"factotum" sub C#
|
|
|
1263 |
$A -> C: ~~ K sub C roman "{" "nonce" sub S , "uid" sub C , "uid" sub S, K sub n roman "}",#
|
|
|
1264 |
$K sub S roman "{" "nonce" sub S , "uid" sub C , "uid" sub S, K sub n roman "}"#
|
|
|
1265 |
|
|
|
1266 |
$C -> S: ~~ K sub S roman "{" "nonce" sub S , "uid" sub C , "uid" sub S , K sub n roman "}",#
|
|
|
1267 |
$K sub n roman "{" "nonce" sub S , "counter" roman "}"#
|
|
|
1268 |
$S -> C: ~~ K sub n roman "{" "nonce" sub C , "counter" roman "}"#
|
|
|
1269 |
.P2
|
|
|
1270 |
(Here $K roman "{" x roman "}"# indicates $x# encrypted with
|
|
|
1271 |
DES key $K#.)
|
|
|
1272 |
The first two messages exchange nonces and server identification.
|
|
|
1273 |
After this initial exchange, the client contacts the authentication
|
|
|
1274 |
server to obtain a pair of encrypted tickets, one encrypted with
|
|
|
1275 |
the client key and one with the server key.
|
|
|
1276 |
The client relays the server ticket to the server.
|
|
|
1277 |
The server believes that the ticket is new
|
|
|
1278 |
because it contains
|
|
|
1279 |
$"nonce" sub S#
|
|
|
1280 |
and that the ticket is from the authentication
|
|
|
1281 |
server because it is encrypted in the server key $K sub S#.
|
|
|
1282 |
The ticket is basically a statement from the authentication
|
|
|
1283 |
server that now $"uid" sub C# and $"uid" sub S# share a
|
|
|
1284 |
secret $K sub n#.
|
|
|
1285 |
The authenticator $K sub n roman "{" "nonce" sub S , "counter" roman "}"#
|
|
|
1286 |
convinces the server that the client knows $K sub n# and thus
|
|
|
1287 |
must be $"uid" sub C#.
|
|
|
1288 |
Similarly, authenticator $K sub n roman "{" "nonce" sub C , "counter" roman "}"#
|
|
|
1289 |
convinces the client that the server knows $K sub n# and thus
|
|
|
1290 |
must be $"uid" sub S#.
|
|
|
1291 |
Tickets can be reused, without contacting the authentication
|
|
|
1292 |
server again, by incrementing the counter before each
|
|
|
1293 |
authenticator is generated.
|
|
|
1294 |
.LP
|
|
|
1295 |
In the future we hope to introduce a public key version of
|
|
|
1296 |
p9sk1,
|
|
|
1297 |
which would allow authentication even
|
|
|
1298 |
when the authentication server is not available.
|
|
|
1299 |
.SS
|
|
|
1300 |
The authentication server
|
|
|
1301 |
.LP
|
|
|
1302 |
Each Plan 9 security domain has an authentication server (AS)
|
|
|
1303 |
that all users trust to keep the complete set of shared keys.
|
|
|
1304 |
It also offers services for users and administrators to manage the
|
|
|
1305 |
keys, create and disable accounts, and so on.
|
|
|
1306 |
It typically runs on
|
|
|
1307 |
a standalone machine with few other services.
|
|
|
1308 |
The AS comprises two services,
|
|
|
1309 |
.CW keyfs
|
|
|
1310 |
and
|
|
|
1311 |
.CW authsrv .
|
|
|
1312 |
.LP
|
|
|
1313 |
.CW Keyfs
|
|
|
1314 |
is a user-level file system that manages an
|
|
|
1315 |
encrypted database of user accounts.
|
|
|
1316 |
Each account is represented by a directory containing the
|
|
|
1317 |
files
|
|
|
1318 |
.CW key ,
|
|
|
1319 |
containing the Plan 9 key for p9sk1;
|
|
|
1320 |
.CW secret
|
|
|
1321 |
for the challenge/response protocols (APOP, VNC, CHAP, MSCHAP,
|
|
|
1322 |
CRAM);
|
|
|
1323 |
.CW log
|
|
|
1324 |
for authentication outcomes;
|
|
|
1325 |
.CW expire
|
|
|
1326 |
for an expiration time; and
|
|
|
1327 |
.CW status .
|
|
|
1328 |
If the expiration time passes,
|
|
|
1329 |
if the number of successive failed authentications
|
|
|
1330 |
exceeds 50, or if
|
|
|
1331 |
.CW disabled
|
|
|
1332 |
is written to the status file,
|
|
|
1333 |
any attempt to access the
|
|
|
1334 |
.CW key
|
|
|
1335 |
or
|
|
|
1336 |
.CW secret
|
|
|
1337 |
files will fail.
|
|
|
1338 |
.LP
|
|
|
1339 |
.CW Authsrv
|
|
|
1340 |
is a network service that brokers shared key authentications
|
|
|
1341 |
for the protocols p9sk1, APOP, VNC, CHAP, MSCHAP,
|
|
|
1342 |
and CRAM. Remote users can also call
|
|
|
1343 |
.CW authsrv
|
|
|
1344 |
to change their passwords.
|
|
|
1345 |
.LP
|
|
|
1346 |
The
|
|
|
1347 |
p9sk1
|
|
|
1348 |
protocol was described in the previous
|
|
|
1349 |
section.
|
|
|
1350 |
The challenge/response protocols differ
|
|
|
1351 |
in detail but all follow the general structure:
|
|
|
1352 |
.P1
|
|
|
1353 |
$C -> S: ~~ "nonce" sub C#
|
|
|
1354 |
$S -> C: ~~ "nonce" sub S , "uid" sub S ,"domain" sub S#
|
|
|
1355 |
$C -> A: ~~ "nonce" sub S , "uid" sub S , "domain" sub S ,#
|
|
|
1356 |
$"hostid" sub C , "uid" sub C#
|
|
|
1357 |
$A -> C: ~~ K sub C roman "{" "nonce" sub S , "uid" sub C , "uid" sub S, K sub n roman "}",#
|
|
|
1358 |
$K sub S roman "{" "nonce" sub S , "uid" sub C , "uid" sub S, K sub n roman "}"#
|
|
|
1359 |
$C -> S: ~~ K sub S roman "{" "nonce" sub S , "uid" sub C , "uid" sub S, K sub n roman "}",#
|
|
|
1360 |
$K sub n roman "{" "nonce" sub S roman "}"#
|
|
|
1361 |
$S -> C: ~~ K sub n roman "{" "nonce" sub C roman "}"#
|
|
|
1362 |
.P2
|
|
|
1363 |
The password protocol is:
|
|
|
1364 |
.P1
|
|
|
1365 |
$C -> A: ~~ "uid" sub C#
|
|
|
1366 |
$A -> C: ~~ K sub c roman "{" K sub n roman "}"#
|
|
|
1367 |
$C -> A: ~~ K sub n roman "{" "password" sub "old" , "password" sub "new" roman "}"#
|
|
|
1368 |
$A -> C: ~~ OK#
|
|
|
1369 |
.P2
|
|
|
1370 |
To avoid replay attacks, the pre-encryption
|
|
|
1371 |
clear text for each of the protocols (as well as for p9sk1) includes
|
|
|
1372 |
a tag indicating the encryption's role in the
|
|
|
1373 |
protocol. We elided them in these outlines.
|
|
|
1374 |
.SS
|
|
|
1375 |
Protocol negotiation
|
|
|
1376 |
.LP
|
|
|
1377 |
Rather than require particular protocols for particular services,
|
|
|
1378 |
we implemented a negotiation metaprotocol,
|
|
|
1379 |
.I p9any ,
|
|
|
1380 |
which chooses the actual authentication protocol to use.
|
|
|
1381 |
P9any
|
|
|
1382 |
is used now by all native services on Plan 9.
|
|
|
1383 |
.LP
|
|
|
1384 |
The metaprotocol is simple. The callee sends a
|
|
|
1385 |
null-terminated string of the form:
|
|
|
1386 |
.P1
|
|
|
1387 |
v.$n# $proto sub 1#@$domain sub 1# $proto sub 2#@$domain sub 2# ...
|
|
|
1388 |
.P2
|
|
|
1389 |
where
|
|
|
1390 |
.I n
|
|
|
1391 |
is a decimal version number, $proto sub k#
|
|
|
1392 |
is the name of a protocol for which the
|
|
|
1393 |
.CW factotum
|
|
|
1394 |
has a key, and $domain sub k#
|
|
|
1395 |
is the name of the domain in which the key is
|
|
|
1396 |
valid.
|
|
|
1397 |
The caller then responds
|
|
|
1398 |
.P1
|
|
|
1399 |
\f2proto\fP@\f2domain\fP
|
|
|
1400 |
.P2
|
|
|
1401 |
indicating its choice.
|
|
|
1402 |
Finally the callee responds
|
|
|
1403 |
.P1
|
|
|
1404 |
OK
|
|
|
1405 |
.P2
|
|
|
1406 |
Any other string indicates failure.
|
|
|
1407 |
At this point the chosen protocol commences.
|
|
|
1408 |
The final fixed-length reply is used to make it easy to
|
|
|
1409 |
delimit the I/O stream should the chosen protocol
|
|
|
1410 |
require the caller rather than the callee to send the first message.
|
|
|
1411 |
.LP
|
|
|
1412 |
With this negotiation metaprotocol, the underlying
|
|
|
1413 |
authentication protocols used for Plan 9 services
|
|
|
1414 |
can be changed under any application just
|
|
|
1415 |
by changing the keys known by the
|
|
|
1416 |
.CW factotum
|
|
|
1417 |
agents at each end.
|
|
|
1418 |
.LP
|
|
|
1419 |
P9any is vulnerable to man in the middle attacks
|
|
|
1420 |
to the extent that the attacker may constrain the
|
|
|
1421 |
possible choices by changing the stream. However,
|
|
|
1422 |
we believe this is acceptable since the attacker
|
|
|
1423 |
cannot force either side to choose algorithms
|
|
|
1424 |
that it is unwilling to use.
|
|
|
1425 |
.NH 1
|
|
|
1426 |
Library Interface to Factotum
|
|
|
1427 |
.LP
|
|
|
1428 |
Although programs can access
|
|
|
1429 |
.CW factotum 's
|
|
|
1430 |
services through its file system interface,
|
|
|
1431 |
it is more common to use a C library that
|
|
|
1432 |
packages the interaction.
|
|
|
1433 |
There are a number of routines in the library,
|
|
|
1434 |
not all of which are relevant here, but a few
|
|
|
1435 |
examples should give their flavor.
|
|
|
1436 |
.LP
|
|
|
1437 |
First, consider the problem of mounting a remote file server using 9P.
|
|
|
1438 |
An earlier discussion showed how the
|
|
|
1439 |
.CW fauth
|
|
|
1440 |
and
|
|
|
1441 |
.CW mount
|
|
|
1442 |
system calls use an authentication file,
|
|
|
1443 |
.CW afd ,
|
|
|
1444 |
as a capability,
|
|
|
1445 |
but not how
|
|
|
1446 |
.CW factotum
|
|
|
1447 |
manages
|
|
|
1448 |
.CW afd .
|
|
|
1449 |
The library contains a routine,
|
|
|
1450 |
.CW amount
|
|
|
1451 |
(authenticated mount), that is used by most programs in preference to
|
|
|
1452 |
the raw
|
|
|
1453 |
.CW fauth
|
|
|
1454 |
and
|
|
|
1455 |
.CW mount
|
|
|
1456 |
calls.
|
|
|
1457 |
.CW Amount
|
|
|
1458 |
engages
|
|
|
1459 |
.CW factotum
|
|
|
1460 |
to validate
|
|
|
1461 |
.CW afd ;
|
|
|
1462 |
here is the complete code:
|
|
|
1463 |
.P1
|
|
|
1464 |
.ta 3n +3n +3n +3n
|
|
|
1465 |
int
|
|
|
1466 |
amount(int fd, char *mntpt,
|
|
|
1467 |
int flags, char *aname)
|
|
|
1468 |
{
|
|
|
1469 |
int afd, ret;
|
|
|
1470 |
AuthInfo *ai;
|
|
|
1471 |
|
|
|
1472 |
afd = fauth(fd, aname);
|
|
|
1473 |
if(afd >= 0){
|
|
|
1474 |
ai = auth_proxy(afd, amount_getkey,
|
|
|
1475 |
"proto=p9any role=client");
|
|
|
1476 |
if(ai != NULL)
|
|
|
1477 |
auth_freeAI(ai);
|
|
|
1478 |
}
|
|
|
1479 |
ret = mount(fd, afd, mntpt,
|
|
|
1480 |
flags, aname);
|
|
|
1481 |
if(afd >= 0)
|
|
|
1482 |
close(afd);
|
|
|
1483 |
return ret;
|
|
|
1484 |
}
|
|
|
1485 |
.P2
|
|
|
1486 |
where parameter
|
|
|
1487 |
.CW fd
|
|
|
1488 |
is a file descriptor returned by
|
|
|
1489 |
.CW open
|
|
|
1490 |
or
|
|
|
1491 |
.CW dial
|
|
|
1492 |
for a new connection to a file server.
|
|
|
1493 |
The conversation with
|
|
|
1494 |
.CW factotum
|
|
|
1495 |
occurs in the call to
|
|
|
1496 |
.CW auth_proxy ,
|
|
|
1497 |
which specifies, as a key query,
|
|
|
1498 |
which authentication protocol to use
|
|
|
1499 |
(here the metaprotocol
|
|
|
1500 |
.CW p9any )
|
|
|
1501 |
and the role being played
|
|
|
1502 |
.CW client ). (
|
|
|
1503 |
.CW Auth_proxy
|
|
|
1504 |
will read and write the
|
|
|
1505 |
.CW factotum
|
|
|
1506 |
files, and the authentication file descriptor
|
|
|
1507 |
.CW afd ,
|
|
|
1508 |
to validate the user's right to access the service.
|
|
|
1509 |
If the call is successful, any auxiliary data, held in an
|
|
|
1510 |
.CW AuthInfo
|
|
|
1511 |
structure, is freed.
|
|
|
1512 |
In any case, the
|
|
|
1513 |
.CW mount
|
|
|
1514 |
is then called with the (perhaps validated)
|
|
|
1515 |
.CW afd.
|
|
|
1516 |
A 9P server can cause the
|
|
|
1517 |
.CW fauth
|
|
|
1518 |
system call to fail, as an indication that authentication is
|
|
|
1519 |
not required to access the service.
|
|
|
1520 |
.LP
|
|
|
1521 |
The second argument to
|
|
|
1522 |
.CW auth_proxy
|
|
|
1523 |
is a function, here
|
|
|
1524 |
.CW amount_getkey ,
|
|
|
1525 |
to be called if secret information such as a password or
|
|
|
1526 |
response to a challenge is required as part of the authentication.
|
|
|
1527 |
This function, of course, will provide this data to
|
|
|
1528 |
.CW factotum
|
|
|
1529 |
as a
|
|
|
1530 |
.CW key
|
|
|
1531 |
message on the
|
|
|
1532 |
.CW /mnt/factotum/ctl
|
|
|
1533 |
file.
|
|
|
1534 |
.LP
|
|
|
1535 |
Although the final argument to
|
|
|
1536 |
.CW auth_proxy
|
|
|
1537 |
in this example is a simple string, in general
|
|
|
1538 |
it can be a formatted-print specifier in the manner of
|
|
|
1539 |
.CW printf ,
|
|
|
1540 |
to enable the construction of more elaborate key queries.
|
|
|
1541 |
.LP
|
|
|
1542 |
As another example, consider the Plan 9
|
|
|
1543 |
.CW cpu
|
|
|
1544 |
service, which exports local devices to a shell process on
|
|
|
1545 |
a remote machine, typically
|
|
|
1546 |
to connect the local screen and keyboard to a more powerful computer.
|
|
|
1547 |
At heart,
|
|
|
1548 |
.CW cpu
|
|
|
1549 |
is a superset of a service called
|
|
|
1550 |
.CW exportfs
|
|
|
1551 |
[Pike93],
|
|
|
1552 |
which allows one machine to see an arbitrary portion of the file name space
|
|
|
1553 |
of another machine, such as to
|
|
|
1554 |
export the network device to another machine
|
|
|
1555 |
for gatewaying.
|
|
|
1556 |
However,
|
|
|
1557 |
.CW cpu
|
|
|
1558 |
is not just
|
|
|
1559 |
.CW exportfs
|
|
|
1560 |
because it also delivers signals such as interrupt
|
|
|
1561 |
and negotiates the initial environment
|
|
|
1562 |
for the remote shell.
|
|
|
1563 |
.LP
|
|
|
1564 |
To authenticate an instance of
|
|
|
1565 |
.CW cpu
|
|
|
1566 |
requires
|
|
|
1567 |
.CW factotum
|
|
|
1568 |
processes on both ends: the local, client
|
|
|
1569 |
end running as the user on a terminal
|
|
|
1570 |
and the remote, server
|
|
|
1571 |
end running as the host owner of the server machine.
|
|
|
1572 |
Here is schematic code for the two ends:
|
|
|
1573 |
.P1
|
|
|
1574 |
.ta 3n +3n +3n +3n
|
|
|
1575 |
/* client */
|
|
|
1576 |
int
|
|
|
1577 |
p9auth(int fd)
|
|
|
1578 |
{
|
|
|
1579 |
AuthInfo *ai;
|
|
|
1580 |
|
|
|
1581 |
ai = auth_proxy(fd, auth_getkey,
|
|
|
1582 |
"proto=p9any role=client");
|
|
|
1583 |
if(ai == NULL)
|
|
|
1584 |
return -1;
|
|
|
1585 |
|
|
|
1586 |
/* start cpu protocol here */
|
|
|
1587 |
}
|
|
|
1588 |
|
|
|
1589 |
/* server */
|
|
|
1590 |
int
|
|
|
1591 |
srvp9auth(int fd, char *user)
|
|
|
1592 |
{
|
|
|
1593 |
AuthInfo *ai;
|
|
|
1594 |
|
|
|
1595 |
ai = auth_proxy(fd, NULL,
|
|
|
1596 |
"proto=p9any role=server");
|
|
|
1597 |
if(ai == NULL)
|
|
|
1598 |
return -1;
|
|
|
1599 |
/* set user id for server process */
|
|
|
1600 |
if(auth_chuid(ai, NULL) < 0)
|
|
|
1601 |
return -1;
|
|
|
1602 |
|
|
|
1603 |
/* start cpu protocol here */
|
|
|
1604 |
}
|
|
|
1605 |
.P2
|
|
|
1606 |
.CW Auth_chuid
|
|
|
1607 |
encapsulates the negotiation to change a user id using the
|
|
|
1608 |
.CW caphash
|
|
|
1609 |
and
|
|
|
1610 |
.CW capuse
|
|
|
1611 |
files of the (server) kernel.
|
|
|
1612 |
Note that although the client process may ask the user for new keys, using
|
|
|
1613 |
.CW auth_getkey ,
|
|
|
1614 |
the server machine, presumably a shared machine with a pseudo-user for
|
|
|
1615 |
the host owner, sets the key-getting function to
|
|
|
1616 |
.CW NULL .
|
|
|
1617 |
.NH 1
|
|
|
1618 |
Secure Store
|
|
|
1619 |
.LP
|
|
|
1620 |
.CW Factotum
|
|
|
1621 |
keeps its keys in volatile memory, which must somehow be
|
|
|
1622 |
initialized at boot time.
|
|
|
1623 |
Therefore,
|
|
|
1624 |
.CW factotum
|
|
|
1625 |
must be
|
|
|
1626 |
supplemented by a persistent store, perhaps
|
|
|
1627 |
a floppy disk containing a key file of commands to be copied into
|
|
|
1628 |
.CW /mnt/factotum/ctl
|
|
|
1629 |
during bootstrap.
|
|
|
1630 |
But removable media are a nuisance to carry and
|
|
|
1631 |
are vulnerable to theft.
|
|
|
1632 |
Keys could be stored encrypted on a shared file system, but
|
|
|
1633 |
only if those keys are not necessary for authenticating to
|
|
|
1634 |
the file system in the first place.
|
|
|
1635 |
Even if the keys are encrypted under a user
|
|
|
1636 |
password, a thief might well succeed with a dictionary attack.
|
|
|
1637 |
Other risks of local storage are loss of the contents
|
|
|
1638 |
through mechanical mishap or dead batteries.
|
|
|
1639 |
Thus for convenience and
|
|
|
1640 |
safety we provide a
|
|
|
1641 |
.CW secstore
|
|
|
1642 |
(secure store) server in the network to hold each user's permanent list of keys, a
|
|
|
1643 |
.I key
|
|
|
1644 |
.I file .
|
|
|
1645 |
.LP
|
|
|
1646 |
.CW Secstore
|
|
|
1647 |
is a file server for encrypted data,
|
|
|
1648 |
used only during bootstrapping.
|
|
|
1649 |
It must provide strong
|
|
|
1650 |
authentication and resistance to passive and active protocol attacks
|
|
|
1651 |
while assuming nothing more from the client than a password.
|
|
|
1652 |
Once
|
|
|
1653 |
.CW factotum
|
|
|
1654 |
has loaded the key file, further encrypted or authenticated
|
|
|
1655 |
file storage can be accomplished by standard mechanisms.
|
|
|
1656 |
.EQ
|
|
|
1657 |
define mod % ~ roman "mod" ~ %
|
|
|
1658 |
define sha1 % "sha1" %
|
|
|
1659 |
.EN
|
|
|
1660 |
.LP
|
|
|
1661 |
The cryptographic technology that enables
|
|
|
1662 |
.CW secstore
|
|
|
1663 |
is a form of encrypted
|
|
|
1664 |
key exchange
|
|
|
1665 |
called PAK
|
|
|
1666 |
[Boyk00],
|
|
|
1667 |
analogous to
|
|
|
1668 |
EKE
|
|
|
1669 |
[Bell93],
|
|
|
1670 |
SRP
|
|
|
1671 |
[Wu98],
|
|
|
1672 |
or
|
|
|
1673 |
SPEKE
|
|
|
1674 |
[Jabl].
|
|
|
1675 |
PAK was chosen
|
|
|
1676 |
because it comes with a proof of equivalence in strength to
|
|
|
1677 |
Diffie-Hellman; subtle flaws in some earlier encrypted key exchange
|
|
|
1678 |
protocols and implementations have encouraged us to take special care.
|
|
|
1679 |
In outline, the PAK protocol is:
|
|
|
1680 |
.P1
|
|
|
1681 |
$C -> S:~ C, g sup x H#
|
|
|
1682 |
$S -> C:~ S, g sup y , hash(g sup xy , C, S)#
|
|
|
1683 |
$C -> S:~ hash(g sup xy , S, C)#
|
|
|
1684 |
.P2
|
|
|
1685 |
where $H# is a preshared secret between client $C# and server $S#.
|
|
|
1686 |
There are several variants of PAK, all presented in papers
|
|
|
1687 |
mainly concerned with proofs of cryptographic properties.
|
|
|
1688 |
To aid implementers, we have distilled a description of the specific
|
|
|
1689 |
version we use into an Appendix to this paper.
|
|
|
1690 |
The Plan 9 open source license provides for use of Lucent's
|
|
|
1691 |
encrypted key exchange patents in this context.
|
|
|
1692 |
.LP
|
|
|
1693 |
As a further layer of defense against password theft,
|
|
|
1694 |
we provide (within the encrypted channel $C -> S#)
|
|
|
1695 |
information that is validated at a RADIUS server,
|
|
|
1696 |
such as the digits from a hardware token
|
|
|
1697 |
[RFC2138].
|
|
|
1698 |
This provides two-factor authentication, which potentially
|
|
|
1699 |
requires tricking two independent administrators in any attack by
|
|
|
1700 |
social engineering.
|
|
|
1701 |
.LP
|
|
|
1702 |
The key file stored on the server is encrypted with AES (Rijndael) using CBC
|
|
|
1703 |
with a 10-byte initialization vector and trailing authentication padding.
|
|
|
1704 |
All this is invisible to the user of
|
|
|
1705 |
.CW secstore .
|
|
|
1706 |
For that matter, it is invisible to the
|
|
|
1707 |
.CW secstore
|
|
|
1708 |
server as well;
|
|
|
1709 |
if the AES Modes of Operation are standardized and a new encryption format
|
|
|
1710 |
designed, it can be implemented by a client without change to the server.
|
|
|
1711 |
The
|
|
|
1712 |
.CW secstore
|
|
|
1713 |
is deliberately not backed up; the user is expected to
|
|
|
1714 |
use more than one
|
|
|
1715 |
.CW secstore
|
|
|
1716 |
or save the key file on removable media
|
|
|
1717 |
and lock it away.
|
|
|
1718 |
The user's password is hashed to create the $H# used
|
|
|
1719 |
in the PAK protocol; a different hash of the password is used as
|
|
|
1720 |
the file encryption key.
|
|
|
1721 |
Finally, there is a command (inside the authenticated,
|
|
|
1722 |
encrypted channel between client and
|
|
|
1723 |
.CW secstore )
|
|
|
1724 |
to change passwords by sending
|
|
|
1725 |
a new $H#;
|
|
|
1726 |
for consistency, the client process must at the same time fetch and re-encrypt all files.
|
|
|
1727 |
.LP
|
|
|
1728 |
When
|
|
|
1729 |
.CW factotum
|
|
|
1730 |
starts, it dials the local
|
|
|
1731 |
.CW secstore
|
|
|
1732 |
and checks whether the user has an account.
|
|
|
1733 |
If so,
|
|
|
1734 |
it prompts for the user's
|
|
|
1735 |
.CW secstore
|
|
|
1736 |
password and fetches the key file.
|
|
|
1737 |
The PAK protocol
|
|
|
1738 |
ensures mutual authentication and prevents dictionary attacks on the password
|
|
|
1739 |
by passive wiretappers or active intermediaries.
|
|
|
1740 |
Passwords saved in
|
|
|
1741 |
the key file can be long random strings suitable for
|
|
|
1742 |
simpler challenge/response authentication protocols.
|
|
|
1743 |
Thus the user need only remember
|
|
|
1744 |
a single, weaker password to enable strong, ``single sign on'' authentication to
|
|
|
1745 |
unchanged legacy applications scattered across multiple authentication domains.
|
|
|
1746 |
.NH 1
|
|
|
1747 |
Transport Layer Security
|
|
|
1748 |
.LP
|
|
|
1749 |
Since the Plan 9 operating system is designed for use in network elements
|
|
|
1750 |
that must withstand direct attack, unguarded by firewall or VPN, we seek
|
|
|
1751 |
to ensure that all applications use channels with appropriate mutual
|
|
|
1752 |
authentication and encryption.
|
|
|
1753 |
A principal tool for this is TLS 1.0
|
|
|
1754 |
[RFC2246].
|
|
|
1755 |
(TLS 1.0 is nearly the same as SSL 3.0,
|
|
|
1756 |
and our software is designed to interoperate
|
|
|
1757 |
with implementations of either standard.)
|
|
|
1758 |
.LP
|
|
|
1759 |
TLS defines a record layer protocol for message integrity and privacy
|
|
|
1760 |
through the use of message digesting and encryption with shared secrets.
|
|
|
1761 |
We implement this service as a kernel device, though it could
|
|
|
1762 |
be performed at slightly higher cost by invoking a separate program.
|
|
|
1763 |
The library interface to the TLS kernel device is:
|
|
|
1764 |
.P1
|
|
|
1765 |
int pushtls(int fd, char *hashalg,
|
|
|
1766 |
char *cryptalg, int isclient,
|
|
|
1767 |
char *secret, char *dir);
|
|
|
1768 |
.P2
|
|
|
1769 |
Given a file descriptor, the names of message digest and
|
|
|
1770 |
encryption algorithms, and the shared secret,
|
|
|
1771 |
.CW pushtls
|
|
|
1772 |
returns a new file descriptor for the encrypted connection.
|
|
|
1773 |
(The final argument
|
|
|
1774 |
.CW dir
|
|
|
1775 |
receives the name of the directory in the TLS device that
|
|
|
1776 |
is associated with the new connection.)
|
|
|
1777 |
The function is named by analogy with the ``push'' operation
|
|
|
1778 |
supported by the stream I/O system of Research Unix and the
|
|
|
1779 |
first two editions of Plan 9.
|
|
|
1780 |
Because adding encryption is as simple as replacing one
|
|
|
1781 |
file descriptor with another, adding encryption to a particular
|
|
|
1782 |
network service is usually trivial.
|
|
|
1783 |
.LP
|
|
|
1784 |
The Plan 9 shared key authentication protocols establish a shared 56-bit secret
|
|
|
1785 |
as a side effect.
|
|
|
1786 |
Native Plan 9 network services such as
|
|
|
1787 |
.CW cpu
|
|
|
1788 |
and
|
|
|
1789 |
.CW exportfs
|
|
|
1790 |
use these protocols for authentication and then invoke
|
|
|
1791 |
.CW pushtls
|
|
|
1792 |
with the shared secret.
|
|
|
1793 |
.LP
|
|
|
1794 |
Above the record layer, TLS specifies a handshake protocol using public keys
|
|
|
1795 |
to establish the session secret.
|
|
|
1796 |
This protocol is widely used with HTTP and IMAP4
|
|
|
1797 |
to provide server authentication, though with client certificates it could provide
|
|
|
1798 |
mutual authentication. The library function
|
|
|
1799 |
.P1
|
|
|
1800 |
int tlsClient(int fd, TLSconn *conn)
|
|
|
1801 |
.P2
|
|
|
1802 |
handles the initial handshake and returns the result of
|
|
|
1803 |
.CW pushtls .
|
|
|
1804 |
On return, it fills the
|
|
|
1805 |
.CW conn
|
|
|
1806 |
structure with the session ID used
|
|
|
1807 |
and the X.509 certificate presented by the
|
|
|
1808 |
server, but makes no effort to verify the certificate.
|
|
|
1809 |
Although the original design intent of X.509 certificates expected
|
|
|
1810 |
that they would be used with a Public Key Infrastructure,
|
|
|
1811 |
reliable deployment has been so long delayed and problematic
|
|
|
1812 |
that we have adopted the simpler policy of just using the
|
|
|
1813 |
X.509 certificate as a representation of the public key,
|
|
|
1814 |
depending on a locally-administered directory of SHA1 thumbprints
|
|
|
1815 |
to allow applications to decide which public keys to trust
|
|
|
1816 |
for which purposes.
|
|
|
1817 |
.NH 1
|
|
|
1818 |
Related Work and Discussion
|
|
|
1819 |
.LP
|
|
|
1820 |
Kerberos, one of the earliest distributed authentication
|
|
|
1821 |
systems, keeps a set of authentication tickets in a temporary file called
|
|
|
1822 |
a ticket cache. The ticket cache is protected by Unix file permissions.
|
|
|
1823 |
An environment variable containing the file name of the ticket cache
|
|
|
1824 |
allows for different ticket caches in different simultaneous login sessions.
|
|
|
1825 |
A user logs in by typing his or her Kerberos password.
|
|
|
1826 |
The login program uses the Kerberos password to obtain a temporary
|
|
|
1827 |
ticket-granting ticket from the authentication server, initializes the
|
|
|
1828 |
ticket cache with the ticket-granting ticket, and then forgets the password.
|
|
|
1829 |
Other applications can use the ticket-granting ticket to sign tickets
|
|
|
1830 |
for themselves on behalf of the user during the login session.
|
|
|
1831 |
The ticket cache is removed when the user logs out
|
|
|
1832 |
[Stei88].
|
|
|
1833 |
The ticket cache relieves the user from typing a password
|
|
|
1834 |
every time authentication is needed.
|
|
|
1835 |
.LP
|
|
|
1836 |
The secure shell SSH develops this idea further, replacing the
|
|
|
1837 |
temporary file with a named Unix domain socket connected to
|
|
|
1838 |
a user-level program, called an agent.
|
|
|
1839 |
Once the SSH agent is started and initialized with one or
|
|
|
1840 |
more RSA private keys, SSH clients can employ it
|
|
|
1841 |
to perform RSA authentications on their behalf.
|
|
|
1842 |
In the absence of an agent, SSH typically uses RSA keys
|
|
|
1843 |
read from encrypted disk files or uses passphrase-based
|
|
|
1844 |
authentication, both of which would require prompting the user
|
|
|
1845 |
for a passphrase whenever authentication is needed
|
|
|
1846 |
[Ylon96].
|
|
|
1847 |
The self-certifying file system SFS uses a similar agent
|
|
|
1848 |
[Kami00],
|
|
|
1849 |
not only for moderating the use of client authentication keys
|
|
|
1850 |
but also for verifying server public keys
|
|
|
1851 |
[Mazi99].
|
|
|
1852 |
.LP
|
|
|
1853 |
.CW Factotum
|
|
|
1854 |
is a logical continuation of this evolution,
|
|
|
1855 |
replacing the program-specific SSH or SFS agents with
|
|
|
1856 |
a general agent capable of serving a wide variety of programs.
|
|
|
1857 |
Having one agent for all programs removes the need
|
|
|
1858 |
to have one agent for each program.
|
|
|
1859 |
It also allows the programs themselves to be protocol-agnostic,
|
|
|
1860 |
so that, for example, one could build an SSH workalike
|
|
|
1861 |
capable of using any protocol supported by
|
|
|
1862 |
.CW factotum ,
|
|
|
1863 |
without that program knowing anything about the protocols.
|
|
|
1864 |
Traditionally each program needs to implement each
|
|
|
1865 |
authentication protocol for itself, an $O(n sup 2 )# coding
|
|
|
1866 |
problem that
|
|
|
1867 |
.CW factotum
|
|
|
1868 |
reduces to $O(n)#.
|
|
|
1869 |
.LP
|
|
|
1870 |
Previous work on agents has concentrated on their use by clients
|
|
|
1871 |
authenticating to servers.
|
|
|
1872 |
Looking in the other direction, Sun Microsystem's
|
|
|
1873 |
pluggable authentication module (PAM) is one
|
|
|
1874 |
of the earliest attempts to
|
|
|
1875 |
provide a general authentication mechanism for Unix-like
|
|
|
1876 |
operating systems
|
|
|
1877 |
[Sama96].
|
|
|
1878 |
Without a central authority like PAM, system policy is tied
|
|
|
1879 |
up in the various implementations of network services.
|
|
|
1880 |
For example, on a typical Unix, if a system administrator
|
|
|
1881 |
decides not to allow plaintext passwords for authentication,
|
|
|
1882 |
the configuration files for a half dozen different servers \(em
|
|
|
1883 |
.CW rlogind ,
|
|
|
1884 |
.CW telnetd ,
|
|
|
1885 |
.CW ftpd ,
|
|
|
1886 |
.CW sshd ,
|
|
|
1887 |
and so on \(em
|
|
|
1888 |
need to be edited.
|
|
|
1889 |
PAM solves this problem by hiding the details of a given
|
|
|
1890 |
authentication mechanism behind a common library interface.
|
|
|
1891 |
Directed by a system-wide configuration file,
|
|
|
1892 |
an application selects a particular authentication mechanism
|
|
|
1893 |
by dynamically loading the appropriate shared library.
|
|
|
1894 |
PAM is widely used on Sun's Solaris and some Linux distributions.
|
|
|
1895 |
.LP
|
|
|
1896 |
.CW Factotum
|
|
|
1897 |
achieves the same goals
|
|
|
1898 |
using the agent approach.
|
|
|
1899 |
.CW Factotum
|
|
|
1900 |
is the only process that needs to create
|
|
|
1901 |
capabilities, so all the network servers can run as
|
|
|
1902 |
untrusted users (e.g.,
|
|
|
1903 |
Plan 9's
|
|
|
1904 |
.CW none
|
|
|
1905 |
or Unix's
|
|
|
1906 |
.CW nobody ),
|
|
|
1907 |
which greatly reduces the harm done if a server is buggy
|
|
|
1908 |
and is compromised.
|
|
|
1909 |
In fact, if
|
|
|
1910 |
.CW factotum
|
|
|
1911 |
were implemented on Unix along with
|
|
|
1912 |
an analogue to the Plan 9 capability device, venerable
|
|
|
1913 |
programs like
|
|
|
1914 |
.CW su
|
|
|
1915 |
and
|
|
|
1916 |
.CW login
|
|
|
1917 |
would no longer need to be installed ``setuid root.''
|
|
|
1918 |
.LP
|
|
|
1919 |
Several other systems, such as Password Safe [Schn],
|
|
|
1920 |
store multiple passwords in an encrypted file,
|
|
|
1921 |
so that the user only needs to remember one password.
|
|
|
1922 |
Our
|
|
|
1923 |
.CW secstore
|
|
|
1924 |
solution differs from these by placing the storage in
|
|
|
1925 |
a hardened location in the network, so that the encrypted file is
|
|
|
1926 |
less liable to be stolen for offline dictionary attack and so that
|
|
|
1927 |
it is available even when a user has several computers.
|
|
|
1928 |
In contrast, Microsoft's Passport system
|
|
|
1929 |
[Micr]
|
|
|
1930 |
keeps credentials in
|
|
|
1931 |
the network, but centralized at one extremely-high-value target.
|
|
|
1932 |
The important feature of Passport, setting up trust relationships
|
|
|
1933 |
with e-merchants, is outside our scope.
|
|
|
1934 |
The
|
|
|
1935 |
.CW secstore
|
|
|
1936 |
architecture is almost identical to
|
|
|
1937 |
Perlman and Kaufman's
|
|
|
1938 |
[Perl99]
|
|
|
1939 |
but with newer EKE technology.
|
|
|
1940 |
Like them, we chose to defend mainly against outside attacks
|
|
|
1941 |
on
|
|
|
1942 |
.CW secstore ;
|
|
|
1943 |
if additional defense of the files on the server
|
|
|
1944 |
itself is desired, one can use distributed techniques
|
|
|
1945 |
[Ford00].
|
|
|
1946 |
.LP
|
|
|
1947 |
We made a conscious choice of placing encryption, message integrity,
|
|
|
1948 |
and key management at the application layer
|
|
|
1949 |
(TLS, just above layer 4) rather than at layer 3, as in IPsec.
|
|
|
1950 |
This leads to a simpler structure for the network stack, easier
|
|
|
1951 |
integration with applications and, most important, easier network
|
|
|
1952 |
administration since we can recognize which applications are misbehaving
|
|
|
1953 |
based on TCP port numbers. TLS does suffer (relative to IPsec) from
|
|
|
1954 |
the possibility of forged TCP Reset, but we feel that this is adequately
|
|
|
1955 |
dealt with by randomized TCP sequence numbers.
|
|
|
1956 |
In contrast with other TLS libraries, Plan 9 does not
|
|
|
1957 |
require the application to change
|
|
|
1958 |
.CW write
|
|
|
1959 |
calls to
|
|
|
1960 |
.CW sslwrite
|
|
|
1961 |
but simply to add a few lines of code at startup
|
|
|
1962 |
[Resc01].
|
|
|
1963 |
.NH 1
|
|
|
1964 |
Conclusion
|
|
|
1965 |
.LP
|
|
|
1966 |
Writing safe code is difficult.
|
|
|
1967 |
Stack attacks,
|
|
|
1968 |
mistakes in logic, and bugs in compilers and operating systems
|
|
|
1969 |
can each make it possible for an attacker
|
|
|
1970 |
to subvert the intended execution sequence of a
|
|
|
1971 |
service.
|
|
|
1972 |
If the server process has the privileges
|
|
|
1973 |
of a powerful user, such as
|
|
|
1974 |
.CW root
|
|
|
1975 |
on Unix, then so does the attacker.
|
|
|
1976 |
.CW Factotum
|
|
|
1977 |
allows us
|
|
|
1978 |
to constrain the privileged execution to a single
|
|
|
1979 |
process whose core is a few thousand lines of code.
|
|
|
1980 |
Verifying such a process, both through manual and automatic means,
|
|
|
1981 |
is much easier and less error prone
|
|
|
1982 |
than requiring it of all servers.
|
|
|
1983 |
.LP
|
|
|
1984 |
An implementation of these ideas is in Plan 9 from Bell Labs, Fourth Edition,
|
|
|
1985 |
freely available from \f(CWhttp://\%plan9.bell-labs.com/\%plan9\fP.
|
|
|
1986 |
.SH
|
|
|
1987 |
Acknowledgments
|
|
|
1988 |
.LP
|
|
|
1989 |
William Josephson contributed to the implementation of password changing in
|
|
|
1990 |
.CW secstore .
|
|
|
1991 |
We thank Phil MacKenzie and Martín Abadi for helpful comments on early parts
|
|
|
1992 |
of the design.
|
|
|
1993 |
Chuck Blake,
|
|
|
1994 |
Peter Bosch,
|
|
|
1995 |
Frans Kaashoek,
|
|
|
1996 |
Sape Mullender,
|
|
|
1997 |
and
|
|
|
1998 |
Lakshman Y. N.,
|
|
|
1999 |
predominantly Dutchmen, gave helpful comments on the paper.
|
|
|
2000 |
Russ Cox is supported by a fellowship from the Fannie and John Hertz Foundation.
|
|
|
2001 |
.SH
|
|
|
2002 |
References
|
|
|
2003 |
.LP
|
|
|
2004 |
[Bell93]
|
|
|
2005 |
S.M. Bellovin and M. Merritt,
|
|
|
2006 |
``Augmented Encrypted Key Exchange,''
|
|
|
2007 |
Proceedings of the 1st ACM Conference on Computer and Communications Security, 1993, pp. 244 - 250.
|
|
|
2008 |
.LP
|
|
|
2009 |
[Boyk00]
|
|
|
2010 |
Victor Boyko, Philip MacKenzie, and Sarvar Patel,
|
|
|
2011 |
``Provably Secure Password-Authenticated Key Exchange using Diffie-Hellman,''
|
|
|
2012 |
Eurocrypt 2000, 156\-171.
|
|
|
2013 |
... http://www.bell-labs.com/who/philmac/research/pak-final.ps.gz
|
|
|
2014 |
.LP
|
|
|
2015 |
[RFC2246]
|
|
|
2016 |
T . Dierks and C. Allen,
|
|
|
2017 |
``The TLS Protocol, Version 1.0,''
|
|
|
2018 |
RFC 2246.
|
|
|
2019 |
.LP
|
|
|
2020 |
[Ford00]
|
|
|
2021 |
Warwick Ford and Burton S. Kaliski, Jr.,
|
|
|
2022 |
``Server-Assisted Generation of a Strong Secret from a Password,''
|
|
|
2023 |
IEEE Fifth International Workshop on Enterprise Security,
|
|
|
2024 |
National Institute of Standards and Technology (NIST),
|
|
|
2025 |
Gaithersburg MD, June 14 - 16, 2000.
|
|
|
2026 |
.LP
|
|
|
2027 |
[Jabl]
|
|
|
2028 |
David P. Jablon,
|
|
|
2029 |
``Strong Password-Only Authenticated Key Exchange,''
|
|
|
2030 |
\f(CWhttp://\%integritysciences.com/\%speke97.html\fP.
|
|
|
2031 |
.LP
|
|
|
2032 |
[Kami00]
|
|
|
2033 |
Michael Kaminsky.
|
|
|
2034 |
``Flexible Key Management with SFS Agents,''
|
|
|
2035 |
Master's Thesis, MIT, May 2000.
|
|
|
2036 |
.LP
|
|
|
2037 |
[Mack]
|
|
|
2038 |
Philip MacKenzie,
|
|
|
2039 |
private communication.
|
|
|
2040 |
.LP
|
|
|
2041 |
[Mazi99]
|
|
|
2042 |
David Mazières, Michael Kaminsky, M. Frans Kaashoek and Emmett Witchel,
|
|
|
2043 |
``Separating key management from file system security,''
|
|
|
2044 |
Symposium on Operating Systems Principles, 1999, pp. 124-139.
|
|
|
2045 |
.LP
|
|
|
2046 |
[Micr]
|
|
|
2047 |
Microsoft Passport,
|
|
|
2048 |
\f(CWhttp://\%www.passport.com/\fP.
|
|
|
2049 |
.LP
|
|
|
2050 |
[Perl99]
|
|
|
2051 |
Radia Perlman and Charlie Kaufman,
|
|
|
2052 |
``Secure Password-Based Protocol for Downloading a Private Key,''
|
|
|
2053 |
Proc. 1999 Network and Distributed System Security Symposium,
|
|
|
2054 |
Internet Society, January 1999.
|
|
|
2055 |
.LP
|
|
|
2056 |
[Pike95]
|
|
|
2057 |
Rob Pike, Dave Presotto, Sean Dorward, Bob Flandrena, Ken Thompson, Howard Trickey, and Phil Winterbottom,
|
|
|
2058 |
``Plan 9 from Bell Labs,''
|
|
|
2059 |
Computing Systems, \f3\&8\fP, 3, Summer 1995, pp. 221-254.
|
|
|
2060 |
.LP
|
|
|
2061 |
[Pike93]
|
|
|
2062 |
Rob Pike, Dave Presotto, Ken Thompson, Howard Trickey, Phil Winterbottom,
|
|
|
2063 |
``The Use of Name Spaces in Plan 9,''
|
|
|
2064 |
Operating Systems Review, \f3\&27\fP, 2, April 1993, pp. 72-76
|
|
|
2065 |
(reprinted from Proceedings of the 5th ACM SIGOPS European Workshop,
|
|
|
2066 |
Mont Saint-Michel, 1992, Paper nº 34).
|
|
|
2067 |
.LP
|
|
|
2068 |
[Resc01]
|
|
|
2069 |
Eric Rescorla,
|
|
|
2070 |
``SSL and TLS: Designing and Building Secure Systems,''
|
|
|
2071 |
Addison-Wesley, 2001. ISBN 0-201-61598-3, p. 387.
|
|
|
2072 |
.LP
|
|
|
2073 |
[RFC2138]
|
|
|
2074 |
C. Rigney, A. Rubens, W. Simpson, S. Willens,
|
|
|
2075 |
``Remote Authentication Dial In User Service (RADIUS),''
|
|
|
2076 |
RFC2138, April 1997.
|
|
|
2077 |
.LP
|
|
|
2078 |
[RiLa]
|
|
|
2079 |
Ronald L. Rivest and Butler Lampson,
|
|
|
2080 |
``SDSI\(emA Simple Distributed Security Infrastructure,''
|
|
|
2081 |
\f(CWhttp://\%theory.lcs.mit.edu/\%~rivest/\%sdsi10.ps\fP.
|
|
|
2082 |
.LP
|
|
|
2083 |
[Schn]
|
|
|
2084 |
Bruce Schneier, Password Safe,
|
|
|
2085 |
\f(CWhttp://\%www.counterpane.com/\%passsafe.html\fP.
|
|
|
2086 |
.LP
|
|
|
2087 |
[Sama96]
|
|
|
2088 |
Vipin Samar,
|
|
|
2089 |
``Unified Login with Pluggable Authentication Modules (PAM),''
|
|
|
2090 |
Proceedings of the Third ACM Conference on Computer Communications and Security,
|
|
|
2091 |
March 1996, New Delhi, India.
|
|
|
2092 |
... http://www1.acm.org/pubs/articles/proceedings/commsec/238168/p1-samar/p1-samar.pdf
|
|
|
2093 |
.LP
|
|
|
2094 |
[Stei88]
|
|
|
2095 |
Jennifer G. Steiner, Clifford Neumann, and Jeffrey I. Schiller,
|
|
|
2096 |
``\fIKerberos\fR: An Authentication Service for Open Network Systems,''
|
|
|
2097 |
Proceedings of USENIX Winter Conference, Dallas, Texas, February 1988, pp. 191\-202.
|
|
|
2098 |
... ftp://athena-dist.mit.edu/pub/kerberos/doc/usenix.PS
|
|
|
2099 |
.LP
|
|
|
2100 |
[Wu98]
|
|
|
2101 |
T. Wu,
|
|
|
2102 |
``The Secure Remote Password Protocol,''
|
|
|
2103 |
Proceedings of
|
|
|
2104 |
the 1998 Internet Society Network and Distributed System Security
|
|
|
2105 |
Symposium, San Diego, CA, March 1998, pp. 97-111.
|
|
|
2106 |
.LP
|
|
|
2107 |
[Ylon96]
|
|
|
2108 |
Ylonen, T.,
|
|
|
2109 |
``SSH\(emSecure Login Connections Over the Internet,''
|
|
|
2110 |
6th USENIX Security Symposium, pp. 37-42. San Jose, CA, July 1996.
|
|
|
2111 |
.SH
|
|
|
2112 |
Appendix: Summary of the PAK protocol
|
|
|
2113 |
.LP
|
|
|
2114 |
Let $q>2 sup 160# and $p>2 sup 1024# be primes
|
|
|
2115 |
such that $p=rq+1# with $r# not a multiple of $q#.
|
|
|
2116 |
Take $h ∈ Z sub p sup *# such that $g == h sup r# is not 1.
|
|
|
2117 |
These parameters may be chosen by the NIST algorithm for DSA,
|
|
|
2118 |
and are public, fixed values.
|
|
|
2119 |
The client $C# knows a secret $pi#
|
|
|
2120 |
and computes $H == (H sub 1 (C, ~ pi )) sup r# and $H sup -1#,
|
|
|
2121 |
where $H sub 1# is a hash function yielding a random element of $Z sub p sup *#,
|
|
|
2122 |
and $H sup -1# may be computed by gcd.
|
|
|
2123 |
(All arithmetic is modulo $p#.)
|
|
|
2124 |
The client gives $H sup -1# to the server $S# ahead of time by a private channel.
|
|
|
2125 |
To start a new connection, the client generates a random value $x#,
|
|
|
2126 |
computes $m == g sup x H#,
|
|
|
2127 |
then calls the server and sends $C# and $m#.
|
|
|
2128 |
The server checks $m != 0 mod p#,
|
|
|
2129 |
generates random $y#,
|
|
|
2130 |
computes $ mu == g sup y#,
|
|
|
2131 |
$ sigma == (m H sup -1 ) sup y#,
|
|
|
2132 |
and sends $S#, $mu#, $k == sha1 ( roman "\"server\"", C, S, m, mu , sigma , H sup -1 )#.
|
|
|
2133 |
Next the client computes $sigma = mu sup x#,
|
|
|
2134 |
verifies $k#,
|
|
|
2135 |
and sends $k' == sha1 ( roman "\"client\"", C, S, m, mu , sigma , H sup -1 )#.
|
|
|
2136 |
The server then verifies $k'# and both sides begin
|
|
|
2137 |
using session key $K == sha1 ( roman "\"session\"", C, S, m, mu , sigma , H sup -1 )#.
|
|
|
2138 |
In the published version of PAK, the server name $S#
|
|
|
2139 |
is included in the initial
|
|
|
2140 |
hash $H#, but doing so is inconvenient in our application,
|
|
|
2141 |
as the server may be known by various equivalent names.
|
|
|
2142 |
.LP
|
|
|
2143 |
MacKenzie has shown
|
|
|
2144 |
[Mack]
|
|
|
2145 |
that the
|
|
|
2146 |
equivalence proof [Boyk00]
|
|
|
2147 |
can be adapted to cover our version.
|