diff --git a/src/main/java/org/opensearch/security/auditlog/impl/AbstractAuditLog.java b/src/main/java/org/opensearch/security/auditlog/impl/AbstractAuditLog.java index 9c73707209..fe0bf8d4b4 100644 --- a/src/main/java/org/opensearch/security/auditlog/impl/AbstractAuditLog.java +++ b/src/main/java/org/opensearch/security/auditlog/impl/AbstractAuditLog.java @@ -229,6 +229,7 @@ public void logFailedLogin(String effectiveUser, boolean securityadmin, String i msg.addRestRequestInfo(request, auditConfigFilter); msg.addInitiatingUser(initiatingUser); msg.addEffectiveUser(effectiveUser); + msg.addTenant(getTenant(request)); msg.addIsAdminDn(securityadmin); enrichWithUserContext(msg); save(msg); @@ -247,6 +248,7 @@ public void logSucceededLogin(String effectiveUser, boolean securityadmin, Strin msg.addRestRequestInfo(request, auditConfigFilter); msg.addInitiatingUser(initiatingUser); msg.addEffectiveUser(effectiveUser); + msg.addTenant(getTenant(request)); msg.addIsAdminDn(securityadmin); enrichWithUserContext(msg); save(msg); @@ -263,6 +265,7 @@ public void logMissingPrivileges(String privilege, String effectiveUser, Securit msg.addRemoteAddress(remoteAddress); msg.addRestRequestInfo(request, auditConfigFilter); msg.addEffectiveUser(effectiveUser); + msg.addTenant(getTenant(request)); msg.addPrivilege(privilege); enrichWithUserContext(msg); save(msg); @@ -279,6 +282,7 @@ public void logGrantedPrivileges(String effectiveUser, SecurityRequest request) msg.addRestRequestInfo(request, auditConfigFilter); msg.addEffectiveUser(effectiveUser); enrichWithUserContext(msg); + msg.addTenant(getTenant(request)); save(msg); } @@ -299,6 +303,7 @@ public void logMissingPrivileges(String privilege, TransportRequest request, Tas getUser(), null, null, + getTenant(), remoteAddress, request, getThreadContextHeaders(), @@ -338,6 +343,7 @@ public void logGrantedPrivileges(String privilege, TransportRequest request, Tas getUser(), null, null, + getTenant(), remoteAddress, request, getThreadContextHeaders(), @@ -378,6 +384,7 @@ public void logIndexEvent(String privilege, TransportRequest request, Task task) getUser(), null, null, + getTenant(), remoteAddress, request, getThreadContextHeaders(), @@ -603,6 +610,7 @@ public void logBadHeaders(TransportRequest request, String action, Task task) { getUser(), null, null, + getTenant(), remoteAddress, request, getThreadContextHeaders(), @@ -635,6 +643,7 @@ public void logBadHeaders(SecurityRequest request) { msg.addRemoteAddress(remoteAddress); msg.addRestRequestInfo(request, auditConfigFilter); msg.addEffectiveUser(getUser()); + msg.addTenant(getTenant(request)); save(msg); } @@ -655,6 +664,7 @@ public void logSecurityIndexAttempt(TransportRequest request, String action, Tas getUser(), false, null, + getTenant(), remoteAddress, request, getThreadContextHeaders(), @@ -694,6 +704,7 @@ public void logSSLException(TransportRequest request, Throwable t, String action getUser(), false, null, + getTenant(), remoteAddress, request, getThreadContextHeaders(), @@ -728,6 +739,7 @@ public void logSSLException(SecurityRequest request, Throwable t) { msg.addRestRequestInfo(request, auditConfigFilter); msg.addException(t); msg.addEffectiveUser(getUser()); + msg.addTenant(getTenant(request)); save(msg); } @@ -759,6 +771,7 @@ public void logDocumentRead(String index, String id, ShardId shardId, Map resolve( final String effectiveUser, final Boolean securityadmin, final String initiatingUser, + final String tenant, final TransportAddress remoteAddress, final TransportRequest request, final Map headers, @@ -97,6 +98,7 @@ public static List resolve( effectiveUser, securityadmin, initiatingUser, + tenant, remoteAddress, action, privilege, @@ -137,6 +139,7 @@ public static List resolve( effectiveUser, securityadmin, initiatingUser, + tenant, remoteAddress, action, privilege, @@ -161,6 +164,7 @@ private static AuditMessage resolveInner( final String effectiveUser, final Boolean securityadmin, final String initiatingUser, + final String tenant, final TransportAddress remoteAddress, final String action, final String priv, @@ -181,6 +185,7 @@ private static AuditMessage resolveInner( final AuditMessage msg = new AuditMessage(category, cs, origin, Origin.TRANSPORT); msg.addInitiatingUser(initiatingUser); msg.addEffectiveUser(effectiveUser); + msg.addTenant(tenant); msg.addRemoteAddress(remoteAddress); msg.addAction(action); diff --git a/src/test/java/org/opensearch/security/auditlog/integration/BasicAuditlogTest.java b/src/test/java/org/opensearch/security/auditlog/integration/BasicAuditlogTest.java index 96779fdb9a..fb68759b65 100644 --- a/src/test/java/org/opensearch/security/auditlog/integration/BasicAuditlogTest.java +++ b/src/test/java/org/opensearch/security/auditlog/integration/BasicAuditlogTest.java @@ -988,4 +988,51 @@ public void testSensitiveMethodRedaction() throws Exception { assertThat(TestAuditlogImpl.messages.size(), is(1)); Assert.assertTrue(TestAuditlogImpl.sb.toString().contains(expectedUpdateUserRequestBody)); } + + @Test + public void testTenantFieldOnAuthenticatedRestRequest() throws Exception { + final Settings settings = Settings.builder() + .put("plugins.security.audit.type", TestAuditlogImpl.class.getName()) + .put(ConfigConstants.OPENDISTRO_SECURITY_AUDIT_CONFIG_DISABLED_REST_CATEGORIES, "NONE") + .put(ConfigConstants.OPENDISTRO_SECURITY_AUDIT_CONFIG_DISABLED_TRANSPORT_CATEGORIES, "NONE") + .build(); + setup(settings); + + final List messages = TestAuditlogImpl.doThenWaitForMessages(() -> { + final HttpResponse response = rh.executeGetRequest( + "_search", + encodeBasicHeader("admin", "admin"), + new BasicHeader("securitytenant", "engineering_tenant") + ); + assertThat(response.getStatusCode(), equalTo(HttpStatus.SC_OK)); + }, 2); + + messages.forEach( + message -> assertThat(message.toJson(), message.getAsMap().get(AuditMessage.REQUEST_TENANT), equalTo("engineering_tenant")) + ); + validateMsgs(messages); + } + + @Test + public void testTenantFieldOnFailedLogin() throws Exception { + final Settings settings = Settings.builder() + .put("plugins.security.audit.type", TestAuditlogImpl.class.getName()) + .put(ConfigConstants.OPENDISTRO_SECURITY_AUDIT_CONFIG_DISABLED_REST_CATEGORIES, "NONE") + .build(); + setup(settings); + + final List messages = TestAuditlogImpl.doThenWaitForMessages(() -> { + final HttpResponse response = rh.executeGetRequest( + "_search", + encodeBasicHeader("admin", "wrongpassword"), + new BasicHeader("securitytenant", "engineering_tenant") + ); + assertThat(response.getStatusCode(), equalTo(HttpStatus.SC_UNAUTHORIZED)); + }, 1); + + assertThat(messages.get(0).getCategory(), equalTo(AuditCategory.FAILED_LOGIN)); + assertThat(messages.get(0).getAsMap().get(AuditMessage.REQUEST_TENANT), equalTo("engineering_tenant")); + + validateMsgs(messages); + } }