Skip to content

Commit

Permalink
apparmor: clobber docker-default profile on start
Browse files Browse the repository at this point in the history
In the process of making docker-default reloading far less expensive,
567ef8e ("daemon: switch to 'ensure' workflow for AppArmor
profiles") mistakenly made the initial profile load at dockerd start-up
lazy. As a result, if you have a running Docker daemon and upgrade it to
a new one with an updated AppArmor profile the new profile will not take
effect (because the old one is still loaded). The fix for this is quite
trivial, and just requires us to clobber the profile on start-up.

Fixes: 567ef8e ("daemon: switch to 'ensure' workflow for AppArmor profiles")
Signed-off-by: Aleksa Sarai <asarai@suse.de>
  • Loading branch information
cyphar committed Jul 6, 2023
1 parent e4c866f commit 3d3af96
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 9 deletions.
2 changes: 1 addition & 1 deletion cmd/dockerd/daemon.go
Expand Up @@ -377,7 +377,7 @@ func newRouterOptions(ctx context.Context, config *config.Config, d *daemon.Daem
Rootless: daemon.Rootless(config),
IdentityMapping: d.IdentityMapping(),
DNSConfig: config.DNSConfig,
ApparmorProfile: daemon.DefaultApparmorProfile(),
ApparmorProfile: daemon.DefaultAppArmorProfile(),
UseSnapshotter: d.UsesSnapshotter(),
Snapshotter: d.ImageService().StorageDriver(),
ContainerdAddress: config.ContainerdAddr,
Expand Down
18 changes: 12 additions & 6 deletions daemon/apparmor_default.go
Expand Up @@ -15,14 +15,23 @@ const (
defaultAppArmorProfile = "docker-default"
)

// DefaultApparmorProfile returns the name of the default apparmor profile
func DefaultApparmorProfile() string {
// DefaultAppArmorProfile returns the name of the default apparmor profile
func DefaultAppArmorProfile() string {
if apparmor.HostSupports() {
return defaultAppArmorProfile
}
return ""
}

func clobberDefaultAppArmorProfile() error {
if apparmor.HostSupports() {
if err := aaprofile.InstallDefault(defaultAppArmorProfile); err != nil {
return fmt.Errorf("AppArmor enabled on system but the %s profile could not be loaded: %s", defaultAppArmorProfile, err)
}
}
return nil
}

func ensureDefaultAppArmorProfile() error {
if apparmor.HostSupports() {
loaded, err := aaprofile.IsLoaded(defaultAppArmorProfile)
Expand All @@ -36,10 +45,7 @@ func ensureDefaultAppArmorProfile() error {
}

// Load the profile.
if err := aaprofile.InstallDefault(defaultAppArmorProfile); err != nil {
return fmt.Errorf("AppArmor enabled on system but the %s profile could not be loaded: %s", defaultAppArmorProfile, err)
}
return clobberDefaultAppArmorProfile()
}

return nil
}
4 changes: 4 additions & 0 deletions daemon/apparmor_default_unsupported.go
Expand Up @@ -2,6 +2,10 @@

package daemon // import "github.com/docker/docker/daemon"

func clobberDefaultAppArmorProfile() error {
return nil
}

func ensureDefaultAppArmorProfile() error {
return nil
}
Expand Down
5 changes: 3 additions & 2 deletions daemon/daemon.go
Expand Up @@ -879,8 +879,9 @@ func NewDaemon(ctx context.Context, config *config.Config, pluginStore *plugin.S
log.G(ctx).Warnf("Failed to configure golang's threads limit: %v", err)
}

// ensureDefaultAppArmorProfile does nothing if apparmor is disabled
if err := ensureDefaultAppArmorProfile(); err != nil {
// Make sure we clobber any pre-existing docker-default profile to ensure
// that upgrades to the profile actually work smoothly.
if err := clobberDefaultAppArmorProfile(); err != nil {
log.G(ctx).Errorf(err.Error())
}

Expand Down

0 comments on commit 3d3af96

Please sign in to comment.