Hardening FreeBSD

Ich stelle hier einige Tips zum absichern eines FreeBSD (z.B. als Firewall) Servers vor.
Der folgende Text erhebt keinerlei Anspruch auf vollständigkeit! Zudem empfehle ich dringendst die einzelnen Tips vorher auf einer Testkiste zu testen. Auch muss nicht alles so übernommen wie hier steht da einiges (z.B. ‚kern_securelevel=“3″‚, ’net.inet.tcp.blackhole=2‘ oder ‚console none unknown off insecure‘) vielleicht dem einen oder anderen setting zu viel ist. Auch sei die konsultation der Manpages sehr empfohlen.

„Dependency“: FreeBSD 5.3 oder höher

 

rc.conf

# vim /etc/rc.conf

kern_securelevel_enable=“YES“
kern_securelevel=“3″
firewall_enable=“YES“
firewall_logging=“YES“
firewall_script=“/etc/firewall“
firewall_type=“/etc/ipfw.conf“
sendmail_enable=“NONE“
portmap_enable=“NO“
inetd_enable=“NO“
clear_tmp_enable=“YES“
syslogd_flags=“-s“

 

Sysctl

# vim sysctl.conf

security.bsd.see_other_uids=0
security.bsd.see_other_gids=0
net.inet.icmp.bmcastecho=0
net.inet.icmp.maskrepl=0
net.inet.icmp.icmplim=60
net.inet.ip.random_id=1
net.inet.ip.redirect=0
net.inet.ip.sourceroute=0
net.inet.ip.accept_sourceroute=0
net.inet.tcp.sendspace=32768
net.inet.tcp.recvspace=32768
net.inet.tcp.msl=7500
net.inet.tcp.blackhole=2
net.inet.udp.blackhole=1
kern.ipc.somaxconn=1024

 

IPFW Firewall

Siehe u.a. meinen Artikel über IPFW.

 

Immutable-flag (selbst root kann dann die Datei nicht mehr, ohne vorheriges zurücksetzen des flags, die Datei/das Verzeichniss verändern)

chflags schg /etc/rc.conf
chflags schg /root/.ssh

 

Nutzen der ACLs für des Filesystem

Benötigt im Kernel die ACL option
# vim /usr/src/sys/i386/conf/GENERIC

options UFS_ACL

Aktivieren der ACLs
# tunefs -a enable

Setzen der ACLs auf Dateien und Verzeichnisse
(Der Owner und die Gruppe der Datei bekommen lese und execute rechte, others bekommt nix)
# setfacl -m u::r-x,g::r-x,o::— /sbin
(Der Owner Root und die Gruppe wheel bekommen lese und execute rechte, others bekommt nix)
# setfacl -m u:root:r-x,g:wheel:r-x,o::— /sbin
usw….

Bei u.a. folgenden Dateien sollte man das setzen einer restriktiven ACL in erwägung ziehen:
/bin/getfacl
/bin/setfacl
/sbin/mount
/sbin/umount
/sbin/halt
/sbin/ipfw
/sbin/sysctl
/usr/bin/users
/usr/bin/w
/usr/bin/who
/usr/bin/last
/usr/bin/lastcomm
/usr/bin/ssh
/usr/sbin/lastlogin
/usr/sbin/jls
/etc/crontab
/etc/fstab
/etc/ftpusers
/etc/group
/etc/hosts
/etc/hosts.allow
/etc/hosts.deny
/etc/hosts.equiv
/etc/hosts.lpd
/etc/inetd.conf
/etc/login.access
/etc/login.conf
/etc/newsyslog.conf
/etc/rc.conf
/etc/rc.local
/etc/sysctl.conf
/etc/syslog.conf
/etc/ttys
/etc/ssh/sshd_config
/usr/local/etc/ntpd.conf
und eventuell noch einige mehr…
Sowie eventuelle Firewallrules und weitere installierten Programme.
Wenn man nicht mit ACLs arbeiten möchte kann man auch z.B. „chmod o=“ nutzen.
Entsorgen könnte man auch gleich Dinge wie rlogin oder rsh.

 

Dateisystem verschlüsseln

Eine mögliche Anleitung habe ich hier geschrieben.
Es gibt natürlich auch eine FreeBSD Doku hierzu.
Und hier auch noch eine.

 

Benutzung von blowfish Verschlüsselung für Systempasswörter.
Wobei nur ROOT ein Passwort haben sollte. SSH-Login nur via Keys und als unpriveligierter User.

# vim /etc/auth.conf

crypt_default=blf

# vim /etc/login.conf

default:\
        :passwd_format=blf:\
        :minpasswordlen=8:\
        :mixpasswordcase=true:\
        :passwordtime=90d:\
        :idletime=30:\
        :umask=027:\
        :requirehome=true


# cap_mkdb /etc/login.conf

 

Komplettes disablen von direktem login als root

# vim /etc/ttys

console none                            unknown off insecure
ttyv0   "/usr/libexec/getty Pc"         cons25  on  insecure
ttyv1   "/usr/libexec/getty Pc"         cons25  on  insecure
ttyv2   "/usr/libexec/getty Pc"         cons25  on  insecure
ttyv3   "/usr/libexec/getty Pc"         cons25  on  insecure
ttyv4   "/usr/libexec/getty Pc"         cons25  on  insecure
ttyv5   "/usr/libexec/getty Pc"         cons25  on  insecure
ttyv6   "/usr/libexec/getty Pc"         cons25  on  insecure
ttyv7   "/usr/libexec/getty Pc"         cons25  on  insecure
ttyv8   "/usr/X11R6/bin/xdm -nodaemon"  xterm   off insecure
ttyd0   "/usr/libexec/getty std.9600"   dialup  off insecure
ttyd1   "/usr/libexec/getty std.9600"   dialup  off insecure
ttyd2   "/usr/libexec/getty std.9600"   dialup  off insecure
ttyd3   "/usr/libexec/getty std.9600"   dialup  off insecure
dcons   "/usr/libexec/getty std.9600"   vt100   off insecure

 

Syslog

Permissions der logfiles
# vim /etc/newsyslog.conf

/var/log/messages                       640  14    *    @T00  JC
/var/log/wtmp                           640  3     *    @01T05 B


# chmod 640 /var/log/messages /var/log/wtmp

Syslog zu einem loghost

*.*     @192.168.10.100

 

SSH

Konfig
# vim /etc/ssh/sshd_config

Protocol 2
ListenAddress 192.168.10.10
PermitRootLogin no
StrictModes yes
MaxAuthTries 2
IgnoreUserKnownHosts yes
PasswordAuthentication no
PermitEmptyPasswords no
ChallengeResponseAuthentication no
AllowTcpForwarding no
PermitTunnel no
GatewayPorts no
X11Forwarding no
UseLogin no
UsePrivilegeSeparation yes
PermitUserEnvironment no
AllowGroups sshlogins
VersionAddendum

Nur User der Gruppe sshlogins dürfen sich per SSH einloggen. Also Gruppe einrichten und User der Gruppe hinzufügen.
# pw groupadd sshlogins
# pw groupmod shlogins-M sven

 

Cron und AT nur von Root nutzbar machen.

# echo „root“ > /var/cron/allow
# echo „root“ > /var/at/at.allow

 

Jails

Manpage für jail.

 

Das wars fürs erste…
Man sollte nicht vergessen den sonstigen Applikationen ebenfalls eine abhärtungs Kur zu verpassen.