/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: 2024-11-17 16:53:00 UTC
  • Revision ID: teddy@recompile.se-20241117165300-02hxm96s8cj9528e
mandos: Avoid closing configured server network socket

If we are passed a pre-created created network socket as a file
descriptor, we must avoid later closing it (when stdin, stdout and
stderr are dup2()ed over with /dev/null) by making sure that the
network file descriptor is not 0, 1, or 2, by creating a new file
descriptor if necessary.

However, when we create a new file descriptor we must check that the
new file descriptor is not 0, 1, or 2 either, and try again until we
get a suitable file descriptor.

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
 
    update-initramfs -u -k all
 
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
26
58
    
27
59
    if dpkg --compare-versions "$2" lt-nl "1.0.10-1"; then
28
60
        # Make old initrd.img files unreadable too, in case they were
38
70
    if dpkg --compare-versions "$2" lt "1.0.3-1"; then
39
71
        case "`getent passwd mandos`" in
40
72
            *:Mandos\ password\ system,,,:/nonexistent:/bin/false)
41
 
                usermod --login _mandos mandos
42
 
                groupmod --new-name _mandos mandos
 
73
                usermod --login _mandos mandos 1>&2
 
74
                groupmod --new-name _mandos mandos 1>&2
43
75
                return
44
76
                ;;
45
77
        esac
48
80
    if ! getent passwd _mandos >/dev/null; then
49
81
        adduser --system --force-badname --quiet --home /nonexistent \
50
82
            --no-create-home --group --disabled-password \
51
 
            --gecos "Mandos password system" _mandos
 
83
            --gecos "Mandos password system" _mandos 1>&2
52
84
    fi
53
85
}
54
86
 
58
90
    # mandos-keygen
59
91
    if ! [ -r /etc/keys/mandos/pubkey.txt \
60
92
              -a -r /etc/keys/mandos/seckey.txt ]; then
61
 
        mandos-keygen
62
 
        gpg-connect-agent KILLAGENT /bye || :
 
93
        mandos-keygen 1>&2
 
94
        gpg-connect-agent KILLAGENT /bye 1>&2 || :
63
95
        return 0
64
96
    fi
65
97
 
70
102
        if ! certtool --password='' \
71
103
             --load-privkey=/etc/keys/mandos/tls-privkey.pem \
72
104
             --outfile=/dev/null --pubkey-info --no-text \
73
 
             2>/dev/null; then
 
105
              1>&2 2>/dev/null; then
74
106
            shred --remove -- /etc/keys/mandos/tls-privkey.pem \
75
107
                  2>/dev/null || :
76
108
            rm --force -- /etc/keys/mandos/tls-pubkey.pem
89
121
 
90
122
    if certtool --generate-privkey --password='' \
91
123
                --outfile "$TLS_PRIVKEYTMP" --sec-param ultra \
92
 
                --key-type=ed25519 --pkcs8 --no-text 2>/dev/null; then
 
124
                --key-type=ed25519 --pkcs8 --no-text 1>&2 \
 
125
                2>/dev/null; then
93
126
 
94
127
        local umask=$(umask)
95
128
        umask 077
100
133
        if ! certtool --password='' \
101
134
             --load-privkey=/etc/keys/mandos/tls-privkey.pem \
102
135
             --outfile=/etc/keys/mandos/tls-pubkey.pem --pubkey-info \
103
 
             --no-text 2>/dev/null; then
 
136
             --no-text 1>&2 2>/dev/null; then
104
137
            # Otherwise try OpenSSL
105
138
            if ! openssl pkey -in /etc/keys/mandos/tls-privkey.pem \
106
 
                 -out /etc/keys/mandos/tls-pubkey.pem -pubout; then
 
139
                 -out /etc/keys/mandos/tls-pubkey.pem -pubout \
 
140
                 1>&2; then
107
141
                rm --force /etc/keys/mandos/tls-pubkey.pem
108
142
                # None of the commands succeded; give up
109
143
                umask $umask
135
169
    DHFILE="`mktemp -t mandos-client-dh-parameters.XXXXXXXXXX.pem`"
136
170
    # First try certtool from GnuTLS
137
171
    if ! certtool --generate-dh-params --sec-param high \
138
 
         --outfile "$DHFILE"; then
 
172
         --outfile "$DHFILE" 1>&2; then
139
173
        # Otherwise try OpenSSL
140
174
        if ! openssl genpkey -genparam -algorithm DH -out "$DHFILE" \
141
 
             -pkeyopt dh_paramgen_prime_len:3072; then
 
175
             -pkeyopt dh_paramgen_prime_len:3072 1>&2; then
142
176
            # None of the commands succeded; give up
143
 
            rm -- "$DHFILE"
 
177
            rm --force -- "$DHFILE"
144
178
            return 1
145
179
        fi
146
180
    fi
149
183
    sed --in-place --expression='1i-----BEGIN DH PARAMETERS-----' \
150
184
            "$DHFILE"
151
185
    cp --archive "$DHFILE" /etc/keys/mandos/dhparams.pem
152
 
    rm -- "$DHFILE"
 
186
    rm --force -- "$DHFILE"
153
187
}
154
188
 
155
189
case "$1" in