/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 plugins.d/mandos-client.xml

  • Committer: Teddy Hogeborn
  • Date: 2012-06-15 17:18:34 UTC
  • mto: (301.1.1 release) (237.7.272 trunk)
  • mto: This revision was merged to the branch mainline in revision 302.
  • Revision ID: teddy@recompile.se-20120615171834-gzzgknth003j903u
* plugins.d/mandos-client.c (main): Bug fix: Set DEVICE environment
                                    variable correctly for network
                                    hooks.  Also, don't call
                                    run_network_hooks() with NULL
                                    value.

Show diffs side-by-side

added added

removed removed

Lines of Context:
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
4
<!ENTITY COMMANDNAME "mandos-client">
5
 
<!ENTITY TIMESTAMP "2023-10-21">
 
5
<!ENTITY TIMESTAMP "2012-06-13">
6
6
<!ENTITY % common SYSTEM "../common.ent">
7
7
%common;
8
8
]>
33
33
    <copyright>
34
34
      <year>2008</year>
35
35
      <year>2009</year>
36
 
      <year>2010</year>
37
 
      <year>2011</year>
38
36
      <year>2012</year>
39
 
      <year>2013</year>
40
 
      <year>2014</year>
41
 
      <year>2015</year>
42
 
      <year>2016</year>
43
 
      <year>2017</year>
44
 
      <year>2018</year>
45
 
      <year>2019</year>
46
37
      <holder>Teddy Hogeborn</holder>
47
38
      <holder>Björn Påhlsson</holder>
48
39
    </copyright>
96
87
        <replaceable>FILE</replaceable></option></arg>
97
88
      </group>
98
89
      <sbr/>
99
 
      <group>
100
 
        <arg choice="plain"><option>--tls-privkey
101
 
        <replaceable>FILE</replaceable></option></arg>
102
 
        <arg choice="plain"><option>-t
103
 
        <replaceable>FILE</replaceable></option></arg>
104
 
      </group>
105
 
      <sbr/>
106
 
      <group>
107
 
        <arg choice="plain"><option>--tls-pubkey
108
 
        <replaceable>FILE</replaceable></option></arg>
109
 
        <arg choice="plain"><option>-T
110
 
        <replaceable>FILE</replaceable></option></arg>
111
 
      </group>
112
 
      <sbr/>
113
90
      <arg>
114
91
        <option>--priority <replaceable>STRING</replaceable></option>
115
92
      </arg>
119
96
      </arg>
120
97
      <sbr/>
121
98
      <arg>
122
 
        <option>--dh-params <replaceable>FILE</replaceable></option>
123
 
      </arg>
124
 
      <sbr/>
125
 
      <arg>
126
99
        <option>--delay <replaceable>SECONDS</replaceable></option>
127
100
      </arg>
128
101
      <sbr/>
169
142
      brings up network interfaces, uses the interfaces’ IPv6
170
143
      link-local addresses to get network connectivity, uses Zeroconf
171
144
      to find servers on the local network, and communicates with
172
 
      servers using TLS with a raw public key to ensure authenticity
173
 
      and confidentiality.  This client program keeps running, trying
174
 
      all servers on the network, until it receives a satisfactory
175
 
      reply or a TERM signal.  After all servers have been tried, all
 
145
      servers using TLS with an OpenPGP key to ensure authenticity and
 
146
      confidentiality.  This client program keeps running, trying all
 
147
      servers on the network, until it receives a satisfactory reply
 
148
      or a TERM signal.  After all servers have been tried, all
176
149
      servers are periodically retried.  If no servers are found it
177
150
      will wait indefinitely for new servers to appear.
178
151
    </para>
196
169
    </para>
197
170
    <para>
198
171
      This program is not meant to be run directly; it is really meant
199
 
      to be run by other programs in the initial
200
 
      <acronym>RAM</acronym> disk environment; see <xref
201
 
      linkend="overview"/>.
 
172
      to run as a plugin of the <application>Mandos</application>
 
173
      <citerefentry><refentrytitle>plugin-runner</refentrytitle>
 
174
      <manvolnum>8mandos</manvolnum></citerefentry>, which runs in the
 
175
      initial <acronym>RAM</acronym> disk environment because it is
 
176
      specified as a <quote>keyscript</quote> in the <citerefentry>
 
177
      <refentrytitle>crypttab</refentrytitle><manvolnum>5</manvolnum>
 
178
      </citerefentry> file.
202
179
    </para>
203
180
  </refsect1>
204
181
  
216
193
    <title>OPTIONS</title>
217
194
    <para>
218
195
      This program is commonly not invoked from the command line; it
219
 
      is normally started by another program as described in <xref
220
 
      linkend="description"/>.  Any command line options this program
221
 
      accepts are therefore normally provided by the invoking program,
222
 
      and not directly.
 
196
      is normally started by the <application>Mandos</application>
 
197
      plugin runner, see <citerefentry><refentrytitle
 
198
      >plugin-runner</refentrytitle><manvolnum>8mandos</manvolnum>
 
199
      </citerefentry>.  Any command line options this program accepts
 
200
      are therefore normally provided by the plugin runner, and not
 
201
      directly.
223
202
    </para>
224
203
    
225
204
    <variablelist>
239
218
            assumed to separate the address from the port number.
240
219
          </para>
241
220
          <para>
242
 
            Normally, Zeroconf would be used to locate Mandos servers,
243
 
            in which case this option would only be used when testing
244
 
            and debugging.
 
221
            This option is normally only useful for testing and
 
222
            debugging.
245
223
          </para>
246
224
        </listitem>
247
225
      </varlistentry>
248
226
      
249
227
      <varlistentry>
250
228
        <term><option>--interface=<replaceable
251
 
        >NAME</replaceable><arg rep='repeat'>,<replaceable
252
 
        >NAME</replaceable></arg></option></term>
 
229
        >NAME</replaceable></option></term>
253
230
        <term><option>-i
254
 
        <replaceable>NAME</replaceable><arg rep='repeat'>,<replaceable
255
 
        >NAME</replaceable></arg></option></term>
 
231
        <replaceable>NAME</replaceable></option></term>
256
232
        <listitem>
257
233
          <para>
258
234
            Comma separated list of network interfaces that will be
261
237
            use all appropriate interfaces.
262
238
          </para>
263
239
          <para>
264
 
            If the <option>--connect</option> option is used, and
265
 
            exactly one interface name is specified (except
266
 
            <quote><literal>none</literal></quote>), this specifies
267
 
            the interface to use to connect to the address given.
 
240
            If the <option>--connect</option> option is used, this
 
241
            specifies the interface to use to connect to the address
 
242
            given.
268
243
          </para>
269
244
          <para>
270
245
            Note that since this program will normally run in the
279
254
          </para>
280
255
          <para>
281
256
            <replaceable>NAME</replaceable> can be the string
282
 
            <quote><literal>none</literal></quote>; this will make
283
 
            <command>&COMMANDNAME;</command> only bring up interfaces
284
 
            specified <emphasis>before</emphasis> this string.  This
285
 
            is not recommended, and only meant for advanced users.
 
257
            <quote><literal>none</literal></quote>; this will not use
 
258
            any specific interface, and will not bring up an interface
 
259
            on startup.  This is not recommended, and only meant for
 
260
            advanced users.
286
261
          </para>
287
262
        </listitem>
288
263
      </varlistentry>
316
291
      </varlistentry>
317
292
      
318
293
      <varlistentry>
319
 
        <term><option>--tls-pubkey=<replaceable
320
 
        >FILE</replaceable></option></term>
321
 
        <term><option>-T
322
 
        <replaceable>FILE</replaceable></option></term>
323
 
        <listitem>
324
 
          <para>
325
 
            TLS raw public key file name.  The default name is
326
 
            <quote><filename>/conf/conf.d/mandos/tls-pubkey.pem</filename
327
 
            ></quote>.
328
 
          </para>
329
 
        </listitem>
330
 
      </varlistentry>
331
 
 
332
 
      <varlistentry>
333
 
        <term><option>--tls-privkey=<replaceable
334
 
        >FILE</replaceable></option></term>
335
 
        <term><option>-t
336
 
        <replaceable>FILE</replaceable></option></term>
337
 
        <listitem>
338
 
          <para>
339
 
            TLS secret key file name.  The default name is
340
 
            <quote><filename>/conf/conf.d/mandos/tls-privkey.pem</filename
341
 
            ></quote>.
342
 
          </para>
343
 
        </listitem>
344
 
      </varlistentry>
345
 
 
346
 
      <varlistentry>
347
294
        <term><option>--priority=<replaceable
348
295
        >STRING</replaceable></option></term>
349
296
        <listitem>
358
305
        <listitem>
359
306
          <para>
360
307
            Sets the number of bits to use for the prime number in the
361
 
            TLS Diffie-Hellman key exchange.  The default value is
362
 
            selected automatically based on the GnuTLS security
363
 
            profile set in its priority string.  Note that if the
364
 
            <option>--dh-params</option> option is used, the values
365
 
            from that file will be used instead.
366
 
          </para>
367
 
        </listitem>
368
 
      </varlistentry>
369
 
      
370
 
      <varlistentry>
371
 
        <term><option>--dh-params=<replaceable
372
 
        >FILE</replaceable></option></term>
373
 
        <listitem>
374
 
          <para>
375
 
            Specifies a PEM-encoded PKCS#3 file to read the parameters
376
 
            needed by the TLS Diffie-Hellman key exchange from.  If
377
 
            this option is not given, or if the file for some reason
378
 
            could not be used, the parameters will be generated on
379
 
            startup, which will take some time and processing power.
380
 
            Those using servers running under time, power or processor
381
 
            constraints may want to generate such a file in advance
382
 
            and use this option.
 
308
            TLS Diffie-Hellman key exchange.  Default is 1024.
383
309
          </para>
384
310
        </listitem>
385
311
      </varlistentry>
476
402
    <title>OVERVIEW</title>
477
403
    <xi:include href="../overview.xml"/>
478
404
    <para>
479
 
      This program is the client part.  It is run automatically in an
480
 
      initial <acronym>RAM</acronym> disk environment.
481
 
    </para>
482
 
    <para>
483
 
      In an initial <acronym>RAM</acronym> disk environment using
484
 
      <citerefentry><refentrytitle>systemd</refentrytitle>
485
 
      <manvolnum>1</manvolnum></citerefentry>, this program is started
486
 
      by the <application>Mandos</application> <citerefentry>
487
 
      <refentrytitle>password-agent</refentrytitle>
488
 
      <manvolnum>8mandos</manvolnum></citerefentry>, which in turn is
489
 
      started automatically by the <citerefentry>
490
 
      <refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum>
491
 
      </citerefentry> <quote>Password Agent</quote> system.
492
 
    </para>
493
 
    <para>
494
 
      In the case of a non-<citerefentry>
495
 
      <refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum>
496
 
      </citerefentry> environment, this program is started as a plugin
497
 
      of the <application>Mandos</application> <citerefentry>
498
 
      <refentrytitle>plugin-runner</refentrytitle>
499
 
      <manvolnum>8mandos</manvolnum></citerefentry>, which runs in the
500
 
      initial <acronym>RAM</acronym> disk environment because it is
501
 
      specified as a <quote>keyscript</quote> in the <citerefentry>
502
 
      <refentrytitle>crypttab</refentrytitle><manvolnum>5</manvolnum>
503
 
      </citerefentry> file.
 
405
      This program is the client part.  It is a plugin started by
 
406
      <citerefentry><refentrytitle>plugin-runner</refentrytitle>
 
407
      <manvolnum>8mandos</manvolnum></citerefentry> which will run in
 
408
      an initial <acronym>RAM</acronym> disk environment.
504
409
    </para>
505
410
    <para>
506
411
      This program could, theoretically, be used as a keyscript in
507
412
      <filename>/etc/crypttab</filename>, but it would then be
508
413
      impossible to enter a password for the encrypted root disk at
509
414
      the console, since this program does not read from the console
510
 
      at all.
 
415
      at all.  This is why a separate plugin runner (<citerefentry>
 
416
      <refentrytitle>plugin-runner</refentrytitle>
 
417
      <manvolnum>8mandos</manvolnum></citerefentry>) is used to run
 
418
      both this program and others in in parallel,
 
419
      <emphasis>one</emphasis> of which (<citerefentry>
 
420
      <refentrytitle>password-prompt</refentrytitle>
 
421
      <manvolnum>8mandos</manvolnum></citerefentry>) will prompt for
 
422
      passwords on the system console.
511
423
    </para>
512
424
  </refsect1>
513
425
  
526
438
  
527
439
  <refsect1 id="environment">
528
440
    <title>ENVIRONMENT</title>
529
 
    <variablelist>
530
 
      <varlistentry>
531
 
        <term><envar>MANDOSPLUGINHELPERDIR</envar></term>
532
 
        <listitem>
533
 
          <para>
534
 
            This environment variable will be assumed to contain the
535
 
            directory containing any helper executables.  The use and
536
 
            nature of these helper executables, if any, is purposely
537
 
            not documented.
538
 
        </para>
539
 
        </listitem>
540
 
      </varlistentry>
541
 
    </variablelist>
542
441
    <para>
543
 
      This program does not use any other environment variables, not
544
 
      even the ones provided by <citerefentry><refentrytitle
 
442
      This program does not use any environment variables, not even
 
443
      the ones provided by <citerefentry><refentrytitle
545
444
      >cryptsetup</refentrytitle><manvolnum>8</manvolnum>
546
445
    </citerefentry>.
547
446
    </para>
609
508
              It is not necessary to print any non-executable files
610
509
              already in the network hook directory, these will be
611
510
              copied implicitly if they otherwise satisfy the name
612
 
              requirements.
 
511
              requirement.
613
512
            </para>
614
513
          </listitem>
615
514
        </varlistentry>
734
633
        </listitem>
735
634
      </varlistentry>
736
635
      <varlistentry>
737
 
        <term><filename>/conf/conf.d/mandos/tls-pubkey.pem</filename
738
 
        ></term>
739
 
        <term><filename>/conf/conf.d/mandos/tls-privkey.pem</filename
740
 
        ></term>
741
 
        <listitem>
742
 
          <para>
743
 
            Public and private raw key files, in <quote>PEM</quote>
744
 
            format.  These are the default file names, they can be
745
 
            changed with the <option>--tls-pubkey</option> and
746
 
            <option>--tls-privkey</option> options.
747
 
          </para>
748
 
        </listitem>
749
 
      </varlistentry>
750
 
      <varlistentry>
751
636
        <term><filename
752
637
        class="directory">/lib/mandos/network-hooks.d</filename></term>
753
638
        <listitem>
761
646
    </variablelist>
762
647
  </refsect1>
763
648
  
764
 
  <refsect1 id="bugs">
765
 
    <title>BUGS</title>
766
 
    <xi:include href="../bugs.xml"/>
767
 
  </refsect1>
 
649
<!--   <refsect1 id="bugs"> -->
 
650
<!--     <title>BUGS</title> -->
 
651
<!--     <para> -->
 
652
<!--     </para> -->
 
653
<!--   </refsect1> -->
768
654
  
769
655
  <refsect1 id="example">
770
656
    <title>EXAMPLE</title>
771
657
    <para>
772
658
      Note that normally, command line options will not be given
773
 
      directly, but passed on via the program responsible for starting
774
 
      this program; see <xref linkend="overview"/>.
 
659
      directly, but via options for the Mandos <citerefentry
 
660
      ><refentrytitle>plugin-runner</refentrytitle>
 
661
      <manvolnum>8mandos</manvolnum></citerefentry>.
775
662
    </para>
776
663
    <informalexample>
777
664
      <para>
778
 
        Normal invocation needs no options, if the network interfaces
 
665
        Normal invocation needs no options, if the network interface
779
666
        can be automatically determined:
780
667
      </para>
781
668
      <para>
784
671
    </informalexample>
785
672
    <informalexample>
786
673
      <para>
787
 
        Search for Mandos servers (and connect to them) using one
788
 
        specific interface:
 
674
        Search for Mandos servers (and connect to them) using another
 
675
        interface:
789
676
      </para>
790
677
      <para>
791
678
        <!-- do not wrap this line -->
794
681
    </informalexample>
795
682
    <informalexample>
796
683
      <para>
797
 
        Run in debug mode, and use custom keys:
 
684
        Run in debug mode, and use a custom key:
798
685
      </para>
799
686
      <para>
800
687
 
801
688
<!-- do not wrap this line -->
802
 
<userinput>&COMMANDNAME; --debug --pubkey keydir/pubkey.txt --seckey keydir/seckey.txt --tls-pubkey keydir/tls-pubkey.pem --tls-privkey keydir/tls-privkey.pem</userinput>
 
689
<userinput>&COMMANDNAME; --debug --pubkey keydir/pubkey.txt --seckey keydir/seckey.txt</userinput>
803
690
 
804
691
      </para>
805
692
    </informalexample>
806
693
    <informalexample>
807
694
      <para>
808
 
        Run in debug mode, with custom keys, and do not use Zeroconf
 
695
        Run in debug mode, with a custom key, and do not use Zeroconf
809
696
        to locate a server; connect directly to the IPv6 link-local
810
697
        address <quote><systemitem class="ipaddress"
811
698
        >fe80::aede:48ff:fe71:f6f2</systemitem></quote>, port 4711,
814
701
      <para>
815
702
 
816
703
<!-- do not wrap this line -->
817
 
<userinput>&COMMANDNAME; --debug --pubkey keydir/pubkey.txt --seckey keydir/seckey.txt --tls-pubkey keydir/tls-pubkey.pem --tls-privkey keydir/tls-privkey.pem --connect fe80::aede:48ff:fe71:f6f2:4711 --interface eth2</userinput>
 
704
<userinput>&COMMANDNAME; --debug --pubkey keydir/pubkey.txt --seckey keydir/seckey.txt --connect fe80::aede:48ff:fe71:f6f2:4711 --interface eth2</userinput>
818
705
 
819
706
      </para>
820
707
    </informalexample>
823
710
  <refsect1 id="security">
824
711
    <title>SECURITY</title>
825
712
    <para>
826
 
      This program assumes that it is set-uid to root, and will switch
827
 
      back to the original (and presumably non-privileged) user and
828
 
      group after bringing up the network interface.
 
713
      This program is set-uid to root, but will switch back to the
 
714
      original (and presumably non-privileged) user and group after
 
715
      bringing up the network interface.
829
716
    </para>
830
717
    <para>
831
718
      To use this program for its intended purpose (see <xref
844
731
    <para>
845
732
      The only remaining weak point is that someone with physical
846
733
      access to the client hard drive might turn off the client
847
 
      computer, read the OpenPGP and TLS keys directly from the hard
848
 
      drive, and communicate with the server.  To safeguard against
849
 
      this, the server is supposed to notice the client disappearing
850
 
      and stop giving out the encrypted data.  Therefore, it is
851
 
      important to set the timeout and checker interval values tightly
852
 
      on the server.  See <citerefentry><refentrytitle
 
734
      computer, read the OpenPGP keys directly from the hard drive,
 
735
      and communicate with the server.  To safeguard against this, the
 
736
      server is supposed to notice the client disappearing and stop
 
737
      giving out the encrypted data.  Therefore, it is important to
 
738
      set the timeout and checker interval values tightly on the
 
739
      server.  See <citerefentry><refentrytitle
853
740
      >mandos</refentrytitle><manvolnum>8</manvolnum></citerefentry>.
854
741
    </para>
855
742
    <para>
856
743
      It will also help if the checker program on the server is
857
744
      configured to request something from the client which can not be
858
 
      spoofed by someone else on the network, like SSH server key
859
 
      fingerprints, and unlike unencrypted <acronym>ICMP</acronym>
860
 
      echo (<quote>ping</quote>) replies.
 
745
      spoofed by someone else on the network, unlike unencrypted
 
746
      <acronym>ICMP</acronym> echo (<quote>ping</quote>) replies.
861
747
    </para>
862
748
    <para>
863
749
      <emphasis>Note</emphasis>: This makes it completely insecure to
879
765
      <manvolnum>5</manvolnum></citerefentry>,
880
766
      <citerefentry><refentrytitle>mandos</refentrytitle>
881
767
      <manvolnum>8</manvolnum></citerefentry>,
882
 
      <citerefentry><refentrytitle>password-agent</refentrytitle>
 
768
      <citerefentry><refentrytitle>password-prompt</refentrytitle>
883
769
      <manvolnum>8mandos</manvolnum></citerefentry>,
884
770
      <citerefentry><refentrytitle>plugin-runner</refentrytitle>
885
771
      <manvolnum>8mandos</manvolnum></citerefentry>
898
784
      </varlistentry>
899
785
      <varlistentry>
900
786
        <term>
901
 
          <ulink url="https://www.avahi.org/">Avahi</ulink>
 
787
          <ulink url="http://www.avahi.org/">Avahi</ulink>
902
788
        </term>
903
789
      <listitem>
904
790
        <para>
909
795
      </varlistentry>
910
796
      <varlistentry>
911
797
        <term>
912
 
          <ulink url="https://www.gnutls.org/">GnuTLS</ulink>
 
798
          <ulink url="http://www.gnu.org/software/gnutls/"
 
799
          >GnuTLS</ulink>
913
800
        </term>
914
801
      <listitem>
915
802
        <para>
916
803
          GnuTLS is the library this client uses to implement TLS for
917
804
          communicating securely with the server, and at the same time
918
 
          send the public key to the server.
 
805
          send the public OpenPGP key to the server.
919
806
        </para>
920
807
      </listitem>
921
808
      </varlistentry>
922
809
      <varlistentry>
923
810
        <term>
924
 
          <ulink url="https://www.gnupg.org/related_software/gpgme/"
 
811
          <ulink url="http://www.gnupg.org/related_software/gpgme/"
925
812
                 >GPGME</ulink>
926
813
        </term>
927
814
        <listitem>
955
842
              <para>
956
843
                This client uses IPv6 link-local addresses, which are
957
844
                immediately usable since a link-local addresses is
958
 
                automatically assigned to a network interface when it
 
845
                automatically assigned to a network interfaces when it
959
846
                is brought up.
960
847
              </para>
961
848
            </listitem>
965
852
      </varlistentry>
966
853
      <varlistentry>
967
854
        <term>
968
 
          RFC 5246: <citetitle>The Transport Layer Security (TLS)
969
 
          Protocol Version 1.2</citetitle>
 
855
          RFC 4346: <citetitle>The Transport Layer Security (TLS)
 
856
          Protocol Version 1.1</citetitle>
970
857
        </term>
971
858
      <listitem>
972
859
        <para>
973
 
          TLS 1.2 is the protocol implemented by GnuTLS.
 
860
          TLS 1.1 is the protocol implemented by GnuTLS.
974
861
        </para>
975
862
      </listitem>
976
863
      </varlistentry>
987
874
      </varlistentry>
988
875
      <varlistentry>
989
876
        <term>
990
 
          RFC 7250: <citetitle>Using Raw Public Keys in Transport
991
 
          Layer Security (TLS) and Datagram Transport Layer Security
992
 
          (DTLS)</citetitle>
993
 
        </term>
994
 
      <listitem>
995
 
        <para>
996
 
          This is implemented by GnuTLS in version 3.6.6 and is, if
997
 
          present, used by this program so that raw public keys can be
998
 
          used.
999
 
        </para>
1000
 
      </listitem>
1001
 
      </varlistentry>
1002
 
      <varlistentry>
1003
 
        <term>
1004
 
          RFC 6091: <citetitle>Using OpenPGP Keys for Transport Layer
 
877
          RFC 5081: <citetitle>Using OpenPGP Keys for Transport Layer
1005
878
          Security</citetitle>
1006
879
        </term>
1007
880
      <listitem>
1008
881
        <para>
1009
 
          This is implemented by GnuTLS before version 3.6.0 and is,
1010
 
          if present, used by this program so that OpenPGP keys can be
1011
 
          used.
 
882
          This is implemented by GnuTLS and used by this program so
 
883
          that OpenPGP keys can be used.
1012
884
        </para>
1013
885
      </listitem>
1014
886
      </varlistentry>