/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 debian/mandos-client.postinst

  • Committer: Teddy Hogeborn
  • Date: 2015-03-10 18:03:38 UTC
  • Revision ID: teddy@recompile.se-20150310180338-pcxw6r2qmw9k6br9
Add ":!RSA" to GnuTLS priority string, to disallow non-DHE kx.

If Mandos was somehow made to use a non-ephemeral Diffie-Hellman key
exchange algorithm in the TLS handshake, any saved network traffic
could then be decrypted later if the Mandos client key was obtained.
By default, Mandos uses ephemeral DH key exchanges which does not have
this problem, but a non-ephemeral key exchange algorithm was still
enabled by default.  The simplest solution is to simply turn that off,
which ensures that Mandos will always use ephemeral DH key exchanges.

There is a "PFS" priority string specifier, but we can't use it because:

1. Security-wise, it is a mix between "NORMAL" and "SECURE128" - it
   enables a lot more algorithms than "SECURE256".

2. It is only available since GnuTLS 3.2.4.

Thanks to Andreas Fischer <af@bantuX.org> for reporting this issue.

Show diffs side-by-side

added added

removed removed

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