Skip to content

Commit 2a60534

Browse files
committed
Add Audit Logs for Configuration changes
LMCROSSITXSADEPLOY-3159
1 parent 0aabbb1 commit 2a60534

File tree

18 files changed

+457
-122
lines changed

18 files changed

+457
-122
lines changed

multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/Messages.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,14 @@ public final class Messages {
241241

242242
public static final String FETCH_TOKEN_AUDIT_LOG_CONFIG = "Access token fetch";
243243

244+
public static final String READ_ENV_FROM_ENVIRONMENT = "Read {0} from environment for space with id: {1}";
245+
246+
public static final String SUBSCRIPTION_CREATE = "Create configuration-subscription in space with id: {0}";
247+
public static final String SUBSCRIPTION_UPDATE = "Update configuration-subscription in space with id: {0}";
248+
249+
public static final String ENTRY_CREATE = "Create configuration-entry in space with id: {0}";
250+
public static final String ENTRY_UPDATE = "Update configuration-entry in space with id: {0}";
251+
244252
// Audit log configuration
245253
public static final String GET_CSRF_TOKEN_AUDIT_LOG_CONFIG = "CSRF token get ";
246254

@@ -264,6 +272,14 @@ public final class Messages {
264272
public static final String MTA_INFO_AUDIT_LOG_CONFIG = "MTA info";
265273
public static final String MTA_LIST_AUDIT_LOG_CONFIG = "MTA list";
266274

275+
public static final String ENVIRONMENT_VARIABLE_READ_AUDIT_LOG_CONFIG = "Environment variable read";
276+
277+
public static final String SUBSCRIPTION_CREATE_AUDIT_LOG_CONFIG = "Configuration subscription create";
278+
public static final String SUBSCRIPTION_UPDATE_AUDIT_LOG_CONFIG = "Configuration subscription update";
279+
280+
public static final String ENTRY_CREATE_AUDIT_LOG_CONFIG = "Configuration entry create";
281+
public static final String ENTRY_UPDATE_AUDIT_LOG_CONFIG = "Configuration entry update";
282+
267283
public static final String API_INFO_AUDIT_LOG_CONFIG = "Api info";
268284
public static final String IGNORING_NAMESPACE_PARAMETERS = "Ignoring parameter \"{0}\" , as the MTA is not deployed with namespace!";
269285
public static final String NAMESPACE_PARSING_ERROR_MESSAGE = "Cannot parse \"{0}\" flag - expected a boolean format.";
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package org.cloudfoundry.multiapps.controller.core.auditlogging;
2+
3+
import java.text.MessageFormat;
4+
5+
import org.cloudfoundry.multiapps.controller.core.Messages;
6+
import org.cloudfoundry.multiapps.controller.core.auditlogging.model.AuditLogConfiguration;
7+
8+
public class ApplicationConfigurationAuditLog {
9+
10+
private final AuditLoggingFacade auditLoggingFacade;
11+
12+
public ApplicationConfigurationAuditLog(AuditLoggingFacade auditLoggingFacade) {
13+
this.auditLoggingFacade = auditLoggingFacade;
14+
}
15+
16+
public void logEnvironmentVariableRead(String envVariableName, String spaceGuid) {
17+
String performedAction = MessageFormat.format(Messages.READ_ENV_FROM_ENVIRONMENT, envVariableName, spaceGuid);
18+
auditLoggingFacade.logDataAccessAuditLog(new AuditLogConfiguration(spaceGuid,
19+
performedAction,
20+
Messages.ENVIRONMENT_VARIABLE_READ_AUDIT_LOG_CONFIG));
21+
}
22+
}

multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/auditlogging/AuditLogBean.java

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package org.cloudfoundry.multiapps.controller.core.auditlogging;
22

3+
import javax.sql.DataSource;
4+
5+
import jakarta.inject.Inject;
36
import org.cloudfoundry.multiapps.controller.core.auditlogging.impl.AuditLoggingFacadeSLImpl;
47
import org.springframework.context.annotation.Bean;
58
import org.springframework.context.annotation.Configuration;
69

7-
import jakarta.inject.Inject;
8-
import javax.sql.DataSource;
9-
1010
@Configuration
1111
public class AuditLogBean {
1212

@@ -57,4 +57,16 @@ public OperationsApiServiceAuditLog buildOperationsApiServiceAuditLog(AuditLoggi
5757
public MtaConfigurationPurgerAuditLog buildMtaConfigurationPurgerAuditLog(AuditLoggingFacade auditLoggingFacade) {
5858
return new MtaConfigurationPurgerAuditLog(auditLoggingFacade);
5959
}
60+
61+
@Bean
62+
@Inject
63+
public ConfigurationSubscriptionServiceAuditLog buildAConfigurationSubscriptionServiceAuditLog(AuditLoggingFacade auditLoggingFacade) {
64+
return new ConfigurationSubscriptionServiceAuditLog(auditLoggingFacade);
65+
}
66+
67+
@Bean
68+
@Inject
69+
public ConfigurationEntryServiceAuditLog buildAConfigurationEntryServiceAuditLog(AuditLoggingFacade auditLoggingFacade) {
70+
return new ConfigurationEntryServiceAuditLog(auditLoggingFacade);
71+
}
6072
}
Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,20 @@
11
package org.cloudfoundry.multiapps.controller.core.auditlogging;
22

3-
import org.cloudfoundry.multiapps.controller.core.auditlogging.model.ConfigurationChangeActions;
43
import org.cloudfoundry.multiapps.controller.core.auditlogging.model.AuditLogConfiguration;
4+
import org.cloudfoundry.multiapps.controller.core.auditlogging.model.ConfigurationChangeActions;
5+
import org.cloudfoundry.multiapps.mta.model.AuditableConfiguration;
56

67
public interface AuditLoggingFacade {
78

89
void logSecurityIncident(AuditLogConfiguration configuration);
10+
911
void logDataAccessAuditLog(AuditLogConfiguration configuration);
12+
1013
void logConfigurationChangeAuditLog(AuditLogConfiguration configuration, ConfigurationChangeActions configurationAction);
14+
15+
void logConfigurationChangeAuditLog(AuditLogConfiguration configuration,
16+
ConfigurationChangeActions configurationAction,
17+
AuditableConfiguration oldValue,
18+
AuditableConfiguration newValue);
19+
1120
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package org.cloudfoundry.multiapps.controller.core.auditlogging;
2+
3+
import java.text.MessageFormat;
4+
import java.util.HashMap;
5+
import java.util.Map;
6+
import java.util.Objects;
7+
8+
import org.cloudfoundry.multiapps.controller.core.Messages;
9+
import org.cloudfoundry.multiapps.controller.core.auditlogging.model.AuditLogConfiguration;
10+
import org.cloudfoundry.multiapps.controller.core.auditlogging.model.ConfigurationChangeActions;
11+
import org.cloudfoundry.multiapps.controller.persistence.model.ConfigurationEntry;
12+
13+
public class ConfigurationEntryServiceAuditLog {
14+
15+
private static final String PROVIDER_ID_PROPERTY_NAME = "providerId";
16+
private static final String PROVIDER_NID_PROPERTY_NAME = "providerNid";
17+
private static final String PROVIDER_VERSION_PROPERTY_NAME = "providerVersion";
18+
private static final String PROVIDER_NAMESPACE_PROPERTY_NAME = "providerNamespace";
19+
private static final String PROVIDER_TARGET_PROPERTY_NAME = "providerTarget";
20+
private static final String PROVIDER_CONTENT_PROPERTY_NAME = "providerContent";
21+
private static final String PROVIDER_CONTENT_ID_PROPERTY_NAME = "providerContentId";
22+
23+
private static final String PROVIDER_TARGET_TEMPLATE = "{0}/{1}";
24+
25+
private final AuditLoggingFacade auditLoggingFacade;
26+
27+
public ConfigurationEntryServiceAuditLog(AuditLoggingFacade auditLoggingFacade) {
28+
this.auditLoggingFacade = auditLoggingFacade;
29+
}
30+
31+
public void logAddConfigurationEntry(String username, String spaceGuid, ConfigurationEntry entry) {
32+
String performedAction = MessageFormat.format(Messages.ENTRY_CREATE, spaceGuid);
33+
auditLoggingFacade.logConfigurationChangeAuditLog(new AuditLogConfiguration(username,
34+
spaceGuid,
35+
performedAction,
36+
Messages.ENTRY_CREATE_AUDIT_LOG_CONFIG,
37+
buildAddConfigEntryParameters(entry)),
38+
ConfigurationChangeActions.CONFIGURATION_CREATE);
39+
}
40+
41+
public void logUpdateConfigurationEntry(String username, String spaceGuid, ConfigurationEntry oldEntry, ConfigurationEntry newEntry) {
42+
String performedAction = MessageFormat.format(Messages.ENTRY_UPDATE, spaceGuid);
43+
44+
auditLoggingFacade.logConfigurationChangeAuditLog(new AuditLogConfiguration(username,
45+
spaceGuid,
46+
performedAction,
47+
Messages.ENTRY_UPDATE_AUDIT_LOG_CONFIG),
48+
ConfigurationChangeActions.CONFIGURATION_UPDATE, oldEntry, newEntry);
49+
50+
}
51+
52+
private Map<String, String> buildAddConfigEntryParameters(ConfigurationEntry entry) {
53+
Map<String, String> identifiers = new HashMap<>();
54+
String providerTarget = MessageFormat.format(PROVIDER_TARGET_TEMPLATE,
55+
entry.getTargetSpace()
56+
.getOrganizationName(),
57+
entry.getTargetSpace()
58+
.getSpaceName());
59+
60+
identifiers.put(PROVIDER_ID_PROPERTY_NAME, entry.getProviderId());
61+
identifiers.put(PROVIDER_NID_PROPERTY_NAME, entry.getProviderNid());
62+
identifiers.put(PROVIDER_VERSION_PROPERTY_NAME, Objects.toString(entry.getProviderVersion()));
63+
identifiers.put(PROVIDER_NAMESPACE_PROPERTY_NAME, entry.getProviderNamespace());
64+
identifiers.put(PROVIDER_TARGET_PROPERTY_NAME, providerTarget);
65+
identifiers.put(PROVIDER_CONTENT_PROPERTY_NAME, entry.getContent());
66+
identifiers.put(PROVIDER_CONTENT_ID_PROPERTY_NAME, entry.getContentId());
67+
68+
return identifiers;
69+
}
70+
71+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package org.cloudfoundry.multiapps.controller.core.auditlogging;
2+
3+
import java.text.MessageFormat;
4+
import java.util.HashMap;
5+
import java.util.Map;
6+
7+
import org.cloudfoundry.multiapps.controller.core.Messages;
8+
import org.cloudfoundry.multiapps.controller.core.auditlogging.model.AuditLogConfiguration;
9+
import org.cloudfoundry.multiapps.controller.core.auditlogging.model.ConfigurationChangeActions;
10+
import org.cloudfoundry.multiapps.controller.persistence.model.ConfigurationSubscription;
11+
12+
public class ConfigurationSubscriptionServiceAuditLog {
13+
14+
private static final String SUBSCRIPTION_ID_PROPERTY_NAME = "subscriptionId";
15+
private static final String APPLICATION_ID_PROPERTY_NAME = "applicationId";
16+
private static final String MTA_ID_PROPERTY_NAME = "mtaId";
17+
18+
private final AuditLoggingFacade auditLoggingFacade;
19+
20+
public ConfigurationSubscriptionServiceAuditLog(AuditLoggingFacade auditLoggingFacade) {
21+
this.auditLoggingFacade = auditLoggingFacade;
22+
}
23+
24+
public void logAddConfigurationSubscription(String username, String spaceGuid, ConfigurationSubscription subscription) {
25+
String performedAction = MessageFormat.format(Messages.SUBSCRIPTION_CREATE, spaceGuid);
26+
auditLoggingFacade.logConfigurationChangeAuditLog(new AuditLogConfiguration(username,
27+
spaceGuid,
28+
performedAction,
29+
Messages.SUBSCRIPTION_CREATE_AUDIT_LOG_CONFIG,
30+
buildAddConfigSubscriptionParameters(
31+
subscription)),
32+
ConfigurationChangeActions.CONFIGURATION_CREATE);
33+
}
34+
35+
public void logUpdateConfigurationSubscription(String username, String spaceGuid, ConfigurationSubscription oldSubscription,
36+
ConfigurationSubscription updatedSubscription) {
37+
38+
String performedAction = MessageFormat.format(Messages.SUBSCRIPTION_UPDATE, spaceGuid);
39+
40+
auditLoggingFacade.logConfigurationChangeAuditLog(new AuditLogConfiguration(username,
41+
spaceGuid,
42+
performedAction,
43+
Messages.SUBSCRIPTION_UPDATE_AUDIT_LOG_CONFIG),
44+
ConfigurationChangeActions.CONFIGURATION_UPDATE, oldSubscription,
45+
updatedSubscription);
46+
}
47+
48+
private Map<String, String> buildAddConfigSubscriptionParameters(ConfigurationSubscription subscription) {
49+
Map<String, String> identifiers = new HashMap<>();
50+
51+
identifiers.put(APPLICATION_ID_PROPERTY_NAME, subscription.getAppName());
52+
identifiers.put(MTA_ID_PROPERTY_NAME, subscription.getMtaId());
53+
identifiers.put(SUBSCRIPTION_ID_PROPERTY_NAME, String.valueOf(subscription.getId()));
54+
55+
return identifiers;
56+
}
57+
58+
}

multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/auditlogging/impl/AuditLoggingFacadeSLImpl.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package org.cloudfoundry.multiapps.controller.core.auditlogging.impl;
22

3+
import javax.sql.DataSource;
4+
35
import org.apache.logging.log4j.Level;
46
import org.apache.logging.log4j.LogManager;
57
import org.apache.logging.log4j.core.Logger;
@@ -8,8 +10,7 @@
810
import org.cloudfoundry.multiapps.controller.core.auditlogging.UserInfoProvider;
911
import org.cloudfoundry.multiapps.controller.core.auditlogging.model.AuditLogConfiguration;
1012
import org.cloudfoundry.multiapps.controller.core.auditlogging.model.ConfigurationChangeActions;
11-
12-
import javax.sql.DataSource;
13+
import org.cloudfoundry.multiapps.mta.model.AuditableConfiguration;
1314

1415
public class AuditLoggingFacadeSLImpl implements AuditLoggingFacade {
1516

@@ -35,6 +36,14 @@ public void logConfigurationChangeAuditLog(AuditLogConfiguration configuration,
3536
writeMessage(auditLogManager.getConfigLogger(), configuration.getPerformedAction(), Level.WARN);
3637
}
3738

39+
@Override
40+
public void logConfigurationChangeAuditLog(AuditLogConfiguration configuration,
41+
ConfigurationChangeActions configurationAction,
42+
AuditableConfiguration oldValue,
43+
AuditableConfiguration newValue) {
44+
writeMessage(auditLogManager.getConfigLogger(), configuration.getPerformedAction(), Level.WARN);
45+
}
46+
3847
private void writeMessage(Logger logger, String message, Level level) {
3948
Exception loggingException = null;
4049
synchronized (auditLogManager) {

multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/auditlogging/model/AuditLogConfiguration.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33
import java.time.LocalDateTime;
44
import java.util.ArrayList;
55
import java.util.Collections;
6-
import java.util.Date;
7-
import java.util.HashMap;
86
import java.util.List;
97
import java.util.Map;
108

@@ -36,6 +34,10 @@ public AuditLogConfiguration(String userId, String spaceId, String performedActi
3634
this.parameters = parameters;
3735
}
3836

37+
public AuditLogConfiguration(String spaceId, String performedAction, String configuration) {
38+
this(null, spaceId, performedAction, configuration);
39+
}
40+
3941
public String getPerformedAction() {
4042
return performedAction;
4143
}
@@ -59,7 +61,8 @@ public String getUserId() {
5961
}
6062

6163
public String getTimeOfPerformedAction() {
62-
return LocalDateTime.now().toString();
64+
return LocalDateTime.now()
65+
.toString();
6366
}
6467

6568
@Override

multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/liquibase/RecoveringLockService.java

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
package org.cloudfoundry.multiapps.controller.core.liquibase;
22

3-
import static java.text.MessageFormat.format;
4-
5-
import java.util.Date;
6-
import java.util.concurrent.TimeUnit;
7-
3+
import liquibase.exception.LockException;
4+
import liquibase.lockservice.DatabaseChangeLogLock;
5+
import liquibase.lockservice.StandardLockService;
86
import org.cloudfoundry.multiapps.controller.core.Messages;
97
import org.cloudfoundry.multiapps.controller.core.util.ApplicationConfiguration;
108
import org.slf4j.Logger;
119
import org.slf4j.LoggerFactory;
1210

13-
import liquibase.exception.LockException;
14-
import liquibase.lockservice.DatabaseChangeLogLock;
15-
import liquibase.lockservice.StandardLockService;
11+
import java.util.Date;
12+
import java.util.concurrent.TimeUnit;
13+
14+
import static java.text.MessageFormat.format;
1615

1716
public class RecoveringLockService extends StandardLockService {
1817

@@ -22,7 +21,7 @@ public class RecoveringLockService extends StandardLockService {
2221
private final long changeLogLockDuration;
2322

2423
public RecoveringLockService() {
25-
ApplicationConfiguration configuration = new ApplicationConfiguration();
24+
ApplicationConfiguration configuration = new ApplicationConfiguration(null);
2625
this.changeLogLockAttempts = configuration.getChangeLogLockAttempts();
2726
this.changeLogLockDuration = configuration.getChangeLogLockDuration();
2827
setChangeLogLockWaitTime(configuration.getChangeLogLockPollRate());
@@ -31,7 +30,7 @@ public RecoveringLockService() {
3130
@Override
3231
public int getPriority() {
3332
return super.getPriority() + 1; // Liquibase chooses which LockService to use based on its priority. This line makes sure that our
34-
// custom lock service has a higher priority than the standard one (which it extends).
33+
// custom lock service has a higher priority than the standard one (which it extends).
3534
}
3635

3736
@Override

0 commit comments

Comments
 (0)