Skip to content

Commit 6ac8392

Browse files
committed
CLDSRV-893: Return ARN for assumed-role requesters in access logs
The getRequester() function fell through to the canonical ID for assumed-role sessions, producing a space-containing string that broke space-delimited log parsers. (cherry picked from commit 46a99ae)
1 parent 9c0b28e commit 6ac8392

2 files changed

Lines changed: 30 additions & 0 deletions

File tree

lib/utilities/serverAccessLogger.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,11 +320,16 @@ function getOperation(req) {
320320
return `REST.${req.method}.${resourceType}`;
321321
}
322322

323+
const assumedRoleArnRegex = /^arn:aws:sts::[0-9]{12}:assumed-role\/\S+$/;
324+
323325
function getRequester(authInfo) {
324326
const requester = null;
325327
if (authInfo) {
328+
const arn = authInfo.getArn ? authInfo.getArn() : null;
326329
if (authInfo.isRequesterPublicUser && authInfo.isRequesterPublicUser()) {
327330
return requester; // Unauthenticated requests
331+
} else if (arn && assumedRoleArnRegex.test(arn)) {
332+
return arn;
328333
} else if (authInfo.isRequesterAnIAMUser && authInfo.isRequesterAnIAMUser()) {
329334
// IAM user: include IAM user name and account
330335
const iamUserName = authInfo.getIAMdisplayName ? authInfo.getIAMdisplayName() : '';

tests/unit/utils/serverAccessLogger.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,31 @@ describe('serverAccessLogger utility functions', () => {
293293
assert.strictEqual(result, 'canonicalID123');
294294
});
295295

296+
it('should return ARN for assumed-role session user', () => {
297+
const arn = 'arn:aws:sts::123456789012:assumed-role/lifecycle-role/backbeat-lifecycle';
298+
const authInfo = {
299+
isRequesterPublicUser: () => false,
300+
isRequesterAnIAMUser: () => false,
301+
getArn: () => arn,
302+
getCanonicalID: () => 'canonicalID789',
303+
};
304+
const result = getRequester(authInfo);
305+
assert.strictEqual(result, arn);
306+
});
307+
308+
it('should fall through to IAM user path for non-assumed-role ARN', () => {
309+
const authInfo = {
310+
isRequesterPublicUser: () => false,
311+
isRequesterAnIAMUser: () => true,
312+
getArn: () => 'arn:aws:iam::123456789012:user/myuser',
313+
getIAMdisplayName: () => 'myuser',
314+
getAccountDisplayName: () => 'myaccount',
315+
getCanonicalID: () => 'canonicalID789',
316+
};
317+
const result = getRequester(authInfo);
318+
assert.strictEqual(result, 'myuser:myaccount');
319+
});
320+
296321
it('should return canonical ID for regular user', () => {
297322
const authInfo = {
298323
isRequesterPublicUser: () => false,

0 commit comments

Comments
 (0)