Nodejs访问外部用户和内部进程的路由
Nodejs accessing routes from external users and internal processes
我有一个架构问题。
假设我有一条路线“/tickets”。我可以很容易地验证使用护照访问这条路线的用户。我可以通过 acl 进一步保护这条路线。
现在假设我的内部应用程序或进程想要访问同一路由。我想我可能只有一个选择。我必须创建一个具有正确角色的单独 user/password,并让我的内部应用程序或进程使用这个单独的凭据对该路由进行 HTTP 调用。
那么,这是访问内部 API 的正确方法吗?
还有其他可能有用的建议吗?
谢谢
对于只能在内部访问的路线有很多不同的选择:
- 在不同的端口上创建不同的服务器,但在实现专用路由的同一进程中并在防火墙处阻止对该端口的访问。这是我最喜欢的选项,因为做对真的很简单。您在非标准端口(如 8000 或类似端口)上创建第二个 http 服务器进程,并确保您的防火墙仅允许 public 访问端口 80 或 443。然后将所有内部路由放在端口 8000 服务器。但是,由于它与您的 public 服务器处于同一进程中,您仍然可以访问所有 sme 数据。使用一个简单的防火墙规则(默认情况下可能已经实施),您可以阻止对所有私有路由的访问。
- 验证所有路由,对内部路由使用不同的凭据。 在这里,您有一组不同的凭据,这些凭据保留在内部并且仅用于您的内部路由。由于外界没有人拥有这些凭据,因此他们不应该能够使用它们。
- 阻止 public 在网络级别访问内部路由。 在这里,您可以使用代理或防火墙来阻止在网络级别访问特定的内部路由等级。因此,如果您的传入防火墙看到对 /admin/whatever 的请求,它只会阻止对以 /admin 开头的任何内容的访问。内部路由可以在有或没有凭据的情况下自由使用,但只能在服务器的专用网络内使用。无法从外部访问它们。
- 只允许在网络级别访问已知的 public 路由。 这与选项 2 正好相反。在这里你必须明确告诉你的 firewall/proxy public 允许访问哪些路由。
- 只允许某些 IP 地址访问私有路由。 在这里,如果源 IP 地址不是您本地的本地 IP 地址,您可以拒绝访问任何私有路由网络。这只是实现 2 或 3 的一种不同方式。如果需要,可以将其设置得相当严格,只允许从一个或非常特定数量的内部 IP 地址进行访问。
为了提高安全性,您还可以组合各种选项,这些选项有时可用于防止恶意员工或您自己的专用网络上其他一些受损基础设施对您自己的基础设施进行内部攻击。
例如,您可以组合选项 1、2 和 5。您将创建一个单独的服务器端口,该端口无法从 public 互联网访问,并且您将使用内部验证对它的每个请求-只有凭据,您只允许从特定的内部 IP 地址访问它。我并不是说你必须将所有这些结合起来,但我告诉你这些并不是相互排斥的。我最喜欢的是结合 1 和 2。
仅供参考,如果您希望对 /tickets
等相同功能进行私有访问,但具有不同的访问权限,您可以使用只能在内部访问的第二台服务器(如上面选项 1 中所述)并且只有一个具有不同访问控制的 /tickets
路由。两个独立的服务器可以共享所有相同的 /tickets
实现(只需将实现放在两个可以共享的函数中),除了它们在定义所需身份验证的两个服务器上具有不同的路由定义。您甚至可以让私人服务器在 request
对象上设置一个标志,向您的代码的其余部分指示从哪个入口点调用路由(public 或私有),以便它可以基于该分支信息。
我有一个架构问题。
假设我有一条路线“/tickets”。我可以很容易地验证使用护照访问这条路线的用户。我可以通过 acl 进一步保护这条路线。
现在假设我的内部应用程序或进程想要访问同一路由。我想我可能只有一个选择。我必须创建一个具有正确角色的单独 user/password,并让我的内部应用程序或进程使用这个单独的凭据对该路由进行 HTTP 调用。
那么,这是访问内部 API 的正确方法吗? 还有其他可能有用的建议吗?
谢谢
对于只能在内部访问的路线有很多不同的选择:
- 在不同的端口上创建不同的服务器,但在实现专用路由的同一进程中并在防火墙处阻止对该端口的访问。这是我最喜欢的选项,因为做对真的很简单。您在非标准端口(如 8000 或类似端口)上创建第二个 http 服务器进程,并确保您的防火墙仅允许 public 访问端口 80 或 443。然后将所有内部路由放在端口 8000 服务器。但是,由于它与您的 public 服务器处于同一进程中,您仍然可以访问所有 sme 数据。使用一个简单的防火墙规则(默认情况下可能已经实施),您可以阻止对所有私有路由的访问。
- 验证所有路由,对内部路由使用不同的凭据。 在这里,您有一组不同的凭据,这些凭据保留在内部并且仅用于您的内部路由。由于外界没有人拥有这些凭据,因此他们不应该能够使用它们。
- 阻止 public 在网络级别访问内部路由。 在这里,您可以使用代理或防火墙来阻止在网络级别访问特定的内部路由等级。因此,如果您的传入防火墙看到对 /admin/whatever 的请求,它只会阻止对以 /admin 开头的任何内容的访问。内部路由可以在有或没有凭据的情况下自由使用,但只能在服务器的专用网络内使用。无法从外部访问它们。
- 只允许在网络级别访问已知的 public 路由。 这与选项 2 正好相反。在这里你必须明确告诉你的 firewall/proxy public 允许访问哪些路由。
- 只允许某些 IP 地址访问私有路由。 在这里,如果源 IP 地址不是您本地的本地 IP 地址,您可以拒绝访问任何私有路由网络。这只是实现 2 或 3 的一种不同方式。如果需要,可以将其设置得相当严格,只允许从一个或非常特定数量的内部 IP 地址进行访问。
为了提高安全性,您还可以组合各种选项,这些选项有时可用于防止恶意员工或您自己的专用网络上其他一些受损基础设施对您自己的基础设施进行内部攻击。
例如,您可以组合选项 1、2 和 5。您将创建一个单独的服务器端口,该端口无法从 public 互联网访问,并且您将使用内部验证对它的每个请求-只有凭据,您只允许从特定的内部 IP 地址访问它。我并不是说你必须将所有这些结合起来,但我告诉你这些并不是相互排斥的。我最喜欢的是结合 1 和 2。
仅供参考,如果您希望对 /tickets
等相同功能进行私有访问,但具有不同的访问权限,您可以使用只能在内部访问的第二台服务器(如上面选项 1 中所述)并且只有一个具有不同访问控制的 /tickets
路由。两个独立的服务器可以共享所有相同的 /tickets
实现(只需将实现放在两个可以共享的函数中),除了它们在定义所需身份验证的两个服务器上具有不同的路由定义。您甚至可以让私人服务器在 request
对象上设置一个标志,向您的代码的其余部分指示从哪个入口点调用路由(public 或私有),以便它可以基于该分支信息。