/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-06 15:34:21 UTC
  • Revision ID: teddy@fukt.bsnet.se-20080906153421-605ydhwyo404krh9
* initramfs-tools-hook: Use long options where available.  Use only
                        one "test" invocation instead of several.

* mandos-keygen: Use only one "test" invocation instead of several.
                 Use long options where available.  Strip newline from
                 entered password.

* plugin-runner.c (print_out_password): Do not strip trailing newline.
  (fallback): Strip trailing newline from getpass().

* plugin-runner.xml (PLUGINS): Plugins should not print trailing
                               newlines.

* plugins.d/password-prompt.c (main): Strip trailing newline.

* plugins.d/password-request.c (main): Bug fix: Read "pubkey.txt", not
                                       "pupkey.txt".

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-02">
 
6
<!ENTITY TIMESTAMP "2008-09-06">
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
 
140
140
    <title>DESCRIPTION</title>
141
141
    <para>
142
142
      <command>&COMMANDNAME;</command> is a program which is meant to
143
 
      be specified as <quote>keyscript</quote> in <citerefentry>
144
 
      <refentrytitle>crypttab</refentrytitle>
145
 
      <manvolnum>5</manvolnum></citerefentry> for the root disk.  The
146
 
      aim of this program is therefore to output a password, which
147
 
      then <citerefentry><refentrytitle>cryptsetup</refentrytitle>
148
 
      <manvolnum>8</manvolnum></citerefentry> will use to try and
149
 
      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.
150
150
    </para>
151
151
    <para>
152
152
      This program is not meant to be invoked directly, but can be in
172
172
        <term><option>--global-env
173
173
        <replaceable>VAR</replaceable><literal>=</literal><replaceable
174
174
        >value</replaceable></option></term>
175
 
        <term><option>-e
 
175
        <term><option>-G
176
176
        <replaceable>VAR</replaceable><literal>=</literal><replaceable
177
177
        >value</replaceable></option></term>
178
178
        <listitem>
189
189
        <replaceable>PLUGIN</replaceable><literal>:</literal
190
190
        ><replaceable>ENV</replaceable><literal>=</literal
191
191
        ><replaceable>value</replaceable></option></term>
192
 
        <term><option>-f
 
192
        <term><option>-E
193
193
        <replaceable>PLUGIN</replaceable><literal>:</literal
194
194
        ><replaceable>ENV</replaceable><literal>=</literal
195
195
        ><replaceable>value</replaceable></option></term>
215
215
            <replaceable>OPTIONS</replaceable> is a comma separated
216
216
            list of options.  This is not a very useful option, except
217
217
            for specifying the <quote><option>--debug</option></quote>
218
 
            for all plugins.
 
218
            option to all plugins.
219
219
          </para>
220
220
        </listitem>
221
221
      </varlistentry>
241
241
            <option>--bar</option> with the option argument
242
242
            <quote>baz</quote> is either
243
243
            <userinput>--options-for=foo:--bar=baz</userinput> or
244
 
            <userinput>--options-for=foo:--bar,baz</userinput>, but
245
 
            <emphasis>not</emphasis>
246
 
            <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.
247
247
          </para>
248
248
        </listitem>
249
249
      </varlistentry>
272
272
            Re-enable the plugin named
273
273
            <replaceable>PLUGIN</replaceable>.  This is only useful to
274
274
            undo a previous <option>--disable</option> option, maybe
275
 
            from the config file.
 
275
            from the configuration file.
276
276
          </para>
277
277
        </listitem>
278
278
      </varlistentry>
403
403
      code will make this plugin-runner output the password from that
404
404
      plugin, stop any other plugins, and exit.
405
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
        If the password is a single-line, manually entered passprase,
 
420
        a final trailing newline character should
 
421
        <emphasis>not</emphasis> be printed.
 
422
      </para>
 
423
      <para>
 
424
        The plugin will run in the initial RAM disk environment, so
 
425
        care must be taken not to depend on any files or running
 
426
        services not available there.
 
427
      </para>
 
428
      <para>
 
429
        The plugin must exit cleanly and free all allocated resources
 
430
        upon getting the TERM signal, since this is what the plugin
 
431
        runner uses to stop all other plugins when one plugin has
 
432
        output a password and exited cleanly.
 
433
      </para>
 
434
      <para>
 
435
        The plugin must not use resources, like for instance reading
 
436
        from the standard input, without knowing that no other plugin
 
437
        is also using it.
 
438
      </para>
 
439
      <para>
 
440
        It is useful, but not required, for the plugin to take the
 
441
        <option>--debug</option> option.
 
442
      </para>
 
443
    </refsect2>
406
444
  </refsect1>
407
445
  
408
446
  <refsect1 id="fallback">
434
472
      only passes on its environment to all the plugins.  The
435
473
      environment passed to plugins can be modified using the
436
474
      <option>--global-env</option> and <option>--env-for</option>
437
 
      optins.
 
475
      options.
438
476
    </para>
439
477
  </refsect1>
440
478
  
480
518
  <refsect1 id="bugs">
481
519
    <title>BUGS</title>
482
520
    <para>
 
521
      The <option>--config-file</option> option is ignored when
 
522
      specified from within a configuration file.
483
523
    </para>
484
524
  </refsect1>
485
525
  
486
526
  <refsect1 id="examples">
487
527
    <title>EXAMPLE</title>
488
 
    <para>
489
 
    </para>
 
528
    <informalexample>
 
529
      <para>
 
530
        Normal invocation needs no options:
 
531
      </para>
 
532
      <para>
 
533
        <userinput>&COMMANDNAME;</userinput>
 
534
      </para>
 
535
    </informalexample>
 
536
    <informalexample>
 
537
      <para>
 
538
        Run the program, but not the plugins, in debug mode:
 
539
      </para>
 
540
      <para>
 
541
        
 
542
        <!-- do not wrap this line -->
 
543
        <userinput>&COMMANDNAME; --debug</userinput>
 
544
        
 
545
      </para>
 
546
    </informalexample>
 
547
    <informalexample>
 
548
      <para>
 
549
        Run all plugins, but run the <quote>foo</quote> plugin in
 
550
        debug mode:
 
551
      </para>
 
552
      <para>
 
553
        
 
554
        <!-- do not wrap this line -->
 
555
        <userinput>&COMMANDNAME; --options-for=foo:--debug</userinput>
 
556
        
 
557
      </para>
 
558
    </informalexample>
 
559
    <informalexample>
 
560
      <para>
 
561
        Run all plugins, but not the program, in debug mode:
 
562
      </para>
 
563
      <para>
 
564
        
 
565
        <!-- do not wrap this line -->
 
566
        <userinput>&COMMANDNAME; --global-options=--debug</userinput>
 
567
        
 
568
      </para>
 
569
    </informalexample>
 
570
    <informalexample>
 
571
      <para>
 
572
        Run plugins from a different directory, read a different
 
573
        configuration file, and add two options to the
 
574
        <citerefentry><refentrytitle >password-request</refentrytitle>
 
575
        <manvolnum>8mandos</manvolnum></citerefentry> plugin:
 
576
      </para>
 
577
      <para>
 
578
 
 
579
<!-- do not wrap this line -->
 
580
<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>
 
581
 
 
582
      </para>
 
583
    </informalexample>
490
584
  </refsect1>
491
 
  
492
585
  <refsect1 id="security">
493
586
    <title>SECURITY</title>
494
587
    <para>
 
588
      This program will, when starting, try to switch to another user.
 
589
      If it is started as root, it will succeed, and will by default
 
590
      switch to user and group 65534, which are assumed to be
 
591
      non-privileged.  This user and group is then what all plugins
 
592
      will be started as.  Therefore, the only way to run a plugin as
 
593
      a privileged user is to have the set-user-ID or set-group-ID bit
 
594
      set on the plugin executable file (see <citerefentry>
 
595
      <refentrytitle>execve</refentrytitle><manvolnum>2</manvolnum>
 
596
      </citerefentry>).
 
597
    </para>
 
598
    <para>
 
599
      If this program is used as a keyscript in <citerefentry
 
600
      ><refentrytitle>crypttab</refentrytitle><manvolnum>5</manvolnum>
 
601
      </citerefentry>, there is a slight risk that if this program
 
602
      fails to work, there might be no way to boot the system except
 
603
      for booting from another media and editing the initial RAM disk
 
604
      image to not run this program.  This is, however, unlikely,
 
605
      since the <citerefentry><refentrytitle
 
606
      >password-prompt</refentrytitle><manvolnum>8mandos</manvolnum>
 
607
      </citerefentry> plugin will read a password from the console in
 
608
      case of failure of the other plugins, and this plugin runner
 
609
      will also, in case of catastrophic failure, itself fall back to
 
610
      asking and outputting a password on the console (see <xref
 
611
      linkend="fallback"/>).
495
612
    </para>
496
613
  </refsect1>
497
614
  
500
617
    <para>
501
618
      <citerefentry><refentrytitle>cryptsetup</refentrytitle>
502
619
      <manvolnum>8</manvolnum></citerefentry>,
 
620
      <citerefentry><refentrytitle>crypttab</refentrytitle>
 
621
      <manvolnum>5</manvolnum></citerefentry>,
 
622
      <citerefentry><refentrytitle>execve</refentrytitle>
 
623
      <manvolnum>2</manvolnum></citerefentry>,
503
624
      <citerefentry><refentrytitle>mandos</refentrytitle>
504
625
      <manvolnum>8</manvolnum></citerefentry>,
505
626
      <citerefentry><refentrytitle>password-prompt</refentrytitle>