Archiv der Kategorie: Linux

Python Version von getadsmtp.pl

Ü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

OpenSSH 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 😉

Automatische Proxy Zuweisung über WPAD/PAC

In meiner Testumgebung verwende ich verschiedene Domains die nicht über einen Proxy gehen sollen. Da die manuelle Pflege an meinen Maschinen mir zu umständlich erscheint habe ich mich für den Proxy PAC (Proxy Auto Configuration) weg entschieden. Normalerweise wäre es ja ganz einfach, einfach bei jeder Domain als TLD .local verwenden und als Filter in der  Proxykonfiguration *.local ausschließen. Leider habe ich aber auch .com, usw. im Einsatz und ein Filter auf *.com wäre denkbar unpraktisch 😉 Die Lösung: PAC-File zentral auf meinem Server und bekanntgabe via WPAD.

PAC-File (wpad.dat)

function FindProxyForURL(url, host) {

   var proxy_yes = "PROXY proxy.lanbugs.local:3128";
   var proxy_wlan_yes = "PROXY proxy-wlan.lanbugs.local:3128";
   var proxy_no = "DIRECT";
   var proxy_failback = "PROXY proxy.lanbugs.local:3128; DIRECT";

   // Muss ins Internet direkt
   if (shExpMatch(url,"www.lanbugs.de/*")) {return proxy_yes;}
   if (shExpMatch(url,"www.thoma.cc/*")) {return proxy_yes;}

   // Interne Webseiten
   if (shExpMatch(url,"*.lanbugs.local/*")) {return proxy_no;}
   if (shExpMatch(url, "*.lanbugs.de/*")) {return proxy_no;}
   if (shExpMatch(url, "*.thoma.cc/*")) {return proxy_no;}

   // Homenet
   if (isInNet(host, "10.10.4.0", "255.255.255.0")) {
      return proxy_yes;
   }

   // WLAN
   if (isInNet(host, "10.10.5.0", "255.255.255.0")) {
      return proxy_wlan_yes;
   }

   // Server
   if (isInNet(host, "10.10.4.200", "255.255.255.255"){
     return proxy_no;
   }

   return proxy_failback;
}

Meine PAC Konfiguration mancht folgendes:

  • www.lanbugs.de wird weiterhin zum Proxy gesendet alles andere wird direkt über den internen DNS auf interne Webserver umgeleitet
  • www.thoma.cc wird weiterhin zum Proxy gesendet alles andere wird direkt über den internen DNS aus interne Webserver umgeleitet
  • *.lanbugs.local wird komplett vom Proxy ausgeschlossen
  • Mein Homenet wird komplett über den Proxy proxy.lanbugs.local abgewickelt
  • Mein WLAN Netz wird komplett über den Proxy proxy-wlan.lanbugs.local abgewickelt
  • Für den Server 10.10.4.200 geht nicht über den Proxy
  • Für alle anderen wird versucht über den Proxy zu gehen funktioniert das nicht versucht der Browser es direkt

WPAD Konfiguration

WPAD lässt sich über DNS, DHCP und als manuelles File verteilen, leider unterstützen nicht alle Browser alle Wege.

WPAD Kompatibilitätsliste

Browser DNS DHCP Manuelles File
Internet Explorer 6.0 (SP1) und höher JA JA JA
Firefox 1.5.x JA NEIN JA
Firefox 2.5.x JA NEIN JA
Opera NEIN NEIN JA
NetScape JA NEIN JA
Safari ? ? JA

Vorbereiten des Webservers für WPAD/PAC File

Mein Server läuft mit Ubuntu 8.04 LTS. Bei den Ubuntu / Debian Versionen liegt die MIME Type Konfiguration unter /etc/apache2/mods-enabled.

/etc/apache2/mods-enabled/mime.conf

AddType application/x-ns-proxy-autoconfig .dat
AddType application/x-ns-proxy-autoconfig .pac

Desweiteren sollte die Dateiendung noch in /etc/mime.types bekannt gegeben werden.

application/x-ns-proxy-autoconfig dat
application/x-ns-proxy-autoconfig pac

Das PAC File liegt im root-Verzeichnis des Webservers /var/www als proxy.pac und wpad.dat. Alternativ habe ich noch einen Vorschlag gelesen nur die proxy.pac anzulegen und die Datei via redirect unter wpad.dat erreichbar zu machen. Geschmackssache ….

WPAD via DNS

WPAD via DNS geht über verschiedene Wege. Entweder über einen A/CNAME Record oder über einen TXT/SRV Eintrag. Es kann nicht schaden alle möglichkeiten anzulegen. Per DHCP wird in meinem Netz die Domain lanbugs.local als Primäres DNS Suffix mitgegeben, folglich muss ein Eintrag für wpad.lanbugs.local angelegt werden.

Auszug aus der Zone lanbugs.local:

...
wpad           IN A                       10.10.4.200
wpad.tcp       IN SRV       0 0 80        10.10.4.200
               IN TXT                     "service: wpad:http://wpad.lanbugs.local/wpad.dat"
...

WPAD via DHCP

Der DHCP Server muss mit der Option 252 erweitert werden. In dieser Option wird die URL der wpad.dat eingefügt.

option wpad code 252 = text;

subnet 10.10.4.0 netmask 255.255.255.0 {
…
option wpad “http://wpad.lanbugs.local/wpad.dat ”;
…
}

subnet 10.10.5.0 netmask 255.255.255.0 {
…
option wpad “http://wpad.lanbugs.local/wpad.dat ”;
…
}

WPAD via Manuelles File

Falls alles nicht funktionieren  sollte lässt sich das File auch manuell Eintragen.

Firefox:

Extras -> Einstellungen -> Erweitert -> Netzwerk -> Verbindung (Einstellungen) -> Automatische Proxy-Konfigurations-URL: http://wpad.lanbugs.local/proxy.pac

Internet Explorer:

Extras -> Internet Optionen -> Verindungen -> LAN-Einstellungen (Einstellungen) -> (x) Automatisches Konfigurationsskript verwenden: http://wpad.lanbugs.local/proxy.pac

Chrome:

Nutzt die Einstellungen vom Internet Explorer

Opera:

Einstellungen -> Netzwerk -> Proxyserver -> (x) Automatische Proxykonfiguration verwenden (Skript): http://wpad.lanbugs.local/proxy.pac

Finale

Damit die automatische Zuweisung klappt sollte der Browser auch so eingestellt sein das er eine WPAD Konfiguration zulässt.

Firefox:

Extras -> Einstellungen -> Erweitert -> Netzwerk -> Verbindung (Einstellungen) -> (x) Die Proxy-Einstellungen für dieses Netzwerk automatisch erkennen

Internet Explorer:

Extras -> Internet Optionen -> Verindungen -> LAN-Einstellungen (Einstellungen) -> (x) Automatische Suche der Einstellungen

Chrome:

Nutzt die Einstellugen vom Internet Explorer

Opera:

Hier scheint nur der manuelle Weg zu bleiben

Postfix als Frontend für einen Microsoft Exchange Server

Für einen Kunden habe ich einen Postfix eingerichtet als Frontend Server für seine Exchange Infrastruktur. Die Mailadressen werden automatisch aus dem Active Directory ausgelesen und in einem Hash-File gespeichert. Vorteil ist das der Postfix so nur gültige Mailaliases zulässt. Der Frontend macht auch noch weitere Überprüfungen. (postgrey, policy-weight, etc.)

Folgendes Script wird für das Auslesen der Aliase aus dem AD verwendet:

#!/usr/bin/perl -T -w

# Version 1.02

# 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 perl above.

# This requires Net::LDAP to be installed.  To install Net::LDAP, at a shell
# type "perl -MCPAN -e shell" and then "install Net::LDAP"

use Net::LDAP;
use Net::LDAP::Control::Paged;
use Net::LDAP::Constant ( "LDAP_CONTROL_PAGED" );

# Enter the path/file for the output
$VALID = "/etc/postfix/example_recipients";

# Enter the FQDN of your Active Directory domain controllers below
$dc1="domaincontroller1.example.com";
$dc2="domaincontroller2.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";

# Connecting to Active Directory domain controllers
$noldapserver=0;
$ldap = Net::LDAP->new($dc1) or
   $noldapserver=1;
if ($noldapserver == 1)  {
   $ldap = Net::LDAP->new($dc2) or
      die "Error connecting to specified domain controllers $@ \n";
}

$mesg = $ldap->bind ( dn => $user,
                     password =>$passwd);
if ( $mesg->code()) {
    die ("error:", $mesg->code(),"\n","error name: ",$mesg->error_name(),
        "\n", "error text: ",$mesg->error_text(),"\n");
}

# How many LDAP query results to grab for each paged round
# Set to under 1000 for Active Directory
$page = Net::LDAP::Control::Paged->new( size => 990 );

@args = ( base     => $hqbase,
# 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) ))",
          control  => [ $page ],
          attrs  => "proxyAddresses",
);

my $cookie;
while(1) {
  # Perform search
  my $mesg = $ldap->search( @args );

# Filtering results for proxyAddresses attributes
  foreach my $entry ( $mesg->entries ) {
    my $name = $entry->get_value( "cn" );
    # LDAP Attributes are multi-valued, so we have to print each one.
    foreach my $mail ( $entry->get_value( "proxyAddresses" ) ) {
     # Test if the Line starts with one of the following lines:
     # proxyAddresses: [smtp|SMTP]:
     # and also discard this starting string, so that $mail is only the
     # address without any other characters...
     if ( $mail =~ s/^(smtp|SMTP)://gs ) {
       push(@valid, $mail." OK\n");
     }
    }
  }

  # Only continue on LDAP_SUCCESS
  $mesg->code and last;

  # Get cookie from paged control
  my($resp)  = $mesg->control( LDAP_CONTROL_PAGED ) or last;
  $cookie    = $resp->cookie or last;

  # Set cookie in paged control
  $page->cookie($cookie);
}

if ($cookie) {
  # We had an abnormal exit, so let the server know we do not want any more
  $page->cookie($cookie);
  $page->size(0);
  $ldap->search( @args );
  # Also would be a good idea to die unhappily and inform OP at this point
     die("LDAP query unsuccessful");
}
# Only write the file once the query is successful
open VALID, ">$VALID" or die "CANNOT OPEN $VALID $!";
print VALID @valid;
# Add additional restrictions, users, etc. to the output file below.
#print VALID "user\@example.com OK\n";
#print VALID "user1\@example.com 550 User unknown.\n";
#print VALID "bad.example.com 550 User does not exist.\n";

close VALID;

Quelle: http://www-personal.umich.edu/~malth/gaptuning/postfix/

Ich habe das Perlscript in /etc/postfix abgelegt. Rechte sollten auch 700 sein. Diese 6 Parameter müssen geändert werden.

$VALID = "/etc/postfix/exchange_recipients";

$dc1="dc01.lanbugs.intra";
$dc2="dc02.lanbugs.intra";

$hqbase="cn=Users,dc=lanbugs,dc=intra";

$user="cn=sys-read-aliases-mailfront,cn=Users,dc=lanbugs,dc=intra";
$passwd="geheim123";

Das Script wird als Cronjob jede Stunde ausgeführt. Hierzu muss nur ein File mit dem Namen run_read_aliases_from_exchange.sh mit den Rechten 700 im Verzeichnis /etc/cron.hourly angelegt werden. (Debian/Ubuntu)

run_read_aliases_from_exchange.sh:

#!/bin/sh

cd /etc/postfix ; ./getadsmtp.pl && postmap exchange_recipients

In der /etc/postfix/main.cf kann dann das neue Hash-File als relay_recipient_map verwendet werden.

main.cf:

...
relay_recipient_maps = hash:/etc/postfix/exchange_recipients
relay_domains = lanbugs.de
transport_maps = hash:/etc/postfix/transport
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 10.1.1.20/32
...

relay_domains erlaubt allgemein die Domain lanbugs.de. mynetworks wurde noch um die IP-Adresse des Exchange Servers erweitert damit dieser E-Mails zur Außenwelt senden kann. Die transport_maps sorgen dafür dass alle Mails an lanbugs.de an den Exchange Server weiter transportiert werden.

/etc/postfix/transport: (nach dem Anlegen postmap /etc/postfix/transport nicht vergessen!!!!)

langbugs.de      smtp:[10.1.1.20]:25

10.1.1.20 ist der interne Exchange Server.

Viel Spaß mit dem Postfix Frontend 😉

Forwarding für bestimmte DNS Zonen in Bind9

In diesem Szenario hat der Kunde in der DMZ 2 DNS Server (Forwarding zum Provider) stehen. Diese DNS Server sind die „Inernet“ DNS Server. Im internen Netz betreibt der Kunde mehrere Active Directory instanzen. Der Kunde möchte das seine internen DNS Zonen innerhalb der DMZ auflösbar sind. Dies kann man über Zonenweiterleitung in Bind realisieren.

zone "ad01.local" IN {
	type forward;
	forwarders {10.0.0.1; 10.0.0.2;};
};

zone "ad02.local" IN {
	type forward;
	forwarders {10.0.0.3; 10.0.0.4;};
};

zone "msexch.local" IN {
	type forward;
	forwarders {10.0.0.5; 10.0.0.6;};
};

eth Inferfacenummerierung ändern

für Ubuntu / Debian

In bestimmten Fällen will man die Nummerierung der eth Interfaces ändern. Wenn z.B. eine virtuelle Maschine geklont wird und eine neue MAC-Adresse für das Ethernet Interface generiert wird dann würde das Interface eth1 lauten.

Die Zuordnung der Interfaces wird über UDEV realisiert in der Datei /etc/udev/rules.d/70-persistent-net.rules

Nach Änderung der MAC Adresse:

# This file was automatically generated by the /lib/udev/write_net_rules
# program, run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single
# line, and change only the value of the NAME= key.


# PCI device 0x1022:0x2000 (pcnet32)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:15:a5:b6", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

# PCI device 0x1022:0x2000 (pcnet32)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:15:a5:b7", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"

00:0c:29:15:a5:b7 soll wieder eth0 werden 00:0c:29:15:a5:b6 gibt es nicht mehr und kann gelöscht werden.

Nach Änderung:

# This file was automatically generated by the /lib/udev/write_net_rules
# program, run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single
# line, and change only the value of the NAME= key.

# PCI device 0x1022:0x2000 (pcnet32)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:15:a5:b7", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

Neue SSH Hostkeys generieren

für Debian / Ubuntu

Falls man eine VMware Maschine kopiert benötigt man neue SSH Keys. Folgende Zeilen generieren neue Keys.

sudo rm /etc/ssh/ssh_host_key
sudo rm /etc/ssh/ssh_host_key.pub
sudo rm /etc/ssh/ssh_host_rsa_key
sudo rm /etc/ssh/ssh_host_rsa_key.pub
sudo rm /etc/ssh/ssh_host_dsa_key
sudo rm /etc/ssh/ssh_host_dsa_key.pub
sudo /usr/bin/ssh-keygen -t rsa1 -f /etc/ssh/ssh_host_key -N ""
sudo /usr/bin/ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -N ""
sudo /usr/bin/ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ""

WPA Enterprise mit EAP PEAP

Howto für Ubuntu und Debian

Für dieses Howto wird freeradius mit openssl Support benötigt.

Eine Anleitung für freeradius+openssl ist hier zu finden: Freeradius mit EAP Support

Die Pakete wie in der Anleitung beschrieben installieren.

Die unten aufgeführten Konfigurationsteile sind Ergänzungen oder Änderungen der Default Config.

openssl installieren
apt-get install openssl
RootCA anlegen

In das Verzeichnis /etc/freeradius/certs wechseln

cd /etc/freeradius/certs

openssl liefert ein einfaches Script um eine CA anzulegen.

/usr/lib/ssl/misc/CA.pl -newca
CA certificate filename (or enter to create)

Mit [Enter] bestätigen.

Making CA certificate ...
Generating a 1024 bit RSA private key
...............................................++++++
..........++++++
writing new private key to './demoCA/private/cakey.pem'

Ein Passwort definieren und eingeben.

Enter PEM pass phrase:
Verifying – Enter PEM pass phrase:

-----
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) [AU]:DE
State or Province Name (full name) [Some-State]:Bayern
Locality Name (eg, city) []:München
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Test
Organizational Unit Name (eg, section) []:Testabteilung
Common Name (eg, YOUR name) []:rootca
Email Address []:rootca@example.org

Please enter the following 'extra' attributes
to be sent with your certificate request

2 mal mit [Enter] bestätigen.

A challenge password []:
An optional company name []:

Using configuration from /usr/lib/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number:
            b7:bc:7f:60:3c:98:84:b2
        Validity
            Not Before: Jul 31 07:33:47 2009 GMT
            Not After : Jul 30 07:33:47 2012 GMT
        Subject:
            countryName               = DE
            stateOrProvinceName       = Bayern
            organizationName          = Test
            organizationalUnitName    = Testabteilung
            commonName                = rootca
            emailAddress              = rootca@example.org
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                5C:85:A3:1C:70:8E:E3:60:62:C9:5A:60:83:A2:D5:3C:EA:64:C7:C9
            X509v3 Authority Key Identifier:
                keyid:5C:85:A3:1C:70:8E:E3:60:62:C9:5A:60:83:A2:D5:3C:EA:64:C7:C9
                DirName:/C=DE/ST=Bayern/O=Test/OU=Testabteilung/CN=rootca/emailAddress=rootca@example.org
                serial:B7:BC:7F:60:3C:98:84:B2

            X509v3 Basic Constraints:
                CA:TRUE
Certificate is to be certified until Jul 30 07:33:47 2012 GMT (1095 days)

Write out database with 1 new entries
Data Base Updated
Server Zertifikat erzeugen
openssl req -new -nodes -keyout server_key.pem -out server_req.pem -days 730 -config /etc/ssl/openssl.cnf
Generating a 1024 bit RSA private key
...++++++
..............................................................................++++++
writing new private key to 'server_key.pem'
-----
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) [AU]:DE
State or Province Name (full name) [Some-State]:Bayern
Locality Name (eg, city) []:München
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Test
Organizational Unit Name (eg, section) []:Testabteilung
Common Name (eg, YOUR name) []:server
Email Address []:server@example.org

Please enter the following 'extra' attributes
to be sent with your certificate request

A challenge password []:
An optional company name []:

Server Zertifikat mit der rootCA signieren
openssl ca -config /etc/ssl/openssl.cnf -policy policy_anything -out server_cert.pem -infiles ./server_req.pem
Using configuration from /etc/ssl/openssl.cnf

Passwort der CA eingeben:

Enter pass phrase for ./demoCA/private/cakey.pem:

Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number:
            b7:bc:7f:60:3c:98:84:b3
        Validity
            Not Before: Jul 31 08:10:11 2009 GMT
            Not After : Jul 31 08:10:11 2010 GMT
        Subject:
            countryName               = DE
            stateOrProvinceName       = Bayern
            localityName              = M\C3\BCnchen
            organizationName          = Test
            organizationalUnitName    = Testabteilung
            commonName                = server
            emailAddress              = server@example.org
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                D7:95:A8:C4:D7:70:BE:4C:D4:52:B1:E6:B5:A6:CD:37:B2:4A:6B:AE
            X509v3 Authority Key Identifier:
                keyid:5C:85:A3:1C:70:8E:E3:60:62:C9:5A:60:83:A2:D5:3C:EA:64:C7:C9

Certificate is to be certified until Jul 31 08:10:11 2010 GMT (365 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
Server Zertifikat zusammenbauen
cat server_key.pem server_cert.pem > server.pem
radiusd.conf
mschap {
 authtype = MS-CHAP
 use_mppe = yes
 require_encryption = yes
 require_strong = yes
clients.conf

In clients.conf muss für den Accesspoint ein „Shared Secret“ festgelegt werden. 192.168.0.10 ist die IP des Accesspoints.

client 192.168.0.10 {
        # This is the shared secret between the Authenticator (the
        # access point) and the Authentication Server (RADIUS).
        secret          = 123password456
        shortname       = accesspoint
    }
users

Einen neuen User anlegen. Am Ende der users Datei einen neuen Benutzer hinzufügen. ACHTUNG in mehreren Howtos wird der Syntax User-Password == „password“ noch verwendet. Dieser Syntax ist für freeradius Version 2.x obsolet. Der neue Syntax lautet Cleartext-Password := „password“.

"mobil-user"     Cleartext-Password := "password123"
eap.conf
eap {
 default_eap_type = peap
  tls {
   CA_file = ${cadir}/demoCA/cacert.pem
  }
}
sites-enabled/default
authorize {
 mschap
 # unix
}

authenticate {
 Auth-Type MS-CHAP {
  mschap
 }
 # unix
}

accounting {
 # unix
}
freeradius testen
freeradius -X

Wenn alles ohne Fehler durchläuft sollte da folgendes erscheinen

Listening on authentication address * port 1812
Listening on accounting address * port 1813
Listening on proxy address * port 1814
Ready to process requests.
Daemon starten
[Strg-C]
/etc/init.d/freeradius start
Accesspoint einstellen -Allgemein-
  • Radiusserver + Radiusport + Shared Secret eingeben
  • Modus: WPA2-Enterprise
Client anbinden -Allgemein-
  • CAcert.pem zu den vertrauten Zertifizierungsstellen hinzufügen
  • Mode WPA2-Enterprise
  • EAP PEAP auswählen
Fertig!

freeradius mit EAP TLS/TTLS/PEAP Support

Howto für Ubuntu und Debian

Das Paket wird leider bei Debian und Ubuntu ohne SSL Support ausgeliefert weshalb alle EAP Varianten die SSL benötigen nicht funktionieren. Das Paket kann aber relativ einfach selbst gebaut werden dank der Debiantools.

Benötigte Pakete
apt-get install build-essentials apt-src
Sourcen laden
cd ~
mkdir build_freeradius
cd build_freeradius
apt-src install freeradius
Änderungen
cd freeradius-2.0.4+dfsg/debian

File: rules

von

...
--without-rlm_eap_tls \
--without-rlm_eap_ttls \
--without-rlm_eap_peap \
...
--without-openssl \
...

auf

...
--with-rlm_eap_tls \
--with-rlm_eap_ttls \
--with-rlm_eap_peap \
...
--with-openssl \
...

und

for pkg in ${pkgs} ; do \
   if dh_shlibdeps -p $$pkg -- -O 2>/dev/null | grep -q libssl; then \
      echo "$$pkg links to openssl" ;\
      exit 1 ;\
   fi ;\
done

entfernen.

File: control

Am Ende der Teile „Build-Depends:“ libssl-dev anfügen.

Source: freeradius
Build-Depends: autotools-dev, debhelper (>= 6.0.7), libgdbm-dev, libiodbc2-dev, libkrb5-dev, libldap2-dev, libltdl3-dev, libmysqlclient15-dev | libmysqlclient-dev, libpam0g-dev, libpcap-dev, libperl-dev, libpq-dev, libsasl2-dev, libsnmp-dev, libtool, python-dev, libssl-dev
Verzeichnis debian verlassen und Paket bauen
cd ..
dpkg-buildpackage -rfakeroot
Pakete sind fertig
drwxr-xr-x 15 root root    4096 30. Jul 11:57 freeradius-2.0.4+dfsg
-rw-r--r--  1 root root    5351 30. Jul 11:54 freeradius_2.0.4+dfsg-6.diff.gz
-rw-r--r--  1 root root    1243 30. Jul 11:54 freeradius_2.0.4+dfsg-6.dsc
-rw-r--r--  1 root root    5382 30. Jul 11:58 freeradius_2.0.4+dfsg-6_i386.changes
-rw-r--r--  1 root root  504906 30. Jul 11:58 freeradius_2.0.4+dfsg-6_i386.deb
-rw-r--r--  1 root root 2953674 19. Mai 2008  freeradius_2.0.4+dfsg.orig.tar.gz
-rw-r--r--  1 root root  205830 30. Jul 11:58 freeradius-common_2.0.4+dfsg-6_all.deb
-rw-r--r--  1 root root  928204 30. Jul 11:58 freeradius-dbg_2.0.4+dfsg-6_i386.deb
-rw-r--r--  1 root root  132494 30. Jul 11:58 freeradius-dialupadmin_2.0.4+dfsg-6_all.deb
-rw-r--r--  1 root root   17190 30. Jul 11:58 freeradius-iodbc_2.0.4+dfsg-6_i386.deb
-rw-r--r--  1 root root   18090 30. Jul 11:58 freeradius-krb5_2.0.4+dfsg-6_i386.deb
-rw-r--r--  1 root root   34740 30. Jul 11:58 freeradius-ldap_2.0.4+dfsg-6_i386.deb
-rw-r--r--  1 root root   24996 30. Jul 11:58 freeradius-mysql_2.0.4+dfsg-6_i386.deb
-rw-r--r--  1 root root   35934 30. Jul 11:58 freeradius-postgresql_2.0.4+dfsg-6_i386.deb
-rw-r--r--  1 root root   71854 30. Jul 11:58 freeradius-utils_2.0.4+dfsg-6_i386.deb
-rw-r--r--  1 root root   85280 30. Jul 11:58 libfreeradius2_2.0.4+dfsg-6_i386.deb
-rw-r--r--  1 root root  104758 30. Jul 11:58 libfreeradius-dev_2.0.4+dfsg-6_i386.deb
Paket installieren
dpkg -i freeradius-common_2.0.4+dfsg-6_all.deb
dpkg -i libfreeradius2_2.0.4+dfsg-6_i386.deb
dpkg -i freeradius_2.0.4+dfsg-6_i386.deb
freeradius auf hold setzen

Damit beim nächsten apt-get upgrade unser selbstgebautes Paket nicht überschrieben wird müssen wir das Paket noch auf hold setzen.

dpkg --get-selections | grep free
freeradius					install
freeradius-common				install
libfreeradius2					install
dpkg --set-selections [enter]
freeradius hold
freeradius-common hold
libfreeradius2 hold
[Strg+D]

Ergebnis kontrollieren

dpkg --get-selections | grep free
freeradius					hold
freeradius-common				hold
libfreeradius2					hold
Fertig

TFTPd – Server

Howto für  Ubuntu und  Debian

Pakete installieren
sudo apt-get install xinetd tftpd tftp
Datei: /etc/xinetd.d/tftp anlegen
nano /etc/xinetd.d/tftp
service tftp
{
protocol        = udp
port            = 69
socket_type     = dgram
wait            = yes
user            = nobody
server          = /usr/sbin/in.tftpd
server_args     = /srv/tftp
disable         = no
}
Ordner anlegen
sudo mkdir /srv/tftp
sudo chmod -R 777 /srv/tftp
sudo chown -R nobody /srv/tftp
tftpd über xinetd starten
sudo /etc/init.d/xinetd start
Test

Testfile anlegen

root@test4:/root# dd bs=1000 count=5 if=/dev/urandom of=testfile.txt

root@test4:/root# ls -la testfile.txt
-rw-r--r-- 1 root root 5000 2009-07-22 19:49 testfile.txt

Verbinden mit TFTP Server und Datei übertragen

root@test4:/root# tftp 10.1.1.1
tftp> put testfile.txt
Sent 5000 bytes in 0.0 seconds
tftp> quit

In Serververzeichnis wecheln

cd /srv/tftp

File ist vollständig angekommen

root@test4:/srv/tftp# ls -la testfile.txt
-rw------- 1 nobody nogroup   5000 2009-07-22 19:50 testfile.txt
Fertig

danted SOCKS4 Server

Howto für Ubuntu und Debian

danted installieren
apt-get install dante-server
Configfile anpassen
#logoutput: stderr
logoutput: syslog
#the above line will send any logs to /var/log/syslog instead to a terminal

internal: eth0 port = 1080
internal: 127.0.0.1 port = 1080

external: eth0

method: username none
#the above puts no username or password. Access will instead be controlled via client ip address/range.
#if there is no username or password - then danted socks server needs to run as nobody,   i.e.

#method: pam
# if you choose to use pam instead - a valid username&password as required for sshing to   the socks server is required.
#Note: not sure if proxy login details are sent in clear text.

#user.privileged: proxy
user.notprivileged: nobody

client pass {
        from: 10.1.1.0/24 port 1-65535 to: 0.0.0.0/0
        # 10.1.1.1/0 = specific ip address.
        # 10.1.1.0/24 = specific address range.
} 

client pass {
        from: 127.0.0.0/8 port 1-65535 to: 0.0.0.0/0
}

client block {
        from: 0.0.0.0/0 to: 0.0.0.0/0
        log: connect error
}

#Finally block other traffic
block {
  from: 0.0.0.0/0 to: 127.0.0.0/8
  log: connect error
}

pass {
  from: 10.1.1.0/24 to: 0.0.0.0/0
  protocol: tcp udp
}

pass {
  from: 127.0.0.0/8 to: 0.0.0.0/0
  protocol: tcp udp
}

block {
  from: 0.0.0.0/0 to: 0.0.0.0/0
  log: connect error
}
danted starten
/etc/init.d/danted start
check
netstat -tulpen

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode       PID/Program name
...
tcp        0      0 10.1.1.206:1080        0.0.0.0:*               LISTEN      0          1194455     25994/danted
...

Atheros Madwifi Treiber installieren

Howto für Ubuntu

Nötige Pakete installieren
sudo apt-get install build-essential linux-headers-386 subversion
Madwifi herunterladen
cd /tmp
svn checkout http://madwifi-project.org/svn/madwifi/trunk madwifi
cd madwifi
Treiber kompilieren und installieren
export KERNELPATH=/usr/src/linux-headers-$(uname -r)
export KERNELRELEASE=$(uname -r)

make
sudo make install
make clean
ath_pci Treiber aktivieren
sudo nano /etc/modprobe.d/blacklist-ath_pci.conf

#blacklist ath_pci
blacklist ath5k

und

sudo nano /etc/modules

ath_pci
wlan

einfügen.

Treiber laden
rmmod ath5k
modprobe ath_pci
modprobe wlan
überprüfen
dmesg | grep ath
Fertig!

Trixbox mit Sipgate verbinden

Da ich auch ein bisschen googeln musste bis es funktioniert hat, habe ich ein kleines Howto geschrieben mit den wichtigsten Schritten. Die Konfiguration muss im Webinterface der Trixbox erfolgen. Alle Änderungen wurden unter Asterisk → FreePBX gemacht.

1. FreePBX: General Settings

Den Wert Allow Anonymous Inbound SIP Calls? auf YES setzen.

2. FreePBX: Trunks

Add SIP Trunk anklicken.

Name Wert
Outbound Caller ID ausgehende Telefonnummer z.B. 0891234567890
Maximum Channels Anzahl der Kanäle z.B. 1
Outgoing Settings
Trunk Name
z.B. sipgate_out
Outgoing Settings
PEER Details
username=<sipid>
type=friend
secret=<sippassword>
qualify=true
nat=yes
host=sipgate.de
fromuser=<sipid>
fromdomain=sipgate.de
insecure=very
Registration
Register String
<sipid>:<sippassword>@sipgate.de/<sipid>

Mit Submit changes bestätigen.

3. FreePBX: Outbound Routes

Name Wert
Route Name z.B. out
Dial Patterns ohne Amtsholung mit 0

 .

mit Amtsholung mit 0

0|.
Trunk Sequence z.B. SIP/sipgate_out

Mit Submit changes bestätigen.

4. FreePBX: Inbound Routes

Name Wert
Description z.B. sipgate_in
DID Number <sipid>
Extensions Auswählen und im Dropdown den Teilnehmer auswählen

Mit Submit changes bestätigen.

5. Reload durchführen

Apply Configuration Changes anklicken und bestätigen.

Weniger Spam & Phishing durch Sanesecurity & MSRBL-SPAM für ClamAV

Trotz Amavis & Spamassassin und sehr restriktiver Regeln im Postfix kommen immernoch viele Phishing und Bilder/PDF Spams durch. Ich habe nach einer bequemen Lösung gesucht und bin auf Sanesecurity und MSRBL-SPAM gestoßen. Beide bieten Signaturenfiles für ClamAV an die Spams & Phishings erkennen können. Auf der Webseite von Sanesecurity werden mehrere Scripts angeboten die die Signaturen runterladen und ClamAV reloaden. Diese haben mir aber nicht gefallen deshalb habe ich ein kleineres und einfacheres geschieben das täglich als Cronjob ausgeführt wird.

Lösung

Benötigt wird rsync, gunzip und clamav.

Die Signaturen von ClamAV liegen bei Debian,Ubuntu,Gentoo,etc. in

/var/lib/clamav

Folgendes Script liegt in /etc/cron.daily und heisst get_sane:

cd /tmp
wget http://www.sanesecurity.co.uk/clamav/scamsigs/scam.ndb.gz
wget http://www.sanesecurity.co.uk/clamav/phishsigs/phish.ndb.gz

rsync rsync://rsync.mirror.msrbl.com/msrbl/MSRBL-Images.hdb /tmp/MSRBL-Images.hdb
rsync rsync://rsync.mirror.msrbl.com/msrbl/MSRBL-SPAM.ndb /tmp/MSRBL-SPAM.ndb

gunzip -f scam.ndb.gz
gunzip -f phish.ndb.gz
cp -f scam.ndb /var/lib/clamav
cp -f phish.ndb /var/lib/clamav
cp -f MSRBL-Images.hdb /var/lib/clamav
cp -f MSRBL-SPAM.ndb /var/lib/clamav

chown clamav:clamav /var/lib/clamav/scam.ndb
chown clamav:clamav /var/lib/clamav/phish.ndb
chown clamav:clamav /var/lib/clamav/MSRBL-Images.hdb
chown clamav:clamav /var/lib/clamav/MSRBL-SPAM.ndb

/etc/init.d/clamav-daemon reload-database

Script noch ausführbar für root machen.

chmod 700 /etc/cron.daily/get_sane

Test

Da der Cronjob nur Täglich ausgeführt wird muss man es einmal manuell machen damit man es gleich testen kann.

Folgende Datei ausführen:

/etc/cron.daily/get_sane

Danach sollte ein ls -la /var/lib/clamav folgendes ausgeben:

sys@monster /tmp # ls -la /var/lib/clamav
insgesamt 14276
drwxr-xr-x  3 clamav clamav     4096 2008-03-26 11:35 .
drwxr-xr-x 33 root   root       4096 2008-03-02 11:23 ..
drwxr-xr-x  2 clamav clamav     4096 2008-03-26 11:35 daily.inc
-rw-r--r--  1 clamav clamav 11347852 2008-03-02 11:47 main.cvd
-rw-------  1 clamav clamav      572 2008-03-26 11:28 mirrors.dat
-rw-r--r--  1 clamav clamav      24670 2008-03-26 06:27 MSRBL-Images.hdb
-rw-r--r--  1 clamav clamav     235227 2008-03-26 06:27 MSRBL-SPAM.ndb
-rw-r--r--  1 clamav clamav    1450465 2008-03-26 06:27 phish.ndb
-rw-r--r--  1 clamav clamav    1500415 2008-03-26 06:27 scam.ndb
sys@monster /tmp #

Sanesecurity bietet Testfiles an um die Signaturen zu Testen.

Testdateien herunterladen und testen:

sys@monster ~ # cd /tmp
sys@monster /tmp # wget http://www.sanesecurity.com/clamav/phish_sigtest.txt
...
sys@monster /tmp # wget http://www.sanesecurity.com/clamav/scam_sigtest.txt
...
sys@monster /tmp # clamscan phish_sigtest.txt
phish_sigtest.txt: Html.Phishing.Sanesecurity.TestSig FOUND

----------- SCAN SUMMARY -----------
Known viruses: 253652
Engine version: 0.92.1
Scanned directories: 0
Scanned files: 1
Infected files: 1
Data scanned: 0.00 MB
Time: 4.394 sec (0 m 4 s)

sys@monster /tmp # clamscan scam_sigtest.txt
scam_sigtest.txt: Html.Scam.Sanesecurity.TestSig FOUND

----------- SCAN SUMMARY -----------
Known viruses: 253652
Engine version: 0.92.1
Scanned directories: 0
Scanned files: 1
Infected files: 1
Data scanned: 0.00 MB
Time: 4.462 sec (0 m 4 s)

sys@monster /tmp # 

Fertig! Viel Spaß ….



Proftpd mit MySQL-Backend und Quota

Ich habe darauf Wert gelegt, dass die Passwörter verschlüsselt in der Datenbank liegen!

Wer Klartextpasswörter haben möchte soll bitte auf → howtoforge gehen.

Written by — Maximilian Thoma 2007/12/16 19:19

Anforderungen

  • Apache 2
  • PHP (mind. 4.x)
  • PHPmyAdmin
  • MySQL Server (mind. 4.x)
  • OpenSSL

Installation von proftpd und Konfiguration

Installation der Pakete

sudo apt-get install proftpd-mysql

Während der Installation taucht folgende Frage auf:

Run proftpd from inetd or standalone?

Bitte wählen Sie „standalone“ aus. (In Deutsch heisst die Auswahl „Daemon“)

User und Gruppe für proftpd Dateien anlegen

groupadd -g 2001 ftpgroup
useradd -u 2001 -s /bin/false -d /bin/null -c "proftpd user" -g ftpgroup ftpuser

MySQL User anlegen für proftpd

mysql -u root -p
CREATE DATABASE ftp;
GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'ftp'@'localhost' IDENTIFIED BY 'password';
GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'ftp'@'localhost.localdomain' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;

Die MySQL Shell noch nicht verlassen !!!

MySQL Tabellen für proftpd anlegen

USE ftp;
 
CREATE TABLE ftpgroup (
groupname VARCHAR(16) NOT NULL DEFAULT '',
gid SMALLINT(6) NOT NULL DEFAULT '5500',
members VARCHAR(16) NOT NULL DEFAULT '',
KEY groupname (groupname)
) TYPE=MyISAM COMMENT='ProFTP group table';
 
CREATE TABLE ftpquotalimits (
name VARCHAR(30) DEFAULT NULL,
quota_type ENUM('user','group','class','all') NOT NULL DEFAULT 'user',
per_session ENUM('false','true') NOT NULL DEFAULT 'false',
limit_type ENUM('soft','hard') NOT NULL DEFAULT 'soft',
bytes_in_avail INT(10) UNSIGNED NOT NULL DEFAULT '0',
bytes_out_avail INT(10) UNSIGNED NOT NULL DEFAULT '0',
bytes_xfer_avail INT(10) UNSIGNED NOT NULL DEFAULT '0',
files_in_avail INT(10) UNSIGNED NOT NULL DEFAULT '0',
files_out_avail INT(10) UNSIGNED NOT NULL DEFAULT '0',
files_xfer_avail INT(10) UNSIGNED NOT NULL DEFAULT '0'
) TYPE=MyISAM;
 
CREATE TABLE ftpquotatallies (
name VARCHAR(30) NOT NULL DEFAULT '',
quota_type ENUM('user','group','class','all') NOT NULL DEFAULT 'user',
bytes_in_used INT(10) UNSIGNED NOT NULL DEFAULT '0',
bytes_out_used INT(10) UNSIGNED NOT NULL DEFAULT '0',
bytes_xfer_used INT(10) UNSIGNED NOT NULL DEFAULT '0',
files_in_used INT(10) UNSIGNED NOT NULL DEFAULT '0',
files_out_used INT(10) UNSIGNED NOT NULL DEFAULT '0',
files_xfer_used INT(10) UNSIGNED NOT NULL DEFAULT '0'
) TYPE=MyISAM;
 
CREATE TABLE ftpuser (
id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
userid VARCHAR(32) NOT NULL DEFAULT '',
passwd VARCHAR(32) NOT NULL DEFAULT '',
uid SMALLINT(6) NOT NULL DEFAULT '5500',
gid SMALLINT(6) NOT NULL DEFAULT '5500',
homedir VARCHAR(255) NOT NULL DEFAULT '',
shell VARCHAR(16) NOT NULL DEFAULT '/sbin/nologin',
count INT(11) NOT NULL DEFAULT '0',
accessed DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
modified DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (id),
UNIQUE KEY userid (userid)
) TYPE=MyISAM COMMENT='ProFTP user table';

Jetzt können wir die MySQL Shell verlassen.

quit;

/etc/proftpd/modules.conf bearbeiten

Die Zeile LoadModule mod_sql_postgres.c muss auskommentiert sein !!!

[...]
LoadModule mod_sql_postgres.c
[...]

Auskommentiert:

[...]
# LoadModule mod_sql_postgres.c
[...]

/etc/proftpd/proftpd.conf anpassen

#
# /etc/proftpd/proftpd.conf -- This is a basic ProFTPD configuration file.
# To really apply changes reload proftpd after modifications.
#

# Includes DSO modules
Include /etc/proftpd/modules.conf

# Set off to disable IPv6 support which is annoying on IPv4 only boxes.

#################################################
### IPv6 abschalten NEU NEU NEU
#################################################
UseIPv6                         off
#################################################

ServerName                      "Debian"
ServerType                      standalone
DeferWelcome                    off

MultilineRFC2228                on
DefaultServer                   on
ShowSymlinks                    on

TimeoutNoTransfer               600
TimeoutStalled                  600
TimeoutIdle                     1200

DisplayLogin                    welcome.msg
DisplayFirstChdir               .message
ListOptions                     "-l"

DenyFilter                      \*.*/

# Port 21 is the standard FTP port.
Port                            21

# In some cases you have to specify passive ports range to by-pass
# firewall limitations. Ephemeral ports can be used for that, but
# feel free to use a more narrow range.
# PassivePorts                    49152 65534

# To prevent DoS attacks, set the maximum number of child processes
# to 30.  If you need to allow more than 30 concurrent connections
# at once, simply increase this value.  Note that this ONLY works
# in standalone mode, in inetd mode you should use an inetd server
# that allows you to limit maximum number of processes per service
# (such as xinetd)
MaxInstances                    30

# Set the user and group that the server normally runs at.
User                            proftpd
Group                           nogroup

# Umask 022 is a good standard umask to prevent new files and dirs
# (second parm) from being group and world writable.
Umask                           022  022
# Normally, we want files to be overwriteable.
AllowOverwrite                  on

# Uncomment this if you are using NIS or LDAP to retrieve passwords:
# PersistentPasswd              off

# Be warned: use of this directive impacts CPU average load!
#
# Uncomment this if you like to see progress and transfer rate with ftpwho
# in downloads. That is not needed for uploads rates.
# UseSendFile                   off

TransferLog /var/log/proftpd/xferlog
SystemLog   /var/log/proftpd/proftpd.log

<IfModule mod_tls.c>
TLSEngine off
</IfModule>

<IfModule mod_quota.c>
QuotaEngine on
</IfModule>

<IfModule mod_ratio.c>
Ratios on
</IfModule>


# Delay engine reduces impact of the so-called Timing Attack described in
# http://security.lss.hr/index.php?page=details&ID=LSS-2004-10-02
# It is on by default.
<IfModule mod_delay.c>
DelayEngine on
</IfModule>

<IfModule mod_ctrls.c>
ControlsEngine        on
ControlsMaxClients    2
ControlsLog           /var/log/proftpd/controls.log
ControlsInterval      5
ControlsSocket        /var/run/proftpd/proftpd.sock
</IfModule>

<IfModule mod_ctrls_admin.c>
AdminControlsEngine on
</IfModule>

# A basic anonymous configuration, no upload directories.

# <Anonymous ~ftp>
#   User                                ftp
#   Group                               nogroup
#   # We want clients to be able to login with "anonymous" as well as "ftp"
#   UserAlias                   anonymous ftp
#   # Cosmetic changes, all files belongs to ftp user
#   DirFakeUser on ftp
#   DirFakeGroup on ftp
#
#   RequireValidShell           off
#
#   # Limit the maximum number of anonymous logins
#   MaxClients                  10
#
#   # We want 'welcome.msg' displayed at login, and '.message' displayed
#   # in each newly chdired directory.
#   DisplayLogin                        welcome.msg
#   DisplayFirstChdir           .message
#
#   # Limit WRITE everywhere in the anonymous chroot
#   <Directory *>
#     <Limit WRITE>
#       DenyAll
#     </Limit>
#   </Directory>
#
#   # Uncomment this if you're brave.
#   # <Directory incoming>
#   #   # Umask 022 is a good standard umask to prevent new files and dirs
#   #   # (second parm) from being group and world writable.
#   #   Umask                           022  022
#   #            <Limit READ WRITE>
#   #            DenyAll
#   #            </Limit>
#   #            <Limit STOR>
#   #            AllowAll
#   #            </Limit>
#   # </Directory>
#
# </Anonymous>

##################################################################
#### NEU NEU NEU NEU NEU
##################################################################

## Nur virt. User dürfen sich anmelden !!!!

<Limit LOGIN>
AllowUser ftpuser
AllowGroup ftpgroup
DenyAll
</Limit>

DefaultRoot ~


# The passwords in MySQL are encrypted using CRYPT
SQLAuthTypes            OpenSSL
SQLAuthenticate         users groups


# used to connect to the database
# databasename@host database_user user_password
SQLConnectInfo  ftp@localhost ftp password


# Here we tell ProFTPd the names of the database columns in the "usertable"
# we want it to interact with. Match the names with those in the db
SQLUserInfo     ftpuser userid passwd uid gid homedir shell

# Here we tell ProFTPd the names of the database columns in the "grouptable"
# we want it to interact with. Again the names match with those in the db
SQLGroupInfo    ftpgroup groupname gid members

# set min UID and GID - otherwise these are 999 each
SQLMinID        2000

# create a user's home directory on demand if it doesn't exist
SQLHomedirOnDemand on

# Update count every time user logs in
SQLLog PASS updatecount
SQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE userid='%u'" ftpuser

# Update modified everytime user uploads or deletes a file
SQLLog  STOR,DELE modified
SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser

# User quotas
# ===========
QuotaEngine on
QuotaDirectoryTally on
QuotaDisplayUnits Mb
QuotaShowQuotas on

SQLNamedQuery get-quota-limit SELECT "name, quota_type, per_session, limit_type, bytes_in_avail, bytes_out_avail, bytes_xfer_avail, files_in_avail, files_out_avail, files_xfer_avail FROM ftpquotalimits WHERE name = '%{0}' AND quota_type = '%{1}'"

SQLNamedQuery get-quota-tally SELECT "name, quota_type, bytes_in_used, bytes_out_used, bytes_xfer_used, files_in_used, files_out_used, files_xfer_used FROM ftpquotatallies WHERE name = '%{0}' AND quota_type = '%{1}'"

SQLNamedQuery update-quota-tally UPDATE "bytes_in_used = bytes_in_used + %{0}, bytes_out_used = bytes_out_used + %{1}, bytes_xfer_used = bytes_xfer_used + %{2}, files_in_used = files_in_used + %{3}, files_out_used = files_out_used + %{4}, files_xfer_used = files_xfer_used + %{5} WHERE name = '%{6}' AND quota_type = '%{7}'" ftpquotatallies

SQLNamedQuery insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}" ftpquotatallies

QuotaLimitTable sql:/get-quota-limit
QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally

RootLogin off
RequireValidShell off

Neustart von proftpd durchführen:

/etc/init.d/proftpd restart

Sollte bei Debian Etch folgender Fehler auftreten:

Starting ftp server: proftpd - Fatal: unknown configuration directive 'SQLAuthTypes' on line 42 of '/etc/proftpd/proftpd.conf'
 failed!

behebt folgende Zeile behebt das Problem.

Zeile in die proftpd.conf einfügen und restarten:

Include /etc/proftpd/modules.conf 

Test von proftpd

User / Gruppe in der Datenbank anlegen

MySQL Shell einloggen

mysql -u root -p

Datenbank wechseln

USE ftp;

Gruppe anlegen

Dies muss nur einmal gemacht werden da die gleiche Gruppe für alle User gilt!!!

INSERT INTO `ftpgroup` (`groupname`, `gid`, `members`) VALUES ('ftpgroup', 2001, 'ftpuser');

User und Quota anlegen

Das Passwort ist “password“.

 
INSERT INTO `ftpquotalimits` (`name`, `quota_type`, `per_session`, `limit_type`, `bytes_in_avail`, `bytes_out_avail`, `bytes_xfer_avail`, `files_in_avail`, `files_out_avail`, `files_xfer_avail`) VALUES ('testuser', 'user', 'true', 'hard', 15728640, 0, 0, 0, 0, 0);
INSERT INTO `ftpuser` (`id`, `userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed`, `modified`) VALUES (1, 'testuser', '{md5}X03MO1qnZdYdgyfeuILPmQ==', 2001, 2001, '/home/testuser', '/sbin/nologin', 0, '', '');

Ausloggen

quit;

Test

>> vmsrv01:/# ftp localhost
<< Connected to localhost.
<< 220 ProFTPD 1.3.0 Server (Debian) [127.0.0.1]
>> Name (localhost:root): testuser
<< 331 Password required for testuser.
>> Password:
<< 230 User testuser logged in.
<< Remote system type is UNIX.
<< Using binary mode to transfer files.
<< ftp>
>> ftp> quit
<< 221 Goodbye.
<< vmsrv01:/#

Das Verzeichnis für testuser sollte jetzt unter /home angelgt sein und ftpuser:ftpgroup gehören.

>> vmsrv01:/# ls -la /home
<< drwxr-xr-x  6 root     root     4096 2007-12-17 13:10 .
<< drwxr-xr-x 23 root     root     4096 2007-10-25 14:09 ..
<< drwxr-xr-x  2 ftpuser  ftpgroup 4096 2007-12-17 13:10 testuser
<< vmsrv01:/#

Verschlüsselte Passwörter für proftpd erzeugen

Welche Verschlüsselungsverfahren möglich sind können Sie mit dem Kommando

openssl list-message-digest-commands

abfragen.

Ergebnis:

vmsrv01:/# openssl list-message-digest-commands
md2
md4
md5
rmd160
sha
sha1
vmsrv01:/#

auf der Konsole

MD5

Kommando
/bin/echo "{md5}"`/bin/echo -n "password" | openssl dgst -binary -md5 | openssl enc -base64`
Ergebnis
{md5}X03MO1qnZdYdgyfeuILPmQ==

Alle möglichen Typen

Kommando
for c in `openssl list-message-digest-commands`; do
    /bin/echo "{$c}"`/bin/echo -n "password" | openssl dgst -binary -$c | openssl enc -base64`
  done
Ergebnis
{md2}8DiBqIxuORNfDsxg79YJuQ==
{md4}ip0JPxT4cB3xdzKyuxgsdA==
{md5}X03MO1qnZdYdgyfeuILPmQ==
{rmd160}LAjo9YhHUKe5n28vNC/GONsl/zE=
{sha}gAclaL6zshAjJesgP20P+S9c744=
{sha1}W6ph5Mm5Pz8GgiULbPgzG37mj9g=

mit PHP

MD5

Kommando
// $password contains the cleartext password before
$password = "{md5}".base64_encode(pack("H*", md5($password)));
// $password now contains the encrypted, encoded password
Ergebnis
{md5}X03MO1qnZdYdgyfeuILPmQ==

ClamAV mit Sanesecurity erweitern

Benötigte Tools installieren

sudo apt-get install rsync wget gunzip

Verzeichnis anlegen

mkdir -p /root/sanesecurity

Script erstellen

nano /root/sanesecurity/get_sane

Script:

cd /root/sanesecurity
wget http://www.sanesecurity.co.uk/clamav/scamsigs/scam.ndb.gz
wget http://www.sanesecurity.co.uk/clamav/phishsigs/phish.ndb.gz

rsync rsync://rsync.mirror.msrbl.com/msrbl/MSRBL-Images.hdb /root/sanesecurity/MSRBL-Images.hdb
rsync rsync://rsync.mirror.msrbl.com/msrbl/MSRBL-SPAM.ndb /root/sanesecurity/MSRBL-SPAM.ndb

gunzip -f scam.ndb.gz
gunzip -f phish.ndb.gz
cp -f scam.ndb /var/lib/clamav
cp -f phish.ndb /var/lib/clamav
cp -f MSRBL-Images.hdb /var/lib/clamav
cp -f MSRBL-SPAM.ndb /var/lib/clamav

/etc/init.d/clamav-daemon reload-database

Das ganze noch lauffähig machen:

chmod u+x /root/sanesecurity/get_sane

In Crontab einbinden

Updates täglich:

ln -s /root/sanesecurity/get_sane /etc/cron.daily/01get_sane

oder stündlich:

ln -s /root/sanesecurity/get_sane /etc/cron.hourly/01get_sane

Testlauf

/root/sanesecurity/get_sane

Testmail verschicken ob die Sanepatterns auch funktionieren

Mit einem Standardmailclient eine Testmail senden und folgende Testsignaturen verwenden

Einfach mit Copy & Paste einfügen und versenden. Resultat sollte folgendermaßen aussehen:

Nov 26 06:59:25 server amavis[20891]: (20891-03) Blocked INFECTED (Html.Phishing.Sanesecurity.TestSig), [10.72.30.1] [10.

Spamtrap / Blackhole Adresse unter Postfix einrichten

Eine E-Mail Adresse einrichten die Richtung “/dev/null“ geht.

main.cf

check_recipient_access hash:/etc/postfix/spam_trap sollte hinter reject_unauth_destination kommen. Die Konfig für smtpd_recipient_restrictions ist nur exemplarisch.

smtpd_recipient_restrictions =
        reject_non_fqdn_recipient
        reject_non_fqdn_sender
        reject_unknown_sender_domain
        reject_unknown_recipient_domain
        permit_mynetworks
        permit_sasl_authenticated
        reject_unauth_destination
        check_recipient_access hash:/etc/postfix/spam_trap
        reject_multi_recipient_bounce

/etc/postfix/spam_trap

Inhalt der Datei:

devnull@thoma.cc                DISCARD

Diese Datei muss noch ins Postmap Format konvertiert werden.

Hierzu folgenden Befehl ausführen:

postmap /etc/postfix/spam_trap

Postfix reloaden

Zuletzt muss noch Postfix neu gestartet werden. Ein

postfix reload

reicht.

Fertig!

Alle Mails die z.B. an devnull@thoma.cc geschickt werden verschwinden im Nirvana.

Tinyproxy – ein einfacher Proxy

Sicher der ungeschlagene „Platzhirsch“ ist und bleibt Squid aber man muss ja nicht immer mit Kanonen auf Spatzen schiessen, oder ??? Tinyproxy ist ein einfacher Proxy Daemon der einfach zu Konfigurieren ist und viele Funktionen bietet. Er ist sowohl für SOHO-Umgebungen als auch für Zuhause geeignet.

Tinyproxy Homepage http://tinyproxy.sourceforge.net/

Installation

sysadmin@vmserver01:~# sudo apt-get install tinyproxy

Konfiguration

##
## tinyproxy.conf -- tinyproxy daemon configuration file
##

#
# Name of the user the tinyproxy daemon should switch to after the port
# has been bound.
#
User nobody
Group nogroup

#
# Port to listen on.
#
Port 8080

#
# If you have multiple interfaces this allows you to bind to only one. If
# this is commented out, tinyproxy will bind to all interfaces present.
#
Listen 127.0.0.1

#
# The Bind directive allows you to bind the outgoing connections to a
# particular IP address.
#
#Bind 192.168.0.1

#
# Timeout: The number of seconds of inactivity a connection is allowed to
# have before it closed by tinyproxy.
#
Timeout 600

#
# ErrorFile: Defines the HTML file to send when a given HTTP error
# occurs.  You will probably need to customize the location to your
# particular install.  The usual locations to check are:
#   /usr/local/share/tinyproxy
#   /usr/share/tinyproxy
#   /etc/tinyproxy
#
# ErrorFile 404 "/usr/share/tinyproxy/404.html"
# ErrorFile 400 "/usr/share/tinyproxy/400.html"
# ErrorFile 503 "/usr/share/tinyproxy/503.html"
# ErrorFile 403 "/usr/share/tinyproxy/403.html"
# ErrorFile 408 "/usr/share/tinyproxy/408.html"

#
# DefaultErrorFile: The HTML file that gets sent if there is no
# HTML file defined with an ErrorFile keyword for the HTTP error
# that has occured.
#
DefaultErrorFile "/usr/share/tinyproxy/default.html"

#
# StatFile: The HTML file that gets sent when a request is made
# for the stathost.  If this file doesn't exist a basic page is
# hardcoded in tinyproxy.
#
StatFile "/usr/share/tinyproxy/stats.html"

#
# Where to log the information. Either LogFile or Syslog should be set,
# but not both.
#
Logfile "/var/log/tinyproxy.log"
# Syslog On

#
# Set the logging level. Allowed settings are:
#       Critical        (least verbose)
#       Error
#       Warning
#       Notice
#       Connect         (to log connections without Info's noise)
#       Info            (most verbose)
# The LogLevel logs from the set level and above. For example, if the LogLevel
# was set to Warning, than all log messages from Warning to Critical would be
# output, but Notice and below would be suppressed.
#
LogLevel Info

#
# PidFile: Write the PID of the main tinyproxy thread to this file so it
# can be used for signalling purposes.
#
PidFile "/var/run/tinyproxy.pid"

#
# Include the X-Tinyproxy header, which has the client's IP address when
# connecting to the sites listed.
#
#XTinyproxy mydomain.com

#
# Turns on upstream proxy support.
#
# The upstream rules allow you to selectively route upstream connections
# based on the host/domain of the site being accessed.
#
# For example:
#  # connection to test domain goes through testproxy
#  upstream testproxy:8008 ".test.domain.invalid"
#  upstream testproxy:8008 ".our_testbed.example.com"
#  upstream testproxy:8008 "192.168.128.0/255.255.254.0"
#
#  # no upstream proxy for internal websites and unqualified hosts
#  no upstream ".internal.example.com"
#  no upstream "www.example.com"
#  no upstream "10.0.0.0/8"
#  no upstream "192.168.0.0/255.255.254.0"
#  no upstream "."
#
#  # connection to these boxes go through their DMZ firewalls
#  upstream cust1_firewall:8008 "testbed_for_cust1"
#  upstream cust2_firewall:8008 "testbed_for_cust2"
#
#  # default upstream is internet firewall
#  upstream firewall.internal.example.com:80
#
# The LAST matching rule wins the route decision.  As you can see, you
# can use a host, or a domain:
#  name     matches host exactly
#  .name    matches any host in domain "name"
#  .        matches any host with no domain (in 'empty' domain)
#  IP/bits  matches network/mask
#  IP/mask  matches network/mask
#
#Upstream some.remote.proxy:port

#
# This is the absolute highest number of threads which will be created. In
# other words, only MaxClients number of clients can be connected at the
# same time.
#
MaxClients 100

#
# These settings set the upper and lower limit for the number of
# spare servers which should be available. If the number of spare servers
# falls below MinSpareServers then new ones will be created. If the number
# of servers exceeds MaxSpareServers then the extras will be killed off.
#
MinSpareServers 5
MaxSpareServers 20

#
# Number of servers to start initially.
#
StartServers 10

#
# MaxRequestsPerChild is the number of connections a thread will handle
# before it is killed. In practise this should be set to 0, which disables
# thread reaping. If you do notice problems with memory leakage, then set
# this to something like 10000
#
MaxRequestsPerChild 0

#
# The following is the authorization controls. If there are any access
# control keywords then the default action is to DENY. Otherwise, the
# default action is ALLOW.
#
# Also the order of the controls are important. The incoming connections
# are tested against the controls based on order.
#
Allow 127.0.0.1
Allow 10.23.45.0/24

#
# The "Via" header is required by the HTTP RFC, but using the real host name
# is a security concern.  If the following directive is enabled, the string
# supplied will be used as the host name in the Via header; otherwise, the
# server's host name will be used.
#
ViaProxyName "tinyproxy"

#
# The location of the filter file.
#
#Filter "/etc/tinyproxy/filter"

#
# Filter based on URLs rather than domains.
#
#FilterURLs On

#
# Use POSIX Extended regular expressions rather than basic.
#
#FilterExtended On

#
# Use case sensitive regular expressions.
#
#FilterCaseSensitive On

#
# Change the default policy of the filtering system.  If this directive is
# commented out, or is set to "No" then the default policy is to allow
# everything which is not specifically denied by the filter file.
#
# However, by setting this directive to "Yes" the default policy becomes to
# deny everything which is _not_ specifically allowed by the filter file.
#
#FilterDefaultDeny Yes

#
# If an Anonymous keyword is present, then anonymous proxying is enabled.
# The headers listed are allowed through, while all others are denied. If
# no Anonymous keyword is present, then all header are allowed through.
# You must include quotes around the headers.
#
#Anonymous "Host"
#Anonymous "Authorization"

#
# This is a list of ports allowed by tinyproxy when the CONNECT method
# is used.  To disable the CONNECT method altogether, set the value to 0.
# If no ConnectPort line is found, all ports are allowed (which is not
# very secure.)
#
# The following two ports are used by SSL.
#
ConnectPort 443
ConnectPort 563

POP3/IMAP Proxy Perdition mit MySQL backend

Perdition ist ein POP3/IMAP Proxy (SSL fähig) der zu mehreren Backend Servern (POP3 und IMAP) sich Verbinden kann. Die Entscheidung zu welchem Server er weiterverbinden soll erfolgt durch eine Tabelle. Perdition unterstützt mehrere Tabellenformate. Ich verwende MySQL.

Installation

apt-get install perdition perdition-mysql

Konfiguration

/etc/default/perdition:

######################################################################
# /etc/sysconfig/perdition (RPM based systems)
# /etc/default/perdition   (Debian)
#
# Run time configuration parameters for perdition
######################################################################

# Run perdition
# Set to "yes" to run perdition
# Set to any other value to not run perdition
RUN_PERDITION=yes

# Command line parameters to pass to perdition when run in any mode.
# This is in addition to any mode specific flags.
# That is, it is in addtion to any command line options supplied
# by POP3_FLAGS, POP3S_FLAGS, IMAP4_FLAGS or IMAP4S_FLAGS
FLAGS=

# Run an instance of perdition in POP3 mode
# Set to "yes" to run this instance of perdition
# Set to any other valye to not run this instance of perdition
POP3=yes

#Command line parameters to pass to perdition when run in POP3 mode
POP3_FLAGS="--ssl_mode tls_listen"

# Run an instance of perdition in POP3S mode
# Set to "yes" to run this instance of perdition
# Set to any other valye to not run this instance of perdition
POP3S=yes

#Command line parameters to pass to perdition when run in POP3S mode
POP3S_FLAGS="--ssl_mode ssl_listen -p 110"

# Run an instance of perdition in IMAP4 mode
# Set to "yes" to run this instance of perdition
# Set to any other valye to not run this instance of perdition
IMAP4=yes

#Command line parameters to pass to perdition when run in IMAP4 mode
IMAP4_FLAGS="--ssl_mode tls_listen"

# Run an instance of perdition in IMAP4S mode
# Set to "yes" to run this instance of perdition
# Set to any other valye to not run this instance of perdition
IMAP4S=yes

#Command line parameters to pass to perdition when run in IMAP4S mode
IMAP4S_FLAGS="--ssl_mode ssl_listen -p 143"

/etc/perdition/perdition.conf:

connection_logging
connection_limit 1000
map_library /usr/lib/libperditiondb_mysql.so.0
map_library_opt "localhost:3306:db:table:user:password"
username_from_database
# Interner IMAP an den weitergeleitet werden soll wenn keine Weiterleitung in der DB ist
outgoing_server  127.0.0.1
# Hier das SSL Cert wenn gewünscht.
ssl_cert_file /etc/perdition/ssl_perdition.cert
ssl_key_file /etc/perdition/ssl_perdition.key
# Perdition an ein Interface binden da er sonst 0.0.0.0 versucht und auf 127.0.0.1 lauscht ja schon unser lokaler
bind_address 10.4.4.1

Datenbank

CREATE TABLE `pop3_imap_proxy` (
`user` varchar(128) NOT NULL,
`servername` varchar(255) NOT NULL,
`port` varchar(8) default NULL,
PRIMARY KEY  (`user`),
KEY `idxtblPerdition_user` (`user`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Noch ein restart …

/etc/init.d/perdition restart

Perdition log

tail -f /var/log/syslog | grep perdition

Courier POP3 / IMAP per User aktivieren / deaktivieren

Anleitung für Courier POP3/IMAP mit MySQL backend.

/etc/courier/authmysqlrc

MYSQL_PASSWORD          password1
MYSQL_CRYPT_PWFIELD     password
MYSQL_DATABASE          courier
MYSQL_GID_FIELD         '5001'
MYSQL_HOME_FIELD        '/var/mail'
MYSQL_LOGIN_FIELD       username
MYSQL_MAILDIR_FIELD     maildir
MYSQL_NAME_FIELD        name
MYSQL_OPT               0
#MYSQL_PASSWORD          postfix
MYSQL_QUOTA_FIELD      quota
MYSQL_SERVER            localhost
MYSQL_SOCKET           /var/run/mysqld/mysqld.sock
MYSQL_UID_FIELD         '5001'
MYSQL_USERNAME          dbuser
MYSQL_USER_TABLE        mailbox
MYSQL_AUXOPTIONS_FIELD  CONCAT("disableimap=",disableimap,",disablepop3=",disablepop3)

Die entscheidende Zeile:

MYSQL_AUXOPTIONS_FIELD  CONCAT("disableimap=",disableimap,",disablepop3=",disablepop3)

Datenbank anpassen

CREATE TABLE `mailbox` (
  `username` varchar(255) NOT NULL default '',
  `password` varchar(255) NOT NULL default '',
  `name` varchar(255) NOT NULL default '',
  `maildir` varchar(255) NOT NULL default '',
  `quota` int(10) NOT NULL default '0',
  `domain` varchar(255) NOT NULL default '',
  `created` datetime NOT NULL default '0000-00-00 00:00:00',
  `modified` datetime NOT NULL default '0000-00-00 00:00:00',
  `active` tinyint(1) NOT NULL default '1',
  `disableimap` int(1) NOT NULL default '0',
  `disablepop3` int(1) NOT NULL default '0',
  PRIMARY KEY  (`username`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Virtual Mailboxes';

Folgende Zeilen kommen hinzu:

  `disableimap` int(1) NOT NULL default '0',
  `disablepop3` int(1) NOT NULL default '0',

Mit Feldwert 1 wird der jeweilige Dienst deaktiviert.