/mandos/release

To get this branch, use:
bzr branch http://bzr.recompile.se/loggerhead/mandos/release

« back to all changes in this revision

Viewing changes to debian/mandos-client.postinst

First version of a somewhat complete D-Bus server interface.  Also
change user/group name to "_mandos".

* debian/mandos.postinst: Rename old "mandos" user and group to
                          "_mandos"; create "_mandos" user and group
                          if none exist.
* debian/mandos-client.postinst: - '' -

* initramfs-tools-hook: Try "_mandos" before "mandos" as user and
                        group name.

* mandos (_datetime_to_dbus_struct): New; was previously local.
  (Client.started): Renamed to "last_started".  All users changed.
  (Client.started): New; boolean.
  (Client.dbus_object_path): New.
  (Client.check_command): Renamed to "checker_command".  All users
                          changed.
  (Client.__init__): Set and use "self.dbus_object_path".  Set
                     "self.started".
  (Client.start): Update "self.started".  Emit "self.PropertyChanged"
                  signals for both "started" and "last_started".
  (Client.stop): Update "self.started".  Emit "self.PropertyChanged"
                 signal for "started".
  (Client.checker_callback): Take additional "command" argument.  All
                             callers changed. Emit
                             "self.PropertyChanged" signal.
  (Client.bump_timeout): Emit "self.PropertyChanged" signal for
                         "last_checked_ok".
  (Client.start_checker): Emit "self.PropertyChanged" signal for
                          "checker_running".
  (Client.stop_checker): Emit "self.PropertyChanged" signal for
                         "checker_running".
  (Client.still_valid): Bug fix: use "getattr(self, started, False)"
                        instead of "self.started" in case this client
                        object is so new that the "started" attribute
                        has not been created yet.
  (Client.IntervalChanged, Client.CheckerIsRunning, Client.GetChecker,
  Client.GetCreated, Client.GetFingerprint, Client.GetHost,
  Client.GetInterval, Client.GetName, Client.GetStarted,
  Client.GetTimeout, Client.StateChanged, Client.TimeoutChanged):
  Removed; all callers changed.
  (Client.CheckerCompleted): Add "condition" and "command" arguments.
                             All callers changed.
  (Client.GetAllProperties, Client.PropertyChanged): New.
  (Client.StillValid): Renamed to "IsStillValid".
  (Client.StartChecker): Changed to its own function to avoid the
                         return value from "Client.start_checker()".
  (Client.Stop): Changed to its own function to avoid the return value
                 from "Client.stop()".
  (main): Try "_mandos" before "mandos" as user and group name.
          Removed inner function "remove_from_clients".  New inner
          class "MandosServer".

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#!/bin/sh
 
1
#!/bin/bash -e
2
2
# This script can be called in the following ways:
3
3
#
4
4
# After the package was installed:
17
17
 
18
18
. /usr/share/debconf/confmodule
19
19
 
20
 
set -e
21
 
 
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
 
            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"
55
 
            fi
56
 
        done
57
 
    fi
58
 
    
59
 
    if dpkg --compare-versions "$2" lt-nl "1.0.10-1"; then
60
 
        # Make old initrd.img files unreadable too, in case they were
61
 
        # created with mandos-client 1.0.8 or older.
62
 
        find /boot -maxdepth 1 -type f -name "initrd.img-*.bak" \
63
 
            -print0 | xargs --null --no-run-if-empty chmod o-r
 
23
    if [ -x /usr/sbin/update-initramfs ]; then
 
24
        update-initramfs -u -k all
64
25
    fi
65
26
}
66
27
 
67
28
# Add user and group
68
29
add_mandos_user(){
69
30
    # Rename old "mandos" user and group
70
 
    if dpkg --compare-versions "$2" lt "1.0.3-1"; then
71
 
        case "`getent passwd mandos`" in
72
 
            *:Mandos\ password\ system,,,:/nonexistent:/bin/false)
73
 
                usermod --login _mandos mandos
74
 
                groupmod --new-name _mandos mandos
75
 
                return
76
 
                ;;
77
 
        esac
78
 
    fi
 
31
    case "$(getent passwd mandos)" in
 
32
        *:Mandos\ password\ system,,,:/nonexistent:/bin/false)
 
33
            usermod --login _mandos mandos
 
34
            groupmod --new-name _mandos mandos
 
35
            return
 
36
            ;;
 
37
    esac
79
38
    # Create new user and group
80
39
    if ! getent passwd _mandos >/dev/null; then
81
40
        adduser --system --force-badname --quiet --home /nonexistent \
84
43
    fi
85
44
}
86
45
 
87
 
# Create client key pairs
88
 
create_keys(){
89
 
    # If the OpenPGP key files do not exist, generate all keys using
90
 
    # mandos-keygen
91
 
    if ! [ -r /etc/keys/mandos/pubkey.txt \
92
 
              -a -r /etc/keys/mandos/seckey.txt ]; then
 
46
# Create client key pair
 
47
create_key(){
 
48
    if [ -r /etc/keys/mandos/pubkey.txt \
 
49
        -a -r /etc/keys/mandos/seckey.txt ]; then
 
50
        return 0
 
51
    fi
 
52
    if [ -x /usr/sbin/mandos-keygen ]; then
93
53
        mandos-keygen
94
 
        gpg-connect-agent KILLAGENT /bye || :
95
 
        return 0
96
 
    fi
97
 
 
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
 
             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
 
    # If the TLS keys already exists, do nothing
113
 
    if [ -r /etc/keys/mandos/tls-privkey.pem \
114
 
            -a -r /etc/keys/mandos/tls-pubkey.pem ]; then
115
 
        return 0
116
 
    fi
117
 
 
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 2>/dev/null; then
125
 
 
126
 
        local umask=$(umask)
127
 
        umask 077
128
 
        cp --archive "$TLS_PRIVKEYTMP" /etc/keys/mandos/tls-privkey.pem
129
 
        shred --remove -- "$TLS_PRIVKEYTMP" 2>/dev/null || :
130
 
 
131
 
        # First try certtool from GnuTLS
132
 
        if ! certtool --password='' \
133
 
             --load-privkey=/etc/keys/mandos/tls-privkey.pem \
134
 
             --outfile=/etc/keys/mandos/tls-pubkey.pem --pubkey-info \
135
 
             --no-text 2>/dev/null; then
136
 
            # Otherwise try OpenSSL
137
 
            if ! openssl pkey -in /etc/keys/mandos/tls-privkey.pem \
138
 
                 -out /etc/keys/mandos/tls-pubkey.pem -pubout; then
139
 
                rm --force /etc/keys/mandos/tls-pubkey.pem
140
 
                # None of the commands succeded; give up
141
 
                umask $umask
142
 
                return 1
143
 
            fi
144
 
        fi
145
 
        umask $umask
146
 
 
147
 
        key_id=$(mandos-keygen --passfile=/dev/null \
148
 
                     | grep --regexp="^key_id[ =]")
149
 
 
150
 
        db_version 2.0
151
 
        db_fset mandos-client/key_id seen false
152
 
        db_reset mandos-client/key_id
153
 
        db_subst mandos-client/key_id key_id $key_id
154
 
        db_input critical mandos-client/key_id || true
155
 
        db_go
156
 
        db_stop
157
 
    else
158
 
        shred --remove -- "$TLS_PRIVKEYTMP" 2>/dev/null || :
159
 
    fi
160
 
}
161
 
 
162
 
create_dh_params(){
163
 
    if [ -r /etc/keys/mandos/dhparams.pem ]; then
164
 
        return 0
165
 
    fi
166
 
    # Create a Diffe-Hellman parameters file
167
 
    DHFILE="`mktemp -t mandos-client-dh-parameters.XXXXXXXXXX.pem`"
168
 
    # First try certtool from GnuTLS
169
 
    if ! certtool --generate-dh-params --sec-param high \
170
 
         --outfile "$DHFILE"; then
171
 
        # Otherwise try OpenSSL
172
 
        if ! openssl genpkey -genparam -algorithm DH -out "$DHFILE" \
173
 
             -pkeyopt dh_paramgen_prime_len:3072; then
174
 
            # None of the commands succeded; give up
175
 
            rm -- "$DHFILE"
176
 
            return 1
177
 
        fi
178
 
    fi
179
 
    sed --in-place --expression='0,/^-----BEGIN DH PARAMETERS-----$/d' \
180
 
        "$DHFILE"
181
 
    sed --in-place --expression='1i-----BEGIN DH PARAMETERS-----' \
182
 
            "$DHFILE"
183
 
    cp --archive "$DHFILE" /etc/keys/mandos/dhparams.pem
184
 
    rm -- "$DHFILE"
 
54
    fi
185
55
}
186
56
 
187
57
case "$1" in
188
58
    configure)
189
 
        add_mandos_user "$@"
190
 
        create_keys "$@"
191
 
        create_dh_params "$@" || :
192
 
        update_initramfs "$@"
193
 
        if dpkg --compare-versions "$2" lt-nl "1.7.10-1"; then
194
 
            PLUGINHELPERDIR=/usr/lib/$(dpkg-architecture -qDEB_HOST_MULTIARCH 2>/dev/null)/mandos/plugin-helpers
195
 
            if ! dpkg-statoverride --list "$PLUGINHELPERDIR" \
196
 
                 >/dev/null 2>&1; then
197
 
                chmod u=rwx,go= -- "$PLUGINHELPERDIR"
198
 
            fi
199
 
            if ! dpkg-statoverride --list /etc/mandos/plugin-helpers \
200
 
                 >/dev/null 2>&1; then
201
 
                chmod u=rwx,go= -- /etc/mandos/plugin-helpers
202
 
            fi
203
 
        fi
 
59
        add_mandos_user
 
60
        create_key
 
61
        update_initramfs
204
62
        ;;
205
63
    abort-upgrade|abort-deconfigure|abort-remove)
206
64
        ;;
207
65
 
208
66
    *)
209
 
        echo "$0 called with unknown argument '$1'" 1>&2
 
67
        echo "$0 called with unknown argument \`$1'" 1>&2
210
68
        exit 1
211
69
        ;;
212
70
esac