Skip to content

Commit fd0148c

Browse files
authored
Add IMDSv2 and auth token support in IamAws provider. (#1192)
Signed-off-by: Bala.FA <bala.gluster@gmail.com>
1 parent e53dcea commit fd0148c

File tree

1 file changed

+43
-10
lines changed

1 file changed

+43
-10
lines changed

api/src/main/java/io/minio/credentials/IamAwsProvider.java

Lines changed: 43 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -108,9 +108,10 @@ private Credentials fetchCredentials(String tokenFile) {
108108
return credentials;
109109
}
110110

111-
private Credentials fetchCredentials(HttpUrl url) {
112-
try (Response response =
113-
httpClient.newCall(new Request.Builder().url(url).method("GET", null).build()).execute()) {
111+
private Credentials fetchCredentials(HttpUrl url, String tokenHeader, String token) {
112+
Request.Builder builder = new Request.Builder().url(url).method("GET", null);
113+
if (token != null && !token.isEmpty()) builder.header(tokenHeader, token);
114+
try (Response response = httpClient.newCall(builder.build()).execute()) {
114115
if (!response.isSuccessful()) {
115116
throw new ProviderException(url + " failed with HTTP status code " + response.code());
116117
}
@@ -126,10 +127,38 @@ private Credentials fetchCredentials(HttpUrl url) {
126127
}
127128
}
128129

129-
private String getIamRoleName(HttpUrl url) {
130+
private String fetchImdsToken() {
131+
HttpUrl url = this.customEndpoint;
132+
if (url == null) {
133+
url = HttpUrl.parse("http://169.254.169.254/latest/api/token");
134+
} else {
135+
url =
136+
new HttpUrl.Builder()
137+
.scheme(url.scheme())
138+
.host(url.host())
139+
.addPathSegments("latest/api/token")
140+
.build();
141+
}
142+
String token = "";
143+
Request request =
144+
new Request.Builder()
145+
.url(url)
146+
.method("PUT", null)
147+
.header("X-aws-ec2-metadata-token-ttl-seconds", "21600")
148+
.build();
149+
try (Response response = httpClient.newCall(request).execute()) {
150+
if (response.isSuccessful()) token = response.body().string();
151+
} catch (IOException e) {
152+
token = "";
153+
}
154+
return token;
155+
}
156+
157+
private String getIamRoleName(HttpUrl url, String token) {
130158
String[] roleNames = null;
131-
try (Response response =
132-
httpClient.newCall(new Request.Builder().url(url).method("GET", null).build()).execute()) {
159+
Request.Builder builder = new Request.Builder().url(url).method("GET", null);
160+
if (token != null && !token.isEmpty()) builder.header("X-aws-ec2-metadata-token", token);
161+
try (Response response = httpClient.newCall(builder.build()).execute()) {
133162
if (!response.isSuccessful()) {
134163
throw new ProviderException(url + " failed with HTTP status code " + response.code());
135164
}
@@ -146,7 +175,7 @@ private String getIamRoleName(HttpUrl url) {
146175
return roleNames[0];
147176
}
148177

149-
private HttpUrl getIamRoleNamedUrl() {
178+
private HttpUrl getIamRoleNamedUrl(String token) {
150179
HttpUrl url = this.customEndpoint;
151180
if (url == null) {
152181
url = HttpUrl.parse("http://169.254.169.254/latest/meta-data/iam/security-credentials/");
@@ -159,7 +188,7 @@ private HttpUrl getIamRoleNamedUrl() {
159188
.build();
160189
}
161190

162-
String roleName = getIamRoleName(url);
191+
String roleName = getIamRoleName(url, token);
163192
return url.newBuilder().addPathSegment(roleName).build();
164193
}
165194

@@ -176,6 +205,8 @@ public synchronized Credentials fetch() {
176205
return credentials;
177206
}
178207

208+
String tokenHeader = "Authorization";
209+
String token = getProperty("AWS_CONTAINER_AUTHORIZATION_TOKEN");
179210
if (getProperty("AWS_CONTAINER_CREDENTIALS_RELATIVE_URI") != null) {
180211
if (url == null) {
181212
url =
@@ -191,10 +222,12 @@ public synchronized Credentials fetch() {
191222
}
192223
checkLoopbackHost(url);
193224
} else {
194-
url = getIamRoleNamedUrl();
225+
token = fetchImdsToken();
226+
tokenHeader = "X-aws-ec2-metadata-token";
227+
url = getIamRoleNamedUrl(token);
195228
}
196229

197-
credentials = fetchCredentials(url);
230+
credentials = fetchCredentials(url, tokenHeader, token);
198231
return credentials;
199232
}
200233

0 commit comments

Comments
 (0)