/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 mandos-keygen

  • Committer: Teddy Hogeborn
  • Date: 2019-08-02 22:16:53 UTC
  • Revision ID: teddy@recompile.se-20190802221653-ic1iko9hbefzwsk7
Fix bug in server Debian package: Fails to start on first install

There has been a very long-standing bug where installation of the
server (the "mandos" Debian package) would fail to start the server
properly right after installation.  It would work on manual (re)start
after installation, or after reboot, and even after package purge and
reinstall, it would then work the first time.  The problem, it turns
out, is when the new "_mandos" user (and corresponding group) is
created, the D-Bus server is not reloaded, and is therefore not aware
of that user, and does not recognize the user and group name in the
/etc/dbus-1/system.d/mandos.conf file.  The Mandos server, when it
tries to start and access the D-Bus, is then not permitted to connect
to its D-Bus bus name, and disables D-Bus use as a fallback measure;
i.e. the server works, but it is not controllable via D-Bus commands
(via mandos-ctl or mandos-monitor).  The next time the D-Bus daemon is
reloaded for any reason, the new user & group would become visible to
the D-Bus daemon and after that, any restart of the Mandos server
would succeed and it would bind to its D-Bus name properly, and
thereby be visible and controllable by mandos-ctl & mandos-monitor.
This was mostly invisible when using sysvinit, but systemd makes the
problem visible since the systemd service file for the Mandos server
is configured to not consider the Mandos server "started" until the
D-Bus name has been bound; this makes the starting of the service wait
for 90 seconds and then fail with a timeout error.

Fixing this should also make the Debian CI autopkgtest tests work.

* debian/mandos.postinst (configure): After creating (or renaming)
                                      user & group, reload D-Bus
                                      daemon (if present).

Show diffs side-by-side

added added

removed removed

Lines of Context:
23
23
# Contact the authors at <mandos@recompile.se>.
24
24
25
25
 
26
 
VERSION="1.8.17"
 
26
VERSION="1.8.5"
27
27
 
28
28
KEYDIR="/etc/keys/mandos"
29
29
KEYTYPE=RSA
147
147
        echo "Empty key type" >&2
148
148
        exit 1
149
149
    fi
150
 
 
 
150
    
151
151
    if [ -z "$KEYNAME" ]; then
152
152
        echo "Empty key name" >&2
153
153
        exit 1
154
154
    fi
155
 
 
 
155
    
156
156
    if [ -z "$KEYLENGTH" ] || [ "$KEYLENGTH" -lt 512 ]; then
157
157
        echo "Invalid key length" >&2
158
158
        exit 1
159
159
    fi
160
 
 
 
160
    
161
161
    if [ -z "$KEYEXPIRE" ]; then
162
162
        echo "Empty key expiration" >&2
163
163
        exit 1
164
164
    fi
165
 
 
 
165
    
166
166
    # Make FORCE be 0 or 1
167
167
    case "$FORCE" in
168
168
        [Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]) FORCE=1;;
169
169
        [Nn][Oo]|[Ff][Aa][Ll][Ss][Ee]|*) FORCE=0;;
170
170
    esac
171
 
 
 
171
    
172
172
    if { [ -e "$SECKEYFILE" ] || [ -e "$PUBKEYFILE" ] \
173
173
             || [ -e "$TLS_PRIVKEYFILE" ] \
174
174
             || [ -e "$TLS_PUBKEYFILE" ]; } \
176
176
        echo "Refusing to overwrite old key files; use --force" >&2
177
177
        exit 1
178
178
    fi
179
 
 
 
179
    
180
180
    # Set lines for GnuPG batch file
181
181
    if [ -n "$KEYCOMMENT" ]; then
182
182
        KEYCOMMENTLINE="Name-Comment: $KEYCOMMENT"
184
184
    if [ -n "$KEYEMAIL" ]; then
185
185
        KEYEMAILLINE="Name-Email: $KEYEMAIL"
186
186
    fi
187
 
 
 
187
    
188
188
    # Create temporary gpg batch file
189
189
    BATCHFILE="`mktemp -t mandos-keygen-batch.XXXXXXXXXX`"
190
190
    TLS_PRIVKEYTMP="`mktemp -t mandos-keygen-privkey.XXXXXXXXXX`"
233
233
        %no-protection
234
234
        %commit
235
235
        EOF
236
 
 
 
236
    
237
237
    if tty --quiet; then
238
238
        cat <<-EOF
239
239
        Note: Due to entropy requirements, key generation could take
276
276
            fi
277
277
        fi
278
278
    fi
279
 
 
 
279
    
280
280
    # Make sure trustdb.gpg exists;
281
281
    # this is a workaround for Debian bug #737128
282
282
    gpg --quiet --batch --no-tty --no-options --enable-dsa2 \
287
287
        --homedir "$RINGDIR" --trust-model always \
288
288
        --gen-key "$BATCHFILE"
289
289
    rm --force "$BATCHFILE"
290
 
 
 
290
    
291
291
    if tty --quiet; then
292
292
        echo -n "Finished: "
293
293
        date
294
294
    fi
295
 
 
 
295
    
296
296
    # Backup any old key files
297
297
    if cp --backup=numbered --force "$SECKEYFILE" "$SECKEYFILE" \
298
298
        2>/dev/null; then
302
302
        2>/dev/null; then
303
303
        rm --force "$PUBKEYFILE"
304
304
    fi
305
 
 
 
305
    
306
306
    FILECOMMENT="Mandos client key for $KEYNAME"
307
307
    if [ "$KEYCOMMENT" != "$KEYCOMMENT_ORIG" ]; then
308
308
        FILECOMMENT="$FILECOMMENT ($KEYCOMMENT)"
309
309
    fi
310
 
 
 
310
    
311
311
    if [ -n "$KEYEMAIL" ]; then
312
312
        FILECOMMENT="$FILECOMMENT <$KEYEMAIL>"
313
313
    fi
314
 
 
 
314
    
315
315
    # Export key from key rings to key files
316
316
    gpg --quiet --batch --no-tty --no-options --enable-dsa2 \
317
317
        --homedir "$RINGDIR" --armor --export-options export-minimal \
323
323
fi
324
324
 
325
325
if [ "$mode" = password ]; then
326
 
 
 
326
    
327
327
    # Make SSH be 0 or 1
328
328
    case "$SSH" in
329
329
        [Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]) SSH=1;;
330
330
        [Nn][Oo]|[Ff][Aa][Ll][Ss][Ee]|*) SSH=0;;
331
331
    esac
332
 
 
 
332
    
333
333
    if [ $SSH -eq 1 ]; then
334
334
        for ssh_keytype in ecdsa-sha2-nistp256 ed25519 rsa; do
335
335
            set +e
346
346
            fi
347
347
        done
348
348
    fi
349
 
 
 
349
    
350
350
    # Import key into temporary key rings
351
351
    gpg --quiet --batch --no-tty --no-options --enable-dsa2 \
352
352
        --homedir "$RINGDIR" --trust-model always --armor \
354
354
    gpg --quiet --batch --no-tty --no-options --enable-dsa2 \
355
355
        --homedir "$RINGDIR" --trust-model always --armor \
356
356
        --import "$PUBKEYFILE"
357
 
 
 
357
    
358
358
    # Get fingerprint of key
359
359
    FINGERPRINT="`gpg --quiet --batch --no-tty --no-options \
360
360
        --enable-dsa2 --homedir "$RINGDIR" --trust-model always \
361
361
        --fingerprint --with-colons \
362
362
        | sed --quiet \
363
363
        --expression='/^fpr:/{s/^fpr:.*:\\([0-9A-Z]*\\):\$/\\1/p;q}'`"
364
 
 
 
364
    
365
365
    test -n "$FINGERPRINT"
366
 
 
 
366
    
367
367
    if [ -r "$TLS_PUBKEYFILE" ]; then
368
368
       KEY_ID="$(certtool --key-id --hash=sha256 \
369
369
                       --infile="$TLS_PUBKEYFILE" 2>/dev/null || :)"
376
376
       fi
377
377
       test -n "$KEY_ID"
378
378
    fi
379
 
 
 
379
    
380
380
    FILECOMMENT="Encrypted password for a Mandos client"
381
 
 
 
381
    
382
382
    while [ ! -s "$SECFILE" ]; do
383
383
        if [ -n "$PASSFILE" ]; then
384
384
            cat -- "$PASSFILE"
397
397
                echo "Passphrase mismatch" >&2
398
398
                touch "$RINGDIR"/mismatch
399
399
            else
400
 
                printf "%s" "$first"
 
400
                echo -n "$first"
401
401
            fi
402
402
        fi | gpg --quiet --batch --no-tty --no-options --enable-dsa2 \
403
403
            --homedir "$RINGDIR" --trust-model always --armor \
412
412
            fi
413
413
        fi
414
414
    done
415
 
 
 
415
    
416
416
    cat <<-EOF
417
417
        [$KEYNAME]
418
418
        host = $KEYNAME