使用 Caddy Security 时的 Uptime 监控

Caddy Security 不仅会将未经认证的访问者拒之门外也会拦住 可爱的 kuma 酱 Uptime Kuma这里会分享一下我的一个放过 kuma 的小技巧

P.S. 这是不是应该算经验分享而不是问题解决记录这两个 tag 的分界线到底在哪呢

问题描述

Caddy Security 可以为 Caddy 上的路由提供身份认证而这一认证发生在连接到服务之前所以如果不通过认证就无法通过网络访问来获知服务是否正常运行进而影响到 Uptime Kuma 的运作

初步解决方案以及存在的问题

一个自然的想法是可以关闭一些非敏感路由的身份认证用于 uptime 监控比如说一个服务的首页可能是非敏感可以公开的敏感信息都位于其它路由则可以

example.com {
    handle / {
        reverse_proxy localhost:2333
    }
    authenticate with some-auth-policy
    reverse_proxy localhost:2333
}

这看起来很好但问题在于一个网页往往不只是这个路径本身还有 jscss 等资源需要使用Caddy Security 只会在访问需要认证的网页时进行认证而不会在加载需要认证的资源时进行认证如果访问一个无需认证的网页但其使用的资源需要认证这些资源就可能加载不出来

将这些资源全部列出来会很麻烦如果处理不当也有泄露敏感信息的风险

解决方案: 给 kuma 一个单独的路由

上面的方案的问题只对人类访问者有影响而解决了 kuma 的问题所以可以使用同样的思路但只影响 kuma 而不影响访问者

example.com {
    handle /for_uptime_kuma {
        uri replace /for_uptime_kuma /
        reverse_proxy localhost:2333
    }
    authenticate with some-auth-policy
    reverse_proxy localhost:2333
}

然后在 Uptime Kuma 中把监控网址设成 https://example.com/for_uptime_kuma 即可

如果在多个路由都用到这个操作每次重复会比较繁琐可以使用 Caddy 的 snippet 功能

(kuma) {
    handle /for_uptime_kuma {
        uri replace /for_uptime_kuma {args.1}
        reverse_proxy localhost:{args.0}
    }
}

homepage-public.example.com {
    import kuma 2333 /
    authenticate with some-auth-policy
    reverse_proxy localhost:2333
}

public-public.example.com {
    import kuma 6666 /public
    authenticate with some-auth-policy
    reverse_proxy localhost:6666
}

另一种解决方案: 使用非网页资源进行监控

既然遇到的问题是网页会需要资源只放开网页的认证会加载不出资源另一个思路就是监控资源而非网页不一定是 jscss 这些也可以是可以公开的 API或者几乎不会被访问或访问时一定已经认证了的网页之类的这比较简单就不多讲了