/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: 2019-02-10 03:50:20 UTC
  • Revision ID: teddy@recompile.se-20190210035020-nttr1tybgwwixueu
Show debconf note about new TLS key IDs

If mandos-client did not see TLS keys and had to create them, or if
mandos sees GnuTLS version 3.6.6 or later, show an important notice on
package installation about the importance of adding the new key_id
options to clients.conf on the Mandos server.

* debian/control (Package: mandos, Package: mandos-client): Depend on
                                                            debconf.
* debian/mandos-client.lintian-overrides: Override warnings.
* debian/mandos-client.postinst (create_keys): Show notice if new TLS
                                               key files were created.
* debian/mandos-client.templates: New.
* debian/mandos.lintian-overrides: Override warnings.
* debian/mandos.postinst (configure): If GnuTLS 3.6.6 or later is
                                      detected, show an important
                                      notice (once) about the new
                                      key_id option required in
                                      clients.conf.
* debian/mandos.templates: New.

Show diffs side-by-side

added added

removed removed

Lines of Context:
22
22
# Update the initial RAM file system image
23
23
update_initramfs()
24
24
{
25
 
    if command -v update-initramfs >/dev/null; then
26
 
        update-initramfs -k all -u 1>&2
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
 
            if [ -e /boot/initrd.img-"$kversion" ]; then
41
 
                chmod go-r /boot/initrd.img-"$kversion"
42
 
            else
43
 
                # An initrd image has not yet been created for this
44
 
                # kernel, possibly because this new kernel is about to
45
 
                # be, but has not yet been, installed.  In this case,
46
 
                # we create an empty file with the right permissions
47
 
                # so that Dracut will preserve those permissions when
48
 
                # it creates the real, new initrd image for this
49
 
                # kernel.
50
 
                install --mode=u=rw /dev/null \
51
 
                        /boot/initrd.img-"$kversion"
52
 
            fi
53
 
            if [ "$kversion" != "*" ]; then
54
 
                /etc/kernel/postinst.d/dracut "$kversion" 1>&2
55
 
            fi
56
 
        done
57
 
    fi
 
25
    update-initramfs -u -k all
58
26
    
59
27
    if dpkg --compare-versions "$2" lt-nl "1.0.10-1"; then
60
28
        # Make old initrd.img files unreadable too, in case they were
70
38
    if dpkg --compare-versions "$2" lt "1.0.3-1"; then
71
39
        case "`getent passwd mandos`" in
72
40
            *:Mandos\ password\ system,,,:/nonexistent:/bin/false)
73
 
                usermod --login _mandos mandos 1>&2
74
 
                groupmod --new-name _mandos mandos 1>&2
 
41
                usermod --login _mandos mandos
 
42
                groupmod --new-name _mandos mandos
75
43
                return
76
44
                ;;
77
45
        esac
80
48
    if ! getent passwd _mandos >/dev/null; then
81
49
        adduser --system --force-badname --quiet --home /nonexistent \
82
50
            --no-create-home --group --disabled-password \
83
 
            --gecos "Mandos password system" _mandos 1>&2
 
51
            --gecos "Mandos password system" _mandos
84
52
    fi
85
53
}
86
54
 
90
58
    # mandos-keygen
91
59
    if ! [ -r /etc/keys/mandos/pubkey.txt \
92
60
              -a -r /etc/keys/mandos/seckey.txt ]; then
93
 
        mandos-keygen 1>&2
94
 
        gpg-connect-agent KILLAGENT /bye 1>&2 || :
 
61
        mandos-keygen
 
62
        gpg-connect-agent KILLAGENT /bye || :
95
63
        return 0
96
64
    fi
97
65
 
98
 
    # Remove any bad TLS keys by 1.8.0-1
99
 
    if dpkg --compare-versions "$2" eq "1.8.0-1" \
100
 
       || dpkg --compare-versions "$2" eq "1.8.0-1~bpo9+1"; then
101
 
        # Is the key bad?
102
 
        if ! certtool --password='' \
103
 
             --load-privkey=/etc/keys/mandos/tls-privkey.pem \
104
 
             --outfile=/dev/null --pubkey-info --no-text \
105
 
              1>&2 2>/dev/null; then
106
 
            shred --remove -- /etc/keys/mandos/tls-privkey.pem \
107
 
                  2>/dev/null || :
108
 
            rm --force -- /etc/keys/mandos/tls-pubkey.pem
109
 
        fi
110
 
    fi
111
 
 
112
66
    # If the TLS keys already exists, do nothing
113
67
    if [ -r /etc/keys/mandos/tls-privkey.pem \
114
68
            -a -r /etc/keys/mandos/tls-pubkey.pem ]; then
115
69
        return 0
116
70
    fi
117
71
 
118
 
    # Try to create the TLS keys
119
 
 
120
 
    TLS_PRIVKEYTMP="`mktemp -t mandos-client-privkey.XXXXXXXXXX`"
121
 
 
122
 
    if certtool --generate-privkey --password='' \
123
 
                --outfile "$TLS_PRIVKEYTMP" --sec-param ultra \
124
 
                --key-type=ed25519 --pkcs8 --no-text 1>&2 \
125
 
                2>/dev/null; then
126
 
 
127
 
        local umask=$(umask)
128
 
        umask 077
129
 
        cp --archive "$TLS_PRIVKEYTMP" /etc/keys/mandos/tls-privkey.pem
130
 
        shred --remove -- "$TLS_PRIVKEYTMP" 2>/dev/null || :
131
 
 
132
 
        # First try certtool from GnuTLS
133
 
        if ! certtool --password='' \
134
 
             --load-privkey=/etc/keys/mandos/tls-privkey.pem \
135
 
             --outfile=/etc/keys/mandos/tls-pubkey.pem --pubkey-info \
136
 
             --no-text 1>&2 2>/dev/null; then
137
 
            # Otherwise try OpenSSL
138
 
            if ! openssl pkey -in /etc/keys/mandos/tls-privkey.pem \
139
 
                 -out /etc/keys/mandos/tls-pubkey.pem -pubout \
140
 
                 1>&2; then
141
 
                rm --force /etc/keys/mandos/tls-pubkey.pem
142
 
                # None of the commands succeded; give up
143
 
                umask $umask
144
 
                return 1
145
 
            fi
146
 
        fi
147
 
        umask $umask
148
 
 
149
 
        key_id=$(mandos-keygen --passfile=/dev/null \
150
 
                     | grep --regexp="^key_id[ =]")
151
 
 
152
 
        db_version 2.0
153
 
        db_fset mandos-client/key_id seen false
154
 
        db_reset mandos-client/key_id
155
 
        db_subst mandos-client/key_id key_id $key_id
156
 
        db_input critical mandos-client/key_id || true
157
 
        db_go
158
 
        db_stop
159
 
    else
160
 
        shred --remove -- "$TLS_PRIVKEYTMP" 2>/dev/null || :
161
 
    fi
 
72
    # If this is an upgrade from an old installation, the TLS keys
 
73
    # will not exist; create them.
 
74
 
 
75
    # First try certtool from GnuTLS
 
76
    if ! certtool --generate-privkey --password='' \
 
77
         --outfile /etc/keys/mandos/tls-privkey.pem \
 
78
         --sec-param ultra --key-type=ed25519 --pkcs8 --no-text \
 
79
         2>/dev/null; then
 
80
        # Otherwise try OpenSSL
 
81
        if ! openssl genpkey -algorithm X25519 \
 
82
             -out /etc/keys/mandos/tls-privkey.pem; then
 
83
            rm --force /etc/keys/mandos/tls-privkey.pem
 
84
            # None of the commands succeded; give up
 
85
            return 1
 
86
        fi
 
87
    fi
 
88
 
 
89
    local umask=$(umask)
 
90
    umask 077
 
91
    # First try certtool from GnuTLS
 
92
    if ! certtool --password='' \
 
93
         --load-privkey=/etc/keys/mandos/tls-privkey.pem \
 
94
         --outfile=/etc/keys/mandos/tls-pubkey.pem --pubkey-info \
 
95
         --no-text 2>/dev/null; then
 
96
        # Otherwise try OpenSSL
 
97
        if ! openssl pkey -in /etc/keys/mandos/tls-privkey.pem \
 
98
             -out /etc/keys/mandos/tls-pubkey.pem -pubout; then
 
99
            rm --force /etc/keys/mandos/tls-pubkey.pem
 
100
            # None of the commands succeded; give up
 
101
            umask $umask
 
102
            return 1
 
103
        fi
 
104
    fi
 
105
    umask $umask
 
106
 
 
107
    key_id=$(mandos-keygen --passfile=/dev/null \
 
108
                 | grep --regexp="^key_id[ =]")
 
109
 
 
110
    db_version 2.0
 
111
    db_fset mandos-client/key_id seen false
 
112
    db_reset mandos-client/key_id
 
113
    db_subst mandos-client/key_id key_id $key_id
 
114
    db_input critical mandos-client/key_id || true
 
115
    db_go
 
116
    db_stop
162
117
}
163
118
 
164
119
create_dh_params(){
169
124
    DHFILE="`mktemp -t mandos-client-dh-parameters.XXXXXXXXXX.pem`"
170
125
    # First try certtool from GnuTLS
171
126
    if ! certtool --generate-dh-params --sec-param high \
172
 
         --outfile "$DHFILE" 1>&2; then
 
127
         --outfile "$DHFILE"; then
173
128
        # Otherwise try OpenSSL
174
129
        if ! openssl genpkey -genparam -algorithm DH -out "$DHFILE" \
175
 
             -pkeyopt dh_paramgen_prime_len:3072 1>&2; then
 
130
             -pkeyopt dh_paramgen_prime_len:3072; then
176
131
            # None of the commands succeded; give up
177
 
            rm --force -- "$DHFILE"
 
132
            rm -- "$DHFILE"
178
133
            return 1
179
134
        fi
180
135
    fi
183
138
    sed --in-place --expression='1i-----BEGIN DH PARAMETERS-----' \
184
139
            "$DHFILE"
185
140
    cp --archive "$DHFILE" /etc/keys/mandos/dhparams.pem
186
 
    rm --force -- "$DHFILE"
 
141
    rm -- "$DHFILE"
187
142
}
188
143
 
189
144
case "$1" in