1use crate::config::Config;
8use crate::distro::{get_package_manager, PackageManager};
9use crate::rollback::RollbackManager;
10use crate::utils::run_command;
11use log::info;
12use std::error::Error;
13
14pub fn implement_security_measures(
31 config: &Config,
32 rollback: &RollbackManager,
33) -> Result<(), Box<dyn Error>> {
34 info!("Implementing security measures...");
35
36 let snapshot = rollback.create_snapshot()?;
37
38 configure_fail2ban()?;
39 setup_advanced_security(config)?;
40 setup_rootkit_detection(config)?;
41 setup_security_scans()?;
42
43 rollback.commit_snapshot(snapshot)?;
44
45 info!("Security measures implemented");
46 Ok(())
47}
48
49pub fn configure_fail2ban() -> Result<(), Box<dyn Error>> {
58 let package_manager = get_package_manager()?;
59 match package_manager {
60 PackageManager::Apt => run_command("apt", &["install", "-y", "fail2ban"])?,
61 PackageManager::Yum => run_command("yum", &["install", "-y", "fail2ban"])?,
62 PackageManager::Dnf => run_command("dnf", &["install", "-y", "fail2ban"])?,
63 }
64
65 let fail2ban_config = r#"
66[sshd]
67enabled = true
68port = ssh
69filter = sshd
70logpath = /var/log/auth.log
71maxretry = 3
72bantime = 3600
73"#;
74 std::fs::write("/etc/fail2ban/jail.local", fail2ban_config)?;
75
76 run_command("systemctl", &["enable", "fail2ban"])?;
77 run_command("systemctl", &["start", "fail2ban"])?;
78
79 Ok(())
80}
81
82pub fn setup_advanced_security(config: &Config) -> Result<(), Box<dyn Error>> {
95 if config.security_level == "advanced" {
96 match config.linux_distro.as_str() {
98 "ubuntu" => {
99 run_command("apt", &["install", "-y", "apparmor", "apparmor-utils"])?;
100 run_command("aa-enforce", &["/etc/apparmor.d/*"])?;
101 }
102 "centos" | "fedora" => {
103 run_command(
104 "yum",
105 &["install", "-y", "selinux-policy", "selinux-policy-targeted"],
106 )?;
107 std::fs::write(
108 "/etc/selinux/config",
109 "SELINUX=enforcing\nSELINUXTYPE=targeted\n",
110 )?;
111 }
112 _ => return Err("Unsupported Linux distribution for advanced security".into()),
113 }
114 }
115 Ok(())
116}
117
118pub fn setup_rootkit_detection(config: &Config) -> Result<(), Box<dyn Error>> {
130 let package_manager = get_package_manager()?;
131 match package_manager {
132 PackageManager::Apt => run_command("apt", &["install", "-y", "rkhunter", "chkrootkit"])?,
133 PackageManager::Yum => run_command("yum", &["install", "-y", "rkhunter", "chkrootkit"])?,
134 PackageManager::Dnf => run_command("dnf", &["install", "-y", "rkhunter", "chkrootkit"])?,
135 }
136
137 run_command("rkhunter", &["--update"])?;
139 run_command("rkhunter", &["--propupd"])?;
140
141 Ok(())
142}
143
144pub fn setup_security_scans() -> Result<(), Box<dyn Error>> {
153 let scan_script = r#"#!/bin/bash
154rkhunter --check --skip-keypress
155chkrootkit
156"#;
157 std::fs::write("/usr/local/bin/security_scan.sh", scan_script)?;
158 run_command("chmod", &["+x", "/usr/local/bin/security_scan.sh"])?;
159
160 let cron_job =
162 "0 2 * * 0 root /usr/local/bin/security_scan.sh > /var/log/security_scan.log 2>&1\n";
163 std::fs::write("/etc/cron.d/security_scan", cron_job)?;
164
165 Ok(())
166}