Debianization.
[become] / manual / become.texi
CommitLineData
7a53967a 1\input texinfo @c -*-texinfo-*-
2@c
b0f66028 3@c $Id: become.texi,v 1.7 2003/11/29 23:39:16 mdw Exp $
7a53967a 4@c
5@c Documentation for `become'
6@c
69805471 7@c (c) 1998 EBI
7a53967a 8@c
9
10@c ----- Revision history ---------------------------------------------------
11@c
12@c $Log: become.texi,v $
b0f66028 13@c Revision 1.7 2003/11/29 23:39:16 mdw
14@c Debianization.
15@c
8fc4c5cd 16@c Revision 1.6 2003/10/26 11:57:46 mdw
17@c Fix key reloading core dumps. Change advice on keys.
18@c
f60a3434 19@c Revision 1.5 2003/10/12 00:14:49 mdw
20@c Major overhaul. Now uses DSA signatures rather than the bogus symmetric
21@c encrypt-and-hope thing. Integrated with mLib and Catacomb.
22@c
10bc033f 23@c Revision 1.4 1998/04/23 13:16:14 mdw
24@c Include `texinice' to produce decent printed output. Add documentation
25@c for new `bcquery' program. Various fixes, including spelling mistakes,
26@c and some factual inaccuracies.
27@c
f5050002 28@c Revision 1.3 1998/01/20 14:37:43 mdw
29@c Fix typo. Short form of `--preserve' should be `-e', not `-p'.
30@c
69805471 31@c Revision 1.2 1998/01/12 16:41:31 mdw
32@c Tidying for new release versions. Fix copyright date.
33@c
7a53967a 34@c Revision 1.1 1997/09/18 11:16:34 mdw
35@c Brand new Texinfo manual, with wider scope than the original LaTeX one.
36@c
37
38@c ----- Standard boilerplate -----------------------------------------------
39
40@c %**start of header
10bc033f 41@setfilename become.info
7a53967a 42@settitle Become
43@setchapternewpage odd
44@footnotestyle end
45@paragraphindent 0
46@iftex
10bc033f 47@input texinice.tex
7a53967a 48@afourpaper
49@c @parindent=0pt
50@end iftex
51@c %**end of header
52
b0f66028 53@dircategory Administration tools
54@direntry
55* Become: (become). Shared account administration tool
56@end direntry
57
7a53967a 58@c ----- Useful macros ------------------------------------------------------
59
b0f66028 60@set version 1.4
7a53967a 61
62@c ----- Copyright matters --------------------------------------------------
63
64@c --- The `Info' version ---
65
66@ifinfo
67
68This file documents Become version @value{version}.
69
69805471 70Copyright (c) 1998 European Bioinformatics Institute.
7a53967a 71
72Permission is granted to make and distribute verbatim copies of this
73manual provided the copyright notice and this permission notice are
74preserved on all copies.
75
76@ignore
77Permission is granted to process this file through TeX and print the
78results, provided the printed document carries a copying permission
79notice identical to this one except for the removal of this paragraph
80(this paragraph not being relevant to the printed manual).
81
82@end ignore
83Permission is granted to copy and distribute modified versions of this
84manual under the conditions for verbatim copying, provided also that the
85sections entitled `Copying' and `GNU General Public License' are
86included exactly as in the original, and provided that the entire
87resulting derived work is distributed under the terms of a permission
88notice identical to this one.
89
90Permission is granted to copy and distribute translations of this manual
91into another language, under the above conditions for modified versions,
92except that this permission notice may be stated in a translation
93approved by the European Bioinformatics Institute.
94
95@end ifinfo
96
97@c --- Printed title page ---
98
99@titlepage
100
101@title The Become program
102@subtitle Become version @value{version}
10bc033f 103@author Mark Wooding @email{mdw@@ebi.ac.uk}
7a53967a 104@page
105
106@vskip 0pt plus 1filll
107
10bc033f 108Copyright @copyright{} 1998 European Bioinformatics Institute.
7a53967a 109
110Permission is granted to make and distribute verbatim copies of this
111manual provided the copyright notice and this permission notice are
112preserved on all copies.
113
114Permission is granted to copy and distribute modified versions of this
115manual under the conditions for verbatim copying, provided also that the
116sections entitled `Copying' and `GNU General Public License' are
117included exactly as in the original, and provided that the entire
118resulting derived work is distributed under the terms of a permission
119notice identical to this one.
120
121Permission is granted to copy and distribute translations of this manual
122into another language, under the above conditions for modified versions,
123except that this permission notice may be stated in a translation
124approved by the European Bioinformatics Institute.
125
126@end titlepage
127
128
129@c --------------------------------------------------------------------------
130@ifinfo
131@node Top, Copying, (dir), (dir)
132@top Become
133
134
135Become is a system for managing shared accounts. It allows users to
136`become' other users in order to do useful work. It can be managed on a
137central server (or a small number of central servers), or it can run
138standalone.
139
140This file documents Become version @value{version}.
141
142@end ifinfo
143
144@menu
145* Copying:: Your rights to distribute and modify
146* Introduction:: A brief introduction to Become
147* Becoming someone else:: How to become somebody else
148* Administering Become:: How to maintain Become
149* Invoking Become:: Reference to Become's command line options
150
f60a3434 151@detailmenu
7a53967a 152 --- The Detailed Node Listing ---
153
154Becoming someone else
155
156* Terminology:: Some important terms defined
157* Environment:: Login styles and environment variables
158* Group permissions:: How Become handles group permissions
159* X authority:: Problems with X authority files
160* Running commands:: Running commands other than a shell
161
162How Become sets up the environment
163
164* New environment variables:: Become adds some useful environment variables
165* Login styles:: Choose how Become sets the environment
166* Tweaking the environment:: Altering individual environment variables
167* Removed variables:: Some environment variables aren't passed on
7a53967a 168
169Login styles
170
171* The preserve style:: Preserve the current environment
172* The set-user style:: Set user-specific variables (like @code{su})
173* The login style:: Clear the environment (like @code{login})
174
175How Become handles groups
176
177* Primary group selection:: Setting the new primary group
178* Subsidiary groups:: Setting subsidiary group memberships
179
180Considerations for X authority
181
10bc033f 182* The user-group method:: A fairly secure way of handling X authority
7a53967a 183* Using xauth:: A less secure method, which might be easier
184
185Become administration
186
187* Configuration files:: Overview of Become's configuration files
188* Standalone or networked:: The two main types of Become installations
189* The configuration file:: How to define who's allowed to do what
69805471 190* Networked configuration:: Considerations for networked installations
7a53967a 191
192The configuration file
193
10bc033f 194* Requests and rules:: How the configuration file works
7a53967a 195* Basic syntax:: Quick overview of Become's syntax
196* Classes:: Defining classes of things
197* Predefined classes:: Become predefines some (maybe) useful classes
198* Allow statements:: Allow users to become other users
199* Other statements:: Some other useful statements
200* Example configuration file:: An example, showing a few features.
10bc033f 201* Checking and querying:: Checking and querying configuration files
7a53967a 202* Complete grammar:: Complete grammar for Become config files
203
10bc033f 204Checking and querying the configuration file
205
206* Verifying config files:: Checking a configuration file is correct
207* Querying config files:: Asking questions about privileges
208* Output formats:: Different ways of formatting output
209* Restricting output:: Being selective about what gets output
210* bcquery reference:: Complete command line reference
211
7a53967a 212Networked configuration
213
214* Choosing servers:: Which servers Become tries to talk to
215* Setting up keys:: How to generate keys for Become
7a53967a 216* Issuing a new key:: How to issue new keys without disruption
217
7a53967a 218Invoking Become
219
220* Becoming another user:: Options for becoming another user
221* Starting Become daemons:: Options for starting Become daemons
222* Debugging options:: Options to use when Become goes wrong
f60a3434 223
224@end detailmenu
7a53967a 225@end menu
226
227@c --------------------------------------------------------------------------
228@node Copying, Introduction, Top, Top
229@unnumbered The GNU General Public License
230
7a53967a 231@include gpl.texi
232
233
234@c --------------------------------------------------------------------------
235@node Introduction, Becoming someone else, Copying, Top
236@unnumbered Introduction
237
238
239It's often useful to be able to share accounts between a number of
240users. For example, a group maintaining an externally visible service
241need to be able to start and kill the server process. Giving such a
242shared account a password is a fairly bad plan: such passwords tend not
243to get changed very often, and they have a habit of spreading beyond the
244group of legitimate users.
245
246The Become program presented here offers a solution to the problems of
10bc033f 247shared accounts. It allows the system administrator to define which
7a53967a 248users are allowed access to which accounts, on which hosts, and to
249execute which commands. Such shared accounts can then, in general, have
250their passwords removed.
251
252This coincidentally has another advantage: when `becoming' to a shared
253account, a user can retain her@footnote{Or his. I'll choose one or the
254other fairly randomly throughout this manual.} own environment, which
255she's carefully crafted and honed over the years, rather then being
256presented with some lowest-common-denominator setup which probably
257doesn't even use the right shell.
258
259The configuration file for Become can either be distributed to all the
260various hosts in a network or a few carefully set up and secure servers
261(@pxref{Standalone or networked}).
262
263
264@c --------------------------------------------------------------------------
265@node Becoming someone else, Administering Become, Introduction, Top
266@chapter Becoming someone else
267
268
269The simplest way to become someone else is to say
270
271@example
272become @var{user}
273@end example
274
275@noindent
276Become will check to see whether you're allowed to become @var{user}. If you
277are, it starts a shell process with the user-id set to @var{user}. Any
278commands you type are executed with the privileges of @var{user}.
279
280The full invocation is slightly more complicated:
281
282@example
283become [@var{option}@dots{}] [@var{env-var}@dots{}] @var{user} [@var{command} [@var{arg}@dots{}]]
284@end example
285
286Actually, the @var{option}s, @var{env-var}s and @var{user} can be in any
287order -- the important point is that all of them appear before the
288@var{command}, if there is one.
289
290@menu
291* Terminology:: Some important terms defined
292* Environment:: Login styles and environment variables
293* Group permissions:: How Become handles group permissions
294* X authority:: Problems with X authority files
295* Running commands:: Running commands other than a shell
296@end menu
297
298
299
300@node Terminology, Environment, Becoming someone else, Becoming someone else
301@section Terminology
302
303The following terms get used quite a bit in the following text:
304
305@table @asis
306@item request
307An invocation of Become, asking permission to become another user.
308
309@item old user
310The (real) user id of the process which invoked Become; usually, this will be
311your normal user id.
312
313@item target user
314The user whom you want to become, named in a request.
315@end table
316
317
318
319@node Environment, Group permissions, Terminology, Becoming someone else
320@section How Become sets up the environment
321
322There are thorny problems with handling the user's environment. It seems
323that (the author's initial assessment notwithstanding) there is no single
324best way of handling environment variables. As a result, Become can do just
325about everything you might want it to. This gets slightly complicated.
326Don't worry: it's not as hard as all that.
327
328@menu
329* New environment variables:: Become adds some useful environment variables
330* Login styles:: Choose how Become sets the environment
331* Tweaking the environment:: Altering individual environment variables
332* Removed variables:: Some environment variables aren't passed on
7a53967a 333@end menu
334
335
336@node New environment variables, Login styles, Environment, Environment
337@subsection Environment variables created by Become
338
339To help you (and, more importantly, your startup scripts) keep track of who
340you are, and who you were originally, Become adds some variables to the
341environment of any processes it starts.
342
343@table @code
344@item BECOME_USER
345The name of the target user (i.e., the user you are now). It might be useful
346to test this value in shell startup scripts, for example.
347
348@item BECOME_HOME
349The home directory of the target user. It can be handy to read startup and
350other configuration files from here.
351
352@item BECOME_OLD_USER
353The name of the user who invoked Become.
354
355@item BECOME_OLD_HOME
356The home directory of the `old' user.
357
358@item BECOME_ORIGINAL_USER
359This is intended to be the name you logged in with. If it's unset, Become
360sets it to be the same as @code{BECOME_OLD_USER}; otherwise it leaves it
361unchanged.
362
363@item BECOME_ORIGINAL_HOME
364This is intended to be the home directory you logged in with. If it's unset,
365Become sets it to be the same as @code{BECOME_OLD_HOME}; otherwise, it leaves
366it unchanged.
367@end table
368
369Don't even think about relying on these variables as a form of
370authentication. It won't work. They're provided only to help organise
371startup scripts.
372
373
374
375@node Login styles, Tweaking the environment, New environment variables, Environment
376@subsection Login styles
377
378Originally, Become always tried to preserve your environment. There's a
379rational explanation for this approach, which is given in the description of
380the `preserve' style below. Unfortunately, not everyone liked this
381approach. As a result, there's now a collection of different login styles.
382
383Login styles are selected by giving command line arguments:
384
385@table @code
f5050002 386@item -e
7a53967a 387@itemx --preserve
388The original style: try to preserve the existing user's environment as much
389as possible.
390
391@item -s
392@itemx --set-user
393Set some user-specific variables, like @code{USER} and @code{HOME} to reflect
394the target user rather than the old user. All other variables are preserved.
395
396@item -l
397@itemx --login
398Attempts to make the `become' process as much like a real login as possible.
399All variables not explicitly preserved are deleted, and a new environment is
400built, reflecting the target user.
401@end table
402
403The various styles, and the reasons behind them, are described below.
404
405@menu
406* The preserve style:: Preserve the current environment
407* The set-user style:: Set user-specific variables (like @code{su})
408* The login style:: Clear the environment (like @code{login})
409@end menu
410
411
412@node The preserve style, The set-user style, Login styles, Login styles
413@subsubsection The `preserve' login style
414
415You've spent many hours (days? weeks, even?) customising and honing your
416startup files, learning how to use your shell, and tweaking your favourite
417text editor until it's just the way you like it. So there can be few things
418more annoying than logging into a shared account to find out that the shell's
419wrong, your editor startup files are ignored, and nothing works quite the way
420you'd like it to. Typically you can't change this without annoying the other
421users: the result is a horrible compromise which dissatisfies everyone
422equally.
423
424The `preserve' style lets you take your standard environment with you when
425you become someone else. It tries hard not to modify any environment
426variables.
427
428Become starts your standard shell. If you have an environment variable
429@code{SHELL} defined, than this is executed. Otherwise, the shell specified
430in your entry in the password file is used. (You must have permission to
431execute whatever shell is chosen as the target user, or you'll just be given
432an error message.)
433
434Most programs look at environment variables in preference to looking up
435entries in the password database; e.g., they tend to use @code{USER} or
436@code{LOGNAME} for the user name, and @code{HOME} for your home directory.
437As a result, most programs will continue to find their configuration files in
438your home directory. Also, systems like RCS will use your real name, rather
439than the name of the user that you have become.
440
441To make best use of this login style, you may need to adjust your login
442scripts to notice when @code{BECOME_USER} is someone else, and read in
443appropriate definitions. For example, a `bash' user might say something like
444this in her @file{.bashrc}:
445
446@example
447if [ -n "$BECOME_HOME" ]; then . $BECOME_HOME/.bashrc
448@end example
449
450@noindent
451Similarly, a C shell user (either `tcsh' or `csh') might say something like
452
453@example
454if ($?BECOME_HOME) source $@{BECOME_HOME@}/.cshrc
455@end example
456
457(Note that plain Bourne shell users have a slight problem, because the Bourne
458shell only reads configuration things on a login, not when a normal
459interactive shell is started.)
460
461
462@node The set-user style, The login style, The preserve style, Login styles
463@subsubsection The `set-user' login style
464
465The author sees the main use of Become as allowing a user to acquire the
466privileges associated with a shared account without all the problems which
467shared accounts usually cause. To the author's way of thinking, one of the
468main problems is that your environment gets replaced by something alien and
469wrong. People disagree with me over this point, and for this reason the
470`set-user' style exists.
471
472The objective of `set-user' style is to behave similarly to the standard
473@code{su} command. Unless they've been preserved explicitly (@pxref{Tweaking
474the environment}), `set-user' mode sets the following environment variables:
475
476@table @code
477@item USER
478@itemx LOGNAME
479The name of the target user.
480
481@item HOME
482The home directory of the target user.
483
484@item SHELL
485The target user's default shell
486@end table
487
488The result of this is that the shell will read the target user's
489configuration files and present you with the environment set up there.
490
491I can't think of this style as being anything other than a migration aid
492while users are getting used to the freedom offered by the `preserve' style.
493
494
495@node The login style, , The set-user style, Login styles
496@subsubsection The `login' login style
497
498The `login' style causes Become to attempt to emulate a full login. Become
10bc033f 499will empty the environment of almost variables which aren't explicitly
500preserved (@pxref{Tweaking the environment}). However, the following
501variables are retained:
502
503@itemize @bullet
504@item
505TERM
506@item
507DISPLAY
508@item
509TZ
510@end itemize
511
512@noindent
513It will set the following variables:
7a53967a 514
515@table @code
516@item USER
517@itemx LOGNAME
518The name of the target user.
519
520@item HOME
521The home directory of the target user.
522
523@item SHELL
524The target user's default shell
525
526@item MAIL
527An educated guess at where the target user's mailbox is.
528@end table
529
530By default, it runs the target user's shell, informing it that this is a
531login by setting the first character of @code{argv[0]} to @samp{-}.
532
533Become makes no entries in the @file{utmp} and @file{wtmp} files.
534
535
536
537@node Tweaking the environment, Removed variables, Login styles, Environment
538@subsection Tweaking individual environment variables
539
540Become's login styles provide a sort of course-grained control over the
541environment. Sometimes the control isn't fine enough. Become lets you tweak
542individual variables: you can set, delete, or preserve named variables from
543modification.
544
545There are three different things you can do with environment variables:
546
547@itemize @bullet
548@item
549Set a variable called @var{var} to a value @var{value}, by saying
550
551@example
552@var{var}=@var{value}
553@end example
554
555@noindent
556The variable is preserved from automatic deletion by the login-style rules.
557
558@item
559Delete a variable called @var{var} from the environment, by saying
560
561@example
562@var{var}-
563@end example
564
565@item
566Preserve a variable @var{var} from being deleted or modified by Become's
567login-style rules, but not change its value, by saying
568
569@example
570@var{var}!
571@end example
572@end itemize
573
574Just to try and make this slightly more sensible, here's an example. Suppose
575I want my @code{XAUTHORITY} variable to be set when I become user `fred':
576
577@example
578become XAUTHORITY=$HOME/.Xauthority fred
579@end example
580
581@noindent
582should do the job nicely. Similarly, if I want to log in as `bob', but don't
583want my @code{EDITOR} variable to change:
584
585@example
586become --login EDITOR! bob
587@end example
588
589@noindent
590(Of course, in this example, I'm at the mercy of Bob's shell init files as to
591whether his choice of editor overrides mine.)
592
593
594
69805471 595@node Removed variables, , Tweaking the environment, Environment
7a53967a 596@subsection Variables removed from the environment
597
598Some variables are removed from the environment which Become passes to a
599program for security reasons:
600
601@table @code
602@item LD_*
603@itemx SHLIB_PATH
604@itemx LIBPATH
605@itemx _RLD_*
606These variables are used on various systems as a search path for shared
607libraries. Clearly, by manipulating these search paths, an attacker could
608replace a standard shared library with one of his own.
609
610@item IFS
611The shell input field separator. Modifying this variable radically alters
612the way shells parse their inputs. (In particular, consider the case where
613@code{IFS} contains @samp{/}.)
614
615@item ENV
616@itemx BASH_ENV
617Used by some shells: it contains the name of a file to read on every shell
618invocation.
619
620@item KRB_CONF
621@ignore
622I'm not really sure what's going on here, so I'll just have to bluff my way
623through. I think that the following is more-or-less accurate, having browsed
624a small amount of Kerberos-related documentation.
625@end ignore
626Contains the name of a Kerberos configuration file. By manipulating this
627variable, an attacker could persuade a program to believe the wrong
628authentication server.
629@end table
630
631Also note that the @code{PATH} variable is modified: any items which aren't
632absolute pathnames are removed from the path. This check may become stricter
633in future, although getting the balance between security and convenience is
634particularly hard here.
635
636
637
7a53967a 638@node Group permissions, X authority, Environment, Becoming someone else
639@section How Become handles groups
640
641As well as handling changes of user id, Become also changes group ids.
642The exact changes Become makes are under user control.
643
644@menu
645* Primary group selection:: Setting the new primary group
646* Subsidiary groups:: Setting subsidiary group memberships
647@end menu
648
649
650@node Primary group selection, Subsidiary groups, Group permissions, Group permissions
651@subsection Choosing a new primary group
652
653By default, the primary group is chosen according to the login style
654(@pxref{Login styles}): the `preserve' style retains the current primary
655group, while `set-user' and `login' styles choose the target's primary group.
656
657You can override Become's default choice using the @code{--group} (@code{-g}
658for short) option:
659
660@example
661become --group=@var{group} @dots{}
662@end example
663
664The chosen @var{group} may be either a group name or a numeric gid. The
665group must be one of the following:
666
667@itemize @bullet
668@item
669Your current primary group.
670@item
671One of your current subsidiary groups.
672@item
673The target user's primary group.
674@item
675One of the target user's subsidiary groups.
676@end itemize
677
678Become will raise an error if this isn't the case.
679
680
681@node Subsidiary groups, , Primary group selection, Group permissions
682@subsection Handling subsidiary group memberships
683
684Subsidiary group memberships are a powerful tool for managing permissions
685under Unix. Traditionally, they tend to be tied to particular users. Become
686tries to be sightly more intelligent about group memberships.
687
688Become has a concept of @dfn{group style}, analogous to login style
689(@pxref{Login styles}). The styles are selected by giving command line
690arguments:
691
692@table @code
693@item -k
694@itemx --keep-groups
695Retain the existing group memberships; don't add any new groups.
696
697@item -m
698@itemx --merge-groups
699Merge group memberships of the target user with the exiting memberships.
700
701@item -r
702@itemx --replace-groups
703Replace the existing group memberships with the target user's memberships.
704@end table
705
706Again, the defaults are dependent on the chosen login style. Both `preserve'
707and `set-user' merge group memberships; the `login' style replaces the set of
708groups.
709
710Note that you can do perverse things like replace all the subsidiary groups
711but retain your primary group (using the @code{--group} option;
712@pxref{Primary group selection}) if you like: Become won't try to stop you.
713
714
715
716@node X authority, Running commands, Group permissions, Becoming someone else
717@section Considerations for X authority
718
719Other users can't read your @file{.Xauthority} file, if you have one. This
720is as it should be: anyone who can read it can connect to your X server and
721read or generate events. However, once you've become another user, you can't
722open any X windows; this can be annoying if your favourite editor is X-based.
723
724There are two basic approaches. Either you can send the shared account a
725copy of your display's magic cookie, or you can retain permission to read the
726cookie file.
727
10bc033f 728Be aware that allowing a shared account to connect to your X display is a
729security risk.
730
7a53967a 731@menu
10bc033f 732* The user-group method:: A fairly secure way of handling X authority
7a53967a 733* Using xauth:: A less secure method, which might be easier
734@end menu
735
736
737@node The user-group method, Using xauth, X authority, X authority
738@subsection The user-group method for handling X authority
739
10bc033f 740This method is secure only if your site uses the `user-group' system. In
741this system, each user is allocated a group containing only that user.
742Usually this is made the user's default primary group, although that's not
743necessary here.
7a53967a 744
745When you start a new X session, ensure that your cookie file is owned by you
746and your private group. Change the file's permissions so that it's group
747readable. Finally, ensure that your private group is retained when you
748become someone else (@pxref{Group permissions}), and that the
749@code{XAUTHORITY} variable is set correctly.
750
10bc033f 751Note that Unix's security mechanisms aren't designed to prevent processes
752owned by the same user from interfering with each other. This method does
753not provide complete security.
754
7a53967a 755The following Bourne shell code in a @file{.xinitrc} should do most of the
756work:
757
758@example
759XAUTHORITY="$HOME/.Xauthority"
760export XAUTHORITY
761chgrp mygroup $XAUTHORITY
762chmod 640 $XAUTHORITY
763@end example
764
765@noindent
766In a C shell, this becomes
767
768@example
769setenv XAUTHORITY $@{HOME@}/.Xauthority
770chgrp mygroup $XAUTHORITY
771chmod 640 $XAUTHORITY
772@end example
773
774The @code{XAUTHORITY} file is preserved by both the `preserve' and `set-user'
775login styles, so this isn't a problem. You can now become other users, and
776your X permissions will follow you around correctly.
777
778It's probably worth noting that the @code{xauth} program annoyingly resets
779the permissions on the cookie file every time it writes to it. This will be
780particularly irritating if you use @code{ssh}'s X forwarding capabilities,
781because every @code{ssh} connection will reset the permissions. You can deal
782with this problem by putting a line
783
784@example
785chmod 640 $@{XAUTHORITY-$HOME/.Xauthority@} 2>/dev/null
786@end example
787
788@noindent
789in your @file{.bashrc} or @file{.profile} (for Bourne-like shell users) or
790
791@example
792if ($?XAUTHORITY) then
793 chmod 640 $XAUTHORITY >&/dev/null
794else
795 chmod 640 $@{HOME@}/.Xauthority >&/dev/null
796endif
797@end example
798
799@noindent
800in @file{.cshrc} for C shell users.
801
802
7a53967a 803@node Using xauth, , The user-group method, X authority
10bc033f 804@subsection The @code{xauth} method for handling X authority
7a53967a 805
806This method sends your X cookie to the shared account. It's therefore
807intrinsically dangerous: you must be able to trust the other users of the
808shared account not to take undue advantage of this situation.
809
810The following (Bourne) shell snippet illustrates how you might send an
811authorisation cookie to the shared account, to allow it to connect to your
812display:
813
814@example
815if test -n "$BECOME_HOME"; then
816 XAUTHORITY="$BECOME_HOME/.Xauthority"; export XAUTHORITY
817elif test -n "$DISPLAY" && test -z "done_xauth_cookie"; then
818 case "$DISPLAY" in
819 :0.0) display=`hostname`:0.0 ;;
820 *) display="$DISPLAY" ;;
821 esac
822 xauth extract - $display | \
823 become someone -c 'xauth -f $BECOME_HOME/.Xauthority merge -'
824 done_xauth_cookie=yes; export done_xauth_cookie
825fi
826@end example
827
828The equivalent C shell code is
829
830@example
831if ($?BECOME_HOME) then
832 setenv XAUTHORITY "$@{BECOME_HOME@}/.Xauthority
833else if ($?DISPLAY && ! $?done_xauth_cookie) then
834 if ($DISPLAY == :0.0) then
835 set display="`hostname`:0.0"
836 else
837 set display="$DISPLAY"
838 endif
839 xauth extract - $display | \
840 become someone -c 'xauth -f $BECOME_HOME/.Xauthority merge -'
841endif
842@end example
843
844It works as follows:
845
846@itemize @bullet
847@item
848If the variable @code{BECOME_HOME} is set, then we're probably really someone
849else, so point to the shared account's authority file.
850
851@item
852Otherwise, check to see whether we have a display, and the authorisation has
853not already been sent. If this is so, resolve a local display name into a
854remote one (just in case) and then send it to the shared account.
855@end itemize
856
857
858
859@node Running commands, , X authority, Becoming someone else
860@section Executing specific commands
861
862As well as starting shells, Become can run single commands. This can be
863useful in two ways:
864
865@itemize @bullet
866@item
867It enables Become to be used in scripts.
868
869@item
870It allows access to shared accounts to be controlled on the basis of the
871command to be run.
872@end itemize
873
874To run a command as another user, say:
875
876@example
877become @var{user} @var{command} [@var{argument}@dots{}]
878@end example
879
880If the request is granted, Become runs @var{command}, passing it any
881arguments following the command name. Become doesn't run a shell, so there's
882no extra escaping which needs to be done.
883
884If you really want to run a shell command as another user, you can use the
885@code{-c} option:
886
887@example
888become @var{user} -c @var{shell-command}
889@end example
890
891This is exactly equivalent to
892
893@example
894become @var{user} /bin/sh -c @var{shell-command}
895@end example
896
897in every way. In particular, you must have permission to run @file{/bin/sh}
898as @var{user} for it to work: Become doesn't attempt to interpret the shell
899command in any way. Also note that Become always uses the Bourne shell,
900regardless of your current shell preference, or @var{user}'s default shell.
901(This is done to provide a stable programming interface which works
902irrespective of changes to the shared account's configuration.)
903
904
905@c --------------------------------------------------------------------------
906@node Administering Become, Invoking Become, Becoming someone else, Top
907@chapter Become administration
908
909
910This chapter will explain how Become is administrated and maintained.
911
912@menu
913* Configuration files:: Overview of Become's configuration files
914* Standalone or networked:: The two main types of Become installations
915* The configuration file:: How to define who's allowed to do what
916* Networked configuration:: Considerations for networked installations
917@end menu
918
919
920
921@node Configuration files, Standalone or networked, Administering Become, Administering Become
922@section Configuration files
923
924Become keeps its configuration and administrative files in a directory
925usually named @file{/etc/become}, although this can be changed with the
926@code{--with-etcdir} option to the configuration script when you build
927Become.
928
929Not all of the files are needed on all machines.
930
931@table @file
932@item become.conf
933The main configuration file, containing a description of which users are
934allowed to become which other users, where, and what they're allowed to run
935when they get there. Only needed on servers or standalone machines.
936
937@item become.server
938A list of servers to contact. Only needed on client machines.
939
940@item become.key
f60a3434 941The signing key to use when sending requests to servers. Needed on servers,
942but not on standalone machines.
943
944@item become.pubkey
945The verification keys to use when checking server responses. Needed on
946clients, but not on standalone machines.
7a53967a 947
948@item become.pid
949The process id of the server. Created automatically by Become's server when
950in starts up.
7a53967a 951@end table
952
953
954@node Standalone or networked, The configuration file, Configuration files, Administering Become
955@section Installation types
956
957
958Become can be installed in two different ways, depending on how you want to
959administer it:
960
961@itemize @bullet
962@item
963In a @dfn{standalone} installation, each Become request is dealt with
964locally: the program reads the configuration file, and decides whether it
965should grant or deny permission.
966
967Standalone installations don't depend on servers being available, or even on
10bc033f 968the existence of a network. They're useful for small sites, or sites with a
7a53967a 969small number of users. The disadvantages are that reading the configuration
970file takes a while, so the program doesn't feel as responsive as it should,
971and ensuring that all the hosts' configuration files are synchronised becomes
972difficult when you have lots of machines.
973
974@item
975In a @dfn{network} installation, any Become requests are sent on to a
976collection of servers. The servers analyse the request and send a reply back
977which either authorises or forbids access.
978
979A networked installation clearly depends on the servers' reliability. The
980client reacts only to the first reply it receives, so as long as there is one
981server running, everything should continue as normal.
982
983A networked installation is useful when you have a large number of client
984machines, particularly ones which may not be awake all the time. The full
985configuration file only needs to be installed on a small number of servers;
986the clients require only a list of server machines to contact, and an
987encryption key to use.
988@end itemize
989
990
991
992@node The configuration file, Networked configuration, Standalone or networked, Administering Become
993@section The configuration file
994
995The main configuration file, usually called @file{/etc/become/become.conf},
996contains all the rules which Become uses to decide whether to grant or deny
997requests. It may also contain additional information for the benefit of
998Become daemons, if you're using a networked installation.
999
1000@menu
10bc033f 1001* Requests and rules:: How the configuration file works
7a53967a 1002* Basic syntax:: Quick overview of Become's syntax
1003* Classes:: Defining classes of things
1004* Predefined classes:: Become predefines some (maybe) useful classes
1005* Allow statements:: Allow users to become other users
1006* Other statements:: Some other useful statements
1007* Example configuration file:: An example, showing a few features.
10bc033f 1008* Checking and querying:: Checking and querying configuration files
7a53967a 1009* Complete grammar:: Complete grammar for Become config files
1010@end menu
1011
1012
10bc033f 1013@node Requests and rules, Basic syntax, The configuration file, The configuration file
1014@subsection Requests and rules
1015
1016Become looks at four pieces of information when it's analysing a request:
1017
1018@itemize @bullet
1019@item
1020the user's current identity;
1021@item
1022the identity the user wishes to assume;
1023@item
1024the host which generated the request; and
1025@item
1026the command the user wishes to run.
1027@end itemize
1028
1029Each of these pieces of information is looked at when Become decides whether
1030to honour a request.
1031
1032The configuration file's main purpose is to describe the conditions under
1033which Become should honour a request. These conditions are described by a
1034number of @emph{rules}. A rule consists of two lists of users (called `from'
1035and `to'), a list of hosts, and a list of commands. A rule matches a request
1036if:
1037
1038@itemize @bullet
1039@item
1040the user's current identity is in the rule's `from' list;
1041@item
1042the target user's identity is in the rule's `to' list;
1043@item
1044the host is in the rule's host list; and
1045@item
1046the command to be run is in the rule's command list.
1047@end itemize
1048
1049A request is honoured if there is a rule which matches the request.
1050
1051
1052@node Basic syntax, Classes, Requests and rules, The configuration file
7a53967a 1053@subsection Basic configuration file syntax
1054
1055The configuration file consists of a sequence of statements, each terminated
1056by a semicolon.
1057
1058Comments begin with a @samp{#} character, and continue to the end of the
1059line. This is the only time newlines behave specially: newlines behave just
1060like any other whitespace characters within statements.
1061
1062Strings are enclosed in double-quote characters (@samp{"}). Within a string,
1063a backslash causes the following character to be treated literally, whatever
1064it may be (including quotes, backslashes and newlines).
1065
1066Names begin with an alphabetic character or an underscore, and consist of
1067letters, digits and underscores.
1068
7a53967a 1069
1070@node Classes, Predefined classes, Basic syntax, The configuration file
1071@subsection Classes
1072
1073A @dfn{class} in Become is a set of users, hosts or commands. You can define
1074and name your own classes using statements of the form:
1075
1076@example
1077user @var{name} = @var{class-expr} ;
1078command @var{name} = @var{class-expr} ;
1079host @var{name} = @var{class-expr} ;
1080@end example
1081
1082A @var{class-expr} is an expression defining a class. You can build a
1083complex class out of simple classes using the operators (in ascending
1084precedence order) @samp{,}, @samp{-}, @samp{|} and @samp{&}, which represent
1085the set options `union', `subtraction', `union' (again!), and `intersection'.
1086Subexpressions can be parenthesised to override the default precedence.
1087Once a class name has been defined, as shown above, it can be used in
1088subsequent class expressions.
1089
1090A single user may be designated by either a user name (in quotes) or an
1091integer uid. Commands and hosts may be designated by quoted strings which
1092may contain wildcards. Host strings are matched against both numeric (dotted
1093quad) IP addresses and the reverse-resolved hostname. Command strings are
1094matched against the absolute pathname of the command the user wants to
1095execute.
1096
1097
1098
1099@node Predefined classes, Allow statements, Classes, The configuration file
1100@subsection Predefined classes
1101
1102In an attempt to make life a bit easier, Become creates a collection of
1103predefined classes.
1104
1105The standard classes @code{all} and @code{none} match anything and nothing
1106respectively. The @code{all} class is useful in some contexts: it gives you
1107a way of saying `everything except@dots{}', for example:
1108
1109@example
1110user MUNDANES = all - SYSHACKS;
1111@end example
1112
1113@noindent
10bc033f 1114The @code{none} class is provided because it's needed internally anyway and
1115someone might come up with a use for it.
7a53967a 1116
1117Become also defines some other classes:
1118
1119@itemize @bullet
1120@item
1121For each username @var{user}, Become adds a class called @samp{@var{user}}
1122which matches just that user.
1123
1124@item
1125For each group name @var{group}, Become creates a class called
1126@samp{@var{group}} which matches any user who is a member of that group.
1127
1128@item For each netgroup @var{netgroup}, Become creates two classes:
1129@samp{u_@var{netgroup}} which matches any user listed in the netgroup, and
1130@samp{h_@var{netgroup}} which matches any host listed in the netgroup.
1131@end itemize
1132
1133If a name is used for both a user @emph{and} a group, then corresponding
1134class ends up containing the user together with all of the group members.
1135For this reason, it's probably better to use the predefined classes for
1136groups rather than individual users -- use quoted user names for individual
1137users.
1138
1139Note that users and groups are read using the standard @code{get*ent} calls
1140@emph{and} directly from the NIS server (if there is one). The idea here is
1141that a Become server can be run on a machine which allows restricted logins.
1142It still needs to know about all the users known to the outside world.
1143
1144Netgroups are read only from the NIS servers. In particular, although GNU
10bc033f 1145systems allow netgroup databases to be stored in local files, Become won't
7a53967a 1146read them because there's no defined interface for enumerating netgroups.
1147
1148
1149@node Allow statements, Other statements, Predefined classes, The configuration file
1150@subsection Allow statements
1151
10bc033f 1152The @code{allow} statement defines the rules Become uses when deciding
1153whether to grant a request; see @ref{Requests and rules}.
7a53967a 1154
1155@example
1156allow [[@var{host-class}]] [@var{user-class}] -> [@var{user-class}] [ : @var{command-class}]
1157@end example
1158
1159(The @var{host-class} is optional, but must be enclosed in square brackets if
1160present.)
1161
1162The four classes in an allow statement are called, respectively, the `host',
1163the `to-user', the `from-user' and the `command'. Any of the four classes
1164may be omitted, and an omitted class defaults to `all'.
1165
1166When a request is received, Become checks the fields in the request against
1167the classes in each allow statement of the configuration file. If a
1168statement matches, the request is granted; if there are no full matches,
1169the request is denied.
1170
1171
1172@node Other statements, Example configuration file, Allow statements, The configuration file
1173@subsection Other statements
1174
1175Two other statement types are defined. They only have an effect on Become in
1176daemon mode:
1177
1178@example
1179port @var{port} ;
1180keyfile @var{key-file} ;
1181@end example
1182
1183@noindent
1184The @code{port} statement specifies the port to which the server should
1185listen; the @var{port} may be be an integer or a quoted service name. The
1186@code{keyfile} statement instructs Become to use the key from the file named
1187@var{key-file}, which must be a quoted string.
1188
1189
10bc033f 1190@node Example configuration file, Checking and querying, Other statements, The configuration file
7a53967a 1191@subsection An example configuration file
1192
1193@example
1194#
1195# become.conf
1196#
1197# Example configuration file
1198#
1199
1200allow wheel -> "root";
1201
1202user NEWS = "fred", "jim";
1203allow NEWS -> "news";
1204
1205user HTTP = "jim", "bob";
10bc033f 1206allow ["www.somewhere.com"]
1207 HTTP -> "httpd" : "/bin/kill", "/etc/init.d/httpd";
1208@end example
1209
1210
1211@node Checking and querying, Complete grammar, Example configuration file, The configuration file
1212@subsection Checking and querying the configuration file
1213
1214At a reasonably sized site, Become configuration files can get rather large,
1215and becomes tricky to work out exactly who's allowed to do what and where.
1216
1217The @code{bcquery} tool provided allows Become configuration files to be
1218verified and queried. It can be used to ensure that a file is syntactically
1219correct before it is deployed, or to enquire about privileges granted.
1220
1221@menu
1222* Verifying config files:: Checking a configuration file is correct
1223* Querying config files:: Asking questions about privileges
1224* Output formats:: Different ways of formatting output
1225* Restricting output:: Being selective about what gets output
1226* bcquery reference:: Complete command line reference
1227@end menu
1228
1229@node Verifying config files, Querying config files, Checking and querying, Checking and querying
1230@subsubsection Verifying configuration files
1231
1232A common use of @code{bcquery} is to ensure that a configuration file is
1233actually valid. The command
1234
1235@example
1236bcquery [-file @var{file}] -check
7a53967a 1237@end example
1238
10bc033f 1239@noindent
1240verifies that a configuration file conforms to Become's expectations. If
1241there are any errors in @var{file}, they are reported, and @code{bcquery}
1242will return a nonzero exit code.
1243
1244If no @var{file} is specified, @code{bcquery} will read the configuration
1245file which Become itself reads by default, usually
1246@code{/etc/become/become.conf}.
1247
1248
1249@node Querying config files, Output formats, Verifying config files, Checking and querying
1250@subsubsection Querying configuration files
7a53967a 1251
10bc033f 1252The @code{bcquery} program will list all rules which match a selected request
1253pattern. For example, you can display all rules which allow a particular
1254user to change identity, or all rules which allow people to assume root
1255privileges on a particular host.
1256
1257@example
1258bcquery [-file @var{file}] @var{query}
1259@end example
1260
1261The following simple queries are supported:
1262
1263@table @asis
1264@item @code{-from} @var{user}
1265Matches any rule containing @var{user} in its `from' list.
1266@item @code{-to} @var{user}
1267Matches any rule containing @var{user} in its `to' list.
1268@item @code{-host} @var{host}
1269Matches any rule containing @var{host} in its host list.
1270@item @code{-command} @var{cmd}
1271Matches any rule containing @var{cmd} in its `command' list.
1272@end table
1273
1274@noindent
1275Simple queries can be combined using the following operators:
1276
1277@table @asis
1278@item @var{query-a} @code{-or} @var{query-b}
1279Matches a rule matched by either @var{query-a} or @var{query-b}.
1280@item @var{query-a} @code{-and} @var{query-b}
1281Matches a rule matched by both @var{query-a} and @var{query-b}.
1282@item @code{-not} @var{query}
1283Matches a rule which is not matched by @var{query}.
1284@item @code{(} @var{query} @code{)}
1285Matches a rule matched by @var{query} (overrides default precedence).
1286@end table
1287
1288The @code{-and}, @code{-or} and @code{-not} operators may be written
1289@code{&}, @code{|} and @code{!} respectively, if you prefer, and the
1290@code{-and} operator is optional. These characters (and the parentheses
1291@code{(} and @code{)}) may need to be quoted to prevent interpretation by the
1292shell.
1293
1294Some examples may explain what's going on:
1295
1296@table @samp
1297@item bcquery -from hacker
1298Displays all rules applying to user `hacker'.
1299@item bcquery -host somehost -to root
1300Displays rules allowing people to become root on @code{somehost}.
1301@end table
1302
1303
1304@node Output formats, Restricting output, Querying config files, Checking and querying
1305@subsubsection Output formats
1306
1307The @code{bcquery} program has two distinct output formats: `rows' and
1308`columns'.
1309
1310The `columns' format is probably the simpler to understand, and certainly the
1311easier to read. Each matching record is displayed with the lists of users,
1312hosts and commands in columns. A query on the example configuration file
1313(@pxref{Example configuration file}) is shown below:
1314
1315@example
1316FROM TO HOST COMMAND
1317
1318frankie root ALL ALL
1319selina
1320
1321fred news ALL ALL
1322jim
1323
1324jim httpd www.somewhere.com /bin/kill
1325bob /etc/init.d/httpd
1326@end example
1327
1328@noindent
1329The `columns' format can only show simple lists. A more complex class
1330definition will show up as @samp{<complex>} in a `columns' format listing.
1331
1332The `rows' format is capable of displaying classes in their full generality,
1333but is harder to parse and read. It displays each list in the form of an
1334expression, in more or less the same syntax as a class definition
1335(@pxref{Classes}).
1336
1337The default behaviour is to use `columns' format where possible, or `rows'
1338format if some of the lists are too complex to be represented in columns.
1339You can select a format explicitly using the @code{-columns} or @code{-rows}
1340options, which is useful if you're trying to parse the output of
1341@code{bcquery} with a script.
1342
1343
1344@node Restricting output, bcquery reference, Output formats, Checking and querying
1345@subsubsection Restricting output
1346
1347It's also possible to suppress bits of information about each matched rule.
1348For example, you can show only the `from' list, or just the `to' and `host'
1349lists. This is done with the @code{-output} option.
1350
1351Each list is given a letter; the `from' list is called @samp{f}, the `to'
1352list @samp{t}, the host list @samp{h} and the command list @samp{c}. You can
1353select which lists are displayed by giving the corresponding letters (the
1354order isn't important). You can also turn individual lists on or off by
1355preceding the characters with @samp{+} or @samp{-} characters. If you start
1356with a @samp{+} or @samp{-}, then the last-set selection (or the initial
1357default of all-lists-enabled) is modified.
1358
1359For example, @samp{-output ftc} shows only the `from', `to' and `command'
1360lists. This could be written @samp{-output -h} too, to turn the hosts list
1361off.
1362
1363This option is mainly useful with the `columns' output format (@pxref{Output
1364formats}) to save scripts having to select columns out themselves.
1365
1366
1367@node bcquery reference, , Restricting output, Checking and querying
1368@subsubsection @code{bcquery} options summary
1369
1370@example
1371bcquery [@var{option}@dots{}] [@var{query}]
1372@end example
1373
1374The @var{option}s available are:
1375
1376@table @asis
1377@item @code{-help}
1378Displays a summary of the available options, and exits.
1379
1380@item @code{-file} @var{file}
1381Read @var{file}, rather than the compiled-in default (usually
1382@file{/etc/become/become.conf}).
1383
1384@item @code{-dump}
1385Don't read a configuration file. Instead, display the query tree parsed from
1386the command line. This is a debugging feature.
1387
1388@item @code{-check}
1389Don't attempt to output any rules. Instead, just check the configuration
1390file for validity.
1391
1392@item @code{-output} @var{spec}
1393Selects which columns are to be displayed for each matching rule.
1394For full details, see @ref{Restricting output}.
1395
1396@item @code{-columns}
1397@itemx @code{-rows}
1398Forces `columns' or `rows' output format. @xref{Output formats}.
1399
1400@item @code{-nohead}
1401Suppress the header line at the top of the output in `columns' mode. Makes
1402the output more amenable to automatic processing (but harder to read).
1403
1404@item @code{-from} @var{user}
1405@itemx @code{-to} @var{user}
1406@itemx @code{-host} @var{hostname}
1407@itemx @code{-command} @var{cmd}
1408Simple queries for selecting rules. @xref{Querying config files}.
1409
1410@item @code{-and}
1411@itemx @code{-or}
1412@itemx @code{-not}
1413Operators for combining queries into something useful. @xref{Querying config
1414files}.
1415@end table
1416
1417
1418@node Complete grammar, , Checking and querying, The configuration file
7a53967a 1419@subsection Complete grammar for configuration files
1420
1421@format
1422@var{file} ::= @var{file} @var{statement}
1423
1424@var{statement} ::= @var{class-def}
1425 | @var{allow-spec}
1426 | @var{port-spec}
1427 | @var{key-spec}
1428
1429@var{class-def} ::= @samp{user} @var{name} = @var{class-expr} @samp{;}
1430 | @samp{command} @var{name} = @var{class-expr} @samp{;}
1431 | @samp{host} @var{name} = @var{class-expr} @samp{;}
1432
1433@var{allow-spec} ::= @samp{allow} @var{opt-host-spec} @var{opt-user-spec}
1434 @samp{->} @var{opt-user-spec} @var{opt-command-spec} @samp{;}
1435
1436@var{opt-host-spec} ::= @samp{[} @var{class-expr} @samp{]}
1437 | @var{empty}
1438
1439@var{opt-user-spec} ::= @var{class-expr}
1440 | @var{empty}
1441
1442@var{opt-command-spec} ::= @samp{:} @var{class-expr}
1443 | @var{empty}
1444
1445@var{port-spec} ::= @samp{port} @var{integer} @samp{;}
1446 | @samp{port} @var{string} @samp{;}
1447
1448@var{key-spec} ::= @samp{keyfile} @var{string} @samp{;}
1449
1450@var{class-expr} ::= @var{class-diff-expr}
1451 | @var{class-expr} @samp{,} @var{class-diff-expr}
1452
1453@var{class-diff-expr} ::= @var{class-isect-expr}
1454 | @var{class-diff-expr} @samp{-} @var{class-union-expr}
1455
1456@var{class-union-expr} ::= @var{class-isect-expr}
1457 | @var{class-union-expr} @samp{|} @var{class-isect-expr}
1458
1459@var{class-isect-expr} ::= @var{class-primary}
1460 | @var{class-isect-expr} @samp{&} @var{class-primary}
1461
1462@var{class-primary} ::= @samp{(} @var{class-expr} @samp{)}
1463 | @var{string}
1464 | @var{integer}
1465
1466@var{integer} ::= one or more digits (@samp{0}--@samp{9})
1467
1468@var{name} ::= an alphabetic character or underscore, followed by zero or
1469 more alphanumeric characters or underscores
1470
1471@var{string} ::= @samp{"} @var{string-chars} @samp{"}
1472
1473@var{string-chars} ::= @var{string-chars} @var{string-char}
1474 | @var{empty}
1475
1476@var{string-char} ::= a @samp{\} followed by any character
1477 | any character other than @samp{"}, @samp{\} or newline
1478
1479@var{empty} ::=
1480@end format
1481
1482
10bc033f 1483
7a53967a 1484@node Networked configuration, , The configuration file, Administering Become
1485@section Networked configuration
1486
1487If you're planning to use Become in a standalone way, you can skip this
1488section.
1489
1490@menu
1491* Choosing servers:: Which servers Become tries to talk to
1492* Setting up keys:: How to generate keys for Become
7a53967a 1493* Issuing a new key:: How to issue new keys without disruption
1494@end menu
1495
1496
1497@node Choosing servers, Setting up keys, Networked configuration, Networked configuration
1498@subsection Choosing servers
1499
1500Become notices that it's meant to send requests to a server if it finds a
1501@file{become.server} file. This file contains entries of the form
1502
1503@example
1504@var{host} [: @var{port}]
1505@end example
1506
1507If the @var{port} is omitted, Become chooses a port by looking at the
1508services database for a service which matches the name by which Become was
1509invoked: normally this will be @samp{become}.
1510
1511Become sends a request to all of the servers and believes the first valid
1512reply it receives. Since servers ignore requests they believe to be invalid,
1513this enables you to change Become's key without disrupting service
1514(@pxref{Issuing a new key}).
1515
1516If you're using NIS, you should try to ensure that Become servers runs only
1517on NIS servers; the NIS master is probably a good choice.
1518
1519Become isn't particularly processor-intensive, and doesn't seem to require
1520very much memory.
1521
1522
f60a3434 1523@node Setting up keys, Issuing a new key, Choosing servers, Networked configuration
7a53967a 1524@subsection Setting up keys
1525
1526Communication between Become clients and the server is encrypted to ensure
1527that it's not feasible to gain unauthorised privilege by subverting the
f60a3434 1528network. Become uses the DSA algorithm to ensure authenticity of replies.
7a53967a 1529
1530Each client machine, and the server, must have a copy of the same key. The
1531key is usually stored in @file{/etc/become/become.key}. Become's keys are
1532128 bits long.
1533
f60a3434 1534The key file can be generated using Catacomb's @code{key} program. The
1535commands
7a53967a 1536
1537@example
8fc4c5cd 1538key -k /etc/become/become.key add -adsa -e"now + 1 year" become-dsa
f60a3434 1539key -k /etc/become/become.key extract -f -secret /etc/become/become.pubkey
7a53967a 1540@end example
1541
1542@noindent
f60a3434 1543will generate a suitable DSA key, and extract the public part. You should
1544install the public key on all of your client computers, writable only by
1545root. The private key should be only on the server, and readable or writable
1546only by root.
7a53967a 1547
f60a3434 1548If you have multiple servers, they can all have different private keys.
1549You'll need to put all of the public keys in the
1550@file{/etc/become/become.pubkey} file.
7a53967a 1551
7a53967a 1552
f60a3434 1553@node Issuing a new key, , Setting up keys, Networked configuration
7a53967a 1554@subsection Issuing a new key
1555
1556When you're sending out a new key, you run a risk of disrupting service. The
1557server reads a new key; the clients still have the old one.
1558
f60a3434 1559We used to recommend running two servers. Now, however, you can generate the
1560new key, install the new public key on the clients in addition to the old
1561one, and then install the new private key on the server. The clients try all
1562valid public keys when attempting to authenticate a response, so this
1563approach will work.
7a53967a 1564
1565
1566@c --------------------------------------------------------------------------
1567@node Invoking Become, , Administering Become, Top
1568@chapter Invoking Become
1569
1570
1571This chapter provides an exhaustive description of Become's command line
1572options, organised in a reference-manual sort of way.
1573
1574@menu
1575* Becoming another user:: Options for becoming another user
1576* Starting Become daemons:: Options for starting Become daemons
1577* Debugging options:: Options to use when Become goes wrong
1578@end menu
1579
1580
1581
1582@node Becoming another user, Starting Become daemons, Invoking Become, Invoking Become
1583@section Becoming another user
1584
1585@subsection Synopsis
1586
1587@example
1588become [@var{option}@dots{}] [@var{env-var}@dots{}] @var{user} [@var{command} [@var{argument}@dots{}]]
1589@end example
1590
1591Actually, you can put the @var{option}s, @var{env-var}s and @var{user} in any
1592order you like; the important thing is that all of them appear before the
1593command, if any.
1594
1595
1596@subsection Usage
1597
1598The @var{option}s appropriate for this mode are as follows:
1599
1600@table @code
1601@item -h
1602@itemx --help
1603Display a (fairly verbose) help message describing the various command line
1604options and exits successfully.
1605
1606@item -u
1607@itemx --usage
1608Display a terse summary of the command line options and exits successfully.
1609
1610@item -v
1611@itemx
1612Display's Become's version number and exits successfully.
1613
1614@item -e
1615@item --preserve-environment
1616Selects the `preserve' login style (@pxref{The preserve style}). All
1617environment variables are preserved. The default command is the current
1618user's own shell. The default primary group becomes the current primary
1619group; the default group style is set to `merge'.
1620
1621@item -s
1622@itemx --su
1623@itemx --set-user
1624Selects the `set-user' login style (@pxref{The set-user style}). Most
1625environment variables are preserved, but @code{USER}, @code{LOGNAME},
1626@code{HOME} and other user-specific variables are altered to reflect the
1627target user's configuration. The default command is the target user's shell.
1628The default primary group becomes the target user's primary group; the
1629default group style is set to `merge'.
1630
1631@item -l
1632@itemx --login
1633Selects the `login' login style (@pxref{The login style}). The environment
1634is cleared and rebuilt, in a similar way to the behaviour of @code{login}.
1635The default command is the target user's shell. The default primary group
1636becomes the target user's primary group; the default group style is set to
1637`replace'.
1638
1639@item -g @var{group}
1640@itemx --group=@var{group}
1641Selects @var{group} as the primary group; it may be either a group name or a
1642numeric group id. Note that @var{group} must be the primary group or
1643a subsidiary group of either the current user or the target user.
1644
1645@item -k
1646@itemx --keep-groups
1647Selects the `keep' group style (@pxref{Subsidiary groups}). The current set
1648of subsidiary group memberships are passed on unchanged.
1649
1650@item -m
1651@itemx --merge-groups
1652Selects the `merge' group style (@pxref{Subsidiary groups}). The current set
1653of subsidiary group memberships are merged with the subsidiary groups of the
1654target user.
1655
1656@item -r
1657@itemx --replace-groups
1658Selects the `replace' group style (@pxref{Subsidiary groups}). The target
1659user's subsidiary group memberships are passed on; the current subsidiary
1660groups are discarded.
1661
1662@item -c @var{shell-cmd}
1663@itemx --command=@var{shell-cmd}
1664Sets the @var{command} and @var{argument}s to invoke
1665@code{/bin/sh -c @var{shell-cmd}}; i.e., to execute a Bourne shell command
1666instead of just @code{exec}ing a program. Note that permissions are checked
1667for executing the Bourne shell @code{/bin/sh}; the contents of the
1668@var{shell-cmd} are not inspected.
1669@end table
1670
1671The @var{env-var} arguments fine-tune the environment passed to the command.
1672Each @var{env-var} setting must be one of the following:
1673
1674@table @code
1675@item @var{var}=@var{value}
1676Assign the variable named @var{var} the value @var{value}. Protect the
1677variable @var{var} from modifications by the login style.
1678
1679@item @var{var}!
1680Protect the variable @var{var} from modifications by the login style, but
1681don't change its value.
1682
1683@item @var{var}-
1684Remove the variable @var{var} from the environment; do not pass it on.
1685@end table
1686
1687The @var{user} specifies the user as whom the @var{command} should be
1688executed (i.e., the @dfn{target user}). It may be a user name or a numeric
1689user id.
1690
1691The @var{command} specifies a command to execute. If @var{command} does not
1692contain a path, it is looked for using the current @code{PATH} environment
1693variable. The resulting pathname is canonified if necessary, to produce an
1694absolute pathname. Note that symbolic links are @emph{not} resolved -- this
1695prevents an attack whereby a user could invoke a program, passing it an
1696unusual @code{argv[0]} which might cause unusual behaviour.
1697
1698The @var{command} name is used both as the command to execute and passed to
1699the command as @code{argv[0]}. It is not possible to specify an alternative
10bc033f 1700value to be passed as @code{argv[0]}. Subsequent arguments, if supplied, are
7a53967a 1701passed as @code{argv[1]} upwards.
1702
1703If no @var{command} is given, a shell is invoked; the particulars of the
1704shell are determined by the login style (see above).
1705
1706The @var{command} is executed as follows:
1707
1708@itemize @bullet
1709@item
1710The subsidiary groups are chosen as determined by the group style.
1711@item
1712The real and effective gids are set.
1713@item
1714The real and effective uids are set.
1715@item
1716The @var{command} is called using the standard @code{execve} system call.
1717@end itemize
1718
1719
1720
1721@node Starting Become daemons, Debugging options, Becoming another user, Invoking Become
1722@section Starting Become daemons
1723
1724@subsection Synopsis
1725
1726@example
1727become --daemon [@var{option}@dots{}]
1728@end example
1729
1730
1731@subsection Usage
1732
1733The following options are appropriate to this mode:
1734
1735@table @code
1736@item -h
1737@itemx --help
1738Display a (fairly verbose) help message describing the various command line
1739options and exits successfully.
1740
1741@item -u
1742@itemx --usage
1743Display a terse summary of the command line options and exits successfully.
1744
1745@item -v
1746@itemx
1747Display's Become's version number and exits successfully.
1748
1749@item -d
1750@itemx --daemon
1751Start a Become server, instead of processing a request. Become will read its
1752command line options, read in the configuration file (and verify that it's
1753correct) and then fork into the background to wait for incoming requests.
1754Become relinquishes all setuid privileges (by setting all uids to the real
1755uid) when it enters daemon mode. It is therefore only really useful to run a
1756daemon as the superuser.
1757
1758@item -p @var{port}
1759@itemx --port=@var{port}
1760Listen for requests on @var{port}. This option is overridden by the
1761@code{port} option in the configuration file.
1762
1763@item -f @var{file}
1764@itemx --config-file=@var{file}
10bc033f 1765Read configuration from @var{file}, instead of the default (set at
1766compile time, usually @file{/etc/become/become.conf}).
7a53967a 1767@end table
1768
1769The syntax of the configuration file is described in @ref{The configuration
1770file}.
1771
1772
1773@node Debugging options, , Starting Become daemons, Invoking Become
1774@section Debugging options
1775
1776Some options are only useful when trying to find out why Become is
1777misbehaving. Of course, this never happens, so here are the options which
1778you won't need to use:
1779
1780@table @code
1781@item -T[@var{file}]
1782@itemx --trace[=@var{file}]
1783Write trace information to @var{file} (or to standard output, if no
1784@var{file} is specified). You must be able to create the file and open it
1785for writing.
1786
1787@item -L[@var{feature}...]
1788@itemx --trace-level[=@var{feature}]
1789Selects which features Become ought to trace. Each feature is allocated a
1790letter; simply string together the letters for the features you want to
1791debug. The letters @samp{D} and @samp{A} stand respectively for `default'
1792and `all' features; you can subtract from them by saying, for example,
1793@samp{A-xyz} to select all features except @samp{x}, @samp{y} and @samp{z}.
1794The exact list of features supported at any one time can be listed by giving
1795the @code{--trace-level} option without an argument.
1796
1797@item -I @var{user}
1798@itemx --impersonate=@var{user}
1799Pretend to be @var{user} instead of yourself when the request is checked.
1800This option can only be used if it wasn't disabled at compile-time and if
1801Become is not running setuid. Even so, Become will only inform you of the
1802outcome; it will not execute any commands.
1803@end table
1804
1805
1806
1807@c --------------------------------------------------------------------------
1808
1809@c --- No index yet ---
1810@c
1811@c @node Concept index, , Invoking Become, Top
1812@c @unnumbered Concept index
1813@c @printindex cp
1814@c
10bc033f 1815@contents
7a53967a 1816
1817@bye
1818
1819@c ----- That's all, folks --------------------------------------------------