capabilities.go 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. package capabilities
  2. import (
  3. "os"
  4. "github.com/dotcloud/docker/pkg/libcontainer"
  5. "github.com/syndtr/gocapability/capability"
  6. )
  7. const allCapabilityTypes = capability.CAPS | capability.BOUNDS
  8. // DropCapabilities drops all capabilities for the current process expect those specified in the container configuration.
  9. func DropCapabilities(container *libcontainer.Container) error {
  10. c, err := capability.NewPid(os.Getpid())
  11. if err != nil {
  12. return err
  13. }
  14. keep := getEnabledCapabilities(container)
  15. c.Clear(allCapabilityTypes)
  16. c.Set(allCapabilityTypes, keep...)
  17. if err := c.Apply(allCapabilityTypes); err != nil {
  18. return err
  19. }
  20. return nil
  21. }
  22. // getCapabilitiesMask returns the capabilities that should not be dropped by the container.
  23. func getEnabledCapabilities(container *libcontainer.Container) []capability.Cap {
  24. keep := []capability.Cap{}
  25. for key, enabled := range container.CapabilitiesMask {
  26. if enabled {
  27. if c := libcontainer.GetCapability(key); c != nil {
  28. keep = append(keep, c.Value)
  29. }
  30. }
  31. }
  32. return keep
  33. }