IMAPS per telnet testen

openssl s_client -connect 1.2.3.4:993
Dann per IMAP weiter:
a1 LOGIN MyUsername MyPassword
a2 LIST "" "*"
a3 EXAMINE INBOX

posted at: 2016 Jan 22 at 15:28 | path: /net | permanent link to this entry

SSH-Command Prompt

SSH hat einen eigenen Prompt (zu erreichen mit
~C
). Hier kann man z.B. für eine bereits bestehende Verbindungen einen (weiteren) Tunnel einrichten:
ssh> help
Commands:
      -L[bind_address:]port:host:hostport    Request local forward
      -R[bind_address:]port:host:hostport    Request remote forward
      -D[bind_address:]port                  Request dynamic forward
      -KL[bind_address:]port                 Cancel local forward
      -KR[bind_address:]port                 Cancel remote forward
      -KD[bind_address:]port                 Cancel dynamic forward

posted at: 2016 Jan 22 at 13:36 | path: /linux | permanent link to this entry

OpenSSL

Damit ich nie wieder woanders suchen muss: Einen neuen 2048 Bit langen RSA-Schlüssel generieren ("key.pem") und passend dazu ein Request ("request.pem") erstellen:
openssl req -newkey rsa:2048 -out request.pem -keyout key.pem
Wie zuvor, nur wird der Request zum bereits vorhandenen Schlüssel pub-sec-key.pem generiert.
openssl req -new -out request.pem -key pub-sec-key.pem
Request request.pem anzeigen:
openssl req -text -noout -in request.pem
Selbstsignatur des Requests request.pem verifizieren:
openssl req -verify -noout -in request.pem
Generiert einen SHA1-Fingerabdruck vom Modulus des Schlüssels aus dem Request request.pem:
openssl req -noout -modulus -in request.pem | openssl sha1 -c
Generiere einen 2048 Bit langen RSA-Schlüssel ("pub-sec-key.pem") und erstelle ein selbst signiertes Zertifikat ("self-signed-certificate.pem"). Das Zertifikat ist 365 Tag gültig und für simple Testzwecke gedacht.
openssl req -x509 -days 365 -newkey rsa:2048 -out self-signed-certificate.pem -keyout pub-sec-key.pem
Wie zuvor, erstellt jedoch ein selbst signiertes Zertifikat aus einem vorhandenen Schlüssel pub-sec-key.pem.
openssl req -x509 -days 365 -new -out self-signed-certificate.pem -key pub-sec-key.pem
Erstellt neuen Request aus altem Selbstzertifikat.
openssl x509 -x509toreq -in self-signed-certificate.pem -signkey pub-sec-key.pem -out request.pem
Gib das Zertifikat self-signed-certificate.pem als Klartext aus.
openssl x509 -text -noout -md5 -in self-signed-certificate.pem
Gib den Fingerabdruck des X.509 Zertifikats self-signed-certificate.pem aus. Der Algorithmus ist hier MD5, SHA1 kann verwendet werden, wenn -md5 durch -sha1 ersetzt wird:
openssl x509 -fingerprint -noout -md5 -in self-signed-certificate.pem
Überprüfe ein selbst signiertes Zertifikat:
openssl verify -issuer_checks -CAfile self-signed-certificate.pem self-signed-certificate.pem
Baut eine OpenSSL-Verbindung unter Verwendung des Zertifikats self-signed-certificate.pem zum angegebenen Server auf. Es wird dabei die gesamte Zertifikatskette angezeigt:
openssl s_client -showcerts -CAfile self-signed-certificate.pem -connect www.dfn-pca.de:443
Gibt die Zertifikats-Widerrufsliste crl.pem in Klartext aus.
openssl crl -noout -text -CAfile self-signed-certificate.pem crl.pem
Erzeugt die PKCS#12-Datei pub-sec-key-certificate-and-chain.p12 für den Import nach Windows:
openssl pkcs12 -export -inkey pub-sec-key.pem -certfile certificate-chain.pem -out pub-sec-key-certificate-and-chain.p12 -in signed-certificate.pem

posted at: 2015 Nov 14 at 14:01 | path: /linux | permanent link to this entry

OpenSSL Private-Key-Format

Neuere Versionen von OpenSSL speichern den private Key mit einer OID ab, die den Typ des Keys spezifiziert:
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,50FB6D0318CEEA40

Fe4nNAXj1wEgGlrVZMuLL0MNvOYJFaTYhbrLSb7D56tdaLS8U59kvhsIpiTDiqP4
tEai2bq30w/ogKC9BsZ02uEDXpFKep2Ya95OMBth6cS7NRdmIbmZMuWXIWWn+xQC
aNCIMgC4yU/b7xS/tFTzytiSQ+9Nggif5baqZYrkVD7HCk2NcEiNP7zZfcBlfRI6
WE2ZnjTBRnRhkPEKEwJ0xXKw2dVQAT9c7j5Xpxo/2JuOrBKJ166BWt2ql7cY+zGg
-----END RSA PRIVATE KEY-----
Bei älteren OpenSSL-Versionen sieht das noch so aus:
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDGHpwDar3JryaGwjroknAGVI1p7ko+tRcnWcFCmfAcyBbfErcf
34Lv3MUK52XXaYKrYkujDldRHQD5qgM6raecIALZ2lL/
-----END RSA PRIVATE KEY-----
Entsprechend gibt es einige Programme, die mit dem neuen Format nicht zurechtkommen. So z.B. exim4 aus Debian/Lenny:
TLS error on connection from [192.168.50.9] (cert/key setup: cert=/etc/exim4/exim.crt 
                          key=/etc/exim4/exim.pem): Base64 unexpected header error.
Lösung:
openssl rsa -in /etc/exim4/exim.key -out /etc/exim4/exim.new.pem

posted at: 2015 Nov 14 at 13:56 | path: /linux | permanent link to this entry

pdfconat

Mehrere PDF in ein großes PDF zusammenfassen:
gs -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=output.pdf -dBATCH page1.pdf page2.pdf page3.pdf

posted at: 2015 Nov 14 at 13:56 | path: /linux | permanent link to this entry

pnmtopdf

Convert several pnm-files into a single PDF:
gm convert *.pnm output.pdf

posted at: 2015 Nov 14 at 13:51 | path: /linux | permanent link to this entry

pnmtopdf

Convert several pnm-files into 1 PDF: gm convert *.pnm output.pdf

posted at: 2015 Nov 14 at 13:46 | path: /linux | permanent link to this entry

QEMU-Image mounten

Um ein QEMU-Image zu mounten, kann das Image als Network Block Device (NBD) angelegt werden. Über die so erzeugten Einträge in /dev hat man vollen Zugriff auf die virtuelle "Platte":
# Kernelmodul laden:
modprobe nbd

# An ein NBD-Device binden:
qemu-nbd --connect=/dev/nbd0 debianVM.img

# Filesystem der ersten Partition auf dem Image checken:
fsck.ext4 -f /dev/nbd0p1

# Filesystem der ersten logischen Partition auf dem Image mounten:
fsck.ext4 -f /dev/nbd0p5 /mnt/

posted at: 2015 Oct 29 at 10:08 | path: /linux | permanent link to this entry

MySQL2DBIC

Ich mag DBIx::Class seit ich bei Catalyst gestolpert bin. Als Objeck-relationaler Mapper packt DBIC die MySQL-Tabellen in Perl-Objekte ein und erzeugt die SQL-Queries im Hintergrund. So bleibt man in der Regel von wüsten syntaktischen MySQL-Befehlen verschont. Noch dazu kommt, dass man die DBIC-Objekte an ein Template weitergeben kann, das über die Objekte iterieren kann:
my @devices = $schema->resultset('Devices')->search(
	{ 
        'registered' => '1',
        'name'       => { 'like', "foobar%" },
	}
);
Und dann im Template:

<table>
[% FOREACH device=devices %]
<tr>
  <td>[%- device.registered | html -%]</td>
  <td>[%- device.name | html -%]</td>
  <td>[%- device.user.username | html -%]</td>
/<tr>
[% END %]
/<table>

Gerade eben kam eine Kundenanfrage, und ich sollte mal nachschauen, ob es Kunden gibt, die eine Software öfter benutzen, als sie bezahlt haben. Konkret liegt die maximale Anzahl an devices, die ein Kunde nutzen darf, bei fünf. Und meine Aufgabe war es nun, herauszufinden, ob alle Kunden das vorgeschriebene Limit einhalten. Hier die dazugehörige MySQL-Query:
SELECT COUNT(devices.receipt), users.username
FROM users, devices
WHERE devices.user_id = users._id
AND devices.receipt LIKE "ewo%"
GROUP BY devices.receipt
ORDER BY COUNT( devices.receipt ) DESC 
LIMIT 0, 10

Da aber so gut wie die komplette Code-Basis mit DBIC arbeitet, sollte das Skript, das diese Limits wöchentlich überprüft ebenfalls mit DBIC laufen. Für "plain" MySQL hätte ich zuviel umbauen müssen. Hier der Code:

my $top10 = $schema->resultset('User')->search(
    {
        'devices.receipt' => { 'like', "ewo%" },
    },
    {
      join     => [qw/ devices /],
      select   => [ 'username', 
                    { count => 'devices.receipt', -as => 'receipt_count' } 
				  ],
      as       => [qw / username receipt_count /],
      group_by => [qw/ devices.receipt /],
      order_by => { -desc => "receipt_count" },
      rows => 10,
    }
);

# Die Top 10 Sünder:
while (my $user = $top10->next) {
    print "Username " . $user->username . " nutzt " . 
	        $user->get_column('receipt_count') . " Devices.\n";
}

posted at: 2013 May 09 at 02:38 | path: /perl | permanent link to this entry

IPSec und NAT

IPSec soll eine auf Layer 3 gesicherte Kommunikation ermöglichen und dabei Vertraulichkeit, Authentizität und Integrität zusichern. Konkret erweitert IPSec das IP-Protokoll und stellt sicher, dass Gerade der letzte Punkt macht den Einsatz von NAT-Techniken recht schwierig, da durch ein SNAT/Masqueradering ja gerade die Source-IP-Header geändert werden soll. Kurz: man darf IPSec-Pakete nicht "nat-ten" (weder SNAT, noch DNAT), da die IPSec-Gegenstelle sonst die Integrität verletzt sieht und die ge-NAT-teten Pakete einfach verwirft.
Will man nun aber einen IPSec-Tunnel aufbauen und man nutzt auf der eigenen Seite ein klassisches 192.168.1.0/24, kann man von der Gegenseite kaum erwarten, einen IPSec-Tunnel mit eben jenem häufig genutzten privaten Netz zu routen. In der Regel muss man sich dann auf ein zu routenden Netz einigen (größere Firmen geben das auch schon mal einfach vor) und dann eben doch mit NAT dafür sorgen, dass die Zuordnung auf die internen Rechner funktioniert.

Angenommen man einigt sich auf ein 10.23.176.128/29 Netz, das auf das interne 192.168.1.0/24 gemappt werden soll, dann muss man dafür sorgen, dass die Pakete ins Zielnetz (172.16.0.0/16) aus dem 192.168.1.0/24 Netz vor dem Eintritt in den Tunnel ein Masquerading durchlaufen.

Bei folgendem statischen IP-Mapping und dem Tunnel 10.23.176.128/29===1.2.3.4...5.6.7.8===172.16.0.0/16 braucht man folgende Regeln für den Hinweg:
/sbin/iptables -t nat -A POSTROUTING -s 192.168.1.65 -d 172.16.0.0/16 \
                 -m policy --dir out -j SNAT --to 10.23.176.130
/sbin/iptables -t nat -A POSTROUTING -s 192.168.1.66 -d 172.16.0.0/16 \
                 -m policy --dir out -j SNAT --to 10.23.176.131
Für den Rückweg muss man Sorge tragen, dass zuerst die Pakete lokal angenommen werden, um sie dann an den entsprechenden internen Rechner weiterzuleiten:
ifconfig eth0:0 10.23.176.130
ifconfig eth0:1 10.23.176.131

/sbin/iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -d 10.23.176.130 \
                 -j DNAT --to 192.168.1.65
/sbin/iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -d 10.23.176.131 \
                 -j DNAT --to 192.168.1.66
Will man das ganze noch filtern, kann man iptables noch Regeln mitgeben, die für Pakete aus dem Tunnel/inbound gedacht sind: -m policy --dir in, bzw. in den Tunnel gehen/outbound: -m policy --dir out.
# Accept SSH 
/sbin/iptables -A FORWARD -p tcp --dport 22 \
                -m policy --dir in --mode tunnel  -j ACCEPT

posted at: 2013 May 09 at 02:33 | path: /net | permanent link to this entry

X11 Konfiguration

Da ich immer wieder darüber stolper und es immer wieder vergesse:
# Tastatur Repeat Geschwindigkeit einstellen:
xset r rate 250 30

# Xresources in laufende X-Session einlesen:
xrdb -load ~/.Xresources

posted at: 2013 May 09 at 02:22 | path: /linux | permanent link to this entry

hightlight


/* CSS */

h3 {
    font-size:1.3em;
    margin:1.2em 0 0.6em 0;
    color:#999
}

h4 {
    font-size:1.1em;
    margin:1.2em 0 0.6em 0;
    color:#999
}

// Misc

int x = foo();  /* This is a comment This is not code
  Continuation of comment */
int y = bar();

// Javascript w/jquery

// Fullscreen the HTML document on click
$('#fullscreen-button').on('click', function() {
  var doc = document.documentElement;
  if (doc.requestFullscreen) {
    doc.requestFullscreen();
  }
});
#!/usr/bin/perl

use strict;
use integer;

# the nth element of the fibonacci series
# param n - an int >= 0
# return an int >= 0
sub fib($) {
  my $n = shift, $a = 1, $b = 1;
  ($a, $b) = ($a + $b, $a) until (--$n < 0);
  return $a;
}

print fib(10);

posted at: 2013 Mar 05 at 18:22 | path: /linux | permanent link to this entry

powered by blosxom