# Apache Webserver & vsFTP & Firewall
In dieser Einheit werden Folgende Tool / Kommandos verwendet.
```
vsftpd - Very Secure FTP Daemon
apache2 - Apache Hypertext Transfer Protocol Server
ufw - program for managing a netfilter firewall
gufw - ufw GUI
netstat - Print network connections, routing tables, interface statistics, masquerade connections, and multicast memberships
dig - DNS lookup utility
nslookup - query Internet name servers interactively
nmap - Network exploration tool and security / port scanner
systemctl - Control the systemd system and service manager
ps - report a snapshot of the current processes
```
Auf der Wiki-Seite https://de.wikipedia.org/wiki/Liste_der_standardisierten_Ports sind alle gebräuchlichen TCP/IP Ports aufgelistet.
## Vorbereitung:
### Installation der benötigten Programme / Tools.
```
sudo apt install -y apache2 php vsftpd nmap net-tools vim gufw
```
### VSFTPD Einrichten
**Anonymous Erlauben**
```
sudo vi /etc/vsftpd.conf
# Allow anonymous FTP? (Disabled by default).
anonymous_enable=YES
sudo systemctl restart vsftpd
```
oder mit `sed`
```
sudo sed -i 's/anonymous_enable=NO/anonymous_enable=YES/g' /etc/vsftpd.conf
```
**Test Datei Anlegen**
```
sudo bash -c 'echo "Test Text1" > /srv/ftp/test-1'
sudo bash -c 'echo "Test Text2" > /srv/ftp/test-2'
```
**Testen**
Im Webbrowser `ftp://IP_AdresseServer` Eingeben.
Es sollten die beiden Dateien `Test-1` und `Test-2 zu sehen sein.
### Webserver Vorbereiten
Original `index.html` sichern.
```
sudo mv /var/www/html/index.html /var/www/html/index.html.org
```
Neu Start Seite erstellen:
```
sudo vi /var/www/html/index.php
Hallo VHS-Kurs
Das ist der Host:
Datum und Uhrzeit:
```
**Testen**
`http://ip-adresse_servrer` Aufrufen.
Webseite wird angezeigt.
## Firewall
**Status Überprüfen**
```
sudo ufw status
Status: inactive
```
**ufw Aktivieren**
Firewall Aktivieren und nur `ssh` Port `22/tcp` Erlauben.
```
sudo ufw allow 22/tcp
sudo ufw enable
sudo ufw status
Status: active
To Action From
-- ------ ----
22/tcp ALLOW Anywhere
22/tcp (v6) ALLOW Anywhere (v6)
```
Alles ausser der `ssh` Zugang wird geblockt.
_*Die vorher erstellte Webseite ist nicht mehr erreichbar.*_
**http Erlauben**
```
ufw allow 80/tcp
```
_*Die vorher erstellte Webseite ist wieder erreichbar.*_
**ftp Erlauben**
Anpassung von `/etc/vsftpd.conf`
In einem aktiven Modus verwendet der FTP-Client einen zufälligen Port, um die Verbindung herzustellen. Im passiven Modus fordert der Client die passive Verbindung an und fordert einen zufälligen Port vom FTP-Server an. Normalerweise verwendet der FTP-Client den passiven Modus, wenn sich der Client hinter einer Firewall befindet.
Die Anweisung pasv_enable = Yes aktiviert den passiven Modus für den Ubuntu vsftpd-Server. (Es kann einen beliebigen benutzerdefinierten Portbereich definiert werden.)
Diese drei Zeilen am ende der `vsftpd.conf` Datei einfügen.
```
sudo vi /etc/vsftpd.conf
pasv_enable=Yes
pasv_min_port=10100
pasv_max_port=10110
sudo systemctl restart vsftpd
```
```
sudo ufw allow 20/tcp
sudo ufw allow 21/tcp
sudo ufw allow from any to any proto tcp port 10100:10110
```
Der `vsftpd` Server ist wieder erreichbar.
## System Dienste / Log Dateien
### System Dienste
Die Dienste von neueren Linux Systemen werden von `systemd` gesteuert.
`systemd, init - systemd system and service manager`
```
systemctl - Auflistung aller verwendeten Systemdienste.
systemctl status DienstName - Anzeige des Status von einem Dienst.
systemctl start DienstName - Starten von einem Dienst.
systemctl stop DienstName - Stoppen von einem Dienst.
systemctl restart DienstName - Neustarten von einem Dienst (Entspricht stop / start)
systemctl reload DienstName - Die Konfiguration Datei wird neu eingelesen.
```
**Status vom VSFTP Dienst**
```
systemctl status vsftpd
● vsftpd.service - vsftpd FTP server
Loaded: loaded (/lib/systemd/system/vsftpd.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2020-10-26 11:00:42 UTC; 1h 9min ago
Process: 22401 ExecStartPre=/bin/mkdir -p /var/run/vsftpd/empty (code=exited, status=0/SUCCESS)
Main PID: 22412 (vsftpd)
Tasks: 1 (limit: 1074)
Memory: 896.0K
CGroup: /system.slice/vsftpd.service
└─22412 /usr/sbin/vsftpd /etc/vsftpd.conf
```
Die einzelnen Zeilen:
Systemd Service Name und Beschreibung:
```
● vsftpd.service - vsftpd FTP server
```
Program Verzeichnis und Vorgaben vom Hersteller / Programmierer.
```
Loaded: loaded (/lib/systemd/system/vsftpd.service; enabled; vendor preset: enabled)
```
Status des Prozesses und seit wann dieser Arbeitet.
```
Active: active (running) since Mon 2020-10-26 12:22:14 UTC; 3min 24s ago
```
Prozess ID. Kann mit `ps -ef | grep vsftpd` Überprüft werden.
```
Main PID: 767 (vsftpd)
```
Anzahl der Prozesse.
```
Tasks: 1 (limit: 1074)
```
Der in Anspruch genommen Speicher.
```
Memory: 1.2M
```
Ausführende Gruppen.
```
CGroup: /system.slice/vsftpd.service
└─767 /usr/sbin/vsftpd /etc/vsftpd.conf
```
## Logdateien
Die Standard Logdateien sind unter `/var/log/` zu finden.
Applikationen können auch in anderen Verzeichnissen ihre Log Dateien erstellen.
Mit `sudo find / -name *.log` kann man die meisten Log Dateien finden.
Diese können mit den vorhandenen Editoren angeschaut werden.
**Bei SystemD Systemen gibt es noch `journal`**
Option | Erklärung
--- | ---
-e, --pager-end | springt direkt ans Ende des Journals, d.h. die neuesten Einträge werden angezeigt
-r, --reverse | sortiert die Logeinträge in umgekehrter Reihenfolge, d.h. die neuesten werden zuerst angezeigt
-f, --follow | Springt direkt ans Ende des Journals und zeigt neue Einträge "live" an. Der Follow-Modus kann mit Strg + C verlassen werden.
-b, --boot | Zeigt alle Logeinträge seit dem letzten Booten an.
--since=DATUM | Zeigt alle Logeinträge ab dem Datum DATUM an. Datum hat folgendes Format "JJJJ-MM-TT HH:MM:SS", also z.B. "2016-01-17 12:00:00"
--since=yesterday | Zeigt alle Logeinträge ab 00:00:00 Uhr des Vortages an.
--until=DATUM | Wie --since DATUM, nur das Logeinträge bis zum Datum DATUM angezeigt werden.
-k, --dmesg | zeigt nur Logmeldungen des Kernels an
-u UNITNAME, --unit UNITNAME | Zeigt nur Logmeldungen der Unit UNITNAME an. Es kann ein kompletter Unitname oder ein Muster angegeben werden. So würde z.B. journalctl -u an* nur Logeinträge von Units anzeigen, deren Name mit an beginnt.
-t IDENTIFIER, --identifier IDENTIFIER | Zeigt nur Logeinträge an, die den Identifier IDENTIFIER zugeordnet sind
-p PRIORITÄT, --priority PRIORITÄT | Zeigt nur Logeinträge mit der Priorität PRIORITÄT an. Mögliche Werte sind: emerg, alert, crit, err, warning, notice, info und debug. Alternativ können die Prioritäten als Zahl angegeben werden. 0 entspricht emerg, 1 entspricht alert usw.
**Beispiel**
Zeig live die `sshd` login Versuche auf dem Server.
```
~# journalctl -f -t sshd
-- Logs begin at Thu 2020-10-29 16:53:41 UTC. --
Oct 29 21:27:37 vhsVM-1 sshd[903]: Accepted password for user01 from 192.168.178.104 port 52814 ssh2
Oct 29 21:27:37 vhsVM-1 sshd[903]: pam_unix(sshd:session): session opened for user user01 by (uid=0)
Oct 29 21:29:12 vhsVM-1 sshd[1429]: Accepted password for user01 from 192.168.178.104 port 52824 ssh2
Oct 29 21:29:12 vhsVM-1 sshd[1429]: pam_unix(sshd:session): session opened for user user01 by (uid=0)
Oct 29 21:29:27 vhsVM-1 sshd[1467]: Received disconnect from 192.168.178.104 port 52824:11: disconnected by user
Oct 29 21:29:27 vhsVM-1 sshd[1467]: Disconnected from user user01 192.168.178.104 port 52824
Oct 29 21:29:27 vhsVM-1 sshd[1429]: pam_unix(sshd:session): session closed for user user01
Oct 29 21:29:33 vhsVM-1 sshd[1487]: Failed password for user01 from 192.168.178.104 port 52825 ssh2
Oct 29 21:29:34 vhsVM-1 sshd[1487]: Failed password for user01 from 192.168.178.104 port 52825 ssh2
Oct 29 21:29:34 vhsVM-1 sshd[1487]: Connection closed by authenticating user user01 192.168.178.104 port 52825 [preauth]
```
**ps - Prozesse anzeigen.**
ps - report a snapshot of the current processes.
Je nach dem welche Parameter `ps` mitgegeben werden können sich die Zeilen Unterscheide.
**Beispiel:**
```
~# ps -ef | grep [a]pache2
UID PID PPID C STIME TTY TIME CMD
root 822 1 0 12:22 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 823 822 0 12:22 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 824 822 0 12:22 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 825 822 0 12:22 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 826 822 0 12:22 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 827 822 0 12:22 ? 00:00:00 /usr/sbin/apache2 -k start
```
```
UID - Benutzer ID.
PID - Prozess ID.
PPID - Die PPID ist die PID des übergeordneten Prozesses.
C - CPU Auslastung.
STIME - Start Zeit des Prozesses.
TTY - Terminal.
TIME - Totale CPU Zeit.
CMD - Kommando welches den Prozess gestartet hat.
```