Schritt für Schritt zum eigenen Heimserver unter Ubuntu 6.06

Alles rund um Projekte, LAN-Parties und Clan-Events.

Moderator: Moderator

Schritt für Schritt zum eigenen Heimserver unter Ubuntu 6.06

Beitragvon Cyberspace19 » 28.01.2009, 17:59

Hallo Spielen-unter-Linux Community,

mit diesem How-To möchte ich eine Schritt für Schritt Anleitung schaffen, welche beschreibt, wie ich bei mir zu Haus meinen Server konfiguriert habe. Da ich tagelang im Internet gesurft, How-Tos und Bücher gelesen habe um den Server so zu konfigurieren wie ich ihn haben möchte dachte ich mir, ersparst dies den anderen und schreibst dieses How-To.

Dieses How-To wird pro Komponente / Server-Dienst einen eigenen Beitrag bekommen. Ich denke, dass dadurch die Übersicht und die Lesbarkeit doch einiges besser ist. Zudem muss man dann nicht das komplette Thema durchsuchen um etwas über eine einzelne Komponente zu erfahren.

Einige Teile des How-Tos werden auf die vorhergegangenen Beiträge aufbauen. Deshalb sollte immer alles von Anfang an durchgeführt werden.

Da ich diesen Beitrag hier geschlossen habe, bitte ich euch die Diskussion zu diesem How-To unter [url=http://www.linuxgaming.de/thread.php?threadid=1185]Schritt für Schritt zum eigenen Heimserver unter Ubuntu 6.06.1[/url] weiter zu führen.

Ich möchte mich hiermit auch bei den andern Foren, Blogs, How-To Schreiber,... bedanken, durch die ich es geschafft habe mein System zu erstellen/konfigurieren!


[align=center]WICHTIG: Ich übernehme keine Haftung für irgendwelche Schäden am System, welche durch das befolgen dieses How-Tos verursacht werden. Zudem gebe ich keine Garantie, dass die hier vorgestellte Konfiguration vollständig und sicher - im Bezug auf Systemsicherheit - ist. [/align]


Warum mache ich das ganze:
Zum einen aus dem schon oben angegebenen Grund und zum Anderen hatte ich seither einen Windows 2003 Server mit Exchange 2003 bei mir zu Haus am laufen. Diesen habe ich nun mit komplett kostenloser (OpenSource) Software ersetzt. Da ich bei meiner Suche im Internet immer wieder auf die gleiche Fragestellungen wie "Wie kann ich meinen Exchange durch Linux ablösen",... gestoßen bin, wollte ich hiermit auch für all diejenigen dieses How-To hier verfassen.


Diese Funktionalität wird das System am Ende bieten:
  • Eigene Mail Domain
  • SSH Server
    * Fail2Ban für die Abwehr von Angriffen auf den SSH Port
  • Dynamisches DNS in Verbindung mit dem DHCPv3
  • SAMBA Server
    * Windows Domänen Anmeldung
    * Datei- und Druck (Cups)- Server
    * WINS Server
  • Root Certificate Authority
  • MySQL Server 5.0
  • Mailserver
    * Postfix & SASL
    * Courier IMAP(-SSL)
    * Relaying über den SMTP Server meines ISPs, da viele keine Mails von DynDNS Adressen annehmen
    * Abholen von Mails über POP3/IMAP ISP Konten
    * MySQL Backend für Konfiguration der virtuellen Domänen
  • Apache2 Web-Server inkl. SSL Verschlüsselung
  • Groupwarelösung (eGroupware) für WebMail Zugriff

Basis:
Als Basis für dieses System habe ich ein Ubuntu Dapper 6.06.1 Server mit allen aktuellen Patches (Stand 02.02.2007) genutzt. Zu beachten ist hier, dass ich eine Minimalinstallation und NICHT die LAMP Installation durchgeführt habe!!! Die Installation und Konfiguration des Basissystems (Laufwerksmapping,...) werde ich hier nicht beschreiben, da ich denke, dass dies jeder hinbekommen wird.

Mein System:
CPU: AMD Sempron 3000+
RAM: 2GB
GPU: onboard
NIC: 1GBit (eth0)(192.168.111.1/24)
DSL Router mit Protforwarding von Port 22 TCP, 25 TCP und 443 TCP auf den Server
Festplatten:
/dev/hda1 --> /
/dev/hda5 --> /srv/data1
/dev/hda6 --> SWAP
/dev/sda1 --> /srv/data2
/dev/md1 --> /srv/raid1
/dev/md0 --> /srv/raid2


Revision:
Version: 0.01 --> Erster Entwurf

Nachtrag: Ich weiß, dass dieser Eintrag veraltet ist aus Distributionssicht. Allerdings ist die Konfiguration vermutlich 1zu1 in neueren Versionen immer noch möglich. Da das Archiv - in dem dieser Beitrag bis jetzt steckte - entfernt wurde, stecke ich dies nun hier als mein kleines Projekt rein.
IRC-Server: irc.freenode.net IRC-Channel: #linuxgaming.de
TeamSpeak Server: https://www.linuxgaming.de
Benutzeravatar
Cyberspace19
 
Beiträge: 2693
Registriert: 22.06.2006, 15:24
Lizenz: FDL

Beitragvon Cyberspace19 » 28.01.2009, 18:00

Eigene Mail Domain

Um nun Mails über eine eigene Adresse zu empfangen muss man sich zuerst eine Domain bei einem ISP registrieren. Ich habe hier bei 1und1 eine Web Adresse gemietet, da ich bei 1und1 auch die DNS Einträge umändern kann. Somit kann ich den MX Record, welcher für das Mailrouting im Internet verantwortlich ist auf meine Dynamische Adresse binden.
Jetzt mag der ein oder andere sich fragen, wie ich diesen statisch Eintrag auf eine Dynamische Adresse binden kann.
Ich habe mir zu diesem Zweck auch noch bei dyndns.org einen Account angelegt und diesen in meinem Router hinterlegt. Den MX Record bei 1und1 habe ich dann auf diesen DnyDNS Account umgebogen. Wenn mein Router nun eine neue IP-Adresse bekommt, dann gibt er diese an die DynDNS Adresse weiter und unser Server ist wieder per Name/URL im Internet erreichbar.

Ich werde im How-To mit folgenden Beispielen arbeiten:
1und1: --> extern-maildomain.de; MX Record zeigt auf name.dyndns.org
1und1: --> Anlegen eines POP3 Mailaccount, welcher für die Verifizierung fürs Relaying genutzt wird
DynDNS: --> name.dyndns.org
Router: --> Konfiguration aktualisiere IP für name.dyndns.org
Router: --> Portforwarding von Port 25 TCP für SMTP Zugriff von außen
Router: --> Portforwarding von Port 22 TCP für SSH Zugriff von außen
Router: --> Portforwarding von Port 443 TCP für HTTPS (SSL) Zugriff von außen
IRC-Server: irc.freenode.net IRC-Channel: #linuxgaming.de
TeamSpeak Server: https://www.linuxgaming.de
Benutzeravatar
Cyberspace19
 
Beiträge: 2693
Registriert: 22.06.2006, 15:24
Lizenz: FDL

Beitragvon Cyberspace19 » 28.01.2009, 18:00

SSH Server

Da ein Server ja normalerweise keinen Bildschirm, Maus und Tastatur hat (so zumindest auch bei mir) habe ich als erstes den SSH Server installiert damit ich von meinem Arbeitsplatz PC die restliche Installation durchführen kann.

Ich gehe davon aus, dass Ihr bereits das Grundsystem installiert habt und als normaler Benutzer angemeldet seit, welcher "sudo" Berechtigung hat.

Da hier das erste Mal CODE-Tags zum Einsatz kommen möchte ich euch noch darauf hinweisen, dass die $ und # nicht mit eingetippt werden dürfen. Dies ist lediglich ein Hinweis darauf, ob der Befehl als normaler Benutzer oder als root ausgeführt werden muss.
Dabei entspricht ein $ dem normalen und ein # dem root Benutzer.

Installation der Software
Code: Alles auswählen
$ sudo su
<Passwort eingeben>
# apt-get install openssh-server fail2ban

Konfiguration der Software
Code: Alles auswählen
# nano /etc/ssh/sshd_config
In dieser Datei habe ich den Parameter "PermitRootLogin" auf "no" gesetzt. Einfach in dieser Datei danach suchen und entsprechend ersetzen. Ich vermute mal, dass ich diesen Parameter nicht erklären muss. Wenn doch, würde ich euch empfehlen, dieses How-To abzubrechen und euch empfehlen erstmal Grundlegendes über Linux zu lernen. ;)
Alle anderen viel Spaß beim Weitermachen.

Danach noch folgendes ausführen
Code: Alles auswählen
# /etc/init.d/ssh restart
Das sollte es nun gewesen sein. Nach dem Restart könnt ihr euch über SSH an eurem Server mit dem normalen Benutzer anmelden.

Konfiguration des Routers
Wenn ihr diesen Server hinter einem DSL Router betreibt und von Außen darauf zugreifen möchtet, müsst ihr noch ein Portforwarding des Ports 22 TCP auf euren Server einstellen.

Konfiguration von Fail2Ban
Der SSH Server ist sehr ausdauernd was Angriffe angeht. Der Dienst an sich kennt keine Möglichkeit z.B. nach drei falschen Logins die IP zu sperren. Hier kommt nun Fail2Ban zu, Einsatz. Dieses kleine nette Tool wertet das ssh-Log aus und sperrt je nach Konfiguration die IP Adresse für einen bestimmten Zeitraum bzw. für immer.

Code: Alles auswählen
# nano /etc/fail2ban.conf
Bitte überprüft folgende Parameter in dieser Datei.
Code: Alles auswählen
...
background = true
maxfailures = 3
bantime = 1800
findtime = 600
protocol = tcp

[MAIL]
enabled = true
host = localhost
port = 25
from = fail2ban@localhost
to = root
localtime = true
subject = [Fail2Ban] <section>: Banned <ip>
message = Hi,<br>
          The IP <ip> has just been banned by Fail2Ban after
          <failures> attempts against <section>.<br>
          Regards,<br>
          Fail2Ban

[SSH]
enabled = true
port = ssh
logfile = /var/log/auth.log
timeregex = \S{3}\s{1,2}\d{1,2} \d{2}:\d{2}:\d{2}
timepattern = %%b %%d %%H:%%M:%%S
failregex = : (?:(?:Authentication failure|Failed [-/\w+]+) for(?: [iI](?:llegal|nvalid) user)?|[Ii](?:llegal|nvalid) user) .* from (?:::f{4,6}:)?(?P<host>\S*)
...
Natürlich könnt ihr diese auch an eure Bedürfnisse anpassen. Da diese Datei sehr gut dokumentiert ist, sollte dies auch kein großen Problem darstellen.

Code: Alles auswählen
# /etc/init.d/fail2ban restart

Und nach diesem Neustart von Fail2Ban wird auch dieser Daemon seine Arbeit vollrichten.
IRC-Server: irc.freenode.net IRC-Channel: #linuxgaming.de
TeamSpeak Server: https://www.linuxgaming.de
Benutzeravatar
Cyberspace19
 
Beiträge: 2693
Registriert: 22.06.2006, 15:24
Lizenz: FDL

Beitragvon Cyberspace19 » 28.01.2009, 18:01

Statisches DNS in Verbindung mit DHCPv3

Um nun auch die Namensauflösung für das Netzwerk hinzubekommen, wird in diesem Abschnitt der DNS Server konfiguriert. Da die Konfiguration eines Dynamischen DNS sehr eng mit dem DHCP Server zusammenspielt, werde ich zudem beschreiben, wie man den DHCP entsprechend einrichtet. Was DNS und DHCP ist, werde ich allerdings nicht erklären, da es hierzu auch genügend Informationen im Netz gibt. ;)

Installation der Software
Code: Alles auswählen
$ sudo su
<Passwort eingeben>
# apt-get install dhcp3-server bind9 dnsutils
Anzumerken ist hier, dass der Start des DHCP Daemons mit einem Fehler beendet wird, da noch keine ausreichende Konfiguration vorliegt. Dies werden wir jedoch gleich nachholen.
Zuerst werden wir uns aber BIND9 (dem DNS Daemon) unsere Aufmerksamkeit schenken.

Konfiguration von statischem DNS
Die Konfiguration von BIND9 ist unter "/etc/bind/*" zu finden. In diesem Verzeichnis habe ich sowohl die eigentliche Konfiguration als auch die ZONE-Dateien liegen. Die eigentliche Konfiguration ist unterteilt in drei Dateien. Diese wären named.conf, named.conf.local und named.conf.options. In der named.conf sind die globalen ZONEN eingetragen. In der named.conf.local sind die - wie der Name schon sagt - die lokalen ZONEN eingetragen und in der named.conf.options sind die Optionen für den BIND9 Daemon eingetragen. Nun aber zu der Konfiguration.
Code: Alles auswählen
# nano /etc/bind/named.conf.options
Code: Alles auswählen
options {
directory "/var/cache/bind";

// If there is a firewall between you and nameservers you want
// to talk to, you might need to uncomment the query-source
// directive below.  Previous versions of BIND always asked
// questions using port 53, but BIND 8.1 and later use an unprivileged
// port by default.

// query-source address * port 53;

// If your ISP provided one or more IP addresses for stable
// nameservers, you probably want to use them as forwarders. 
// Uncomment the following block, and insert the addresses replacing
// the all-0s placeholder.

forward first;

// Wenn etwas nicht direkt aufgelöst werden kann sollten die Anfragen
// an die DNS Server eures ISPs geleitet werden. Dies ist nicht unbedingt
// nötig, da wenn man dieses nicht macht direkt die ROOT-DNS Server
// gefragt werden. Dies sollte man jedoch vermeiden um die Last so gering
// wie möglich zu halten!
forwarders {
195.71.231.179;
193.189.244.205;
};

auth-nxdomain no;    # conform to RFC1035

// Nur auf meiner primären Netzwerkkarte auf DNS Anfragen reagieren.
listen-on {
192.168.111.1;
};
};



Code: Alles auswählen
# nano /etc/bind/named.conf
In dieser Datei muss lediglich überprüft werden ob der Eintrag "include "/etc/bind/named.conf.local";" vorhanden ist. Fehlt dieser oder ist dieser auskommentiert, so ändert dies ab, da sonst die lokalen ZONEN nicht geladen werden.


Code: Alles auswählen
# nano /etc/bind/named.conf.local
Code: Alles auswählen
//
// Do any local configuration here
//

// Consider adding the 1918 zones here, if they are not used in your
// organization
//include "/etc/bind/zones.rfc1918";

// intdom.int -> internal domain --> forward lookpup zone
zone "intdom.int" {
notify yes;
type master;
file "/etc/bind/local/intdom.int.zone";
};

//local subnet reverse lookup zone
zone "111.168.192.in-addr.arpa" {
notify yes;
type master;
file "/etc/bind/local/111.168.192.in-addr.arpa.zone";
};
Beachtet in dieser Konfiguration bitte die "file" Einträge. In diesen Dateien stehen die eigentlichen DNS Einträge, welche wir nun anlegen werden.



Code: Alles auswählen
# mkdir /etc/bind/local
# chmod 775 /etc/bind/local
# chmod g+s /etc/bind/local
# nano /etc/bind/local/intdom.int.zone
Code: Alles auswählen
$ORIGIN intdom.int.
$TTL 259200 ; 3 days
@                       IN SOA  server.intdom.int. root.server.intdom.int. (
                                1          ; serial
                                28800      ; refresh (8 hours)
                                7200       ; retry (2 hours)
                                604800     ; expire (1 week)
                                86400      ; minimum (1 day)
                                )
@                       NS      server.intdom.int.
                        NS      server.intdom.int.

                        MX      10 server.intdom.int.

ftp                     CNAME   server.intdom.int.
www                     CNAME   server.intdom.int.
mail                    CNAME   server.intdom.int.

server                  A       192.168.111.1
HINWEIS: In den ZONEN-Dateien müssen unbedingt die abschließenden Punkte bei den Domänennamen berücksichtigt werden, da es sonst zu Fehlern kommt. Wenn diese Punkte nicht angegeben sind, wird der Domänennamen nochmals an den in der Datei eingetragenen Namen angehängt!!!


Code: Alles auswählen
# /etc/bind/local/111.168.192.in-addr.arpa.zone
Code: Alles auswählen
$ORIGIN 111.168.192.in-addr.arpa.
$TTL 259200 ; 3 days
111.168.192.in-addr.arpa.       IN SOA  server.intdom.int. root.server.intdom.int. (
                                        1          ; serial
                                        28800      ; refresh (8 hours)
                                        7200       ; retry (2 hours)
                                        604800     ; expire (1 week)
                                        86400      ; minimum (1 day)
                                        )
@                               NS      server.intdom.int.
                                NS      server.intdom.int.

1                               PTR     server.intdom.int.
So. BIND9 ist für statischen DNS fertig eingerichtet. Nun muss der Daemon neu gestartet werden.
Code: Alles auswählen
# /etc/init.d/bind9 restart

Bevor wir nun den DNS testen können müssen wir sicherstellen, dass der Server selbst ebenfalls unseren DNS Daemon für die Namensauflösung verwendet. Dazu editiert die Datei "/etc/resolv.conf" wie folgt.
Code: Alles auswählen
# nano /etc/resolv.conf
Code: Alles auswählen
search intdom.int
nameserver 192.168.111.1

Überprüfen könnt ihr den DNS Server nun mit nslookup. Der Aufruf von
Code: Alles auswählen
$ nslookup server.intdom.int
sollte nun eure IP "192.168.111.1" zurückgeben. Wenn ihr bei nslookup die IP angebt, so sollte der DNS Namen "server.intdom.int" aufgelöst werden. Ebenfalls sollte die Auflösung externer Webadressen funktionieren. Also auch mal ein "nslookup http://www.google.de" durchführen und schauen ob ihr eine gültige Adresse bekommt. Für das Troubleshooting könnt ihr die Datei "/var/log/syslog" heranziehen. In dieser Logdatei werden alle Events des BIND9 und des DHCP Servers protokolliert.


Konfiguration von DHCP ohne Aktualisierungen für DNS
Fangen wir nun an unseren DHCP Server zur Vergabe von IP Adressen zu bewegen. ;)
Die Konfigurationsdateien für den DHCP Server sind unter "/etc/dhcp3" zu finden.
Code: Alles auswählen
# nano /etc/dhcp3/dhcpd.conf
Code: Alles auswählen
#
# My DHCP configuration file for my private LAN
#

default-lease-time 86400;
max-lease-time 172800;
one-lease-per-client true;

log-facility local7;

# Um WARNUNGEN im Log bei einer zweiten NIC im Server zu vermeiden
# muss das Subnet für diese NIC hier ohne Optionen eingetragen werden.
# pseudo subnet for second iface/network
# subnet 192.168.161.0 netmask 255.255.255.0 {
# }

subnet 192.168.111.0 netmask 255.255.255.0 {
    authoritative;
    range 192.168.111.100 192.168.111.200;
    option domain-name "intdom.int";
    option domain-name-servers 192.168.111.1;
    option netbios-name-servers 192.168.111.1;
    option broadcast-address 192.168.111.255;
    # IP des Routers/Gateways
    option routers 192.168.111.254;
}

# Feste Zuordnung von IP zu Client über DHCP
host client01 {
    hardware ethernet 00:11:2F:95:B6:51;
    fixed-address 192.168.111.153;
    option host-name = "client01.intdom.int";
    option domain-name = "intdom.int";
    option domain-name-servers 192.168.111.1;
    option netbios-name-servers 192.168.111.1;
    option broadcast-address 192.168.111.255;
    option routers 192.168.111.254;
}

Code: Alles auswählen
# /etc/init.d/dhcp3-server restart
Nach diesem Befehl werden nun im lokalen Netz automatisch IP Adressen an Clients verteilt.
IRC-Server: irc.freenode.net IRC-Channel: #linuxgaming.de
TeamSpeak Server: https://www.linuxgaming.de
Benutzeravatar
Cyberspace19
 
Beiträge: 2693
Registriert: 22.06.2006, 15:24
Lizenz: FDL

Beitragvon Cyberspace19 » 28.01.2009, 18:01

Dynamisches DNS in Verbindung mit DHCPv3

Bringen wir nun etwas Dynamik in die sonst so statische Welt von DNS und DHCP. :D

Konfiguration von Dynamischem DNS mit DHCPv3
Bevor ihr hier weitermacht MUSS die statische Variante funktionieren.
Den nächste Schritt habe ich direkt (nicht über SSH) am Server ausgeführt, da das Programm über SSH nichts getan hat.
Code: Alles auswählen
# cd /etc/bind
# dnssec-keygen -a HMAC-MD5 -b 512 -n HOST ddnskey
Dieser Befehl erzeugt zwei Dateien (Kddnskey.+157+30248.key & Kddnskey.+157+30248.private). In der Datei "Kddnskey.+157+30248.private" ist der private Schlüssel enthalten. Dieser Schlüssel wird später für die Aktualisierung von IP Adressen zu DNS Namen benötigt.
Der Inhalt der Datei müsste ungefähr so aussehen.
Code: Alles auswählen
# cat /etc/bind/Kddnskey.+157+30248.private
Code: Alles auswählen
Private-key-format: v1.2
Algorithm: 157 (HMAC_MD5)
Key: gnQHpDkQqvbdc+dr41HZmEtf0YMbzubM+k6+4YZHW8ZKyEj8tklHOYLuX+LHYWmbFl3HHKWFZ9CX6JWbUjG1bQ==


Um dem DHCP Daemon nun mitzuteilen, dass er Aktualisierungen an den DNS weitergeben soll, müsst ihr folgendes an die Datei "/etc/dhcp3/dhcpd.conf" anhängen. Man beachte in diesem Abschnitt die Option "secret". Diese Option enthält den Key aus der zuvor erzeugen .private Datei.
Code: Alles auswählen
# nano /etc/dhcp3/dhcpd.conf
Code: Alles auswählen
...
# Dies sind die angepassten Subnetze für DDNS
subnet 192.168.111.0 netmask 255.255.255.0 {
    authoritative;
    range 192.168.111.100 192.168.111.200;
    option domain-name "intdom.int";
    option domain-name-servers 192.168.111.1;
    option netbios-name-servers 192.168.111.1;
    option broadcast-address 192.168.111.255;
    # IP des Routers/Gateways
    option routers 192.168.111.254;
    # Dieser Eintrag ist für DDNS wichtig.
    option host-name = config-option server.ddns-hostname;
}

# Feste Zuordnung von IP zu Client über DHCP
host client01 {
    hardware ethernet 00:11:2F:95:B6:51;
    fixed-address 192.168.111.153;
    option host-name = "client01.intdom.int";
    option domain-name = "intdom.int";
    option domain-name-servers 192.168.111.1;
    option netbios-name-servers 192.168.111.1;
    option broadcast-address 192.168.111.255;
    option routers 192.168.111.254;
    # Dieser Eintrag ist für DDNS wichtig.
    ddns-hostname client01;
}

# Some DDNS suff
ddns-update-style interim;
ddns-domainname "intdom.int";
deny client-updates;
update-static-leases true;

key ddnskey {
    algorithm hmac-md5;
    secret "gnQHpDkQqvbdc+dr41HZmEtf0YMbzubM+k6+4YZHW8ZKyEj8tklHOYLuX+LHYWmbFl3HHKWFZ9CX6JWbUjG1bQ==";
}

zone intdom.int. {
    primary 192.168.111.1;
    key ddnskey;
}

zone 111.168.192.in-addr.arpa. {
    primary 192.168.111.1;
    key ddnskey;
}

# Wenn der Client keinen HOSTNAME mitsendet wird einer erzeugt und diesem Client zugewießen.
ddns-hostname = pick-first-value(option fqdn.hostname, option host-name, concat("client-",binary-to-ascii(10,8,"-",leased-address)));


Jetzt müssen wir noch dem DNS Server beibringen auf die Aktualisierungen des DHCP Daemons zu hören. Dazu müsst Ihr die Datei "/etc/bind/named.conf.local" wie folgt editieren.
Code: Alles auswählen
# nano /etc/bind/named.conf.local
Code: Alles auswählen
// intdom.int -> internal domain --> forward lookpup zone
zone "intdom.int" {
notify yes;
type master;
file "/etc/bind/local/intdom.int.zone";
# -----------------------------------------------------
# Dieser Eintrag wurde in der ZONE für DDNS hinzugefügt
allow-update { key "ddnskey"; };
# -----------------------------------------------------
};

//local subnet reverse lookup zone
zone "111.168.192.in-addr.arpa" {
notify yes;
type master;
file "/etc/bind/local/111.168.192.in-addr.arpa.zone";
# -----------------------------------------------------
# Dieser Eintrag wurde in der ZONE für DDNS hinzugefügt
allow-update { key "ddnskey"; };
# -----------------------------------------------------
};

// DDNS stuff
// Man beachte auch hier wieder die "secret" Option
key ddnskey {
    algorithm hmac-md5;
    secret "gnQHpDkQqvbdc+dr41HZmEtf0YMbzubM+k6+4YZHW8ZKyEj8tklHOYLuX+LHYWmbFl3HHKWFZ9CX6JWbUjG1bQ==";
};



Kleiner Hinweis am Rande: Der Linux DHCP Client sendet in der Standardkonfiguration keinen Hostnamen mit. Um dies zu ändern müsst ihr die Datei "/etc/dhcp3/dhclient.conf" editieren. Um genau zu sein den Eintrag # send host-name "andare.fugue.com";.
IRC-Server: irc.freenode.net IRC-Channel: #linuxgaming.de
TeamSpeak Server: https://www.linuxgaming.de
Benutzeravatar
Cyberspace19
 
Beiträge: 2693
Registriert: 22.06.2006, 15:24
Lizenz: FDL

Beitragvon Cyberspace19 » 28.01.2009, 18:02

SAMBA Server

Um auch Windows Clients zu bedienen werden wir nun den Samba Server installieren und konfigurieren. Somit kann man sich an Windows mit den SAMBA-Benutzern anmelden, zentrale Dateiablage betreiben und die Druckdienste des CUPS-Servers von den Windows Clients aus über SAMBA nutzen.

HINWEIS: Ich werde hier die CUPS Einstellungen für SAMBA vornehmen. Um diese jedoch nutzen zu können muss man den nächsten Beitrag ebenfalls noch durchführen, damit auch die CUPS Komponenten installiert und konfiguriert sind!

Installation der Software
Code: Alles auswählen
$ sudo su
<Passwort eingeben>
# apt-get install samba smbfs smbclient
Dies installiert den SAMBA Server und zusätzlich noch ein paar Tools.

Konfiguration von SAMBA Server
Die Konfiguration von SAMBA ist unter "/etc/samba/smb.conf" zu finden. Diese Datei ist in "zwei" Teile unterteilt. Einmal die "[global]" Sektion in der der eigentliche SAMBA Server konfiguriert wird und in Freigaben, welche von Windows aus erreicht werden. Nun aber zu der Konfiguration von SAMBA.
Der nächste Schritt bereinigt die Datenbank von den bisher vom System angelegten Benutzern. Keine Angst. Dies betrifft nur die SAMBA Benutzer nicht aber die bereits vorhanden Linux Benutzer.
Code: Alles auswählen
# /etc/init.d/samba stop
# mv /var/lib/samba /var/lib/samba.backup
# mkdir /var/lib/samba
# cp -vR /var/lib/samba.backup/printers /var/lib/samba/
Code: Alles auswählen
# mv /etc/samba/smb.conf /etc/samba/smb.conf.original
# nano /etc/samba/smb.conf
Code: Alles auswählen
[global]

   netbios name = server
   server string = Samba Server
   workgroup = INTDOM

   interfaces = eth0
   socket options = TCP_NODELAY

   security = user
   encrypt passwords = true
   passdb backend = tdbsam
   unix password sync = false
   passwd program = /usr/bin/passwd %u
   passwd chat = *Enter\snew\sUNIX\spassword:* %n\n *Retype\snew\sUNIX\spassword:* %n\n .
   passwd chat debug = yes
   username map = /etc/samba/smbusers


# PDC Einträge. Dies ermöglicht Windowsanmledungen an SAMBA
   local master = yes
   preferred master = yes
   os level = 200
   domain master = yes
   domain logons = yes

# Diesen Eintrag aktivieren um Roaming Profiles zu nutzen. Der Eintrag darunter muss dann deaktiviert werden.
#   logon path = \\server\profile\%U

# Roaming Profiles deaktivieren, da ich diese nicht möchte.
   logon path =

   logon drive = U:
   wins proxy = no
   wins support = yes
   name resolve order = wins lmhosts host bcast
   enhanced browsing = no


# Skripte für die Benutzerverwaltung. Bei diesen hatte ich immer noch ein paar Probleme. Deshalb deaktiviert. Benutzerverwaltung erfolgt somit unter Linux.
#   add user script = /usr/sbin/useradd -m %u
#   delete user script = /usr/sbin/userdel -r %u
#   add group script = /usr/sbin/groupadd %g
#   delete group script = /usr/sbin/groupdel %g
#   add user to group script = /usr/sbin/usermod -G %g -a %u
#   delete user from group script = /usr/sbin/deluser %u %g
#   template shell = /bin/false

# Skript zur Aufname von Computern in die Domäne
   add machine script = /usr/sbin/useradd -s /bin/false -d /var/lib/nobody %u


# Druckereinstllungen. Dies legt fest das CUPS als Subsystem genutzt werden soll
   printing = cups
   printcap name = CUPS

# Protkollierung
   log file = /var/log/samba/log.%m
   max log size = 1000
   syslog = 0
   log level = 1

# Nur für Entwickler interessant
#   panic action = /usr/share/samba/panic-action %d



#---------------------------------------------------------------------
#*** Freigaben
#---------------------------------------------------------------------
# Homeverzeichnis - Dies ist das Home-Verzeichnis des SAMBA Benutzers. Dieser wird unter Windows mit dem Buchstaben von "logon drive" verbunden.
[homes]
   comment = Home Directories
   valid users = %S
   browseable = no
   create mask = 0600
   directory mask = 0700
   writeable = yes


# Druckerfreigaben
[printers]
   comment = All Printers
   path = /var/spool/samba
   printable = yes
   guest ok = yes
   public = yes
   create mode = 0700
   browseable = no
   writeable = no
   printer admin = root, @domainadm

[printer1]
   comment =  HP Deskjet 5550
   printable = yes
   path = /var/spool/samba
   public = yes
   guest ok = yes
   printer admin = root, @domainadm

[printer2]
        comment =  Brother HL-2030
        printable = yes
        path = /var/spool/samba
        public = yes
        guest ok = yes
        printer admin = root, @domainadm

[print$]
   comment = Printer Drivers
   path = /var/lib/samba/printers
   browseable = yes
   guest ok = yes
   read only = yes
   create mask = 0666
   directory mask = 0777
   force group = domainadm
   write list = @domainadm, root


# Wichtige Freigabe für Windowsanmeldungen an SAMBA
[netlogon]
   comment = Network Logon Service
   path = /srv/samba/netlogon
   admin users = root
   valid users = @domainusr
   create mask = 0640
   directory mask = 0750
   read only = no
   share modes = no

# Dieser Eintrag wird nur für "Roaming Profiles" benötigt. Deshalb hier auskommentiert
#[profile]
#   comment = Profildateien
#   path = /srv/samba/profile
#   valid users = %U
#   browseable = no
#   writeable = yes
#   create mask = 0600
#   directory mask = 0700
# Have to be set for roaming profiles on Windows2000/WindowsXP
#   csc policy = disable


# Noch ein paar andere Freigaben
[tausch]
   comment = Tauschverzeichnis
   path = /srv/samba/tausch
   valid users = @domainusr, @domainadm
   create mask = 0660
   directory mask = 0770
   force group = domainusr
   browseable = yes
   writeable = yes
Um nun an einem Windowsclient den Benutzernamen "Administrator" verwenden zu können und dennoch mit dem Benutzer "root" zu arbeiten legen wir ein Mapping fest.
Code: Alles auswählen
# echo root = Administrator > /etc/samba/smbusers
Jetzt wollen wir SAMBA mal starten
Code: Alles auswählen
# /etc/init.d/samba restart
Was uns jetzt noch fehlt sind die Benutzer und Gruppen welche unter Windows verwendet werden. Dies wollen wir nun nachholen. ;)
Als Erstes legen wir unsere LINUX Gruppe für Domain Admins und Domain User an.
Code: Alles auswählen
# groupadd domainadm
# groupadd domainusr
# net groupmap modify ntgroup="Domain Admins" unixgroup=domainadm
# net groupmap modify ntgroup="Domain Users" unixgroup=domainusr
# net groupmap modify ntgroup="Domain Guests" unixgroup=nogroup
Ich denke die Namen sind sprechend und man kann erkennen welche Gruppe für was gedacht ist.

Vielleicht ist es dem einen oder anderen Aufgefallen, dass wir in unsere Konfiguration Verzeichnise z.b. für Netlogon verwendet haben, die es noch nicht gibt. Dies hat den Hintergrund der bis gerade eben noch nicht existierenden Gruppen, welche aber die Berechtigung auf diese Verzeichnisse benötigen. Die folgenden Befehle korrigieren dies.
Code: Alles auswählen
# mkdir -p /srv/samba/netlogon
# mkdir -p /srv/samba/home
# mkdir -p /srv/samba/tausch
# chown root:domainusr /srv/samba/netlogon/
# chown root:domainusr /srv/samba/tausch/
# chmod 750 /srv/samba/netlogon/
# chmod 770 /srv/samba/tausch/
# chmod g+s /srv/samba/tausch/
Nachdem wir dies korrigiert haben, wenden wir uns wieder den Benutzer zu. Einige Aktionen wie z.B. das Aufnehmen von Computern zur Domäne benötigen den "root" Benutzer. Das Bekanntmachen eines Benutzers für SAMBA erfolgt mit dem Befehl smbpasswd.
Code: Alles auswählen
# smbpasswd -a root
<Passwort eingeben>
<Passwort wiederholen>
Da dies das SAMBA Passwort ist, muss es nicht mit dem Linux "root"-Passwort übereinstimmen.
Da wir natürlich auch normale Benutzer nutzen wollen und nicht mit dem "root"-Account unter Windows arbeiten legen wir nun diesen Benutzer mit entsprechenden Rechten an.
Code: Alles auswählen
# adduser --disabled-login --shell /bin/false --home /srv/samba/home/benutzer1 --ingroup domainusr benutzer1
# chmod 700 /srv/samba/home/benutzer1
Wer möchte kann diesen Benutzer auch mit den Rechten des Domain Admins mit dem folgenden Befehl ausstatten. Dieser Schritt ist optional und bleibt jedem selbst überlassen.
Code: Alles auswählen
# usermod -G domainadm -a benutzer1
Dieser Benutzer muss SAMBA ebenfalls bekannt gemacht werden. Der zweite Befehl überimmt noch ein wenig kosmetische Arbeit und setzt den "Full Name" für diesen Benutzer.
Code: Alles auswählen
# smbpasswd -a benutzer1
<Passwort eingeben>
<Passwort wiederholen>
# pdbedit -u benutzer1 -f "Nachname Vorname"
Kleiner Tipp: Mit dem Programm pdbedit kann man die SAMBA Benuterdatenbank bearbeiten.
Jetzt nochmal ein neustart von SAMBA.
Code: Alles auswählen
# /etc/init.d/samba restart
Und zum Schluss überprüfen wir ob SAMBA/WINS sauber funktionieren.
Code: Alles auswählen
# smbclient -L localhost -U%
Die sollte dann eine Ausgabe wie folgt ergeben.
Code: Alles auswählen
Domain=[INTDOM] OS=[Unix] Server=[Samba 3.0.22]

        Sharename       Type      Comment
        ---------       ----      -------
        netlogon        Disk      Network Logon Service
        IPC$            IPC       IPC Service (Samba Server, Ubuntu)
        ADMIN$          IPC       IPC Service (Samba Server, Ubuntu)
Domain=[INTDOM] OS=[Unix] Server=[Samba 3.0.22]

        Server               Comment
        ---------            -------
        SERVER               Samba Server, Ubuntu
        CLIENT01               

        Workgroup            Master
        ---------            -------
        SPACE                SERVER
Damit läuft unser SAMBA Server als PDC für die Windows Clients. Die Windows Clients können nun der SAMBA Domäne (INTDOM) beitreten. Wichtig ist, dass wenn beim Beitritt die Abfrage nach Benutzer und Passwort kommt die Daten des "root"-Accounts genutzt werden. Passwort des "root"-Accounts ist das von dem Befehl smbpasswd -a root
IRC-Server: irc.freenode.net IRC-Channel: #linuxgaming.de
TeamSpeak Server: https://www.linuxgaming.de
Benutzeravatar
Cyberspace19
 
Beiträge: 2693
Registriert: 22.06.2006, 15:24
Lizenz: FDL

Beitragvon Cyberspace19 » 28.01.2009, 18:02

CUPS Druckserver

Wie schon aus dem SAMBA Beitrag zu erfahren ist, werden die hier beschriebenen Schritte für das Drucken von den Windows Clients über SAMBA benötigt.

Installation der Software
Code: Alles auswählen
$ sudo su
<Passwort eingeben>
# apt-get install cupsys cupsys-client cupsys-bsd cupsys-driver-gutenprint foomatic-db foomatic-db-hpijs foomatic-filters foomatic-filters-ppds foomatic-db-gutenprint libfreetype6 gutenprint-doc gutenprint-locales
Damit sollte nun CUPS mit allen benötigten Abhängigkeiten installiert sein.

Konfiguration von CUPS
Die Konfiguration ist für CUPS unter "/etc/cups/*" zu finden. Da ich es nicht geschafft habe die Drucker über einen normalen Benutzer zu installieren habe ich den unter Ubuntu deaktivierten "root"-Account aktiviert.
Code: Alles auswählen
# passwd root
<Passwort eingeben>
<Passwort wiederholen>
Somit ist es möglich später über die Web Oberfläche die Drucker zu verwalten.
Code: Alles auswählen
# nano /etc/cups/cupsd.conf
Code: Alles auswählen
...
# Dieser Eintrag wird wegen einem Bug in Ubuntu benötigt.
DefaultEncryption IfRequested
...
# Diese Einträge existierten bereits und wurden angepasst
<Location />
  # Allow shared printing...
  Order allow,deny
  Allow from 127.0.0.1
  Allow from 192.168.111.*
</Location>
<Location /admin>
  AuthType Basic
  Require user @SYSTEM
  Order allow,deny
  Allow from 127.0.0.1
  Allow from 192.168.111.*
</Location>

Damit wir nun von unserem ganzen Netz die Webseite zur Konfiguration abrufen können muss noch folgendes getan werden.
Code: Alles auswählen
# nano /etc/cups/cups.d/ports.conf
Code: Alles auswählen
Listen localhost:631
Listen 192.168.111.1:631
Listen /var/run/cups/cups.sock
CUPS muss natürlich auch noch berechtigt werden, die Passwörter der Benutzer zu überprüfen. Deshalb muss der Benutzer cupsys der Gruppe shadow hinzugefügt werden. Danach darf der Neustart von CUPS nicht vergessen werden.
Code: Alles auswählen
# adduser cupsys shadow
# /etc/init.d/cups restart

Jetzt ist es möglich über den Aufruf von http://server:631/ die Drucker anzulegen. In unserem Beispiel hier müsste es einen Drucker "printer1" und einen Drucker "printer2" geben. Nach anlegen der Drucker müssen diese noch SAMBA bekannt gemacht werden.
Code: Alles auswählen
# cupsaddsmb -a
# /etc/init.d/samba restart


HINWEIS: Da meine Windowsdruckertreiber nicht richtig funktionieren, wenn ich unter CUPS den richtigen Treiber angebe, habe ich dieser auf dem Server als RAW Printer angegeben. Um nun von meinem Linux Client zu drucken habe ich dort diese Drucker ebenfalls als SMB Drucker mit den richtigen Linuxtreibern eingerichtet. Dies stellt vielleicht nicht die schönste Lösung dar aber eine die bei mir Funktioniert.
IRC-Server: irc.freenode.net IRC-Channel: #linuxgaming.de
TeamSpeak Server: https://www.linuxgaming.de
Benutzeravatar
Cyberspace19
 
Beiträge: 2693
Registriert: 22.06.2006, 15:24
Lizenz: FDL

Beitragvon Cyberspace19 » 28.01.2009, 18:02

Root Certificate Authority

In diesem Beitrag werden wir nun die Root Certificate Authority installieren. Damit ist es möglich selbst gültige Zertifikate für Web, Mail,S-MIME... zu erstellen. Vorteil einer CA gebenüber "self signed certificates" ist, dass ihr nach Außen nur das öffentliche Zertifikat der CA freigeben müsst, damit alle von euch signierten Zertifikate als Vertrauenswürdig eingestuft werden. Bei den self signed muss dies für jedes einzelne Zertifikat geschehen.

Installation der Software
Code: Alles auswählen
$ sudo su
<Passwort eingeben>
# apt-get install openssl ca-certificates


Konfiguration von OpenSSL
Damit wir nicht mit den bereits installierten Zertifikaten und Einstellungen in Konflikt geraten, werden wir für die CA alles in dem Verzeichnis "/etc/ssl_ca" durchführen. Dieses Verzeichnis stellt somit das CA Arbeitsverzeichnis dar.
Code: Alles auswählen
# mkdir /etc/ssl_ca
# mkdir /etc/ssl_ca/private /etc/ssl_ca/certs
# echo 100001 > /etc/ssl_ca/serial
# touch /etc/ssl_ca/certindex.txt
# chmod -R 700 /etc/ssl_ca


Die Konfiguration wird in der Datei "/etc/ssl_ca/openssl.cnf" abgelegt.
Code: Alles auswählen
# nano /etc/ssl_ca/openssl.cnf
Code: Alles auswählen
#
# OpenSSL configuration file.
#

# Establish working directory.

dir               = /etc/ssl_ca

[ ca ]
default_ca            = CA_default

[ CA_default ]
serial               = $dir/serial
database            = $dir/certindex.txt
new_certs_dir            = $dir/certs
certificate            = $dir/cacert.pem
private_key            = $dir/private/cakey.pem
default_days            = 3650
default_md            = md5
preserve            = no
email_in_dn            = no
nameopt               = default_ca
certopt               = default_ca
policy               = policy_match

[ policy_match ]
countryName            = match
stateOrProvinceName         = match
organizationName         = optional
organizationalUnitName         = optional
commonName            = supplied
emailAddress            = optional

[ req ]
default_bits            = 4096         # Size of keys
default_keyfile            = key.pem      # name of generated keys
default_md            = md5              # message digest algorithm
string_mask            = nombstr      # permitted characters
distinguished_name         = req_distinguished_name
req_extensions            = v3_req

[ req_distinguished_name ]
# Variable name            Prompt string
#-------------------------           ----------------------------------
0.organizationName         = Organization Name (company)
organizationalUnitName         = Organizational Unit Name (department, division)
emailAddress            = Email Address
emailAddress_max         = 40
localityName            = Locality Name (city, district)
stateOrProvinceName         = State or Province Name (full name)
countryName            = Country Name (2 letter code)
countryName_min            = 2
countryName_max            = 2
commonName            = Common Name (hostname, IP, or your name)
commonName_max            = 64

# Default values for the above, for consistency and less typing.
# Variable name            Value
#------------------------           ------------------------------
0.organizationName_default      = Meine Organization
localityName_default         = Meine Stadt
stateOrProvinceName_default      = Baden-Wuerttemberg
countryName_default         = DE

[ v3_ca ]
basicConstraints         = CA:TRUE
subjectKeyIdentifier         = hash
authorityKeyIdentifier         = keyid:always,issuer:always

[ v3_req ]
basicConstraints         = CA:FALSE
subjectKeyIdentifier         = hash
Damit wir mit dieser Konfiguration auch Zertifikatanfragen signieren können, benötigen wir noch einen Private-Key. Zudem wird ebenfalls ein Public-Key benötigt, welchen wir an unsere Mitmenschen verteilen können damit die von uns signierten Zertifikate als gültig erachtet werden. Wichtig dabei ist, dass der Public-Key der CA bei den Benutzern in den Vertrauenswürdigen Stammzertifikaten hinterlegt ist.
Code: Alles auswählen
# cd /etc/ssl_ca
# openssl req -new -x509 -extensions v3_ca -keyout ./private/cakey.pem -out ./cacert.pem -days 3650 -config ./openssl.cnf
<Passwort eingeben>
<Passwort wiederholen>
Wenn man später Zertifikatsanfragen mit dem Private-Key signieren möchte, wird das soeben eingegebene Passwort benötigt! Also nicht vergessen. ;)
Die Datei "/etc/ssl_ca/private/cakey.pem" enthält den Private-Key der CA welcher mit dem Passwort geschützt ist. Der Public-Key, welcher für die Öffentlichkeit bestimmt ist, ist hingegen in der Datei "/etc/ssl_ca/cacert.pem zu finden.

Wie man ein CSR (Certificate Signing Request) erstellt und diesen dann signiert, wird im nächsten Beitrag für ein SMTP Zertifikat erläutert. Ich werde es deshalb hier nicht nocheinmal erklären.
IRC-Server: irc.freenode.net IRC-Channel: #linuxgaming.de
TeamSpeak Server: https://www.linuxgaming.de
Benutzeravatar
Cyberspace19
 
Beiträge: 2693
Registriert: 22.06.2006, 15:24
Lizenz: FDL

Beitragvon Cyberspace19 » 28.01.2009, 18:03

Postfix Backend

So nun endlich geht es ein Stückchen weiter. In diesem Beitrag wird erleutert, wie man die Voraussetzungen für Postfix für den Mailempfang und Mailversand konfiguriert. Als Backend für die Konfiguration der Domänen, Adressen und Benutzer dient hier eine MySQL Datenbank. Wie man einen SPAM- und Viren- Filter einrichtet wird in einem der nächsten Beiträge geschildert. Des weiteren wird hier noch kein Zugriff über IMAP dargestellt. Dies wird ebenfalls in einem späteren Beitrag erklärt.

Installation der Software
In diesem Abschnitt wird bereits sämtliche Software für den Betrieb von Postfix installiert.
Code: Alles auswählen
$ sudo su
<Passwort eingeben>
# apt-get install postfix postfix-doc postfix-mysql mysql-client-5.0 mysql-server-5.0 sasl2-bin libsasl2 libsasl2-modules libsasl2-modules-sql

Konfiguration der Software
Als Erstes verpassen wir dem root-Account des MySQL Servers ein Passwort.
Code: Alles auswählen
# mysqladmin -u root password geheim

Da diese Konfiguration virtuelle Domains/Adressen zur Verfügung stellt, benötigen wir einen Benutzer, welcher die Rechte im Dateisystem für die Mails hält. Die Mails werden im Home-Verzeichnis des Benutzers in einer bestimmten Hierarchie abgelegt. Deshalb ist beim Anlegen des Benutzers auf das Home-Verzeichnis zu achten. Nun wollen wir aber den Benutzer + dazugehöriger Gruppe endlich wie folgt anlegen
Code: Alles auswählen
# groupadd -g 5000 vmail
# useradd -g vmail -u 5000 vmail -d /srv/raid1/vmail -m

Sollte die ID 5000 bereits belegt sein, so verwendet bitte eine freie ID. Merkt euch die hier verwendete ID, da wir diese später noch benötigen!

Nachdem wir nun den Benutzer, Gruppe und das MySQL root-Passwort erstellt haben, müssen wir natürlich noch eine Datenbank und die benötigten Tabellen anlegen.
Das Anelgen der Datenbank erfolgt über folgenden Befehl:
Code: Alles auswählen
# mysqladmin -u root -p create mailconfig
Der Name der Datenbank ist hierbei "mailconfig".
Anschließend melden wir uns an MySQL mit dem root-Benutzer an, erstellen einen Benutzer, vergeben die benötigten Rechte für diesen Benutzer und erstellen die entsprechenden Tabellen.
Tipp: Führt hier eine Zeile nach der anderen aus und macht nicht einen auf alles kopieren und dann einfügen. ;)
Code: Alles auswählen
# mysql -u root -p

mysql> grant select on mailconfig.* to mail_admin@localhost identified by geheimes_passwort;
mysql> flush privileges;
mysql> use mailconfig;

mysql> create table domains (
> domain varchar(100) NOT NULL,
> primary key (domain))
> TYPE=MyISAM;

mysql> create table forwardings (
> source varchar(100) NOT NULL,
> destination varchar(100) NOT NULL,
> primary key (source))
> TYPE=MyISAM;

mysql> create table users (
> email varchar(100) NOT NULL,
> password varchar(100) NOT NULL,
> primary key (email))
> TYPE=MyISAM;

mysql> create table smtpgmaps (
> localmail varchar(100) NOT NULL,
> ispmail varchar(100) NOT NULL,
> primary key (localmail))
> TYPE=MyISAM;
Ok. Das wäre geschaft. :D

Jetzt geht es mit dem Erstellen der Verzeichnisstruktur für die MySQL Datenabfragekonfiguration von Postfix weiter. Auf diese Dateien sollte nur root einen Schreibzugruff und die Gruppe, mit der Postfix läuft, Lesezugriff haben, da hier Passwörter für die Datenbank im Klartext eingetragen werden müssen!!!
Beginnen wir mit der Ordnerstruktur.
Code: Alles auswählen
# mkdir /etc/postfix/mysql
# chown root:postfix /etc/postfix/mysql
# chmod 750 /etc/postfix/mysql
# chmod g+s /etc/postfix/mysql/

Danach machen wir mit den Konfigurationsdateien weiter.
Code: Alles auswählen
# nano /etc/postfix/mysql/virtual_domains.cf

Code: Alles auswählen
user = mail_admin
password = geheimes_passwort
dbname = mailconfig
table = domains
select_field = virtual
where_field = domain
hosts = 127.0.0.1

Code: Alles auswählen
# nano /etc/postfix/mysql/virtual_forwardings.cf

Code: Alles auswählen
user = mail_admin
password = geheimes_passwort
dbname = mailconfig
table = forwardings
select_field = destination
where_field = source
hosts = 127.0.0.1

Code: Alles auswählen
# nano /etc/postfix/mysql/virtual_mailboxes.cf

Code: Alles auswählen
user = mail_admin
password = geheimes_passwort
dbname = mailconfig
table = users
select_field = CONCAT(SUBSTRING_INDEX(email,@,-1),/,SUBSTRING_INDEX(email,@,1),/)
where_field = email
hosts = 127.0.0.1

Code: Alles auswählen
# nano /etc/postfix/mysql/virtual_email2email.cf

Code: Alles auswählen
user = mail_admin
password = geheimes_passwort
dbname = mailconfig
table = users
select_field = email
where_field = email
hosts = 127.0.0.1

Code: Alles auswählen
# nano /etc/postfix/mysql/smtpd_maps.cf

Code: Alles auswählen
user = mail_admin
password = geheimes_passwort
dbname = mailconfig
table = smtpgmaps
select_field = ispmail
where_field = localmail
hosts = 127.0.0.1

Beschreibung der Dateien:
  • virtual_domains.cf
    In dieser Datei werden die Domänen konfiguriert, für die Postfix vernatowrtlich sein soll. In anderen Worten: Für diese Domänen nimmt Postfix die Mails entgegen.
  • virtual_forwardings.cf
    Hier werden die Mailweiterleitungen definiert.
  • virtual_mailboxes.cf
    In dieser Datei sind die eigentlichen Mailboxen eingetragen. Der "CONCAT" Befehl gibt "Domäne\Benutzer" zurück. Dies entspricht dem Pfad für die Mails pro Benutzer.
  • virtual_email2email.cf
    Diese Datei ist sehr wichtig, wenn sog. Catch-All Adressen verwendet werden.
    Wer nicht weiß was das ist, kann gerne Google zu Rat bitten. ;)
  • smtpd_maps.cf
    Dies ist eine sehr wichtige Konfigurationsdatei, wenn man Absender Mailadressen vor dem Versenden ändern möchte. Z.B. kann hier eingetragen werden, dass beim Versenden einer Mail über den Beuntzer mit der Adresse "testme@mainedomain.tld" die Mailadresse in "test2@anderedomain.tld" geändert wird.
Nun noch die Rechte für "others" entfernen
Code: Alles auswählen
# chmod o-r /etc/postfix/mysql/*


Damit hätten wir die Konfiguration des Postfix Backends erledigt. Im nächsten Beitrag geht es dann um die "eigentliche" Konfiguration von Postfix und die Befüllung der MySQL Tabellen.
IRC-Server: irc.freenode.net IRC-Channel: #linuxgaming.de
TeamSpeak Server: https://www.linuxgaming.de
Benutzeravatar
Cyberspace19
 
Beiträge: 2693
Registriert: 22.06.2006, 15:24
Lizenz: FDL

Beitragvon Cyberspace19 » 28.01.2009, 18:04

Postfix

Nach nun doch geraumer Zeit an kreativer Pause, könnt ihr den nächsten Beitrag - die eigentliche Postfix Konfiguration - bestaunen. ;)
Was erwartet euch hier? Nun, in diesem Beitrag geht es um die eigentliche Postfix Konfiguration, nachdem im letzten Beitrag das Backend dafür bereitgestellt wurde. Die Dateien, welche bereits erzeugt wurden, müssen Postfix bekannt gemacht werden. Zudem muss Postfix ebenfalls wissen, welche Datei für was zuständig ist. Dies will ich in diesem Beitrag erleutern und aufzeigen.
Des weiteren erzeigen wir in diesem Beitrag SSL Zertifikate um eine gesicherte Verbindung aubauen zu können.

Installation der Software
Die benötigte Software wurde bereits einen Beitrag früher installiert. Deshalb ist es hier nicht nötig noch ein weiteres Packet zu installieren. :D

Konfiguration der Software
Die erste Datei, welche für Postfix wichtig ist nenn sich "main.cf" und ist unter "/etc/postfix/" zu finden. Diese werden wir nun auch als erstes wie folgt anpassen. :D
Dabei ist wichtig zu wissen, dass Zeilen, welche nicht ganz am Anfang beginnen als fortsetzung der verhergehenden Zeile gewertet wird.

Code: Alles auswählen
# nano /etc/postfix/main.cf

Code: Alles auswählen
# some general configuration for postfix
inet_interfaces = all
myhostname = server.intdom.int
mydomain = intdom.int
myorigin = $mydomain
mydestination = $mydomain, $myhostname, localhost.$mydomain, localhost
mynetworks = 127.0.0.0/8
masquerade_domains = $mydomain
default_privs = nobody
message_size_limit = 20480000

append_dot_mydomain = no
appent_at_myorigin = no


# smtp(d) configuration and restrictions
smtpd_banner = $myhostname ESMTP $mail_name
smtp_generic_maps = mysql:/etc/postfix/mysql/smtpd_maps.cf
smtpd_recipient_limit = 50
smtpd_error_sleep_time = 1s
smtpd_soft_error_limit = 2
smtpd_hard_error_limit = 5
smtpd_helo_required = yes
smtpd_helo_restrictions =
   permit_mynetworks,
   reject_invalid_hostname
smtpd_recipient_restrictions =
        # Dynamic IPs
        reject_rbl_client dul.dnsbl.sorbs.net,
        # Hijacked networks
        reject_rbl_client zombie.dnsbl.sorbs.net,
        # Hosts that have sent spam to the admins of SORBS
        reject_rbl_client spam.dnsbl.sorbs.net,
        # List of Open SMTP relay servers
        reject_rbl_client smtp.dnsbl.sorbs.net
        # List of web (WWW) servers which have spammer abusable vulnerabilities (e.g. FormMail scripts)
        reject_rbl_client web.dnsbl.sorbs.net
        reject_rbl_client bl.spamcop.net,
        reject_rbl_client sbl-xbl.spamhaus.org,
        reject_rbl_client list.dsbl.org,
        reject_rbl_client cbl.abuseat.org,
        reject_rbl_client dnsbl.njabl.org,
        permit_mynetworks,
        permit_sasl_authenticated,
        reject_unauth_destination,
        reject_unknown_recipient_domain,
        reject_unknown_sender_domain

# smtpd sasl/tls configuration
   smtpd_sasl_auth_enable = yes
   broken_sasl_auth_clients = yes
   smtpd_use_tls = yes
   smtpd_tls_cert_file = /etc/postfix/smtpd-cert.pem
   smtpd_tls_key_file = /etc/postfix/smtpd-key.pem


# smtp relay AUTH
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/smtp_relay
smtp_sasl_security_options = noanonymous

# some queue stuff
minimal_backoff_time = 1000s
maximal_backoff_time = 4000s
bounce_queue_lifetime = 2d
maximal_queue_lifetime = 2d

# local user confiuguration
home_mailbox = .maildir/
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases

# virtual users/domain configuration
virtual_alias_maps = mysql:/etc/postfix/mysql/virtual_forwardings.cf
   mysql:/etc/postfix/mysql/virtual_email2email.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql/virtual_domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql/virtual_mailboxes.cf
virtual_mailbox_base = /srv/raid1/vmail
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_transport = virtual


In der Datei main.cf haben wir nun auf weitere Dateien verwiesen, wie z.B: /etc/postfix/smtp_relay, welche noch nicht existieren. Diese werden nun erstellt.
Code: Alles auswählen
# nano /etc/postfix/smtp_relay.cf

Code: Alles auswählen
smtp.relayserver.de   benutzer:passwort

Wenn ihr das Beispiel dies auch mit einem 1und1 Relay Server betreibt würde hier als Server "smtp.1und1.de benutzer:passwort" stehen. Damit Postfix diese Datei aber auch verarbeiten kann fehlt noch ein wichtiger Schritt: Die Datei muss in das gewünscht Format übernommen werden. Dies passiert mit dem Befehl "postmap".
Code: Alles auswählen
# postmap /etc/postfix/smtp_relay
# chmod o-r smtp_*
# chown root:postfix smtp_*

Tipp: Wer sich fragt was die zwei letzten Befehle gemacht haben und warum ich diese ausgeführt habe, sollte sich vielleicht fragen ob dieses How-To das richtige für ihn ist. ;)

BTW: Was fehlt denn jetzt noch? :rolleyes:
Richtig! Wir haben noch keine Zertifikate für SASL. Also werden wir dies nun nachholen. :D
Dazu wechseln wir als erstes in das OpenSSL Verzeichnis unserer CA.
Code: Alles auswählen
# cd /etc/ssl_ca/

Danach erstellen wir ein CSR (Certificate Signing Request). Also eine Anfrage an unsere CA ein Zertifikat zu signieren.
Code: Alles auswählen
# openssl req -new -nodes -out smtpd-req.pem -keyout ./private/smtpd-key.pem -config ./openssl.cnf

Und nachdem wir dann den CSR haben müssen wir es auch noch mit unsere CA signieren, das wie folgt geschieht. ;)
Code: Alles auswählen
# openssl ca -out smtpd-cert.pem -config ./openssl.cnf -infiles ./smtpd-req.pem

Wie ihr sicherlich bemerkt habt, musstet ihr hier nun das Passwort für den Private Key der CA eingeben. Deshalb sei mir hier nochmals der Hinweis erlaubt, dass Ihr das Passwort der CA nicht velieren dürft, da es sonst nicht mehr möglich ist, ein CSR zu signieren.

Um nun aber endlich Postfix das erste Mal in Aktion zu erleben machen wir zügig weiter. :D Das erzeugte Zertifikat samt Key kopieren wir auch in das Postfix Verzeichnis um alle Daten für ein Produkt an einem Platz zu haben.
Code: Alles auswählen
# cp /etc/ssl_ca/smtpd-cert.pem /etc/postfix/
# cp /etc/ssl_ca/private/smtpd-key.pem /etc/postfix/
# cd /etc/postfix/
# chown root:postfix smtpd-*
# chmod o-r smtpd-*


Als letzte Konfigurationsschritt muss das SASL Modul eine Konfiguration spendiert bekommen.
Code: Alles auswählen
# nano /etc/postfix/sasl/smtpd.conf

Code: Alles auswählen
pwcheck_method: auxprop
auxprop_plugin: sql
mech_list: plain login cram-md5 digest-md5
sql_engine: mysql
sql_hostnames: 127.0.0.1
sql_user: mail_admin
sql_passwd: geheimes_passwort
sql_database: mailconfig
sql_select: select password from users where email=%u@%r


Bevor wir nun Postfix das erste Mal starten füllen wir die Datenbank noch mit ein paar Testdaten. Wie viele überlasse ich euch. Ich selbst werde hier eine Domain und einen Benutzer aufzeigen.
Code: Alles auswählen
# mysql -u root -p
> use mailconfig;
> insert into domains values (extern-maildomain.de);
> insert into users values (mein.name@extern-maildomain.de, geheimes_unverschlüsseltes_passwort);
> insert into forwardings values (alias_für_main_name@extern-maildomain.de, mein.name@extern-maildomain.de);

Info: Gerne nehme ich Tipps an, wie man das Passwort verschlüsselt in der Datenbank abspeichern kann. ;)

Und nun ist der große Augenblick gekommen! Postfix wird das erste Mal gestartet.
Code: Alles auswählen
# /etc/init.d/postfix restart

Ab sofort müsste euer Server Mails annehmen und versenden können. Versucht es einfach mal aus. ;)
Wer dazu Hilfe benötigt, kann sich gerne bei uns im Forum rekunden. :D

Kleiner Tipp aber meinerseits: Da wir noch kein POP3/IMAP Server haben, ist es derzeit nicht möglich die Mails mit KMail,... abzufragen. Dennoch könnt ihr überprüfen, ob Mails für euch angenommen werden. Dazu sendet euch eine Mail zu und schaut im Verzeichnis "/srv/raid1/vmail/extern-maildomain.de/mein.name/new" nach, ob diese dort abgelegt wurden. Alternative dazu ist die Datei /var/log/mail.log, welche euch über alle Aktivitäten von Postfix auf dem laufenden hält.

Eine Kleine Anmerkung am Schluss sei hier erlaubt: Diese Konfiguration beinhaltet derzeit keinen SPAM und auch keinen Virenfilter. Dies werde ich bei Gelegenheit auch hier im How-To preisgeben.

Jetzt wünsche ich euch aber erst mal viel Spaß mit euerm neuen Mailsystem. :D
IRC-Server: irc.freenode.net IRC-Channel: #linuxgaming.de
TeamSpeak Server: https://www.linuxgaming.de
Benutzeravatar
Cyberspace19
 
Beiträge: 2693
Registriert: 22.06.2006, 15:24
Lizenz: FDL


Zurück zu Projekte / Clans / LANs

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste