All posts in UBUNTU

Hallo zusammen,

in dem heutigen Blogeintrag möchte ich euch zeige wie Ihr unter Ubuntu 16.04 einen einfachen Loadbalancer mit HA-Proxy installieren könnt. Für das Howto habe ich drei Ubuntu 16.04 Server installiert. Zwei Server dienen mir als Webserver und einer als Loadbalancer.

 

 

 

 

 

 

 

Um einen nginx Webserver installieren zu können, benötigt es noch ein paar vorbereitungen.

Nach der Grundinstallation der beiden Webserver, müssen diese auf den neusten Stand gebracht werden.
Nach dem Login, wechselt man zum root Benutzer mit:

sudo -i oder sudo su -
apt update -y && apt upgrade -y

Nach dem das System up to date ist, konfiguriert man den beiden Server einee statischen IP-Adresse.
Hier habe ich mich an den Screenshot gehalten, der Webserver 1 bekommt die IP-Adresse 192.168.xxx.101 und der Webserver 2 die IP-Adresse 192.168.xxx.102.

vim /etc/network/interfaces

auto enp0s3
iface enp0s3 inet static
  address 192.168.xxx.xxx
  netmask 255.255.255.0
  gateway 192.168.xxx.xxx
  dns-search htdom.local
  dns-nameservers 192.168.xxx.xxx

reboot
## nginx Webserver installieren und überprüfen
##
apt-get install nginx apache2-utils ssh
dpkg --get-selections nginx apache2-utils
dpkg -l | grep nginx

Zur besseren Übersicht habe ich die /var/www/html/index.nginx-debian.html angepasst, damit man diese in den Screenshots besser erkennt.

 

 

 

 

 

Nach dem die Webserver fertig installiert sind und man auf diese sauber zugreifen kann, werden wir den Loadbalancer vorbereiten.

Auch der Loadbalancer muss auf den neusten Stand gebracht werden.
Nach dem Login, wechselt man zum root Benutzer mit:

sudo -i oder sudo su -
apt update -y && apt upgrade -y

Nach dem das System up to date ist, konfiguriert man auch dem Loadbalancer eine statischen IP-Adresse. Hier habe ich die IP-Adresse 192.168.xxx.51 benutzt.

vim /etc/network/interfaces

auto enp0s3
iface enp0s3 inet static
  address 192.168.xxx.xxx
  netmask 255.255.255.0
  gateway 192.168.xxx.xxx
  dns-search htdom.local
  dns-nameservers 192.168.xxx.xxx

reboot
## HA-Proxy installieren und überprüfen
##
apt install haproxy -y
dpkg --get-selections haproxy
dpkg -l | grep haproxy
## HA-Proxy Konfigurationsdateien sichern
##
mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.old
cp /etc/default/haproxy /etc/default/haproxy.old
## /etc/default/haproxy ##
##
vim /etc/default/haproxy

## Set ENABLED to 1 if you want the init script to start haproxy.
ENABLED=1
## Basis Konfiguration des HAProxy Dienst
##
vim /etc/haproxy/haproxy.cfg

## Basic Settings
##
global
  daemon

defaults
  mode http #tcp

frontend http-incoming
  bind 192.168.178.51:80
  default_backend webservers

backend webservers
  balance roundrobin #leastconn and #source
  server web01 192.168.178.101:80
  server web02 192.168.178.102:80

systemctl restart haproxy.service
systemctl status haproxy.service

Hier ruft man im Webbrowser nun die IP-Adresse (192.168.xxx.51) des Loadbalancer auf, wenn man die Webseite mit F5 refreshed, dann sieht man das Roundrobin verhalten. Wenn man in der /etc/haproxy/haproxy.cfg Konfigurationsdatei den mode auf tcp stellt, dann wird erst dann ein Roundroubin durchgeführt, wenn einer der Webserver down ist.

Dies kann man testen in dem man auf den Webservern den nginx Dienst stoppt. (systemctl stop nginx.service oder service nginx stop)

 

 

 

 

 

## Basis Konfiguration des HAProxy mit Statistics Report
##
vim /etc/haproxy/haproxy.cfg

## Global Settings
##
global
  daemon
  stats socket /run/haproxy/admin.sock mode 660 level admin 
  stats timeout 30s
  user haproxy
  group haproxy

## Default Settings
##
defaults
  log global 
  mode http #tcp
  option httplog

  timeout connect 5000
  timeout client 50000
  timeout server 50000

  retries 3

  errorfile 400 /etc/haproxy/errors/400.http
  errorfile 403 /etc/haproxy/errors/403.http
  errorfile 408 /etc/haproxy/errors/408.http
  errorfile 500 /etc/haproxy/errors/500.http
  errorfile 502 /etc/haproxy/errors/502.http
  errorfile 503 /etc/haproxy/errors/503.http
  errorfile 504 /etc/haproxy/errors/504.http

## Listen Settings
##
listen stats 
  bind 192.168.178.51:12345
  mode http

  maxconn 10

  stats enable
  stats hide-version
  stats refresh 30s
  stats show-node
  stats realm Loadbalanced\ Servers
  stats uri /stats
  stats auth admin:password

## Frontend Settings
##
frontend http-incoming
  bind 192.168.178.51:80
  default_backend webservers

## Backend Settings
##
backend webservers
  balance roundrobin #leastconn and #source
  option httpchk GET /webserver_check
  server web01 192.168.178.101:80 check inter 500 fall 3 rise 2
  server web02 192.168.178.102:80 check inter 500 fall 3 rise 2
## Konfiguration überprüfen
##
haproxy -f /etc/haproxy/haproxy.cfg -c

 

 

 

 

 

## Um die Option httpchk aktiv schalten zu können muss auf allen Webservern
## die webserver_check in das Root Verzeichnis abgelegt werden.
## Nach dieser Datei hällt dann der Loadbalancer ausschau.

touch /var/www/html/webserver_check

 

 

 

 

## HAProxy Statistics Report
##
http://192.168.178.51:12345/stats

Username: admin
Passwort: password

So das war es auch schon wieder von mir, viel Spaß beim konfigurieren.

Gruß Helmut

 

 

 

 

 

 

Wenn man keine CD/DVDs mehr zur Hand hat, kann man sich im eigenen Netzwerk einen PXE Server installieren. Dies funktioniert ganz gut mit einen Raspberry PI oder natürlich in einer Virtuellen Umgebung. Für diesen Blog Eintrag habe ich einen Ubuntu 16.04.2 LTS Server in einer Virtuellen Umgebung installiert.

Nach dem der Ubuntu 16.04.2 LTS Server fertig installiert wurde, installieren wir noch ein paar Grundlegende Pakete und patchen den Server.

sudo apt install vim ssh -y
sudo apt update && apt upgrade -y

Nach dem der Server up to date ist, konfiguriert man eine statischen IP-Adresse.

sudo vim /etc/network/interfaces

## /etc/network/interfaces ##
auto enp0s3
iface enp0s3 inet static
  address 192.168.178.10
  netmask 255.255.255.0
  gateway 192.168.178.1
  dns-search htdom.local
  dns-nameservers 192.168.178.1
#############################

## Damit die Netzwerk Konfiguration sauber funktioniert, starten wir den Server einmal durch.
##
sudo shutdown -r now oder reboot

Nach dem Reboot des Servers, können wir uns mit Putty oder Kitty auf dem Server verbinden.

Oder wir nutzen einen Linux Client (Windows 10 1607) um uns per ssh zu verbinden.
ssh <UserName>@192.168.178.10

Um nun einen PXE Server im Netzwerk zur Verfügung zu stellen, benötigen wir noch folgende Pakete.

apt install dnsmasq syslinux syslinux-common -y

Nach dem die Pakete installiert wurden, beginnen wir mit der konfiguration.

## PXE Verzeichnis anlegen und DHCP/PXE Einstellungen konfigurieren.
##
sudo mkdir /tftpboot

## PXE/DHCP Einstellungen konfigurieren
##
mv /etc/dnsmasq.conf /etc/dnsmasq.conf.old
sudo vim /etc/dnsmasq.conf

## /etc/dnsmasq.conf ##
##
interface=enp0s3
listen-address=127.0.0.1
port=53
domain-needed
bogus-priv
resolv-file=/etc/resolv.dnsmasq

dhcp-range=192.168.178.0,proxy
dhcp-boot=pxelinux.0,192.168.178.10,192.168.178.0
pxe-service=x86PC,"Netzwerk Boot",pxelinux

enable-tftp
tftp-root=/tftpboot
########################

sudo vim /etc/resolv.dnsmasq

## /etc/resolv.dnsmasq ##
##
nameserver 192.168.178.1
#########################

systemctl restart dnsmasq.service
systemctl status dnsmasq.service

Ubuntu Netboot Dateien herunterladen und extrahieren.

cd /tftpboot
wget -c http://archive.ubuntu.com/ubuntu/dists/xenial-updates/main/installer-amd64/current/images/netboot/netboot.tar.gz
tar xzvf netboot.tar.gz
rm -rf netboot.tar.gz

Ab hier ist der PXE Server schon einsatzfähig.

 

 

 

 

 

 

 

Um aber das Ubuntu 16.04.2 Desktop Image per PXE Boot laden zu können, müssen wir dieses noch herunterladen und in das Boot Verzeichnis integrieren/kopieren.

## Ubuntu 16.04 Desktop ISO Image herunterladen
##
cd /tmp
wget -c http://releases.ubuntu.com/16.04/ubuntu-16.04.2-desktop-amd64.iso

## Ubuntu 16.04 Desktop ISO Image mounten und Inhalt in das Boot Verzeichnis kopieren
##
mkdir -p /tftpboot/ubuntu/amd64
mount -o loop /tmp/ubuntu-16.04.2-desktop-amd64.iso /mnt
cp -a /mnt/. /tftpboot/ubuntu/amd64/
umount /mnt

Damit das Ubuntu 16.04 Desktop ISO Image geladen werden kann, benötigen wir noch eine Freigabe auf dem Server, dies können wir per NFS realisieren.

## NFS Server installieren
##
apt install nfs-kernel-server -y

sudo vim  /etc/exports
## /etc/exports ##
/tftpboot/ubuntu/amd64  192.168.178.0/24(ro,async,no_root_squash,no_subtree_check)
##################

sudo exportfs -a
systemctl restart nfs-kernel-server.service
systemctl restart nfs-server.service
ps -aux | grep nfs

Die Konfigurationsdatei (default) für das Boot Menü, findet man im Verzeichnis /tftpboot/ubuntu-installer/amd64/pxelinux.cfg/
ls -la /tftpboot/ubuntu-installer/amd64/pxelinux.cfg/default

## Bootmenü anpassen um das Ubuntu 16.04 Desktop ISO Image zu booten
##
mv /tftpboot/ubuntu-installer/amd64/pxelinux.cfg/default /tftpboot/ubuntu-installer/amd64/pxelinux.cfg/default.old
sudo vim /tftpboot/ubuntu-installer/amd64/pxelinux.cfg/default


## default ##
PATH /tftpboot/ubuntu-installer/amd64/boot-screens/
DEFAULT /tftpboot/ubuntu-installer/amd64/boot-screens/vesamenu.c32
PROMPT 0
TIMEOUT 150
ONTIMEOUT local
NOESCAPE 1
ALLOWOPTIONS 1

MENU BACKGROUND /tftpboot/ubuntu-installer/amd64/boot-screens/bootlogo.png
MENU RESOLUTION 800 600
MENU TITLE HTDOM PXE Server
MENU COLOR TITLE 1;37 #ffffffff #00000000 std

MENU WIDTH 98
MENU ROWS 11
MENU MARGIN 15
MENU COLOR BORDER * #00000000 #00000000 std

LABEL Boot from local DISK
  localboot 0
TEXT HELP
  Boot from local DISK
ENDTEXT

LABEL ---------------------------------------------------------------------

LABEL Ubuntu 16.04.2 Desktop Live
  kernel /tftpboot/ubuntu/amd64/casper/vmlinuz.efi
  append vga=normal netboot=nfs boot=casper nfsroot=192.168.178.10:/tftpboot/ubuntu/amd64/ ro initrd=/tftpboot/ubuntu/amd64/casper/initrd.lz locale=de_DE bootkbd=de console-setup/layoutcode=de
TEXT HELP
  Boot Ubuntu 16.04.2 Desktop Live
ENDTEXT
#############

 

 

 

 

 

 

 

 

Download des Bootlogos

 

 

 

 

 

 

 

 

So nun wünsche ich euch viel Spaß mit euren eigenen PXE Server.

Gruß Helmut

 

 

 

 

Hallo zusammen,

um den Nextcloud Server installieren zu können, benötigt es ein paar Vorbereitungen.
In diesen Beispiel verwende wir einen Ubuntu 16.04 LTS Server in einer Virtuellen Umgebung.

Nach der Grundinstallation des Ubuntu Servers, muss der Server auf den neusten Stand gebracht werden.
Nach dem Login, wechselt man zum root Benutzer mit:

sudo -i oder sudo su -
apt install ssh vim
apt update && apt upgrade -y

nginx Webserver installieren und überprüfen

apt install nginx nginx-extras apache2-utils ssh
dpkg -l | grep nginx

MariaDB Server installieren & Konfigurieren

apt install mariadb-server
dpkg -l | grep mariadb

mysql_secure_installation

cp /etc/mysql/my.cnf /etc/mysql/my.cnf.bak
vim /etc/mysql/my.cnf

[server]
skip-name-resolve
innodb_buffer_pool_size = 128M
innodb_buffer_pool_instances = 1
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 32M
innodb_max_dirty_pages_pct = 90
query_cache_type = 1
query_cache_limit = 2M
query_cache_min_res_unit = 2k
query_cache_size = 64M
tmp_table_size= 64M
max_heap_table_size= 64M
slow-query-log = 1
slow-query-log-file = /var/log/mysql/slow.log
long_query_time = 1

#
[client-server]

# Import all .cnf files from configuration directory
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mariadb.conf.d/

[client]
default-character-set = utf8mb4
[mysqld]
character-set-server  = utf8mb4
collation-server      = utf8mb4_general_ci
binlog_format = MIXED

systemctl start mysql.service
systemctl status mysql.service

NextCloud Datenbank anlegen

mysql -u root -p

CREATE DATABASE nextcloudDB;
USE nextcloudDB;

CREATE USER nextcloudDB@localhost IDENTIFIED BY 'nextcloudDB';
GRANT ALL PRIVILEGES ON nextcloudDB.* TO 'nextcloudDB'@'localhost' IDENTIFIED BY 'DeinPassword';
FLUSH PRIVILEGES;
quit

mysql -u nextcloudDB -p nextcloudDB
DeinPassword
quit

PHP 7 installieren

apt install libxml2-dev php php-gettext php-pear php-dompdf php-sabre-xml php-apcu php-imagick php7.0-fpm php7.0-gd php7.0-mysql php7.0-curl php7.0-xml php7.0-zip php7.0-bz2 php7.0-intl php7.0-mcrypt php7.0-mbstring php7.0-json php7.0-xsl php7.0-bcmath php7.0-cgi php7.0-cli php7.0-common  php7.0-imap

php.ini Datei anpassen

cp /etc/php/7.0/fpm/php.ini /etc/php/7.0/fpm/php.old
vim /etc/php/7.0/fpm/php.ini

memory_limit = 512M
post_max_size = 200M
cgi.fix_pathinfo=1
upload_max_filesize = 200M
date.timezone = Europe/Berlin

oder

egrep "memory_limit|date.timezone|cgi.fix_pathinfo|upload_max_filesize|post_max_size" /etc/php/7.0/fpm/php.ini

sed -i "s/memory_limit = .*/memory_limit = 512M/" /etc/php/7.0/fpm/php.ini
sed -i "s/;date.timezone.*/date.timezone = Europe\/\Berlin/" /etc/php/7.0/fpm/php.ini
sed -i "s/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=1/" /etc/php/7.0/fpm/php.ini
sed -i "s/upload_max_filesize = .*/upload_max_filesize = 200M/" /etc/php/7.0/fpm/php.ini
sed -i "s/post_max_size = .*/post_max_size = 200M/" /etc/php/7.0/fpm/php.ini

fpm www.conf Datei anpassen

nano /etc/php/7.0/fpm/pool.d/www.conf

...
;listen = /run/php/php7.0-fpm.sock
listen = 127.0.0.1:9000

env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
env[TMP] = /tmp 
env[TMPDIR] = /tmp
env[TEMP] = /tmp

service php7.0-fpm restart
service php7.0-fpm status

NextCloud 11 installieren

cd /tmp
wget https://download.nextcloud.com/server/releases/nextcloud-11.0.1.zip
unzip nextcloud-11.0.1.zip
mv nextcloud /var/www/
chown -R www-data: /var/www/nextcloud

SSL Zertifikat über eigene CA erstellen

cd /opt/ca/IssuingCA

openssl genrsa -aes256 -out private/nextcloud_htdom_local_without_pwd.key 2048 -rand private/.randIssuingCA
chmod 0400 private/nextcloud_htdom_local_without_pwd.key

openssl req -new -key private/nextcloud_htdom_local_without_pwd.key -out newcerts/nextcloud.htdom.local.csr -config ca-config.cnf
Enter pass phrase for private/nextcloud_htdom_local_without_pwd.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [DE]:
State or Province Name (Bayern) [Bayern]:
Locality Name (Muenchen) [Muenchen]:
Organization Name (Company name or your Name) [Helmut Thurnhofer]:
Organizational Unit Name (Department) [IT]:
Common Name (Server FQDN or your Name) []:nextcloud.htdom.local
...

openssl ca -name IssuingCA -in newcerts/nextcloud.htdom.local.csr -out certs/nextcloud.htdom.local.crt -extensions server_cert -config ca-config.cnf
Using configuration from ca-config.cnf
Enter pass phrase for /opt/ca/IssuingCA/private/IssuingCA.key:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Feb  7 20:10:54 2017 GMT
            Not After : Feb  5 20:10:54 2027 GMT
        Subject:
            countryName               = DE
            stateOrProvinceName       = Bayern
            organizationName          = Helmut Thurnhofer
            organizationalUnitName    = IT
            commonName                = nextcloud.htdom.local
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            X509v3 Key Usage:
                Digital Signature, Non Repudiation, Key Encipherment, Data Encipherment
            X509v3 Extended Key Usage:
                TLS Web Server Authentication
            Authority Information Access:
                CA Issuers - URI:http://nextcloud.htdom.local/cert/IssuingCA.html

            X509v3 CRL Distribution Points:

                Full Name:
                  URI:http://nextcloud.htdom.local/cert/IssuingCA.crl

Certificate is to be certified until Feb  5 20:10:54 2027 GMT (3650 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

## Keydatei erstellen mit Passwort (Ansonsten muss bei jeden Neustart des Servers die Passphrase eingegeben werden)
##
openssl rsa -in private/nextcloud_htdom_local_without_pwd.key | cat

-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEArbdXG8+BUxm0NvO2pWXdx/0L3z/Nb+enAWqL59PzOuL63vXv
...
WyYHO6o4iUROOuJ9I0t0KsEDqkgh+VEOtcVfh8/gZ9IXyfXFyRhu09Q=
-----END RSA PRIVATE KEY-----

vim private/nextcloud.htdom.local.key
chmod 0400 private/nextcloud.htdom.local.key

oder man erstellt sich ein.

SelfSign SSL Zertifikat

openssl rand -out /etc/ssl/private/.randServer 8192
chmod 0400 /etc/ssl/private/.randServer

openssl genrsa -aes256 -out /etc/ssl/private/nextcloud_htdom_local_without_pwd.key 4096 -rand /etc/ssl/private/.randServer
chmod 0400 /etc/ssl/private/nextcloud_htdom_local_without_pwd.key

openssl rsa -in /etc/ssl/private/nextcloud_htdom_local_without_pwd.key | cat

-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEArbdXG8+BUxm0NvO2pWXdx/0L3z/Nb+enAWqL59PzOuL63vXv
...
WyYHO6o4iUROOuJ9I0t0KsEDqkgh+VEOtcVfh8/gZ9IXyfXFyRhu09Q=
-----END RSA PRIVATE KEY-----

vim /etc/ssl/private/nextcloud.htdom.local.key
chmod 0400 /etc/ssl/private/nextcloud.htdom.local.key

openssl req -new -key /etc/ssl/private/nextcloud.htdom.local.key -sha256 -out /etc/ssl/certs/nextcloud.htdom.local.csr
openssl x509 -req -days 365 -in /etc/ssl/certs/nextcloud.htdom.local.csr -signkey /etc/ssl/private/nextcloud.htdom.local.key -out /etc/ssl/certs/nextcloud.htdom.local.crt

nginx Webserver Konfiguration

vim /etc/nginx/sites-available/nextcloud.conf

upstream php-handler {
    server 127.0.0.1:9000;
}

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    # enforce https
    return 301 https://$host$request_uri;

    access_log /var/log/nginx/access_nextcloud_htdom_local.log;
    error_log /var/log/nginx/error_nextcloud_htdom_local.log;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    ssl_certificate /etc/ssl/certs/nextcloud.htdom.local.crt;
    ssl_certificate_key /etc/ssl/private/nextcloud_htdom_local.key;

    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;

    ## modern configuration. tweak to your needs.
    ssl_protocols TLSv1.2;
    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
    ssl_prefer_server_ciphers on;

    ## HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)
    add_header Strict-Transport-Security max-age=15768000;

    # Add headers to serve security related headers
    # Before enabling Strict-Transport-Security headers please read into this
    # topic first.
    # add_header Strict-Transport-Security "max-age=15768000;
    # includeSubDomains; preload;";
    add_header X-Content-Type-Options nosniff;
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Robots-Tag none;
    add_header X-Download-Options noopen;
    add_header X-Permitted-Cross-Domain-Policies none;

    # Path to the root of your installation
    root /var/www/nextcloud/;

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    # The following 2 rules are only needed for the user_webfinger app.
    # Uncomment it if you're planning to use this app.
    #rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
    #rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json
    # last;

    location = /.well-known/carddav {
      return 301 $scheme://$host/remote.php/dav;
    }
    location = /.well-known/caldav {
      return 301 $scheme://$host/remote.php/dav;
    }

    # set max upload size
    client_max_body_size 512M;
    fastcgi_buffers 64 4K;

    # Disable gzip to avoid the removal of the ETag header
    gzip off;

    # Uncomment if your server is build with the ngx_pagespeed module
    # This module is currently not supported.
    #pagespeed off;

    error_page 403 /core/templates/403.php;
    error_page 404 /core/templates/404.php;

    location / {
        rewrite ^ /index.php$uri;
    }

    location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)/ {
        deny all;
    }
    location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) {
        deny all;
    }

    location ~ ^/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+|core/templates/40[34])\.php(?:$|/) {
        include fastcgi_params;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param HTTPS on;

        #Avoid sending the security headers twice
        fastcgi_param modHeadersAvailable true;
        fastcgi_param front_controller_active true;
        fastcgi_pass php-handler;
        fastcgi_intercept_errors on;
        fastcgi_request_buffering off;
    }

    location ~ ^/(?:updater|ocs-provider)(?:$|/) {
        try_files $uri/ =404;
        index index.php;
    }

    # Adding the cache control header for js and css files
    # Make sure it is BELOW the PHP block
    location ~* \.(?:css|js|woff|svg|gif)$ {
        try_files $uri /index.php$uri$is_args$args;
        add_header Cache-Control "public, max-age=7200";
        # Add headers to serve security related headers (It is intended to
        # have those duplicated to the ones above)
        # Before enabling Strict-Transport-Security headers please read into
        # this topic first.
        # add_header Strict-Transport-Security "max-age=15768000;
        #  includeSubDomains; preload;";
        add_header X-Content-Type-Options nosniff;
        add_header X-Frame-Options "SAMEORIGIN";
        add_header X-XSS-Protection "1; mode=block";
        add_header X-Robots-Tag none;
        add_header X-Download-Options noopen;
        add_header X-Permitted-Cross-Domain-Policies none;
        # Optional: Don't log access to assets
        access_log off;
    }

    location ~* \.(?:png|html|ttf|ico|jpg|jpeg)$ {
        try_files $uri /index.php$uri$is_args$args;
        # Optional: Don't log access to other assets
        access_log off;
    }
}

nginx überprüfen und restliche Konfiguration vornehmen

nginx -t

unlink /etc/nginx/sites-enabled/default
mv /etc/nginx/sites-available/default{,.old}

ln -s /etc/nginx/sites-available/nextcloud.conf /etc/nginx/sites-enabled/
systemctl restart nginx.service
systemctl status nginx.service

Memory Cache konfigurieren

apt-cache policy php-apcu
apt install php-apcu

systemctl restart nginx.service

nano /var/www/nextcloud/config/config.php
<?php
$CONFIG = array (
  'memcache.local' => '\OC\Memcache\APCu',
  ...
  'trusted_domains' =>
  array (
    0 => '192.168.178.2',
    1 => 'nextcloud.htdom.local',
  ),

systemctl restart nginx.service
systemctl status nginx.service

 

 

 

 

 

 

Viel Spaß beim konfigurieren

Gruß Helmut

 

 

 

 

 

Hallo zusammen,

um einen nginx Webserver installieren zu können, benötigt es ein paar Vorbereitungen.
In diesen Beispiel verwende wir einen Ubuntu 16.04 LTS Server in einer Virtuellen Umgebung.

Nach der Grundinstallation des Servers, muss der Server auf den neusten Stand gebracht werden.
Nach dem Login, wechselt man zum root Benutzer mit:

sudo -i oder sudo su -
apt update -y && apt upgrade -y
reboot

Nach dem das System up to date ist, konfiguriert man den Server mit einer statischen IP-Adresse.

vim /etc/network/interfaces

auto enp0s3
iface enp0s3 inet static
  address 192.168.xxx.xxx
  netmask 255.255.255.0
  gateway 192.168.xxx.xxx
  dns-search htdom.local
  dns-nameservers 192.168.xxx.xxx 192.168.xxx.xxx

systemctl restart networking.service
systemctl status networking.service

nginx Webserver installation und überprüfen

apt-get install nginx apache2-utils ssh
dpkg -l | grep nginx

Standardverzeichnisse nach der Installation

tree /etc/nginx

/etc/nginx/
├── conf.d
├── fastcgi.conf
├── fastcgi_params
├── koi-utf
├── koi-win
├── mime.types
├── nginx.conf
├── proxy_params
├── scgi_params
├── sites-available
│   └── default
├── sites-enabled
│   └── default -> /etc/nginx/sites-available/default
├── snippets
│   ├── fastcgi-php.conf
│   └── snakeoil.conf
├── uwsgi_params
└── win-utf


tree /var/www

/var/www/
└── html
    └── index.nginx-debian.html

Grundlegende nginx Befehle

## Mit folgenden Befehlen kann man den nginx Server starten/stoppen/reloaden/configtest durchführen bzw. den Status abfragen
##
service nginx {start|stop|restart|reload|force-reload|status|configtest|rotate|upgrade}

## Der wichtigste Befehl nach jeder Konfigurationsanpassung ist immer.
##
nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

oder

service nginx configtest
* Testing nginx configuration
  ...done.

Mit folgenden Befehl überprüft man, ob der nginx Server auf Port 80 lauscht

netstat -antlp | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      4236/nginx -g daemo
tcp6       0      0 :::80                   :::*                    LISTEN      4236/nginx -g daemo

PID File Anpassung in der nginx.service Datei

## Nach jedem Neustart des nginx Services, wird eine Fehlermeldung ausgegeben, das die nginx.pid nicht gelesen/gefunden wird.
## Daher wurde hier eine kleine Anpassung an der nginx.service & nginx.conf Datei vorgenommen.
##
systemctl status nginx.service
● nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
   ...
Jan 19 16:08:53 web01 systemd[1]: Starting A high performance web server and a reverse proxy server...
Jan 19 16:08:53 web01 systemd[1]: nginx.service: Failed to read PID from file /run/nginx.pid: Invalid argument


vim /lib/systemd/system/nginx.service
[Service]
Type=forking
PIDFile=/var/run/nginx.pid
...
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /var/run/nginx.pid
. . .

vim /etc/nginx/nginx.conf
http {
    # pid /var/run/nginx.pid;
    . . .
}

systemctl restart nginx.service
systemctl daemon-reload

systemctl status nginx.service
● nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
   ...
Jan 19 16:10:00 web01 systemd[1]: Starting A high performance web server and a reverse proxy server...
Jan 19 16:10:00 web01 systemd[1]: Started A high performance web server and a reverse proxy server.

Erste Webseite konfigurieren

## Als erstes entfernen wir den Standardlink unter sites-enabled und machen eine Sicherungskopie der /etc/nginx/default Datei.

unlink /etc/nginx/sites-enabled/default
mv /etc/nginx/sites-available/default{,.old}

mv /var/www/html/index.nginx-debian.html /var/www/html/index.html
mv /var/www/html/ /var/www/mysite_htdom_local

vim /etc/nginx/sites-available/mysite.htdom.local

## Default Server Konfiguration ohne https und rewrite
##
server {
  listen 80;
  listen [::]:80;

  server_name mysite.htdom.local;
  root /var/www/mysite_htdom_local;
  index index.html;

  access_log /var/log/nginx/access_mysite_htdom_local.log;
  error_log /var/log/nginx/error_mysite_htdom_local.log;
}

ln -s /etc/nginx/sites-available/mysite.htdom.local /etc/nginx/sites-enabled/

systemctl reload nginx.service

 

 

 

 

 

Virtuellen Host konfigurieren

mkdir -p /var/www/site1_htdom_local
sudo chown -R root:root /var/www/site1_htdom_local

vim /etc/nginx/sites-available/site1.htdom.local

## Default Server Konfiguration ohne https und rewrite
##
server {
  listen 80;
  listen [::]:80;

  server_name site1.htdom.local;
  root /var/www/site1_htdom_local;
  index index.html;

  access_log /var/log/nginx/access_site1_htdom_local.log;
  error_log /var/log/nginx/error_site1_htdom_local.log;
}

ln -s /etc/nginx/sites-available/site1.htdom.local /etc/nginx/sites-enabled/

systemctl reload nginx.service

ls -la /etc/nginx/sites-enabled/
...
lrwxrwxrwx 1 root root   45 Jan 19 18:45 mysite.htdom.local -> /etc/nginx/sites-available/mysite.htdom.local
lrwxrwxrwx 1 root root   44 Jan 20 15:58 site1.htdom.local -> /etc/nginx/sites-available/site1.htdom.local

 

 

 

 

 

Webserver SSL Zertifikat erstellen

cd /opt/ca/IssuingCA/

openssl genrsa -aes256 -out private/mysite.htdom.local.key 2048 -rand private/.randIssuingCA
chmod 0400 private/mysite.htdom.local.key

openssl req -new -key private/mysite.htdom.local.key -out newcerts/mysite.htdom.local.csr -config ca-config.cnf

Enter pass phrase for private/mysite.htdom.local.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [DE]:
State or Province Name (Bayern) [Bayern]:
Locality Name (Muenchen) [Muenchen]:
Organization Name (Company name or your Name) [HTDOM Company GmbH]:
Organizational Unit Name (Department) [IT]:IT-Support
Common Name (Server FQDN or your Name) []:mysite.htdom.local
...

-----------------------------------------------------------------------
openssl ca -name IssuingCA -in newcerts/mysite.htdom.local.csr -out certs/mysite.htdom.local.crt -extensions server_cert -config ca-config.cnf

Using configuration from ca-config.cnf
Enter pass phrase for /opt/ca/IssuingCA/private/IssuingCA.key:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Jan 22 13:14:33 2017 GMT
            Not After : Jan 20 13:14:33 2027 GMT
        Subject:
            countryName               = DE
            stateOrProvinceName       = Bayern
            organizationName          = HTDOM Company GmbH
            organizationalUnitName    = IT-Support
            commonName                = mysite.htdom.local
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            X509v3 Key Usage:
                Digital Signature, Non Repudiation, Key Encipherment, Data Encipherment
            X509v3 Extended Key Usage:
                TLS Web Server Authentication
            Authority Information Access:
                CA Issuers - URI:http://mysite.htdom.local/cert/IssuingCA.html

            X509v3 CRL Distribution Points:

                Full Name:
                  URI:http://mysite.htdom.local/cert/IssuingCA.crl

Certificate is to be certified until Jan 20 13:14:33 2027 GMT (3650 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

-----------------------------------------------------------------------

## Keydatei erstellen mit Passwort (Ansonsten muss bei jeden Neustart des Servers die Passphrase eingegeben werden)
##
openssl rsa -in private/mysite.htdom.local.key | cat

-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEArbdXG8+BUxm0NvO2pWXdx/0L3z/Nb+enAWqL59PzOuL63vXv
...
WyYHO6o4iUROOuJ9I0t0KsEDqkgh+VEOtcVfh8/gZ9IXyfXFyRhu09Q=
-----END RSA PRIVATE KEY-----

vim private/mysite.htdom.local.with.pwd.key
chmod 0400 private/mysite.htdom.local.with.pwd.key

-----------------------------------------------------------------------

## Zertifikat auslesen und auf dem Webserver importieren
##
cat /opt/ca/IssuingCA/certs/mysite.htdom.local.crt | sed -n -e '/BEGIN\ CERTIFICATE/,/END\ CERTIFICATE/ p'
cat /opt/ca/IssuingCA/private/mysite.htdom.local.with.pwd.key

-----------------------------------------------------------------------

## Ansicht auf dem Webserver
##
ls -la certs/mysite.htdom.local.crt
-rw-r--r-- 1 root root 1866 Jan 22 14:21 certs/mysite.htdom.local.crt

ls -la private/mysite.htdom.local.with.pwd.key
-rw-r----- 1 root root 1675 Jan 22 14:22 private/mysite.htdom.local.with.pwd.key

chmod 0640 /etc/ssl/private/mysite.htdom.local.with.pwd.key

tree /var/www/mysite_htdom_local/
/var/www/mysite_htdom_local/
├── cert
│   ├── IssuingCA.crl
│   ├── IssuingCA.crt
│   ├── RootCA.crl
│   └── RootCA.crt
└── index.html

mysite.htdom.local Konfiguration anpassen

vim /etc/nginx/sites-available/mysite.htdom.local

## Default Server Konfiguration mit https und rewrite
##
server {
  listen 80 default_server;
  listen [::]:80 default_server;

## Redirect all HTTP requests to HTTPS with a 301 Moved Permanently response.
  return 301 https://$host$request_uri;

  access_log /var/log/nginx/access_mysite_htdom_local.log;
  error_log /var/log/nginx/error_mysite_htdom_local.log;
}

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;

  root /var/www/mysite_htdom_local;
  index index.html;
    location / {
        try_files $uri $uri/ /index.html;
    }
  
## SSL Zertifikate
  ssl_certificate /etc/ssl/certs/mysite.htdom.local.crt;
  ssl_certificate_key /etc/ssl/private/mysite.htdom.local.with.pwd.key;
}

nginx -t
systemctl restart nginx.service
systemctl status nginx.service

Mit folgenden Befehl überprüft man, ob der nginx Server auf Port 80 und 443 lauscht

netstat -antlp | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      3776/nginx -g daemo
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      3776/nginx -g daemo
tcp6       0      0 :::80                   :::*                    LISTEN      3776/nginx -g daemo
tcp6       0      0 :::443                  :::*                    LISTEN      3776/nginx -g daemo

 

 

 

 

 

 

Um noch mehr Sicherheit in die TLS Verbindung zu bekommen, sollte man das TLS Protokoll und den Schlüsselaustausch (Chiper) eingrenzen.
Dazu gibt es eine sehr gute Webseite von Mozilla, mit dieser Mozilla SSL Configuration Generator kann man sich die passende Konfiguration für seinen Webserver zusammenklicken.

https://mozilla.github.io/server-side-tls/ssl-config-generator/

Modern: Ist Stand heute die sicherste Einstellung, hier wird nur noch TLSv1.2 verwendet
Intermediate: Ist ein kompromiss aus Sicherheit und Kompatibilität, hier wird noch TLSv1 TLSv1.1 TLSv1.2 verwendet.
Old: Ist die schlechterste Wahl, hier wird sogar noch das veraltete SSLv3 verwendet.

Alle heutigen Browser unterstützen bereits TLSv1.2 daher sollte man, wenn möglich Intermediate oder Modern benutzen.
Um die Konfiguration auf der Webseite vornehmen zu können, müssen wir erst die nginx und openssl Version herausfinden, dies funktioniert mit folgenden Befehl.

nginx -V
nginx version: nginx/1.10.0 (Ubuntu)
built with OpenSSL 1.0.2g  1 Mar 2016

Und so sieht meine Modern Konfiguration aus

## Default Server Konfiguration mit https/rewrite und Modern Konfiguration
##
server {
  listen 80 default_server;
  listen [::]:80 default_server;

## Redirect all HTTP requests to HTTPS with a 301 Moved Permanently response.
  return 301 https://$host$request_uri;

  access_log /var/log/nginx/access_mysite_htdom_local.log;
  error_log /var/log/nginx/error_mysite_htdom_local.log;
}

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;

  root /var/www/mysite_htdom_local;
  index index.html;
    location / {
        try_files $uri $uri/ /index.html;
    }
  
## certs sent to the client in SERVER HELLO are concatenated in ssl_certificate
    ssl_certificate /etc/ssl/certs/mysite.htdom.local.crt;
    ssl_certificate_key /etc/ssl/private/mysite.htdom.local.with.pwd.key;

    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;

## modern configuration. tweak to your needs.
    ssl_protocols TLSv1.2;
    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
    ssl_prefer_server_ciphers on;

## HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)
    add_header Strict-Transport-Security max-age=15768000;
}

SSL/TLS Verbindungstest kann man auf folgender Webseite durchführen
https://www.ssllabs.com/ssltest/index.html

Wenn man nun die Variante Modern nutzt, könnte die Handshake Simulation wie folgt aussehen.
Alle Browser die kein TLSv1.2 unterstützen, werden abgewiesen, bzw. können keine Verbindung zum Webserver aufbauen.

 

 

 

 

 

 

 

Viel Spaß beim ausprobieren

Gruß Helmut

 

 

 

 

 

In diesen Beitrag möchte ich kurz zeigen, wie man sich für eine Testumgebung oder vielleicht einen späteren Live Betrieb eine zweistufige PKI mit OpenSSL einrichtet.
Hierzu wurde ein Standard Ubuntu 16.04 LTS Server installiert.

Das wichtigste für eine CA ist die OpenSSL-Konfigurationsdatei, diese liegt Standardmäßig jeder openssl Installation bei, diese Datei wurde kopiert und auf die Testumgebung angepasst.
Wenn Ihr andere Installationspfade nutzen wollt, dann bitte dementsprechend die ca-config.cnf Datei nach euren Bedürfnisse anpassen.

locate *.cnf
/etc/ssl/openssl.cnf
/usr/lib/ssl/openssl.cnf

Was sehr wichtig ist, sind die Sektionen. Die URLs müssen unbedingt für die Testumgebung angepasst werden. Damit im Zertifikat später die richtigen URLs stehen.
Die Certification Revocation List (*.crl) muss über http:// erreichbar sein, wenn das nicht der Fall ist, kann es zu unnötigen Fehlern kommen.

[root_ca]
[issuingca_cert]
[user_cert]
[server_cert]

authorityInfoAccess = caIssuers;URI:http://server.domain.de/RootCA.html
crlDistributionPoints=URI:http://server.domain.de/RootCA.crl

authorityInfoAccess = caIssuers;URI:http://server.domain.de/IssuingCA.html
crlDistributionPoints=URI:http://server.domain.de/IssuingCA.crl

ca-config.cnf

# This definition stops the following lines choking if HOME isn't
# defined.
HOME = .
RANDFILE = $ENV::HOME/.rnd

# Extra OBJECT IDENTIFIER info:
oid_section = new_oids

[new_oids]
# Policies used by the TSA examples.
tsa_policy1 = 1.2.3.4.1
tsa_policy2 = 1.2.3.4.5.6
tsa_policy3 = 1.2.3.4.5.7

####################################################################
[ca]
default_ca = RootCA        # The default ca section
####################################################################
[RootCA]

dir = /opt/ca/RootCA                  # Where everything is kept
certs = $dir/certs                    # Where the issued certs are kept
crl_dir = $dir/crl                    # Where the issued crl are kept
database = $dir/index.txt             # database index file.
new_certs_dir = $dir/newcerts         # default place for new certs.
certificate = $dir/RootCA.crt         # The CA certificate
serial    = $dir/serial               # The current serial number
crlnumber = $dir/crlnumber            # the current crl number

# must be commented out to leave a V1 CRL
crl = $crl_dir/RootCA.crl             # The current CRL
private_key = $dir/private/RootCA.key # The private key
RANDFILE = $dir/private/.randRootCA   # private random number file
x509_extensions = user_cert           # The extentions to add to the cert
name_opt = ca_default                 # Subject Name options
cert_opt = ca_default                 # Certificate field options
default_days = 3650                   # how long to certify for
default_crl_days = 30                 # how long before next CRL
default_md = sha512                   # use public key default MD
preserve = no                         # keep passed DN ordering
policy = policy_anything              # CHANGE THIS
####################################################################
[IssuingCA]

dir = /opt/ca/IssuingCA               # Where everything is kept
certs = $dir/certs                    # Where the issued certs are kept
crl_dir = $dir/crl                    # Where the issued crl are kept
database = $dir/index.txt             # database index file.
new_certs_dir = $dir/newcerts         # default place for new certs.
certificate = $dir/IssuingCA.crt      # The CA certificate
serial = $dir/serial                  # The current serial number
crlnumber = $dir/crlnumber            # the current crl number

# must be commented out to leave a V1 CRL
crl = $crl_dir/IssuingCA.crl              # The current CRL
private_key = $dir/private/IssuingCA.key  # The private key
RANDFILE = $dir/private/.randIssuingCA    # private random number file
x509_extensions = user_cert               # The extentions to add to the cert
name_opt = ca_default                     # Subject Name options
cert_opt = ca_default                     # Certificate field options
default_days = 3650                       # how long to certify for
default_crl_days = 30                     # how long before next CRL
default_md = sha512                       # use public key default MD
preserve = no                             # keep passed DN ordering
policy = policy_match
####################################################################
[policy_match]

countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
####################################################################
[policy_anything]

countryName = optional
stateOrProvinceName = optional
localityName  = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
####################################################################
[req]

default_bits = 2048
default_keyfile = privkey.pem
distinguished_name = req_distinguished_name
attributes = req_attributes
x509_extensions = root_ca
string_mask = utf8only
####################################################################
[req_distinguished_name]

countryName = Country Name (2 letter code)
countryName_default = DE
countryName_min = 2
countryName_max = 2
stateOrProvinceName = State or Province Name (Bayern)
stateOrProvinceName_default = Bayern
localityName = Locality Name (Muenchen)
localityName_default = Muenchen
0.organizationName = Organization Name (Company name or your Name)
0.organizationName_default = HTDOM Company GmbH
organizationalUnitName = Organizational Unit Name (Department)
organizationalUnitName_default = IT
commonName = Common Name (Server FQDN or your Name)
commonName_max = 64
emailAddress = Email Address
emailAddress_max = 64
####################################################################
[req_attributes]

challengePassword = A challenge password
challengePassword_min = 4
challengePassword_max = 20
unstructuredName = An optional company name
####################################################################
[v3_req]

# Extensions to add to a certificate request
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment

## Key Usage (Schlüsselverwendung)
# decipherOnly: Ist keyAgreement gesetzt, darf der Public-Key innerhalb eines Schlüsselaustausche zur Entschlüsselung von Daten verwendet werden. Andernfalls undefiniert.
# encipherOnly: Ist keyAgreement gesetzt, darf der Public-Key innerhalb eines Schlüselaustausches zur Verschlüsselung von Daten verwendet werden. Andernfalls undefiniert.
# cRLSign: Public-Key kann verwendet werden, um CRLs zu verifizieren.
# keysCertSign: Public-Key kann verwendet werden, um Zertifikate zu verifizieren.
# keyAgreement: Zur Verwendung beim Schlüsselaustausch.
# dataEncipherment: Zur Verwendung von „normalen“ Daten, also kein Schlüsseln.
# keyEncipherment: Public-Key wird zum Schlüsselmanagement verwendet.
# nonRepudiation: Key zur Prüfung von „bewußten“ Signaturen (außer CRLs und bei Zertifikaten).
# digitalSignature: Key zur Prüfung von „automatischen“ Signaturen (außer CRLs und bei Zertifikaten).
## keyUsage = [critical,] [decipherOnly,] [encipherOnly,] [cRLSign,] [keysCertSign,] [keyAgreement,] [dataEncipherment,] [keyEncipherment,] [nonRepudiation,] [digitalSignature]

## Extended Key Usage (Erweiterte Schlüsselverwendung)
# serverAuth: Authentisierung von Web-Servern durch Web-Clients
# clientAuth: Authentisierung von Web-Clients durch Web-Server
# codeSigning: Key zur Signierung von Programm-Code
# emailProtection: Key zur Verwendung mit S/MIME-Software
# timStamping: Signierung von Objekt-Hashwerten und zugehörigen vertrauenswürdigen Zeitstempeln

## Microsoft-Extensions
# msCodeInd: Individual Code Signing
# msCodeCom: Commercial Code Signing
# msCTLSign: Trust List Sign
# msSGC: Server-Zertifikat mit „Global Server ID“
# msEFS: Verschlüsselung von symmetrischen Keys zur Dateisystem-Verschlüselung

## Netscape-Extensions
# nsSGC: Server-Zertifikat mit "Global Server ID"
## keyUsage = [critical,] [serverAuth,] [clientAuth,] [codeSigning,] [emailProtection,] [timeStamping,] [msCodeInd,] [msCodeCom,] [msCTLSign,] [msSGC,] [msEFS,] [nsSGC,] [OID]

# [v3_req]
# Extensions to add to a certificate request
# basicConstraints = CA:FALSE
# keyUsage = nonRepudiation, digitalSignature, keyEncipherment
# subjectAltName = @alt_names

# [alt_names]
# DNS.1 = servername.domain.de
# DNS.2 = servername
# DNS.3 =
# IP.1 = 192.168.xxx.yyy
# IP.2 = 192.168.yyy.zzz
# IP.3 =
####################################################################
[root_ca]

subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
basicConstraints = critical, CA:true, pathlen:1
keyUsage = cRLSign, keyCertSign
subjectAltName=email:copy

# URI of the CA certificate 
authorityInfoAccess = caIssuers;URI:http://server.domain.de/RootCA.html
crlDistributionPoints=URI:http://server.domain.de/RootCA.crl
####################################################################
[issuingca_cert]

subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
basicConstraints = critical, CA:true, pathlen:0
keyUsage = cRLSign, keyCertSign
subjectAltName=email:copy

# URI of the CA certificate 
authorityInfoAccess = caIssuers;URI:http://server.domain.de/IssuingCA.html
crlDistributionPoints=URI:http://server.domain.de/IssuingCA.crl
####################################################################
[user_cert]

basicConstraints=CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
subjectAltName=email:copy
extendedKeyUsage = clientAuth, emailProtection, codeSigning

# URI of the CA certificate 
authorityInfoAccess = caIssuers;URI:http://server.domain.de/IssuingCA.html
crlDistributionPoints=URI:http://server.domain.de/IssuingCA.crl 
####################################################################
[server_cert]

basicConstraints=CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth

# URI of the CA certificate 
authorityInfoAccess = caIssuers;URI:http://server.domain.de/IssuingCA.html 
crlDistributionPoints=URI:http://server.domain.de/IssuingCA.crl
####################################################################
[crl_ext]

authorityKeyIdentifier=keyid:always
####################################################################

Root Certificate Authority einrichten

## Ordnerstruktur für die RootCA anlegen
##
mkdir -p /opt/ca/RootCA
cd /opt/ca/RootCA

# certs - werden kopien der ausgestellten Zertifikate gespeichert
# crl -  wird eine kopie aller erstellen CRL’s gespeichert
# newcerts - wird eine kopie aller Zertifikats Requeste gespeichert
# private - Wird der private Schlüssel der Zertifizierungsstelle gespeichert
# revoke - hierhin werden alle gesperrten Zertifikate verschoben

mkdir certs crl newcerts private revoke

touch index.txt
echo "01" > serial
echo "01" > crlnumber

chmod 0600 private/

## Hier wird ein Random Nummer für die spätere Schlüsselerstellung generiert
##
openssl rand -out private/.randRootCA 8192
chmod 0400 private/.randRootCA

## Privaten Key für RootCA erstellen
##
openssl genrsa -aes256 -out private/RootCA.key 4096 -rand private/.randRootCA
2 x Passphrase eingeben (Hier sollte in einer Live Umgebung ein sehr komplexes Kennwort von min. 15-20 Stellen verwendet werden)
chmod 0400 private/RootCA.key

## Erstelle das Selbssignierte RootCA Zertifikat
##
openssl req -new -x509 -days 3650 -sha512 -key private/RootCA.key -out RootCA.crt -config ca-config.cnf
2 x Passphrase eingeben

Country Name (2 letter code) [DE]:DE
State or Province Name (Bayern) [Some-State]:Bayern
Locality Name (eg, Muenchen) []:Muenchen
Organization Name (eg, company) [Example Organisation]:HTDOM Company GmbH
Organizational Unit Name (eg, section) []:IT-Security
Common Name (e.g. server FQDN or YOUR name) []:HTDOM Root Certificate Authority
Email Address []:

Issuing Certificate Authority einrichten

## Ordnerstruktur für die IssuingCA anlegen
##
mkdir /opt/ca/IssuingCA
cd /opt/ca/IssuingCA
cp /opt/ca/RootCA/ca-config.cnf .

# certs - werden kopien der ausgestellten Zertifikate gespeichert
# crl -  wird eine kopie aller erstellen CRL’s gespeichert
# newcerts - wird eine kopie aller Zertifikat Requeste gespeichert
# private - wird der private Schlüssel der Zertifizierungsstelle gespeichert
# revoke - hier werden alle gesperrten zertifikate verschoben

mkdir certs crl newcerts private revoke

touch index.txt
echo "01" > serial
echo "01" > crlnumber

chmod 0600 private/

## Hier wird ein Random Nummer für die spätere Schlüsselerstellung generiert
##
openssl rand -out private/.randIssuingCA 8192
chmod 0400 private/.randIssuingCA

## Privaten Key für IssuingCA erstellen
##
openssl genrsa -aes256 -out private/IssuingCA.key 4096 -rand private/.randIssuingCA
2 x Passphrase eingeben (Hier sollte in einer Live Umgebung ein sehr komplexes Kennwort von min. 15-20 Stellen verwendet werden)
chmod 0400 private/IssuingCA.key

## Ertselle einen Zertifikat Request, der von der RootCA signiert wird.
##
openssl req -new -key private/IssuingCA.key -out newcerts/IssuingCA-Request.csr -config ca-config.cnf
2 x Passphrase eingeben

Country Name (2 letter code) [DE]:DE
State or Province Name (Bayern) [Some-State]:Bayern
Locality Name (eg, Muenchen) []:Muenchen
Organization Name (eg, company) [Example Organisation]:HTDOM Company GmbH
Organizational Unit Name (eg, section) []:IT-Security
Common Name (e.g. server FQDN or YOUR name) []:HTDOM Issuing Certificate Authority
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Issuing Certificate Request genemigen

cd /opt/ca/RootCA

## Zertifikats Request der IssuingCA bei der RootCA signieren
##
openssl ca -name RootCA -in /opt/ca/IssuingCA/newcerts/IssuingCA-Request.csr -out /opt/ca/RootCA/certs/IssuingCA.crt -extensions issuingca_cert -config ca-config.cnf

Using configuration from ca-config.cnf
Enter pass phrase for /opt/ca/RootCA/private/RootCA.key:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Sep 19 20:19:10 2016 GMT
            Not After : Sep 17 20:19:10 2026 GMT
        Subject:
            countryName               = DE
            stateOrProvinceName       = Bayern
            localityName              = Muenchen
            organizationName          = HTDOM Company GmbH
            organizationalUnitName    = IT-Security
            commonName                = HTDOM Issuing Certificate Authority
            emailAddress              = 
        X509v3 extensions:
            X509v3 Subject Key Identifier: 
                98:D9:DE:BB:D1:27:44:51:B3:F0:07:BD:95:59:39:3A:24:14:10:29
            X509v3 Authority Key Identifier: 
                keyid:7A:D8:D3:65:45:3F:C6:FF:7D:91:1F:15:53:6D:F8:0D:BA:E7:E3:8F

            X509v3 Basic Constraints: critical
                CA:TRUE, pathlen:0
            X509v3 Key Usage: 
                Certificate Sign, CRL Sign
            X509v3 Subject Alternative Name: 
                email:
            Authority Information Access: 
                CA Issuers - URI:http://server.domain.de/RootCA.html

            X509v3 CRL Distribution Points: 

                Full Name:
                  URI:http://server.domain.de/RootCA.crl

Certificate is to be certified until Sep 17 20:19:10 2026 GMT (3650 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

Webserver Zertifikat erstellen

cd /opt/ca/IssuingCA

openssl genrsa -aes256 -out private/webserver01_htdom_local.key 2048 -rand private/.randIssuingCA
chmod 0400 private/webserver01_htdom_local.key
 
openssl req -new -key private/webserver01_htdom_local.key -out newcerts/webserver01_htdom_local.csr -config ca-config.cnf

openssl ca -name IssuingCA -in newcerts/webserver01_htdom_local.csr -out certs/webserver01_htdom_local.crt -extensions server_cert -config ca-config.cnf

Using configuration from ca-config.cnf
Enter pass phrase for /opt/ca/IssuingCA/private/IssuingCA.key:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Sep 19 20:54:03 2016 GMT
            Not After : Sep 17 20:54:03 2026 GMT
        Subject:
            countryName               = DE
            stateOrProvinceName       = Bayern
            organizationName          = HTDOM Company GmbH
            organizationalUnitName    = IT-Support
            commonName                = webserver01.htdom.local
            emailAddress              = 
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            X509v3 Key Usage: 
                Digital Signature, Non Repudiation, Key Encipherment, Data Encipherment
            X509v3 Extended Key Usage: 
                TLS Web Server Authentication
            Authority Information Access: 
                CA Issuers - URI:http://server.domain.de/RootCA.html

            X509v3 CRL Distribution Points: 

                Full Name:
                  URI:http://server.domain.de/RootCA.crl

Certificate is to be certified until Sep 17 20:54:03 2026 GMT (3650 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

Certification Revocation List erstellen

## Unabhängig ob gesperrte Zertifikate existieren oder nicht sollte eine Sperrliste für das Root/Issuing Zertifikat erstellt werden
##
cd /opt/ca/RootCA
openssl ca -config ca-config.cnf -gencrl -out RootCA.crl

cd /opt/ca/IssuingCA
openssl ca -config ca-config.cnf -gencrl -out IssuingCA.crl

Zertifikate wiederrufen

## Wird ein Zertifikat gesperrt, so ist die Sperrung in index.txt einzutragen
##
cd /opt/ca/IssuingCA
openssl ca -config ca-config.cnf -revoke certs/webserver01_htdom_local.crt

Nützliche Befehle

## Zertifikate und Private Keys überprüfen
##
## In diesen Beispiel wir der Private Key überprüft ob dieser mit dem Zertifikat zusammenpasst
## In dem Abschnitt modules, sieht man den Privaten Key
##
openssl x509 -noout -text -in /opt/ca/RootCA/RootCA.crt | less
openssl rsa -noout -text -in /opt/ca/RootCA/private/RootCA.key | less
Passphrase

modulus:
  00:ce:50:8a:8d:5e:8b:8d:47:38:b4:b0:25:d2:57:
  ...
  1b:56:ff

Modulus:
  00:ce:50:8a:8d:5e:8b:8d:47:38:b4:b0:25:d2:57:
  ...
  1b:56:ff

openssl x509 -noout -text -in /opt/ca/IssuingCA/IssuingCA.crt | less
openssl rsa -noout -text -in /opt/ca/IssuingCA/private/IssuingCA.key | less
Passphrase

## Zertifikatsrequest überprüfen, ob alle Angaben passen.
##
openssl req -noout -text -in /opt/ca/IssuingCA/newcerts/IssuingCA-Request.csr | less


## RootCA und IssuingCA Zertifikat überprüfen
##
openssl verify -CAfile /opt/ca/RootCA/RootCA.crt /opt/ca/IssuingCA/IssuingCA.crt
/opt/ca/IssuingCA/IssuingCA.crt: OK


## Zertifikat Chain aus RootCA und IssuingCA bilden
##
cat /opt/ca/IssuingCA/IssuingCA.crt /opt/ca/RootCA/RootCA.crt > /opt/ca/IssuingCA/HTDOM_IssuingCA_Chain.crt
chmod 444 /opt/ca/IssuingCA/HTDOM_IssuingCA_Chain.crt


## RootCA Zertifikat auf Windows Rechner downloaden und installieren
##
cat /opt/ca/RootCA/RootCA.crt | sed -n -e '/BEGIN\ CERTIFICATE/,/END\ CERTIFICATE/ p'

-----BEGIN CERTIFICATE-----
MIIGlzCCBH+gAwIBAgIJAMEh+l6C/y+PMA0GCSqGSIb3DQEBDQUAMIGPMQswCQYD
...
GPKo9XOLXNQhcWvo9J4cekWimz8z1Aj1YkEFkwKopY0+549r1W+H+OnZ1u0d77Zt
iw4t1xMigeji4qU=
-----END CERTIFICATE-----

## Zertifikat Chain auf Windows Rechner downloaden und installieren
##
cat /opt/ca/IssuingCA/HTDOM_IssuingCA_Chain.crt | sed -n -e '/BEGIN\ CERTIFICATE/,/END\ CERTIFICATE/ p'

-----BEGIN CERTIFICATE-----
MIIGmDCCBICgAwIBAgIBATANBgkqhkiG9w0BAQ0FADCBjzELMAkGA1UEBhMCREUx
...
Jt3lzRluOVcEZY4m
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIGlzCCBH+gAwIBAgIJAMEh+l6C/y+PMA0GCSqGSIb3DQEBDQUAMIGPMQswCQYD
...
iw4t1xMigeji4qU=
-----END CERTIFICATE-----

Da kein Computer dieser Welt unsere CA kennt, müssen wir natürlich das Root CA Zertifikat und Issuing CA Zertifikat auf jeden Computer installieren.
Dazu lege ich mir eine RootCA.txt und eine IssuingCA.txt Datei lokal auf dem Computer an und hole mir wie oben beschrieben die Zertifikatsinformationen.

Wenn beide Text Dateien gefüllt sind, werden dies in *.crt umbenannt, danach installiere ich diese unter Windows in den passenden Zertifikatsspeicher.
Das RootCA Zertifikat wird in den „Vertrauenswürdige Stammzertifizierungsstelle“ installiert.

 

 

 

 

 

Und das Issuing CA Zertifikat wird unter „Zwischenzertifizierungsstelle“ installiert.

 

 

 

 

 

Wenn beide Zertifikate sauber installiert wurde, kann man sich das Zertifikat ansehen, in dem das man es doppelklickt und sich alle Informationen ansieht.

 

 

 

 

 

Unter Linux ist das ganze ein bisschen einfacher, hierzu kopiert man beide Zertifikate in den Zertifikatsspeicher und lässt ein Update laufen, danach sind dem Linux Server/Client die Zertifikate bekannt.

cp /opt/ca/RootCA/RootCA.crt /usr/local/share/ca-certificates/
cp /opt/ca/IssuingCA/HTDOM_IssuingCA_Chain.crt /usr/local/share/ca-certificates/
update-ca-certificates
Updating certificates in /etc/ssl/certs...
2 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.

ls -la /etc/ssl/certs/RootCA*
lrwxrwxrwx 1 root root 43 Jan 22 12:57 /etc/ssl/certs/RootCA.pem -> /usr/local/share/ca-certificates/RootCA.crt

ls -la /etc/ssl/certs/HTDOM_IssuingCA_Chain.pem
lrwxrwxrwx 1 root root 58 Jan 22 12:57 /etc/ssl/certs/HTDOM_IssuingCA_Chain.pem -> /usr/local/share/ca-certificates/HTDOM_IssuingCA_Chain.crt

So nun viel Spaß beim ausprobieren.

Viele Grüße
Helmut

 

 

 

 

 

Nach der Grundinstallation von Ubuntu 16.04 LTS Desktop, wird das System auf den neusten Stand gebracht.

sudo su - oder sudo -i
apt update -y && apt upgrade -y

Nach dem das System up to date ist, kann man manuell die Netzwerkkarte konfigurieren, wichtig ist hier das der DNS Server vom Domaincontroller angesprochen wird.

cp /etc/hosts{,.old}
nano /etc/hosts

##### /etc/hosts ##################################
127.0.0.1 localhost
192.168.xxx.xxx clienthostname.htdom.local clienthostname
192.168.xxx.xxx ads01.htdom.local ads01 htdom.local
###################################################

dig -t SRV _ldap._tcp.htdom.local | grep -A2 "ANSWER SECTION

;; ANSWER SECTION:
_ldap._tcp.htdom.local. 600 IN SRV 0 100 389 ads01.htdom.local.

apt install fping

fping ads01.htdom.local
fping htdom.local
fping ads01
ads01.htdom.local is alive

Wenn der DNS Server für den Client konfiguriert wurde, installieren wir alle benötigten Pakete um den Client an das AD anzubinden.

apt install realmd sssd sssd-tools samba-common krb5-user packagekit samba-common-bin samba-libs adcli ntp vim -y

NTP Service konfigurieren

cp /etc/ntp.{conf,old}
nano /etc/ntp.conf

##### /etc/ntp.conf ###############################
server ads01.htdom.local
################################################### 

systemctl start ntp.service
systemctl status ntp.service

Realmd konfigurieren

nano /etc/realmd.conf

##### /etc/realmd.conf ############################
[users]
default-home = /home/%D/%U
  ## default-home = /home/%U@%D
  ## default-home = /nfs/home/%D-%U
default-shell = /bin/bash
  ## default-shell = /bin/sh

[active-directory]
default-client = sssd
  ## default-client = winbind
os-name = Ubuntu Linux Desktop
os-version = 16.04

[service]
automatic-install = no
  ## automatic-install = yes

[htdom.local]
computer-ou = OU=Clients,OU=Company,DC=htdom,DC=local
fully-qualified-names = no
automatic-id-mapping = yes
user-principal = yes
manage-system = no
###################################################

 

default-home: set the default homedir for each Active Directory User. In our example it will be something like /home/dom.example.int/domainuser.
default-shell: the default shell used by the users. bash is usually the preferred default shell.

default-client: we are using sssd in our scenario. winbind is also a possible option.
os-name: the operating system name as it will appear in our Active Directory.
os-version: the operating system version as it will appear in our Active Directory.

automatic-install: we want to prevent realmd to try to install its dependencies.

fully-qualified-names: this will allow users to use just their username instead of the combination of domain and username. For example we can use the username domainuser instead of DOM\domainuser or domainuser@dom.example.int. Note, however, that this could cause conflicts with local users, if they have the same username as a domain user.
automatic-id-mapping: this option will auto-generate the user and group ids (UID, GID) for newly created users, if set to yes.
user-principal: this will set the necessary attributes for the Ubuntu machine when it joins the domain.
manage-system: if you don’t want policies from the Active Directory environment to be applied on this machine, set this option to no.

 

Kerberos konfigurieren

cp /etc/krb5.{conf,old} && rm -rf /etc/krb5.conf
nano /etc/krb5.conf

##### /etc/krb5.conf ##############################
[logging]
	default = FILE:/var/log/krb5/krb5.log
	kdc = FILE:/var/log/krb5/krb5kdc.log
	admin_server = FILE:/var/log/krb5/kadmind.log

[libdefaults] 
	default_realm = HTDOM.LOCAL
	clockskew = 300

## The following krb5.conf variables are only for MIT Kerberos. 
	kdc_timesync = 1 
	ccache_type = 4 
	forwardable = true 
	proxiable = true 

[realms] 
	HTDOM.LOCAL = {
	kdc = ads01.htdom.local
  default_domain = htdom.local
  admin_server = ads01.htdom.local
}
 
[domain_realm] 
	.htdom.local = HTDOM.LOCAL
	htdom.local = HTDOM.LOCAL
###################################################

Client zur Domain hinzufügen

realm discover htdom.local
realm --verbose join htdom.local --user-principal=administrator@HTDOM.LOCAL

## Wer darf sich am System anmelden?
realm deny --all
realm permit helmut.thurnhofer
realm list

## Alle Domainadmins dürfen sich am System anmelden.
realm permit --groups Domänen-Admins@htdom.local

## Domain Admins der sudoers hinzufügen
visudo
%Domänen-Admins@htdom.local ALL=(ALL:ALL) ALL

AD Account berechtigen
usermod -a -G adm,cdrom,sudo,dip,plugdev,lpadmin,sambashare username

SSSD konfigurieren

cat /etc/sssd/sssd.conf

## cp /etc/sssd/sssd.{conf,old} && rm -rf /etc/sssd/sssd.conf
## nano /etc/sssd/sssd.conf

### /etc/sssd/sssd.conf ###########################
[sssd]
  domains = htdom.local
  config_file_version = 2
  services = nss, pam

[domain/htdom.local]
  ad_domain = htdom.local
  krb5_realm = HTDOM.LOCAL
  realmd_tags = joined-with-adcli
  cache_credentials = True
  id_provider = ad
  krb5_store_password_if_offline = True
  default_shell = /bin/bash
  ldap_id_mapping = True
  use_fully_qualified_names = False
  fallback_homedir = /home/%d/%u
  simple_allow_users = $
  access_provider = simple
###################################################

ls -la /etc/sssd/sssd.conf
-rw------- 1 root root 486 Sep 18 01:07 /etc/sssd/sssd.conf
## chown root:root /etc/sssd/sssd.conf
## chmod 600 /etc/sssd/sssd.conf

systemctl start sssd.service
systemctl enable sssd.service
systemctl status sssd.service

Pam common-session konfigurieren für das Home Laufwerk

cp /etc/pam.d/common-session /etc/pam.d/common-session.old
nano /etc/pam.d/common-session

session required pam_mkhomedir.so umask=0022 skel=/etc/skel
## echo "session required pam_mkhomedir.so skel=/etc/skel/ umask=0022" | sudo tee -a /etc/pam.d/common-session

Ubuntu 16.04 Login anpassen

nano /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf

greeter-show-manual-login=true
greeter-hide-users=true

So das war es schon wieder

Viel Spaß damit
Gruß Helmut

Hallo zusammen,

in dem heutigen Blogeintrag möchte ich euch zeigen wie Ihr Debian basierende Software-Distributionen, dazu gehören Debian 8, Linux Mint und Ubuntu an das Microsoft Active Directory 2012 anbinden könnt.

In der Vergangenheit habe ich bereits ein paar Blogeinträge zu dem Thema gemacht:

Ubuntu 11.10/12.04 Desktop in das Microsoft Active Directory einbinden
Debian 7 an das Active Directory anbinden

Im großen und Ganzen hat sich nicht viel verändert, außer das wir diesmal auf der Microsoft Seite nichts mehr verändern und hinzufügen müssen.
Unter Active Directory 2008 R2 mussten wir noch die „Identity Management für UNIX“ Features installieren und die Gruppenrichtlinien anpassen, dies fällt unter 2012 R2 weg, da Microsoft das „Identity Management für UNIX“ Feature nicht mehr mit an Board hat.

Alles was wir auf der Linux Seite benötigen ist NTP, Kerberos 5, Samba und Winbind und ein paar Tools für das testen der Verbindung.

Ich starte hier mit der Linux Mint 17.1 Distribution.

1

 

 

 

 

 
Nachdem das Betriebssystem installiert wurde, bringen wir das System mit update/upgrade auf den neusten Stand.

apt-get update && apt-get upgrade

Mit folgender Kommandozeile installieren wir uns alle passenden Pakete dir wir für die Verbindung zu Active Directory benötigen.

NTP für die Zeitsynchronisation
Kerberos 5 für das Kerberos Ticket und die ADS Authentifizierung
Winbind für die NT-Kontenverwaltung
Samba um der Domain beitreten zu können
LDAP Utilites für einen LDAP Test gegen das Active Directory

apt-get install ntp ntpdate krb5-user libpam-krb5 krb5-doc winbind libnss-winbind libpam-winbind samba smbclient ldap-utils

Wenn alle Paket sauber installiert wurden, beginnen wir auch schon mit der Konfiguration.

Im ersten Schritt passe ich die /etc/hosts an

nano /etc/hosts
127.0.0.1 localhost.localdomain localhost
192.168.178.105 mint01.htdom.local mint01
192.168.178.101 ads01.htdom.local ads01 htdom.local

1_1

 

 

 

 

 
#Kerberos 5 konfigurieren

cp /etc/krb5.{conf,old} && rm /etc/krb5.conf
nano /etc/krb5.conf
[logging]
        default = FILE:/var/log/krb5/krb5.log
        kdc = FILE:/var/log/krb5/krb5kdc.log
        admin_server = FILE:/var/log/krb5/kadmind.log

[libdefaults]
        default_realm = HTDOM.LOCAL
        clockskew = 300
        kdc_timesync = 1
        ccache_type = 4
        forwardable = true
        proxiable = true

[realms]
        HTDOM.LOCAL = {
                kdc = ads01.htdom.local
                default_domain = htdom.local
                admin_server = ads01.htdom.local
        }

[domain_realm]
        .htdom.local = HTDOM.LOCAL
        htdom.local = HTDOM.LOCAL

# Samba konfigurieren

cp /etc/samba/smb.{conf,old} && rm /etc/samba/smb.conf
nano /etc/samba/smb.conf
[global]
security = ads
realm = HTDOM.LOCAL
password server = 192.168.178.101
workgroup = HTDOM
netbios name = MINT01
server string = %h server
load printers = no
local master = no
domain master = no
preferred master = no
dns proxy = no
winbind uid = 10000-20000
winbind gid = 10000-20000
winbind use default domain = yes
interfaces = eth0 lo
syslog = 0
log file = /var/log/samba/log.%m
max log size = 1000
panic action = /usr/share/samba/panic-action %d
invalid users = root
template homedir = /home/%D/%U
template shell = /bin/bash
winbind offline logon = yes
winbind refresh tickets = yes
/etc/init.d/samba restart

Nach dem diese beiden Dateien konfiguriert wurden, starten wir den Client neu.

Danch überprüfen wir ob wir zur Domain eine Verbindung herstellen können

kinit administrator@HTDOM.LOCAL (Passwort)
klist

2

 

 

 

 

ldapsearch -h 192.168.178.101 -b DC=htdom,DC=local -D administrator@htdom.local -W -x (Passwort)

3

 

 

 

 

 
Wenn das der Fall ist, können wir der Domain beitreten

net ads join -U Administrator (Passwort)

Nach erfolgreichen Domain Join sollte der Computer im AD unter Computers auftauchen

4

 

 

 

 

 
Nun können wir noch folgende Abfragen testen.

wbinfo -u (Gibt eine Lister alle Domain Benutzer aus)
wbinfo -g (Gibt eine Lister alle Domain Gruppen aus)

In der nsswitch.conf nehmen wir die Konfiguration der Authentication vor

# nsswitch konfigurieren

cp /etc/nsswitch.{conf,old} && rm /etc/nsswitch.conf
nano /etc/nsswitch.conf
# Example configuration of GNU Name Service Switch functionality.
 
passwd:         compat winbind
group:          compat winbind
shadow:         compat
 
hosts:          files dns wins
networks:       files
 
protocols:      db files
services:       db files
ethers:         db files
rpc:            db files
 
netgroup:       nis

Und in der common-session legen wir fest, das ein Homelaufwerk automatisch angelegt wird, wenn sich ein neuer Domain Benutzer am Linux Client anmeldet.

# common-session konfigurieren für die Automatische Home Verzeichnis anlage

cp /etc/pam.d/common-session /etc/pam.d/common-session.old
nano /etc/pam.d/common-session
session required pam_mkhomedir.so umask=0022 skel=/etc/skel

5

 

 

 

 

 
6

 

 

 

 

 
Das war es auch schon, nun kann ich mich als Domänenbenutzer am Linux Client anmelden.

Viel Spaß
Gruß Helmut Thurnhofer

Hier möchte ich euch zeigen wie Ihr einen ICINGA 1.7.0 Server in einer Ubuntu 12.04 Microsoft Hyper-V Virtuellen Maschine installieren könnt.

Zusätzlich zeige ich euch wie Ihr eine Grundkonfiguration von ICINGA vornehmen könnt, wie Ihr den ICINGA Server in das Microsoft Active Directory einbinden könnt und wie Ihr manche Dienste/Services mit Perl Scripte abfragen könnt.

image

image

image

Wie immer findet ihr hier die passende Dokumentation zu dem Artikel –> ICINGA 1.7.0 in einer Virtuellen Umgebung mit UBUNTU 12.04 installieren

Mehr Anleitungen zu NAGIOS/ICINGA findet Ihr unter Server Howto’ s

Auch würde ich mich über Kommentare und Anregungen freuen, wie euch das Howto gefällt und ob ihr zurecht kommt.

Viele Grüße
Helmut

Da ich mich derzeit wieder mit der Monitoring Software ICINGA 1.6.1 beschäftige und die passende Dokumentation vorbereite, bin ich auf einen Punkt gestoßen der mich als Microsoft Administrator sehr freudig stimmt.
Linux Systeme in das Microsoft Active Directory System einbinden, welche Vorteile es am Ende hat muss sich noch rausstellen.

Hier ein kleiner Blog Eintrag wie sich das ganze bewerkstelligen lässt.

Nach einer Neuinstallation von Ubuntu 11.10/12.04 Desktop beginne ich mit der Vorbereitung:

Um sicher zu gehen das der Domaincontroller richtig aufgelöst wird, frage ich den DNS Server mit der Forward und Reverse Lookup Adresse ab.

host ads01
host 192.168.178.100
ping htdom.local
nslookup !$

image

Wenn das sauber funktioniert dann starte ich die Installation von Likewise, wenn nicht dann muss man noch kurz die /etc/hosts Datei anpassen, damit der ping auf die Domäne funktioniert.

image

Da ich eine *.local Domain für die Testumgebung nutze, muss ich noch die /etc/nsswitch.conf Datei anpassen. Die ursprüngliche Zeile hosts: kommentiere ich aus und schreib eine neue Zeile.

image

nano /etc/nsswitch.conf
hosts: files dns mdns4

Wenn das alles erledigt ist beginne ich die Installation.

sudo apt-get install likewise-open likewise-open-gui

Nach der Installation, nehme ich den ICINGA Server in der Domäne auf.

sudo domainjoin-cli join –ou ComputersUnix htdom.local Administrator

image

20 mal Probiert und es ist nix passiert. Smiley Die Integration bringt mir jetzt einen Undokumentierten Errorcode. Trotzdem funktionierte die Anlage vom Computerkonto im AD.
Mal sehen welche Auswirkungen der Fehler noch hat.

image

Ich habe die Integration mit mehreren Ubuntu Versionen (10.04, 10.10, 11.04, 12.04) getestet und immer eine Success Meldung bekommen, bei der jetzigen 11.10 tritt dieser Error Code auf.

image

Nach dem ersten reboot nach der Integration, teste ich den Domain Join In mit dem Befehl

sudo lw-get-status

image

Die Benutzerinformationen der Domäne kann ich noch mit folgenden Befehl abrufen

sudo lw-enum-users

image

Im nächsten Schritt melde ich mich auf den ICINGA Server mit einen Domänen Benutzer an.

image

image

Auch das scheint sauber zu funktionieren.

„Optional habe ich auch folgendes Script bei meinen vorigen Tests benutzt und es hat ebenfalls funktioniert.“

Auf folgender Webseite à http://www.beyondtrust.com/Technical-Support/Downloads/PowerBroker-Identity-Services-Open-Edition bekommt man die Software/Script „pbis-open-7.0.0.867.linux.x86.deb.sh“ Nach einer kurzen Registrierung bekommt man einen E-Mail zugesandt und kann im Anschluss das Script für die Ubuntu Umgebung downloaden.

Hier die Dokumentation die ich verwendet habe à http://www.beyondtrust.com/Technical-Support/Downloads/files/PBISO/Manuals/PBISO_Installation_and_Administration_Guide_V6.5/Default.htm

image

Nach dem Download, setzt man die Rechte für das Script und führt es im Anschluss mit Root-Rechten aus.

chmod a+x pbis-open-7.0.0.867.linux.x86.deb.sh
./pbis-open-7.0.0.867.linux.x86.deb.sh

Wenn das Script durchgelaufen ist, passt man noch die resolv.conf Datei im etc Verzeichnis an um den Richtigen DNS Server der Domäne anzusprechen. Wenn das vergessen wird funktioniert der Join In nicht! à Bis jetzt nur unter der Version 12.04 Beta nötig gewesen

sudo nano /etc/resolv.conf

„Mir ist aufgefallen, dass nach jeden Neustart von Ubuntu 12.04 Beta die resolv.conf vom System überschrieben wird. Um dieses zu vermeiden, kann man die Datei nach einer Änderung mit folgenden Befehl schützen“

Sperren –> chattr +i /etc/resolv.conf
Entsperren –> chattr -i /etc/resolv.conf

image

Auf was auch noch zu achten ist wäre die /etc/nsswitch.conf Datei, dort muss ein Eintrag verändert werden.

image

Unter hosts: muss der dns Eintrag nach files kommen, die ist nötig wenn man eine *.local Domänenendung hat. (Musste ich auch nachlesen weil der Domain Join In am Anfang nicht funktioniert hat.)

Um sicher zu gehen das der Domaincontroller richtig aufgelöst wird, frage ich den DNS Server mit der Forward und Reverse Lookup Adresse ab.

host ads01
host 192.168.178.100

image

Wenn das sauber funktioniert dann starte ich den Join in in die Domäne mit folgenden Befehl.

domainjoin-cli join htdom.local Administrator
Passwort nicht vergessen

image

image

Danach sollte der Join In funktioniert haben, wenn dem nicht so ist, dann passt irgendwas mit der Namensauflösung nicht.

Man kann noch bei der Fehlersuche das Loglevel anschalten:

sudo domainjoin-cli –loglevel verbose join htdom.local Administrator
gedit /var/log/auth.log

Mit folgenden Befehlen kann man überprüfen ob alles funktioniert hat

sudo /opt/pbis/bin/get-status

image

sudo domainjoin-cli query

image

sudo /opt/pbis/bin/get-dc-name htdom.local

image

sudo /opt/pbis/bin/find-user-by-name htdom\\Administrator
id htdom\\Administrator

image

Mit folgenden Befehl kann man sich die laufenden Services ansehen

sudo /opt/pbis/bin/lwsm list

Und mit folgenden Befehl kann man die Services durchstarten

sudo /opt/pbis/bin/lwsm restart lwio

image

Viel Spaß beim nachmachen und ich werde wieder Berichten.

Viele Grüße
Helmut

Hier möchte ich euch zeigen wie Ihr einen ICINGA 1.0.2 Server in einer Microsoft Hyper-V Virtuellen Maschine installieren könnt.
Zusätzlich zeige ich euch wie Ihr eine Grundkonfiguration von ICINGA vornehmen könnt und wie Ihr das neue ICINGA Web-Interface 1.0.1 installiert.

image

image

image

image

Hier der passende Link –> ICINGA 1.0.2 in einer Microsoft Hyper-V Maschine installieren

Mehr Anleitungen findet Ihr unter Server Howto’ s

Viele Grüße
Helmut