In diesem Beispiel wurde eine neue HDD ins System gehängt. Um das Volume später dynamisch vergrößern oder verkleinern (ext4) zu können, wollen wir diese per LVM verwalten. Hierzu erstellen wir erst eine physikalisches Volume, nehmen dieses in eine Volume Gruppe auf und erstellen daraus ein logisches Volume.
Kategorie: Linux Seite 3 von 5
Zeitserver auf Funktion prüfen
Windows
w32tm /stripchart /computer:pool.ntp.org w32tm /stripchart /computer:pool.ntp.org /dataonly /samples:5
Linux
ntpdate -q pool.ntp.org
Konfiguration
Windows
w32tm /config /manualpeerlist:"0.pool.ntp.org,1.pool.ntp.org,2.pool.ntp.org,3.pool.ntp.org" /syncfromflags:manual /reliable:yes /update w32tm /config /manualpeerlist:"ptbtime1.ptb.de,ptbtime2.ptb.de,ptbtime3.ptb.de" /syncfromflags:manual /reliable:yes /update
Debugging
Windows
w32tm /query /status w32tm /query /source
Linux
http://doc.ntp.org/3-5.93e/debug.html
Das Programm ntpq wird zur Diagnose des ntpd unter Linux verwendet. Analog zu Telnet ruft man das Programm auf und kann dann über die Eingabeaufforderung Kommandos absetzen.
Mit dem Programm ntpdate wird die Zeit per NTP gesetzt.
System mit Zeitserver synchronisieren
ntpdate -u zeitserver
Alle Peers anzeigen
ntpq> peers
remote refid st t when poll reach delay offset jitter
==============================================================================
*10.128.0.51 (s- .LOCL. 1 u 3 64 7 0.936 -11.794 8.177
+10.128.0.56 (s- 10.128.0.51 2 u 2 64 7 0.554 -17.542 6.136
xntp0.rrze.uni-e .GPS. 1 u - 64 7 8.293 -28145. 13.764
Der gegenwärtig gewählte Peer ist mit einem * gekennzeichnet. Peers, die als mögliche Kandidaten zum Peering angesehen werden, sind mit einem + gekennzeichnet.
Assoziationen anzeigen
ntpq> as ind assid status conf reach auth condition last_event cnt =========================================================== 1 46689 964a yes yes none sys.peer sys_peer 4 2 46690 943d yes yes none candidate 3 3 46691 913d yes yes none falsetick 3
Jede Zeile korresponidert mit der Zeile aus dem Kommando Peers. Details zu einzlnen Assiziationen zeigt man sich mit rv assid an.
Details eines Peers anzeigen
ntpq> rv 46691 associd=46691 status=913d conf, reach, sel_falsetick, 3 events, popcorn, srcadr=ntp0.rrze.uni-erlangen.de, srcport=123, dstadr=10.128.0.101, dstport=123, leap=00, stratum=1, precision=-21, rootdelay=0.000, rootdisp=1.022, refid=GPS, reftime=df61d20b.131e21ac Fri, Oct 5 2018 14:05:31.074, rec=df61d229.4b18f529 Fri, Oct 5 2018 14:06:01.293, reach=377, unreach=0, hmode=3, pmode=4, hpoll=6, ppoll=6, headway=311, flash=00 ok, keyid=0, offset=-28138.023, delay=7.960, dispersion=2.878, jitter=13.573, xleave=0.024, filtdelay= 8.17 7.96 75.01 9.45 10.79 8.23 8.29 7.98, filtoffset= -28138. -28138. -28171. -28138. -28143. -28136. -28145. -28147., filtdisp= 0.00 1.02 2.04 3.06 4.07 5.06 6.08 7.10
Bekannte Probleme mit NTP
maxdist
Es kann vorkommen, dass unter der Auflistung der Assoziationen unter condition reject angezeigt wird, unter last_event aber reachable. Unter den Details wird flash=400 peer_dist angezeigt.
ntpq> as ind assid status conf reach auth condition last_event cnt =========================================================== 1 1282 9024 yes yes none reject reachable 2 2 1283 9024 yes yes none reject reachable 2 3 1284 963a yes yes none sys.peer sys_peer 3
Lösung
in der ntp.conf folgenden Wert setzen:
tos maxdist 200
Um die Ausgabe von ls in Farbe anzuzeigen, einfach die ~/.bashrc öffnen und die die entsprechenden auskommentierten Zeilen setzen. Bei Debian 9 ist es
# You may uncomment the following lines if you want `ls' to be colorized: # export LS_OPTIONS='--color=auto' # eval "`dircolors`" # alias ls='ls $LS_OPTIONS' # alias ll='ls $LS_OPTIONS -l' # alias l='ls $LS_OPTIONS -lA' # # Some more alias to avoid making mistakes: # alias rm='rm -i' # alias cp='cp -i' # alias mv='mv -i'
Verbinden per mount
mount -t cifs -o username=benutzer,password=PW,domain=domain.com //10.0.0.1/Freigabe /mnt
Wenn man das Passwort weg lässt, wird nach dem Absetzen des Kommandos das Passwort abgefragt. Nach dem Mount stehen die üblichen Linux Kommandos zur Verfügung.
Verbinden per smbclient
smbclient verhält sich wie FTP. Pro Aufruf kann nur eine Datei übergeben werden.
smbclient -U benutzername%passwort //10.0.0.1/Freigabe --directory "Unterverzeichnis von Freigabe" -c 'put "test.pdf"'
Mit dem –directory Parameter wird ein Unterverzeichnis innerhalb der Freigabe angegeben.
Kopieren eines kompletten Verzeichnisses per smbclient
Bei meinen Tests konnte ich keine Dateien mit Lehrzeichen kopieren, daher ist diese Methode untauglich. Entweder mounten oder jede einzelne Datei per smblient, wie oben beschrieben, kopieren. Wobei das Mounten deutlich komfortabler ist und nach dem Mount die üblichen Linux Kommandos zur Verfügung stehen.
Laut der manpage für smbclient benötigt man das commando mget um Dateien auf das System zu kopieren und mput, um Dateien von dem System in ein Remoteverzeichnis zu kopieren. Mask und Recursion muss gesetzt sein. Dann welchselt man mit cd in das Verzeichnis, welches kopiert werden soll.
smbclient '\\server\freigabe' mask "" recurse ON prompt OFF cd 'pfad\zum\remote\ziel' lcd '~/lokaler/pfad/' mput *
Alles in einer Zeile:
smbclient -U benutzername%passwort '\\server\freigabe' -c 'prompt OFF;recurse ON;cd 'path\to\directory\';lcd '~/path/to/download/to/';mget *'
Das Paket sudo muss installiert sein.
man sudoers
# /etc/sudoers Defaults lecture_file = /etc/sudoers.lecture Defaults lecture = always # lecture nicht nur einmal anzeigen
In dieser Anleitung fasse ich die Schritte zusammen, die Unter Debian 9 nötig waren, um eine Sambafreigabe mit einer Active Directory Integration zur Benutzerauthentifizierung zu realisieren. Die einrichtung eines Domain Controllers, der das AD bereit stellt, ist ein anderes Thema.
Achtung: SMBv2 aktivieren
Samba versucht in den von mir bisher eingestezten Versionen per Default über SMBv1 zu kommunizieren und wird bei neueren Windows Versionen damit scheitern. SMBv1 ist dort aufgrund der bekannten Schwachstellen abgeschaltet. Um Samba auf neuere Versionen von SMB zu zwingen fügt man in der Konfigurationsdatei smb.conf (/etc/samba/smb.conf) folgende Zeile hinzu, in der Section [global]:
min protocol = SMB2
Vorbereitung
Auf folgende Schritte gehe ich hier nicht weiter ein, weil die klar seien sollten:
- Debian 9 installieren
- Netzwerk konfigurieren
- /etc/motd anpassen (weil die Copyright Info nach jedem Login einfach nervt)
- SSH-Server installieren und Root-Zugang blockieren
Erforderliche Pakete installieren
Wir benötigen folgende Pakete:
- ntp (Network Time Protokoll)
- krb5-user (Authentifizierung der Benutzer über das Kerberos Protokoll)
- samba (der Samba Server)
- smbclient (der Samba Client)
- winbind (stellt die Mechanismen der Authentifizierung für Windows-Domänen bereit)
- libnss-winbind (winbind Support für nsswitch)
- libpam-winbind (winbind Support für PAM)
apt-get install ntp krb5-user samba smbclient winbind libnss-winbind libpam-winbind
NTP und DNS konfigurieren
Kerberos, also auch Active Directory, ist sehr empfindlich, wenn es um Zeit geht. Wir nutzen als NTP Server also unseren Active Directory NTP Server.
# /etc/resolv.conf
domain domain.com
search domain.com
nameserver 10.5.5.51
nameserver 10.5.5.52
# /etc/network/interfaces
iface eth0 inet static
[...]
dns-nameservers 10.5.5.51 10.5.5.56
dns-search domain.com
Kerberos konfigurieren
Kerberos ist ein Ticketbasierter Mechanismus, zur Authentifizierung von Benutzern über ein unsicheres Netzwerk. Die Architektur folgt dem Client-Server-Modell.
Microsoft hat einen Artikel darüber, wie Kerberos im Active Directory verwendet wird
Wir müssen Kerberos konfigurieren, um die AD-Benutzer auf dem Linuxsystem authentifizieren zu können.
- DOMAIN.COM mit eigener Domain ersetzen (Wichtig: alles groß geschrieben!)
- kdc mit IP des Domain Controllers ersetzen
# /etc/krb5.conf
[libdefaults]
ticket_lifetime = 24h
default_realm = DOMAIN.COM
forwardable = true
[realms]
DOMAIN.COM = {
kdc = 10.5.5.51
default_domain = DOMAIN.COM
}
[domain_realm]
.domain.com = DOMAIN.COM
domain.com = DOMAIN.COM
[kdc]
profile = /etc/krb5kdc/kdc.conf
[appdefaults]
pam = {
debug = false
ticket_lifetime = 36000
renew_lifetime = 36000
forwardable = true
krb4_convert = false
}
[logging]
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmin.log
default = FILE:/var/log/krb5lib.log
Es muss kein Dienst neu gestartet werden. Wir prüfen nun mit dem Befehl kinit, ob die Kerberos-Konfiguration richtig ist, indem wir ein Ticket für einen Active Directory Benutzer anfordern.
kinit Benutzer Password for Benutzer@DOMAIN.COM:
Mit dem Befehl klist prüfen wir ob ein valides Ticket ergeben wurde
klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: Benutzer@DOMAIN.COM
Valid starting Expires Service principal
18.06.2018 18:02:28 19.06.2018 04:02:28 krbtgt/DOAMIN.COM@DOMAIN.COM
erneuern bis 19.06.2018 18:02:28
Nsswitch konfigurieren
Mit nsswitch lässt sich der Name Service Dispatcher konfigurieren. Wir konfigurieren ihn so, dass auch Benutzer aus dem Active Directory akzeptiert werden. Dies passwiert über den Umweg des Daemons winbindd. Samba nutzt winbind zur Nutzerauthentifizierung, nach dem Beitritt in die Domäne. Die Nutzung von winbind werden wir später auch in der Samba-Konfigurationsdatei konfigurieren. Folgende Zeilen sind anzupassen:
# /etc/nsswitch.conf
passwd: files winbind group: files winbind shadow: files winbind gshadow: files
Samba konfigurieren
# /etc/samba/smb.conf
[global]
security = ads
realm = DOMAIN.LOCAL
workgroup = HRG
idmap uid = 10000-20000
idmap gid = 10000-20000
winbind enum users = yes
winbind enum groups = yes
winbind cache time = 10
winbind use default domain = yes
template homedir = /home/%U
template shell = /bin/bash
client use spnego = yes
client ntlmv2 auth = yes
encrypt passwords = true
restrict anonymous = 2
domain master = no
local master = no
preferred master = no
os level = 0
load printers = no
printing = bsd
printcap name = /dev/null
disable spoolss = yes
min protocol = SMB2
[exampleshare]
comment = a comment
path = /home/exampleshare
browseable = yes
read only = no
writeable = yes
#inherit acls = yes
#inherit permissions = yes
create mask = 0660
directory mask = 0770
valid users = +"DOMAIN\Gruppe"
admin users = +"DOMAIN\Gruppe" <-- optionally define your ads groups with admin rights
Den Realm in der Konfig auf den korrekten Domänennamen anpassen.
Datei speichern und Dienste neu starten. Das unter path angegebene Verzeichnis muss die entsprechende Berechtigung haben, damit die AD-Gruppen dort rein schreiben dürfen. Evtl. muss man die Datei und Verzeichnismasken anpassen auf 0666 und 0777.
Der winbind Dienst wird versagen, wenn wir die Dienste neu starten, da wir der Domäne noch nicht beigetreten sind. Das holen wir im nächsten Schritt nach.
/etc/init.d/winbind restart /etc/init.d/nmbd restart /etc/init.d/smbd restart
Dazu erstellen wir ein Kerberos Ticket für einen Domänenadministrator und benutzen das Ticket, um der Domäne beitzutreten.
kinit Administrator net ads join -U administrator
Enter Administrators's password: Using short domain name -- DOMAIN Joined 'COMPUTERNAME' to dns domain 'domain.com' DNS Update for computername.domain.com failed: ERROR_DNS_UPDATE_FAILED DNS update failed: NT_STATUS_UNSUCCESSFUL
Dass die Fehlermeldung wegen dem DNS erscheint ist normal. Einfach manuell auf dem DNS Server einen A und einen PTR Record anlegen. Der PTR Record wird normalerweise sogar automatisch beim Erstellen des A Records mit angelegt.
Dienste neu starten. Sollte nun alles klappen.
/etc/init.d/winbind restart /etc/init.d/nmbd restart /etc/init.d/smbd restart
Update des PAM (Pluggable Auhtentication Module)
pam-auth-update
Prüfen ob die Vertrauensstellung gegeben ist:
wbinfo -t
Man kann sich nun über winbind die Benutzer und Gruppen innerhalb der Domäne anzeigen lassen.
wbinfo -u wbinfo -g
Nun prüfen wir ob auch nsswitch die AD Benutzer und Gruppen kennt. Es sollten die Benutzer und Gruppen des lokalen System UND des AD angezeigt werden. Wenn das nicht funktioniert in der /etc/nsswitch.conf auf files ändern (siehe oben).
getent passwd getent group
Samba Shares konfigurieren
Wir richten 3 Sahres ein.
- für die Buchhaltung(Backup Strategie nötig),
- als temporärer Datenspeicher, damit die Benutzer Datenaustauschen können (Löschstrategie nötig)
- für eine einzelne Person, zur verdeutlichung der Konfigurationsunterschiede. Sagen wir mal für den Chef.
Verzeichnisse anlegen
mkdir -p /sambashares/{daten,zwischenspeicher,chef}
chmod -R 0770 /sambashares/
chgrp -R "Domain Users" /sambashares/
Nun konfigurieren wir Samba
# /etc/samba/smb.conf
[Buchhaltung]
comment = Buchhaltung
path = /sambashares/buchhaltung
valid users = @DOMAIN\buchhaltung, @DOMAIN\vorstand
force group = buchhaltung
writable = yes
read only = no
force create mode = 0660
create mask = 0777
directory mask = 0777
force directory mode = 0770
access based share enum = yes
hide unreadable = yes
[zwischenspeicher]
comment = Daily Emptied Dropbox
path = /sambashares/zwischenspeicher
valid users = "@DOMAIN\Domain Users"
force group = "domain users"
writable = yes
read only = no
force create mode = 0660
create mask = 0777
directory mask = 0777
force directory mode = 0770
access based share enum = yes
hide unreadable = yes
[Chef]
comment = CEO Only
path = /sambashares/chef
valid users = EXAMPLE\chef
force group = "domain users"
writable = yes
read only = no
force create mode = 0660
create mask = 0777
directory mask = 0777
force directory mode = 0770
access based share enum = yes
hide unreadable = yes
Zu beachten ist folgendes:
- AD Gruppen wird ein @ vorangestellt, einzelnen Benutzern nicht.
- bei Leerzeichen im Gruppenname wird die Zeichenkette mit Anführungszeichen („) umschlossen.
Samba unterstützt auch die Rechtevergabe für Benutzer und Gruppen innerhalb eines Shares über Windows ACL’s oder POSIC ACL’s. Mehr dazu hier.
Danach Samba Dienst neu starten
/etc/init.d/smbd restart
Diese Anleitung basiert auf dem englischen Tutorial von Remy van Elst und wurde an ein paar Stellen korrigiert. Getestet mit Debian 9.
Die permanente Konfiguration erfolgt bei Debian Derivaten traditionell über die Datei /etc/network/Interfaces. Über das Kommando ifconfig, bzw. neuerdings ip a werden die Netzwerkschnittstellen ausgelesen. Zu diesen gibt es analog Einträge in der Datei /etc/network/Interfaces. Ich nenne das Interface mal eth0, was die frühere Bezeichnung für das erste Ethernet Interface war. Inzwischen vergeben die Systeme andere, oft zufällige, Namen.
Generelle Konfigurationsparameter
allow-hotplug eth0 (bei USB-Netzwerkkarten oder PCMCIA)
auto eth0 (bei fest eingebauten Karten, startet das Interface beim Booten)
Statisches Interface
auto eth0 iface eth0 inet static address 10.5.5.97/16 gateway 10.5.5.1 dns-nameservers 10.5.5.11 10.5.5.12 dns-search domain.net
DHCP
iface dhcp eth0 dhcp
Desktop Systeme
Auf Desktop-Systemen findet man oft den Network Manager vorinstalliert, der Netzwerkverbindungen verwalten kann und mit dem man zwischen verschiedenen Netzwerken umschalten kann. Z.B. LAN, WLAN, Bluetooth und Weitere.
Konfiguration über ifconfig
Man kann die Schnittstelle auch in der Shell über den Befehl ifconfig konfigurieren. Eine typische Konfiguration sähe dan so aus:
ifconfig eth0 10.128.0.1 netmask 255.255.0.0 up
Damit erhält die Schnittstelle eth0 die IP 10.128.0.1. Die DNS Server trägt man in der Datei /etc/resolv.conf ein. Das Routing setzt man mit dem Befehl route.
Achtung: Der Befehl ifconfig ist in neueren Distributionen nicht mehr verfügbar. Siehe dazu hier.
Routen setzen
Die Routen bestimmt man mit dem Befehl route.
Typische Routingtabelle auf einem Linux System.
root@nb:~# route -n Kernel-IP-Routentabelle Ziel Router Genmask Flags Metric Ref Use Iface 0.0.0.0 10.128.0.68 0.0.0.0 UG 600 0 0 wlan0 10.128.0.0 0.0.0.0 255.255.0.0 U 600 0 0 wlan0
Die erste Zeile gibt die Default Route zum Router an. Also die Route zum Internet. Bei mehreren Zielen ins selbe Netzwerk wird über die Metric entschieden, welche Route benutzt wird. Die kleinere Metric gewinnt.
Di ezweite Zeile gibt die Route ins internet Netz an.
Das Team von Docassemble hat eine sehr übersichtliche Dokumentation zu Docker erstellt, die ich hier als weiterführende Quelle verlinke.
https://docassemble.org/docs/docker.html
Installation
Ich nutze gerne Debian, daher hier die Dokumentation zur Installation von Docker unter Debian. Unter Ubuntu läuft die Installation wahrscheinlich ohne das Hinzufügen eines weiteren Repositories.
https://docs.docker.com/install/linux/docker-ce/debian/
Docker Container starten/stoppen
Starten
ACHTUNG: wenn das Paket/der Container noch nicht auf dem System installiert ist, lädt Docker das Repository von Github runter und startet es danach direkt.
Hier Beispielhaft für das Paket Docassemble, einem System zur Dokumentenerstellung. Ist der Container auf dem System nicht verfügbar, wird es von https://github.com/jhpyle/docassemble runtergeladen.
docker run -d -p 80:80 jhpyle/docassemble
-d: starte im Hintergrund als Daemon
-p: lausche auf Port x und leite den Traffic weiter an Container Port y
Es können weitere Konfigurationsparameter übergeben werden, wie z.B. ein persistentes Verzeichnis außerhalb des Docker Container, welches bestehen bleibt, wird der Container gelöscht. Auf diese Weise können auch Environment Variablen innerhalb des Docker Containers gestezt werden.
docker run --env-file=env.list -v dacerts:/usr/share/docassemble/certs -v dabackup:/usr/share/docassemble/backup -d -p 80:80 -p 443:443 jhpyle/docassemble
Auflisten der konfigurierten Docker Verzeichnisse
docker volume ls docker volume inspect dabackup
https://docassemble.org/docs/docker.html#persistent
Innerhalb des Containers wird beim Absetzen dieses Befehls folgendes Kommando ausgeführt:
/usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf
Stoppen
docker stop -t 60 <containerid>
-t: nach der angegebenen Zeit wird der Container hart beendet. Es wird nicht weiter darauf gewartet, dass die laufenden Dienste innerhalb des Containers sich beenden.
Laufende Docker Instanzen auflisten
docker ps
Über den Befehl werden auch die Container ID’s aufgelistet
Shell innerhalb eines Docker Containers starten
docker exec -t -i <containerid> /bin/bash
Innerhalb der Containerumgebung zeigt folgendes Kommando, welche Dienste gestartet sind
supervisorctl status
Deprecated command |
Replacement command(s) |
|---|---|
| arp | ip n (ip neighbor) |
| ifconfig | ip a (ip addr), ip link, ip -s (ip -stats) |
| iptunnel | ip tunnel |
| iwconfig | iw |
| nameif | ip link, ifrename |
| netstat | ss, ss -l (for netstat -l), ip route (for netstat-r), ip -s link (for netstat -i), ip maddr (for netstat-g)
ss -tlnp | cat (zeigt auch die Programme an, die auf den Ports lauschen) |
| route | ip r (ip route) |
Das wichtigste in voller Kürze
Programm aus allen runlevels entfernen
update-rc.d -f DIENSTNAME remove
Programm in den default Runlevels starten
update-rc.d DIENSTNAME defaults
Bei Ubuntuusers gibt es mehr zu dem Thema
https://wiki.ubuntuusers.de/SysVinit/