OpenSSH für SSH unter Windows

OpenSSH ist die führende Remote-Anmeldung über SSH Protokoll in Linux, nun auch für Windows.

OpenSSH verschlüsselt den Datenverkehr, darüber hinaus bietet OpenSSH eine große Auswahl an sicheren Tunneling-Funktionen, mehrere Authentifizierungsmethoden und anspruchsvolle Konfigurationsoptionen.

Für die SSH Remoteverwaltung in heterogenen Netzwerken, haben Windows und Linux nicht viel gemeinsames. Unter Unix/Linux ist der Remote-Zugriff per OpenSSH ein Standard für Datentransfer, Remote-Terminal sowie Port-Forwarding für Remote-X. Unter Windows ist ein wirklicher SSH Standard mit OpenSSH noch nicht erreicht, neben WinRM, PowerShell-Remote, RDS und RSAT gibt es einige mehr. Hinzugekommen ist nun auch ein Port des freien OpenSSH Client/Server Tools, dies ermöglicht weitere Integration und Verwaltung von Windows und Linux Umgebungen.

OpenSSH Installation in Windows PowerShell

Als erstes öffnen wir PowerShell als Administrator. Klicke hierzu auf Start und gib powershell ein. Wenn der Eintrag zu sehen ist, klicke auf Als Administrator ausführen und dann auf Ja. Bevor wir die Installation durchführen, müssen wir herausfinden, welche Versionen der Software verfügbar sind, was mit dem folgenden Befehl erledigt werden kann.

Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'

Erscheint die Ausgabe: State : NotPresent

Installiere zunächst den OpenSSH-Client mit.

Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

Falls gewünscht, installiere als nächstes den OpenSSH-Server.

Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

Sowohl der SSH Client als auch SSH Server sollten Installiert sein. Als nächstes müssen wir den OpenSSH-Server mit dem Befehl starten.

Start-Service sshd

Jetzt müssen wir nur noch den OpenSSH-Server so einstellen, dass er beim Booten startet.

Set-Service -Name sshd -StartupType 'Automatic'

OpenSSH auf Github

Die OpenSSH Suite ist auf Github verfügbar und besteht aktuell aus folgenden Tools:

  • Remote-Operationen werden mit ssh, scp und sftp durchgeführt
  • Key Management mit ssh-add, ssh-keygen
  • Die Service-Seite besteht aus sshd, sftp-server und ssh-agent

Win32 OpenSSH Windows Installation

Nach dem Download das Zip-Archive in C:\Program Files\OpenSSH entpacken.

Starte PowerShell als Administrator und wechsle in den Pfad C:\Program Files\OpenSSH und führe folgende Aktion aus.

cd "C:\Program Files\OpenSSH"
powershell -executionpolicy bypass -file install-sshd.ps1

Die SSH Host-Schlüssel generieren mit allen Schlüssel die sshd für Key-auth erwartet.

.\ssh-keygen.exe -A

Die Firewall auf Windows Server für SSH erweitern.

New-NetFirewallRule -Protocol TCP -LocalPort 22 -Direction Inbound -Action Allow -DisplayName SSH

Bei der Windows Workstation werden eingehende SSH Verbindungen wie folgt erlaubt.

netsh advfirewall firewall add rule name='SSH Port' dir=in action=allow protocol=TCP localport=22

Der SSH-Agent hält den privaten Schlüssel im Arbeitsspeicher.

Start-Service ssh-agent

SSH Verbinden mit Windows

Nun können SSH Verbinden aufgebaut werden.

./ssh user@10.10.10.10
./ssh -i privkey.pem user@10.10.10.10
./scp file user@10.10.10.10:/tmp

Den SSH Daemon Auto-start (Boot) aktivieren.

Set-Service sshd -StartupType Automatic
Set-Service ssh-agent -StartupType Automatic

Ein Schlüsselpar wird wie folgt generiert.

PS C:\Program Files\OpenSSH> ssh-keygen -t rsa -b 4096 -C "user@mydomain.com"
Generating public/private rsa key pair.
Enter file in which to save the key (C:\Users\user/.ssh/id_rsa): user
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in user.
Your public key has been saved in user.pub.
The key fingerprint is:
SHA256:lbPo7eEQFzaS3GFBImQG/X4H963KEOwrc3xPWeBj2Wc user@mydomain.com
The key's randomart image is:
+---[RSA 4096]----+
|    .+= ..=.     |
|     o.o = o     |
|       .+ O   .  |
|        .*.=.. + |
|       .S =o .=.E|
|       ..=.....=o|
|        oo=.  o. |
|        o+o=...  |
|         ++.oo.  |
+----[SHA256]-----+

Outlook Junk E-Mail auf Smarthost

Niemand mag SPAM, um die Flut unerwünschter E-Mails einzudämmen, müssen eingehende E-Mails mehrere Filter und sogenannte Milter durchlaufen.

Eine effiziente Filter Lösung bietet der Mail Transfer Agent – Postfix, das Open Source Programm wurde 1998 von Wietse Zweitze Venema entwickelt. Postfix ist ein leistungsfähiger Mail Transfer Agent für Unix und Unix-Derivate.

Die Software sollte zum Entwicklungszeitpunkt eine kompatible Alternative zu Sendmail sein. Dabei wurde bei der Entwicklung insbesondere auf Sicherheitsaspekte geachtet. Der Quellcode von Postfix steht unter der IBM Public License. Postfix MTA’s werden von vielen Internet Providern und in Großunternehmen eingesetzt.

Die Architektur von Postfix erlaubt es eine Vielzahl an Filter einzubinden, wie das unter der Apache-Lizenz stehende SpamAssassin, um unerwünschte E-Mails herauszufiltern und zu markieren, oder Greylisting um das verhalten eines Senders zu überprüfen. Zum Schutz gegen Viren und Schadcode kann Clam AntiVirus eingebunden werden – ClamAV steht unter der GNU General Public License.

Workaround

Als E-Mail Client Software in Unternehmen ist MS Outlook im Exchange betrieb weit verbreitet. Für SPAM der nicht in einem Filter abgefangen wurde, bietet Outlook die Möglichkeit unerwünschte Absender zu sperren, hierbei ist die Bezeichnung nicht gerade zutreffend, denn die sogenannten Junk E-Mails werden auf dem Server nicht gesperrt, sondern sie werden beim Empfang viel mehr in den Outlook Ordner Junk-E-Mail verschoben. Besser wäre es aber wenn der vermeintliche Absender es gar nicht schafft es zuzustellen, also es zurückgewiesen wird.

Hier gibt es eine Möglichkeit einzugreifen, wenn der Exchange Server wie oft die E-Mails nicht direkt aus dem Internet empfängt, sondern über einen Smarthost abwickelt. Smarthosts sind meist Linux basierte Server die mit dem Postfix MTA arbeiten.

Abbildung: Junk-E-Mail Optionen: Blockierte Abesnder
Installation

Der folgende PowerShell Script ruft die Junk-E-Mail Einträge aus der Outlook Sperrliste Blockierte Absender von allen Mailboxen aus und extrahiert die formatierte Ausgabe als Windows-ANSI Text und in eine ACSII-Text Datei. Anschliessend wird die erzeugte Datei extracted_JunkEmails.asc auf den Smarthost übertragen. Die Whitelist wird in der Datei extracted-TrustedEmails.asc angelegt.

<#
  JunkEmails.ps1 extract junk email addresses from mailboxes and write to file being distribute to smarthost
  Version 1.0.2 (12.04.2017) by DonMatteo
  Mail: think@unblog.ch
  Blog: think.unblog.ch
#>

$Smarthost = "user@smarthost.mydomain.com:/tmp"
$User_Path = (Get-Item env:\localappdata).Value
$Junk_Path = "$User_Path\Junk"
if(!(Test-Path -Path $Junk_Path )){
    New-Item -ItemType directory -Path $Junk_Path
}
$input_file = "$Junk_Path\JunkEmails.txt"
$output_asc = "$Junk_Path\extracted-JunkEmails.asc"
$output_txt = "$Junk_Path\extracted-JunkEmails.txt"

$trusted_file = "$Junk_Path\TrustedEmails.txt"
$trusted_asc = "$Junk_Path\extracted-TrustedEmails.asc"
$trusted_txt = "$Junk_Path\extracted-TrustedEmails.txt"

$junkmails = (Get-MailboxJunkEmailConfiguration -Identity * | fl BlockedSendersAndDomains)
$junkmails | Out-File -FilePath $output_asc -Encoding ASCII
$junkmails | Out-File -FilePath $input_file

$trusted = (Get-MailboxJunkEmailConfiguration -Identity * | fl TrustedSendersAndDomains)
$trusted | Out-File -FilePath $trusted_asc -Encoding ASCII 
$trusted | Out-File -FilePath $trusted_file

$regex = "\b[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}\b"
Select-String -Path $input_file -Pattern $regex -AllMatches | % { $_.Matches } | % { $_.Value } > $output_txt
Select-String -Path $trusted_file -Pattern $regex -AllMatches | % { $_.Matches } | % { $_.Value } > $trusted_txt

& "C:\Program Files\PuTTY\pscp.exe" "$output_asc" "$trusted_asc" "$Smarthost"

Der Script wird auf dem Exchange Server in der Exchange Management Shell als Administrator ausgeführt, geeigneter Weise als Job in der Aufgabenplanung zu jeder Stunde. Bei Zeile 8 soll anstelle des Platzhalters der Benutzername gefolgt vom Name des Smarthost stehen, dies als FQDN oder host IP.

Auf dem Exchange Server wird PuTTY benötigt, nach der Installation von PuTTY 64bit dient pscp.exe (PuTTY Secure Copy) zur Übertragung der Sperrliste Blockierte Absender auf den Smarthost. Damit es zu keiner Passwort abfrage kommt, muss mit PuTTY Key Generator (puttygen.exe) ein Schlüsselpar erzeugt werden, der erzeugte Public Key wird auf dem Smarthost unter das home Verzeichnis des Benutzers in das Verzeichnis .ssh in die Datei authorized_keys kopiert. Damit ist der Script mit pscp in der lage sich beim Smarthost zu authentifizieren.

Auf dem Linux Smarthost dient ein Shell Script um die Zeilen in das Unix (LF) Format zu konvertieren. Dieser Einzeiler erzeugt die passende Ausgabe in das Postfix Verzeichnis über pipe in die Datei junkbl_access und trusted_access.

# build postfix junk emails lookup tables
cat -v /tmp/extracted-JunkEmails.asc | tr , '\n' | sed 's/[{}]//g;s/[\t ]//g;/^$/d;s/\.\.\.//g;s/\^M$//g;s/BlockedSendersAndDomains://g' | grep . | sort | uniq -u | sed 's/$/\t 550 message was classified as spam/'  > /etc/postfix/junkbl_access
postmap /etc/postfix/junkbl_access
# build postfix trusted emails lookup tables
cat -v /tmp/extracted-TrustedEmails.asc | tr , '\n' | sed 's/[{}]//g;s/[\t ]//g;/^$/d;s/\^M$//g;s/TrustedSendersAndDomains://g' | grep . | sort | uniq -u | sed 's/$/\t ok/' > /etc/postfix/trusted_access
postmap /etc/postfix/trusted_access

Code in eine Datei junkbl.sh einfügen und unter dem Pfad /usr/bin/ speichern.

Der Shell Script wird ausführbar gemacht.

chmod +x /usr/bin/junkbl.sh

Der stream-editor – sed konvertiert die Zeilenumbrüche, entfernt leer Zeichen und fügt am ende jeder Zeile den SMTP Error Code 550 ein, damit werden die beim versuch der Zustellung nicht erwünschten E-Mails der Sperrliste Blockierte Absender zurückgewiesen.

Die Postfix lookup tables erstellen und aktualisieren.

postmap /etc/postfix/junkbl_access
postmap /etc/postfix/trusted_access

In der Postfix Hauptkonfiguration werden die restriction checks hinzugefügt.

vi /etc/postfix/main.cf

smtpd_recipient_restrictions =
        permit_mynetworks,
        check_sender_access hash:/etc/postfix/junkbl_access,
        check_sender_access hash:/etc/postfix/trusted_access,

Nach einem postfix reload wird die Outlook Sperrliste von Postfix angewandt.

Per cronjob soll die Sperrliste laufend aktualisiert werden, zu jeder Stunde +5 min.

5 * * * * root /usr/bin/junkbl.sh >/dev/null 2>&1
Anmerkung

Bei CentOS 7 ist es erforderlich den user zur Group sftp_users hinzuzufügen, mit usermod -G sftp_users {username}, in der sshd_config muss die direktive Match Group sftp_users angewandt werden.

Wie ein Script für die Exchange Management Shell aus der Aufgabenplanung ausgeführt wird, erklärt der Beitrag Exchange MailboxStatistics Mail-Report

OpenSSH Key Bereitstellung für Auto-login PuTTY Key Generator

Eine weitere SSH Lösung bietet OpenSSH on Windows

Release Update und Bugfix auf Github

Die mobile Version verlassen