如何阻止 AppEngine 的 _ah/start 和 _ah/stop 路由对外可见

How to block AppEngine's _ah/start and _ah/stop routes from being visible to the outside world

我的 'Flexible' 应用程序中有 _ah/start 和 _ah/stop 路线。我知道 GAE 容器会在应用程序启动和关闭时调用这些端点。

部署我的应用程序后,我可以坐在舒适的沙发上自己攻击它们。 这当然没有意义,因为随机的陌生人不能成为应用程序实例何时启动和关闭的仲裁者。如何配置 AppEngine 以阻止将这两条路由发布到外界?或者是在我的工作中执行那两条路由来检查 IP 地址或寻找 header 只有 GAE 可以发送?

基于此页面: https://cloud.google.com/appengine/docs/flexible/go/how-requests-are-handled

当请求进入 GCP 时,匹配 X-Google-*X-Appengine-*

Headers 将被删除。然后,Appengine 可能会添加与这些模式匹配的 headers,因此如果您的处理程序检测到任何此类 headers,我认为假设请求来自 GAE 而不是某个随机客户端是安全的。

你可以转储你得到的所有 header 并查看是否有任何有趣的,然后从 public 客户端尝试发送请求并设置这样的 header一些值,看看它是否首先被清理然后由 GAE 再次设置。必须先对任何此类 header 进行清理,否则任何人都可以将它们发送到您的应用程序。

我不会依赖 IP 地址。

因此 flex 不使用 /_ah/* 路径,因此不会隐藏它们。遗憾的是,我们的文档存在不一致之处。此处正确记录 https://cloud.google.com/appengine/docs/flexible/python/migrating but (at the moment) https://cloud.google.com/appengine/docs/flexible/custom-runtimes/build 不正确。文档更新正在审查中,应该会很快 public。

对造成的混乱表示歉意。

所以我费了点功夫才真正理解 /_ah/stop 的实际工作原理,文档不清楚,我添加了这个 post 的答案以供进一步参考,因为它是弹出的在 Google 次搜索中排名第一。

/_ah/stop 端点仅适用于 标准实例,使用手动缩放(它在 table 的最后一列这里 https://cloud.google.com/appengine/docs/standard/nodejs/how-instances-are-managed这仅适用于手动缩放,乍一看并不简单)。

在我的用例中,我有一个包含两个服务的应用程序,一个 API(自动缩放)和一个 Worker(手动缩放),我吓坏了,因为我可以调用 /_ah/stop 路由我的 API,从而杀死它。它适用于我的工作人员,因为在这个用例中,路由受 GAE 保护。

如果 GAE 团队的任何人读到这篇文章 post,也许在任何情况下阻止路由 /_ah/* 都会很好,因为我现在担心有一天我们会切换到另一种环境,如果我们忘记更改配置,我们将面临潜在的安全威胁。

希望对您有所帮助。