Schlagwort-Archive: nginx

[nginx] Verzeichnisse vor unberechtigten Zugriff schützen

Auf Webseiten gibt es Bereiche wo erst nach einer authentifizierung darauf zugegriffen werden darf. Diese Absicherung erfolgt durch Eingabe eines Benutzernamens und Kennworts oder es wird die Ip Adresse geprüft von der aus der Besucher auf die Seite zugreift.
Wenn die aufgerufene Webapplikation diese Funktionalität nicht bietet, kann dies über nginx umgesetzt werden.

Authentifizierung über Benutzername / Kennwort

Zunächst wird htpasswd benötigt, dieses wird über yum install httpd-tools installiert. Nach erfolgreicher Installation wird über htpasswd -c /etc/nginx/htpasswd-seite1 user1 und Eingabe des Kennworts die benötigte Datei und der erste Benutzer angelegt.
Nun werden in der Datei /etc/nginx/conf.d/seite1.conf die folgenden Zeilen hinzugefügt, damit die Unterseite www.seite1.de/benutzer vor unberechtigten Zugriff geschützt wird.
location /benutzer {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/htpasswd-seite1;
}

Im Anschluss den nginx neustarten: systemctl restart nginx.service

Zugriff über die IP Adresse beschränken

Es gibt Unternehmen in denen Abteilungen eigene IP Adressbereiche erhalten und somit ist es möglich das ausgelieferte Seiten nur aufrufbar sind, wenn der Host eine bestimmte IP Adresse hat.
Der Serverblock seite1.conf wird nun wie folgt angepasst, damit nur Hosts aus einem IP Adressbereich auf die Unterseite www.seite1.de/benutzer zugreifen können.

location /benutzer {
allow 172.23.23.0/24;
deny all;
}

Entweder IP Adresse oder Benutzerauthentifizierung

Nun ist es möglich das wenn die Freigabe der Unterseite nicht Aufgrund der IP Adresse erfolgt, automatisch die Benutzerauthentifizierung greift. Hierfür wird folgende Konfiguration benötigt:

satisfy any;
allow 192.168.1.0/24;
deny all;

auth_basic "Restricted";
auth_basic_user_file /etc/nginx/htpasswd-seite1;

[nginx] Weiterleitung an Tomcat

Damit nginx Anfragen an einen Tomcat weiterleiten kann, muss dieser zunächst einmal installiert werden.

Als erstes wird hierfür die aktuelle Java Version benötigt, diese kann auf der Java Seite bezogen werden. Im Anschluss die heruntergeladene Datei mit tar zxvf entpacken.
Damit der Tomcat unter einem eigenen Benutzer läuft, wurde der Benutzer tomcat angelegt und die entpackte Javaversion in das /home/tomcat Verzeichniss verschoben.

Wenn es beim Aufruf von /home/tomcat/java/bin/java -version zu dem Fehler ./java: /lib/ld-linux.so.2: bad ELF interpreter: Datei oder Verzeichnis nicht gefunden kommt, muss über yum install glibc.i686 das fehlende glibc Paket installiert werden.

Im Anschluss die Tomcat Version herunterladen und entpacken.

wget http://www.us.apache.org/dist/tomcat/tomcat-8/v8.0.24/src/apache-tomcat-8.0.24.tar.gz
tar zxvf apache-tomcat-8.0.24.tar.gz

Für den einfacheren Zugriff wurden zwei Softlinks erstellt.
ln -s apache-tomcat-8.0.24 tomcat
ln -s jdk1.8.0_51 java

Der Datei /home/tomcat/tomcat/conf/catalina.sh wurden folgende Zeilen hinzugefügt:
JAVA_HOME=/home/tomcat/java
CATALINA_PID=/home/tomcat/tomcat/tomcat.pid
CATALINA_HOME=/home/tomcat/tomcat

Und nachdem chmod 755 /home/tomcat/tomcat/bin/*.sh ausgeführt wurde, kann über /home/tomcat/tomcat/bin/startup.sh der Tomcat gestartet werden.

Möchte man direkt auf den Tomcat über den Port 8080 zugreifen, muss dieser zunächst in der Firewall freigeschaltet werden.
firewall-cmd --permanent --zone=public --add-port=8080/tcp
firewall-cmd --reload

Damit der Tomcat beim neustart des Servers automatisch startet, wurde zunächst die Datei /etc/systemd/system/tomcat.service mit folgendem Inhalt angelegt.

# Starscript fuer tomcat
[Unit]
Description=Apache Tomcat
After=syslog.target network.target
[Service]
Type=forking
ExecStart=/home/tomcat/tomcat/bin/startup.sh
ExecStop=/bin/kill -15 $MAINPID
User=tomcat
Group=tomcat
[Install]
WantedBy=multi-user.target

Im Anschluss wurden folgende Zeilen auf der Kommandozeile ausgeführt:
chmod 755 /etc/systemd/system/tomcat.service
systemctl daemon-reload
systemctl enable tomcat

nginx Weiterleitung an den Tomcat

Damit nun die Anfragen vom nginx an den Tomcat weitergereicht werden, wurden in der Datei /etc/nginx/conf.d/ssl-seite2.conf folgende Zeilen hinzugefügt:

location / {
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8080/;
}

[nginx] ssl Zertifikat einrichten

Für die sichere Kommunikation zwischen nginx Server und Browser empfiehlt es sich wie beim Apache ein SSL Zertifikat zu verwenden.

Damit nach der erfolgreichen Einrichtung ein Aufruf per https erfolgen kann, muss zunächst der Port 443 in der firewall freigeschaltet werden.
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload

Hier die benötigten Schritte um ein SSL Zertifikat zu erstellen:
yum install mod_ssl openssl
cd /etc/ssl
openssl genrsa -out seite2.key 2048
openssl req -new -key seite2.key -out seite2.csr
openssl x509 -req -days 365 -in seite2.csr -signkey seite2.key -out seite2.crt

Für den SSL Server block wurde die Datei /etc/nginx/conf.d/seite2.conf nach /etc/nginx/conf.d/ssl-seite2.conf kopiert.

Aufbau ssl-seite2.conf
server {
listen 443;
ssl on;
ssl_certificate /etc/ssl/seite2.crt;
ssl_certificate_key /etc/ssl/seite2.key;

index index.html;

server_name www.seite2.de;
access_log /var/vhosts/seite2/logs/ssl-seite2.access.log main;
error_log /var/vhosts/seite2/logs/ssl-seite2.error.log;

root /var/vhosts/seite2/www;
}

Damit der Besucher der Seite beim http Aufruf auf https weitergeleitet wird, wurden folgende Zeilen in der /etc/nginx/conf.d/seite2.conf hinterlegt:

if ($scheme = http) {
return 301 https://$server_name$request_uri;
}

[nginx] und php

Für viele Webseiten oder Anwendungen wie WordPress, Joomla sowie Contao wird php benötigt. Von Haus aus kann nginx nur html oder Bilddateien ausgeben, damit php Seiten dargestellt werden wird php-fpm benötigt.

Zunächst wird php-fpm unter dem root Benutzer installiert:
yum install php-fpm

Nach der Installation habe ich in der /etc/php.ini folgende Anpassung vorgenommen:
cgi.fix_pathinfo=0

Für die php Konfiguration der www.seite1.de wurde die Datei /etc/php-fpm.d/seite1.conf angelegt.

[seite1]
listen = /var/run/php-fpm/seite1.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
user = seite1
group = seite1
pm = dynamic
pm.max_children = 10
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.max_requests = 500
chdir = /var/vhost/seite1/www/
php_admin_value[open_basedir] = /var/vhosts/seite1/www:/var/vhosts/seite1/temp
php_admin_value[upload_tmp_dir] = /var/vhosts/seite1/temp

Zum Schluss die folgenden Zeilen dem Server-Block in der Datei /etc/nginx/conf.d/seite1.conf hinzufügen.
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_index index.php;
fastcgi_pass unix:/var/run/php-fpm/seite1.sock;
fastcgi_param SCRIPT_FILENAME
$document_root$fastcgi_script_name;
include fastcgi_params;
}

Gestartet wird php-fpm über systemctl start php-fpm.service bzw über systemctl stop php-fpm.service gestoppt.

[nginx] einrichten von vhosts

Wie beim Apache Webserver ist es auch unter nginx möglich verschiedene virtuelle hosts einzurichten. Bei nginx werden diese jedoch nicht als virtuelle hosts bezeichnet sondern als server blocks.

Damit die Seiten unter verschiedenen Benutzern bearbeitet werden können, habe ich zunächst einen Benutzer angelegt adduser seite1 /var/vhosts/seite1. Unter dem Benutzer seite1 wurden die Verzeichnisse logs und www angelegt, im Anschluss müssen noch die Rechte der Verzeichnisse angepasst werden.

chmod 755 /var/vhosts/seite1
chmod 755 /var/vhosts/seite1/www
chmod 760 /var/vhosts/seite1/logs

Damit der nginx die log Dateien in dem angegeben Verzeichnis erstellen kann muss der nginx Benutzer der Gruppe seite1 hinzugefügt werden.

Die Konfiguration des Vhosts wurde in der Datei /etc/nginx/conf.d/seite1.conf erstellt.

server {
index index.html;

server_name www.seite1.de;
access_log /var/vhosts/seite1/logs/seite1.access.log main;
error_log /var/vhosts/seite1/logs/seite1.error.log;

root /var/vhosts/seite1/www;
}

Wenn bei auftretenden Fehlern zum Beispiel die eigene 404 Seite angezeigt werden soll, reicht der folgende Eintrag in der Konfiguration.

error_page 404 errors/404.html;