验证ASP.. NET Core OpenTelemetry /metrics端点



app.UseOpenTelemetryPrometheusScrapingEndpoint();添加端点/metrics,其中Prometheus擦除收集的指标。然而,端点没有任何身份验证,每个人都可以调用。

端点是否有添加一些基本或自定义身份验证的配置?

UseOpenTelemetryPrometheusScrapingEndpoint()允许您提供一个谓词,该谓词返回true或false以服务度量端点。您可以使用谓词来检查授权头,然后阻止或授予请求。

例如,您可以检查谓词中的Basic授权头,如下所示:https://learn.microsoft.com/en-us/aspnet/web-api/overview/security/basic-authentication

app.UseOpenTelemetryPrometheusScrapingEndpoint(
context =>
{
if (context.Request.Path != "/metrics") return false;
var authHeader = context.Request.Headers.Authorization.FirstOrDefault();
if (authHeader == null) return false;
var authHeaderVal = AuthenticationHeaderValue.Parse(authHeader);
if (authHeaderVal == null) return false;
// RFC 2617 sec 1.2, "scheme" name is case-insensitive
if (!authHeaderVal.Scheme.Equals("basic",
StringComparison.OrdinalIgnoreCase) ||
authHeaderVal.Parameter == null)
{
return false;
}
var encoding = Encoding.GetEncoding("iso-8859-1");
var credentials = encoding.GetString(Convert.FromBase64String(authHeaderVal.Parameter));
int separator = credentials.IndexOf(':');
string name = credentials.Substring(0, separator);
string password = credentials.Substring(separator + 1);
return name == "your_username" && password == "your_password";
});

当然,你的prometheus配置也必须匹配基本的认证凭证:

basic_auth: 
username: your_username
password: your_password

为度量端点启用身份验证是一种方法,您是否考虑过另一种常用方法->

创建单独的web服务器端点例如,在另一个端口上创建KestrelMetricServer的新实例。访问此端点受到防火墙规则的限制,只允许特定的IP地址连接。对于一个实际的例子,你可以参考GitHub上的示例。

在这种方法中,Prometheus指标通过与主应用程序一起运行的单独HTTP服务器公开。通过将防火墙配置为只允许来自特定IP地址的访问,您可以确保只有授权方才能访问这些指标。这为您的度量端点提供了额外的安全层。

最新更新