capabilities.go 986 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. package capabilities
  2. import (
  3. "os"
  4. "github.com/dotcloud/docker/pkg/libcontainer"
  5. "github.com/syndtr/gocapability/capability"
  6. )
  7. // DropCapabilities drops capabilities for the current process based
  8. // on the container's configuration.
  9. func DropCapabilities(container *libcontainer.Container) error {
  10. if drop := getCapabilitiesMask(container); len(drop) > 0 {
  11. c, err := capability.NewPid(os.Getpid())
  12. if err != nil {
  13. return err
  14. }
  15. c.Unset(capability.CAPS|capability.BOUNDS, drop...)
  16. if err := c.Apply(capability.CAPS | capability.BOUNDS); err != nil {
  17. return err
  18. }
  19. }
  20. return nil
  21. }
  22. // getCapabilitiesMask returns the specific cap mask values for the libcontainer types
  23. func getCapabilitiesMask(container *libcontainer.Container) []capability.Cap {
  24. drop := []capability.Cap{}
  25. for key, enabled := range container.CapabilitiesMask {
  26. if !enabled {
  27. if c := libcontainer.GetCapability(key); c != nil {
  28. drop = append(drop, c.Value)
  29. }
  30. }
  31. }
  32. return drop
  33. }