1
1
<?xml version="1.0" encoding="UTF-8"?>
2
2
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
3
3
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
4
<!ENTITY VERSION "1.0">
5
4
<!ENTITY COMMANDNAME "plugin-runner">
6
<!ENTITY TIMESTAMP "2008-09-04">
5
<!ENTITY TIMESTAMP "2025-06-27">
6
<!ENTITY % common SYSTEM "common.ent">
9
10
<refentry xmlns:xi="http://www.w3.org/2001/XInclude">
11
12
<title>Mandos Manual</title>
12
13
<!-- Nwalsh’s docbook scripts use this to generate the footer: -->
13
14
<productname>Mandos</productname>
14
<productnumber>&VERSION;</productnumber>
15
<productnumber>&version;</productnumber>
15
16
<date>&TIMESTAMP;</date>
18
19
<firstname>Björn</firstname>
19
20
<surname>Påhlsson</surname>
21
<email>belorn@fukt.bsnet.se</email>
22
<email>belorn@recompile.se</email>
25
26
<firstname>Teddy</firstname>
26
27
<surname>Hogeborn</surname>
28
<email>teddy@fukt.bsnet.se</email>
29
<email>teddy@recompile.se</email>
34
51
<holder>Teddy Hogeborn</holder>
35
52
<holder>Björn Påhlsson</holder>
37
54
<xi:include href="legalnotice.xml"/>
41
58
<refentrytitle>&COMMANDNAME;</refentrytitle>
42
59
<manvolnum>8mandos</manvolnum>
48
65
Run Mandos plugins, pass data from first to succeed.
54
71
<command>&COMMANDNAME;</command>
55
72
<group rep="repeat">
56
73
<arg choice="plain"><option>--global-env=<replaceable
57
>VAR</replaceable><literal>=</literal><replaceable
74
>ENV</replaceable><literal>=</literal><replaceable
58
75
>value</replaceable></option></arg>
59
76
<arg choice="plain"><option>-G
60
<replaceable>VAR</replaceable><literal>=</literal><replaceable
77
<replaceable>ENV</replaceable><literal>=</literal><replaceable
61
78
>value</replaceable> </option></arg>
111
128
<arg><option>--plugin-dir=<replaceable
112
129
>DIRECTORY</replaceable></option></arg>
131
<arg><option>--plugin-helper-dir=<replaceable
132
>DIRECTORY</replaceable></option></arg>
114
134
<arg><option>--config-file=<replaceable
115
135
>FILE</replaceable></option></arg>
172
192
<term><option>--global-env
173
<replaceable>VAR</replaceable><literal>=</literal><replaceable
193
<replaceable>ENV</replaceable><literal>=</literal><replaceable
174
194
>value</replaceable></option></term>
176
<replaceable>VAR</replaceable><literal>=</literal><replaceable
196
<replaceable>ENV</replaceable><literal>=</literal><replaceable
177
197
>value</replaceable></option></term>
340
<term><option>--plugin-helper-dir
341
<replaceable>DIRECTORY</replaceable></option></term>
344
Specify a different plugin helper directory. The default
345
is <filename>/lib/mandos/plugin-helpers</filename>, which
346
will exist in the initial <acronym>RAM</acronym> disk
347
environment. (This will simply be passed to all plugins
348
via the <envar>MANDOSPLUGINHELPERDIR</envar> environment
349
variable. See <xref linkend="writing_plugins"/>)
320
355
<term><option>--config-file
321
356
<replaceable>FILE</replaceable></option></term>
393
428
<title>PLUGINS</title>
395
430
This program will get a password by running a number of
396
<firstterm>plugins</firstterm>, which are simply executable
397
programs in a directory in the initial <acronym>RAM</acronym>
398
disk environment. The default directory is
431
<firstterm>plugins</firstterm>, which are executable programs in
432
a directory in the initial <acronym>RAM</acronym> disk
433
environment. The default directory is
399
434
<filename>/lib/mandos/plugins.d</filename>, but this can be
400
435
changed with the <option>--plugin-dir</option> option. The
401
436
plugins are started in parallel, and the first plugin to output
403
438
code will make this plugin-runner output the password from that
404
439
plugin, stop any other plugins, and exit.
407
442
<refsect2 id="writing_plugins">
408
443
<title>WRITING PLUGINS</title>
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
445
A plugin is an executable program which prints a password to
446
its standard output and then exits with a successful (zero)
447
exit status. If the exit status is not zero, any output on
413
448
standard output will be ignored by the plugin runner. Any
414
449
output on its standard error channel will simply be passed to
415
450
the standard error of the plugin runner, usually the system
454
If the password is a single-line, manually entered passprase,
455
a final trailing newline character should
456
<emphasis>not</emphasis> be printed.
419
459
The plugin will run in the initial RAM disk environment, so
420
460
care must be taken not to depend on any files or running
421
services not available there.
461
services not available there. Any helper executables required
462
by the plugin (which are not in the <envar>PATH</envar>) can
463
be placed in the plugin helper directory, the name of which
464
will be made available to the plugin via the
465
<envar>MANDOSPLUGINHELPERDIR</envar> environment variable.
424
468
The plugin must exit cleanly and free all allocated resources
467
511
only passes on its environment to all the plugins. The
468
512
environment passed to plugins can be modified using the
469
513
<option>--global-env</option> and <option>--env-for</option>
514
options. Also, the <option>--plugin-helper-dir</option> option
515
will affect the environment variable
516
<envar>MANDOSPLUGINHELPERDIR</envar> for the plugins.
556
<term><filename class="directory"
557
>/lib/mandos/plugins.d</filename></term>
560
The default plugin directory; can be changed by the
561
<option>--plugin-dir</option> option.
566
<term><filename class="directory"
567
>/lib/mandos/plugin-helpers</filename></term>
570
The default plugin helper directory; can be changed by
571
the <option>--plugin-helper-dir</option> option.
564
631
</informalexample>
565
632
<informalexample>
567
Run plugins from a different directory and add two
568
options to the <citerefentry><refentrytitle
569
>password-request</refentrytitle>
634
Read a different configuration file, run plugins from a
635
different directory, specify an alternate plugin helper
636
directory and add four options to the
637
<citerefentry><refentrytitle >mandos-client</refentrytitle>
570
638
<manvolnum>8mandos</manvolnum></citerefentry> plugin:
574
642
<!-- 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>
643
<userinput>cd /etc/keys/mandos; &COMMANDNAME; --config-file=/etc/mandos/plugin-runner.conf --plugin-dir /usr/lib/x86_64-linux-gnu/mandos/plugins.d --plugin-helper-dir /usr/lib/x86_64-linux-gnu/mandos/plugin-helpers --options-for=mandos-client:--pubkey=pubkey.txt,​--seckey=seckey.txt,​--tls-pubkey=tls-pubkey.pem,​--tls-privkey=tls-privkey.pem</userinput>
578
646
</informalexample>
586
654
non-privileged. This user and group is then what all plugins
587
655
will be started as. Therefore, the only way to run a plugin as
588
656
a privileged user is to have the set-user-ID or set-group-ID bit
589
set on the plugin executable files (see <citerefentry>
657
set on the plugin executable file (see <citerefentry>
590
658
<refentrytitle>execve</refentrytitle><manvolnum>2</manvolnum>
591
659
</citerefentry>).
610
678
<refsect1 id="see_also">
611
679
<title>SEE ALSO</title>
681
<citerefentry><refentrytitle>intro</refentrytitle>
682
<manvolnum>8mandos</manvolnum></citerefentry>,
613
683
<citerefentry><refentrytitle>cryptsetup</refentrytitle>
614
684
<manvolnum>8</manvolnum></citerefentry>,
615
685
<citerefentry><refentrytitle>crypttab</refentrytitle>
620
690
<manvolnum>8</manvolnum></citerefentry>,
621
691
<citerefentry><refentrytitle>password-prompt</refentrytitle>
622
692
<manvolnum>8mandos</manvolnum></citerefentry>,
623
<citerefentry><refentrytitle>password-request</refentrytitle>
693
<citerefentry><refentrytitle>mandos-client</refentrytitle>
624
694
<manvolnum>8mandos</manvolnum></citerefentry>