/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 07:11:24 UTC
  • Revision ID: teddy@fukt.bsnet.se-20080905071124-9dq11jq5rfd6zfxf
* Makefile: Changed to use symbolic instead of octal modes throughout.
  (KEYDIR): New variable for the key directory.
  (install-server): Bug fix: remove "--parents" from install args.
  (install-client): Bug fix: - '' -  Also create key directory.  Do
                    not chmod plugin dir.  Create custom plugin directory
                    if not the same as normal plugin directory.  Add
                    "--dir" option to "mandos-keygen".  Add note about
                    running "mandos-keygen --password".
  (uninstall-server): Do not depend on the installed server binary,
                      since this made it impossible to do a purge
                      after an uninstall.
  (purge-client): Shred seckey.txt.  Use $(KEYDIR).

* README: Improved wording.

* initramfs-tools-hook: Use a loop to find prefix.  Also find keydir.
                        Remove "${DESTDIR}" from "copy_exec".  Do not
                        try to copy literal "*" if no custom plugins
                        are found.  Copy key files from keydir, not
                        config dir.  Only repair mode on directories
                        that actually exist.  Do not run chmod if
                        nothing needs repairing.

* plugin-runner.conf: New file.

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-04">
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>
169
179
          <para>
170
 
            
 
180
            This option will add an environment variable setting to
 
181
            all plugins.  This will override any inherited environment
 
182
            variable.
171
183
          </para>
172
184
        </listitem>
173
185
      </varlistentry>
177
189
        <replaceable>PLUGIN</replaceable><literal>:</literal
178
190
        ><replaceable>ENV</replaceable><literal>=</literal
179
191
        ><replaceable>value</replaceable></option></term>
180
 
        <term><option>-f
 
192
        <term><option>-E
181
193
        <replaceable>PLUGIN</replaceable><literal>:</literal
182
194
        ><replaceable>ENV</replaceable><literal>=</literal
183
195
        ><replaceable>value</replaceable></option></term>
184
196
        <listitem>
185
197
          <para>
 
198
            This option will add an environment variable setting to
 
199
            the <replaceable>PLUGIN</replaceable> plugin.  This will
 
200
            override any inherited environment variables or
 
201
            environment variables specified using
 
202
            <option>--global-env</option>.
186
203
          </para>
187
204
        </listitem>
188
205
      </varlistentry>
198
215
            <replaceable>OPTIONS</replaceable> is a comma separated
199
216
            list of options.  This is not a very useful option, except
200
217
            for specifying the <quote><option>--debug</option></quote>
201
 
            for all plugins.
 
218
            option to all plugins.
202
219
          </para>
203
220
        </listitem>
204
221
      </varlistentry>
224
241
            <option>--bar</option> with the option argument
225
242
            <quote>baz</quote> is either
226
243
            <userinput>--options-for=foo:--bar=baz</userinput> or
227
 
            <userinput>--options-for=foo:--bar,baz</userinput>, but
228
 
            <emphasis>not</emphasis>
229
 
            <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.
230
247
          </para>
231
248
        </listitem>
232
249
      </varlistentry>
233
250
 
234
251
      <varlistentry>
235
 
        <term><option> --disable
 
252
        <term><option>--disable
236
253
        <replaceable>PLUGIN</replaceable></option></term>
237
254
        <term><option>-d
238
255
        <replaceable>PLUGIN</replaceable></option></term>
246
263
      </varlistentry>
247
264
 
248
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>
249
281
        <term><option>--groupid
250
282
        <replaceable>ID</replaceable></option></term>
251
283
        <listitem>
285
317
      </varlistentry>
286
318
      
287
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>
288
332
        <term><option>--debug</option></term>
289
333
        <listitem>
290
334
          <para>
359
403
      code will make this plugin-runner output the password from that
360
404
      plugin, stop any other plugins, and exit.
361
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>
362
439
  </refsect1>
363
440
  
364
441
  <refsect1 id="fallback">
386
463
  <refsect1 id="environment">
387
464
    <title>ENVIRONMENT</title>
388
465
    <para>
389
 
      
 
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.
390
471
    </para>
391
472
  </refsect1>
392
473
  
393
 
  <refsect1 id="file">
 
474
  <refsect1 id="files">
394
475
    <title>FILES</title>
395
476
    <para>
396
477
      <variablelist>
407
488
              everything from a <quote>#</quote> character to the end
408
489
              of a line is ignored.
409
490
            </para>
 
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>
 
498
              This file will be processed <emphasis>before</emphasis>
 
499
              the normal command line options, so the latter can
 
500
              override the former, if need be.
 
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>
410
507
          </listitem>
411
508
        </varlistentry>
412
509
      </variablelist>
416
513
  <refsect1 id="bugs">
417
514
    <title>BUGS</title>
418
515
    <para>
 
516
      The <option>--config-file</option> option is ignored when
 
517
      specified from within a configuration file.
419
518
    </para>
420
519
  </refsect1>
421
520
  
422
521
  <refsect1 id="examples">
423
522
    <title>EXAMPLE</title>
424
 
    <para>
425
 
    </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 and add two
 
568
        options to the <citerefentry><refentrytitle
 
569
        >password-request</refentrytitle>
 
570
        <manvolnum>8mandos</manvolnum></citerefentry> plugin:
 
571
      </para>
 
572
      <para>
 
573
 
 
574
<!-- do not wrap this line -->
 
575
<userinput>&COMMANDNAME;  --plugin-dir=plugins.d --options-for=password-request:--pubkey=keydir/pubkey.txt,--seckey=keydir/seckey.txt</userinput>
 
576
 
 
577
      </para>
 
578
    </informalexample>
426
579
  </refsect1>
427
 
  
428
580
  <refsect1 id="security">
429
581
    <title>SECURITY</title>
430
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 files (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"/>).
431
607
    </para>
432
608
  </refsect1>
433
609
  
436
612
    <para>
437
613
      <citerefentry><refentrytitle>cryptsetup</refentrytitle>
438
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>,
439
619
      <citerefentry><refentrytitle>mandos</refentrytitle>
440
620
      <manvolnum>8</manvolnum></citerefentry>,
441
621
      <citerefentry><refentrytitle>password-prompt</refentrytitle>