JailServer mit FreeBSD 10.1

Aus UUGRN
Version vom 18. Februar 2015, 00:12 Uhr von Rabe (Diskussion | Beiträge) (Ein Anfang, Installation, Basis-setup)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

Dieser Artikel beschreibt den Aufbau eines FreeBSD JailServers basierend auf FreeBSD 10.1.

Anforderungen und Rahmenbedingungen

  • Hardware besteht aus einer 64bittigen Architektur, zB amd64
  • Es soll ausschließlich ZFS genutzt werden. Der Storage besteht mindestens aus 2 Massenspeichern (Festplatten), optional zusätzlich 2 SSDs für swap, log und cache
  • Es gibt ein IPv4-Netz mit mindestens /29
  • Es gibt echtes IPv6, mindestens ein /64
  • Optional internes Interface (LAN), ersatzweise wird ein Loopback-Interface verwendet, hier gibt es ein nicht geroutetes RfC1918 Netzwerk mit /24
  • die externe Sichbarkeit von Services soll auf das absolute Minimum reduziert werden, rein intern genutzte Services (zB Datenbanken, Syslog, …) sollen ausschießlich im LAN zugreifbar sein
  • Alle Services sollen in individuellen Jails laufen
  • Webapplikationen sollen in Jails mit ausschließlich RfC1918-IP betrieben werden und ausschließlich mittels Proxy und Reverse-Proxy mit der Außenwelt kommunizieren
  • Mailrouting findet in einem dedizierten Jail statt
  • Es werden 2 DNS-Server betrieben: Einer direkt auf dem Host für allgemeine Verwendung, zB rekursive Abfragen, einer ausschließlich für Domainhosting und als Hidden Primary (eigenes Jail)
  • Alle Services werden durch konservative Konfiguration auf das erforerliche Minimum reduziert, eine Firewall ist in diesem Setup nicht erforderlich (aber generell möglich)

Hardware

In diesem Setup wird ein Server mit Intel(R) Core(TM)2 Duo CPU E8400 @ 3.00GHz mit 16GB RAM betrieben.

Über ein 4fach Wechselrahmen für 2.5" Platten werden insgesamt 2 Stück 1TB HDD (geeignet für 24/7 Betrieb) und zusätzlich 2 SSDs mit jeweils 120GB eingebaut, wobei die HDDs an einem SATA2 Controller (3Gbps) angeschlossen sind, die beiden SSDs jeweils an einem SATA3 Port (6Gbps).

FreeBSD Setup

Basisinstallation

Auf dem System wird über den Installer von FreeBSD 10.1 eine normale Installation ausgeführt, keine manuellen Hacks erforderlich. Das Storage-Setup beinhaltet initial nur die beiden mechanischen Festplatten als ZFS mirror. Der Installer kümmert sich darum, dass ein entsprechender zpool ("zroot") angelegt wird und alles so eingerichtet wird, dass man später direkt davon booten kann. Partitioniert wird ausschließlich mit GPT.

Die beiden SSDs werden dann später manuell aufgesetzt und hinzugefügt.

Nach der Installation sollte der Server per SSH über das Internet erreichbar sein.

Grundkonfiguration des Servers (afterboot)

Software installieren

Die Installation eines vorkompilierten Paketes erfolgt einfach mittels "pkg install paketname". Pakete können mittels "pkg search" gesucht werden.

  • pkg (das bootstrappt sich selbst beim erstmaligen Aufruf von "pkg")
  • bash
  • bind99
  • buffer
  • iperf
  • nmap
  • openntpd
  • rsync
  • screen
  • smartmontools
  • sudo
  • vim-lite
  • wget


Grundkonfiguration

Services und deren Parameter werden entweder in /etc/rc.conf und teilweise ergänzend in eigenen Konfigurationsdateien (zB /etc/ssh/sshd_config) konfiguriert.


Nach der Installation befinden sich beispielsweise folgende Einträge in /etc/rc.conf:

hostname="srv01.sigsys.de"
keymap="german.iso.kbd"

# ifconfig_em0="DHCP"
# ifconfig_em0_ipv6="inet6 accept_rtadv"

sshd_enable="YES"
ntpd_enable="YES"
# Set dumpdev to "AUTO" to enable crash dumps, "NO" to disable
dumpdev="AUTO"
zfs_enable="YES"

clear_tmp_enable="YES"

Das Netzwerksetup wird dann konkretisiert:

# IPv4: Net: 164.177.170.96/29
#       GW:  164.177.170.102
# IPv6: Net: 2a03:2500:1:8::/64
#       GW:  2a03:2500:1:8::1

defaultrouter="164.177.170.102"
ifconfig_em0="inet 164.177.170.97 netmask 255.255.255.248"

ifconfig_em0_ipv6="inet6 2a03:2500:1:8:1:: prefixlen 64"
ipv6_defaultrouter="2a03:2500:1:8::1"

Für die rein interne Kommunikation soll ein LAN-Interface eingerichtet werden, entweder als echtes physikalisches Interface mit Verbindung zum LAN oder wie hier gezeigt als Loopback-Interface:

# LAN: 10.253.2.0/24
cloned_interfaces="lo1"
ifconfig_lo1="inet 10.253.2.1 netmask 255.255.255.0 name lan"


Außerdem sollen weitere Dienste gestartet werden, deren Konfiguration nachfolgende erläutert wird:

# S.M.A.R.T Monitoring
smartd_enable="YES"

# syslogd soll nur im LAN lauschen
syslogd_flags="-s -b 10.253.2.1:514"

# sendmail soll nur minimal konfiguriert werden
sendmail_enable="NO"
sendmail_submit_flags="-L sm-mta -bd -q30m -ODaemonPortOptions=Addr=10.253.2.1"

# Systemzeit beim booten *hart* einstellen
ntpdate_enable="YES"
ntpdate_flags="europe.pool.ntp.org"

# Statt dem default-ntpd soll openntpd verwendet werden
ntpd_enable="NO"
openntpd_enable="YES"
openntpd_flags="-s"

named_enable="YES"

sshd einrichten

Der OpenSSH-Daemon soll nur auf Port 2222 lauschen (auf Port 22 kommen zuviele Botnetze/Scanner rein, die nur für unnötigen Ballast im auth.log sorgen) und auch nur auf dedizierten IP-Adressen (das ist für den Betrieb von Jails erforderlich, da sonst auch unter der IP-Adresse der Jails der OpenSSH-Daemon des Servers selbst angesprochen würde).

ListenAddress 164.177.170.97:2222
ListenAddress [2a03:2500:1:8:1::]:2222
ListenAddress 127.0.0.1:22
ListenAddress 10.253.2.1:22

PermitRootLogin without-password

Weitere "Härtungen" (zB authorized_keys nur für root zugreifbar, ...) finden hier ersteinmal nicht statt

sendmail einrichten

In /etc/mail müssen initial Hostnamen-spezifische Templates angelegt werden.

# make

Im Anschluss dann in zB srv01.sigsys.de.mc bearbeitet, hier dargestellt als unified diff zum Default "freebsd.mc":

--- freebsd.mc  2014-11-11 22:03:42.000000000 +0100
+++ srv01.sigsys.de.mc  2015-02-16 17:17:12.803364117 +0100
@@ -87,7 +87,7 @@
 dnl FEATURE(dnsbl, `dnsbl.example.com', ``"550 Mail from " $&{client_addr} " rejected"'')
 
 dnl Dialup users should uncomment and define this appropriately
-dnl define(`SMART_HOST', `your.isp.mail.server')
+define(`SMART_HOST', `mail.sigsys.lan')
 
 dnl Uncomment the first line to change the location of the default
 dnl /etc/mail/local-host-names and comment out the second line.
@@ -95,8 +95,16 @@
 define(`confCW_FILE', `-o /etc/mail/local-host-names')
 
 dnl Enable for both IPv4 and IPv6 (optional)
-DAEMON_OPTIONS(`Name=IPv4, Family=inet')
-DAEMON_OPTIONS(`Name=IPv6, Family=inet6, Modifiers=O')
+dnl DAEMON_OPTIONS(`Name=IPv4, Family=inet')
+dnl DAEMON_OPTIONS(`Name=IPv6, Family=inet6, Modifiers=O')
+
+FEATURE(no_default_msa)dnl ## overridden with DAEMON_OPTIONS below
+
+DAEMON_OPTIONS(`Name=IPv4, Addr=10.253.2.1, Family=inet')dnl
+DAEMON_OPTIONS(`Name=IPv4, Addr=127.0.0.1, Family=inet')dnl
+DAEMON_OPTIONS(`Name=MSA, Addr=10.253.2.1, Port=587, M=E')dnl
+DAEMON_OPTIONS(`Name=MSA, Addr=127.0.0.1, Port=587, M=E')dnl
+DAEMON_OPTIONS(`Name=IPv6, Addr=::1, Family=inet6')dnl
 
 define(`confBIND_OPTS', `WorkAroundBrokenAAAA')
 define(`confNO_RCPT_ACTION', `add-to-undisclosed')

Das "Festnageln" der verwendeten IP-Adressen sorgt auch ier dafür, dass sendmail sich nicht auf alle IP-Adressen bindet, die ggf. durch andere Jails verwendet werden sollen. Außerdem soll für jegliche Mailkommunikation der Mailserver unter mail.sigsys.lan verwendet werden, auf dem dann einheitlich und für alle Jails das Mailrouting implementiert wird.

Die Aktivierung dieser Konfiguration erfolgt abschließend mit

# make
# make install
# service sendmail restart