- Registriert
- 11. Juni 2010
- Beiträge
- 4.080
- Reaktionspunkte
- 2.847
- Punkte
- 373
Hallo Zusammen,
da ich immer wieder PNs bzgl. meiner HowTo´s erhalte zu diversen Security Themen, habe ich mich dazu entschlossen eine Security Baseline als HowTo bereitzustellen.
Dieses HowTo soll Richtungsweisend zu dem Ziel führen, dass Ihr eure Homeserver, VPS, Rootserver absichern könnt. Vorallem dann, wenn Apache2 als Webserver zum Einsatz kommt.
Die Baseline umfasst die folgenden Punkte:
+ SSH Basic Security
+ Firewall
+ Schutz vor Missbrauch der Shared Services
+ Apache2 Security
+ DDoS Schutz
+ Rootkits
+ Intrusion Detection
+ Verhindern von IP Spoofing
+ Fail2Ban
++SSH BASIC SECURITY++
Das erste was ich persönlich nach einer Neuinstallation mache, ist es den SSH Port zu ändern.
Das können wir ganz einfach machen in dem wir folgendes tun, nachdem wir uns per SSH eingelogt haben auf dem Server:
Anschließend bei Port einen anderen eintragen. Für dieses HowTo nutzen wir den Port 1337.
Das ist auch in der Firewall Konfiguration zu beachten!
Anschließend könnt Ihr die Datei mit STRG+O speichern und schließen. Nun noch den Dienst neustarten:
Die offene Verbindung bleibt zwar noch aktiv, aber es bietet sich an anschließend per Putty ein e neue Verbindung zum neuen Port 1337 aufzubauen.
++FIREWALL++
Zur Einrichtung sollte mein HowTo genutzt werden. Alle weiteren Infos in meinem besagten HowTo
In diesem Fall handelt es sich um ein erweitertes Script für Zugriff auf Port 80 und 443 für SSL.
++SHARED SERVICES++
Die Shared Services können genutzt werden, um laufende Dienste anzugreifen.
Um das zu verhindern, bearbeiten wir die /etc/fstab:
Anschließend fügen wir folgende Zeile hinzu:
++APACHE2 SECURITY++
Ich möchte mich nicht lang mit Zertifikaten hierbei aufhalten, daher verweise ich auf meine Letsencrypt HowTo´s!
HowTo - Gültige SSL Zertifikate mit Letsencrypt
HowTo - Einsetzen von SSL Zertifikaten mit Apache2
Zuerst deaktivieren wir SSLv3, welches Unsicher ist und Hochriskant!
Suchen diesen Eintrag: SSLProtocol all -SSLv3 und ändern den Eintrag wie folgt:
Anschließend speichern und Apache2 neustarten
Sofern Ihr die Apache Module PHP5 oder PHP7.0 installiert habt, müsst Ihr das php.ini File bearbeiten.
Und diese Zeilen hinzufügen bzw. anpassen
Anschließend
Apache2 neigt wie soviele Applikationen für Linux dazu, heraus zu posaunen was es ist.
Sprich es tauchen DNS Namen und Versionen bei Fehlermeldungen auf. Um dieses zu verhindern, machen wir den Apache2 quasi Taubstumm und Blind nach außen.
Hinzufügen bzw. editieren der folgenden Zeilen:
Jetzt erweitern wir unseren Apache2 Webserver um eine Web Application Firewall, kurz WAF.
Letztendlich unterbindet es SQL Injection, Cross Site Scripting, Trojaner, Falsche User Agents, Hijacking von aktiven Session und viele Exploits.
Das Audit Log findet Ihr hier: /var/log/apache2/modsec_audit.log
Nun muss Modsecurity noch konfiguriert werden:
Diese Zeile suchen: SecRuleEngine DetectionOnly und DetectionOnly auf On abändern, damit die SecRuleEngine aktiv ist.
Anschließend den Eintrag SecResponseBodyAccess suchen und auf Off ändern.
Abschließend den Apache2 neustarten.
Zu guter letzt fehlt noch OWASP, welches ModSecurity um ein Core Rule Set erweitert (CSR) und damit die Fähigkeiten zum verhindern und erkennen von Angriffen erweitert.
Hier müsst Ihr folgendes setzen:
Abschließend Apache2 restarten
++SCHUTZ VOR DDoS++
Es gibt keinen 100%igen Schutz vor einem DDoS, ich spreche da aus Erfahrung.
Aber wir können vorbeugen, indem wir ModEvasive auf unserem Webserver installieren.
Wenn ModEvasive aktiv ist, bekommtz Ihr diese Ausgabe:
Nun müssen wir ModEvasive noch anpassen...
Wir entfernen die # an den folgenden Zeilen:
Anschließend den Apache2 neustarten.
++ROOTKITS++
Man sollte seinen Server regelmäßig nach Rootkits scannen und diese dann auch beseitigen, bevor ein Schaden angerichtet wird.
++INTRUSION DETECTION (IPS)++
PSAD erkennt versuchte und aktive Einbrüche in euer System durch die Überwachung der Logfiles, insbesondere der IPTABLES Rules.
Tragt dort euere Emailadresse ein und aktiviert ENABLE_AUTO_IDS und ENABLE_AUTO_IDS_EMAILS
++VERHINDERN VON IP-SPOOFING++
So verhindert Ihr das versenden von gefälschten IP-Adressen
Hinzufügen bzw. bearbeiten:
++FAIL2BAN / DENYHOSTs++
Mit DenyHosts blockiert Angriffe auf SSH.
Die denyhosts.conf entsprechend eurer Anforderung anpassen:
Fail2Ban überwacht unter anderen die Logs von SSH, Apache, Courier, FTP und einiger mehr.
Es bietet sich hier in jedem Fall an SSH zu überwachen, ggf. auch FTP und Port 80 und 443 für den Apache, falls dort Anmeldungen erforderlich sind.
Ich persönliche nutze den Fail2Ban nur für SSH, da ich SSL Zugriffe sowieso logge.
Hier setzt Ihr die Knast Konfiguration für SSH fest...
Durch hinzufügen von destemail = root@localhost könnt Ihr euch Systemmails zukommen lassen, falls eine Verbindung im Knast gelandet ist. Es sind maximal 3 Versuche möglich!
WICHTIG:
Ihr könnt euch gern eigene Configs für den Jail anlegen, aber nutzt das NIEMALS für OScam.
Nach drei Anmeldungen ist dann Feierabend für die Client Verbindungen!
So...das war mein Wort zum Dienstag, happy absichern!
da ich immer wieder PNs bzgl. meiner HowTo´s erhalte zu diversen Security Themen, habe ich mich dazu entschlossen eine Security Baseline als HowTo bereitzustellen.
Dieses HowTo soll Richtungsweisend zu dem Ziel führen, dass Ihr eure Homeserver, VPS, Rootserver absichern könnt. Vorallem dann, wenn Apache2 als Webserver zum Einsatz kommt.
Die Baseline umfasst die folgenden Punkte:
+ SSH Basic Security
+ Firewall
+ Schutz vor Missbrauch der Shared Services
+ Apache2 Security
+ DDoS Schutz
+ Rootkits
+ Intrusion Detection
+ Verhindern von IP Spoofing
+ Fail2Ban
++SSH BASIC SECURITY++
Das erste was ich persönlich nach einer Neuinstallation mache, ist es den SSH Port zu ändern.
Das können wir ganz einfach machen in dem wir folgendes tun, nachdem wir uns per SSH eingelogt haben auf dem Server:
Code:
sudo nano /etc/ssh/sshd_config
Das ist auch in der Firewall Konfiguration zu beachten!
Anschließend könnt Ihr die Datei mit STRG+O speichern und schließen. Nun noch den Dienst neustarten:
Code:
sudo systemctl reload ssh
oder
service sshd restart
Die offene Verbindung bleibt zwar noch aktiv, aber es bietet sich an anschließend per Putty ein e neue Verbindung zum neuen Port 1337 aufzubauen.
++FIREWALL++
Zur Einrichtung sollte mein HowTo genutzt werden. Alle weiteren Infos in meinem besagten HowTo
In diesem Fall handelt es sich um ein erweitertes Script für Zugriff auf Port 80 und 443 für SSL.
Code:
#!/bin/bash
sleep 5
iptables=`which iptables`
iptablesv6=`which ip6tables`
#User Definition mit Zugriffen auf spezielle Services
user="user.dyndns.org,deinedyn.homedns.com"
# wenn iptables nicht installiert abbrechen
test -f $iptables || exit 0
case "$1" in
start)
echo "Starte Firewall..."
# alle Regeln löschen
$iptables -t nat -F
$iptables -t filter -F
$iptables -X
#$iptablesv6 -t nat -F
$iptablesv6 -t filter -F
$iptablesv6 -X
$iptables -P INPUT DROP
$iptables -P FORWARD DROP
$iptablesv6 -P FORWARD DROP
$iptables -A INPUT -i lo -j ACCEPT
$iptables -A OUTPUT -o lo -j ACCEPT
$iptablesv6 -A INPUT -i lo -j ACCEPT
$iptablesv6 -A OUTPUT -o lo -j ACCEPT
$iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$iptablesv6 -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#$iptablesv6 -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$iptables -P OUTPUT ACCEPT
$iptablesv6 -P OUTPUT ACCEPT
#Wenn euer Server per Ping erreichbar sein soll, dann bitte entsprechend die IP ändern und die # entfernen!
#Standardmäßig ist der Server nicht anpingbar!
#$iptables -A INPUT -p icmp --icmp-type 8 -s 0/0 -d 10.20.30.40 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
#$iptables -A OUTPUT -p icmp --icmp-type 0 -s 10.20.30.40 -d 0/0 -m state --state ESTABLISHED,RELATED -j ACCEPT
#SSH Zugriff
#SSH Zugriff für ALLE Standardmäßig aktiv
$iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -p tcp --dport 1337 -j ACCEPT
#ODER:
#Zugriff haben nur Clients die für spezielle Services in der Variable user hinterlegt sind (Vorher bitte die # vor der nächsten Zeile entfernen und obrigen Zugriff für Alle deaktivieren!)
#$iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED --source $user -p tcp --dport 22 -j ACCEPT
#Apache2 Webserver
$iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -p tcp --dport 80 -j ACCEPT
$iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -p tcp --dport 443 -j ACCEPT
#Oscam Webif Zugriff nicht beschränkt (Port ggf. anpassen!)
$iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -p tcp --dport 8888 -j ACCEPT
#Oscam Webif Zugriff beschränkt (Port ggf. anpassen!)
$iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED --source $user -p tcp --dport 8888 -j ACCEPT
#CS378x Share (Camd3 TCP) (Port ggf. anpassen und zum aktivieren des Zugriffs # entfernen!)
#$iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -p tcp --dport 33399 -j ACCEPT
#CCcam Share (Port ggf. anpassen und zum aktivieren des Zugriffs # entfernen!)
#$iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -p tcp --dport 22444 -j ACCEPT
#CS357x Share (Camd3 UDP) (Port ggf. anpassen und zum aktivieren des Zugriffs # entfernen!)
#$iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -p udp --dport 11002 -j ACCEPT
#Block APNIC LACNIC
#Hinweis: Blockiert Asien, Südamerika, Mittelamerika, beschränkt Russland bzw. Osteuropa!
APNIC=(
"1.0.0.0/8"
"14.0.0.0/8"
"27.0.0.0/8"
"36.0.0.0/8"
"39.0.0.0/8"
"42.0.0.0/8"
"49.0.0.0/8"
"58.0.0.0/8"
"59.0.0.0/8"
"60.0.0.0/8"
"61.0.0.0/8"
"101.0.0.0/8"
"103.0.0.0/8"
"106.0.0.0/8"
"110.0.0.0/8"
"111.0.0.0/8"
"112.0.0.0/8"
"113.0.0.0/8"
"114.0.0.0/8"
"115.0.0.0/8"
"116.0.0.0/8"
"117.0.0.0/8"
"118.0.0.0/8"
"119.0.0.0/8"
"120.0.0.0/8"
"121.0.0.0/8"
"122.0.0.0/8"
"123.0.0.0/8"
"124.0.0.0/8"
"125.0.0.0/8"
"126.0.0.0/8"
"175.0.0.0/8"
"180.0.0.0/8"
"182.0.0.0/8"
"183.0.0.0/8"
"202.0.0.0/8"
"203.0.0.0/8"
"210.0.0.0/8"
"211.0.0.0/8"
"218.0.0.0/8"
"219.0.0.0/8"
"220.0.0.0/8"
"221.0.0.0/8"
"222.0.0.0/8"
"223.0.0.0/8"
"43.0.0.0/8"
"133.0.0.0/8"
"150.0.0.0/8"
"153.0.0.0/8"
"163.0.0.0/8"
"171.0.0.0/8"
"177.0.0.0/8"
"179.0.0.0/8"
"181.0.0.0/8"
"186.0.0.0/8"
"187.0.0.0/8"
"189.0.0.0/8"
"190.0.0.0/8"
"200.0.0.0/8"
"201.0.0.0/8"
)
for blockapnic in ${APNIC[*]}
do
$iptables -A INPUT --source $blockapnic -j DROP
done
#$iptables -N LOGGING
#$iptables -A INPUT -j LOGGING
#$iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped: " --log-level 7
#$iptables -A LOGGING -j DROP
#$iptables -A LOGGING -j REJECT
#$iptables -A INPUT -i eth0 -j REJECT
;;
stop)
echo "Stoppe Firewall..."
$iptables -t nat -F
$iptables -t filter -F
$iptables -X
$iptables -P INPUT ACCEPT
$iptables -P OUTPUT ACCEPT
$iptables -P FORWARD ACCEPT
$iptablesv6 -t nat -F
$iptablesv6 -t filter -F
$iptablesv6 -X
$iptablesv6 -P INPUT ACCEPT
$iptablesv6 -P OUTPUT ACCEPT
$iptablesv6 -P FORWARD ACCEPT
;;
restart|reload|force-reload)
$0 stop
$0 start
;;
*)
echo "Usage: /etc/init.d/firewall (start|stop)"
exit 1
#;;
esac
exit 0
++SHARED SERVICES++
Die Shared Services können genutzt werden, um laufende Dienste anzugreifen.
Um das zu verhindern, bearbeiten wir die /etc/fstab:
Code:
sudo nano /etc/fstab
Anschließend fügen wir folgende Zeile hinzu:
Code:
tmpfs /run/shm tmpfs defaults,noexec,nosuid 0 0
++APACHE2 SECURITY++
Ich möchte mich nicht lang mit Zertifikaten hierbei aufhalten, daher verweise ich auf meine Letsencrypt HowTo´s!
HowTo - Gültige SSL Zertifikate mit Letsencrypt
HowTo - Einsetzen von SSL Zertifikaten mit Apache2
Zuerst deaktivieren wir SSLv3, welches Unsicher ist und Hochriskant!
Code:
sudo nano /etc/apache2/mods-available/ssl.conf
Code:
SSLProtocol all -SSLv2 -SSLv3
Code:
systemctl restart apache2
oder
service apache2 restart
Code:
sudo nano /etc/php5/apache2/php.ini
Code:
disable_functions = exec,system,shell_exec,passthru
register_globals = Off
expose_php = Off
display_errors = Off
track_errors = Off
html_errors = Off
magic_quotes_gpc = Off
mail.add_x_header = Off
session.name = NEWSESSID
Code:
systemctl restart apache2
oder
service apache2 restart
Sprich es tauchen DNS Namen und Versionen bei Fehlermeldungen auf. Um dieses zu verhindern, machen wir den Apache2 quasi Taubstumm und Blind nach außen.
Code:
sudo nano /etc/apache2/conf-available/security.conf
Code:
ServerTokens Prod
ServerSignature Off
TraceEnable Off
Header unset ETag
Header always unset X-Powered-By
FileETag None
Jetzt erweitern wir unseren Apache2 Webserver um eine Web Application Firewall, kurz WAF.
Letztendlich unterbindet es SQL Injection, Cross Site Scripting, Trojaner, Falsche User Agents, Hijacking von aktiven Session und viele Exploits.
Code:
sudo apt-get install libapache2-modsecurity
mv /etc/modsecurity/modsecurity.conf{-recommended,}
systemctl reload apache2
Nun muss Modsecurity noch konfiguriert werden:
Code:
sudo nano /etc/modsecurity/modsecurity.conf
Anschließend den Eintrag SecResponseBodyAccess suchen und auf Off ändern.
Abschließend den Apache2 neustarten.
Zu guter letzt fehlt noch OWASP, welches ModSecurity um ein Core Rule Set erweitert (CSR) und damit die Fähigkeiten zum verhindern und erkennen von Angriffen erweitert.
Code:
sudo rm -rf /usr/share/modsecurity-crs
sudo apt-get install -y git
cd /opt
sudo git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git /usr/share/modsecurity-crs
sudo cp /usr/share/modsecurity-crs/modsecurity_crs_10_setup.conf.example /usr/share/modsecurity-crs/modsecurity_crs_10_setup.conf
cd /usr/share/modsecurity-crs
sudo ln -s ../modsecurity_crs_10_setup.conf activated_rules/modsecurity_crs_10_setup.conf
sudo for f in `ls base_rules`; do sudo ln -s ../base_rules/$f activated_rules/$f; done
cd /etc/modsecurity
sudo cp modsecurity.conf-recommended modsecurity.conf
sudo nano /etc/apache2/mods-available/security2.conf
Code:
<IfModule security2_module>
# Default Debian dir for modsecurity's persistent data
SecDataDir /var/cache/modsecurity
# Include all the *.conf files in /etc/modsecurity.
# Keeping your local configuration in that directory
# will allow for an easy upgrade of THIS file and
# make your life easier
IncludeOptional /etc/modsecurity/*.conf
IncludeOptional /usr/share/modsecurity-crs/activated_rules/*.conf
</IfModule>
++SCHUTZ VOR DDoS++
Es gibt keinen 100%igen Schutz vor einem DDoS, ich spreche da aus Erfahrung.
Aber wir können vorbeugen, indem wir ModEvasive auf unserem Webserver installieren.
Code:
sudo apt-get install libapache2-mod-evasive
sudo apachectl -M | grep evasive
Code:
evasive20_module (shared)
Code:
sudo nano /etc/apache2/mods-enabled/evasive.conf
Code:
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
DOSEmailNotify mail@yourdomain.com
DOSLogDir "/var/log/apache2/"
++ROOTKITS++
Man sollte seinen Server regelmäßig nach Rootkits scannen und diese dann auch beseitigen, bevor ein Schaden angerichtet wird.
Code:
sudo apt-get install rkhunter chkrootkit
sudo chkrootkit
sudo rkhunter --update
sudo rkhunter --propupd
sudo rkhunter --check
++INTRUSION DETECTION (IPS)++
PSAD erkennt versuchte und aktive Einbrüche in euer System durch die Überwachung der Logfiles, insbesondere der IPTABLES Rules.
Code:
sudo apt-get install psad
sudo nano/etc/psad/psad.conf
++VERHINDERN VON IP-SPOOFING++
So verhindert Ihr das versenden von gefälschten IP-Adressen
Code:
sudo nano /etc/host.conf
Code:
order bind,hosts
nospoof on
++FAIL2BAN / DENYHOSTs++
Mit DenyHosts blockiert Angriffe auf SSH.
Code:
sudo apt-get install denyhosts
sudo nano /etc/denyhosts.conf
Code:
ADMIN_EMAIL = root@localhost #Oder halt eure Emailadresse
SMTP_HOST = localhost
SMTP_PORT = 25
#SMTP_USERNAME=foo
#SMTP_PASSWORD=bar
SMTP_FROM = DenyHosts nobody@localhost
#SYSLOG_REPORT=YES
Fail2Ban überwacht unter anderen die Logs von SSH, Apache, Courier, FTP und einiger mehr.
Es bietet sich hier in jedem Fall an SSH zu überwachen, ggf. auch FTP und Port 80 und 443 für den Apache, falls dort Anmeldungen erforderlich sind.
Ich persönliche nutze den Fail2Ban nur für SSH, da ich SSL Zugriffe sowieso logge.
Code:
sudo apt-get install fail2ban
sudo nano /etc/fail2ban/jail.conf
Code:
[sshd]
enabled = true
port = 1337 #oder eben euer Port
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
WICHTIG:
Ihr könnt euch gern eigene Configs für den Jail anlegen, aber nutzt das NIEMALS für OScam.
Nach drei Anmeldungen ist dann Feierabend für die Client Verbindungen!
So...das war mein Wort zum Dienstag, happy absichern!