如何限制Azure Functions仅允许API Management服务访问?
完全可以实现,不需要把函数切到私有VNet访问模式,也不用采购高价的APIM Premium版,用公网链路配合三层访问控制就能做到仅指定APIM实例可调用你的Azure Function,所有用到的能力在APIM Basic/Standard/Developer层、Azure Function通用层全部自带,无额外成本:
- 第一层:配置Azure Function公网IP白名单
先到你的APIM实例概述页,把该实例所有的出站公网IP地址段全部复制出来——如果开了多区域部署、区域冗余,要把所有涉及区域的出站IP都找全,不要遗漏。之后进入Azure Function的「网络」-「访问限制」配置页,把上述IP段全部加为允许规则,最后加一条优先级最低的拒绝所有公网流量的规则,这一步会直接在平台层挡住所有非APIM来源IP的请求,根本到不了你的函数代码层。 - 第二层:托管函数访问密钥,避免密钥外泄
IP规则配置完不要直接开匿名访问,给这个函数生成一个专属的函数级访问密钥,这个密钥只存在APIM侧,绝对不对外暴露。所有转发到函数的请求,都通过APIM的后端策略自动把密钥拼到请求参数里,外部客户端完全接触不到这个密钥,从根源上避免密钥泄露被人直接调用的风险。 - 第三层:自定义请求头校验做兜底
为了规避极小概率的IP仿冒、同区域其他Azure服务IP误命中白名单的问题,你可以自定义一个只有APIM和函数两端知道的特殊请求头,比如X-Internal-Gate-Token,值设为32位以上的随机复杂字符串,同样通过APIM策略自动给转发到后端函数的请求加上这个头,在函数代码里加个前置校验:请求不带这个头、头值不匹配直接返回403,连业务逻辑都不进。
APIM侧自动加密钥和自定义头的策略示例如下:
<inbound> <base /> </inbound> <backend> <!-- 自动注入函数访问密钥 --> <set-query-parameter name="code" exists-action="override"> <value>你为APIM单独生成的Function访问密钥</value> </set-query-parameter> <!-- 自动注入自定义校验头 --> <set-header name="X-Internal-Gate-Token" exists-action="override"> <value>你自定义的随机复杂校验串</value> </set-header> </backend> <outbound> <base /> </outbound>
注意点:不要为了省事跳过密钥和自定义头校验只配IP白名单,双层及以上的校验足够覆盖绝大多数非合规访问场景,安全性完全可以满足普通业务的要求,成本只有VNet+Premium方案的10%不到。
内容的提问来源于stack exchange,提问作者DenCowboy
相关产品推荐
相关产品推荐

