Browse code

Merge pull request #17002 from jfrazelle/apparmor-check-version-on-deb-install

apparmor check version on deb install

Sebastiaan van Stijn authored on 2015/10/27 06:44:11
Showing 16 changed files
1 1
deleted file mode 100644
... ...
@@ -1,241 +0,0 @@
1
-@{DOCKER_GRAPH_PATH}=/var/lib/docker
2
-
3
-profile /usr/bin/docker (attach_disconnected, complain) {
4
-  # Prevent following links to these files during container setup.
5
-  deny /etc/** mkl,
6
-  deny /dev/** kl,
7
-  deny /sys/** mkl,
8
-  deny /proc/** mkl,
9
-
10
-  mount -> @{DOCKER_GRAPH_PATH}/**,
11
-  mount -> /,
12
-  mount -> /proc/**,
13
-  mount -> /sys/**,
14
-  mount -> /run/docker/netns/**,
15
-
16
-  umount,
17
-  pivot_root,
18
-  signal (receive) peer=@{profile_name},
19
-  signal (receive) peer=unconfined,
20
-  signal (send),
21
-  ipc rw,
22
-  network,
23
-  capability,
24
-  owner /** rw,
25
-  @{DOCKER_GRAPH_PATH}/** rwl,
26
-  @{DOCKER_GRAPH_PATH}/linkgraph.db k,
27
-  @{DOCKER_GRAPH_PATH}/network/files/boltdb.db k,
28
-
29
-  # For non-root client use:
30
-  /dev/urandom r,
31
-  /run/docker.sock rw,
32
-  /proc/** r,
33
-  /sys/kernel/mm/hugepages/ r,
34
-  /etc/localtime r,
35
-  /etc/ld.so.cache r,
36
-
37
-  ptrace peer=@{profile_name},
38
-  ptrace (read) peer=docker-default,
39
-  deny ptrace (trace) peer=docker-default,
40
-  deny ptrace peer=/usr/bin/docker///bin/ps,
41
-
42
-  /usr/lib/** rm,
43
-  /lib/** rm,
44
-
45
-  /usr/bin/docker pix,
46
-  /sbin/xtables-multi rCx,
47
-  /sbin/iptables rCx,
48
-  /sbin/modprobe rCx,
49
-  /sbin/auplink rCx,
50
-  /sbin/mke2fs rCx,
51
-  /sbin/tune2fs rCx,
52
-  /sbin/blkid rCx,
53
-  /bin/kmod rCx,
54
-  /usr/bin/xz rCx,
55
-  /bin/ps rCx,
56
-  /bin/cat rCx,
57
-  /sbin/zfs rCx,
58
-  /sbin/apparmor_parser rCx,
59
-
60
-  # Transitions
61
-  change_profile -> docker-*,
62
-  change_profile -> unconfined,
63
-
64
-  profile /bin/cat (complain) {
65
-    /etc/ld.so.cache r,
66
-    /lib/** rm,
67
-    /dev/null rw,
68
-    /proc r,
69
-    /bin/cat mr,
70
-
71
-    # For reading in 'docker stats':
72
-    /proc/[0-9]*/net/dev r,
73
-  }
74
-  profile /bin/ps (complain) {
75
-    /etc/ld.so.cache r,
76
-    /etc/localtime r,
77
-    /etc/passwd r,
78
-    /etc/nsswitch.conf r,
79
-    /lib/** rm,
80
-    /proc/[0-9]*/** r,
81
-    /dev/null rw,
82
-    /bin/ps mr,
83
-
84
-    # We don't need ptrace so we'll deny and ignore the error.
85
-    deny ptrace (read, trace),
86
-
87
-    # Quiet dac_override denials
88
-    deny capability dac_override,
89
-    deny capability dac_read_search,
90
-    deny capability sys_ptrace,
91
-
92
-    /dev/tty r,
93
-    /proc/stat r,
94
-    /proc/cpuinfo r,
95
-    /proc/meminfo r,
96
-    /proc/uptime r,
97
-    /sys/devices/system/cpu/online r,
98
-    /proc/sys/kernel/pid_max r,
99
-    /proc/ r,
100
-    /proc/tty/drivers r,
101
-  }
102
-  profile /sbin/iptables (complain) {
103
-    signal (receive) peer=/usr/bin/docker,
104
-    capability net_admin,
105
-  }
106
-  profile /sbin/auplink flags=(attach_disconnected, complain) {
107
-    signal (receive) peer=/usr/bin/docker,
108
-    capability sys_admin,
109
-    capability dac_override,
110
-
111
-    @{DOCKER_GRAPH_PATH}/aufs/** rw,
112
-    @{DOCKER_GRAPH_PATH}/tmp/** rw,
113
-    # For user namespaces:
114
-    @{DOCKER_GRAPH_PATH}/[0-9]*.[0-9]*/** rw,
115
-
116
-    /sys/fs/aufs/** r,
117
-    /lib/** rm,
118
-    /apparmor/.null r,
119
-    /dev/null rw,
120
-    /etc/ld.so.cache r,
121
-    /sbin/auplink rm,
122
-    /proc/fs/aufs/** rw,
123
-    /proc/[0-9]*/mounts rw,
124
-  }
125
-  profile /sbin/modprobe /bin/kmod (complain) {
126
-    signal (receive) peer=/usr/bin/docker,
127
-    capability sys_module,
128
-    /etc/ld.so.cache r,
129
-    /lib/** rm,
130
-    /dev/null rw,
131
-    /apparmor/.null rw,
132
-    /sbin/modprobe rm,
133
-    /bin/kmod rm,
134
-    /proc/cmdline r,
135
-    /sys/module/** r,
136
-    /etc/modprobe.d{/,/**} r,
137
-  }
138
-  # xz works via pipes, so we do not need access to the filesystem.
139
-  profile /usr/bin/xz (complain) {
140
-    signal (receive) peer=/usr/bin/docker,
141
-    /etc/ld.so.cache r,
142
-    /lib/** rm,
143
-    /usr/bin/xz rm,
144
-    deny /proc/** rw,
145
-    deny /sys/** rw,
146
-  }
147
-  profile /sbin/xtables-multi (attach_disconnected, complain) {
148
-    /etc/ld.so.cache r,
149
-    /lib/** rm,
150
-    /sbin/xtables-multi rm,
151
-    /apparmor/.null w,
152
-    /dev/null rw,
153
-
154
-    /proc r,
155
-
156
-    capability net_raw,
157
-    capability net_admin,
158
-    network raw,
159
-  }
160
-  profile /sbin/zfs (attach_disconnected, complain) {
161
-    file,
162
-    capability,
163
-  }
164
-  profile /sbin/mke2fs (complain) {
165
-    /sbin/mke2fs rm,
166
-
167
-    /lib/** rm,
168
-
169
-    /apparmor/.null w,
170
-
171
-    /etc/ld.so.cache r,
172
-    /etc/mke2fs.conf r,
173
-    /etc/mtab r,
174
-
175
-    /dev/dm-* rw,
176
-    /dev/urandom r,
177
-    /dev/null rw,
178
-
179
-    /proc/swaps r,
180
-    /proc/[0-9]*/mounts r,
181
-  }
182
-  profile /sbin/tune2fs (complain) {
183
-    /sbin/tune2fs rm,
184
-
185
-    /lib/** rm,
186
-
187
-    /apparmor/.null w,
188
-
189
-    /etc/blkid.conf r,
190
-    /etc/mtab r,
191
-    /etc/ld.so.cache r,
192
-
193
-    /dev/null rw,
194
-    /dev/.blkid.tab r,
195
-    /dev/dm-* rw,
196
-
197
-    /proc/swaps r,
198
-    /proc/[0-9]*/mounts r,
199
-  }
200
-  profile /sbin/blkid (complain) {
201
-    /sbin/blkid rm,
202
-
203
-    /lib/** rm,
204
-    /apparmor/.null w,
205
-
206
-    /etc/ld.so.cache r,
207
-    /etc/blkid.conf r,
208
-
209
-    /dev/null rw,
210
-    /dev/.blkid.tab rl,
211
-    /dev/.blkid.tab* rwl,
212
-    /dev/dm-* r,
213
-
214
-    /sys/devices/virtual/block/** r,
215
-
216
-    capability mknod,
217
-
218
-    mount -> @{DOCKER_GRAPH_PATH}/**,
219
-  }
220
-  profile /sbin/apparmor_parser (complain) {
221
-    /sbin/apparmor_parser rm,
222
-
223
-    /lib/** rm,
224
-
225
-    /etc/ld.so.cache r,
226
-    /etc/apparmor/** r,
227
-    /etc/apparmor.d/** r,
228
-    /etc/apparmor.d/cache/** w,
229
-
230
-    /dev/null rw,
231
-
232
-    /sys/kernel/security/apparmor/** r,
233
-    /sys/kernel/security/apparmor/.replace w,
234
-
235
-    /proc/[0-9]*/mounts r,
236
-    /proc/sys/kernel/osrelease r,
237
-    /proc r,
238
-
239
-    capability mac_admin,
240
-  }
241
-}
242 1
new file mode 100644
... ...
@@ -0,0 +1,85 @@
0
+package main
1
+
2
+import (
3
+	"fmt"
4
+	"log"
5
+	"os"
6
+	"os/exec"
7
+	"path"
8
+	"strconv"
9
+	"strings"
10
+	"text/template"
11
+)
12
+
13
+type profileData struct {
14
+	MajorVersion int
15
+	MinorVersion int
16
+}
17
+
18
+func main() {
19
+	if len(os.Args) < 2 {
20
+		log.Fatal("pass a filename to save the profile in.")
21
+	}
22
+
23
+	// parse the arg
24
+	apparmorProfilePath := os.Args[1]
25
+
26
+	// get the apparmor_version version
27
+	cmd := exec.Command("/sbin/apparmor_parser", "--version")
28
+
29
+	output, err := cmd.CombinedOutput()
30
+	if err != nil {
31
+		log.Fatalf("getting apparmor_parser version failed: %s (%s)", err, output)
32
+	}
33
+
34
+	// parse the version from the output
35
+	// output is in the form of the following:
36
+	// AppArmor parser version 2.9.1
37
+	// Copyright (C) 1999-2008 Novell Inc.
38
+	// Copyright 2009-2012 Canonical Ltd.
39
+	lines := strings.SplitN(string(output), "\n", 2)
40
+	words := strings.Split(lines[0], " ")
41
+	version := words[len(words)-1]
42
+	// split by major minor version
43
+	v := strings.Split(version, ".")
44
+	if len(v) < 2 {
45
+		log.Fatalf("parsing major minor version failed for %q", version)
46
+	}
47
+
48
+	majorVersion, err := strconv.Atoi(v[0])
49
+	if err != nil {
50
+		log.Fatal(err)
51
+	}
52
+	minorVersion, err := strconv.Atoi(v[1])
53
+	if err != nil {
54
+		log.Fatal(err)
55
+	}
56
+	data := profileData{
57
+		MajorVersion: majorVersion,
58
+		MinorVersion: minorVersion,
59
+	}
60
+	fmt.Printf("apparmor_parser is of version %+v\n", data)
61
+
62
+	// parse the template
63
+	compiled, err := template.New("apparmor_profile").Parse(dockerProfileTemplate)
64
+	if err != nil {
65
+		log.Fatalf("parsing template failed: %v", err)
66
+	}
67
+
68
+	// make sure /etc/apparmor.d exists
69
+	if err := os.MkdirAll(path.Dir(apparmorProfilePath), 0755); err != nil {
70
+		log.Fatal(err)
71
+	}
72
+
73
+	f, err := os.OpenFile(apparmorProfilePath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644)
74
+	if err != nil {
75
+		log.Fatal(err)
76
+	}
77
+	defer f.Close()
78
+
79
+	if err := compiled.Execute(f, data); err != nil {
80
+		log.Fatalf("executing template failed: %v", err)
81
+	}
82
+
83
+	fmt.Printf("created apparmor profile for version %+v at %q\n", data, apparmorProfilePath)
84
+}
0 85
new file mode 100644
... ...
@@ -0,0 +1,259 @@
0
+package main
1
+
2
+const dockerProfileTemplate = `@{DOCKER_GRAPH_PATH}=/var/lib/docker
3
+
4
+profile /usr/bin/docker (attach_disconnected, complain) {
5
+  # Prevent following links to these files during container setup.
6
+  deny /etc/** mkl,
7
+  deny /dev/** kl,
8
+  deny /sys/** mkl,
9
+  deny /proc/** mkl,
10
+
11
+  mount -> @{DOCKER_GRAPH_PATH}/**,
12
+  mount -> /,
13
+  mount -> /proc/**,
14
+  mount -> /sys/**,
15
+  mount -> /run/docker/netns/**,
16
+
17
+  umount,
18
+  pivot_root,
19
+{{if ge .MajorVersion 2}}{{if ge .MinorVersion 9}}
20
+  signal (receive) peer=@{profile_name},
21
+  signal (receive) peer=unconfined,
22
+  signal (send),
23
+{{end}}{{end}}
24
+  ipc rw,
25
+  network,
26
+  capability,
27
+  owner /** rw,
28
+  @{DOCKER_GRAPH_PATH}/** rwl,
29
+  @{DOCKER_GRAPH_PATH}/linkgraph.db k,
30
+  @{DOCKER_GRAPH_PATH}/network/files/boltdb.db k,
31
+
32
+  # For non-root client use:
33
+  /dev/urandom r,
34
+  /run/docker.sock rw,
35
+  /proc/** r,
36
+  /sys/kernel/mm/hugepages/ r,
37
+  /etc/localtime r,
38
+  /etc/ld.so.cache r,
39
+
40
+{{if ge .MajorVersion 2}}{{if ge .MinorVersion 9}}
41
+  ptrace peer=@{profile_name},
42
+  ptrace (read) peer=docker-default,
43
+  deny ptrace (trace) peer=docker-default,
44
+  deny ptrace peer=/usr/bin/docker///bin/ps,
45
+{{end}}{{end}}
46
+
47
+  /usr/lib/** rm,
48
+  /lib/** rm,
49
+
50
+  /usr/bin/docker pix,
51
+  /sbin/xtables-multi rCx,
52
+  /sbin/iptables rCx,
53
+  /sbin/modprobe rCx,
54
+  /sbin/auplink rCx,
55
+  /sbin/mke2fs rCx,
56
+  /sbin/tune2fs rCx,
57
+  /sbin/blkid rCx,
58
+  /bin/kmod rCx,
59
+  /usr/bin/xz rCx,
60
+  /bin/ps rCx,
61
+  /bin/cat rCx,
62
+  /sbin/zfs rCx,
63
+  /sbin/apparmor_parser rCx,
64
+
65
+{{if ge .MajorVersion 2}}{{if ge .MinorVersion 9}}
66
+  # Transitions
67
+  change_profile -> docker-*,
68
+  change_profile -> unconfined,
69
+{{end}}{{end}}
70
+
71
+  profile /bin/cat (complain) {
72
+    /etc/ld.so.cache r,
73
+    /lib/** rm,
74
+    /dev/null rw,
75
+    /proc r,
76
+    /bin/cat mr,
77
+
78
+    # For reading in 'docker stats':
79
+    /proc/[0-9]*/net/dev r,
80
+  }
81
+  profile /bin/ps (complain) {
82
+    /etc/ld.so.cache r,
83
+    /etc/localtime r,
84
+    /etc/passwd r,
85
+    /etc/nsswitch.conf r,
86
+    /lib/** rm,
87
+    /proc/[0-9]*/** r,
88
+    /dev/null rw,
89
+    /bin/ps mr,
90
+
91
+{{if ge .MajorVersion 2}}{{if ge .MinorVersion 9}}
92
+    # We don't need ptrace so we'll deny and ignore the error.
93
+    deny ptrace (read, trace),
94
+{{end}}{{end}}
95
+
96
+    # Quiet dac_override denials
97
+    deny capability dac_override,
98
+    deny capability dac_read_search,
99
+    deny capability sys_ptrace,
100
+
101
+    /dev/tty r,
102
+    /proc/stat r,
103
+    /proc/cpuinfo r,
104
+    /proc/meminfo r,
105
+    /proc/uptime r,
106
+    /sys/devices/system/cpu/online r,
107
+    /proc/sys/kernel/pid_max r,
108
+    /proc/ r,
109
+    /proc/tty/drivers r,
110
+  }
111
+  profile /sbin/iptables (complain) {
112
+{{if ge .MajorVersion 2}}{{if ge .MinorVersion 9}}
113
+    signal (receive) peer=/usr/bin/docker,
114
+{{end}}{{end}}
115
+    capability net_admin,
116
+  }
117
+  profile /sbin/auplink flags=(attach_disconnected, complain) {
118
+{{if ge .MajorVersion 2}}{{if ge .MinorVersion 9}}
119
+    signal (receive) peer=/usr/bin/docker,
120
+{{end}}{{end}}
121
+    capability sys_admin,
122
+    capability dac_override,
123
+
124
+    @{DOCKER_GRAPH_PATH}/aufs/** rw,
125
+    @{DOCKER_GRAPH_PATH}/tmp/** rw,
126
+    # For user namespaces:
127
+    @{DOCKER_GRAPH_PATH}/[0-9]*.[0-9]*/** rw,
128
+
129
+    /sys/fs/aufs/** r,
130
+    /lib/** rm,
131
+    /apparmor/.null r,
132
+    /dev/null rw,
133
+    /etc/ld.so.cache r,
134
+    /sbin/auplink rm,
135
+    /proc/fs/aufs/** rw,
136
+    /proc/[0-9]*/mounts rw,
137
+  }
138
+  profile /sbin/modprobe /bin/kmod (complain) {
139
+{{if ge .MajorVersion 2}}{{if ge .MinorVersion 9}}
140
+    signal (receive) peer=/usr/bin/docker,
141
+{{end}}{{end}}
142
+    capability sys_module,
143
+    /etc/ld.so.cache r,
144
+    /lib/** rm,
145
+    /dev/null rw,
146
+    /apparmor/.null rw,
147
+    /sbin/modprobe rm,
148
+    /bin/kmod rm,
149
+    /proc/cmdline r,
150
+    /sys/module/** r,
151
+    /etc/modprobe.d{/,/**} r,
152
+  }
153
+  # xz works via pipes, so we do not need access to the filesystem.
154
+  profile /usr/bin/xz (complain) {
155
+{{if ge .MajorVersion 2}}{{if ge .MinorVersion 9}}
156
+    signal (receive) peer=/usr/bin/docker,
157
+{{end}}{{end}}
158
+    /etc/ld.so.cache r,
159
+    /lib/** rm,
160
+    /usr/bin/xz rm,
161
+    deny /proc/** rw,
162
+    deny /sys/** rw,
163
+  }
164
+  profile /sbin/xtables-multi (attach_disconnected, complain) {
165
+    /etc/ld.so.cache r,
166
+    /lib/** rm,
167
+    /sbin/xtables-multi rm,
168
+    /apparmor/.null w,
169
+    /dev/null rw,
170
+
171
+    /proc r,
172
+
173
+    capability net_raw,
174
+    capability net_admin,
175
+    network raw,
176
+  }
177
+  profile /sbin/zfs (attach_disconnected, complain) {
178
+    file,
179
+    capability,
180
+  }
181
+  profile /sbin/mke2fs (complain) {
182
+    /sbin/mke2fs rm,
183
+
184
+    /lib/** rm,
185
+
186
+    /apparmor/.null w,
187
+
188
+    /etc/ld.so.cache r,
189
+    /etc/mke2fs.conf r,
190
+    /etc/mtab r,
191
+
192
+    /dev/dm-* rw,
193
+    /dev/urandom r,
194
+    /dev/null rw,
195
+
196
+    /proc/swaps r,
197
+    /proc/[0-9]*/mounts r,
198
+  }
199
+  profile /sbin/tune2fs (complain) {
200
+    /sbin/tune2fs rm,
201
+
202
+    /lib/** rm,
203
+
204
+    /apparmor/.null w,
205
+
206
+    /etc/blkid.conf r,
207
+    /etc/mtab r,
208
+    /etc/ld.so.cache r,
209
+
210
+    /dev/null rw,
211
+    /dev/.blkid.tab r,
212
+    /dev/dm-* rw,
213
+
214
+    /proc/swaps r,
215
+    /proc/[0-9]*/mounts r,
216
+  }
217
+  profile /sbin/blkid (complain) {
218
+    /sbin/blkid rm,
219
+
220
+    /lib/** rm,
221
+    /apparmor/.null w,
222
+
223
+    /etc/ld.so.cache r,
224
+    /etc/blkid.conf r,
225
+
226
+    /dev/null rw,
227
+    /dev/.blkid.tab rl,
228
+    /dev/.blkid.tab* rwl,
229
+    /dev/dm-* r,
230
+
231
+    /sys/devices/virtual/block/** r,
232
+
233
+    capability mknod,
234
+
235
+    mount -> @{DOCKER_GRAPH_PATH}/**,
236
+  }
237
+  profile /sbin/apparmor_parser (complain) {
238
+    /sbin/apparmor_parser rm,
239
+
240
+    /lib/** rm,
241
+
242
+    /etc/ld.so.cache r,
243
+    /etc/apparmor/** r,
244
+    /etc/apparmor.d/** r,
245
+    /etc/apparmor.d/cache/** w,
246
+
247
+    /dev/null rw,
248
+
249
+    /sys/kernel/security/apparmor/** r,
250
+    /sys/kernel/security/apparmor/.replace w,
251
+
252
+    /proc/[0-9]*/mounts r,
253
+    /proc/sys/kernel/osrelease r,
254
+    /proc r,
255
+
256
+    capability mac_admin,
257
+  }
258
+}`
... ...
@@ -4,7 +4,7 @@
4 4
 
5 5
 FROM debian:jessie
6 6
 
7
-RUN apt-get update && apt-get install -y bash-completion btrfs-tools build-essential curl ca-certificates debhelper dh-systemd git libapparmor-dev libdevmapper-dev libsqlite3-dev libsystemd-journal-dev --no-install-recommends && rm -rf /var/lib/apt/lists/*
7
+RUN apt-get update && apt-get install -y apparmor bash-completion btrfs-tools build-essential curl ca-certificates debhelper dh-apparmor dh-systemd git libapparmor-dev libdevmapper-dev libsqlite3-dev libsystemd-journal-dev --no-install-recommends && rm -rf /var/lib/apt/lists/*
8 8
 
9 9
 ENV GO_VERSION 1.4.3
10 10
 RUN curl -fSL "https://storage.googleapis.com/golang/go${GO_VERSION}.linux-amd64.tar.gz" | tar xzC /usr/local
... ...
@@ -4,7 +4,7 @@
4 4
 
5 5
 FROM debian:stretch
6 6
 
7
-RUN apt-get update && apt-get install -y bash-completion btrfs-tools build-essential curl ca-certificates debhelper dh-systemd git libapparmor-dev libdevmapper-dev libsqlite3-dev libsystemd-dev --no-install-recommends && rm -rf /var/lib/apt/lists/*
7
+RUN apt-get update && apt-get install -y apparmor bash-completion btrfs-tools build-essential curl ca-certificates debhelper dh-apparmor dh-systemd git libapparmor-dev libdevmapper-dev libsqlite3-dev libsystemd-dev --no-install-recommends && rm -rf /var/lib/apt/lists/*
8 8
 
9 9
 ENV GO_VERSION 1.4.3
10 10
 RUN curl -fSL "https://storage.googleapis.com/golang/go${GO_VERSION}.linux-amd64.tar.gz" | tar xzC /usr/local
... ...
@@ -4,7 +4,7 @@
4 4
 
5 5
 FROM debian:wheezy-backports
6 6
 
7
-RUN apt-get update && apt-get install -y bash-completion btrfs-tools/wheezy-backports build-essential curl ca-certificates debhelper dh-systemd git libapparmor-dev libdevmapper-dev libsqlite3-dev libsystemd-journal-dev --no-install-recommends && rm -rf /var/lib/apt/lists/*
7
+RUN apt-get update && apt-get install -y apparmor bash-completion btrfs-tools/wheezy-backports build-essential curl ca-certificates debhelper dh-apparmor dh-systemd git libapparmor-dev libdevmapper-dev libsqlite3-dev libsystemd-journal-dev --no-install-recommends && rm -rf /var/lib/apt/lists/*
8 8
 
9 9
 ENV GO_VERSION 1.4.3
10 10
 RUN curl -fSL "https://storage.googleapis.com/golang/go${GO_VERSION}.linux-amd64.tar.gz" | tar xzC /usr/local
... ...
@@ -45,11 +45,13 @@ for version in "${versions[@]}"; do
45 45
 
46 46
 	# this list is sorted alphabetically; please keep it that way
47 47
 	packages=(
48
+		apparmor # for apparmor_parser for testing the profile
48 49
 		bash-completion # for bash-completion debhelper integration
49 50
 		btrfs-tools # for "btrfs/ioctl.h" (and "version.h" if possible)
50 51
 		build-essential # "essential for building Debian packages"
51 52
 		curl ca-certificates # for downloading Go
52 53
 		debhelper # for easy ".deb" building
54
+		dh-apparmor # for apparmor debhelper
53 55
 		dh-systemd # for systemd debhelper integration
54 56
 		git # for "git commit" info in "docker -v"
55 57
 		libapparmor-dev # for "sys/apparmor.h"
... ...
@@ -4,7 +4,7 @@
4 4
 
5 5
 FROM ubuntu:precise
6 6
 
7
-RUN apt-get update && apt-get install -y bash-completion  build-essential curl ca-certificates debhelper  git libapparmor-dev  libsqlite3-dev --no-install-recommends && rm -rf /var/lib/apt/lists/*
7
+RUN apt-get update && apt-get install -y apparmor bash-completion  build-essential curl ca-certificates debhelper dh-apparmor  git libapparmor-dev  libsqlite3-dev --no-install-recommends && rm -rf /var/lib/apt/lists/*
8 8
 
9 9
 ENV GO_VERSION 1.4.3
10 10
 RUN curl -fSL "https://storage.googleapis.com/golang/go${GO_VERSION}.linux-amd64.tar.gz" | tar xzC /usr/local
... ...
@@ -4,7 +4,7 @@
4 4
 
5 5
 FROM ubuntu:trusty
6 6
 
7
-RUN apt-get update && apt-get install -y bash-completion btrfs-tools build-essential curl ca-certificates debhelper dh-systemd git libapparmor-dev libdevmapper-dev libsqlite3-dev libsystemd-journal-dev --no-install-recommends && rm -rf /var/lib/apt/lists/*
7
+RUN apt-get update && apt-get install -y apparmor bash-completion btrfs-tools build-essential curl ca-certificates debhelper dh-apparmor dh-systemd git libapparmor-dev libdevmapper-dev libsqlite3-dev libsystemd-journal-dev --no-install-recommends && rm -rf /var/lib/apt/lists/*
8 8
 
9 9
 ENV GO_VERSION 1.4.3
10 10
 RUN curl -fSL "https://storage.googleapis.com/golang/go${GO_VERSION}.linux-amd64.tar.gz" | tar xzC /usr/local
... ...
@@ -4,7 +4,7 @@
4 4
 
5 5
 FROM ubuntu:vivid
6 6
 
7
-RUN apt-get update && apt-get install -y bash-completion btrfs-tools build-essential curl ca-certificates debhelper dh-systemd git libapparmor-dev libdevmapper-dev libsqlite3-dev libsystemd-journal-dev --no-install-recommends && rm -rf /var/lib/apt/lists/*
7
+RUN apt-get update && apt-get install -y apparmor bash-completion btrfs-tools build-essential curl ca-certificates debhelper dh-apparmor dh-systemd git libapparmor-dev libdevmapper-dev libsqlite3-dev libsystemd-journal-dev --no-install-recommends && rm -rf /var/lib/apt/lists/*
8 8
 
9 9
 ENV GO_VERSION 1.4.3
10 10
 RUN curl -fSL "https://storage.googleapis.com/golang/go${GO_VERSION}.linux-amd64.tar.gz" | tar xzC /usr/local
... ...
@@ -4,7 +4,7 @@
4 4
 
5 5
 FROM ubuntu:wily
6 6
 
7
-RUN apt-get update && apt-get install -y bash-completion btrfs-tools build-essential curl ca-certificates debhelper dh-systemd git libapparmor-dev libdevmapper-dev libsqlite3-dev libsystemd-dev --no-install-recommends && rm -rf /var/lib/apt/lists/*
7
+RUN apt-get update && apt-get install -y apparmor bash-completion btrfs-tools build-essential curl ca-certificates debhelper dh-apparmor dh-systemd git libapparmor-dev libdevmapper-dev libsqlite3-dev libsystemd-dev --no-install-recommends && rm -rf /var/lib/apt/lists/*
8 8
 
9 9
 ENV GO_VERSION 1.4.3
10 10
 RUN curl -fSL "https://storage.googleapis.com/golang/go${GO_VERSION}.linux-amd64.tar.gz" | tar xzC /usr/local
... ...
@@ -10,3 +10,4 @@ contrib/init/systemd/docker.socket lib/systemd/system/
10 10
 contrib/mk* usr/share/docker-engine/contrib/
11 11
 contrib/nuke-graph-directory.sh usr/share/docker-engine/contrib/
12 12
 contrib/syntax/nano/Dockerfile.nanorc usr/share/nano/
13
+contrib/apparmor/docker-engine etc/apparmor.d/
... ...
@@ -32,5 +32,9 @@ override_dh_installudev:
32 32
 	# match our existing priority
33 33
 	dh_installudev --priority=z80
34 34
 
35
+override_dh_install:
36
+	dh_install
37
+	dh_apparmor --profile-name=docker-engine -pdocker-engine
38
+
35 39
 %:
36 40
 	dh $@ --with=bash-completion $(shell command -v dh_systemd_enable > /dev/null 2>&1 && echo --with=systemd)
... ...
@@ -57,6 +57,8 @@ set -e
57 57
 			echo 'ENV DOCKER_EXPERIMENTAL 1' >> "$DEST/$version/Dockerfile.build"
58 58
 		fi
59 59
 		cat >> "$DEST/$version/Dockerfile.build" <<-EOF
60
+			RUN go build -o aagen contrib/apparmor/*.go \
61
+				&& ./aagen contrib/apparmor/docker-engine
60 62
 			RUN ln -sfv hack/make/.build-deb debian
61 63
 			RUN { echo '$debSource (${debVersion}-0~${suite}) $suite; urgency=low'; echo; echo '  * Version: $VERSION'; echo; echo " -- $debMaintainer  $debDate"; } > debian/changelog && cat >&2 debian/changelog
62 64
 			RUN dpkg-buildpackage -uc -us
63 65
new file mode 100755
... ...
@@ -0,0 +1,57 @@
0
+#!/bin/bash
1
+# This script is used for testing install.sh and that it works for
2
+# each of component of our apt and yum repos
3
+set -e
4
+
5
+: ${DEB_DIR:="$(pwd)/bundles/$(cat VERSION)/build-deb"}
6
+
7
+if [[ ! -d "${DEB_DIR}" ]]; then
8
+	echo "you must first run `make deb` or hack/make/build-deb"
9
+	exit 1
10
+fi
11
+
12
+test_deb_install(){
13
+	# test for each Dockerfile in contrib/builder
14
+	for dir in contrib/builder/deb/*/; do
15
+		local from="$(awk 'toupper($1) == "FROM" { print $2; exit }' "$dir/Dockerfile")"
16
+		local dir=$(basename "$dir")
17
+
18
+		if [[ ! -d "${DEB_DIR}/${dir}" ]]; then
19
+			echo "No deb found for ${dir}"
20
+			exit 1
21
+		fi
22
+
23
+		local script=$(mktemp /tmp/install-XXXXXXXXXX.sh)
24
+		cat <<-EOF > "${script}"
25
+		#!/bin/bash
26
+		set -e
27
+		set -x
28
+
29
+		apt-get update && apt-get install -y apparmor
30
+
31
+		dpkg -i /root/debs/*.deb || true
32
+
33
+		apt-get install -yf
34
+
35
+		/etc/init.d/apparmor start
36
+
37
+		# this will do everything _except_ load the profile into the kernel
38
+		(
39
+		cd /etc/apparmor.d
40
+		/sbin/apparmor_parser --skip-kernel-load docker-engine
41
+		)
42
+		EOF
43
+
44
+		chmod +x "${script}"
45
+
46
+		echo "testing deb install for ${from}"
47
+		docker run --rm -i --privileged \
48
+			-v ${DEB_DIR}/${dir}:/root/debs \
49
+			-v ${script}:/install.sh \
50
+			${from} /install.sh
51
+
52
+		rm -f ${script}
53
+	done
54
+}
55
+
56
+test_deb_install
... ...
@@ -23,6 +23,8 @@ test_install_script(){
23 23
 			echo "running install.sh for ${component} with ${from}"
24 24
 			docker run --rm -i -v ${script}:/install.sh ${from} /install.sh
25 25
 		done
26
+
27
+		rm -f ${script}
26 28
 	done
27 29
 }
28 30