1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
|
#!/bin/sh
# This script can be called in the following ways:
#
# After the package was installed:
# <postinst> configure <old-version>
#
#
# If prerm fails during upgrade or fails on failed upgrade:
# <old-postinst> abort-upgrade <new-version>
#
# If prerm fails during deconfiguration of a package:
# <postinst> abort-deconfigure in-favour <new-package> <version>
# removing <old-package> <version>
#
# If prerm fails during replacement due to conflict:
# <postinst> abort-remove in-favour <new-package> <version>
. /usr/share/debconf/confmodule
set -e
# Update the initial RAM file system image
update_initramfs()
{
if command -v update-initramfs >/dev/null; then
update-initramfs -k all -u
elif command -v dracut >/dev/null; then
dracut_version="`dpkg-query --showformat='${Version}' --show dracut`"
if dpkg --compare-versions "$dracut_version" lt 043-1 \
&& bash -c '. /etc/dracut.conf; . /etc/dracut.conf.d/*; [ "$hostonly" != yes ]'; then
echo 'Dracut is not configured to use hostonly mode!' >&2
return 1
fi
# Logic taken from dracut.postinst
for kernel in /boot/vmlinu[xz]-*; do
kversion="${kernel#/boot/vmlinu[xz]-}"
# Dracut preserves old permissions of initramfs image
# files, so we adjust permissions before creating new
# initramfs image containing secret keys.
chmod go-r /boot/initrd.img-"$kversion"
if [ "$kversion" != "*" ]; then
/etc/kernel/postinst.d/dracut "$kversion"
fi
done
fi
if dpkg --compare-versions "$2" lt-nl "1.0.10-1"; then
# Make old initrd.img files unreadable too, in case they were
# created with mandos-client 1.0.8 or older.
find /boot -maxdepth 1 -type f -name "initrd.img-*.bak" \
-print0 | xargs --null --no-run-if-empty chmod o-r
fi
}
# Add user and group
add_mandos_user(){
# Rename old "mandos" user and group
if dpkg --compare-versions "$2" lt "1.0.3-1"; then
case "`getent passwd mandos`" in
*:Mandos\ password\ system,,,:/nonexistent:/bin/false)
usermod --login _mandos mandos
groupmod --new-name _mandos mandos
return
;;
esac
fi
# Create new user and group
if ! getent passwd _mandos >/dev/null; then
adduser --system --force-badname --quiet --home /nonexistent \
--no-create-home --group --disabled-password \
--gecos "Mandos password system" _mandos
fi
}
# Create client key pairs
create_keys(){
# If the OpenPGP key files do not exist, generate all keys using
# mandos-keygen
if ! [ -r /etc/keys/mandos/pubkey.txt \
-a -r /etc/keys/mandos/seckey.txt ]; then
mandos-keygen
gpg-connect-agent KILLAGENT /bye || :
return 0
fi
# Remove any bad TLS keys by 1.8.0-1
if dpkg --compare-versions "$2" eq "1.8.0-1" \
|| dpkg --compare-versions "$2" eq "1.8.0-1~bpo9+1"; then
# Is the key bad?
if ! certtool --password='' \
--load-privkey=/etc/keys/mandos/tls-privkey.pem \
--outfile=/dev/null --pubkey-info --no-text \
2>/dev/null; then
shred --remove -- /etc/keys/mandos/tls-privkey.pem \
2>/dev/null || :
rm --force -- /etc/keys/mandos/tls-pubkey.pem
fi
fi
# If the TLS keys already exists, do nothing
if [ -r /etc/keys/mandos/tls-privkey.pem \
-a -r /etc/keys/mandos/tls-pubkey.pem ]; then
return 0
fi
# Try to create the TLS keys
TLS_PRIVKEYTMP="`mktemp -t mandos-client-privkey.XXXXXXXXXX`"
if certtool --generate-privkey --password='' \
--outfile "$TLS_PRIVKEYTMP" --sec-param ultra \
--key-type=ed25519 --pkcs8 --no-text 2>/dev/null; then
local umask=$(umask)
umask 077
cp --archive "$TLS_PRIVKEYTMP" /etc/keys/mandos/tls-privkey.pem
shred --remove -- "$TLS_PRIVKEYTMP" 2>/dev/null || :
# First try certtool from GnuTLS
if ! certtool --password='' \
--load-privkey=/etc/keys/mandos/tls-privkey.pem \
--outfile=/etc/keys/mandos/tls-pubkey.pem --pubkey-info \
--no-text 2>/dev/null; then
# Otherwise try OpenSSL
if ! openssl pkey -in /etc/keys/mandos/tls-privkey.pem \
-out /etc/keys/mandos/tls-pubkey.pem -pubout; then
rm --force /etc/keys/mandos/tls-pubkey.pem
# None of the commands succeded; give up
umask $umask
return 1
fi
fi
umask $umask
key_id=$(mandos-keygen --passfile=/dev/null \
| grep --regexp="^key_id[ =]")
db_version 2.0
db_fset mandos-client/key_id seen false
db_reset mandos-client/key_id
db_subst mandos-client/key_id key_id $key_id
db_input critical mandos-client/key_id || true
db_go
db_stop
else
shred --remove -- "$TLS_PRIVKEYTMP" 2>/dev/null || :
fi
}
create_dh_params(){
if [ -r /etc/keys/mandos/dhparams.pem ]; then
return 0
fi
# Create a Diffe-Hellman parameters file
DHFILE="`mktemp -t mandos-client-dh-parameters.XXXXXXXXXX.pem`"
# First try certtool from GnuTLS
if ! certtool --generate-dh-params --sec-param high \
--outfile "$DHFILE"; then
# Otherwise try OpenSSL
if ! openssl genpkey -genparam -algorithm DH -out "$DHFILE" \
-pkeyopt dh_paramgen_prime_len:3072; then
# None of the commands succeded; give up
rm -- "$DHFILE"
return 1
fi
fi
sed --in-place --expression='0,/^-----BEGIN DH PARAMETERS-----$/d' \
"$DHFILE"
sed --in-place --expression='1i-----BEGIN DH PARAMETERS-----' \
"$DHFILE"
cp --archive "$DHFILE" /etc/keys/mandos/dhparams.pem
rm -- "$DHFILE"
}
case "$1" in
configure)
add_mandos_user "$@"
create_keys "$@"
create_dh_params "$@" || :
update_initramfs "$@"
if dpkg --compare-versions "$2" lt-nl "1.7.10-1"; then
PLUGINHELPERDIR=/usr/lib/$(dpkg-architecture -qDEB_HOST_MULTIARCH 2>/dev/null)/mandos/plugin-helpers
if ! dpkg-statoverride --list "$PLUGINHELPERDIR" \
>/dev/null 2>&1; then
chmod u=rwx,go= -- "$PLUGINHELPERDIR"
fi
if ! dpkg-statoverride --list /etc/mandos/plugin-helpers \
>/dev/null 2>&1; then
chmod u=rwx,go= -- /etc/mandos/plugin-helpers
fi
fi
;;
abort-upgrade|abort-deconfigure|abort-remove)
;;
*)
echo "$0 called with unknown argument '$1'" 1>&2
exit 1
;;
esac
#DEBHELPER#
exit 0
|