/mandos/trunk

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

« back to all changes in this revision

Viewing changes to Makefile

  • Committer: Teddy Hogeborn
  • Date: 2019-02-09 23:23:26 UTC
  • Revision ID: teddy@recompile.se-20190209232326-z1z2kzpgfixz7iaj
Add support for using raw public keys in TLS (RFC 7250)

Since GnuTLS removed support for OpenPGP keys in TLS (RFC 6091), and
no other library supports it, we have to change the protocol to use
something else.  We choose to use "raw public keys" (RFC 7250).  Since
we still use OpenPGP keys to decrypt the secret password, this means
that each client will have two keys: One OpenPGP key and one TLS
public/private key, and the key ID of the latter key is used to
identify clients instead of the fingerprint of the OpenPGP key.

Note that this code is still compatible with GnuTLS before version
3.6.0 (when OpenPGP key support was removed).  This commit merely adds
support for using raw pulic keys instead with GnuTLS 3.6.6. or later.

* DBUS-API (Signals/ClientNotFound): Change name of first parameter
                                     from "Fingerprint" to "KeyID".
  (Mandos Client Interface/Properties/KeyID): New.
* INSTALL: Document conflict with GnuTLS 3.6.0 (which removed OpenPGP
           key support) up until 3.6.6, when support for raw public
           keys was added.  Also document new dependency of client on
           "gnutls-bin" package (for certtool).
* Makefile (run-client): Depend on TLS key files, and also pass them
                         as arguments to client.
  (keydir/tls-privkey.pem, keydir/tls-pubkey.pem): New.
  (confdir/clients.conf): Add dependency on TLS public key.
  (purge-client): Add removal of TLS key files.
* clients.conf ([foo]/key_id, [bar]/key_id): New.
* debian/control (Source: mandos/Build-Depends): Also allow
                                                 libgnutls30 (>= 3.6.6)
  (Package: mandos/Depends): - '' -
  (Package: mandos/Description): Alter description to match new
                                 design.
  (Package: mandos-client/Description): - '' -
  (Package: mandos-client/Depends): Move "gnutls-bin | openssl" to
                                    here from "Recommends".
* debian/mandos-client.README.Debian: Add --tls-privkey and
                                      --tls-pubkey options to test
                                      command.
* debian/mandos-client.postinst (create_key): Renamed to "create_keys"
                                             (all callers changed),
                                             and also create TLS key.
* debian/mandos-client.postrm (purge): Also remove TLS key files.
* intro.xml (DESCRIPTION): Describe new dual-key design.
* mandos (GnuTLS): Define different functions depending on whether
                   support for raw public keys is detected.
  (Client.key_id): New attribute.
  (ClientDBus.KeyID_dbus_property): New method.
  (ProxyClient.__init__): Take new "key_id" parameter.
  (ClientHandler.handle): Use key IDs when using raw public keys and
                          use fingerprints when using OpenPGP keys.
  (ClientHandler.peer_certificate): Also handle raw public keys.
  (ClientHandler.key_id): New.
  (MandosServer.handle_ipc): Pass key ID over the pipe IPC.  Also
                             check for key ID matches when looking up
                             clients.
  (main): Default GnuTLS priority string depends on whether we are
          using raw public keys or not.  When unpickling clients, set
          key_id if not set in the pickle.
  (main/MandosDBusService.ClientNotFound): Change name of first
                                           parameter from
                                           "Fingerprint" to "KeyID".
* mandos-clients.conf.xml (OPTIONS): Document new "key_id" option.
  (OPTIONS/secret): Mention new key ID matchning.
  (EXPANSION/RUNTIME EXPANSION): Add new "key_id" option.
  (EXAMPLE): - '' -
* mandos-ctl (tablewords, main/keywords): Add new "KeyID" property.
* mandos-keygen: Create TLS key files.  New "--tls-keytype" (-T)
                 option.  Alter help text to be more clear about key
                 types.  When in password mode, also output "key_id"
                 option.
* mandos-keygen.xml (SYNOPSIS): Add new "--tls-keytype" (-T) option.
  (DESCRIPTION): Alter to match new dual-key design.
  (OVERVIEW): - '' -
  (FILES): Add TLS key files.
* mandos-options.xml (priority): Document new default priority string
                                 when using raw public keys.
* mandos.xml (NETWORK PROTOCOL): Describe new protocol using key ID.
  (BUGS): Remove issue about checking expire times of OpenPGP keys,
          since TLS public keys do not have expiration times.
  (SECURITY/CLIENT): Alter description to match new design.
  (SEE ALSO/GnuTLS): - '' -
  (SEE ALSO): Add reference to RFC 7250, and alter description of when
              RFC 6091 is used.
* overview.xml: Alter text to match new design.
* plugin-runner.xml (EXAMPLE): Add --tls-pubkey and --tls-privkey
                               options to mandos-client options.
* plugins.d/mandos-client.c: Use raw public keys when compiling with
                             supporting GnuTLS versions. Add new
                             "--tls-pubkey" and "--tls-privkey"
                             options (which do nothing if GnuTLS
                             library does not support raw public
                             keys).  Alter text throughout to reflect
                             new design.  Only generate new DH
                             parameters (based on size of OpenPGP key)
                             when using OpenPGP in TLS.  Default
                             GnuTLS priority string depends on whether
                             we are using raw public keys or not.
* plugins.d/mandos-client.xml (SYNOPSIS): Add new "--tls-privkey" (-t)
                                          and "--tls-pubkey" (-T)
                                          options.
  (DESCRIPTION): Describe new dual-key design.
  (OPTIONS): Document new "--tls-privkey" (-t) and "--tls-pubkey" (-T)
             options.
  (OPTIONS/--dh-bits): No longer necessarily depends on OpenPGP key
                       size.
  (FILES): Add default locations for TLS public and private key files.
  (EXAMPLE): Use new --tls-pubkey and --tls-privkey options.
  (SECURITY): Alter wording slightly to reflect new dual-key design.
  (SEE ALSO/GnuTLS): Alter description to match new design.
  (SEE ALSO): Add reference to RFC 7250, and alter description of when
              RFC 6091 is used.

Show diffs side-by-side

added added

removed removed

Lines of Context:
10
10
        -Wmissing-format-attribute -Wnormalized=nfc -Wpacked \
11
11
        -Wredundant-decls -Wnested-externs -Winline -Wvla \
12
12
        -Wvolatile-register-var -Woverlength-strings
13
 
 
14
 
#DEBUG:=-ggdb3 -fsanitize=address $(SANITIZE)
15
 
## Check which sanitizing options can be used
16
 
#SANITIZE:=$(foreach option,$(ALL_SANITIZE_OPTIONS),$(shell \
17
 
#       echo 'int main(){}' | $(CC) --language=c $(option) \
18
 
#       /dev/stdin -o /dev/null >/dev/null 2>&1 && echo $(option)))
 
13
#DEBUG:=-ggdb3 -fsanitize=address 
 
14
# For info about _FORTIFY_SOURCE, see feature_test_macros(7)
 
15
# and <https://gcc.gnu.org/ml/gcc-patches/2004-09/msg02055.html>.
 
16
FORTIFY:=-D_FORTIFY_SOURCE=2 -fstack-protector-all -fPIC
19
17
# <https://developerblog.redhat.com/2014/10/16/gcc-undefined-behavior-sanitizer-ubsan/>
20
18
ALL_SANITIZE_OPTIONS:=-fsanitize=leak -fsanitize=undefined \
21
19
        -fsanitize=shift -fsanitize=integer-divide-by-zero \
25
23
        -fsanitize=object-size -fsanitize=float-divide-by-zero \
26
24
        -fsanitize=float-cast-overflow -fsanitize=nonnull-attribute \
27
25
        -fsanitize=returns-nonnull-attribute -fsanitize=bool \
28
 
        -fsanitize=enum -fsanitize-address-use-after-scope
29
 
 
30
 
# For info about _FORTIFY_SOURCE, see feature_test_macros(7)
31
 
# and <https://gcc.gnu.org/ml/gcc-patches/2004-09/msg02055.html>.
32
 
FORTIFY:=-fstack-protector-all -fPIC
33
 
CPPFLAGS+=-D_FORTIFY_SOURCE=3
 
26
        -fsanitize=enum
 
27
# Check which sanitizing options can be used
 
28
SANITIZE:=$(foreach option,$(ALL_SANITIZE_OPTIONS),$(shell \
 
29
        echo 'int main(){}' | $(CC) --language=c $(option) /dev/stdin \
 
30
        -o /dev/null >/dev/null 2>&1 && echo $(option)))
34
31
LINK_FORTIFY_LD:=-z relro -z now
35
32
LINK_FORTIFY:=
36
33
 
42
39
#COVERAGE=--coverage
43
40
OPTIMIZE:=-Os -fno-strict-aliasing
44
41
LANGUAGE:=-std=gnu11
45
 
CPPFLAGS+=-D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64
46
42
htmldir:=man
47
 
version:=1.8.16
 
43
version:=1.7.20
48
44
SED:=sed
49
 
PKG_CONFIG?=pkg-config
50
 
 
51
 
USER:=$(firstword $(subst :, ,$(shell getent passwd _mandos \
52
 
        || getent passwd nobody || echo 65534)))
53
 
GROUP:=$(firstword $(subst :, ,$(shell getent group _mandos \
54
 
        || getent group nogroup || echo 65534)))
55
 
 
56
 
LINUXVERSION:=$(shell uname --kernel-release)
 
45
 
 
46
USER:=$(firstword $(subst :, ,$(shell getent passwd _mandos || getent passwd nobody || echo 65534)))
 
47
GROUP:=$(firstword $(subst :, ,$(shell getent group _mandos || getent group nogroup || echo 65534)))
57
48
 
58
49
## Use these settings for a traditional /usr/local install
59
50
# PREFIX:=$(DESTDIR)/usr/local
61
52
# KEYDIR:=$(DESTDIR)/etc/mandos/keys
62
53
# MANDIR:=$(PREFIX)/man
63
54
# INITRAMFSTOOLS:=$(DESTDIR)/etc/initramfs-tools
64
 
# DRACUTMODULE:=$(DESTDIR)/usr/lib/dracut/modules.d/90mandos
65
55
# STATEDIR:=$(DESTDIR)/var/lib/mandos
66
56
# LIBDIR:=$(PREFIX)/lib
67
 
# DBUSPOLICYDIR:=$(DESTDIR)/etc/dbus-1/system.d
68
57
##
69
58
 
70
59
## These settings are for a package-type install
73
62
KEYDIR:=$(DESTDIR)/etc/keys/mandos
74
63
MANDIR:=$(PREFIX)/share/man
75
64
INITRAMFSTOOLS:=$(DESTDIR)/usr/share/initramfs-tools
76
 
DRACUTMODULE:=$(DESTDIR)/usr/lib/dracut/modules.d/90mandos
77
65
STATEDIR:=$(DESTDIR)/var/lib/mandos
78
66
LIBDIR:=$(shell \
79
67
        for d in \
80
 
        "/usr/lib/`dpkg-architecture \
81
 
                        -qDEB_HOST_MULTIARCH 2>/dev/null`" \
 
68
        "/usr/lib/`dpkg-architecture -qDEB_HOST_MULTIARCH 2>/dev/null`" \
82
69
        "`rpm --eval='%{_libdir}' 2>/dev/null`" /usr/lib; do \
83
70
                if [ -d "$$d" -a "$$d" = "$${d%/}" ]; then \
84
71
                        echo "$(DESTDIR)$$d"; \
85
72
                        break; \
86
73
                fi; \
87
74
        done)
88
 
DBUSPOLICYDIR:=$(DESTDIR)/usr/share/dbus-1/system.d
89
75
##
90
76
 
91
 
SYSTEMD:=$(DESTDIR)$(shell $(PKG_CONFIG) systemd \
92
 
                        --variable=systemdsystemunitdir)
93
 
TMPFILES:=$(DESTDIR)$(shell $(PKG_CONFIG) systemd \
94
 
                        --variable=tmpfilesdir)
95
 
SYSUSERS:=$(DESTDIR)$(shell $(PKG_CONFIG) systemd \
96
 
                        --variable=sysusersdir)
 
77
SYSTEMD:=$(DESTDIR)$(shell pkg-config systemd --variable=systemdsystemunitdir)
 
78
TMPFILES:=$(DESTDIR)$(shell pkg-config systemd --variable=tmpfilesdir)
97
79
 
98
 
GNUTLS_CFLAGS:=$(shell $(PKG_CONFIG) --cflags-only-I gnutls)
99
 
GNUTLS_LIBS:=$(shell $(PKG_CONFIG) --libs gnutls)
100
 
AVAHI_CFLAGS:=$(shell $(PKG_CONFIG) --cflags-only-I avahi-core)
101
 
AVAHI_LIBS:=$(shell $(PKG_CONFIG) --libs avahi-core)
102
 
GPGME_CFLAGS:=$(shell $(PKG_CONFIG) --cflags-only-I gpgme 2>/dev/null \
103
 
        || gpgme-config --cflags; getconf LFS_CFLAGS)
104
 
GPGME_LIBS:=$(shell $(PKG_CONFIG) --libs gpgme 2>/dev/null \
105
 
        || gpgme-config --libs; getconf LFS_LIBS; \
 
80
GNUTLS_CFLAGS:=$(shell pkg-config --cflags-only-I gnutls)
 
81
GNUTLS_LIBS:=$(shell pkg-config --libs gnutls)
 
82
AVAHI_CFLAGS:=$(shell pkg-config --cflags-only-I avahi-core)
 
83
AVAHI_LIBS:=$(shell pkg-config --libs avahi-core)
 
84
GPGME_CFLAGS:=$(shell gpgme-config --cflags; getconf LFS_CFLAGS)
 
85
GPGME_LIBS:=$(shell gpgme-config --libs; getconf LFS_LIBS; \
106
86
        getconf LFS_LDFLAGS)
107
 
LIBNL3_CFLAGS:=$(shell $(PKG_CONFIG) --cflags-only-I libnl-route-3.0)
108
 
LIBNL3_LIBS:=$(shell $(PKG_CONFIG) --libs libnl-route-3.0)
109
 
GLIB_CFLAGS:=$(shell $(PKG_CONFIG) --cflags glib-2.0)
110
 
GLIB_LIBS:=$(shell $(PKG_CONFIG) --libs glib-2.0)
 
87
LIBNL3_CFLAGS:=$(shell pkg-config --cflags-only-I libnl-route-3.0)
 
88
LIBNL3_LIBS:=$(shell pkg-config --libs libnl-route-3.0)
111
89
 
112
90
# Do not change these two
113
 
CFLAGS+=$(WARN) $(DEBUG) $(FORTIFY) $(COVERAGE) $(OPTIMIZE) \
114
 
        $(LANGUAGE) -DVERSION='"$(version)"'
115
 
LDFLAGS+=-Xlinker --as-needed $(COVERAGE) $(LINK_FORTIFY) $(strip \
116
 
        ) $(foreach flag,$(LINK_FORTIFY_LD),-Xlinker $(flag))
 
91
CFLAGS+=$(WARN) $(DEBUG) $(FORTIFY) $(SANITIZE) $(COVERAGE) \
 
92
        $(OPTIMIZE) $(LANGUAGE) -DVERSION='"$(version)"'
 
93
LDFLAGS+=-Xlinker --as-needed $(COVERAGE) $(LINK_FORTIFY) $(foreach flag,$(LINK_FORTIFY_LD),-Xlinker $(flag))
117
94
 
118
95
# Commands to format a DocBook <refentry> document into a manual page
119
96
DOCBOOKTOMAN=$(strip cd $(dir $<); xsltproc --nonet --xinclude \
125
102
        /usr/share/xml/docbook/stylesheet/nwalsh/manpages/docbook.xsl \
126
103
        $(notdir $<); \
127
104
        if locale --all 2>/dev/null | grep --regexp='^en_US\.utf8$$' \
128
 
        && command -v man >/dev/null; then LANG=en_US.UTF-8 \
129
 
        MANWIDTH=80 man --warnings --encoding=UTF-8 --local-file \
130
 
        $(notdir $@); fi >/dev/null)
 
105
        && type man 2>/dev/null; then LANG=en_US.UTF-8 MANWIDTH=80 \
 
106
        man --warnings --encoding=UTF-8 --local-file $(notdir $@); \
 
107
        fi >/dev/null)
131
108
 
132
109
DOCBOOKTOHTML=$(strip xsltproc --nonet --xinclude \
133
110
        --param make.year.ranges                1 \
146
123
        plugins.d/usplash plugins.d/splashy plugins.d/askpass-fifo \
147
124
        plugins.d/plymouth
148
125
PLUGIN_HELPERS:=plugin-helpers/mandos-client-iprouteadddel
149
 
CPROGS:=plugin-runner dracut-module/password-agent $(PLUGINS) \
150
 
        $(PLUGIN_HELPERS)
 
126
CPROGS:=plugin-runner $(PLUGINS) $(PLUGIN_HELPERS)
151
127
PROGS:=mandos mandos-keygen mandos-ctl mandos-monitor $(CPROGS)
152
128
DOCS:=mandos.8 mandos-keygen.8 mandos-monitor.8 mandos-ctl.8 \
153
129
        mandos.conf.5 mandos-clients.conf.5 plugin-runner.8mandos \
154
 
        dracut-module/password-agent.8mandos \
155
130
        plugins.d/mandos-client.8mandos \
156
131
        plugins.d/password-prompt.8mandos plugins.d/usplash.8mandos \
157
132
        plugins.d/splashy.8mandos plugins.d/askpass-fifo.8mandos \
161
136
 
162
137
objects:=$(addsuffix .o,$(CPROGS))
163
138
 
164
 
.PHONY: all
165
139
all: $(PROGS) mandos.lsm
166
140
 
167
 
.PHONY: doc
168
141
doc: $(DOCS)
169
142
 
170
 
.PHONY: html
171
143
html: $(htmldocs)
172
144
 
173
145
%.5: %.xml common.ent legalnotice.xml
232
204
                overview.xml legalnotice.xml
233
205
        $(DOCBOOKTOHTML)
234
206
 
235
 
dracut-module/password-agent.8mandos: \
236
 
                dracut-module/password-agent.xml common.ent \
237
 
                overview.xml legalnotice.xml
238
 
        $(DOCBOOKTOMAN)
239
 
dracut-module/password-agent.8mandos.xhtml: \
240
 
                dracut-module/password-agent.xml common.ent \
241
 
                overview.xml legalnotice.xml
242
 
        $(DOCBOOKTOHTML)
243
 
 
244
207
plugins.d/mandos-client.8mandos: plugins.d/mandos-client.xml \
245
208
                                        common.ent \
246
209
                                        mandos-options.xml \
289
252
                --expression='s/\(mandos_\)[0-9.]\+\(\.orig\.tar\.gz\)/\1$(version)\2/' \
290
253
                $@)
291
254
 
292
 
# Does the linker support the --no-warn-execstack option?
293
 
ifeq ($(shell echo 'int main(){}'|$(CC) --language=c /dev/stdin -o /dev/null -Xlinker --no-warn-execstack >/dev/null 2>&1 && echo yes),yes)
294
 
# These programs use nested functions, which uses an executable stack
295
 
plugin-runner: LDFLAGS += -Xlinker --no-warn-execstack
296
 
dracut-module/password-agent: LDFLAGS += -Xlinker --no-warn-execstack
297
 
plugins.d/password-prompt: LDFLAGS += -Xlinker --no-warn-execstack
298
 
plugins.d/mandos-client: LDFLAGS += -Xlinker --no-warn-execstack
299
 
plugins.d/plymouth: LDFLAGS += -Xlinker --no-warn-execstack
300
 
endif
301
 
 
302
 
# Need to add the GnuTLS, Avahi and GPGME libraries
303
 
plugins.d/mandos-client: CFLAGS += $(GNUTLS_CFLAGS) $(strip \
304
 
        ) $(AVAHI_CFLAGS) $(GPGME_CFLAGS)
305
 
plugins.d/mandos-client: LDLIBS += $(GNUTLS_LIBS) $(strip \
306
 
        ) $(AVAHI_LIBS) $(GPGME_LIBS)
307
 
 
308
 
# Need to add the libnl-route library
309
 
plugin-helpers/mandos-client-iprouteadddel: CFLAGS += $(LIBNL3_CFLAGS)
310
 
plugin-helpers/mandos-client-iprouteadddel: LDLIBS += $(LIBNL3_LIBS)
311
 
 
312
 
# Need to add the GLib and pthread libraries
313
 
dracut-module/password-agent: CFLAGS += $(GLIB_CFLAGS)
314
 
# Note: -lpthread is unnecessary with the GNU C library 2.34 or later
315
 
dracut-module/password-agent: LDLIBS += $(GLIB_LIBS) -lpthread
316
 
 
317
 
.PHONY: clean
 
255
# Need to add the GnuTLS, Avahi and GPGME libraries, and can't use
 
256
# -fsanitize=leak because GnuTLS and GPGME both leak memory.
 
257
plugins.d/mandos-client: plugins.d/mandos-client.c
 
258
        $(CC) $(filter-out -fsanitize=leak,$(CFLAGS)) $(strip\
 
259
        ) $(GNUTLS_CFLAGS) $(AVAHI_CFLAGS) $(GPGME_CFLAGS) $(strip\
 
260
                ) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $^ $(strip\
 
261
                ) -lrt $(GNUTLS_LIBS) $(AVAHI_LIBS) $(strip\
 
262
                ) $(GPGME_LIBS) $(LOADLIBES) $(LDLIBS) -o $@
 
263
 
 
264
plugin-helpers/mandos-client-iprouteadddel: plugin-helpers/mandos-client-iprouteadddel.c
 
265
        $(LINK.c) $(LIBNL3_CFLAGS) $^ $(LIBNL3_LIBS) $(strip\
 
266
                ) $(LOADLIBES) $(LDLIBS) -o $@
 
267
 
 
268
.PHONY : all doc html clean distclean mostlyclean maintainer-clean \
 
269
        check run-client run-server install install-html \
 
270
        install-server install-client-nokey install-client uninstall \
 
271
        uninstall-server uninstall-client purge purge-server \
 
272
        purge-client
 
273
 
318
274
clean:
319
275
        -rm --force $(CPROGS) $(objects) $(htmldocs) $(DOCS) core
320
276
 
321
 
.PHONY: distclean
322
277
distclean: clean
323
 
.PHONY: mostlyclean
324
278
mostlyclean: clean
325
 
.PHONY: maintainer-clean
326
279
maintainer-clean: clean
327
280
        -rm --force --recursive keydir confdir statedir
328
281
 
329
 
.PHONY: check
330
 
check: all
 
282
check:  all
331
283
        ./mandos --check
332
284
        ./mandos-ctl --check
333
 
        ./mandos-keygen --version
334
 
        ./plugin-runner --version
335
 
        ./plugin-helpers/mandos-client-iprouteadddel --version
336
 
        ./dracut-module/password-agent --test
337
285
 
338
286
# Run the client with a local config and key
339
 
.PHONY: run-client
340
 
run-client: all keydir/seckey.txt keydir/pubkey.txt \
341
 
                        keydir/tls-privkey.pem keydir/tls-pubkey.pem
342
 
        @echo '######################################################'
343
 
        @echo '# The following error messages are harmless and can  #'
344
 
        @echo '#  be safely ignored:                                #'
345
 
        @echo '## From plugin-runner:                               #'
346
 
        @echo '# setgid: Operation not permitted                    #'
347
 
        @echo '# setuid: Operation not permitted                    #'
348
 
        @echo '## From askpass-fifo:                                #'
349
 
        @echo '# mkfifo: Permission denied                          #'
350
 
        @echo '## From mandos-client:                               #'
351
 
        @echo '# Failed to raise privileges: Operation not permi... #'
352
 
        @echo '# Warning: network hook "*" exited with status *     #'
353
 
        @echo '# ioctl SIOCSIFFLAGS +IFF_UP: Operation not permi... #'
354
 
        @echo '# Failed to bring up interface "*": Operation not... #'
355
 
        @echo '#                                                    #'
356
 
        @echo '# (The messages are caused by not running as root,   #'
357
 
        @echo '# but you should NOT run "make run-client" as root   #'
358
 
        @echo '# unless you also unpacked and compiled Mandos as    #'
359
 
        @echo '# root, which is also NOT recommended.)              #'
360
 
        @echo '######################################################'
 
287
run-client: all keydir/seckey.txt keydir/pubkey.txt keydir/tls-privkey.pem keydir/tls-pubkey.pem
 
288
        @echo "###################################################################"
 
289
        @echo "# The following error messages are harmless and can be safely     #"
 
290
        @echo "# ignored:                                                        #"
 
291
        @echo "# From plugin-runner: setgid: Operation not permitted             #"
 
292
        @echo "#                     setuid: Operation not permitted             #"
 
293
        @echo "# From askpass-fifo:  mkfifo: Permission denied                   #"
 
294
        @echo "# From mandos-client:                                             #"
 
295
        @echo "#             Failed to raise privileges: Operation not permitted #"
 
296
        @echo "#             Warning: network hook \"*\" exited with status *      #"
 
297
        @echo "#                                                                 #"
 
298
        @echo "# (The messages are caused by not running as root, but you should #"
 
299
        @echo "# NOT run \"make run-client\" as root unless you also unpacked and  #"
 
300
        @echo "# compiled Mandos as root, which is also NOT recommended.)        #"
 
301
        @echo "###################################################################"
361
302
# We set GNOME_KEYRING_CONTROL to block pam_gnome_keyring
362
303
        ./plugin-runner --plugin-dir=plugins.d \
363
304
                --plugin-helper-dir=plugin-helpers \
370
311
keydir/seckey.txt keydir/pubkey.txt keydir/tls-privkey.pem keydir/tls-pubkey.pem: mandos-keygen
371
312
        install --directory keydir
372
313
        ./mandos-keygen --dir keydir --force
373
 
        if ! [ -e keydir/tls-privkey.pem ]; then \
374
 
                install --mode=u=rw /dev/null keydir/tls-privkey.pem; \
375
 
        fi
376
 
        if ! [ -e keydir/tls-pubkey.pem ]; then \
377
 
                install --mode=u=rw /dev/null keydir/tls-pubkey.pem; \
378
 
        fi
379
314
 
380
315
# Run the server with a local config
381
 
.PHONY: run-server
382
316
run-server: confdir/mandos.conf confdir/clients.conf statedir
383
317
        ./mandos --debug --no-dbus --configdir=confdir \
384
318
                --statedir=statedir $(SERVERARGS)
385
319
 
386
320
# Used by run-server
387
321
confdir/mandos.conf: mandos.conf
388
 
        install -D --mode=u=rw,go=r $^ $@
 
322
        install --directory confdir
 
323
        install --mode=u=rw,go=r $^ $@
389
324
confdir/clients.conf: clients.conf keydir/seckey.txt keydir/tls-pubkey.pem
390
 
        install -D --mode=u=rw $< $@
 
325
        install --directory confdir
 
326
        install --mode=u=rw $< $@
391
327
# Add a client password
392
328
        ./mandos-keygen --dir keydir --password --no-ssh >> $@
393
329
statedir:
394
330
        install --directory statedir
395
331
 
396
 
.PHONY: install
397
332
install: install-server install-client-nokey
398
333
 
399
 
.PHONY: install-html
400
334
install-html: html
401
 
        install -D --mode=u=rw,go=r --target-directory=$(htmldir) \
 
335
        install --directory $(htmldir)
 
336
        install --mode=u=rw,go=r --target-directory=$(htmldir) \
402
337
                $(htmldocs)
403
338
 
404
 
.PHONY: install-server
405
339
install-server: doc
 
340
        install --directory $(CONFDIR)
406
341
        if install --directory --mode=u=rwx --owner=$(USER) \
407
342
                --group=$(GROUP) $(STATEDIR); then \
408
343
                :; \
409
344
        elif install --directory --mode=u=rwx $(STATEDIR); then \
410
345
                chown -- $(USER):$(GROUP) $(STATEDIR) || :; \
411
346
        fi
412
 
        if [ "$(TMPFILES)" != "$(DESTDIR)" ]; then \
413
 
                install -D --mode=u=rw,go=r tmpfiles.d-mandos.conf \
 
347
        if [ "$(TMPFILES)" != "$(DESTDIR)" -a -d "$(TMPFILES)" ]; then \
 
348
                install --mode=u=rw,go=r tmpfiles.d-mandos.conf \
414
349
                        $(TMPFILES)/mandos.conf; \
415
350
        fi
416
 
        if [ "$(SYSUSERS)" != "$(DESTDIR)" ]; then \
417
 
                install -D --mode=u=rw,go=r sysusers.d-mandos.conf \
418
 
                        $(SYSUSERS)/mandos.conf; \
419
 
        fi
420
 
        install --directory $(PREFIX)/sbin
421
 
        install --mode=u=rwx,go=rx --target-directory=$(PREFIX)/sbin \
422
 
                mandos
 
351
        install --mode=u=rwx,go=rx mandos $(PREFIX)/sbin/mandos
423
352
        install --mode=u=rwx,go=rx --target-directory=$(PREFIX)/sbin \
424
353
                mandos-ctl
425
354
        install --mode=u=rwx,go=rx --target-directory=$(PREFIX)/sbin \
426
355
                mandos-monitor
427
 
        install --directory $(CONFDIR)
428
356
        install --mode=u=rw,go=r --target-directory=$(CONFDIR) \
429
357
                mandos.conf
430
358
        install --mode=u=rw --target-directory=$(CONFDIR) \
431
359
                clients.conf
432
 
        install -D --mode=u=rw,go=r dbus-mandos.conf \
433
 
                $(DBUSPOLICYDIR)/mandos.conf
434
 
        install -D --mode=u=rwx,go=rx init.d-mandos \
 
360
        install --mode=u=rw,go=r dbus-mandos.conf \
 
361
                $(DESTDIR)/etc/dbus-1/system.d/mandos.conf
 
362
        install --mode=u=rwx,go=rx init.d-mandos \
435
363
                $(DESTDIR)/etc/init.d/mandos
436
 
        if [ "$(SYSTEMD)" != "$(DESTDIR)" ]; then \
437
 
                install -D --mode=u=rw,go=r mandos.service \
438
 
                        $(SYSTEMD); \
 
364
        if [ "$(SYSTEMD)" != "$(DESTDIR)" -a -d "$(SYSTEMD)" ]; then \
 
365
                install --mode=u=rw,go=r mandos.service $(SYSTEMD); \
439
366
        fi
440
 
        install -D --mode=u=rw,go=r default-mandos \
 
367
        install --mode=u=rw,go=r default-mandos \
441
368
                $(DESTDIR)/etc/default/mandos
442
369
        if [ -z $(DESTDIR) ]; then \
443
370
                update-rc.d mandos defaults 25 15;\
444
371
        fi
445
 
        install --directory $(MANDIR)/man8 $(MANDIR)/man5
446
372
        gzip --best --to-stdout mandos.8 \
447
373
                > $(MANDIR)/man8/mandos.8.gz
448
374
        gzip --best --to-stdout mandos-monitor.8 \
456
382
        gzip --best --to-stdout intro.8mandos \
457
383
                > $(MANDIR)/man8/intro.8mandos.gz
458
384
 
459
 
.PHONY: install-client-nokey
460
385
install-client-nokey: all doc
 
386
        install --directory $(LIBDIR)/mandos $(CONFDIR)
461
387
        install --directory --mode=u=rwx $(KEYDIR) \
462
388
                $(LIBDIR)/mandos/plugins.d \
463
389
                $(LIBDIR)/mandos/plugin-helpers
464
 
        if [ "$(SYSUSERS)" != "$(DESTDIR)" ]; then \
465
 
                install -D --mode=u=rw,go=r sysusers.d-mandos.conf \
466
 
                        $(SYSUSERS)/mandos-client.conf; \
467
 
        fi
468
390
        if [ "$(CONFDIR)" != "$(LIBDIR)/mandos" ]; then \
469
 
                install --directory \
470
 
                        --mode=u=rwx "$(CONFDIR)/plugins.d" \
 
391
                install --mode=u=rwx \
 
392
                        --directory "$(CONFDIR)/plugins.d" \
471
393
                        "$(CONFDIR)/plugin-helpers"; \
472
394
        fi
473
 
        install --directory --mode=u=rwx,go=rx \
 
395
        install --mode=u=rwx,go=rx --directory \
474
396
                "$(CONFDIR)/network-hooks.d"
475
397
        install --mode=u=rwx,go=rx \
476
398
                --target-directory=$(LIBDIR)/mandos plugin-runner
477
399
        install --mode=u=rwx,go=rx \
478
 
                --target-directory=$(LIBDIR)/mandos \
479
 
                mandos-to-cryptroot-unlock
480
 
        install --directory $(PREFIX)/sbin
 
400
                --target-directory=$(LIBDIR)/mandos mandos-to-cryptroot-unlock
481
401
        install --mode=u=rwx,go=rx --target-directory=$(PREFIX)/sbin \
482
402
                mandos-keygen
483
403
        install --mode=u=rwx,go=rx \
501
421
        install --mode=u=rwx,go=rx \
502
422
                --target-directory=$(LIBDIR)/mandos/plugin-helpers \
503
423
                plugin-helpers/mandos-client-iprouteadddel
504
 
        install -D initramfs-tools-hook \
 
424
        install initramfs-tools-hook \
505
425
                $(INITRAMFSTOOLS)/hooks/mandos
506
 
        install -D --mode=u=rw,go=r initramfs-tools-conf \
 
426
        install --mode=u=rw,go=r initramfs-tools-conf \
507
427
                $(INITRAMFSTOOLS)/conf.d/mandos-conf
508
 
        install -D --mode=u=rw,go=r initramfs-tools-conf-hook \
509
 
                $(INITRAMFSTOOLS)/conf-hooks.d/zz-mandos
510
 
        install -D initramfs-tools-script \
 
428
        install initramfs-tools-script \
511
429
                $(INITRAMFSTOOLS)/scripts/init-premount/mandos
512
 
        install -D initramfs-tools-script-stop \
 
430
        install initramfs-tools-script-stop \
513
431
                $(INITRAMFSTOOLS)/scripts/local-premount/mandos
514
 
        install -D --mode=u=rw,go=r \
515
 
                --target-directory=$(DRACUTMODULE) \
516
 
                dracut-module/ask-password-mandos.path \
517
 
                dracut-module/ask-password-mandos.service
518
 
        install --mode=u=rwxs,go=rx \
519
 
                --target-directory=$(DRACUTMODULE) \
520
 
                dracut-module/module-setup.sh \
521
 
                dracut-module/cmdline-mandos.sh \
522
 
                dracut-module/password-agent
523
432
        install --mode=u=rw,go=r plugin-runner.conf $(CONFDIR)
524
 
        install --directory $(MANDIR)/man8
525
433
        gzip --best --to-stdout mandos-keygen.8 \
526
434
                > $(MANDIR)/man8/mandos-keygen.8.gz
527
435
        gzip --best --to-stdout plugin-runner.8mandos \
538
446
                > $(MANDIR)/man8/askpass-fifo.8mandos.gz
539
447
        gzip --best --to-stdout plugins.d/plymouth.8mandos \
540
448
                > $(MANDIR)/man8/plymouth.8mandos.gz
541
 
        gzip --best --to-stdout dracut-module/password-agent.8mandos \
542
 
                > $(MANDIR)/man8/password-agent.8mandos.gz
543
449
 
544
 
.PHONY: install-client
545
450
install-client: install-client-nokey
546
451
# Post-installation stuff
547
452
        -$(PREFIX)/sbin/mandos-keygen --dir "$(KEYDIR)"
548
 
        if command -v update-initramfs >/dev/null; then \
549
 
            update-initramfs -k all -u; \
550
 
        elif command -v dracut >/dev/null; then \
551
 
            for initrd in $(DESTDIR)/boot/initr*-$(LINUXVERSION); do \
552
 
                if [ -w "$$initrd" ]; then \
553
 
                    chmod go-r "$$initrd"; \
554
 
                    dracut --force "$$initrd"; \
555
 
                fi; \
556
 
            done; \
557
 
        fi
 
453
        update-initramfs -k all -u
558
454
        echo "Now run mandos-keygen --password --dir $(KEYDIR)"
559
455
 
560
 
.PHONY: uninstall
561
456
uninstall: uninstall-server uninstall-client
562
457
 
563
 
.PHONY: uninstall-server
564
458
uninstall-server:
565
459
        -rm --force $(PREFIX)/sbin/mandos \
566
460
                $(PREFIX)/sbin/mandos-ctl \
573
467
        update-rc.d -f mandos remove
574
468
        -rmdir $(CONFDIR)
575
469
 
576
 
.PHONY: uninstall-client
577
470
uninstall-client:
578
471
# Refuse to uninstall client if /etc/crypttab is explicitly configured
579
472
# to use it.
590
483
                $(INITRAMFSTOOLS)/hooks/mandos \
591
484
                $(INITRAMFSTOOLS)/conf-hooks.d/mandos \
592
485
                $(INITRAMFSTOOLS)/scripts/init-premount/mandos \
593
 
                $(INITRAMFSTOOLS)/scripts/local-premount/mandos \
594
 
                $(DRACUTMODULE)/ask-password-mandos.path \
595
 
                $(DRACUTMODULE)/ask-password-mandos.service \
596
 
                $(DRACUTMODULE)/module-setup.sh \
597
 
                $(DRACUTMODULE)/cmdline-mandos.sh \
598
 
                $(DRACUTMODULE)/password-agent \
599
486
                $(MANDIR)/man8/mandos-keygen.8.gz \
600
487
                $(MANDIR)/man8/plugin-runner.8mandos.gz \
601
488
                $(MANDIR)/man8/mandos-client.8mandos.gz
604
491
                $(MANDIR)/man8/splashy.8mandos.gz \
605
492
                $(MANDIR)/man8/askpass-fifo.8mandos.gz \
606
493
                $(MANDIR)/man8/plymouth.8mandos.gz \
607
 
                $(MANDIR)/man8/password-agent.8mandos.gz \
608
494
        -rmdir $(LIBDIR)/mandos/plugins.d $(CONFDIR)/plugins.d \
609
 
                 $(LIBDIR)/mandos $(CONFDIR) $(KEYDIR) $(DRACUTMODULE)
610
 
        if command -v update-initramfs >/dev/null; then \
611
 
            update-initramfs -k all -u; \
612
 
        elif command -v dracut >/dev/null; then \
613
 
            for initrd in $(DESTDIR)/boot/initr*-$(LINUXVERSION); do \
614
 
                test -w "$$initrd" && dracut --force "$$initrd"; \
615
 
            done; \
616
 
        fi
 
495
                 $(LIBDIR)/mandos $(CONFDIR) $(KEYDIR)
 
496
        update-initramfs -k all -u
617
497
 
618
 
.PHONY: purge
619
498
purge: purge-server purge-client
620
499
 
621
 
.PHONY: purge-server
622
500
purge-server: uninstall-server
623
501
        -rm --force $(CONFDIR)/mandos.conf $(CONFDIR)/clients.conf \
624
502
                $(DESTDIR)/etc/dbus-1/system.d/mandos.conf
625
503
                $(DESTDIR)/etc/default/mandos \
626
504
                $(DESTDIR)/etc/init.d/mandos \
 
505
                $(SYSTEMD)/mandos.service \
627
506
                $(DESTDIR)/run/mandos.pid \
628
507
                $(DESTDIR)/var/run/mandos.pid
629
 
        if [ "$(SYSTEMD)" != "$(DESTDIR)" -a -d "$(SYSTEMD)" ]; then \
630
 
                -rm --force -- $(SYSTEMD)/mandos.service; \
631
 
        fi
632
508
        -rmdir $(CONFDIR)
633
509
 
634
 
.PHONY: purge-client
635
510
purge-client: uninstall-client
636
511
        -shred --remove $(KEYDIR)/seckey.txt $(KEYDIR)/tls-privkey.pem
637
512
        -rm --force $(CONFDIR)/plugin-runner.conf \