/mandos/release

To get this branch, use:
bzr branch http://bzr.recompile.se/loggerhead/mandos/release

« back to all changes in this revision

Viewing changes to plugin-runner.xml

  • Committer: Teddy Hogeborn
  • Date: 2008-09-05 18:19:52 UTC
  • mfrom: (24.1.91 mandos)
  • Revision ID: teddy@fukt.bsnet.se-20080905181952-qfuwtyvefanh9v3v
* mandos: Open the PID file before daemonizing, but write to it
          afterwards.

* plugin-runner.xml (SECURITY): Improved grammar.

Also merge.

Show diffs side-by-side

added added

removed removed

Lines of Context:
3
3
        "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
4
4
<!ENTITY VERSION "1.0">
5
5
<!ENTITY COMMANDNAME "plugin-runner">
6
 
<!ENTITY TIMESTAMP "2008-09-01">
 
6
<!ENTITY TIMESTAMP "2008-09-05">
7
7
]>
8
8
 
9
9
<refentry xmlns:xi="http://www.w3.org/2001/XInclude">
45
45
  <refnamediv>
46
46
    <refname><command>&COMMANDNAME;</command></refname>
47
47
    <refpurpose>
48
 
      Run Mandos plugins.  Pass data from first succesful one.
 
48
      Run Mandos plugins, pass data from first to succeed.
49
49
    </refpurpose>
50
50
  </refnamediv>
51
51
 
56
56
        <arg choice="plain"><option>--global-env=<replaceable
57
57
        >VAR</replaceable><literal>=</literal><replaceable
58
58
        >value</replaceable></option></arg>
59
 
        <arg choice="plain"><option>-e
 
59
        <arg choice="plain"><option>-G
60
60
        <replaceable>VAR</replaceable><literal>=</literal><replaceable
61
61
        >value</replaceable> </option></arg>
62
62
      </group>
66
66
        >PLUGIN</replaceable><literal>:</literal><replaceable
67
67
        >ENV</replaceable><literal>=</literal><replaceable
68
68
        >value</replaceable></option></arg>
69
 
        <arg choice="plain"><option>-f<replaceable>
 
69
        <arg choice="plain"><option>-E<replaceable>
70
70
        PLUGIN</replaceable><literal>:</literal><replaceable
71
71
        >ENV</replaceable><literal>=</literal><replaceable
72
72
        >value</replaceable> </option></arg>
83
83
        <arg choice="plain"><option>--options-for=<replaceable
84
84
        >PLUGIN</replaceable><literal>:</literal><replaceable
85
85
        >OPTIONS</replaceable></option></arg>
86
 
        <arg choice="plain"><option>-f<replaceable>
 
86
        <arg choice="plain"><option>-o<replaceable>
87
87
        PLUGIN</replaceable><literal>:</literal><replaceable
88
88
        >OPTIONS</replaceable> </option></arg>
89
89
      </group>
95
95
        <replaceable>PLUGIN</replaceable> </option></arg>
96
96
      </group>
97
97
      <sbr/>
 
98
      <group rep="repeat">
 
99
        <arg choice="plain"><option>--enable=<replaceable
 
100
        >PLUGIN</replaceable></option></arg>
 
101
        <arg choice="plain"><option>-e
 
102
        <replaceable>PLUGIN</replaceable> </option></arg>
 
103
      </group>
 
104
      <sbr/>
98
105
      <arg><option>--groupid=<replaceable
99
106
      >ID</replaceable></option></arg>
100
107
      <sbr/>
104
111
      <arg><option>--plugin-dir=<replaceable
105
112
      >DIRECTORY</replaceable></option></arg>
106
113
      <sbr/>
 
114
      <arg><option>--config-file=<replaceable
 
115
      >FILE</replaceable></option></arg>
 
116
      <sbr/>
107
117
      <arg><option>--debug</option></arg>
108
118
    </cmdsynopsis>
109
119
    <cmdsynopsis>
130
140
    <title>DESCRIPTION</title>
131
141
    <para>
132
142
      <command>&COMMANDNAME;</command> is a program which is meant to
133
 
      be specified as <quote>keyscript</quote> in <citerefentry>
134
 
      <refentrytitle>crypttab</refentrytitle>
135
 
      <manvolnum>5</manvolnum></citerefentry> for the root disk.  The
136
 
      aim of this program is therefore to output a password, which
137
 
      then <citerefentry><refentrytitle>cryptsetup</refentrytitle>
138
 
      <manvolnum>8</manvolnum></citerefentry> will use to try and
139
 
      unlock the root disk.
 
143
      be specified as a <quote>keyscript</quote> for the root disk in
 
144
      <citerefentry><refentrytitle>crypttab</refentrytitle>
 
145
      <manvolnum>5</manvolnum></citerefentry>.  The aim of this
 
146
      program is therefore to output a password, which then
 
147
      <citerefentry><refentrytitle>cryptsetup</refentrytitle>
 
148
      <manvolnum>8</manvolnum></citerefentry> will use to unlock the
 
149
      root disk.
140
150
    </para>
141
151
    <para>
142
152
      This program is not meant to be invoked directly, but can be in
162
172
        <term><option>--global-env
163
173
        <replaceable>VAR</replaceable><literal>=</literal><replaceable
164
174
        >value</replaceable></option></term>
165
 
        <term><option>-e
 
175
        <term><option>-G
166
176
        <replaceable>VAR</replaceable><literal>=</literal><replaceable
167
177
        >value</replaceable></option></term>
168
178
        <listitem>
179
189
        <replaceable>PLUGIN</replaceable><literal>:</literal
180
190
        ><replaceable>ENV</replaceable><literal>=</literal
181
191
        ><replaceable>value</replaceable></option></term>
182
 
        <term><option>-f
 
192
        <term><option>-E
183
193
        <replaceable>PLUGIN</replaceable><literal>:</literal
184
194
        ><replaceable>ENV</replaceable><literal>=</literal
185
195
        ><replaceable>value</replaceable></option></term>
205
215
            <replaceable>OPTIONS</replaceable> is a comma separated
206
216
            list of options.  This is not a very useful option, except
207
217
            for specifying the <quote><option>--debug</option></quote>
208
 
            for all plugins.
 
218
            option to all plugins.
209
219
          </para>
210
220
        </listitem>
211
221
      </varlistentry>
231
241
            <option>--bar</option> with the option argument
232
242
            <quote>baz</quote> is either
233
243
            <userinput>--options-for=foo:--bar=baz</userinput> or
234
 
            <userinput>--options-for=foo:--bar,baz</userinput>, but
235
 
            <emphasis>not</emphasis>
236
 
            <userinput>--options-for="foo:--bar baz"</userinput>.
 
244
            <userinput>--options-for=foo:--bar,baz</userinput>.  Using
 
245
            <userinput>--options-for="foo:--bar baz"</userinput>. will
 
246
            <emphasis>not</emphasis> work.
237
247
          </para>
238
248
        </listitem>
239
249
      </varlistentry>
240
250
 
241
251
      <varlistentry>
242
 
        <term><option> --disable
 
252
        <term><option>--disable
243
253
        <replaceable>PLUGIN</replaceable></option></term>
244
254
        <term><option>-d
245
255
        <replaceable>PLUGIN</replaceable></option></term>
253
263
      </varlistentry>
254
264
 
255
265
      <varlistentry>
 
266
        <term><option>--enable
 
267
        <replaceable>PLUGIN</replaceable></option></term>
 
268
        <term><option>-e
 
269
        <replaceable>PLUGIN</replaceable></option></term>
 
270
        <listitem>
 
271
          <para>
 
272
            Re-enable the plugin named
 
273
            <replaceable>PLUGIN</replaceable>.  This is only useful to
 
274
            undo a previous <option>--disable</option> option, maybe
 
275
            from the configuration file.
 
276
          </para>
 
277
        </listitem>
 
278
      </varlistentry>
 
279
 
 
280
      <varlistentry>
256
281
        <term><option>--groupid
257
282
        <replaceable>ID</replaceable></option></term>
258
283
        <listitem>
292
317
      </varlistentry>
293
318
      
294
319
      <varlistentry>
 
320
        <term><option>--config-file
 
321
        <replaceable>FILE</replaceable></option></term>
 
322
        <listitem>
 
323
          <para>
 
324
            Specify a different file to read additional options from.
 
325
            See <xref linkend="files"/>.  Other command line options
 
326
            will override options specified in the file.
 
327
          </para>
 
328
        </listitem>
 
329
      </varlistentry>
 
330
      
 
331
      <varlistentry>
295
332
        <term><option>--debug</option></term>
296
333
        <listitem>
297
334
          <para>
366
403
      code will make this plugin-runner output the password from that
367
404
      plugin, stop any other plugins, and exit.
368
405
    </para>
 
406
 
 
407
    <refsect2 id="writing_plugins">
 
408
      <title>WRITING PLUGINS</title>
 
409
      <para>
 
410
        A plugin is simply a program which prints a password to its
 
411
        standard output and then exits with a successful (zero) exit
 
412
        status.  If the exit status is not zero, any output on
 
413
        standard output will be ignored by the plugin runner.  Any
 
414
        output on its standard error channel will simply be passed to
 
415
        the standard error of the plugin runner, usually the system
 
416
        console.
 
417
      </para>
 
418
      <para>
 
419
        The plugin will run in the initial RAM disk environment, so
 
420
        care must be taken not to depend on any files or running
 
421
        services not available there.
 
422
      </para>
 
423
      <para>
 
424
        The plugin must exit cleanly and free all allocated resources
 
425
        upon getting the TERM signal, since this is what the plugin
 
426
        runner uses to stop all other plugins when one plugin has
 
427
        output a password and exited cleanly.
 
428
      </para>
 
429
      <para>
 
430
        The plugin must not use resources, like for instance reading
 
431
        from the standard input, without knowing that no other plugin
 
432
        is also using it.
 
433
      </para>
 
434
      <para>
 
435
        It is useful, but not required, for the plugin to take the
 
436
        <option>--debug</option> option.
 
437
      </para>
 
438
    </refsect2>
369
439
  </refsect1>
370
440
  
371
441
  <refsect1 id="fallback">
393
463
  <refsect1 id="environment">
394
464
    <title>ENVIRONMENT</title>
395
465
    <para>
396
 
      
 
466
      This program does not use any environment variables itself, it
 
467
      only passes on its environment to all the plugins.  The
 
468
      environment passed to plugins can be modified using the
 
469
      <option>--global-env</option> and <option>--env-for</option>
 
470
      options.
397
471
    </para>
398
472
  </refsect1>
399
473
  
400
 
  <refsect1 id="file">
 
474
  <refsect1 id="files">
401
475
    <title>FILES</title>
402
476
    <para>
403
477
      <variablelist>
415
489
              of a line is ignored.
416
490
            </para>
417
491
            <para>
 
492
              This program is meant to run in the initial RAM disk
 
493
              environment, so that is where this file is assumed to
 
494
              exist.  The file does not need to exist in the normal
 
495
              file system.
 
496
            </para>
 
497
            <para>
418
498
              This file will be processed <emphasis>before</emphasis>
419
499
              the normal command line options, so the latter can
420
500
              override the former, if need be.
421
501
            </para>
 
502
            <para>
 
503
              This file name is the default; the file to read for
 
504
              arguments can be changed using the
 
505
              <option>--config-file</option> option.
 
506
            </para>
422
507
          </listitem>
423
508
        </varlistentry>
424
509
      </variablelist>
428
513
  <refsect1 id="bugs">
429
514
    <title>BUGS</title>
430
515
    <para>
431
 
      There is no <option>--enable</option> option to enable disabled
432
 
      plugins.
 
516
      The <option>--config-file</option> option is ignored when
 
517
      specified from within a configuration file.
433
518
    </para>
434
519
  </refsect1>
435
520
  
436
521
  <refsect1 id="examples">
437
522
    <title>EXAMPLE</title>
438
 
    <para>
439
 
    </para>
 
523
    <informalexample>
 
524
      <para>
 
525
        Normal invocation needs no options:
 
526
      </para>
 
527
      <para>
 
528
        <userinput>&COMMANDNAME;</userinput>
 
529
      </para>
 
530
    </informalexample>
 
531
    <informalexample>
 
532
      <para>
 
533
        Run the program, but not the plugins, in debug mode:
 
534
      </para>
 
535
      <para>
 
536
        
 
537
        <!-- do not wrap this line -->
 
538
        <userinput>&COMMANDNAME; --debug</userinput>
 
539
        
 
540
      </para>
 
541
    </informalexample>
 
542
    <informalexample>
 
543
      <para>
 
544
        Run all plugins, but run the <quote>foo</quote> plugin in
 
545
        debug mode:
 
546
      </para>
 
547
      <para>
 
548
        
 
549
        <!-- do not wrap this line -->
 
550
        <userinput>&COMMANDNAME; --options-for=foo:--debug</userinput>
 
551
        
 
552
      </para>
 
553
    </informalexample>
 
554
    <informalexample>
 
555
      <para>
 
556
        Run all plugins, but not the program, in debug mode:
 
557
      </para>
 
558
      <para>
 
559
        
 
560
        <!-- do not wrap this line -->
 
561
        <userinput>&COMMANDNAME; --global-options=--debug</userinput>
 
562
        
 
563
      </para>
 
564
    </informalexample>
 
565
    <informalexample>
 
566
      <para>
 
567
        Run plugins from a different directory, read a different
 
568
        configuration file, and add two options to the
 
569
        <citerefentry><refentrytitle >password-request</refentrytitle>
 
570
        <manvolnum>8mandos</manvolnum></citerefentry> plugin:
 
571
      </para>
 
572
      <para>
 
573
 
 
574
<!-- do not wrap this line -->
 
575
<userinput>&COMMANDNAME;  --config-file=/etc/mandos/plugin-runner.conf --plugin-dir /usr/lib/mandos/plugins.d --options-for=password-request:--pubkey=/etc/keys/mandos/pubkey.txt,--seckey=/etc/keys/mandos/seckey.txt</userinput>
 
576
 
 
577
      </para>
 
578
    </informalexample>
440
579
  </refsect1>
441
 
  
442
580
  <refsect1 id="security">
443
581
    <title>SECURITY</title>
444
582
    <para>
 
583
      This program will, when starting, try to switch to another user.
 
584
      If it is started as root, it will succeed, and will by default
 
585
      switch to user and group 65534, which are assumed to be
 
586
      non-privileged.  This user and group is then what all plugins
 
587
      will be started as.  Therefore, the only way to run a plugin as
 
588
      a privileged user is to have the set-user-ID or set-group-ID bit
 
589
      set on the plugin executable file (see <citerefentry>
 
590
      <refentrytitle>execve</refentrytitle><manvolnum>2</manvolnum>
 
591
      </citerefentry>).
 
592
    </para>
 
593
    <para>
 
594
      If this program is used as a keyscript in <citerefentry
 
595
      ><refentrytitle>crypttab</refentrytitle><manvolnum>5</manvolnum>
 
596
      </citerefentry>, there is a slight risk that if this program
 
597
      fails to work, there might be no way to boot the system except
 
598
      for booting from another media and editing the initial RAM disk
 
599
      image to not run this program.  This is, however, unlikely,
 
600
      since the <citerefentry><refentrytitle
 
601
      >password-prompt</refentrytitle><manvolnum>8mandos</manvolnum>
 
602
      </citerefentry> plugin will read a password from the console in
 
603
      case of failure of the other plugins, and this plugin runner
 
604
      will also, in case of catastrophic failure, itself fall back to
 
605
      asking and outputting a password on the console (see <xref
 
606
      linkend="fallback"/>).
445
607
    </para>
446
608
  </refsect1>
447
609
  
450
612
    <para>
451
613
      <citerefentry><refentrytitle>cryptsetup</refentrytitle>
452
614
      <manvolnum>8</manvolnum></citerefentry>,
 
615
      <citerefentry><refentrytitle>crypttab</refentrytitle>
 
616
      <manvolnum>5</manvolnum></citerefentry>,
 
617
      <citerefentry><refentrytitle>execve</refentrytitle>
 
618
      <manvolnum>2</manvolnum></citerefentry>,
453
619
      <citerefentry><refentrytitle>mandos</refentrytitle>
454
620
      <manvolnum>8</manvolnum></citerefentry>,
455
621
      <citerefentry><refentrytitle>password-prompt</refentrytitle>