+
Fail2Ban
+
+ Fail2Ban (Fail2Ban) is a service that can be used to prevent
+ brute force attacks on your server.
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/dokploy/server/api/routers/server.ts b/apps/dokploy/server/api/routers/server.ts
index 725fbbaa..51212fc2 100644
--- a/apps/dokploy/server/api/routers/server.ts
+++ b/apps/dokploy/server/api/routers/server.ts
@@ -26,6 +26,7 @@ import {
getPublicIpWithFallback,
haveActiveServices,
removeDeploymentsByServerId,
+ serverAudit,
serverSecurity,
serverSetup,
serverValidate,
@@ -179,11 +180,36 @@ export const serverRouter = createTRPCRouter({
message: "You are not authorized to validate this server",
});
}
- const response = await serverSecurity(input.serverId);
- return {} as unknown as {
- docker: {
+ const response = await serverAudit(input.serverId);
+ console.log(response);
+ return response as unknown as {
+ ufw: {
+ installed: boolean;
+ active: boolean;
+ defaultIncoming: string;
+ };
+ ssh: {
enabled: boolean;
- version: string;
+ keyAuth: boolean;
+ permitRootLogin: string;
+ passwordAuth: string;
+ usePam: string;
+ };
+ nonRootUser: {
+ hasValidSudoUser: boolean;
+ };
+ unattendedUpgrades: {
+ installed: boolean;
+ active: boolean;
+ updateEnabled: number;
+ upgradeEnabled: number;
+ };
+ fail2ban: {
+ installed: boolean;
+ enabled: boolean;
+ active: boolean;
+ sshEnabled: string;
+ sshMode: string;
};
};
} catch (error) {
diff --git a/packages/server/src/index.ts b/packages/server/src/index.ts
index 8f2b8f76..36028993 100644
--- a/packages/server/src/index.ts
+++ b/packages/server/src/index.ts
@@ -43,6 +43,7 @@ export * from "./setup/server-security";
export * from "./setup/setup";
export * from "./setup/traefik-setup";
export * from "./setup/server-validate";
+export * from "./setup/server-audit";
export * from "./utils/backups/index";
export * from "./utils/backups/mariadb";
diff --git a/packages/server/src/setup/server-audit.ts b/packages/server/src/setup/server-audit.ts
index c3da6887..3bb894d5 100644
--- a/packages/server/src/setup/server-audit.ts
+++ b/packages/server/src/setup/server-audit.ts
@@ -26,18 +26,18 @@ const validateSsh = () => `
`;
const validateNonRootUser = () => `
- sudoUsers=$(grep -Po '^sudo:.*:\\K.*$' /etc/group | tr ',' '\\n' | grep -v root)
- adminUsers=$(grep -Po '^admin:.*:\\K.*$' /etc/group | tr ',' '\\n' | grep -v root)
- privilegedUsers=$(echo -e "${sudoUsers}\\n${adminUsers}" | sort -u | grep -v '^$')
+ sudoUsers=\$(grep -Po '^sudo:.*:\\K.*$' /etc/group | tr ',' '\\n' | grep -v root)
+ adminUsers=\$(grep -Po '^admin:.*:\\K.*$' /etc/group | tr ',' '\\n' | grep -v root)
+ privilegedUsers=\$(echo -e "\${sudoUsers}\\n\${adminUsers}" | sort -u | grep -v '^$')
validUserFound=false
while IFS= read -r user; do
- userShell=$(getent passwd "$user" | cut -d: -f7)
- if [[ "$userShell" != "/usr/sbin/nologin" && "$userShell" != "/bin/false" ]]; then
+ userShell=\$(getent passwd "\$user" | cut -d: -f7)
+ if [[ "\$userShell" != "/usr/sbin/nologin" && "\$userShell" != "/bin/false" ]]; then
validUserFound=true
break
fi
- done <<< "$privilegedUsers"
+ done <<< "\$privilegedUsers"
echo "{\\"hasValidSudoUser\\": $validUserFound}"
`;
diff --git a/packages/server/src/setup/server-security.ts b/packages/server/src/setup/server-security.ts
index 5e4bc499..718efe9a 100644
--- a/packages/server/src/setup/server-security.ts
+++ b/packages/server/src/setup/server-security.ts
@@ -89,6 +89,32 @@ export const serverSecurity = async (serverId: string) => {
fi
}
+ check_dependencies() {
+ echo -e "Checking required dependencies..."
+
+ local required_commands=("curl" "jq" "systemctl" "apt-get")
+ local missing_commands=()
+
+ for cmd in "\${required_commands[@]}"; do
+ if ! command -v "\$cmd" >/dev/null 2>&1; then
+ missing_commands+=("\$cmd")
+ fi
+ done
+
+ if [ \${#missing_commands[@]} -ne 0 ]; then
+ echo -e "\${RED}The following required commands are missing:\${NC}"
+ for cmd in "\${missing_commands[@]}"; do
+ echo " - \$cmd"
+ done
+ echo
+ echo -e "\${YELLOW}Please install these commands before running this script.\${NC}"
+ exit 1
+ fi
+
+ echo -e "All required dependencies are installed\n"
+ return 0
+ }
+
os=$(check_os)