非IAM认证AWS Neptune集群使用SigV4签名请求异常连接成功问题
为什么带SigV4签名的请求能成功连接非IAM认证的AWS Neptune集群?
我配置了一个非IAM认证的AWS Neptune集群,使用以下Java代码连接:
Cluster.Builder builder = Cluster.build(); builder.addContactPoint(clusterEndpoint); builder.port(portValue); builder.enableSsl(true); builder.handshakeInterceptor(r -> { try { BasicAWSCredentials basicAWSCredentials = new BasicAWSCredentials(accessKeyId, secretAccessKey); AWSStaticCredentialsProvider awsStaticCredentialsProvider = new AWSStaticCredentialsProvider( basicAWSCredentials); NeptuneNettyHttpSigV4Signer sigV4Signer = new NeptuneNettyHttpSigV4Signer( connectionInfoBean.getAwsRegion(), awsStaticCredentialsProvider); sigV4Signer.signRequest(r); } catch (NeptuneSigV4SignerException e) { throw new RuntimeException("Exception occurred while signing the request", e); } return r; }); GraphTraversalSource traversal= AnonymousTraversalSource.traversal().withRemote(DriverRemoteConnection.using(cluster));
按照预期,非IAM集群不应接受带IAM凭证签名的请求,连接应该失败,但实际我成功获取了GraphTraversalSource并能执行Gremlin遍历操作,想了解这种异常情况的原因。
原因分析
- 非IAM集群不会验证SigV4签名:当Neptune集群未启用IAM认证时,它完全不会处理或验证请求中的SigV4签名信息(比如
Authorization头)。集群以无认证模式运行,只要请求能通过网络到达集群,就会被正常处理,不会因为存在签名而拒绝连接。 - 签名仅添加额外HTTP头,无冲突逻辑:你的代码通过
NeptuneNettyHttpSigV4Signer给请求添加了签名相关的HTTP头,但这些头对于非IAM集群来说只是普通的请求头,不会触发任何拒绝或验证逻辑,集群直接忽略它们,所以请求能正常完成。 - 网络权限配置允许访问:能成功连接的前提是你的客户端所在环境(如EC2实例、本地机器)的安全组、网络ACL、VPC端点等配置允许访问Neptune集群的端口(默认8182)。这和签名无关,但却是连接成功的必要条件。
内容的提问来源于stack exchange,提问作者dishabehrani77
相关产品推荐
相关产品推荐

