Browse code

check version for docker-default aa profile

Signed-off-by: Jessica Frazelle <acidburn@docker.com>

Jessica Frazelle authored on 2015/11/24 08:41:18
Showing 3 changed files
... ...
@@ -4,11 +4,10 @@ import (
4 4
 	"fmt"
5 5
 	"log"
6 6
 	"os"
7
-	"os/exec"
8 7
 	"path"
9
-	"strconv"
10
-	"strings"
11 8
 	"text/template"
9
+
10
+	"github.com/docker/docker/pkg/aaparser"
12 11
 )
13 12
 
14 13
 type profileData struct {
... ...
@@ -24,33 +23,7 @@ func main() {
24 24
 	// parse the arg
25 25
 	apparmorProfilePath := os.Args[1]
26 26
 
27
-	// get the apparmor_version version
28
-	cmd := exec.Command("/sbin/apparmor_parser", "--version")
29
-
30
-	output, err := cmd.CombinedOutput()
31
-	if err != nil {
32
-		log.Fatalf("getting apparmor_parser version failed: %s (%s)", err, output)
33
-	}
34
-
35
-	// parse the version from the output
36
-	// output is in the form of the following:
37
-	// AppArmor parser version 2.9.1
38
-	// Copyright (C) 1999-2008 Novell Inc.
39
-	// Copyright 2009-2012 Canonical Ltd.
40
-	lines := strings.SplitN(string(output), "\n", 2)
41
-	words := strings.Split(lines[0], " ")
42
-	version := words[len(words)-1]
43
-	// split by major minor version
44
-	v := strings.Split(version, ".")
45
-	if len(v) < 2 {
46
-		log.Fatalf("parsing major minor version failed for %q", version)
47
-	}
48
-
49
-	majorVersion, err := strconv.Atoi(v[0])
50
-	if err != nil {
51
-		log.Fatal(err)
52
-	}
53
-	minorVersion, err := strconv.Atoi(v[1])
27
+	majorVersion, minorVersion, err := aaparser.GetVersion()
54 28
 	if err != nil {
55 29
 		log.Fatal(err)
56 30
 	}
... ...
@@ -12,6 +12,7 @@ import (
12 12
 	"strings"
13 13
 	"text/template"
14 14
 
15
+	"github.com/docker/docker/pkg/aaparser"
15 16
 	"github.com/opencontainers/runc/libcontainer/apparmor"
16 17
 )
17 18
 
... ...
@@ -21,8 +22,11 @@ const (
21 21
 
22 22
 type data struct {
23 23
 	Name         string
24
+	ExecPath     string
24 25
 	Imports      []string
25 26
 	InnerImports []string
27
+	MajorVersion int
28
+	MinorVersion int
26 29
 }
27 30
 
28 31
 const baseTemplate = `
... ...
@@ -56,11 +60,13 @@ profile {{.Name}} flags=(attach_disconnected,mediate_deleted) {
56 56
   deny /sys/firmware/efi/efivars/** rwklx,
57 57
   deny /sys/kernel/security/** rwklx,
58 58
 
59
+{{if ge .MajorVersion 2}}{{if ge .MinorVersion 9}}
59 60
   # docker daemon confinement requires explict allow rule for signal
60
-  signal (receive) set=(kill,term) peer=/usr/bin/docker,
61
+  signal (receive) set=(kill,term) peer={{.ExecPath}},
61 62
 
62 63
   # suppress ptrace denails when using 'docker ps'
63 64
   ptrace (trace,read) peer=docker-default,
65
+{{end}}{{end}}
64 66
 }
65 67
 `
66 68
 
... ...
@@ -80,6 +86,14 @@ func generateProfile(out io.Writer) error {
80 80
 	if abstractionsExists() {
81 81
 		data.InnerImports = append(data.InnerImports, "#include <abstractions/base>")
82 82
 	}
83
+	data.MajorVersion, data.MinorVersion, err = aaparser.GetVersion()
84
+	if err != nil {
85
+		return err
86
+	}
87
+	data.ExecPath, err = exec.LookPath("docker")
88
+	if err != nil {
89
+		return err
90
+	}
83 91
 	if err := compiled.Execute(out, data); err != nil {
84 92
 		return err
85 93
 	}
86 94
new file mode 100644
... ...
@@ -0,0 +1,45 @@
0
+package aaparser
1
+
2
+import (
3
+	"fmt"
4
+	"log"
5
+	"os/exec"
6
+	"strconv"
7
+	"strings"
8
+)
9
+
10
+// GetVersion returns the major and minor version of apparmor_parser
11
+func GetVersion() (int, int, error) {
12
+	// get the apparmor_version version
13
+	cmd := exec.Command("apparmor_parser", "--version")
14
+
15
+	output, err := cmd.CombinedOutput()
16
+	if err != nil {
17
+		log.Fatalf("getting apparmor_parser version failed: %s (%s)", err, output)
18
+	}
19
+
20
+	// parse the version from the output
21
+	// output is in the form of the following:
22
+	// AppArmor parser version 2.9.1
23
+	// Copyright (C) 1999-2008 Novell Inc.
24
+	// Copyright 2009-2012 Canonical Ltd.
25
+	lines := strings.SplitN(string(output), "\n", 2)
26
+	words := strings.Split(lines[0], " ")
27
+	version := words[len(words)-1]
28
+	// split by major minor version
29
+	v := strings.Split(version, ".")
30
+	if len(v) < 2 {
31
+		return -1, -1, fmt.Errorf("parsing major minor version failed for %q", version)
32
+	}
33
+
34
+	majorVersion, err := strconv.Atoi(v[0])
35
+	if err != nil {
36
+		return -1, -1, err
37
+	}
38
+	minorVersion, err := strconv.Atoi(v[1])
39
+	if err != nil {
40
+		return -1, -1, err
41
+	}
42
+
43
+	return majorVersion, minorVersion, nil
44
+}