/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 initramfs-tools-hook

  • 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:
3
3
# This script will be run by 'mkinitramfs' when it creates the image.
4
4
# Its job is to decide which files to install, then install them into
5
5
# the staging area, where the initramfs is being created.  This
6
 
# happens when a new 'linux-image' package is installed, or when the
 
6
# happens when a new 'linux-image' package is installed, or when an
7
7
# administrator runs 'update-initramfs' by hand to update an initramfs
8
8
# image.
9
9
 
29
29
 
30
30
. /usr/share/initramfs-tools/hook-functions
31
31
 
32
 
if [ -d /usr/lib/mandos ]; then
33
 
    prefix=/usr
34
 
elif [ -d /usr/local/lib/mandos ]; then
35
 
    prefix=/usr/local
36
 
else
 
32
for d in /usr/lib \
 
33
    "/usr/lib/`dpkg-architecture -qDEB_HOST_MULTIARCH 2>/dev/null`" \
 
34
    "`rpm --eval='%{_libdir}' 2>/dev/null`" /usr/local/lib; do
 
35
    if [ -d "$d"/mandos ]; then
 
36
        libdir="$d"
 
37
        break
 
38
    fi
 
39
done
 
40
if [ -z "$libdir" ]; then
37
41
    # Mandos not found
38
42
    exit 1
39
43
fi
40
44
 
 
45
for d in /etc/keys/mandos /etc/mandos/keys; do
 
46
    if [ -d "$d" ]; then
 
47
        keydir="$d"
 
48
        break
 
49
    fi
 
50
done
 
51
if [ -z "$keydir" ]; then
 
52
    # Mandos key directory not found
 
53
    exit 1
 
54
fi
 
55
 
 
56
set `{ getent passwd _mandos \
 
57
    || getent passwd nobody \
 
58
    || echo ::65534:65534:::; } \
 
59
    | cut --delimiter=: --fields=3,4 --only-delimited \
 
60
    --output-delimiter=" "`
 
61
mandos_user="$1"
 
62
mandos_group="$2"
 
63
 
41
64
# The Mandos network client uses the network
42
65
auto_add_modules net
43
66
# The Mandos network client uses IPv6
47
70
CONFDIR="/conf/conf.d/mandos"
48
71
MANDOSDIR="/lib/mandos"
49
72
PLUGINDIR="${MANDOSDIR}/plugins.d"
 
73
HOOKDIR="${MANDOSDIR}/network-hooks.d"
50
74
 
51
75
# Make directories
52
 
mkdir --parents "${DESTDIR}${CONFDIR}"
53
 
mkdir --parents "${DESTDIR}${PLUGINDIR}"
 
76
install --directory --mode=u=rwx,go=rx "${DESTDIR}${CONFDIR}" \
 
77
        "${DESTDIR}${MANDOSDIR}" "${DESTDIR}${HOOKDIR}"
 
78
install --owner=${mandos_user} --group=${mandos_group} --directory \
 
79
    --mode=u=rwx "${DESTDIR}${PLUGINDIR}"
54
80
 
55
81
# Copy the Mandos plugin runner
56
 
copy_exec "$prefix"/lib/mandos/plugin-runner "${DESTDIR}${MANDOSDIR}"
 
82
copy_exec "$libdir"/mandos/plugin-runner "${MANDOSDIR}"
57
83
 
58
84
# Copy the plugins
59
85
 
60
86
# Copy the packaged plugins
61
 
for file in "$prefix"/lib/mandos/plugins.d/*; do
 
87
for file in "$libdir"/mandos/plugins.d/*; do
62
88
    base="`basename \"$file\"`"
63
89
    # Is this plugin overridden?
64
90
    if [ -e "/etc/mandos/plugins.d/$base" ]; then
65
91
        continue
66
92
    fi
67
93
    case "$base" in
68
 
        *~|.*|\#*\#|*.dpkg-old|*.dpkg-new|*.dpkg-divert) : ;;
69
 
        *) copy_exec "$file" "${PLUGINDIR}";;
 
94
        *~|.*|\#*\#|*.dpkg-old|*.dpkg-bak|*.dpkg-new|*.dpkg-divert)
 
95
            : ;;
 
96
        "*") echo "W: Mandos client plugin directory is empty." >&2 ;;
 
97
        *) copy_exec "$file" "${PLUGINDIR}" ;;
70
98
    esac
71
99
done
72
100
 
74
102
for file in /etc/mandos/plugins.d/*; do
75
103
    base="`basename \"$file\"`"
76
104
    case "$base" in
77
 
        *~|.*|*.dpkg-old|*.dpkg-new|*.dpkg-divert) : ;;
78
 
        *) copy_exec "$file" "${PLUGINDIR}";;
79
 
    esac
80
 
done
81
 
 
82
 
# GPGME needs /usr/bin/gpg
83
 
if ! [ -e "${DESTDIR}/usr/bin/gpg" ] \
84
 
    && [ -n "`ls \"${DESTDIR}\"/usr/lib/libgpgme.so* 2>/dev/null`" ]; then
85
 
    copy_exec /usr/bin/gpg
 
105
        *~|.*|\#*\#|*.dpkg-old|*.dpkg-bak|*.dpkg-new|*.dpkg-divert)
 
106
            : ;;
 
107
        "*") : ;;
 
108
        *) copy_exec "$file" "${PLUGINDIR}" ;;
 
109
    esac
 
110
done
 
111
 
 
112
# Get DEVICE from initramfs.conf and other files
 
113
. /etc/initramfs-tools/initramfs.conf
 
114
for conf in /etc/initramfs-tools/conf.d/*; do
 
115
    if [ -n `basename \"$conf\" | grep '^[[:alnum:]][[:alnum:]\._-]*$' \
 
116
        | grep -v '\.dpkg-.*$'` ]; then
 
117
        [ -f ${conf} ] && . ${conf}
 
118
    fi
 
119
done
 
120
export DEVICE
 
121
 
 
122
# Copy network hooks
 
123
for hook in /etc/mandos/network-hooks.d/*; do
 
124
    case "`basename \"$hook\"`" in
 
125
        "*") continue ;;
 
126
        *[!A-Za-z0-9_.-]*) continue ;;
 
127
        *) test -d "$hook" || copy_exec "$hook" "${HOOKDIR}" ;;
 
128
    esac
 
129
    if [ -x "$hook" ]; then
 
130
        # Copy any files needed by the network hook
 
131
        MANDOSNETHOOKDIR=/etc/mandos/network-hooks.d MODE=files \
 
132
            VERBOSITY=0 "$hook" files | while read file target; do
 
133
            if [ ! -e "${file}" ]; then
 
134
                echo "WARNING: file ${file} not found, requested by Mandos network hook '${hook##*/}'" >&2
 
135
            fi
 
136
            if [ -z "${target}" ]; then
 
137
                copy_exec "$file"
 
138
            else
 
139
                copy_exec "$file" "$target"
 
140
            fi
 
141
        done
 
142
        # Copy and load any modules needed by the network hook
 
143
        MANDOSNETHOOKDIR=/etc/mandos/network-hooks.d MODE=modules \
 
144
            VERBOSITY=0 "$hook" modules | while read module; do
 
145
            if [ -z "${target}" ]; then
 
146
                force_load "$module"
 
147
            fi
 
148
        done
 
149
    fi
 
150
done
 
151
 
 
152
# GPGME needs GnuPG
 
153
gpg=/usr/bin/gpg
 
154
libgpgme11_version="`dpkg-query --showformat='${Version}' --show libgpgme11`"
 
155
if dpkg --compare-versions "$libgpgme11_version" ge 1.5.0-0.1; then
 
156
    if [ -e /usr/bin/gpgconf ]; then
 
157
        if [ ! -e "${DESTDIR}/usr/bin/gpgconf" ]; then
 
158
            copy_exec /usr/bin/gpgconf
 
159
        fi
 
160
        gpg="`/usr/bin/gpgconf|sed --quiet --expression='s/^gpg:[^:]*://p'`"
 
161
    fi
 
162
elif dpkg --compare-versions "$libgpgme11_version" ge 1.4.1-0.1; then
 
163
    gpg=/usr/bin/gpg2
 
164
fi
 
165
if [ ! -e "${DESTDIR}$gpg" ]; then
 
166
    copy_exec "$gpg"
 
167
fi
 
168
unset gpg
 
169
unset libgpgme11_version
 
170
 
 
171
# Config files
 
172
for file in /etc/mandos/plugin-runner.conf; do
 
173
    if [ -d "$file" ]; then
 
174
        continue
 
175
    fi
 
176
    cp --archive --sparse=always "$file" "${DESTDIR}${CONFDIR}"
 
177
done
 
178
 
 
179
if [ ${mandos_user} != 65534 ]; then
 
180
    sed --in-place --expression="1i--userid=${mandos_user}" \
 
181
        "${DESTDIR}${CONFDIR}/plugin-runner.conf"
 
182
fi
 
183
 
 
184
if [ ${mandos_group} != 65534 ]; then
 
185
    sed --in-place --expression="1i--groupid=${mandos_group}" \
 
186
        "${DESTDIR}${CONFDIR}/plugin-runner.conf"
86
187
fi
87
188
 
88
189
# Key files
89
 
for file in /etc/mandos/*; do
 
190
for file in "$keydir"/*; do
90
191
    if [ -d "$file" ]; then
91
192
        continue
92
193
    fi
93
194
    cp --archive --sparse=always "$file" "${DESTDIR}${CONFDIR}"
 
195
    chown ${mandos_user}:${mandos_group} \
 
196
        "${DESTDIR}${CONFDIR}/`basename \"$file\"`"
94
197
done
95
 
# Create key ring files
96
 
gpg --no-random-seed-file --quiet --batch --no-tty --armor \
97
 
    --no-default-keyring --no-options --enable-dsa2 \
98
 
    --homedir "${DESTDIR}${CONFDIR}" --no-permission-warning \
99
 
    --trust-model always --import-options import-minimal \
100
 
    --import "${DESTDIR}${CONFDIR}/seckey.txt"
101
 
chown nobody "${DESTDIR}${CONFDIR}/secring.gpg"
102
198
 
103
199
# /lib/mandos/plugin-runner will drop priviliges, but needs access to
104
200
# its plugin directory and its config file.  However, since almost all
112
208
# condition.  This umask is set by "initramfs-tools-hook-conf",
113
209
# installed as "/usr/share/initramfs-tools/conf-hooks.d/mandos".)
114
210
115
 
for full in "${PLUGINDIR}" "${CONFDIR}"; do
 
211
for full in "${MANDOSDIR}" "${CONFDIR}"; do
116
212
    while [ "$full" != "/" ]; do
117
213
        chmod a+rX "${DESTDIR}$full"
118
214
        full="`dirname \"$full\"`"
122
218
# Reset some other things to sane permissions which we have
123
219
# inadvertently affected with our umask setting.
124
220
for dir in / /bin /etc /keyscripts /sbin /scripts /usr /usr/bin; do
125
 
    chmod a+rX "${DESTDIR}$dir"
 
221
    if [ -d "${DESTDIR}$dir" ]; then
 
222
        chmod a+rX "${DESTDIR}$dir"
 
223
    fi
126
224
done
127
 
for dir in /lib /usr/lib; do
128
 
    chmod --recursive a+rX "${DESTDIR}$dir"
 
225
for dir in "${DESTDIR}"/lib* "${DESTDIR}"/usr/lib*; do
 
226
    if [ -d "$dir" ]; then
 
227
        find "$dir" \! -perm -u+rw,g+r -prune -or -print0 \
 
228
            | xargs --null --no-run-if-empty chmod a+rX
 
229
    fi
129
230
done