Skip to content

Commit 37c4b9f

Browse files
authored
Add rate_limit check to auditd container watchdog (#22620)
Add rate_limit check to auditd container watchdog Why I did it Auditd container recently enable rate limit, need watch dock to check this change applied correctly. Work item tracking Microsoft ADO (number only):32313402 How I did it Add rate_limit check to auditd container watchdog How to verify it Pass all test case. New test case added by: sonic-net/sonic-mgmt#18555 Manually verified the feature works, checked 4 cases: running config match with /etc/audit/audit.rules, will return: OK running config mismatch with /etc/audit/audit.rules, will return: FAIL (rate_limit: {} mismatch with config file setting: {}) running config rate limit no set, but rate limit set in /etc/audit/audit.rules, will return: FAIL (rate_limit not set = {}, config file setting: {}) rate limit disabled in /etc/audit/audit.rules, will return: OK
1 parent 95c9a15 commit 37c4b9f

File tree

3 files changed

+100
-3
lines changed

3 files changed

+100
-3
lines changed

dockers/docker-auditd-watchdog/watchdog/Cargo.lock

Lines changed: 47 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dockers/docker-auditd-watchdog/watchdog/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ version = "0.1.0"
44
edition = "2021"
55

66
[dependencies]
7+
regex = "1.11.1"

dockers/docker-auditd-watchdog/watchdog/src/main.rs

Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use std::io::{Read, Write};
22
use std::net::TcpListener;
33
use std::process::Command;
4+
use regex::Regex;
45

56
static NSENTER_CMD: &str = "nsenter --target 1 --pid --mount --uts --ipc --net";
67

@@ -115,6 +116,50 @@ fn check_auditd_reload_status() -> String {
115116
}
116117
}
117118

119+
// Check auditd rate limit
120+
fn check_auditd_rate_limit_status() -> String {
121+
// read auditd rules config file
122+
let cmd = format!(r#"{NSENTER_CMD} cat /etc/audit/rules.d/audit.rules"#);
123+
match run_command(&cmd) {
124+
Ok(file_config) => {
125+
let confix_file_regex = Regex::new(r"-r (?<rate>\d+)").unwrap();
126+
match confix_file_regex.captures(&file_config) {
127+
Some(config_file_caps) => {
128+
let config_file_rate_limit = &config_file_caps["rate"];
129+
130+
let cmd = format!(r#"{NSENTER_CMD} auditctl -s"#);
131+
match run_command(&cmd) {
132+
Ok(running_config) => {
133+
let running_config_regex = Regex::new(r"rate_limit (?<rate>\d+)").unwrap();
134+
match running_config_regex.captures(&running_config) {
135+
Some(running_config_caps) => {
136+
if &running_config_caps["rate"] == config_file_rate_limit {
137+
"OK".to_string()
138+
} else {
139+
format!("FAIL (rate_limit: {} mismatch with config file setting: {})", running_config, config_file_rate_limit)
140+
}
141+
}
142+
None => {
143+
format!("FAIL (rate_limit not set = {}, config file setting: {})", running_config, config_file_rate_limit)
144+
}
145+
}
146+
}
147+
Err(e) => format!("FAIL (error message = {})", e),
148+
}
149+
}
150+
None => {
151+
// rate limit disabled when -r missing in config file
152+
"OK".to_string()
153+
}
154+
}
155+
}
156+
Err(e) => {
157+
// config file missing
158+
format!("FAIL (open config file failed, error message = {})", e)
159+
}
160+
}
161+
}
162+
118163
fn main() {
119164
// Start a HTTP server listening on port 50058
120165
let listener = TcpListener::bind("127.0.0.1:50058")
@@ -137,6 +182,7 @@ fn main() {
137182
let srvc_result = check_auditd_service();
138183
let srvc_active = check_auditd_active();
139184
let reload_result = check_auditd_reload_status();
185+
let rate_limit_result = check_auditd_rate_limit_status();
140186

141187
// Build a JSON object
142188
let json_body = format!(
@@ -146,14 +192,16 @@ fn main() {
146192
"auditd_rules":"{}",
147193
"auditd_service":"{}",
148194
"auditd_active":"{}",
149-
"auditd_reload":"{}"
195+
"auditd_reload":"{}",
196+
"rate_limit":"{}"
150197
}}"#,
151198
conf_result,
152199
syslog_result,
153200
rules_result,
154201
srvc_result,
155202
srvc_active,
156-
reload_result
203+
reload_result,
204+
rate_limit_result
157205
);
158206

159207
// Determine overall status
@@ -163,7 +211,8 @@ fn main() {
163211
&rules_result,
164212
&srvc_result,
165213
&srvc_active,
166-
&reload_result
214+
&reload_result,
215+
&rate_limit_result
167216
];
168217
let all_passed = all_results.iter().all(|r| r.starts_with("OK"));
169218

0 commit comments

Comments
 (0)