我正在尝试基于主机名授予/限制对存储桶的访问。因此,来自* .something.edu的每个请求都将被授予访问权限。基本上,我想复制Apache Allow from (partial) domain-name
https://httpd.apache.org/docs/2.4/mod/mod_access_compat.html。任何帮助,将不胜感激。
答案 0 :(得分:1)
此Apache功能使用DNS查找来检查客户端的IP地址是否具有与所讨论的域名匹配的反向DNS条目,并且主机名的正向条目也指向该IP。
此配置将导致Apache httpd在客户端IP地址上执行双重DNS查找,而不管
HostnameLookups
指令的设置如何。它将对IP地址进行反向DNS查找,以找到关联的主机名,然后对主机名进行正向查找,以确保其与原始IP地址匹配。仅当正向和反向DNS一致且主机名匹配时,才允许访问。
S3不直接支持这种配置。
如果可以获取实际的IP地址范围,则可以使用存储桶策略允许基于源IP的访问(或拒绝基于“非源IP”的访问)。这不支持基于反向DNS的匹配,但支持CIDR范围。
请参阅《 Amazon S3开发人员指南》中的Restricting Access to Specific IP Addresses。
与此类策略不匹配的请求将看到无法自定义的通用访问被拒绝消息。
另一种允许以与Apache等效的方式实现此逻辑的替代方法是将CloudFront分发附加到存储桶,然后使用Lambda@Edge Viewer Request触发器-一个小的可以在边缘的Lambda函数中运行的Node.JS JavaScript的摘要-进行DNS查找并允许或拒绝访问。
event structure提供了event.Records[0].cf.request.clientIp
。您需要使用Node.js的dns
解析器进行两次DNS查找,并返回一个响应信号,通知CloudFront是否应允许或拒绝该请求。如果被拒绝,您可以返回最大为40KB的自定义响应,可能解释了拒绝的原因。
Lambda @ Edge触发代码在托管容器化环境中运行,该环境倾向于在调用之间保留其全局变量,因此DNS查找可以缓存在内存中,从而避免了针对同一查看器重复调用的查找。这种“容器重用”的性质超出了此答案的范围。不能保证,但是它经常发生。