interceptor.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package api
  2. import (
  3. "fmt"
  4. "net"
  5. "github.com/Sirupsen/logrus"
  6. "github.com/asaskevich/govalidator"
  7. gcontext "golang.org/x/net/context"
  8. "google.golang.org/grpc"
  9. "google.golang.org/grpc/metadata"
  10. )
  11. // AuthUnaryInterceptor is a interceptor function.
  12. //
  13. // See https://godoc.org/google.golang.org/grpc#UnaryServerInterceptor.
  14. func AuthUnaryInterceptor(ctx gcontext.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) {
  15. var enableAuthCheck bool
  16. md, ok := metadata.FromIncomingContext(ctx)
  17. if !ok {
  18. return nil, fmt.Errorf("Expected 2 metadata items in context; got %v", md)
  19. }
  20. // We enable auth check if we find a non-loopback
  21. // or invalid IP in the headers coming from the grpc-gateway.
  22. for _, userAgentIP := range md["x-forwarded-for"] {
  23. // Check if the remote user IP addr is a proper IP addr.
  24. if !govalidator.IsIP(userAgentIP) {
  25. enableAuthCheck = true
  26. logrus.Debugf("grpc request user agent ip can not be fetched from x-forwarded-for metadata, enabling auth check module '%s'", userAgentIP)
  27. break
  28. }
  29. // Check if the remote user IP addr is a loopback IP addr.
  30. if ip := net.ParseIP(userAgentIP); !ip.IsLoopback() {
  31. enableAuthCheck = true
  32. logrus.Debugf("grpc request user agent ips include non-link local ip, enabling auth check module '%s'", userAgentIP)
  33. break
  34. }
  35. // TODO(cad): We assume gRPC endpoints are for cli only therefore
  36. // we are listening only on looback IP.
  37. //
  38. // But if we decide use gRPC endpoints publicly, we need to add
  39. // extra checks against gRPC remote peer IP to test if the request
  40. // is coming from a remote peer IP or also from a loopback ip.
  41. }
  42. if !enableAuthCheck {
  43. logrus.Debugf("rpc: auth-check not enabled: %s", md["x-forwarded-for"])
  44. }
  45. if enableAuthCheck {
  46. switch info.FullMethod {
  47. // AuthService methods
  48. case "/pb.AuthService/Status":
  49. return authRequired(ctx, req, handler)
  50. // UserService methods
  51. case "/pb.UserService/List":
  52. return authRequired(ctx, req, handler)
  53. case "/pb.UserService/Create":
  54. return authRequired(ctx, req, handler)
  55. case "/pb.UserService/Update":
  56. return authRequired(ctx, req, handler)
  57. case "/pb.UserService/Delete":
  58. return authRequired(ctx, req, handler)
  59. case "/pb.UserService/Renew":
  60. return authRequired(ctx, req, handler)
  61. case "/pb.UserService/GenConfig":
  62. return authRequired(ctx, req, handler)
  63. // VPNService methods
  64. case "/pb.VPNService/Status":
  65. return authRequired(ctx, req, handler)
  66. case "/pb.VPNService/Init":
  67. return authRequired(ctx, req, handler)
  68. case "/pb.VPNService/Update":
  69. return authRequired(ctx, req, handler)
  70. // NetworkService methods
  71. case "/pb.NetworkService/Create":
  72. return authRequired(ctx, req, handler)
  73. case "/pb.NetworkService/List":
  74. return authRequired(ctx, req, handler)
  75. case "/pb.NetworkService/Delete":
  76. return authRequired(ctx, req, handler)
  77. case "/pb.NetworkService/GetAllTypes":
  78. return authRequired(ctx, req, handler)
  79. case "/pb.NetworkService/GetAssociatedUsers":
  80. return authRequired(ctx, req, handler)
  81. case "/pb.NetworkService/Associate":
  82. return authRequired(ctx, req, handler)
  83. case "/pb.NetworkService/Dissociate":
  84. return authRequired(ctx, req, handler)
  85. default:
  86. logrus.Debugln("rpc: auth is not required for this endpoint: '%s'", info.FullMethod)
  87. }
  88. }
  89. return handler(ctx, req)
  90. }