【发布时间】:2020-11-25 19:33:17
【问题描述】:
从AWS SDK 的版本 1.11.700 切换到 1.11.908,我们的一个库现在无法在受保护的环境中工作。更具体地说,新的 SDK 版本已更改 ClientConfiguration,因此它现在通过检查环境变量来实例化 RetryPolicy。
不幸的是,我们将把这个库部署到一个禁止(SecurityManager in place)访问环境变量的环境中。 这意味着我们所有依赖于AmazonHttpClient 的代码不再可用,因为:
- 要实例化
AmazonHttpClient,您必须传入有效的ClientConfiguration(不接受 null) - 要创建有效的
ClientConfiguration,您需要能够读取环境变量
这是堆栈跟踪:
java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "getenv.AWS_RETRY_MODE")
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
at java.security.AccessController.checkPermission(AccessController.java:886)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at com.boomi.security.ExtendedSecurityManager.checkPermissionImpl(ExtendedSecurityManager.java:207)
at com.boomi.security.ExtendedSecurityManager.checkPermission(ExtendedSecurityManager.java:114)
at java.lang.System.getenv(System.java:894)
at com.amazonaws.retry.internal.RetryModeResolver.envVar(RetryModeResolver.java:67)
at com.amazonaws.retry.internal.RetryModeResolver.resolveRetryMode(RetryModeResolver.java:72)
at com.amazonaws.retry.internal.RetryModeResolver.<init>(RetryModeResolver.java:46)
at com.amazonaws.retry.RetryPolicy.<clinit>(RetryPolicy.java:35)
at com.amazonaws.retry.PredefinedRetryPolicies.<clinit>(PredefinedRetryPolicies.java:30)
at com.amazonaws.ClientConfiguration.<clinit>(ClientConfiguration.java:89)
我们提出的所有选项都不适用于这种情况:
- 子类化
ClientConfiguration以抑制异常:无法尝试捕获对 super() 构造函数的调用 -
ClientConfiguration是一个类,因此我们没有要实现的接口 -
java.policy无法修改以允许访问该属性:环境不在我们的控制范围内 - 异常是从而不是从引发的,因此它甚至与单个对象无关...
【问题讨论】:
-
您至少可以修改 java 策略文件吗? ~/.java.policy` 或
[java.home]/lib/security/java.policy并添加以下内容:grant { permission java.lang.RuntimePermission "getenv.AWS_RETRY_MODE", "read"; }; -
谢谢,但是修改安全环境不是我们可以在那个环境下做的事情,我会澄清这个问题
标签: java aws-sdk securitymanager java-security-manager