Skip to content

Commit 575f19b

Browse files
authored
Merge pull request #494 from lostsnow/feature/logger-remote-config
add logger remote config
2 parents 1c0a51a + 21113c8 commit 575f19b

File tree

8 files changed

+84
-62
lines changed

8 files changed

+84
-62
lines changed

dongtai-agent/src/main/java/io/dongtai/iast/agent/monitor/impl/ConfigMonitor.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import io.dongtai.iast.agent.util.HttpClientUtils;
77
import io.dongtai.iast.agent.util.ThreadUtils;
88
import io.dongtai.iast.common.config.ConfigBuilder;
9+
import io.dongtai.iast.common.config.ConfigKey;
910
import io.dongtai.iast.common.constants.AgentConstant;
1011
import io.dongtai.iast.common.constants.ApiPath;
1112
import io.dongtai.log.DongTaiLog;
@@ -30,11 +31,25 @@ public void check() {
3031

3132
StringBuilder response = HttpClientUtils.sendGet(ApiPath.AGENT_CONFIG, parameters);
3233
ConfigBuilder.getInstance().updateFromRemote(response.toString());
34+
35+
updateConfig();
3336
} catch (Throwable t) {
3437
DongTaiLog.warn(ErrorCode.AGENT_MONITOR_THREAD_CHECK_FAILED, t);
3538
}
3639
}
3740

41+
private void updateConfig() {
42+
Boolean enableLog = ConfigBuilder.getInstance().get(ConfigKey.ENABLE_LOGGER);
43+
if (enableLog != null) {
44+
DongTaiLog.ENABLED = enableLog;
45+
}
46+
47+
String logLevel = ConfigBuilder.getInstance().get(ConfigKey.LOGGER_LEVEL);
48+
if (logLevel != null) {
49+
DongTaiLog.setLevel(DongTaiLog.parseLevel(logLevel));
50+
}
51+
}
52+
3853
@Override
3954
public void run() {
4055
try {

dongtai-common/src/main/java/io/dongtai/iast/common/config/ConfigBuilder.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,15 @@ private ConfigBuilder() {
1515
this.configMap.put(ConfigKey.REPORT_RESPONSE_BODY,
1616
Config.<Boolean>create(ConfigKey.REPORT_RESPONSE_BODY).setDefaultValue(true));
1717
this.configMap.put(ConfigKey.REQUEST_DENY_LIST,
18-
Config.<RequestDenyList>create(ConfigKey.REQUEST_DENY_LIST).setDefaultValue(null));
18+
Config.<RequestDenyList>create(ConfigKey.REQUEST_DENY_LIST));
1919
this.configMap.put(ConfigKey.ENABLE_VERSION_HEADER,
2020
Config.<Boolean>create(ConfigKey.VERSION_HEADER_KEY).setDefaultValue(true));
2121
this.configMap.put(ConfigKey.VERSION_HEADER_KEY,
2222
Config.<String>create(ConfigKey.VERSION_HEADER_KEY).setDefaultValue("DongTai"));
23+
this.configMap.put(ConfigKey.ENABLE_LOGGER,
24+
Config.<Boolean>create(ConfigKey.ENABLE_LOGGER));
25+
this.configMap.put(ConfigKey.LOGGER_LEVEL,
26+
Config.<String>create(ConfigKey.LOGGER_LEVEL));
2327
}
2428

2529
public static ConfigBuilder getInstance() {
@@ -56,9 +60,20 @@ public void update(JSONObject config) {
5660
updateInt(config, ConfigKey.JsonKey.JSON_REPORT_MAX_METHOD_POOL_SIZE);
5761
updateBool(config, ConfigKey.JsonKey.JSON_ENABLE_VERSION_HEADER);
5862
updateString(config, ConfigKey.JsonKey.JSON_VERSION_HEADER_KEY);
63+
updateBool(config, ConfigKey.JsonKey.JSON_ENABLE_LOGGER);
64+
updateString(config, ConfigKey.JsonKey.JSON_LOGGER_LEVEL);
5965
updateRequestDenyList(config);
6066
}
6167

68+
@SuppressWarnings("unchecked")
69+
public <T> T get(ConfigKey key) {
70+
try {
71+
return ((Config<T>) getConfig(key)).get();
72+
} catch (Throwable ignore) {
73+
return null;
74+
}
75+
}
76+
6277
@SuppressWarnings("unchecked")
6378
private void updateBool(JSONObject config, ConfigKey.JsonKey jsonKey) {
6479
try {
@@ -89,7 +104,7 @@ private void updateString(JSONObject config, ConfigKey.JsonKey jsonKey) {
89104
Config<String> conf = (Config<String>) getConfig(jsonKey.getConfigKey());
90105
if (conf != null) {
91106
String value = config.getString(jsonKey.getKey());
92-
if (value != null || !value.isEmpty()) {
107+
if (value != null && !value.isEmpty()) {
93108
conf.setValue(value);
94109
}
95110
}

dongtai-common/src/main/java/io/dongtai/iast/common/config/ConfigKey.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ public enum ConfigKey {
66
REQUEST_DENY_LIST,
77
ENABLE_VERSION_HEADER,
88
VERSION_HEADER_KEY,
9+
ENABLE_LOGGER,
10+
LOGGER_LEVEL,
911
;
1012

1113
public enum JsonKey {
@@ -14,6 +16,8 @@ public enum JsonKey {
1416
JSON_REQUEST_DENY_LIST("blacklist_rules", REQUEST_DENY_LIST),
1517
JSON_ENABLE_VERSION_HEADER("enable_version_header", ENABLE_VERSION_HEADER),
1618
JSON_VERSION_HEADER_KEY("version_header_name", VERSION_HEADER_KEY),
19+
JSON_ENABLE_LOGGER("enable_log", ENABLE_LOGGER),
20+
JSON_LOGGER_LEVEL("log_level", LOGGER_LEVEL),
1721
;
1822

1923
private final String key;

dongtai-common/src/test/java/io/dongtai/iast/common/config/ConfigBuilderTest.java

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,19 @@ public void testGetConfigAndUpdate() {
1313
JSONObject configJson;
1414
String configString;
1515
ConfigBuilder builder = ConfigBuilder.getInstance();
16-
boolean reportResponseBody;
17-
int reportMaxMethodPoolSize;
16+
Boolean reportResponseBody;
17+
Integer reportMaxMethodPoolSize;
18+
String versionHeaderKey;
1819
RequestDenyList requestDenyList;
1920

2021
// default
21-
reportResponseBody = ((Config<Boolean>)builder.getConfig(ConfigKey.REPORT_RESPONSE_BODY)).get();
22+
reportResponseBody = builder.get(ConfigKey.REPORT_RESPONSE_BODY);
2223
Assert.assertTrue("REPORT_RESPONSE_BODY default", reportResponseBody);
23-
reportMaxMethodPoolSize = ((Config<Integer>)builder.getConfig(ConfigKey.REPORT_MAX_METHOD_POOL_SIZE)).get();
24-
Assert.assertEquals("REPORT_MAX_METHOD_POOL_SIZE default", 5000, reportMaxMethodPoolSize);
25-
requestDenyList = ((Config<RequestDenyList>)builder.getConfig(ConfigKey.REQUEST_DENY_LIST)).get();
24+
reportMaxMethodPoolSize = builder.get(ConfigKey.REPORT_MAX_METHOD_POOL_SIZE);
25+
Assert.assertEquals("REPORT_MAX_METHOD_POOL_SIZE default", new Integer(5000), reportMaxMethodPoolSize);
26+
versionHeaderKey = builder.get(ConfigKey.VERSION_HEADER_KEY);
27+
Assert.assertEquals("VERSION_HEADER_KEY default", "DongTai", versionHeaderKey);
28+
requestDenyList = builder.get(ConfigKey.REQUEST_DENY_LIST);
2629
Assert.assertNull("REQUEST_DENY_LIST default", requestDenyList);
2730

2831
// update
@@ -41,11 +44,11 @@ public void testGetConfigAndUpdate() {
4144
RequestDeny.Operator.EXISTS, "key1");
4245
expectRequestDenyList.addRule(Collections.singletonList(headerKeyMatch));
4346

44-
reportResponseBody = ((Config<Boolean>)builder.getConfig(ConfigKey.REPORT_RESPONSE_BODY)).get();
47+
reportResponseBody = builder.get(ConfigKey.REPORT_RESPONSE_BODY);
4548
Assert.assertFalse("REPORT_RESPONSE_BODY updated", reportResponseBody);
46-
reportMaxMethodPoolSize = ((Config<Integer>)builder.getConfig(ConfigKey.REPORT_MAX_METHOD_POOL_SIZE)).get();
47-
Assert.assertEquals("REPORT_MAX_METHOD_POOL_SIZE updated", 1000, reportMaxMethodPoolSize);
48-
requestDenyList = ((Config<RequestDenyList>)builder.getConfig(ConfigKey.REQUEST_DENY_LIST)).get();
49+
reportMaxMethodPoolSize = builder.get(ConfigKey.REPORT_MAX_METHOD_POOL_SIZE);
50+
Assert.assertEquals("REPORT_MAX_METHOD_POOL_SIZE updated", new Integer(1000), reportMaxMethodPoolSize);
51+
requestDenyList = builder.get(ConfigKey.REQUEST_DENY_LIST);
4952
Assert.assertEquals("REQUEST_DENY_LIST updated", expectRequestDenyList, requestDenyList);
5053

5154
// update invalid
@@ -62,11 +65,11 @@ public void testGetConfigAndUpdate() {
6265
configJson = new JSONObject(configString);
6366
builder.update(configJson);
6467

65-
reportResponseBody = ((Config<Boolean>)builder.getConfig(ConfigKey.REPORT_RESPONSE_BODY)).get();
68+
reportResponseBody = builder.get(ConfigKey.REPORT_RESPONSE_BODY);
6669
Assert.assertFalse("REPORT_RESPONSE_BODY not updated", reportResponseBody);
67-
reportMaxMethodPoolSize = ((Config<Integer>)builder.getConfig(ConfigKey.REPORT_MAX_METHOD_POOL_SIZE)).get();
68-
Assert.assertEquals("REPORT_MAX_METHOD_POOL_SIZE not updated", 1000, reportMaxMethodPoolSize);
69-
requestDenyList = ((Config<RequestDenyList>)builder.getConfig(ConfigKey.REQUEST_DENY_LIST)).get();
70+
reportMaxMethodPoolSize = builder.get(ConfigKey.REPORT_MAX_METHOD_POOL_SIZE);
71+
Assert.assertEquals("REPORT_MAX_METHOD_POOL_SIZE not updated", new Integer(1000), reportMaxMethodPoolSize);
72+
requestDenyList = builder.get(ConfigKey.REQUEST_DENY_LIST);
7073
Assert.assertEquals("REQUEST_DENY_LIST not updated", expectRequestDenyList, requestDenyList);
7174

7275
ConfigBuilder.clear();

dongtai-core/src/main/java/io/dongtai/iast/core/handler/hookpoint/SpyDispatcherImpl.java

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
package io.dongtai.iast.core.handler.hookpoint;
22

33
import com.secnium.iast.core.AgentEngine;
4-
import io.dongtai.iast.common.config.*;
4+
import io.dongtai.iast.common.config.ConfigBuilder;
5+
import io.dongtai.iast.common.config.ConfigKey;
56
import io.dongtai.iast.common.scope.Scope;
67
import io.dongtai.iast.common.scope.ScopeManager;
78
import io.dongtai.iast.core.EngineManager;
@@ -668,7 +669,6 @@ public boolean traceDubboInvoke(Object instance, String url, Object invocation,
668669
return false;
669670
}
670671

671-
@SuppressWarnings("unchecked")
672672
private boolean isCollectAllowed(boolean isEnterEntry) {
673673
if (!EngineManager.isEngineRunning()) {
674674
return false;
@@ -683,15 +683,12 @@ private boolean isCollectAllowed(boolean isEnterEntry) {
683683
return false;
684684
}
685685

686-
try {
687-
int methodPoolMaxSize = ((Config<Integer>) ConfigBuilder.getInstance()
688-
.getConfig(ConfigKey.REPORT_MAX_METHOD_POOL_SIZE)).get();
689-
if (methodPoolMaxSize > 0 && EngineManager.TRACK_MAP.get().size() >= methodPoolMaxSize) {
690-
ScopeManager.SCOPE_TRACKER.getPolicyScope().setOverCapacity(true);
691-
DongTaiLog.warn(ErrorCode.SPY_METHOD_POOL_OVER_CAPACITY, methodPoolMaxSize);
692-
return false;
693-
}
694-
} catch (Throwable ignore) {
686+
Integer methodPoolMaxSize = ConfigBuilder.getInstance().get(ConfigKey.REPORT_MAX_METHOD_POOL_SIZE);
687+
if (methodPoolMaxSize != null && methodPoolMaxSize > 0
688+
&& EngineManager.TRACK_MAP.get().size() >= methodPoolMaxSize) {
689+
ScopeManager.SCOPE_TRACKER.getPolicyScope().setOverCapacity(true);
690+
DongTaiLog.warn(ErrorCode.SPY_METHOD_POOL_OVER_CAPACITY, methodPoolMaxSize);
691+
return false;
695692
}
696693
}
697694

dongtai-core/src/main/java/io/dongtai/iast/core/handler/hookpoint/controller/impl/DubboImpl.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.dongtai.iast.core.handler.hookpoint.controller.impl;
22

3-
import io.dongtai.iast.common.config.*;
3+
import io.dongtai.iast.common.config.ConfigBuilder;
4+
import io.dongtai.iast.common.config.ConfigKey;
45
import io.dongtai.iast.core.EngineManager;
56
import io.dongtai.iast.core.handler.context.ContextManager;
67
import io.dongtai.iast.core.handler.hookpoint.models.MethodEvent;
@@ -127,12 +128,10 @@ public static void collectDubboResponse(Object result, byte status) {
127128
if (result == null) {
128129
return;
129130
}
130-
try {
131-
boolean getBody = ((Config<Boolean>) ConfigBuilder.getInstance().getConfig(ConfigKey.REPORT_RESPONSE_BODY)).get();
132-
if (!getBody) {
133-
return;
134-
}
135-
} catch (Throwable ignore) {
131+
132+
Boolean getBody = ConfigBuilder.getInstance().get(ConfigKey.REPORT_RESPONSE_BODY);
133+
// default true
134+
if (getBody != null && !getBody) {
136135
return;
137136
}
138137

dongtai-core/src/main/java/io/dongtai/iast/core/handler/hookpoint/controller/impl/HttpImpl.java

Lines changed: 13 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -55,19 +55,14 @@ public static void solveHttpRequest(Object obj, Object req, Object resp, Map<Str
5555
return;
5656
}
5757

58-
try {
59-
Config<RequestDenyList> config = (Config<RequestDenyList>) ConfigBuilder.getInstance()
60-
.getConfig(ConfigKey.REQUEST_DENY_LIST);
61-
RequestDenyList requestDenyList = config.get();
62-
if (requestDenyList != null) {
63-
String requestURL = ((StringBuffer) requestMeta.get("requestURL")).toString();
64-
Map<String, String> headers = (Map<String, String>) requestMeta.get("headers");
65-
if (requestDenyList.match(requestURL, headers)) {
66-
DongTaiLog.trace("HTTP Request {} deny to collect", requestURL);
67-
return;
68-
}
58+
RequestDenyList requestDenyList = ConfigBuilder.getInstance().get(ConfigKey.REQUEST_DENY_LIST);
59+
if (requestDenyList != null) {
60+
String requestURL = ((StringBuffer) requestMeta.get("requestURL")).toString();
61+
Map<String, String> headers = (Map<String, String>) requestMeta.get("headers");
62+
if (requestDenyList.match(requestURL, headers)) {
63+
DongTaiLog.trace("HTTP Request {} deny to collect", requestURL);
64+
return;
6965
}
70-
} catch (Throwable ignore) {
7166
}
7267

7368
Boolean isReplay = (Boolean) requestMeta.get("replay-request");
@@ -83,17 +78,15 @@ public static void solveHttpRequest(Object obj, Object req, Object resp, Map<Str
8378
}
8479

8580
try {
86-
boolean enableVersionHeader = ((Config<Boolean>) ConfigBuilder.getInstance()
87-
.getConfig(ConfigKey.ENABLE_VERSION_HEADER)).get();
81+
boolean enableVersionHeader = ConfigBuilder.getInstance().get(ConfigKey.ENABLE_VERSION_HEADER);
8882
String dastHeader = ((Map<String, String>) requestMeta.get("headers")).get(HEADER_DAST);
8983
String dastMarkHeader = ((Map<String, String>) requestMeta.get("headers")).get(HEADER_DAST_MARK);
9084
if (enableVersionHeader || dastHeader != null || dastMarkHeader != null) {
9185
Method setHeaderMethod = ReflectUtils.getDeclaredMethodFromSuperClass(resp.getClass(),
9286
"setHeader", new Class[]{String.class, String.class});
9387
if (setHeaderMethod != null) {
9488
if (enableVersionHeader) {
95-
String versionHeaderKey = ((Config<String>) ConfigBuilder.getInstance()
96-
.getConfig(ConfigKey.VERSION_HEADER_KEY)).get();
89+
String versionHeaderKey = ConfigBuilder.getInstance().get(ConfigKey.VERSION_HEADER_KEY);
9790
setHeaderMethod.invoke(resp, versionHeaderKey, AgentConstant.VERSION_VALUE);
9891
}
9992
if (dastMarkHeader != null) {
@@ -234,12 +227,8 @@ public static Map<String, Collection<String>> parseResponseHeaders(Object resp,
234227
}
235228

236229
public static void onServletOutputStreamWrite(String desc, Object stream, int b, byte[] bs, int offset, int len) {
237-
try {
238-
boolean getBody = ((Config<Boolean>) ConfigBuilder.getInstance().getConfig(ConfigKey.REPORT_RESPONSE_BODY)).get();
239-
if (!getBody) {
240-
return;
241-
}
242-
} catch (Throwable ignore) {
230+
Boolean getBody = ConfigBuilder.getInstance().get(ConfigKey.REPORT_RESPONSE_BODY);
231+
if (getBody != null && !getBody) {
243232
return;
244233
}
245234

@@ -280,12 +269,8 @@ public static void onServletOutputStreamWrite(String desc, Object stream, int b,
280269
}
281270

282271
public static void onPrintWriterWrite(String desc, Object writer, int b, String s, char[] cs, int offset, int len) {
283-
try {
284-
boolean getBody = ((Config<Boolean>) ConfigBuilder.getInstance().getConfig(ConfigKey.REPORT_RESPONSE_BODY)).get();
285-
if (!getBody) {
286-
return;
287-
}
288-
} catch (Throwable ignore) {
272+
Boolean getBody = ConfigBuilder.getInstance().get(ConfigKey.REPORT_RESPONSE_BODY);
273+
if (getBody != null && !getBody) {
289274
return;
290275
}
291276

dongtai-log/src/main/java/io/dongtai/log/DongTaiLog.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,10 @@ private String getColorPrefix() {
109109

110110
private static LogLevel getCurrentLevel() {
111111
String logLevel = IastProperties.getLogLevel();
112+
return parseLevel(logLevel);
113+
}
114+
115+
public static LogLevel parseLevel(String logLevel) {
112116
LogLevel lvl;
113117
if ("trace".equalsIgnoreCase(logLevel)) {
114118
lvl = LogLevel.TRACE;

0 commit comments

Comments
 (0)