Heute mal ein Beitrag in twitter-Manier (extra für isnochys):
telnet towel.blinkenlights.nl
Auf der Konsole ausführen und Spaß haben.
Heute mal ein Beitrag in twitter-Manier (extra für isnochys):
telnet towel.blinkenlights.nl
Auf der Konsole ausführen und Spaß haben.
Endlich habe ich eine Lösung für die nervtötenden Firefox-Warnungen über selbstsignierte SSL-Zertifikate gefunden: https://addons.mozilla.org/en-US/firefox/addon/10246. Wer es auch leid ist die Maus 2-17 Mal schubsen zu müssen, bis Firefox einem endlich den Zugriff auf eine Webseite erlaubt, dem lege ich dieses Addon ans Herz.
ACHTUNG: Man sollte es nur benutzen, wenn man weiß, was man tut. Man kann mit diesem Plugin (etwas) einfacher Opfer von Phishing-Attacken oder ähnliche Angriffen werden.
Nachfolgend stelle ich vor, wie man apache2 inkl. php, sowie ruby über fastcgi installiert. php, bzw. ruby über fastcgi einzubinden bietet den Vorteil, dass die Skripts immer mit Benutzerrechten und nicht mit den rechten des Webserver ausgeführt werden. Zudem kann man so für jeden vHost eine eigene php.ini anlegen.
aptitude install apache2 apache2-suexec libapache2-mod-fcgid php5-cgi
Dieser Befehl installiert das apache2- und php5-Grundsystem. Ruby werden wir später installieren, sobald apache und php funktionieren.
Nun aktivieren wir einige apache2-mods:
a2enmod ssl a2enmod rewrite a2enmod suexec a2enmod fcgid /etc/init.d/apache2 force-reload
Nun legen wir noch einen Benutzer an, unter dem Skripts ausgeführt werden, die nicht direkt einem bestimmten Benutzer zugeordnet werden können (wichtig ist, dass dieser Benutzer eine GID>100 hat):
adduser --system --group --no-create-home www-user
Jetzt ist es an der Zeit die vHost-Strukturen unter “/var/www/” anzulegen. Für jeden vHost wird ein eigener Ordner erstellt und enthält mehrere Unterordner:
mkdir /var/www/example.com cd /var/www/example.com/ mkdir conf mkdir docs mkdir logs mkdir tmp cd /var/www/ chmod 755 -R example.com
Als Nächstes legen wir unter “/var/www/example.com/conf” einen Symlink auf “/etc/php5/cgi/php.ini” an:
ln -s /etc/php5/cgi/php.ini /var/www/example.com/conf/php.ini
Das hat den Vorteil, dass alle vHosts standardmäßig die gleiche php.ini benutzen, man diese aber sehr leicht austauschen kann, falls man bestimmte vHost-spezifische Anpassungen vornehmen muss.
Dann legen wir noch einen fcgi-Starter an:
/var/www/example.com/conf/php-fcgi.conf:
#!/bin/sh PHPRC="/var/www/example.com/conf" export PHPRC #PHP_FCGI_CHILDREN=3 #export PHP_FCGI_CHILDREN exec /usr/bin/php5-cgi
chmod 755 /var/www/example.com/conf/php-fcgi.conf
Wenn man nun einen neuen vHost erstellt, muss nur dieser komplette Ordner kopiert werden, die Zeile “PHPRC=”/var/www/example.com/conf” angepasst werden, sowie das immutable-bit für die Datei php-fcgi.conf, bzw. php.ini gesetzt werden.
chattr +i /var/www/<ORDNERNAME>/conf/php-fcgi.conf chattr +i /var/www/<ORDNERNAME>/conf/php.ini
Jetzt muss nur noch eine vHost-Konfiguration für apache angelegt werden. Hierfür legen wir unter “/etc/apache2/sites-available/example.com” ein Template an, welches dann kopiert und angepasst werden kann:
<VirtualHost *:80> SuExecUserGroup {USER} {GROUP} ServerName {SRV_NAME} # ServerAlias {SRV_ALIAS} ServerAdmin {SRV_ADMIN} DocumentRoot {DOC_ROOT} AddHandler fcgid-script .php <Directory {DOC_ROOT}> FCGIWrapper {CONF_ROOT}/php-fcgi.conf .php Options +SymLinksIfOwnerMatch +MultiViews +ExecCGI -Indexes AllowOverride FileInfo Order allow,deny allow from all </Directory> ErrorLog {LOG_ROOT}/error.log CustomLog {LOG_ROOT}/access.log combined LogLevel warn ServerSignature Off </VirtualHost>
Um den vHost zu aktivieren, muss man noch folgenden Befehl absetzen:
a2ensite <VHOST_NAME>
Danach noch die apache-Konfiguration neu einlesen und der vHost ist einsatzbereit.
Quellen:
http://wiki.hetzner.de/index.php/Apache_PHP5_fcgi_und_SuExec
aptitude install php5-gd php5-imagick php5-mcrypt php5-mysql php5-pgsql php5-imap php5-suhosin
gd und imagick sind hierbei Bibliotheken zur Bildmanipulation, mcrypt bietet Verschlüsselungsfunktionen, mysql und pgsql sind für den Datenbankzugriff, imap bietet Funktionen zur Interaktion mit einem IMAP-Server und suhosin ist eine Sicherheitserweiterung für php.
Nun folgt noch die Installation von ruby und ruby on rails – ebenfalls als fastcgi:
aptitude install ruby rdoc irb rubygems libfcgi-ruby1.8 libmysql-ruby libpgsql-ruby rails libopenssl-ruby1.8
Da fastcgi schon konfiguriert ist, funktioniert ruby, bzw. RoR ohne weitere Konfiguration.
Alternativ kann man rails auch über gem, anstatt über aptitude installieren. Dazu führt man diesen Befehl aus:
gem install railsUnd ändert anschließend “/etc/profile” und nimmt “/var/lib/gems/1.8/bin” in $PATH mit auf (vor “export PATH” hinzufügen):
# add rails to path PATH="$PATH:/var/lib/gems/1.8/bin"
Mit diesem Beitrag beginnt nun eine kleine Reihe, wie man verschiedene Serverdienste installiert und konfiguriert. Angefangen wird mit dem Versionskontrollsystem svn (auch unter dem Namen subversion bekannt) und zwei verschiedenen Datenbanksystemen: mysql und postgreSQL.
SVN wird über den Internet-Superserver xinetd betrieben und hört standardmäßig auf Port 3690. Die Repositories samt ihrer Konfigurationsdateien werden später unter “/var/svn” liegen und der Server wird unter dem Benutzer “svn” laufen.
Zunächst installieren wir xinetd und svn:
aptitude install xinetd subversion
Danach erstellen wir den svn-Benutzer:
adduser --system --group --no-create-home svn
Jetzt registrieren wir Port 3690 für svn:
/etc/services:
# Local services svn 3690/tcp # subversion svn 3690/udp # subversion
… erstellen den Ordner “/var/svn”:
mkdir /var/svn/ chown svn: /var/svn/ chmod 755 /var/svn/
… und konfigurieren xinetd, damit er auf Port 3690 Verbindungen für svn entgegennimmt und sie an den svnserve-Server weitergibt:
/etc/xinetd.d/svn
# default: on # description: Subversion server process service svn { disable = no socket_type = stream protocol = tcp user = svn wait = no port = 3690 server = /usr/bin/svnserve server_args = -i -r /var/svn/ }
Nun kann man mit dem telnet-Befehl von einem anderen Rechner aus testen, ob svn auf Port 3690 lauscht:
telnet SERVER_IP 3690Die Ausgabe sollte dann so aussehn:
Trying SERVER_IP... Connected to SERVER_IP. Escape character is '^]'. ( success ( 2 2 ( ) ( edit-pipeline svndiff1 absent-entries commit-revprops depth log-revprops partial-replay ) ) ) Connection closed by foreign host.
Mittels des svnadmin-Tools kann man nun Repositories anlegen, verändern, löschen, …
svnadmin create --fs-type fsfs /var/svn/testRepo
Was man mit svn alles anstellen kann, wird hier sehr ausführlich beschrieben: http://svnbook.red-bean.com/. Dieses Buch ist wohl das Standardwerk, wenn es um svn geht und ein weiterer Stern am O’Reilly-Himmel und das Tollste ist: die Online-Version kostet nicht einmal was.
Man mag von mysql halten, was man will, doch es ist (leider) das Standard-Datenbanksystem für Web-Anwendungen (ein paar Gedanken zu mysql kann man hier finden). Der Vorteil von mysql ist, dass es sehr einfach in der Installation und Handhabung ist, die Nachteile…. naja, findets selbst heraus.
aptitude install mysql-server
Während der Installation wird man nach einem Passwort für den mysql-root Benutzer gefragt. Danach kann man ggf. noch die Konfiguration anpassen (liegt unter “/etc/mysql/my.cnf“). Ein gutes Beispiel für eine mysql-Konfiguration kann man hier finden: http://forum.rootforum.de/viewtopic.php?f=104&t=36343. Eine Anmerkung: wenn man die empfohlene Konfiguration auf rootforum.de benutzt und über phpMyAdmin auf die Datenbank zugreifen will, sollte man die Zeile “skip_show_database” auskommentieren, ansonsten sehen die Benutzer (root ausgenommen) ihre Datenbanken nicht.
Da wir nicht nur eine optimierte Installation, sondern auch eine sichere wollen, führen wir nun noch das “mysql_secure_installation”-Skript aus und beantworten alle Fragen, abgesehen von der über das mysql-root Passwort, mit der Standardantwort.
Quellen:
http://forum.rootforum.de/viewtopic.php?f=104&t=36343
Kommen wir zu einem richtigen Datenbanksystem: postgres. postgres ist ein freies, quelloffenes (open-source auf “Neudeutsch”) Datenbanksystem, welches komplett ANSI-SQL92 konform ist (das kann manch kommerzielles Datenbanksystem nicht einmal von sich behaupten), unterstützt unter anderem ACID-Transaktionen und Stored Procedures und weitere fortgeschrittene Datenbank-Konzepte. Es erfreut sich einer immer größer werdenden Beliebtheit und löst mysql in vielen Gebieten ab. Dennoch will ich hier nicht zu viel Werbung machen. Jeder sollte sich selbst Gedanken über das Datenbanksystem machen, das er einsetzt und warum er es einsetzt. Doch wenn man ein Projekt hochziehen will, bei dem man auf fortschrittliche Datenbank-Konzepte zurückgreift, bleiben im open-source Umfeld nicht viele Lösungen übrig.
Die Installation gestaltet sich ähnlich einfach wie bei mysql:
aptitude install postgresql-8.3
Die Konfiguration gestaltet sich etwas anders als die von mysql. Sie ist im wesentlichen mehr an Oracle angelehnt. Über die Datei “pg_hba.conf” kann man Zugriffsrechte vergeben. Wenn man einen Benutzer anlegt, wird standardmäßig auch eine Datenbank mit dem selben Namen erstellt, autoincrement-Werte werden etwas anders definiert als bei mysql, des Weiteren heißen einige Datentypen geringfügig anders, doch die postgres-Dokumentation hilft hier weiter: http://www.postgresql.org/docs/current/static/.
Beispielhaft hier noch Code, wie man einen Benutzer anlegen kann:
su - postgres createuser -P
Danach wird man nach dem Passwort und der Benutzerrolle gefragt und man kann mit folgendem Code auf die postgres-Konsole zugreifen:
psql -W <Tabellenname>
In einem weiteren Teil gehe ich dann darauf ein, wie man phpMyAdmin und phpPgAdmin einrichtet.
Wenn man einen Server betreibt, dann legt man normalerweise auch Wert auf Sicherheit (wenn nicht, dann diesen Abschnitt einfach überspringen). Hier zeige ich einige Mittel und Wege auf einen Server sicherer zu machen. Die Liste ist sicherlich nicht komplett und wird es wohl auch nie werden und selbst wenn ihr alles unternehmt, was ich hier aufführe, kann euer System immer noch gehackt werden – totale Sicherheit gibt es nicht – also schiebt die Schuld nicht auf mich, wenn euer System gehackt wurde. Und vor allem: installiert euer System komplett neu, wenn ihr gehackt wurdet!
Das /tmp-Verzeichnis ist oft ein Einfalltor für Angreifer, deshalb werden wir dieses nun absichern. Zusätzlich wollen wir auch die Verzeichnisse /var und /home besser schützen, … sowie / bei Fehlern read-only mounten:
/etc/fstab:
proc /proc proc defaults 0 0 none /dev/pts devpts gid=5,mode=620 0 0 /dev/md0 /boot ext2 defaults 0 0 # /dev/md1 belongs to LVM volume group 'vg0' /dev/vg0/root / ext3 defaults,errors=remount-ro 0 1 /dev/vg0/swap swap swap defaults 0 0 /dev/vg0/tmp /tmp ext3 rw,noexec,nosuid,nodev 0 0 /dev/vg0/home /home ext3 rw,nosuid,nodev 0 2 /dev/vg0/var /var ext3 rw,nosuid,nodev 0 2
Quelle: http://www.cromwell-intl.com/security/linux-hardening.html
Voraussetzung dafür diesen Abschnitt zu implementieren ist, dass es neben root noch mindestens einen anderen Benutzer gibt, denn im folgenden wird root das direkte Anmelden über ssh verboten. Dies erschwert es einem Angreifer root-Rechte zu erlangen, da er erst das Passwort eines Benutzers knacken muss und dann zusätzlich noch das root-Passwort (oder aber er macht es sich einfach und benutzt einfach einen Exploit um sich root-Rechte zu verschaffen). Zudem kann man so immer über “/var/log/auth.log” herausfinden, wer sich als root angemeldet hat.
Als erstes erstellen wir eine Gruppe “sshusers”. Nur Benutzer, die dieser Gruppe angehören, dürfen sich auch am ssh-Server anmelden:
addgroup --system sshusersDanach fügen wir unseren nicht-root Benutzer dieser Gruppe hinzu:
adduser <Benutzername> sshusers
Nun meine sshd_config:
# Package generated configuration file # See the sshd(8) manpage for details # What ports, IPs and protocols we listen for Port 22 # Use these options to restrict which interfaces/protocols sshd will bind to #ListenAddress :: #ListenAddress 0.0.0.0 ListenAddress 78.46.92.6 Protocol 2 # HostKeys for protocol version 2 HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_dsa_key #Privilege Separation is turned on for security UsePrivilegeSeparation yes # Lifetime and size of ephemeral version 1 server key KeyRegenerationInterval 3600 ServerKeyBits 768 # Logging SyslogFacility AUTH LogLevel VERBOSE # Authentication: LoginGraceTime 30 AllowGroups sshusers PermitRootLogin no StrictModes yes RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile %h/.ssh/authorized_keys # Don't read the user's ~/.rhosts and ~/.shosts files IgnoreRhosts yes # For this to work you will also need host keys in /etc/ssh_known_hosts RhostsRSAAuthentication no # similar for protocol version 2 HostbasedAuthentication no # Uncomment if you don't trust ~/.ssh/known_hosts for RhostsRSAAuthentication #IgnoreUserKnownHosts yes # To enable empty passwords, change to yes (NOT RECOMMENDED) PermitEmptyPasswords no # Change to yes to enable challenge-response passwords (beware issues with # some PAM modules and threads) ChallengeResponseAuthentication no # Change to no to disable tunnelled clear text passwords #PasswordAuthentication yes # Kerberos options #KerberosAuthentication no #KerberosGetAFSToken no #KerberosOrLocalPasswd yes #KerberosTicketCleanup yes # GSSAPI options #GSSAPIAuthentication no #GSSAPICleanupCredentials yes X11Forwarding no X11DisplayOffset 10 PrintMotd no PrintLastLog yes TCPKeepAlive yes #UseLogin no #MaxStartups 10:30:60 Banner /etc/issue.net # Allow client to pass locale environment variables AcceptEnv LANG LC_* Subsystem sftp /usr/lib/openssh/sftp-server UsePAM yes
Wer auf “security by obscurity” steht, kann auch noch den ssh-Port auf einen nicht Standardport verlegen. Im Grunde genommen bringt es nichts – außer vielleicht Verstimmungen bei den Benutzern, da die Benutzerfreundlichkeit stark leidet und die Tipparbeit steigt – da jeder Portscan, z.b. mit nmap, den ssh-Port preisgibt. Natürlich kann man auf der anderen Seite auch argumentieren, dass primitive DoS-Skripts nur den Standardport ausprobieren und das Umlegen des ssh-Ports doch einen gewissen Schutz bietet.
Zusätzlich kann man noch fail2ban installieren, um sich vor DoS-Attacken über ssh (und auch über viele andere Dienste) zu schützen. Dies wird in einem späteren Abschnitt behandelt und stellt meiner Meinung nach die bessere Alternative zu einem nicht-Standardport dar.
Quellen:
http://root-support.com/blog/?p=183
http://aymanh.com/tips-to-secure-linux-workstation
http://www.pro-linux.de/work/rootserver/teil2.html
Eine forkbomb ist ein DoS-Angriff, bei dem sehr viele Prozesse gestartet werden. So viele, dass der komplette Arbeitsspeicher vollgeschrieben wird und das System somit unbenutzbar wird. Ein Beispiel für eine forkbomb wäre (ACHTUNG: Nicht auf einem Produktivsystem ausführen!):
:(){ :|:& };:
Um diese Art eines Angriffs (zumindest teilweise) zu verhindern, ändern wir die Datei “/etc/security/limits.conf” dahingehend ab, dass jeder Nutzer der Gruppe “users” (in denen all unsere Konsolennutzer Mitglied sind) maximal 150 Prozesse starten darf:
/etc/security/limits.conf:
@users soft nproc 100 @users hard nproc 150
Quelle:
http://wiki.craz1.homelinux.com/index.php/Linux:Security:Forkbomb
http://aymanh.com/tips-to-secure-linux-workstation
Dieses Tool dient dem Aufspüren von rootkits. Es hat eine Datenbank mit Signaturen, welche wöchentlich aktualisiert wird und überprüfen täglich über einen cronjob, ob das System potentiell infiziert ist. Wird eine Infizierung/Gefahr festgestellt, verschickt rkhunter eine E-Mail.
Neben rkhunter gibts es auch noch chkrootkit, falls jemand will kann er zusätzlich auch noch dieses Tool installieren.
aptitude install rkhunter chkrootkit
Editieren der Datei “/etc/rkhunter.conf” (hier werden nur die Zeilen angezeigt, die geändert wurden):
DISABLE_TESTS="suspscan deleted_files packet_cap_apps" ALLOWHIDDENDIR=/etc/.java
/etc/default/rkhunter: (auch nur geänderte Zeilen):
DB_UPDATE_EMAIL="yes"
Diese Einstellungen nehmen einen erweiterten Test für versteckte Prozesse zu den Standardtests auf und nehmen das Verzeichnis “/etc/.java” auf die Whitelist mit auf, damit rkhunter sich nicht bei jedem Scan beschwert, dass er eine verdächtige Datei gefunden hat, nur weil Java installiert ist. Darüber hinaus bekommt man wöchentlich eine E-Mail über die Ergebnisse des Datenbank-Updates.
Bastille ist ein Tool, welches das Härten eines Systems drastisch vereinfacht. Bastille führt den Nutzer über eine Textberfläche durch verschiedene Fragen und anhand der Antworten des Benutzers wird das System am Schluss verändert. Das Besondere dabei ist, dass bastille alle Aktionen genau und ausführlich erklärt und man die Aktionen auch selbst ausführen kann, anstatt bastille die Ausführung zu überlassen. Bastille wird aktiv von vielen großen Firmen entwickelt und sollte eigentlich zu den Standardwerkzeugen eines jeden verantwortungsbewussten Linux-Administrators gehören, da es viel Arbeit abnimmt und auf Dinge aufmerksam macht, die man sonst evtl. übersieht.
aptitude install bastille
Da das bastille Paket in lenny von Haus aus nicht kompatibel mit lenny ist, muss die Konfigurationsdateien von bastille ändern werden, um bastille vorzugaukeln, dass es kompatibel mit lenny wäre (siehe hier und hier):
/usr/lib/Bastille/API.pm:
sub get_supported_OS_list () { my @list = ( "DB2.2", "DB3.0", "DB3.1", "DB4.0", "DB5.0",
/usr/lib/Bastille/IOLoader.pm:
my $supported_versions = 'DB2.2 DB3.0 DB3.1 DB4.0 DB5.0';
Die Fragen von bastille nach bestem Wissen und Gewissen beantworten und das System so seinen Wünschen nach anpassen.
Bastille legt ein ausführliches Log über die Änderungen an und bietet die Möglichkeit die vorgenommenen Änderungen später wieder rückgängig zu machen.
Quelle:
http://linux.com/feature/118353
In diesem Abschnitt geht es darum, die Shells von Systembenutzern auf “/bin/false” bzw. “/bin/nologin” umzustellen, denn die meisten Serverdienste brauchen keinen Konsolenzugriff und stellen in der Standardeinstellung eine gewisse Sicherheitsgefahr dar. Welche Diensten ohne Konsole zurechtkommen, muss man recherchieren oder ausprobieren. Nachdem man einen neuen Serverdienst installiert hat, bietet es sich an diese Datei erneut zu überprüfen und die Konsole der Benutzer ggf. zu ändern.
Beispielhaft zwei Zeilen, wie soetwas aussehen könnte:
man:x:6:12:man:/var/cache/man:/bin/false mail:x:8:8:mail:/var/mail:/bin/false
Fail2ban ist eine effektive Waffe gegen DoS-Angriffe jedweder Art – und nicht nur das: man kann auch gescheiterte Authentifizierungsversuche über PAM oder Overflow-Angriffe auf Apache eindämmen. Es bringt schon viele vordefinierte Filter (jails), z.B. für ssh und apache, mit und lässt sich zusätzlich über selbstgeschriebene jails erweitern. Es ist über die Datei “/etc/fail2ban/jail.local” anpassbar. Man sollte die Datei “/etc/fail2ban/jail.conf” nicht selbst verändern. Das stellt sicher, dass bei einem Update auch immer die neuesten Regeln und Anpassungen verwendet werden. Über jail.local lässt sich jede Einstellung in jail.conf überschreiben. Bitte genau abwägen, welche jails man aktiviert und welche nicht (falls postfix nicht auf dem Server nicht installiert ist, ist es unsinnig den jail dafür zu aktivieren).
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
/etc/fail2ban/jail.local:
# Fail2Ban jail.local file [DEFAULT] ignoreip = 127.0.0.1 bantime = 600 maxretry = 3 backend = polling destemail = root # # ACTIONS # banaction = iptables-multiport mta = sendmail protocol = tcp action = %(action_mwl)s # # JAILS # [ssh] enabled = true port = ssh filter = sshd logpath = /var/log/auth.log [ssh-ddos] enabled = true port = ssh filter = sshd-ddos logpath = /var/log/auth.log [pam-generic] enabled = true filter = pam-generic port = all banaction = iptables-allports port = anyport logpath = /var/log/auth.log [xinetd-fail] enabled = false filter = xinetd-fail port = all banaction = iptables-multiport-log logpath = /var/log/daemon.log maxretry = 2 # # HTTP servers # [apache] enabled = true port = http,https filter = apache-auth logpath = /var/log/apache*/*error.log [apache-noscript] enabled = true port = http,https filter = apache-noscript logpath = /var/log/apache*/*error.log [apache-overflows] enabled = true port = http,https filter = apache-overflows logpath = /var/log/apache*/*error.log maxretry = 2 # # Mail servers # [postfix] enabled = true port = smtp,ssmtp filter = postfix logpath = /var/log/mail.log [sasl] enabled = true port = smtp,ssmtp,imap2,imap3,imaps,pop3,pop3s filter = sasl logpath = /var/log/mail.log
Quellen:
http://debianclusters.cs.uni.edu/index.php/Fail2Ban:_Preventing_Brute_Force_SSH
http://debaday.debian.net/2007/04/29/fail2ban-an-enemy-of-script-kiddies/
IDS-Systeme wie tripwire, aide oder fcheck helfen Manipulationen an Dateien festzustellen. Um das bewerkstelligen zu können, wird anfänglich eine Datenbank erstellt mit Hash-Werten der zu überwachenden Ordner und dann werden die Werte regelmäßig überprüft. Stimmen die Hash-Werte nicht mehr überein, wird man per E-Mail benachrichtigt. Der große Nachteil ist natürlich, dass man die Datenbank immer aktuell halten muss und z.B. nach jeden “aptitude update/install/purge/…” ist dies der Fall. Die große Frage ist: Zu welchem Zeitpunkt es interessant ist ein IDS aufzusetzen. Wenn man einen Server ganz neu hat, ändern sich fast täglich Konfigurationsdateien oder es werden neue Pakete installiert, zu einem späteren Zeitpunkt läuft man Gefahr, dass ein Angreifer schon Programme/Konfigurationsdateien ausgetauscht hat und dann ist das IDS bereits nutzlos.
Dieser Abschnitt wird zu einem späteren Zeitpunkt mit Inhalt gefüllt.
Früher oder später sollte man sich darüber Gedanken machen, ob man eine Firewall/Paketfilter einsetzen will oder nicht, bzw. ob es überhaupt Sinn macht.
Diese Sektion wird zu einem späteren Zeitpunk um Vorschläge für eine kleine Firewall-Konfiguration, bzw. über den Aufbau von iptables-Regeln erweitert.
Um von außen zu überprüfen, ob der Server sicher ist, kann man Tools wie nmap oder nessus einsetzen. nmap dient dabei dazu offene Ports aufzuspüren, damit man diese ggf. schließen kann. nessus hingegen überprüft, ob der Server anfällig für bestimmte Exploits ist, z.B. anhand der Versionsnummer eines Dienstes. Um es allgemeiner auszudrücken: nessus ist ein Vulnerability (Schwachstellen)-Scanner.
nmap -A -T4 <Serveradresse>
Die Bedienung von nessus ist etwas umfangreicher und an dieser Stelle sei deshalb auf google verwiesen und es wird zum Ausprobieren ermuntert.
Des Weiteren sollte man einen Blick auf netstat werfen. Mit diesem Tool kann man lokal auf dem Server herausfinden, welche Ports geöffnet sind und welcher Dienst sich hinter welchem Port versteckt.
Beispielhafter Aufruf:
netstat -tulpen
Dies sind nur einige grundlegende Schritte, die man unternehmen kann, um einen Server abzusichern. Die Liste ist keineswegs vollständig und erhebt auch nicht den Anspruch darauf. Falls jemand weitere Wege kennt, einen Server abzusichern, dann bitte ich um einen Kommentar, bzw. um eine E-Mail und ich werde dieses Howto erweitern.
Empfehlenswert ist natürlich auch das Eintragen in Mailinglisten zum Thema Sicherheit und sich allgemein über sicherheitsrelevante Themen auf dem Laufenden zu halten. Ein weiterer Schritt, um Schwachstellen zu vermeiden ist es, das System immer aktuell zu halten. Das Paketmanagement macht es einem unter Linux sehr einfach und deshalb empfehle ich es aktiv zu nutzen, anstatt Programme selbst zu kompilieren. Normalerweise ist jedes Programm, das man auf einem Server brauchen könnte in den Debian-Repositories enthalten (dass man auf einem Server nur mit den stable-Repositories arbeiten sollte und von testing tunlichst die Finger lassen sollte, brauche ich hier wohl kaum zu erwähnen).
Abschließend bleibt nur noch einmal zu wiederholen, dass es keine absolute Sicherheit gibt und dass man einen guten Kompromiss zwischen Sicherheit und Freiheit (der Nutzer) finden sollte (Hallo, Herr Innenminister).
Seit ca. November letzten Jahres war klar, dass ein neuer Server her muss – nicht zuletzt, weil einige Leute bei ibutho ausgestiegen sind und ibutho doch etwas zu schwach ist für unsere Ansprüche. Die Planungen liefen auch schon seit Ende letzten Jahres und nun haben sie alle Gestalt angenommen. Die Domains werden alle zentral über inwx.de verwaltet. Dies hat den Vorteil, dass wir unabhängig vom Provider des Root-Servers sind und später ohne Probleme wechseln können. Beim Server haben wir uns für einen DS3000 von Hetzner entschieden. Dieser sagte uns sowohl von den Hardware-Daten als auch vom Preis-/Leistungsverhältnis zu (AMD Athlon 64 X2 5600+, 2GB RAM, 2 x 400GB Festplatte, 100MBit Anbindung ans Internet, 7 IP-Adressen, unbegrenzter Traffic).
Im Weiteren will ich auf die Grundinstallation eingehen und in den folgenden Teilen auf die beispielhafte Installation und Konfiguration verschiedenster Server-Dienste. Ich hoffe, dass diese Beiträge für den ein oder anderen nützlich sind, wenn sie ihren eigenen Server konfigurieren und absichern wollen. Ich bitte um rege Diskussionen, damit die Beiträge sinnvoll erweitert und Fehler beseitigt werden können.
Hetzner vereinfacht dem Administrator die Installation eines eigenen Betriebssystems über das Rescue-System sehr. Es wir ein Skript installimage angeboten, über welches man z.B. die Festplatte partitionieren kann, ein LVM einrichten kann oder einen Software-RAID konfigurieren kann.
Bei meiner Installation entschied ich mich für ein RAID1-System mit LVM. Für RAID1 entschied ich mich aufgrund der gesteigerten Ausfallsicherheit und der gesteigerten Lese-Performance. Für LVM entschied ich mich, da dies mehr Flexibilität mit sich bringt als ein starres Partitionsschema. Sollte man später bemerken, dass eine Volume zu groß oder zu klein ist, kann man es einfach verkleinern/vergrößern. Versierte Leser mögen sich hier fragen, warum ich nicht komplett auf ein LVM-Setup setze und dem LVM auch das Mirroring überlasse. Der Grund ist einfach: über ein Software-RAID erhalte ich höhere Leseraten (siehe auch: http://www.joshbryan.com/blog/2008/01/02/lvm2-mirrors-vs-md-raid-1/, insbesondere auch die Kommentare). Beim Dateisystem setze ich auf ext3 bzw. ext2 für “/boot”, da sich ext3 im LVM problemlos im laufenden Betrieb vergrößern bzw. verkleinern lässt.
Hier mein Partitionslayout:
| Mountpunkt | Dateisystem | Größe | |
| /boot | ext2 | 256M | |
| vg0 | lvm | all | |
| swap | swap | 2G | |
| / | ext3 | 5G | |
| /home | ext3 | 15G | |
| /tmp | ext3 | 4G | |
| /var | ext3 | 50G | |
Sowohl “/boot”, als auch “vg0″ sind jeweils eine RAID1-Partition. Die ganze Arbeit das RAID einzurichten und danach das LVM hat mir das hetzner-Skript abgenommen.
Hetzner stellt einen eigenen aptitude-/apt-Mirror und diesen werden wir als allererstes ändern. Die Vorteile liegen auf der Hand: hohe Übertragungsraten und es handelt sich um internen Traffic, wird als nicht berechnet.
/etc/apt/sources.list:
# Packages and Security Updates from the Hetzner Debian Mirror deb ftp://mirror.hetzner.de/debian/packages lenny main contrib non-free deb ftp://mirror.hetzner.de/debian/security lenny/updates main contrib non-free
Und nun ein erstes Update&Upgrade:
aptitude update && aptitude dist-upgrade
Da postfix der Mailserver meiner Wahl ist und ich nicht will, dass irgend ein Programm exim oder ähnliches installiert, werden wir jetzt gleich postfix installieren, jedoch noch nicht konfigurieren. Die Konfiguration folgt ausführlich in einem weiteren Teil.
aptitude install postfix
apticron ist ein Tool, welches einen per Mail informiert, wenn es Updates gibt. Dies ist besonders hilfreich, da das Tool die Paketquellen im Hintergrund updated, aber die Updates nicht einspielt; so bleibt es dem Administrator immer selbst überlassen, welche Pakete er einspielt und welche nicht, bzw. welche er erst ausführlicher testen will, da die Funktionalität des Systems evtl. erheblich beeinträchtigt werden könnte.
aptitude install apticron
Mit mdadm wurde bereits das Software-RAID erstellt. Doch mdadm kann mehr: es kann den Benutzer auch per E-Mail informieren, wenn es Probleme mit dem RAID gibt. Dies wollen wir hier einstellen:
dpkg-reconfigure mdadm
Mit den smartmontools kann man den Status des Festplatten abfragen und bekommt E-Mails, wenn die Festplatte kurz vor ihrem Lebensende ist.
aptitude install smartmontools
/etc/default/smartmontools:
# uncomment to start smartd on system startup start_smartd=yes # uncomment to pass additional options to smartd on startup smartd_opts="--interval=1800"
/etc/smartd.conf:
DEVICESCAN -m root -M exec /usr/share/smartmontools/smartd-runner
htop ist eine erweiterte Version von top und bietet eine ncurses-Oberfläche, sowie Farben und “grafische” Anzeigen.
aptitude install htop
lsof kann anzeigen, wer gerade auf einen Ordner/Gerät zugreift. Das Tool kann nützlich sein, wenn man einen Ordner unmounten will, aber noch jemand/etwas darauf zugreift.
aptitude install lsof
Wer DOS noch kennt, kennt auch den Norton Commander. mc (ausgeschrieben: midnight commander) ist ein Norton Commander-Klon und vereinfacht einem das Leben in vielen Situationen. Einfach mal ausprobieren:
aptitude install mc
Mit locate kann man schnell nach Dateien suchen. Es baut einen Index über Dateien und Ordner des Dateisystems auf und aktualisiert diesen mittels eines Cronjobs regelmäßig. Sucht man eine Datei, so gibt man einfach folgendes ein:
locate <Dateiname>
Das Paket kann mit folgendem Befehl installiert werden:
aptitude install locate
Nach der Installation sollte als Erstes der Index aufgebaut werden (dies wird später automatisch gemacht):
updatedbMeine Anforderung an die Home-Laufwerke der einzelnen Benutzer ist, dass sie nicht von jedem gelesen werden können, aber dass man trotzdem Ordner/Dateien unterhalb des eigenen Home-Laufwerks für andere zugänglich machen kann, um z.B. einen “Briefkasten” zu implementieren, wo andere Benutzer Dateien für einen ablegen können, aber nicht sehen können, was sich sonst noch darin befindet. Deshalb wird mit folgenden Befehl die Sichtbarkeit der Home-Verzeichnisse geändert:
dpkg-reconfigure adduser
Außerdem hätte ich gerne, dass jeder Benutzer standardmäßig in der Gruppe “users” ist (man weiß ja nie, wozu das noch gut sein könnte). Dazu fügen wir an die Datei “/etc/default/useradd” am Ende folgendes an – bzw. an die Datei “/etc/adduser.conf” (je nachdem, ob man adduser oder useradd zum Hinzufügen von Benutzern verwendet):
/etc/default/useradd:
GROUPS=users
/etc/adduser.conf:
EXTRA_GROUPS="users" ADD_EXTRA_GROUPS=1
Die “Briefkasten”-Erweiterung:
cd /etc/skel/ mkdir public chmod 755 public/ mkdir public/dropbox chmod 753 public/dropbox/ chown root: public/ -R
Nun legen wir noch eigene Versionen der Dateien .vimrc, .bashrc, .bash_aliases in “/etc/skel/“:
.vimrc:
sy on se nu set incsearch set hlsearch colorscheme slate
.bashrc:
# ~/.bashrc: executed by bash(1) for non-login shells. # see /usr/share/doc/bash/examples/startup-files (in the package bash-doc) # for examples export PS1='\h:\w\$ ' umask 022 # If not running interactively, don't do anything [ -z "$PS1" ] && return # don't put duplicate lines in the history. See bash(1) for more options # don't overwrite GNU Midnight Commander's setting of `ignorespace'. export HISTCONTROL=$HISTCONTROL${HISTCONTROL+,}ignoredups # ... or force ignoredups and ignorespace export HISTCONTROL=ignoreboth # append to the history file, don't overwrite it shopt -s histappend # for setting history length see HISTSIZE and HISTFILESIZE in bash(1) # check the window size after each command and, if necessary, # update the values of LINES and COLUMNS. shopt -s checkwinsize # make less more friendly for non-text input files, see lesspipe(1) #[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)" # set variable identifying the chroot you work in (used in the prompt below) if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then debian_chroot=$(cat /etc/debian_chroot) fi # set a fancy prompt (non-color, unless we know we "want" color) case "$TERM" in xterm-color) color_prompt=yes;; esac # uncomment for a colored prompt, if the terminal has the capability; turned # off by default to not distract the user: the focus in a terminal window # should be on the output of commands, not on the prompt #force_color_prompt=yes if [ -n "$force_color_prompt" ]; then if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then # We have color support; assume it's compliant with Ecma-48 # (ISO/IEC-6429). (Lack of such support is extremely rare, and such # a case would tend to support setf rather than setaf.) color_prompt=yes else color_prompt= fi fi if [ "$color_prompt" = yes ]; then PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' else PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ ' fi unset color_prompt force_color_prompt # If this is an xterm set the title to user@host:dir case "$TERM" in xterm*|rxvt*) PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1" ;; *) ;; esac # Alias definitions. # You may want to put all your additions into a separate file like # ~/.bash_aliases, instead of adding them here directly. # See /usr/share/doc/bash-doc/examples in the bash-doc package. if [ -f ~/.bash_aliases ]; then . ~/.bash_aliases fi # enable color support of ls and also add handy aliases if [ -x /usr/bin/dircolors ]; then eval "`dircolors -b`" alias ls='ls --color=auto' #alias dir='dir --color=auto' #alias vdir='vdir --color=auto' #alias grep='grep --color=auto' #alias fgrep='fgrep --color=auto' #alias egrep='egrep --color=auto' fi # some more ls aliases #alias ll='ls -l' #alias la='ls -A' #alias l='ls -CF' # enable programmable completion features (you don't need to enable # this, if it's already enabled in /etc/bash.bashrc and /etc/profile # sources /etc/bash.bashrc). if [ -f /etc/bash_completion ]; then . /etc/bash_completion fi
.bash_aliases:
alias l='ls -lA' alias ll='ls -l' alias la='ls -a' alias lla='ls -la' alias lal='ls -la'
Zusätzlich installieren wir noch das Paket “bash-completion”, um eine komplexere Code- und Befehlsvervollständigung zu bekommen (wird erst nach erneutem Anmelden an der Konsole aktiv):
aptitude install bash-completion
Nun können wir mittels adduser einen Benutzer anlegen:
adduser <Benutzername>
Letzte Woche Donnerstag waren wir auf der CeBIT und haben dadurch endlich mal etwas für unsere Studiengebühren gesehen. Normalerweise werden ja standardmäßig alle Vorschläge abgelehnt und die BA gönnt sich einfach ein paar Sachen für sich selbst – Sekretärinnen, feuern im Winter den Ofen damit, … Das tolle ist, dass man als Student nicht mal mitbekommt, was mit dem Geld passiert und eigentlich kein wirkliches Mitspracherecht hat, was mit dem Geld gemacht werden soll. Wir bezahlen kräftig und dürfen nicht sagen, was mit dem Geld geschehen soll. Aber ich will hier ja keinen Hetzbeitrag gegen die BA und ihre Methoden schreiben. Das würde den Rahmen sprengen. Das mache ich dann ein ander Mal.
Jedenfalls sind wir früh morgens um 6 Uhr losgefahren. Unser Bus hatte keine Toilette, was natürlich ein Spaß war (Hallo, Peter!). Auf der Hinfahrt fiel das noch gar nicht auf, aber auf der Rückfahrt haben ein paar Leute Bier getrunken und hatten dann einen gewissen Druck auf der Blase (gell, Ansgar
). Vorsorglich haben wir dann eine Plastikflasche aufgeschnitten, falls unsere Busfahrer nicht anhalten können, wenn jemand dringendst seine Notdurft verrichten muss. Nach 7 Stunden Fahrt sind wir auf der Messe angekommen, konnten dann 4 Stunden in den ganzen Hallen rumlümmeln und haben uns dann wieder auf den Heimweg gemacht.
Die Highlights waren sich die Heise Krypto Kampagne (keine Kommentare, Hannes), die CaCERT-Leute, die mich endlich assured haben (danke, jetzt läuft mein SSL-Zertifikat endlich nicht mehr nach einem halben Jahr ab, sondern erst nach zwei Jahren), die Leute vom BMI (oder BSI. Dieses Ministerium eben, das in fast jeder Halle einen Stand hatte), die mich über den ePerso (EPA) aufgeklärt haben – insbesondere über die Sicherheitsvorkehrungen, die das unbefugte Auslesen der Informationen auf dem RFID-Chip verhindern soll. Mein persönlicher Favorit war jedoch der Neuseeland-Stand. Ein netter schweizer Neuseeländer hat uns über Auslandspraktikas und Immigration in Neuseeland informiert und ich muss zugeben, dass sich das alles schon sehr verlockend anhört. Sollte das mit dem Arbeiten ab Oktober nichts werden, dann ziehe ich das ernsthaft in Betracht. Der nette Herr fand uns alle wohl auch ne ziemlich coole Truppe und hat uns USB-Sticks, Schlüsselbänder und Neuseeland-Anstecker geschenkt. Der IBM-Stand war sicherlich der größte, den ich gesehen habe und auch der schönste – die Visualisierung einer Computing Cloud hat mir das ganze Konzept endlich verständlich gemacht.
Die Bundesagentur für Arbeit sucht auch nach Informatikern, die Telekomiker auch, die Russen auch, die Serben mit dem definitiv coolsten Faltblatt der Welt leider nicht. Man könnte denken, dass die Informatik von der Finanzkrise ziemlich unangetastet geblieben ist – bis jetzt.
Falls sich jemand schonmal gefragt hat, wie man postgres schnell und einfach von einer Version auf eine andere updatet, dann empfehle ich einen Blick auf dieses Dokument zu werfen: http://blog.netzmeister-st-pauli.de/index.php/2009/01/09/postgresql-upgrade-version-8-1-auf-8-3
Besonders interessant ist der letzte Abschnitt, der das Update unter Debian beschreibt: 3 Befehle. Einfacher kann man es nicht mehr haben. Das ist für einen tippfaulen Admin wie mich natürlich optimal.
pg_dropcluster --stop 8.3 main pg_upgradecluster -v 8.3 8.1 main pg_dropcluster 8.2 main
Ich empfehle natürlich ein Backup der Datenbank zu machen und den letzten Schritt erst auszuführen, wenn man sich sicher ist, dass das Update funktioniert hat.
Vielen Dank an den Ersteller dieser kurzen und einfach Anleitung an dieser Stelle.
Heute hat ibutho mal wieder ein Update bekommen. Ibutho? Mein treuer vServer.
Auf dem Programm stand:
Für die nahe Zukunft habe ich folgende Neuerungen geplant:
Wie vielleicht einige wissen, administriere ich in meiner Freizeit einen virtuellen Server auf Virtuozzo Basis. Schon seit längerem ist es mir ein Dorn im Auge, dass sich Java darauf nicht installieren lässt lies. Seit heute ist das vorbei. Ich habe endlich eine Anleitung gefunden, wie man das Problem umgehen kann.
Zuerst vielleicht einmal, wie sich das Problem geäußert hat: Während des Installationsprozesses mit aptitude gab es einen Fehler beim Ausführen der postinst-Skripts von sun-java6-bin:
Setting up sun-java5-bin (1.5.0-10-3) ... Could not create the Java virtual machine. dpkg: error processing sun-java5-bin (--configure): subprocess post-installation script returned error exit status 1
Um dieses Problem zu lösen, muss das Skript postinst im deb-Paket geändert werden und folgende Zeile auskommentiert werden:
$basedir/bin/java -client -Xshare:dump > /dev/null
Wie man ein deb-Paket entpackt und nach dem Modifizieren wieder ein deb-Paket erstellt, wird hier sehr ausführlich und gut beschrieben:
Zusammenfassend legt man einen Ordner “AAA” an, entpackt das deb-Paket mit tar in diesen Ordner, entpackt die darin enthaltene Datei control.tar.gz in ein Verzeichnis “DEBIAN” (muss in “AAA” erstellt werden) und entpackt die Datei data.tar.gz in den Ordner “AAA”. Jetzt kann bearbeitet werden, was das Zeug hält. Ist man damit fertig, baut man das deb-Paket mit (man muss im Überordner von “AAA” sein):
dpkg-deb --build AAA