]> git.lizzy.rs Git - plan9front.git/blob - sys/man/6/authsrv
c572376989dcfddd2052d89e5575a64ace48387a
[plan9front.git] / sys / man / 6 / authsrv
1 .TH AUTHSRV 6
2 .SH NAME
3 authsrv, p9any, p9sk1, dp9ik \- authentication protocols
4 .SH DESCRIPTION
5 This manual page describes
6 the protocols used to authorize connections, confirm the identities
7 of users and machines, and maintain the associated databases.
8 The machine that provides these services is called the
9 .I authentication server
10 (AS).
11 The AS may be a stand-alone machine or a general-use machine such as a CPU server.
12 The network database
13 .IR ndb (6)
14 holds for each public machine, such as a CPU server or
15 file server, the name of the authentication server that machine uses.
16 .PP
17 Each machine contains four values important to authentication; a 56-bit DES
18 key, a 128-bit AES key, a 28-byte authentication ID, and a 48-byte authentication
19 domain name.
20 The ID is a user name and identifies who is currently responsible for the
21 kernel running on that machine.
22 The domain name identifies the machines across which the ID is valid.
23 Together, the ID and domain name identify the owner of a key.
24 .PP
25 When a terminal boots,
26 .IR factotum (4)
27 prompts for user name and password.
28 The user name becomes the terminal's authentication ID. 
29 The password is converted using
30 .I passtokey
31 (see
32 .IR authsrv (2))
33 into a 56-bit DES and 128-bit AES keys and saved in memory.
34 The authentication domain is set to the null string.
35 If possible,
36 .I factotum
37 validates the key with the AS
38 before saving it.
39 For Internet machines the correct AS to ask is found using
40 .IR dhcpd (8).
41 .PP
42 When a CPU or file server boots, 
43 .I factotum
44 reads the key, ID, and domain name from
45 non-volatile RAM.
46 This allows servers to reboot without operator intervention.
47 .PP
48 The details of any authentication are mixed with the semantics
49 of the particular service they are authenticating so we describe
50 them one case at a time. The following definitions will be used
51 in the descriptions:
52 .TF nullx
53 .TP
54 .I Ks
55 server's host ID's key
56 .TP
57 .I Kc
58 client's host ID's key
59 .TP
60 .I Kn
61 a nonce key created for a ticket
62 .RB ( key )
63 .TP
64 .I K{m}
65 message
66 .I m
67 encrypted with key
68 .I K
69 .TP
70 .I CHc
71 an 8-byte random challenge from a client
72 .RB ( chal )
73 .TP
74 .I CHs
75 an 8-byte random challenge from a server
76 .RB ( chal )
77 .TP
78 .I IDs
79 server's ID
80 .RB ( authid )
81 .TP
82 .I DN
83 server's authentication domain name
84 .RB ( authdom )
85 .TP
86 .I IDc
87 client's ID
88 .RB ( hostid ,
89 .BR cuid )
90 .TP
91 .I IDr
92 client's desired ID on server
93 .RB ( uid ,
94 .BR suid )
95 .TP
96 .I YAc
97 client → AS DH public key
98 .TP
99 .I YBc
100 AS → client DH public key
101 .TP
102 .I YAs
103 server → AS DH public key
104 .TP
105 .I YBs
106 AS → server DH public key
107 .TP
108 .I RNc
109 client's 32-byte random string
110 .TP
111 .I RNs
112 server's 32-byte random string
113 .PD
114 .PP
115 The parenthesized names are the ones used in the
116 .B Ticketreq
117 and
118 .B Ticket
119 structures in
120 .BR <authsrv.h> .
121 .PP
122 The message type constants
123 .IR AuthTreq ,
124 .IR AuthChal ,
125 .IR AuthPass ,
126 .IR AuthOK ,
127 .IR AuthErr ,
128 .IR AuthMod ,
129 .IR AuthApop ,
130 .IR AuthOKvar ,
131 .IR AuthChap ,
132 .IR AuthMSchap ,
133 .IR AuthCram ,
134 .IR AuthVNC ,
135 and
136 .IR AuthPAK
137 .RB ( type )
138 are defined in
139 .BR <authsrv.h> ,
140 as are the encrypted message types
141 .IR AuthTs ,
142 .IR AuthAs ,
143 .IR AuthAc ,
144 .IR AuthTp ,
145 and
146 .IR AuthHr
147 .RB ( num ).
148 .SS "Ticket Service
149 When a client and server wish to authenticate to each other,
150 they do so using
151 .I tickets
152 issued by the AS.
153 Obtaining tickets from the AS
154 is the client's responsibility.
155 .PP
156 The protocol to obtain a ticket pair is:
157 .TP
158 .I C→A:
159 .IR AuthTreq ,
160 .IR IDs ,
161 .IR DN ,
162 .IR CHs ,
163 .IR IDc ,
164 .IR IDr
165 .TP
166 .I A→C:
167 .IR AuthOK ,
168 .IR Kc { AuthTc ,
169 .IR CHs ,
170 .IR IDc ,
171 .IR IDr ,
172 .IR Kn },
173 .IR Ks { AuthTs ,
174 .IR CHs ,
175 .IR IDc ,
176 .IR IDr ,
177 .IR Kn }
178 .PP
179 The two tickets are identical except for their type fields
180 and the keys with which they are encrypted.
181 The client and server can each decrypt one of the tickets,
182 establishing a shared secret
183 .IR Kn .
184 .PP
185 The
186 tickets can be viewed as a statement by the
187 AS that
188 ``a client possessing the
189 .I Kn
190 key is allowed to authenticate as
191 .IR IDr .''
192 .PP
193 The presence of the server challenge
194 .I CHs
195 in the ticket allows the server to verify the freshness
196 of the ticket pair.
197 .PP
198 The AS sets the
199 .I IDr
200 in the tickets to the requested
201 .I IDr
202 only if
203 .I IDc
204 is allowed to
205 .I "speak for
206 .RI ( q.v. )
207 .IR IDr .
208 If not,
209 the AS sets
210 .I IDr
211 to the empty string.
212 .PP
213 If the users
214 .I IDc
215 or
216 .I IDs
217 do not exist,
218 the AS silently generates one-time
219 random keys to use in place of
220 .I Kc
221 or
222 .IR Ks ,
223 so that clients cannot probe the AS
224 to learn whether a user name is valid.
225 .SS "P9sk1
226 The Plan 9 shared key protocol
227 .I p9sk1
228 allows a client and server to authenticate each other.
229 The protocol is:
230 .TP
231 .I C→S:
232 .I CHc
233 .br
234 The client starts by sending a random challenge to the server.
235 .TP
236 .I S→C:
237 .IR AuthTreq ,
238 .IR IDs ,
239 .IR DN ,
240 .IR CHs ,
241 .IR \- ,
242 .IR \-
243 .br
244 The server replies with a ticket request giving its
245 id and authentication domain along with its own 
246 random challenge.
247 .TP
248 .I C→S:
249 .IR Ks { AuthTs ,
250 .IR CHs ,
251 .IR IDc ,
252 .IR IDr ,
253 .IR Kn },
254 .IR Kn { AuthAc ,
255 .IR CHs }
256 .br
257 The client adds 
258 .I IDc
259 and
260 .I IDr
261 to the ticket request and obtains a ticket pair
262 from the AS as described above.
263 The client relays the server's ticket along with
264 an 
265 .IR authenticator ,
266 the
267 .I AuthAc
268 message.
269 The authenticator proves to the server that the
270 client knows
271 .I Kn
272 and is therefore allowed to authenticate as
273 .IR IDr .
274 (The inclusion of
275 .IR CHs
276 in the authenticator avoids replay attacks.)
277 .TP
278 .I S→C:
279 .IR Kn { AuthAs ,
280 .IR CHc }
281 .br
282 The server replies with its own authenticator,
283 proving to the client that it also knows
284 .I Kn
285 and therefore 
286 .I Ks .
287 .PP
288 The 64-bit shared secret
289 .I Kn
290 is used as the session secret.
291 .SS "Password authenticated key exchange"
292 Initially, the server and client keys
293 .I Ks
294 and
295 .I Kc
296 were equivalent to the password derived 56-bit DES keys, which
297 made the encrypted tickets subject to offline dictionary attacks
298 and provided too small a key space against brute force attacks
299 on current hardware.
300 .PP
301 The
302 .I AuthPAK
303 protocol is used to establish new 256-bit random keys with the
304 AS for
305 .I Ks
306 and
307 .I Kc
308 before each ticket request on the connection.
309 .PP
310 The protocol is based on SPAKE2EE, where a hash of the user's secret
311 is used to encypt the public keys of a Elliptic-Curve Diffie-Hellman
312 key exchange. The user's
313 .I ID
314 and 128-bit AES key is hashed and mapped (using Elligator2)
315 into two curve points
316 .I PM
317 and
318 .IR PN ,
319 called the
320 .IR pakhash .
321 Both sides generate a random number
322 .IR xa / xb
323 and make the public keys
324 .IR YA / YB
325 as:
326 .IR YA = xa*G+PM ,
327 .IR YB = xb*G+PN .
328 After the public keys have been exchanged, each side calculates the
329 shared secret as:
330 .IR Z = xa*(YB-PN) = xb*(YA-PM) .
331 The shared secret
332 .I Z
333 is then hashed with the transmitted public keys
334 .IR YA | YB
335 producing the 256-bit
336 .IR pakkey .
337 .PP
338 The
339 .I pakkey
340 is then used in place of
341 .I Ks
342 and
343 .I Kc
344 to authenticate and encrypt tickets from the AS using
345 Chacha20/Poly1305 AEAD for the next following
346 request made on the connection.
347 .PP
348 The protocol (for
349 .IR AuthTreq )
350 to establish keys
351 .I Ks
352 and
353 .I Kc
354 with the AS for
355 .I IDs
356 and
357 .I IDc
358 is:
359 .TP
360 .I C→A:
361 .IR AuthPAK ,
362 .IR IDs ,
363 .IR DN ,
364 .IR CHs ,
365 .IR IDc ,
366 .IR IDr ,
367 .IR YAs ,
368 .I YAc
369 .TP
370 .I A→C:
371 .IR AuthOK ,
372 .IR YBs ,
373 .I YBc
374 .PP
375 The protocol (for
376 .IR AuthApop ,
377 .IR AuthChap ...)
378 to establish a single server key
379 .I Ks
380 for
381 .IR IDs :
382 .TP
383 .I C→A:
384 .IR AuthPAK ,
385 .IR \- ,
386 .IR DN ,
387 .IR CHs ,
388 .IR IDs ,
389 .IR IDc ,
390 .I YAs
391 .TP
392 .I A→C:
393 .IR AuthOK ,
394 .I YBs
395 .PP
396 The protocol (for
397 .IR AuthPass )
398 to establish a single client key
399 .I Kc
400 for
401 .IR IDc :
402 .TP
403 .I C→A:
404 .IR AuthPAK ,
405 .IR \- ,
406 .IR \- ,
407 .IR CHc ,
408 .IR \- ,
409 .IR IDc ,
410 .I YAc
411 .TP
412 .I A→C:
413 .IR AuthOK ,
414 .I YBc
415 .SS "Dp9ik"
416 The
417 .I dp9ik
418 protocol is an extended version of
419 .I p9sk1
420 that adds the random strings
421 .I RNc
422 and
423 .I RNs
424 in the
425 .I authenticator
426 messages for the session key derivation and uses the
427 password authenticated key exchange as described above
428 to derive the ticket encryption keys
429 .I Ks
430 and
431 .IR Kc :
432 .TP
433 .I C→S:
434 .I CHc
435 .br
436 The client starts by sending a random challenge to the server.
437 .TP
438 .I S→C:
439 .IR AuthPAK ,
440 .IR IDs ,
441 .IR DN ,
442 .IR CHs ,
443 .IR \- ,
444 .IR \- ,
445 .IR YAs
446 .br
447 The server generates a new public key
448 .I YAs
449 and replies with a
450 .I AuthPAK
451 request giving its
452 .I IDs
453 and authentication domain
454 .I DNs
455 along with its own random challenge
456 .I CHs
457 and its public key
458 .IR YAs .
459 .TP
460 .I C→S:
461 .IR YBs ,
462 .IR Ks { AuthTs ,
463 .IR CHs ,
464 .IR IDc ,
465 .IR IDr ,
466 .IR Kn },
467 .IR Kn { AuthAc ,
468 .IR CHs ,
469 .IR RNc }
470 .br
471 The client generates its own public key
472 .I YAc
473 and adds it along with 
474 .I IDc
475 and
476 .I IDr
477 to the
478 .I AuthPAK
479 request and obtains the public keys
480 .I YBs
481 and
482 .I YBc
483 from the AS response. At this point, client and AS
484 have completed their authenticated key exchange and
485 derive
486 .I Kc
487 as described above.
488 Then the client requests a ticket pair using the same
489 message but with
490 .I AuthPAK
491 type changed to
492 .IR AuthTreq .
493 It decrypts his ticket with
494 .I Kc
495 extracting the shared secret
496 .IR Kn .
497 The client relays the server's
498 .I YBs
499 and ticket along with an
500 .IR authenticator ,
501 the
502 .I AuthAc
503 message.
504 The server finishes his authenticated key exchange
505 using
506 .I YBs
507 and derives
508 .I Ks
509 to decrypt his ticket to extract the shared secret
510 .IR Kn .
511 When the decryption of the clients authenticator using
512 .I Kn
513 is successfull then this proves to the server that the
514 client knows
515 .I Kn
516 and is therefore allowed to authenticate as
517 .IR IDr .
518 The random string
519 .I RNc
520 is used in the derivation of the session secret.
521 .TP
522 .I S→C:
523 .IR Kn { AuthAs ,
524 .IR CHc ,
525 .IR RNs }
526 .br
527 The server replies with its own authenticator,
528 proving to the client that it also knows
529 .I Kn
530 and contributes its random string
531 .IR RNs
532 for the session secret.
533 .PP
534 The 2048-bit session secret is derived with HKDF-SHA256 hashing the
535 concatenated random strings
536 .IR RNc | RNs
537 with the the shared secret key
538 .IR Kn .
539 .SS "P9any
540 .I P9any
541 is the standard Plan 9 authentication protocol.
542 It consists of a negotiation to determine a common
543 protocol, followed by the agreed-upon protocol.
544 .PP
545 The negotiation protocol is:
546 .TP
547 .I S→C:
548 .IB proto@authdom
549 .IB proto@authdom
550 .I ...
551 .TP
552 .I C→S:
553 .I proto
554 .I dom
555 .PP
556 Each message is a NUL-terminated UTF string.
557 The server begins by sending a list of
558 .IR proto ,
559 .I authdom
560 pairs it is willing to use.
561 The client
562 responds with its choice.
563 .PP
564 A second version of this protocol exists (indicated
565 by the
566 .B v.2
567 prefix before the list) where the server sends
568 an explicit confirmation with a OK message before
569 the agreed-upon protocol starts.
570 .TP
571 .I S→C:
572 .B v.2
573 .IB proto@authdom
574 .IB proto@authdom
575 .I ...
576 .TP
577 .I C→S:
578 .I proto
579 .I dom
580 .TP
581 .I S→C:
582 .B OK
583 .PP
584 The
585 .I p9any
586 protocol is the protocol used by all
587 Plan 9 services.
588 The file server runs it over special
589 authentication files
590 (see
591 .IR fauth (2)
592 and
593 .IR attach (5)).
594 Other services, such as
595 .IR cpu (1),
596 .IR exportfs (4)
597 and
598 .IR tlssrv (8)
599 run
600 .I p9any
601 over the network and then use the session secret to derive an
602 .IR ssl (3)
603 or
604 .IR tls (3)
605 key to encrypt the rest of their communications.
606 .SS "Password Change
607 Users connect directly to the AS
608 to change their passwords.
609 The protocol is:
610 .TP
611 .I C→A:
612 .IR AuthPass ,
613 .IR \- ,
614 .IR \- ,
615 .IR CHc ,
616 .IR \- ,
617 .IR IDc
618 .br
619 The client sends a password change ticket request.
620 .TP
621 .I A→C:
622 .IR Kc { AuthTp ,
623 .IR CHc ,
624 .IR IDc ,
625 .IR IDc ,
626 .IR Kn }
627 .br
628 The server responds with a ticket containing the key
629 .I Kn
630 encrypted with the client's key
631 .IR Kc
632 .TP
633 .I C→A:
634 .IR Kn { AuthPass ,
635 .IR old ,
636 .IR new ,
637 .IR changesecret ,
638 .IR secret }
639 .br
640 The client decrypts the ticket using the old password
641 and then sends back an encrypted password request
642 .RB ( Passwordreq
643 structure)
644 containing the old password and the new password.
645 If
646 .I changesecret
647 is set, the AS also changes
648 the user's 
649 .IR secret ,
650 the password used for non-Plan 9 authentications.
651 .TP
652 .I A→C:
653 .I AuthOK
654 or
655 .IR AuthErr ,
656 64-byte error message
657 .br
658 The AS responds with simply
659 .I AuthOK
660 or with
661 .I AuthErr
662 followed by a 64-byte error message.
663 .SS "Authentication Database
664 An
665 .IR ndb (2)
666 database file 
667 .B /lib/ndb/auth
668 exists for the AS.
669 This database maintains ``speaks for'' relationships, i.e.,
670 it lists which users may speak for other users when
671 authenticating.
672 The attribute types used by the AS are
673 .B hostid
674 and
675 .BR uid .
676 The value in the
677 .B hostid
678 is a client host's ID.
679 The values in the
680 .B uid
681 pairs in the same entry list which users that host ID
682 may speak for.
683 A uid value of
684 .B *
685 means the host ID may speak for all users.
686 A uid value of
687 .BI ! user
688 means the host ID may not speak for
689 .IR user .
690 For example:
691 .PP
692 .EX
693 hostid=bootes
694         uid=!sys uid=!adm uid=*
695 .EE
696 .PP
697 is interpreted as
698 .B bootes
699 may speak for any user except
700 .B sys
701 and
702 .BR adm .
703 This property is used heavily on CPU servers.
704 .SS "Foreign Protocols
705 The AS accepts ticket request
706 messages of types other than
707 .I AuthTreq
708 to allow users to
709 authenticate using non-Plan 9 protocols.
710 In these situations, the server communicates
711 directly with the AS.
712 Some protocols must begin without knowing the
713 client's name.  They ignore the client name in the
714 ticket request.
715 All the protocols end
716 with the AS sending
717 an
718 .I AuthOK
719 message containing a server ticket and authenticator.
720 .PP
721 .I AuthOK
722 messages
723 always have a fixed but context-dependent size.
724 The occasional variable-length OK message starts with a
725 .I AuthOKvar
726 byte and a five-byte space-padded decimal length of the
727 data that follows.
728 .PP
729 Anywhere an
730 .I AuthOK
731 message is expected, a
732 .I AuthErr
733 message may be substituted.
734 .de Ok
735 .TP
736 .I A→S:
737 .IR AuthOK ,
738 .IR Ks { AuthTs ,
739 .IR CHs ,
740 .IR IDc ,
741 .IR IDc ,
742 .IR Kn },
743 .IR Kn { AuthAc ,
744 .IR CHs }
745 ..
746 .PP
747 .TP
748 .I S→A:
749 .IR AuthChal ,
750 .IR \- ,
751 .IR DN ,
752 .IR CHs ,
753 .IR IDs ,
754 .IR IDc
755 .TP
756 .I A→S:
757 .IR AuthOK ,
758 .IR challenge
759 .TP
760 .I S→A:
761 .IR response
762 .Ok
763 .IP
764 This protocol allows the use of 
765 handheld authenticators such as SecureNet
766 keys and SecureID tokens
767 in programs such as
768 .I telnetd
769 and
770 .I ftpd
771 (see
772 .IR ipserv (8)).
773 .IP
774 .I Challenge
775 and
776 .I response 
777 are text strings,
778 .SM NUL -padded
779 to 16 bytes
780 .RB ( NETCHLEN ).
781 The
782 .I challenge
783 is a random five-digit decimal number.
784 When using a SecureNet key or
785 .I netkey
786 (see
787 .IR passwd (1)),
788 the 
789 .I response
790 is an eight-digit decimal or hexadecimal number
791 that is an encryption of the challenge
792 using the user's DES key.
793 .IP
794 When using a SecureID token,
795 the challenge is ignored.
796 The response is the user's PIN followed by
797 the six-digit number currently displayed
798 on the token.
799 In this case, the AS
800 queries an external RADIUS server
801 to check the response.
802 Use of a RADIUS server requires an entry in
803 the authentication database.  For example:
804 .IP
805 .EX
806     radius=server-name secret=xyzzy
807         uid=howard rid=trickey
808         uid=sape   rid=smullender
809 .EE
810 .IP
811 In this example, the secret
812 .B xyzzy
813 is the hash key used in talking to the RADIUS server.
814 The
815 .BR uid / rid
816 lines map from Plan 9 user ids to RADIUS ids.
817 Users not listed are assumed to have the
818 same id in both places.
819 .TP
820 .I S→A:
821 .IR AuthApop ,
822 .IR \- ,
823 .IR DN ,
824 .IR CHs ,
825 .IR IDs ,
826 .IR \-
827 .TP
828 .I A→S:
829 .IR AuthOKvar ,
830 .IR challenge
831 .TP
832 .I S→A:
833 .IR AuthApop ,
834 .IR \- ,
835 .IR DN ,
836 .IR CHs ,
837 .IR IDs ,
838 .IR IDc ;
839 hexadecimal MD5 checksum
840 .Ok
841 .IP
842 This protocol implements APOP authentication
843 (see
844 .IR pop3 (8)).
845 After receiving a ticket request of type
846 .IR AuthApop ,
847 the AS generates a random challenge
848 of the form
849 .BI < random @ domain >\fR.
850 The client then replies with a new ticket request
851 giving the user name
852 followed by the MD5 checksum of
853 the challenge concatenated with the user's secret.
854 If the response is correct, the authentication
855 server sends back a ticket
856 and authenticator.
857 If the response is incorrect, the client may repeat the
858 ticket request/MD5 checksum message to try again.
859 .IP
860 The 
861 .I AuthCram
862 protocol runs identically to the
863 .I AuthApop
864 protocol, except that the expected MD5 checksum
865 is the keyed MD5 hash using the user's secret as the key
866 (see
867 .I hmac_md5
868 in
869 .IR sechash (2)).
870 .TP
871 .I S→A:
872 .IR AuthChap ,
873 .IR \- ,
874 .IR DN ,
875 .IR CHs ,
876 .IR IDs ,
877 .IR \-
878 .TP
879 .I A→S:
880 .I challenge
881 .TP
882 .I S→A:
883 .IR pktid ,
884 .IR IDc ,
885 .IR response
886 .Ok
887 .IP
888 This protocol implements CHAP authentication
889 (see
890 .IR ppp (8)).
891 The
892 .I challenge
893 is eight random bytes.
894 The response is a 16-byte MD5 checksum
895 over the packet id, user's secret, and challenge.
896 The reply packet is defined as 
897 .B OChapreply
898 in
899 .BR <authsrv.h> .
900 .TP
901 .I S→A:
902 .IR AuthMSchap ,
903 .IR \- ,
904 .IR DN ,
905 .IR CHs ,
906 .IR IDs ,
907 .IR \-
908 .TP
909 .I A→S:
910 .I challenge
911 .TP
912 .I S→A:
913 .IR IDc ,
914 .IR lm-response ,
915 .IR nt-response
916 .Ok
917 .IP
918 This protocol implements Microsoft's MS-CHAP
919 authentication
920 (see
921 .IR ppp (8)).
922 The
923 .I challenge
924 is eight random bytes.
925 The two responses are Microsoft's LM and NT hashes.
926 Only the NT hash may be used to authenticate,
927 as the LM hash is considered too weak.
928 The reply packet is defined as
929 .B OMSchapreply
930 in
931 .BR <authsrv.h> .
932 .TP
933 .I S→A:
934 .IR AuthVNC ,
935 .IR \- ,
936 .IR DN ,
937 .IR CHs ,
938 .IR IDs ,
939 .IR IDc
940 .TP
941 .I A→S:
942 .IR AuthOKvar ,
943 .I challenge
944 .TP
945 .I S→A:
946 .I response
947 .Ok
948 .IP
949 This protocol implements VNC authentication
950 (see
951 .I vncs
952 in
953 .IR vnc (1)).
954 The challenge is 16 random bytes, and the response
955 is a DES ECB encryption of the challenge.
956 The method by which VNC converts the user's
957 secret into a DES key is weak, 
958 considering only the first eight bytes of the secret.
959 .PD
960 .SH FILES
961 .TF /lib/ndb/auth.*xxx
962 .TP
963 .B /lib/ndb/auth
964 database file
965 .TP
966 .B /lib/ndb/auth.*
967 hash files for
968 .B /lib/ndb/auth
969 .SH SEE ALSO
970 .IR auth (2),
971 .IR fauth (2),
972 .IR cons (3),
973 .IR attach (5),
974 .IR auth (8)