Howtos & more …
Ubuntu/Debian: Eigene Rootzertifikate importieren und vertrauen
0Um Zertifikatsfehler bei eigenen CAs zu beseitigen muss man das Root CA Zertifikat dem Zertifikatsstore des Betriebssystems bekannt machen.
Das Root CA Zertifikat muss im Ordner /usr/share/ca-certificates abgelegt werden mit der Endung .crt (nicht .pem). Man sollte einen passenden und aussagekräfigen Namen für die Datei vergeben. Bei Ubuntu sind zusätzlich die Zertifikate in verschiedene Unterordner einsortiert. Wenn es mehrere sind kann man auch noch einen eigenen Ordner erstellen.
root@foobar:/usr/share/ca-certificates# ls -la insgesamt 52 drwxr-xr-x 11 root root 4096 2011-07-29 12:29 . drwxr-xr-x 101 root root 4096 2011-07-28 11:10 .. drwxr-xr-x 2 root root 4096 2011-07-28 10:16 brasil.gov.br drwxr-xr-x 2 root root 4096 2011-07-28 10:16 cacert.org drwxr-xr-x 2 root root 4096 2011-07-28 10:16 debconf.org drwxr-xr-x 2 root root 4096 2011-07-28 10:16 gouv.fr drwxr-xr-x 2 root root 12288 2011-07-28 10:16 mozilla drwxr-xr-x 2 root root 4096 2011-07-28 10:16 signet.pl drwxr-xr-x 2 root root 4096 2011-07-28 10:16 spi-inc.org drwxr-xr-x 2 root root 4096 2011-07-28 10:16 telesec.de
Nach dem Ablegen des Zertifikats muss man dieses noch installieren. Dazu ist das Kommando “dpkg-reconfigure ca-certificates” auszuführen. Es öffnet sich ein Menü, hier ist sicherheitshalber “Fragen” auszuwählen.
┌──────────────────────────────┤ ca-certificates configuration ├───────────────────────────────┐ │ Dieses Paket kann neue Zertifikate von CAs (Zertifizierungsstellen) installieren, wenn ein │ │ Upgrade durchgeführt wird. Sie sollten solche neuen CA-Zertifikate vielleicht prüfen und │ │ nur Zertifikate auswählen, denen Sie vertrauen. │ │ │ │ - Ja : neuen CA-Zertifikaten wird vertraut und sie werden installiert; │ │ - Nein : neue CA-Zertifikate werden standardmäßig nicht installiert; │ │ - Fragen: fragt bei jedem neuen CA-Zertifikat nach. │ │ │ │ Neuen Zertifikaten von Zertifizierungsstellen vertrauen? │ │ │ │ Ja │ │ Nein │ │ Fragen │ │ │ │ │ │ <Ok> │ │ │ └──────────────────────────────────────────────────────────────────────────────────────────────┘
Im nächsten Screen muss das zu installierende Zertifikat markiert werden.
┌──────────────────────────────┤ ca-certificates configuration ├──────────────────────────────┐ │ Dieses Paket installiert gebräuchliche Zertifikate von CAs (Zertifizierungsstellen) unter │ │ /usr/share/ca-certificates. │ │ │ │ Bitte wählen Sie die Zertifizierungsstellen aus, denen Sie vertrauen, damit deren │ │ Zertifikate in /etc/ssl/certs installiert werden. Sie werden in eine einzige Datei │ │ /etc/ssl/certs/ca-certificates.crt zusammengestellt. │ │ │ │ Zu aktivierende Zertifikate: │ │ │ │ [*] brasil.gov.br/brasil.gov.br.crt ↑ │ │ [*] cacert.org/cacert.org.crt ▮ │ │ [*] debconf.org/ca.crt ▒ │ │ [*] gouv.fr/cert_igca_dsa.crt ▒ │ │ [*] gouv.fr/cert_igca_rsa.crt ▒ │ │ [ ] eigene-root-ca/root-ca.crt ▒ │ │ [*] mozilla/ABAecom_=sub.__Am._Bankers_Assn.=_Root_CA.crt ▒ │ │ [*] mozilla/AddTrust_External_Root.crt ↓ │ │ │ │ │ │ <Ok> │ │ │ └─────────────────────────────────────────────────────────────────────────────────────────────┘
Das ganze mit OK bestätigen, das Zertifikat wird installiert.
Postfix: Mail-Relay mit SMTP-Auth via Submission/TLS für ausgehende Mails
0Ein Server soll als Relayhost (oder in der Windowswelt auch Smarthost gennant) dienen. Wer keine feste IP Adresse mit passenden DNS Reverse Eintrag hat wird schlechte Chancen haben das ein richtig konfigurierter Mailserver die Mails annehmen wird. Die Lösung ist die Mails an einen anderen Relayhost oder Mailserver zu schicken und dieser stellt dann die Mails zu. Manchmal bieten die Provider selbst Relayhosts an in vielen Fällen bleibt nichts anderes übrig als das ganze über ein Postfach zu versenden. Einige Provider bieten das Anliefern von Mails nur noch über Submission (TCP/587) und TLS verschlüsselt an. Ist mir persönlich auch lieber …
Beispielszenario
Provider: example.net
Mailaccount: user1@example.net Password: example%1
Mailserver: mail.example.net
Submission (TCP/587) und TLS sind notwendig.
Lösung
“/etc/postfix/main.cf” ergänzen mit:
relayhost = mail.example.net:submission smtp_use_tls=yes smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/smtp_auth smtp_sasl_security_options = noanonymous, noplaintext smtp_sasl_tls_security_options = noanonymous
/etc/postfix/smtp_auth (Map-Datei, muss initialisiert werden!!!)
mail.example.net:submission user1@example.net:example%1
Folgende Kommandos sind noch auszuführen:
postmap /etc/postfix/smtp_auth
durchführen um die Datei zu mappen.
/etc/init.d/postfix restart
durchführen um die Änderungen zu aktivieren.
Massenhafte Änderungen von Datei und Verzeichnis Rechten unter Linux
0Ich habe gerade das Tool OpenTimeTool auf einem Server installiert. Im Paket sind alle Dateien und Verzeichnisse mit 777 Rechten vorhanden. Man sollte wenn die Kiste im Internet steht die Berechtungungen schon ein wenig restriktiver vergeben. Normalerweise haben Dateien auf einem Webserver eine 644 Maske und Verzeichnisse eine 755 Maske.
foo@bar:/var/www/bar/opentimetool/test# ls -la insgesamt 2404 drwxr-xr-x 7 root root 4096 2011-07-21 15:10 . drwxr-xr-x 8 foo foo 4096 2011-07-21 15:10 .. -rwxrwxrwx 1 root root 9513 2011-04-18 22:12 CHANGELOG drwxrwxrwx 3 root root 4096 2011-04-18 22:25 classes -rwxrwxrwx 1 root root 1371 2008-10-21 21:20 config-local.php.dist -rwxrwxrwx 1 root root 8179 2011-04-18 22:12 config.php -rwxrwxrwx 1 root root 3642 2011-01-05 00:10 db_upgrade.php drwxrwxrwx 3 root root 4096 2011-04-18 22:25 docs drwxrwxrwx 9 root root 4096 2011-04-18 22:25 htdocs drwxrwxrwx 15 root root 4096 2011-04-18 22:25 includes -rwxrwxrwx 1 root root 1546 2008-03-18 15:45 index.php -rwxrwxrwx 1 root root 22871 2011-01-05 00:10 init.php -rwxrwxrwx 1 root root 2983 2008-09-22 18:51 INSTALL -rwxrwxrwx 1 root root 2403 2008-09-22 18:51 INSTALL.de -rwxrwxrwx 1 root root 18009 2008-03-18 15:45 LICENSE -rwxrwxrwx 1 root root 17 2008-03-18 15:45 media -rwxrwxrwx 1 root root 856 2008-03-18 15:45 messages.php -rwxrwxrwx 1 root root 717 2008-10-21 21:20 mobile_access.README drwxrwxrwx 2 root root 4096 2011-04-18 22:25 mobile_login -rwxrwxrwx 1 root root 63312 2010-09-09 10:24 mysql.sql -rw-r--r-- 1 root root 2201345 2011-04-27 22:02 openTimetool_2.3.1.tar.gz -rwxrwxrwx 1 root root 214 2008-03-18 15:45 phpinfo.php -rwxrwxrwx 1 root root 676 2008-03-18 15:45 README -rwxrwxrwx 1 root root 915 2008-03-18 15:45 SafeMode.README -rwxrwxrwx 1 root root 709 2008-03-24 21:18 Suhosin-README.txt -rwxrwxrwx 1 root root 10215 2008-03-18 15:45 TODO -rwxrwxrwx 1 root root 10761 2010-02-09 09:59 translate_de.sql -rwxrwxrwx 1 root root 9243 2010-02-09 09:59 translate_en.sql -rwxrwxrwx 1 root root 982 2010-02-09 09:59 update.README
Mit den Linuxboardmitteln kann man sich viel Arbeit sparen. Mit “find” kann ich einen Parameter -type mitgeben wo ich entweder Dateien (f = Files) oder Verzeichnisse (d = Directory) als Ergebnis zurückgeben lassen kann. Mit dem Parameter -exec kann ich anschließend direkt ein Kommando ausführen und das gefundene als Parameter ({}) mitgeben.
find /var/www/bar/opentimetool/test -type f -exec chmod 644 {} \;
find /var/www/bar/opentimetool/test -type d -exec chmod 755 {} \;
Zuletzt sollte man noch den Benutzer und die Gruppe richtig setzen.
chown www-data:www-data -R /var/www/bar/opentimetool/test
Das Resultat sieht dann wie folgt aus:
foo@bar:/var/www/opentimetool/test# ls -la insgesamt 2404 drwxr-xr-x 7 www-data www-data 4096 2011-07-21 15:10 . drwxr-xr-x 8 foo foo 4096 2011-07-21 15:10 .. -rw-r--r-- 1 www-data www-data 9513 2011-04-18 22:12 CHANGELOG drwxr-xr-x 3 www-data www-data 4096 2011-04-18 22:25 classes -rw-r--r-- 1 www-data www-data 1371 2008-10-21 21:20 config-local.php.dist -rw-r--r-- 1 www-data www-data 8179 2011-04-18 22:12 config.php -rw-r--r-- 1 www-data www-data 3642 2011-01-05 00:10 db_upgrade.php drwxr-xr-x 3 www-data www-data 4096 2011-04-18 22:25 docs drwxr-xr-x 9 www-data www-data 4096 2011-04-18 22:25 htdocs drwxr-xr-x 15 www-data www-data 4096 2011-04-18 22:25 includes -rw-r--r-- 1 www-data www-data 1546 2008-03-18 15:45 index.php -rw-r--r-- 1 www-data www-data 22871 2011-01-05 00:10 init.php -rw-r--r-- 1 www-data www-data 2983 2008-09-22 18:51 INSTALL -rw-r--r-- 1 www-data www-data 2403 2008-09-22 18:51 INSTALL.de -rw-r--r-- 1 www-data www-data 18009 2008-03-18 15:45 LICENSE -rw-r--r-- 1 www-data www-data 17 2008-03-18 15:45 media -rw-r--r-- 1 www-data www-data 856 2008-03-18 15:45 messages.php -rw-r--r-- 1 www-data www-data 717 2008-10-21 21:20 mobile_access.README drwxr-xr-x 2 www-data www-data 4096 2011-04-18 22:25 mobile_login -rw-r--r-- 1 www-data www-data 63312 2010-09-09 10:24 mysql.sql -rw-r--r-- 1 www-data www-data 2201345 2011-04-27 22:02 openTimetool_2.3.1.tar.gz -rw-r--r-- 1 www-data www-data 214 2008-03-18 15:45 phpinfo.php -rw-r--r-- 1 www-data www-data 676 2008-03-18 15:45 README -rw-r--r-- 1 www-data www-data 915 2008-03-18 15:45 SafeMode.README -rw-r--r-- 1 www-data www-data 709 2008-03-24 21:18 Suhosin-README.txt -rw-r--r-- 1 www-data www-data 10215 2008-03-18 15:45 TODO -rw-r--r-- 1 www-data www-data 10761 2010-02-09 09:59 translate_de.sql -rw-r--r-- 1 www-data www-data 9243 2010-02-09 09:59 translate_en.sql -rw-r--r-- 1 www-data www-data 982 2010-02-09 09:59 update.README
socat: Pfiffiges Tool zum Mappen von IPv6 auf IPv4 Adressen
0Wer gerade vor dem Problem steht alle Dienste auf seinen Linux Maschinen IPv4/IPv6 Dualstack fähig zu machen, der ist froh wenn er so ein Tool wie socat findet.
Es sind zwar die meisten Linux Dienste bereits Dualstack fähig aber es gibt vereinzelt noch Dienste wo keine regelmäßige bis keine Pflege der Software stattfindet.
socat ist quasi ein IPv6 -> IPv4 Relay. Das Paket ist im Packet Repository von Debian / Ubuntu verfügbar.
Beschreibung von socat aus der README des Pakets:
socat is a relay for bidirectional data transfer between two independent data channels. Each of these data channels may be a file, pipe, device (serial line etc. or a pseudo terminal), a socket (UNIX, IP4, IP6 - raw, UDP, TCP), an SSL socket, proxy CONNECT connection, a file descriptor (stdin etc.), the GNU line editor (readline), a program, or a combination of two of these. These modes include generation of "listening" sockets, named pipes, and pseudo terminals. socat can be used, e.g., as TCP port forwarder (one-shot or daemon), as an external socksifier, for attacking weak firewalls, as a shell interface to UNIX sockets, IP6 relay, for redirecting TCP oriented programs to a serial line, to logically connect serial lines on different computers, or to establish a relatively secure environment (su and chroot) for running client or server shell scripts with network connections. Many options are available to refine socats behaviour: terminal parameters, open() options, file permissions, file and process owners, basic socket options like bind address, advanced socket options like IP source routing, linger, TTL, TOS (type of service), or TCP performance tuning. More capabilities, like daemon mode with forking, client address check, "tail -f" mode, some stream data processing (line terminator conversion), choosing sockets, pipes, or ptys for interprocess communication, debug and trace options, logging to syslog, stderr or file, and last but not least precise error messages make it a versatile tool for many different purposes. In fact, many of these features already exist in specialized tools; but until now, there does not seem to exists another tool that provides such a generic, flexible, simple and almost comprehensive (UNIX) byte stream connector.
Das Tool kann noch wesentlich mehr, Infos findet man auf der Webseite des Programmierers http://www.dest-unreach.org/socat/.
Ich habe das für meinen alten SKS Keyserver verwendet, der noch kein IPv6 beherrscht. Ich lasse das ganze in einzelnen Screens laufen.
screen -dmS socat1 socat TCP6-LISTEN:11370,ipv6only=1,reuseaddr,fork TCP4:1.2.3.4:11370 screen -dmS socat2 socat TCP6-LISTEN:11371,ipv6only=1,reuseaddr,fork TCP4:1.2.3.4:11371 screen -dmS socat3 socat TCP6-LISTEN:80,ipv6only=1,reuseaddr,fork TCP4:1.2.3.4:11371
Damit das ganze auch noch einen Neustart überlebt kann man es noch in die /etc/rc.local vor dem “exit 0″ einfügen.
Managed Service Accounts (MSA) für Services unter Windows 2008 R2
0Unter Windows 2008 R2 gibt es sog. Managed Service Accounts. Diese Accounts sind für Dienste / Services gedacht. Vorteil dieser Accounts ist, das diese keine festen Passwörter mehr benötigen. Früher wurde für einen Service ein Account mit einem festen Passwort angelegt das nicht abläuft. Mit dieser neuen Funktion ist das nicht mehr notwendig da der Server selbständig in der Lage ein neues Passwort zu vergeben wenn es ausläuft.
Für die Erstellung von MSA´s benötigt man die PowerShell im Adminmodus.
Benötigt wird das Modul ActiveDirectory.
import-module activedirectory New-ADServiceAccount -name msa1 New-ADServiceAccount -name msa2 -AccountPassword (ConvertTo-SecureString -AsPlainText 1q2w3e4r%T -Force) Add-ADComputerServiceAccount -Identity romulus -ServiceAccount msa1 Add-ADComputerServiceAccount -Identity romulus -ServiceAccount msa2
New-ADServiceAccount legt einen neuen MSA an. Falls man für eine Dienstinstallation ein Passwort benötigt kann man mit dem Zusatz -AccountPasswort (siehe MSA2) ein Startpasswort definieren. Nach Ablauf der Passwortgültigtkeit wird dann ebenfalls ein neues gesetzt. Mit Add-ADComputerServiceAccount wird festgelegt für welche Maschine der Serviceaccount ist.
Auf der Maschine wo der ServiceAccount benötigt wird muss dieser noch Installiert werden.
Import-Module ActiveDirectory Install-ADServiceAccount -Identity msa1 Install-ADServiceAccount -Identity msa2
Mit dem Kommando Install-ADServiceAccount wird der Maschine der ServiceAccount bekannt gemacht. Ab diesen Moment weiß die Maschine das sie für diesen Account auch die Passwörter wechseln muss wenn es soweit ist.
Wie werden die MSA`s verwendet?
Zum Testen habe ich einfach schnell 2 Dienste über die Kommandozeile angelegt.
Wichtig sind die Leerzeichen nach dem Istgleich.
sc create Dienst1 type= own binpath= c:\dienst1.exe sc create Dienst2 type= own binpath= c:\dienst2.exe
Jetzt benötigen wir die services.msc Managementkonsole, dort tauchen jetzt auch unsere 2 neuen Dienste auf.
Einen der Testdienste mit Doppelklick öffnen und in den Reiter “Logon” gehen. Hier “This Account” auswählen und auf “Browse” gehen. In das Suchfeld msa1 oder msa2 eingeben und suchen. Das ganze mit OK bestätigen.
Der Account wird als msa1$ oder msa2$ angezeigt. Passwort kann man irgendwas eingeben, um das Passwort kümmert sich Windows selbst. Alles mit OK bestätigen.
Noch ein kleines “Nice to know”
Es gibt die Möglichkeit ACLs für Dienste selbst zu vergeben, d.H. nicht nur für Dienste die unter einem User laufen sondern auch für Dienste die im LOCAL SYSTEM laufen. Hier kann man den Diensten Rechte nehemen oder geben.
Als Location muss die Maschine selbst angegeben werden, in dem Fall “ROMULUS”. Im Suchfeld muss der entsprechende Dienst mit dem Prefix “nt service\” eingegeben werden, also “nt service\dienst1″. Ohne das Prefix findet Windows den Dienst nicht!
Auf einen Dienst können alle ACLs die auf einen User anwendbar sind ebenfalls angewendet werden.
Die PowerShell
0Dieser Artikel ist nur ein kleiner Überblick der mächtigen PowerShell. Die PowerShell wurde von Microsoft entwickelt um administrative Aufgaben effizienter erledigen zu können und um eine zentrale, einheitliche Schnittstelle zu bieten. Für viele neue Microsoft Produkte ist die PowerShell unabdingbar (z.B. Microsoft Exchange 2010).
Allgemeines
Die PowerShell besteht aus kleinen Einheiten die sich Cmdlets nennen. Die Kommandos sind alle nach dem Schema Verb-Substantiv aufgebaut, z.B. get-help. Groß-/Kleinschreibung spielt keine Rolle. Für bestimmte Kommandos und Cmdlets gibt es Aliase.
Wichtige Kommandos
| Kommando/Cmdlet | Beschreibung |
| get-help | Zeigt die Hilfe an |
| get-help <Kommando/Cmdlet> | Zeigt die Hilfe zu einem Kommando/Cmdlet an |
| get-variable | Zeigt alle gesetzten Variablen an |
| get-alias | Zeit alle gesetzten Aliase an |
| get-module -ListAvailable | Zeigt vorhandene Module an |
| import-module <modulname> | Importiert das Modul in die aktuelle Sitzung (z.B. import-module activedirectory) |
| get-command | Zeigt die verfügbaren Kommandos / Cmdlets an |
| sort-object | Sortieren einer Datenmenge |
| select-object | Einen bestimmten Bereich selektieren (z.B. select-object -First 3) |
| export-csv | Datenmenge in CSV exportieren |
| get-psdrive | Zeigt PowerShell Laufwerke an |
| invoke-command | Kommandos Remote auf anderen Server ausführen |
| enable-psremoting | Aktiviert Remote Power Shell |
| new-pssession | Baut eine Verbindung zu einem Remote Power Shell Server auf |
| enter-pssession | Geht in die Remote Verbindung rein |
| exit-pssession | Verlässt die Remote Session |
| get-credential | Frägt über einen Popup Anmeldeinformationen ab wenn man nicht die Sitzungsanmeldeinformationen verwenden will |
| get-aduser <username> | Frägt aus dem AD Informationen über einen User ab (Nur Verfügbar wenn das ActiveDirectory Modul geladen ist.) |
| get-adobject <filter> | Frägt ein Objekt aus dem AD ab (Nur Verfügbar wenn das ActiveDirectory Modul geladen ist.) |
| get-adcomputer <computer> | Frägt aus dem AD Computerinformationen ab (Nur Verfügbar wenn das ActiveDirectory Modul geladen ist.) |
| set-adaccountpassword | Setzt Passwort für einen User (Nur Verfügbar wenn das ActiveDirectory Modul geladen ist.) |
Vergleichs- und Verknüpfungsoperatoren
| Operator | Beschreibung |
| -eq | (equal) gleich |
| -ne | (not equal) nicht gleich |
| -gt | (greater than) größer als |
| -lt | (less than) kleiner als |
| -ge | (greater equal) größer gleich |
| -le | (less equal) kleiner gleich |
| -like | wie .z.B. “a*” |
| -notlike | nicht wie z.B. “a*” |
| -match | “^ABC” (Regex) |
| -AND | und |
| -OR | oder |
| -NOT | nicht |
Beispiel: get-service
get-service gibt den Status der Prozesse zurück.
Will man jetzt z.B. nur Dienste sehen die sich im Status “Running” befinden so kann man das Ergebnis an ein anderes Kommando pipen.
get-service | where-object {$_.status -eq "running"}
Das Resultat:
Alternativ für where-object gibt es einen Alias der “?” heißt. Also wäre auch folgender Befehl möglich:
get-service | ? {$_.status -eq "running"}
Das ganze lässt sich mit einem Verbindungsoperator noch erweitern:
get-service | ? {($_.name -like "A*") -AND ($_.status -like "run*")}
Als Resultat bekommen wir alle Prozesse die mit A…. beginnen und laufen.
Jetzt können wir uns noch alle Prozesse mit A ausgeben lassen und diese absteigend sortieren.
get-service | ? {$_.name -like "a*"} | sort-object displayname -Descending
Die Ausgabe können wir jetzt noch auf 3 Resultate beschränken:
get-service | ? {$_.name -like "a*"} | sort-object displayname -Descending | select-object -First 3
Das können wir jetzt noch in eine CSV Datei exportieren:
get-service | ? {$_.name -like "a*"} | sort-object displayname -Descending | select-object -First 3 | export-csv -path export.csv
Inhalt export.csv:
#TYPE System.ServiceProcess.ServiceController "Name","RequiredServices","CanPauseAndContinue","CanShutdown","CanStop","DisplayName","DependentServices","MachineName","ServiceName","ServicesDependedOn","ServiceHandle","Status","ServiceType","Site","Container" "AudioEndpointBuilder","System.ServiceProcess.ServiceController[]","False","False","True","Windows Audio Endpoint Builder","System.ServiceProcess.ServiceController[]",".","AudioEndpointBuilder","System.ServiceProcess.ServiceController[]","SafeServiceHandle","Running","Win32ShareProcess",, "AudioSrv","System.ServiceProcess.ServiceController[]","False","False","True","Windows Audio","System.ServiceProcess.ServiceController[]",".","AudioSrv","System.ServiceProcess.ServiceController[]","SafeServiceHandle","Running","Win32ShareProcess",, "AppMgmt","System.ServiceProcess.ServiceController[]","False","False","False","Application Management","System.ServiceProcess.ServiceController[]",".","AppMgmt","System.ServiceProcess.ServiceController[]","SafeServiceHandle","Stopped","Win32ShareProcess",,
PowerShell Drives
In der PowerShell kann man auf verschiedene Daten über das Filesystem zugreifen. Darunter sind unter anderem der Certificate Store und die Registry.
get-psdrive cd HKLM: cd .\SOFTWARE dir
Remote PowerShell
In der PowerShell ist es möglich einen RemoteAccess zu aktivieren. Einmal aktiviert bleibt er auch aktiviert, er lässt sich aber wieder abschalten. Der PowerShell Remote Service läuft auf 2 TCP Ports. TCP/5985 ohne SSL und TCP/5986 mit SSL.
Aktivieren der Remote Shell:

enable-psremoting
Die beide Abfragen mit “Y” bestätigen, eine automatische Firewallregel wird installiert.
Es gibt 2 Möglichkeiten mit der Remote PowerShell zu arbeiten.
1. Wir können ein Kommandosatz übermitteln und das Ergebnis verarbeiten
invoke-command -computername romulus.thoma.local -scriptblock {get-service}
2. Wir können uns eine vollständige Remote Shell öffnen
new-pssession -computername romulus
Nach dem Verbindungsaufbau muss man in die Session einsteigen
enter-pssession 1
Am Beginn der Zeile steht jetzt der Hostname der Remotemaschine. Um die Remotemaschine zu verlassen benötigt man folgendes Kommando:
exit-pssession
Die Sessions verschwinden nach 15 Minuten von alleine, wer nicht warten will kann mit
remove-pssession 1
die Session löschen.
Mit anderen Credentials Remote anmelden
Es gibt 2 verschiedene Möglichkeiten Credentials mitzugeben.
1. Im Script
Windows benötigt gehashte Passwörter für die Anmeldung.
$secpasswd = Convert-To-SecureString "1q2w3e4r%T" -AsPlainText -Force
$username="max"
$mycreds = new-object system.management.automation.pscredential ($username, $secpasswd)
invoke-command -credential $mycreds -computername romulus.thoma.local -scriptblock {get-service}
2. Per Popup
$mycreds = get-credential
invoke-command -credential $mycreds -computername romulus.thoma.local -scriptblock {get-service}
Windows 2008 R2 Server Active Directory Papierkorb aktivieren und verwenden
1In der aktuellen Windows 2008 R2 Server Version gibt es die Möglichkeit das gelöschte AD Objekte in einem Papierkorb aufbewahrt werden. Das gab es zwar schon früher, allerdings werden bei dem AD Papierkorb alle Werte erhalten incl. Passwort. Dies war bei der vorhergehenden Lösung nicht der Fall. Der AD Papierkorb setzt voraus das der Forrest Funcional Level “Windows 2008 R2″ ist. Ist die Domäne auf Windows 2003 aufgebaut und wurde zu 2008 R2 migriert werden die Objekte im Papierkorb für 60 Tage gespeichert. Ist die Domäne direkt mit Windows 2008 / 2008 R2 aufgebaut werden die Objekte für 180 Tage gespeichert. Der Wert lässt sich auch ändern.
Wichtig! Die AD Papierkorbfunktion gibt es nur unter Windows 2008 R2 Server.
Um den AD Papierkorb zu aktivieren muss auf dem Schema-Master in einer administrativen Power Shell folgender Befehl ausgeführt werden.
Wer ist der Schema-Master? Dies lässt sich mit netdom ermitteln:
C:\>netdom query fsmo
Falls keine Remote Powershell aktiviert ist muss man sich via RDP verbinden oder sich direkt an die Maschine begeben.
In der PowerShell muss das Modul ActiveDirectory nachgeladen werden. Der DN muss angepasst werden auf die entsprechende Domäne genauso wie das Target.
PS C:\>import-module activedirectory PS C:\>enable-adoptionalfeature -identity "cn=recycle bin feature,cn=optional features,cn=directory service,cn=windows nt,cn=services,cn=configuration,dc=thoma,dc=local" -scope forestorconfigurationset -target "thoma.local"
ACHTUNG! Das Feature lässt sich nicht mehr abschalten. Anschließend mit “Y” bestätigen.
Wie kann man den AD Papierkorb verwenden ?
Ich habe zum Test den User dummy1 gelöscht. Der User befindet sich jetzt in diesem Papierkorb.
Mit einer administrativen PowerShell können wir den User suchen.
PS C:\>import-module activedirectory
PS C:\>get-adobject -filter {name -like "*dummy1*"} -includedeletedobject
Will man diesen User jetzt wiederherstellen so muss man folgenden Befehl verwenden:
PS C:\>get-adobject -filter {name -like "*dummy1*"} -includedeletedobject | restore-adobject
Ruft man jetzt erneut den “get-adobject -filter {name -like “*dummy1*”} -includedeletedobject” Befehl auf sieht man das der User nichtmehr das Flag “Deleted” besitzt und wieder seinen orginalen DN hat.
Windows 2008 Active Directory Snapshot erstellen und mounten
0Windows 2008 / 2008 R2 Server bietet ein cooles Feature um regelmäßig und schnell das Active Directory zu sichern. Die Sicherung kann im Betrieb erfolgen. Für den Snapshot wird der Volume Shadow Service verwendet.
Zum Anlegen des Snapshots wird das mitgelieferte Tool ntdsutil verwendet.
Wichtig! Das Tool benötigt Admin Rechte. cmd Box mit Adminrechten starten!
Mit dem Kommando
ntdsutil "ac i ntds" "sn" "cr" "q" "q"
verbindet sich das Tool zum Active Directory und startet das Anlegen des Snapshots.
Die bereits erstellten Snapshots kann man sich mit
ntdsutil "sn" "l a" "q" "q"
anzeigen lassen.
Um einen Snapshot zu verwenden muss er gemountet werden. Das Mounten erfolgt mit dem Kommando:
ntdsutil "sn" "l a" "mo 10" "q" "q"
10 gibt die Version an die sich auf die Nummer aus der Liste der Snapshots bezieht.
Nach dem Mounten ist der Snapshot unter C:\$SNAP_201107141124_VOLUMEC$\ verfügbar. Der Name ist abhängig vom Snapshot.
Aus dem Snapshot können wir jetzt das gesicherte Active Directory parallel starten. Hierzu muss man in den Ordner C:\$SNAP_201107141124_VOLUMEC$\Windows\NTDS\ wechseln. Der Ordner kann abweichen je nachdem wo man die AD Informationen abgelegt hat.
Mit dem Tool dsamain lässt sich die Kopie parallel starten.
Dem Tool dsamain werden 2 Parameter beim Start mitgegeben. Dem Parameter dbpath geben wir unser Active Directory aus dem Snapshot mit. Mit dem Parameter ldapport geben wir noch einen freien Port mit auf den wir uns dann mit einem LDAP Explorer oder mit der dsa.msc verbinden können. Per Default wird das AD aus dem Snapshot im Read Only Modus gestartet.
dsamain -dbpath ntds.dit -ldapport 6500
Jetzt können wir uns mit der dsa.msc auf das gemountete AD verbinden.
Um unser Snapshot AD sehen zu können müssen wir uns lokal auf Port 6500 verbinden.
Hiezu auf die Domäne einen Rechtsklick und “Change Domain Controller” auswählen.
In diesem Fenster muss bei <Type a Directory Server name[:port] here> localhost:6500 eingetragen werden.
Das ganze mit Ok bestätigen.
Wir sind jetzt mit dem Snapshot AD verbunden und können alles ansehen. Öffnet man ein Objekt stellt man fest das die Objekte, wie oben bereits erwähnt, Read Only sind.
Natürlich kann man auf dieses gemountete AD auch mit anderen Tools wie ldifde, csvde, usw. arbeiten.
Nach der Arbeit sollte man den Snapshot noch unmounten.
Der Unmount kann mit dem folgenden Befehl durchgeführt werden. Hier ist wieder die richtige Index ID einzugeben.
ntdsutil "sn" "l a" "un 10" "q" "q"
Python Version von getadsmtp.pl
0Übersetzung des AD Mailadressen Sammelskripts von Perl nach Python.
#!/usr/bin/python
# getadsmtp.py
# Version 1.0
# The script is an translation from the orginal perl script getadsmtp.pl
# This script will pull all users' SMTP addresses from your Active Directory
# (including primary and secondary email addresses) and list them in the
# format "user@example.com OK" which Postfix uses with relay_recipient_maps.
# Be sure to double-check the path to python above.
# This requires python-ldap to be installed. To install python-ldap on debian based systems,
# at a shell type "apt-get install python-ldap" or "sudo apt-get install python-ldap"
import os, sys, ldap
# Enter the path/file for the output
valid_addresses = "/etc/postfix/example_recipients"
# Enter the FQDN of your Active Directory domain controllers below
dc1="dc01.example.com"
dc2="dc02.example.com"
# Enter the LDAP container for your userbase.
# The syntax is CN=Users,dc=example,dc=com
# This can be found by installing the Windows 2000 Support Tools
# then running ADSI Edit.
# In ADSI Edit, expand the "Domain NC [domaincontroller1.example.com]" &
# you will see, for example, DC=example,DC=com (this is your base).
# The Users Container will be specified in the right pane as
# CN=Users depending on your schema (this is your container).
# You can double-check this by clicking "Properties" of your user
# folder in ADSI Edit and examining the "Path" value, such as:
# LDAP://domaincontroller1.example.com/CN=Users,DC=example,DC=com
# which would be hqbase="cn=Users,dc=example,dc=com"
# Note: You can also use just hqbase="dc=example,dc=com"
hqbase="cn=Users,dc=example,dc=com"
# Enter the username & password for a valid user in your Active Directory
# with username in the form cn=username,cn=Users,dc=example,dc=com
# Make sure the user's password does not expire. Note that this user
# does not require any special privileges.
# You can double-check this by clicking "Properties" of your user in
# ADSI Edit and examining the "Path" value, such as:
# LDAP://domaincontroller1.example.com/CN=user,CN=Users,DC=example,DC=com
# which would be $user="cn=user,cn=Users,dc=example,dc=com"
# Note: You can also use the UPN login: "user@example.com"
user="cn=user,cn=Users,dc=example,dc=com"
passwd="password"
try:
l = ldap.initialize("ldap://%s" %(dc1))
l.set_option(ldap.OPT_REFERRALS, 0)
l.protocol_version = 3
l.simple_bind_s(user, passwd)
except ldap.LDAPError, e:
try:
l = ldap.initialize("ldap://%s" %(dc2))
l.set_option(ldap.OPT_REFERRALS, 0)
l.protocol_version = 3
l.simple_bind_s(user, passwd)
except ldap.LDAPError, e:
print "Error connecting to specified domain controllers\n"
sys.exit()
# Play around with this to grab objects such as Contacts, Public Folders, etc.
# A minimal filter for just users with email would be:
# filter = "(&(sAMAccountName=*)(mail=*))"
filter = "(& (mailnickname=*) (| (&(objectCategory=person)(objectClass=user)(!(homeMDB=*))(!(msExchHomeServerName=*)))(&(objectCategory=person)(objectClass=user)(|(homeMDB=*)(msExchHomeServerName=*)))(&(objectCategory=person)(objectClass=contact))(objectCategory=group)(objectCategory=publicFolder)(objectClass=msExchDynamicDistributionList) ))"
attrs = ["proxyAddresses"]
scope = ldap.SCOPE_SUBTREE
r = l.search(hqbase, scope, filter, attrs)
type,a = l.result(r)
result_set = []
for x in a:
name,attrs = x
if hasattr(attrs, 'has_key') and attrs.has_key('proxyAddresses'):
proxyAddresses = attrs['proxyAddresses']
for y in proxyAddresses:
result_set.append("%s OK" %(y.replace("smtp:","").replace("SMTP:","")))
# Add additional restrictions, users, etc. to the output file below.
#result_set.append("user@example.com OK")
#result_set.append("user1@example.com 550 User unknown.")
#result_set.append("bad.example.com 550 User does not exist.")
#######################################################################
# Build file ...
output = file(valid_addresses,'w')
for line in result_set:
output.write("%s\n" %(line))
output.close()
Layer 3 VPN mit OpenSSH
0OpenSSH ist in der Lage über Tun-Interfaces ein Layer 3 VPN herzustellen. Dies ist eine sehr einfache Variante, besonders schön ist das man SSH auch in vielen Fällen über einen Proxy verwenden kann.
Szenario
Aufbau:
- Firewall (intern: 10.10.0.254, extern: 55.66.77.88, macht PAT über externes Interface)
- SSHVPN VM ist eine VMware Maschine auf meinem VMware Server (intern: 10.10.0.122, tun0: 10.255.255.1, macht PAT über internes Interface)
- Mein PC (Ubuntu 10.10 Maschine mit NX intern: 10.10.0.80)
- Mein Netbook in dem Beispiel irgendwo im Internet mit UMTS Stick (Ubuntu 10.10 Netbook Edition)
- Auf der Firewall ist ein NAT Portforwarding für TCP Port 22 auf 10.10.0.122 eingerichtet
Der Client
Falls noch kein Schlüsselpaar für root existiert muss eines angelegt werden.
toor@sshvpn-vm:~$ sudo ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/root/.ssh/id_rsa. Your public key has been saved in /home/root/.ssh/id_rsa.pub. The key fingerprint is: 05:d2:94:2e:16:fd:96:29:5c:6d:13:b5:55:8f:ce:31 root@sshvpn-vm The key's randomart image is: +--[ RSA 2048]----+ | .+o. ..o. +| | ..+.. + +.| | + o.+ .E .| | o +.= o o | | . .So o | | | | | | | | | +-----------------+ toor@sshvpn-vm:~$
Am einfachsten ist es ohne Passwort. Meine Empfehlung: Unbedingt mit Passwort machen, ist sicherer
Den Namen unverändert lassen, auch den Speicherort. id_rsa wird im .ssh Verzeichnis beim Verbindungsaufbau vom ssh Client automatisch verwendet sofern vorhanden.
Anpassen der /etc/network/interfaces Datei
Folgenden Absatz an das Ende der Datei anfügen.
iface tun0 inet static
pre-up ssh -S /var/run/sshvpn-tun-ctrl -M -f -w 0:0 55.66.77.88 true
pre-up sleep 5
address 10.255.255.2
pointopoint 10.255.255.1
netmask 255.255.255.252
up route add -net 10.10.0.0 netmask 255.255.255.0 gw 10.255.255.1 tun0
post-down ssh -S /var/run/sshvpn-tun-ctrl -O exit 55.66.77.88
Der Server
Anpassen der /etc/ssh/sshd_config Datei
Hinzufügen / Anpassen folgender Optionen
PermitTunnel point-to-point PermitRootLogin forced-commands-only
PermitRootLogin existiert bei Ubuntu Systemen (steht auf Yes) schon bei anderen Distris kann das anders sein. Falls die PermitRootLogin existiert die orginale einfach auskommentieren.
Anpassen der /root/.ssh/authorized_keys Datei
tunnel="0",command="/sbin/ifdown tun0;/sbin/ifup tun0" ssh-rsa AAAA.... root@sshvpn-vm
Ab ssh-rsa muss alles ersetzt werden durch den Inhalt aus dem generierten öffentlichen Schüssel vom Client. (/root/.ssh/id_rsa.pub)
Anpassen der /etc/network/interfaces Datei
Folgenden Absatz an das Ende der Datei anfügen.
iface tun0 inet static
address 10.255.255.1
netmask 255.255.255.252
pointopoint 10.255.255.2
IP Forwarding auf dem Server aktivieren
$ sysctl -w net.ipv4.ip_forward=1
Für eine dauerhaftes IP Forwarding muss mann noch die /etc/sysctl.conf anpassen.
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
NAT aktivieren
Ich habe auf meinem SSHVPN Server NAT aktiviert damit ich ohne Routing arbeiten kann, das ist einfacher.
Folgendes Script in /etc/init.d anlegen.
iptables.nat.sshvpn:
/sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Aktivieren für Systemstart:
$ update-rc.d iptables.nat.sshvpn defaults
Test des VPN Tunnels
Auf dem Client kann der Tunnel mit folgendem Kommando gestartet werden.
$ sudo ifup tun0
Der SSH Client baut dann die Verbindung zum Server auf und richtet das Tunnelinterface ein.
Ein einfacher Ping zeigt das es funktioniert hat.
$ ping 10.10.0.80 PING 10.10.0.80 (10.10.0.80) 56(84) bytes of data. 64 bytes from 10.10.0.80: icmp_req=1 ttl=64 time=99.57 ms 64 bytes from 10.10.0.800: icmp_req=2 ttl=64 time=90.238 ms 64 bytes from 10.10.0.80: icmp_req=3 ttl=64 time=90.217 ms 64 bytes from 10.10.0.80: icmp_req=4 ttl=64 time=90.181 ms
Viel Spaß mit euren eigenen SSH VPNs































