Beruflich Dokumente
Kultur Dokumente
cns at minithins.net
"A physician, a civil engineer, and a computer scientist were arguing about
what was the oldest profession in the world. The physician remarked, "Well, in
the Bible, it says that God created Eve from a rib taken out of Adam. This
clearly required surgery, and so I can rightly claim that mine is the oldest
profession in the world." The civil engineer interrupted, and said, "But even
earlier in the book of Genesis, it states that God created the order of the
heavens and the earth from out of the chaos. This was the first and certainly
the most spectacular application of civil engineering. Therefore, fair doctor,
you are wrong : mine is the oldest profession in the world." The computer
scientist leaned back in her chair, smiled, and then said confidently, "Ah,
but who do you think created the chaos ?"
R�sum�
Ce paper est issu comme beaucoup d'initiatives libres d'un besoin de la part
des auteurs. Dans cet article nous souhaitons faire partager ce que nous avons
travers� afin d'obtenir une machine FreeBSD configur�e au mieux pour r�sister
a toutes sortes de menaces. C'est une sorte de compilation des connaissances
disparates dont nous avons nous m�me eu besoin. Comme le faisait remarquer
Bruce Scheiner, la s�curit� est une processus, pas un produit ; c'est pourquoi
nous tentons dans ce document d'aborder un large panel de sujets et
d'utilisations en nous basant sur la branche FreeBSD 4.x-STABLE.
1. Burn out !
1.1. services
1.2. CVSup
1.3. (re)compilation et update
2. Tuning syst�me
2.1. sysctl
2.1.1. securelevel et chflags
2.1.2. performances
2.2. gestion utilisateurs
2.2.1. adduser / rmuser / chpass / watch
2.2.2. quotas et login.conf
2.2.3. jail
2.3. int�grit�
2.4. secure shell
2.5. syslog
2.6. cron
2.7. ipfw et natd
3. Outils
3.1. TCPdump
3.2. Nessus
3.3. lsof
3.4. stack smashing
3.5. tunneling
4. Conclusion
1. burn out !
Nous allons partir du fait que vous avez r�ussi � installer correctement
FreeBSD, et que vous �tes parvenu � une connexion Internet stable. Nous ne
donnerons donc aucune indication quant � ces phases. Dans ce chapitre, nous
nous concentrerons sur la configuration de base de FreeBSD, c'est-�-dire les
premi�res mesures que vous appliquerez dans une optique de s�curit�, peu apr�s
votre installation r�ussie.
1.1. services
Inetd est un super daemon qui permet de lancer plusieurs services reseau ainsi
qu'une partie de leur configuration comme ftpd, smptd ou telnetd. Le fichier
de configuration pour inetd est conserv� dans /etc/inetd.conf. En voici un
extrait :
En r�gle g�n�rale, on place le caractere '#' devant une ligne que nous ne
voulons pas afin de la mettre en commentaire. Si nous ne desirons offrir aucun
de ces services - il est preferable de supprimer cette configuration de base
laxiste afin de repartir de zero - nous pouvons retirer inetd de notre fichier
de demarrage pour augmenter encore un peu la s�curit� et la convivialit�. Si
par ailleurs vous desirez tout de meme offrir un shell distant � quelques
utilisateurs, un chapitre entier couvre la configuration du sshd d'OpenSSH.
Enfin, en �clipsant inetd, nous d�cidons d'abandonner �galement TCP Wrappers
utilis� par d�faut sous FreeBSD.
Tout d'abord il est utile de v�rifier quel service tourne en �coute sur un
port actuellement. Pour cela nous allons utiliser l'utilitaire netstat qui
affiche une liste des ports et connexions actives. Nous l'allions � grep pour
pr�ciser notre recherche.
Comme vous le voyez nous ne croulons pas sous les services. Mais si votre
machine est destin�e � devenir un serveur avec de multiples services, je vous
recommande de suivre notre solution. Bref, sur le m�me sch�ma que pr�c�demment,
tous les services r�seau que vous voudrez proposer � l'avenir tourneront sous
la forme de stand alone daemon, c'est-�-dire des daemons autonomes augmentant
la s�curit� mais aussi simplifiant la configuration et am�liorant la rapidit�
de r�ponse des services en �liminant l'interm�diaire inetd. Pour �viter
qu'inetd ne se lance au d�marrage, nous �ditons le fichier /etc/rc.conf apr�s
avoir effectu� un rapide grep permettant de savoir si nous avons
effectivement besoin d'�diter :
inetd est donc lanc� au d�marrage avec par ailleurs les options -wW signifiant
la capacit� de filtrage des services internes et externes TCP via TCP Wrappers
que nous n'utiliseront pas non plus. Donc, toujours dans rc.conf,
inetd_enable="YES" devient inetd_enable="NO" et on met inetd_flags="-wW" en
commentaire. Nous d�sactivons �galement portmapper, un outil extr�mement
pratique dans le cadre de services RPC tels que NFS mais qui pr�sentent un
nombre incalculable de vuln�rabilit�s. Nous transformons donc la ligne
portmap_enable="YES" en NO. Ainsi inetd et portmapper ne seront pas ex�cut�s
la prochaine fois que vous red�marrerez. Si vous voulez killer inetd de suite,
vous pouvez faire :
# killall inetd
Notez que c'est �galement dans rc.conf que vous pourrez configurer les
programmes ou scripts � lancer d�s le d�marrage. Selon le destin de votre
machine, �a peut �tre une bonne id�e de manipuler les champs portmap_enable,
named_enable ou sendmail_enable.
1.2 CVSup
http://lists.freebsd.org/mailman/listinfo/freebsd-security-notifications
http://www.freebsd-fr.org/local-fr/www/spec/support/liste_diffusion.html
# mkdir /usr/share/cvsup/
# cp /usr/share/examples/cvsup/ports-supfile /usr/share/cvsup/
# cp /usr/share/examples/cvsup/doc-supfile /usr/share/cvsup/
# cp /usr/share/examples/cvsup/cvs-supfile /usr/share/cvsup/
# ee /usr/share/cvsup/cvs-supfile
# nous rentrons ici le serveurs cvsup que nous voulons utiliser. Vous pouvez
# en choisir sur la liste presente sur
# http://www.freebsd.org/handbook/mirrors.html
*default host=cvsup.fr.FreeBSD.org
#ports-archivers
#ports-astro
ports-audio
ports-base
#ports-benchmarks
#ports-biology
#ports-cad
#ports-chinese
#ports-comms
#ports-converters
ports-databases
ports-deskutils
ports-devel
ports-editors
ports-emulators
ports-ftp
ports-french
#ports-games
#ports-german
ports-graphics
ports-irc
#ports-japanese
ports-java
#ports-korean
ports-lang
ports-mail
#ports-math
#ports-mbone
ports-misc
ports-net
ports-news
ports-palm
ports-picobsd
ports-print
#ports-russian
ports-security
ports-shells
ports-sysutils
ports-textproc
#ports-vietnamese
ports-www
# et on ne sait jamais, des fois que l'appel du graphisme soit trop fort...
ports-x11
ports-x11-clocks
ports-x11-fm
ports-x11-fonts
ports-x11-servers
ports-x11-toolkits
ports-x11-wm
------------------------------------ SNiP -------------------------------------
# cp /etc/default/make.conf /etc/
# ee /etc/make.conf
PPP_NOSUID= true
ENABLE_SUID_SSH= true
ENABLE_SUID_NEWGRP= true
COMPAT1X= no
COMPAT20= yes
COMPAT21= yes
COMPAT22= yes
COMPAT3X= yes
SUP_UPDATE= yes
SUP= /usr/local/bin/cvsup
SUPFLAGS= -g -L 2
SUPFILE= /usr/share/cvsup/cvs-supfile
PORTSSUPFILE= /usr/share/cvsup/ports-supfile
DOCSUPFILE= /usr/share/cvsup/doc-supfile
------------------------------------ SNiP -------------------------------------
Vous pouvez vous amuser avec les nombreux exemples de supfile et de refuse
disponibles dans le r�pertoire examples, puis, une fois votre param�trage
effectu�, il ne vous reste plus qu'� lancer une update :
Notez bien que la totalit� du syst�me est mis � jour (ou tout du moins les
sources si NO_DOCUPDATE et NO_PORTSUPDATE sont mis � "yes"). SUPFILE,
DOCSUPFILE et PORTSSUPFILE permet simplement de filtrer les modules qui
seront mis � jour pour les sources, la documentation et le ports tree,
respectivement.
Maintenant que nous avons une arborescence des sources et de la port collection
correctement mis � jour, il ne nous reste plus (sic) qu'� 'construire' cette
arborescence.
Tout d'abord nous allons r�ellement construire l'ensemble des sources de notre
systeme de base :
Cette op�ration assez importante peut durer plusieurs heures. Sur un Celeron
400, il aura fallu un peu plus d'une heure et demie. Bref le nombre de verres
que vous prendrez d�pendra de la puissance de votre machine.
options NETGRAPH
options NETGRAPH_ONE2MANY
options NETGRAPH_PPPOE
options NETGRAPH_HOLE
options NETGRAPH_ECHO
options NETGRAPH_TEE
options NETGRAPH_TTY
options NETGRAPH_ASYNC
options NETGRAPH_INTERFACE
options TCP_DROP_SYNFIN
options ICMP_BANDLIM
options RANDOM_IP_ID
options SC_DISABLE_DDBKEY
options SC_DISABLE_REBOOT
options SC_NO_HISTORY
options NO_LKM
options NO_KLD
options QUOTA
options SOFTUPDATES
options UFS_DIRHASH
options COMPAT_LINUX
options DDB
options DEVICE_POLLING
maxusers 0
options HZ=1000
options NMBCLUSTERS=32768
pseudo-device snp 4
# high because of all the security tools
pseudo-device bpf 10
# high because of IPSec
pseudo-device gif 10
pseudo-device faith 1
pseudo-device stf 1
------------------------------------ SNiP -------------------------------------
Dans l'ordre, nous s�lectionnons le support IPv4, IPv6, IPSEC et ESP. Puis nous
activons le support IPFW (que vous pouvez d�cider de remplacer par IPFilter non
trait� dans cet article) avec l'envoi des messages � syslog limit� � 30 fois la
m�me occurrence. Nous aurons eu soin avant cela de permettre � IPFW de filtrer
les paquets encapsul�s avec IPSEC et transitant via des interfaces gif, tout
ceci depuis FreeBSD 4.9. Le forwarding est aussi activ� ainsi que le forwarding
cach� (passant un paquet sans d�cro�tre son TTL), tout comme les divert sockets
permettant de modifier le transit d'un paquet dans le kernel ; et enfin le
support de dummynet, le traffic shaper basique du syst�me. Nous activons ensuite
les accept filters qui acc�l�re le processus d'admission de certains types de
connexions (comme HTTP) en les pla�ant directement dans le kernel. Notez que
mi-2002, Luigi Rizzo a totalement r��crit les m�canismes internes d'ipfw afin
d'en doubler la vitesse et de le rendre facilement extensible via un jeu de
microinstructions similaires � BPF. Ce code a �t� backport� sur stable et se
trouve totalement compatible avec vos rulesets. Bien qu'encore non document�,
vous pouvez l'activer en pla�ant l'option IPFW2 dans votre configuration.
Notez enfin que le nombres maximal d'utilisateurs est plac� � 0 pour qu'il soit
calcul� au moment du boot en fonction de la m�moire physique disponible. Cette
variable ainsi que le nombre de clusters du syst�me de fichiers sont utilis�es
pour calculer l'allocation de certaines ressources m�moire. La fr�quence
d'horloge est ensuite plac�e � 1000 Hz pour augmenter l'acuit� du device
polling (et aussi limiter les burst si vous utilisez ALTQ). Viennent enfin les
pseudo-devices snoop et bpf pour la surveillance respective des tty et des
trames ethernet, et gif, faith et stf pour le tunneling v6/v4.
Certaines options seront d�j� pr�sentes, nous ne faisons que les v�rifier. Vous
pouvez �galement r�fl�chir � mettre en commentaire le support procfs et NFS qui
peuvent cr�er d'�ventuelles vuln�rabilit�s dans le syst�me, � moins bien s�r
que vous n'en ayez besoin. Pour examiner l'ensemble des options kernel
disponibles, r�f�rez vous au fichier LINT dans le m�me r�pertoire que GENERIC.
# reboot
# cd /usr/src/usr.sbin/mergemaster
# ./mergemaster -sv -D /etc/
Voil�, le syst�me est fin pr�t pour attaquer sa r�elle configuration. Nous
red�marrons une nouvelle fois afin de repasser en multiuser mode.
# reboot
2. Tuning Syst�me
Maintenant que notre syst�me est comme neuf et on ne peut plus � jour, il ne
nous reste plus qu'� entamer sa r�elle s�curisation. Pour cela nous allons
d'abord voir ce que nous pouvons faire par d�faut avec le syst�me de base afin
d'augmenter la s�curit� de notre syst�me et de limiter se fen�tre d'exposition
aux attaques.
2.1. sysctl
de la m�me mani�re que vous utiliseriez un ls. Notez que vous pouvez pr�ciser
l'entr�e de la MIB si vous la connaissez juste apr�s l'option afin de
n'afficher qu'elle. Suivant le principe des MIB, vous pouvez r�duire
l'affichage en pr�cisant un champ de la MIB. Par exemple pour afficher toutes
les entr�es en rapport avec IP
# sysctl net.inet.ip.*
Notez aussi que certaines variables ne sont pas modifiables et que certaines
entr�es de la MIB sont sous forme de tableaux utilis�s � l'occasion par ps,
netsat ou systat. Enfin, pour obtenir une liste des variables sysctl que vous
pouvez modifier, consultez la page de manuel de sysctl.
Pour d�finir le securelevel mis en place par init, modifiez les lignes
suivantes dans rc.conf :
kern_securelevel_enable="YES"
kern_securelevel="N"
# sysctl -w kern.securelevel=N
Outre des limitations inscrites dans le code kernel, donc inchangeable, propres
� chacun d'eux, chaque level d�finit �galement les op�rations possibles sur des
file flags, attributs de fichiers permettant d'am�liorer la s�curit� fournie
par les classiques permissions Unix. Ci-dessous, les 5 niveaux et leurs
limitations :
Pour param�trer les file flags sur vos fichiers en fonction de ces levels, il
vous faudra utiliser la commande chflags. Les flags disponibles sont list�s
ci-apr�s.
Notez qu'en effectuant un man chflags, vous d�couvrez les quelques options -
notamment la r�cursivit� - que propose cette commande. Pour retirer un file
flag ce sont les m�mes options avec le prefix no tel que nosappnd. Les file
flags sont int�ressants � placer sur certains fichiers sensibles pr�cis ou
alors carr�ment sur un r�pertoire dont vous souhaitez vous assurer de
l'int�grit� et qui sera rarement modifi�. Dans l'exemple, R et H permettent de
suivre les liens symboliques et ce r�cursivement, la commande �tant appliqu�e �
des r�pertoires entiers de binaires.
Dernier d�tail qui n'a pas grand chose � voir avec sysctl mais qui importe
beaucoup dans la gestion des droits et des fichiers. Vous avez le loisir de
modifier la fstab afin de monter vos diverses partitions avec certaines
options. Sous FreeBSD, au lieu de ne cr�er qu'une unique partition root /, le
syst�me cr�e simultan�ment une partition /usr et /var. Vous pouvez d�finir dans
votre fstab pour l'ensemble de vos syst�mes de fichiers :
- les droits d'�criture avec l'option rw pour read-write, ou ro pour read-only.
- les droits d'ex�cution avec l'option noexec.
- les privil�ges accord�s avec l'option nosuid.
# ee /etc/fstab
Nous limitons ici l'ex�cution dans /var afin d'�viter qu'un intrus tente d'y
placer des binaires et nous limitons la pr�sence de binaires suid ou de devices
dans les autres r�pertoires majeurs.
Notez au passage que les soft updates que nous avons mis en place dans notre
configuration kernel ne s'activent pas via la fstab mais gr�ce � l'utilitaire
tunefs qui modifie directement, et de mani�re persistante, l'ent�te du syst�me
de fichier. Pour effectivement activer ces soft updates, suivez la ligne
suivante :
2.1.3. Performances
Sysctl peut �galement nous apporter une aide pr�cieuse dans la configuration
syst�me et r�seau � des fins de performances �lev�es. Il va ainsi nous
permettre d'activer certaines capacit�s r�seau que supporte parfaitement la
pile TCP/IP BSD - qui est cela dit en passant certainement la plus stable, la
plus performante et la plus standard des piles TCP/IP - mais qui ne sont pas
activ�es par d�faut.
# sysctl -w net.inet.tcp.log_in_vain=1
# sysctl -w net.inet.udp.log_in_vain=1
# sysctl -w net.inet.ip.forwarding=1
# sysctl -w net.inet.fastforwarding=1
Les entr�es suivantes sont particuli�rement utiles dans le cadre d'un serveur
qui n�cessit� une haute disponibilit� ou une grande fiabilit�. En effet, nous
allons apporter � notre machine le support des extensions TCP pour hautes
performances. Ces extensions sont d�crites dans la RFC 1323 que je vous
recommande d'�tudier. Elles sont constitu�es de 3 extensions. La premi�re est
le champ Window Scale qui est un facteur appliqu� au champ Window Size et utile
sur les Large Fat Network (LFN) afin d'optimiser le flux de donnees sur ces
grands reseaux et d'apporter un meilleur contr�le en multipliant la Window
Size. Nous trouvons ensuite 2 options extr�mement utiles dans le cas
d'utilisation de load balancing en fournissant des informations aux algorithmes
de r�partition de charge. Le Round-Trip Time Mesurement (RTTM) et le Protection
Against Wrapper Sequence Numbers (PAWS) se basent tous les 2 sur l'adjonction
d'une option de timestamp aux segments TCP. Avec de simples v�rifications de
timestamp on peut ainsi calculer le temps d'aller retour entre 2 ACK et ainsi
optimiser le flux ou modifier la route. On peut �galement se pr�venir du
hijacking, de l'overlapping et surtout du rejeu en effectuant une double
v�rification sur le num�ro de s�quence et le timestamp. Ces options viennent
s'ajouter � la suite d'algorithmes NewReno, �volution de la pile Reno,
permettant de d�tecter et corriger une congestion dans le r�seau en jouant sur
la perte de paquets, les d�lais et les tailles de fen�tre TCP. L'unique b�mol
est que ces options ne fonctionnent bien s�r qu'entre des machines les
supportant toutes les 2 de mani�re similaire, or elles ne semblent pas �tre
tr�s utilis�es - notez que la branche 4.x supporte la RFC 1323 par d�faut
depuis la release 4.4 - et enfin vous pourriez risquer des d�sagr�ments face �
certains firewalls ou plugins de normalisation de trafic s'ils ne reconnaissent
pas ces options. Cependant nous d�cidons de l'aborder dans cet article afin de
faciliter sa diffusion et nous l'appliquons � notre syst�me par acquis de
conscience ! Vous trouverez ensuite une entr�e r�cente qui force FreeBSD �
calculer, pour chaque connexion TCP, la quantit� de donn�es en cours de
transmission dans le r�seau (� partir du produit delay*bw), afin de limiter
l'envoi de paquets � m�me d'entra�ner une surcharge non pertinente des routeurs
et/ou switchs pr�sent sur la route. Cette configuration rapproche alors le
comportement de FreeBSD de la suite d'algorithmes TCP Vegas. Nous n'avons plus
ensuite qu'� augmenter les tailles par d�faut de nos buffers d'envoi et de
r�ception (aussi bien pour TCP que pour UDP), qui ont une influence directe sur
le champ TCP window size. Du fait de l'influence possible de ces valeurs sur le
d�lai, il est recommand� d'exp�rimenter plusieurs valeurs, en suivant par
exemple la r�gle wnd = bw / 8 * RTT. Par exemple, nous avons volontairement
limit� la taille des buffers pour UDP qui ne poss�de pas de m�canisme de
d�tection et �vitement de congestion et s'y trouve donc plus sensible. Nous
avons �galement attribu� des valeurs diff�rentes aux buffers d'envoi et de
r�ception pour TCP, la vitesse de download se trouvant souvent plus �lev�e que
celle d'upload (pensez aux lignes xDSL). Pour finir, les deux derni�res entr�es
sysctl indiquent de ne pas g�n�rer de paquets avec l'option source route, ni de
les accepter, cette option IP facilitant le spoofing d�j� �voqu� en faisant
remonter les paquets IP strictement par le chemin utilis� � l'aller.
# sysctl -w net.inet.tcp.strict_rfc1948=1
# sysctl -w net.inet.tcp.isn_reseed_interval=1800
# sysctl -w net.inet.tcp.syncookies=1
# sysctl -w net.inet.tcp.syncache.hashsize=512
# sysctl -w net.inet.tcp.syncache.cachelimit=15359
# sysctl -w net.inet.tcp.syncache.bucketlimit=30
# sysctl -w net.inet.tcp.syncache.rexmtlimit=3
# sysctl -w net.inet.ip.ttl=128
# sysctl -w net.inet.icmp.maskrepl=0
# sysctl -w net.inet.icmp.bmcastecho=0
# sysctl -w net.inet.icmp.icmplim=200
# sysctl -w net.inet.tcp.delayed_ack=1
# sysctl -w net.inet.tcp.always_keepalive=1
# sysctl -w net.inet.tcp.blackhole=2
# sysctl -w net.inet.udp.blackhole=1
# sysctl -w net.inet.ip.check_interface=1
Par ailleurs nous poss�dons �galement quelques astuces afin d'�viter les
tentatives de cache poisoning en acc�l�rant le temps de rafra�chissement de la
table de routage et de la table ARP.
# sysctl -w net.inet.ip.rtexpire=60
# sysctl -w net.inet.ip.rtminexpire=10
# sysctl -w net.link.ether.inet.max_age=1200
# sysctl -w vfs.vmiodirenable=1
# sysctl -w kern.coredump=1
# sysctl -w kern.corefile=%N.sexfault
# sysctl -w kern.ps_showallprocs=0
Toujours dans les protections contre les DoS mais cette fois-ci c�t� ressources
plut�t que r�seau. Les entr�es suivantes de la MIB vont nous permettrent
d'abord de limiter le nombre de processus par utilisateur et le nombre fichiers
(incluant file descriptor et IPC) qu'il peut ouvrir. Nous augmentons aussi la
taille de la queue de connexions de pair avec le nombre maximal de sockets
(2 fois le maximum de connexion approximativement). de m�me que la taille
maximal des buffers pour sockets (empiriquement 8 fois la taille de
{recv,send}space). Enfin, nous augmentons �galement le nombre maximum de
fichiers. Toutes ces valeurs paraissent �lev�es, mais elles ne servent en
r�alit� qu'� l'allocation de ressources.
# sysctl -w kern.maxprocperuid=512
# sysctl -w kern.maxfilesperproc=1024
# sysctl -w kern.ipc.somaxconn=4096
# sysctl -w kern.ipc.maxsockbuf=262144
# sysctl -w kern.maxfiles=16384
Si vous disposez de disques IBM DPTA ou DTLA, vous pouvez utiliser � la place
l'entr�e hw.ata.tags mais � vos risques et p�rils puisqu'elle est encore
exp�rimentale.
Notez par ailleurs que l'utilisation du compte root or des op�rations limit�es
de maintenance est fortement d�conseill�e pour des raisons de s�curit�. Chaque
manipulation du root peut entra�ner des cons�quences importantes pour
l'int�grit� du syst�me ou bien si le compte est compromis, alors toute la
machine passe sous contr�le de l'intrus. Bref, il est pr�f�rable de se
constituer un compte utilisateur appartenant lui aussi au group wheel et ayant
la capacit� d'ex�cuter des commandes en root par sudo qui nous permet de rester
sous un compte utilisateur et effectuer des op�rations ponctuelles n�cessitent
des droits root ou encore d'intervenir dans sur d'autres comptes si besoin est.
Par exemple nous pouvons �diter l'index de notre serveur web sur le compte
syst�me www en utilisant l'option -u qui permet de pr�ciser l'utilisateur dont
on souhaite endosser les droits
Bien s�r cette libert� de manipulation peut �tre dangereuse c'est pourquoi nous
avons besoin d'�diter et de configurer /etc/sudoers afin de limiter les acc�s.
Le sch�ma de /etc/sudoers est le suivant : vous pouvez d�finir des alias pour
un ou plusieurs utilisateurs, ou encore une ou plusieurs commandes puis vous
d�finissez les autorisations selon le schema WHO WHERE=WHAT.
Run_alias OP = root,named,www
# alias commandes
Cmnd_Alias DEBUG = /usr/bin/mt,/usr/sbin/dump,/usr/sbin/restore, \
/usr/sbin/dd,/usr/bin/gdb,/usr/bin/ktrace, \
/usr/bin/kdump,/usr/bin/file,/usr/bin/truss, \
/usr/bin/ldd,/usr/bin/objdump,/usr/bin/strings, \
/usr/bin/nm,/usr/bin/size,/usr/bin/kill
Cmnd_Alias KILL = /usr/sbin/shutdown,/usr/sbin/halt,/usr/sbin/reboot
Cmnd_Alias SHELLS = /usr/bin/sh,/usr/bin/csh,/usr/local/bin/zsh, \
/usr/bin/ssh,/usr/X11R6/bin/startx
Cmnd_Alias USER = /usr/bin/su,/usr/sbin/adduser, /usr/sbin/rmuser, \
/usr/bin/chsh
Cmnd_Alias NET = /usr/sbin/ppp,/usr/sbin/ifconfig,/usr/sbin/ipfw
Cmnd_Alias DAEMON = /usr/sbin/named,/usr/local/apache,/usr/bin/sshd
Cmnd_Alias RIGHTS = /usr/sbin/chroot,/usr/sbin/jail,/usr/sbin/chown, \
/usr/bin/chmod
Cmnd_Alias CDROM = /sbin/umount /cdrom, /sbin/mount_cd9660 /dev/acd0c /cdrom
#directives
root ALL = (ALL) ALL
FULLTIMERS ALL = NOPASSWD: DEBUG, KILL, SHELLS, RIGHTS, USER, NET, DAEMON
PARTTIMERS ALL = DEBUG, NET, (OP) NOPASSWD: DAEMON
ALL ALL = NOPASSWD: CDROM
------------------------------------ SNiP -------------------------------------
Sudo se base sur des timestamp entre les diff�rences commandes entr�es pour
assurer un minimum de s�curit� en pla�ant un timeout. Pour updater votre
timestamp sans ex�cuter de commandes, vous pouvez taper sudo -v et pour le tuer
d�finitivement, sudo -K.
adduser est un outil extr�mement utile qui nous permet d'ajouter de nouveaux
utilisateurs de mani�re tr�s simple. Il permet en une op�ration de g�rer
l'ensemble des actions n�cessaire � la cr�ation d'un nouveau compte. Une simple
commande effectue une configuration pas � pas du compte ceci incluant la
cr�ation des entr�es n�cessaires dans /etc/passwd et /etc/group, la cr�ation du
r�pertoire de l'utilisateur et la copie des fichiers requis par d�faut jusqu'�
une notification de bienvenue.
# adduser -s -config_create
# adduser -v
Use option ``-silent'' if you don't want to see all warnings and questions.
Check /etc/shells
Check /etc/master.passwd
Check /etc/group
Enter your default shell: csh date no sh tcsh zsh [sh]: sh
Your default shell is: sh -> /usr/local/bin/sh
Enter your default HOME partition: [/home]:
Copy dotfiles from: /usr/share/skel no [/usr/share/skel]:
Send message from file: /etc/adduser.message no
[/etc/adduser.message]: no
Do not send message
Use passwords (y/n) [y]: y
Name: eberkut
Password: ********
Fullname: eberkut
Uid: 1000
Gid: 1000
Class: root
Groups: wheel
HOME: /home/eberkut
Shell: /usr/local/bin/zsh
OK? (y/n) [y]: y
Added user ``eberkut''
Copy files from /usr/share/skel to /home/eberkut
Add another user? (y/n) [y]: n
Goodbye!
Notez que vous pouvez facilement remarquer que nous utilisons ici adduser pour
la premi�re fois puisqu'il nous a fallu cr�er le fichier de configuration puis
adduser nous a demande ses valeurs par d�faut. De plus pour plus de simplicit�
nous �tions en mode verbose (-v). A l'avenir vous n'aurez que les informations
de l'utilisateur � entrer et vous pourrez effectuer cette op�ration en mode
silent (-s).
# rmuser eberkut
Matching password entry:
eberkut:*:1000:1000::0:0:eberkut:/home/eberkut:/usr/local/bin/zsh
Is this the entry you wish to remove? y
Remove user's home directory (/home/eberkut)? y
Updating password file, updating databases, done.
Updating group file: trusted done.
Removing user's incoming mail file /var/mail/jru: done.
Removing files belonging to eberkut from /tmp: done.
Removing files belonging to eberkut from /var/tmp: done.
Removing files belonging to eberkut from /var/tmp/vi.recover: done.
# chpass eberkut
#Changing user database information for eberkut.
Login: eberkut
Password: ********
Uid [#]: 1000
Gid [# or name]: 1000
Change [month day year]:
Expire [month day year]:
Class:
Home directory: /home/eberkut
Shell: /usr/local/bin/zsh
Full Name: eberkut
Office Location:
Office Phone:
Home Phone:
Other information:
# cd /dev
# ./MAKEDEV snp0
# ./MAKEDEV snp1
# ./MAKEDEV snp2
# ./MAKEDEV snp3
Puis nous pouvons lancer watch. Avant cela nous v�rifions les utilisateurs
actifs sur le syst�me afin de sp�cifier le tty device � surveiller. Nous
pla�ons l'option t pour obtenir un timestamp au d�but de l'observation, n
pour emp�cher l'utilisateur de changer de tty attach� et l'option W pour
permettre d'�crire au sein du tty surveill�.
# who
# watch -tnW ttyp1
Les quotas sont une option de FreeBSD qui vous permettant de limiter la
quantit� d'espace disque ou encore le nombre de fichiers auxquels a le droit
un utilisateur ou tous les utilisateurs du m�me groupe, sur un syst�me de
fichiers donn�. Dans un syst�me multi-utilisateurs avec des acc�s distant,
cette m�thode �vite qu'un seul utilisateur ne consomme tout l'espace disque.
enable_quotas="YES"
Pour un contr�le accru, vous disposez �galement d'une seconde option mais qui
va lancer un programme - quotacheck - qui peut consid�rablement ralentir le
d�marrage de votre machine. Cependant la s�curit� primant, nous vous
recommandons d'�diter la ligne ci-dessous :
check_quotas="YES"
Vous devez enfin �diter le fichier /etc/fstab pour mettre en service les quotas
syst�me de fichiers par syst�me de fichiers. C'est l� que vous dites si vous
voulez des quotas d'utilisation des disques par utilisateur, par groupe ou les
deux, pour chaque syst�me de fichiers.
Pour mettre en service des quotas par utilisateur, ajoutez l'option userquota �
la zone d'options de l'entr�e de /etc/fstab pour le syst�me de fichiers sur
lequel vous voulez des quotas. Par exemple :
Pour des quotas par utilisateur on utilise userquota et pour des quotas par
groups, on utilisera groupquota. Pour appliquer des quotas � la fois �
l'utilisateur et � son groupe, on combinera les 2 commandes pr�c�dentes comme
nous l'avons fait pour notre fichier. Il ne vous reste plus qu'� red�marrer
afin d'activer la prise en compte de quota et la g�n�ration des fichiers
/etc/quota.user et /etc/quota/group.
Les quotas peuvent etre instaur�s sur un syst�me selon plusieurs crit�res. Tout
d'abord en plus de pouvoir appliquer des quotas par utilisateur et/ou par
groupes, vous avez la possibilit� d'appliquer ces limitations selon differents
formats soit en termes d'espace disque, les blocs, soit en terme de fichiers,
les inodes. Par ailleurs, il faut ajouter des degr�s dans les limitations :
strictes ou souples. Les premi�res suivent les r�gles de quotas � la lettre,
mais lorsqu'un utilisateur atteint son quota, il ne peut plus rien ajouter. Le
second degr� de limitation offre � l'utilisateur un d�lai - valable durant une
semaine par d�faut - lui permettant de ne pas �tre subitement limit�
dans son travail par un quota trop strict et d'ajouter ou (surtout) retirer des
fichiers pendant ce d�lai. Cependant s�il n'est pas revenu � un niveau normal
une fois le d�lai �coul�, la limitation devient stricte et il ne peut plus rien
ajouter jusqu'� ce qu'il redescende en dessous de sa limitation.
Pour �diter nos quotas, nous utiliserons la commande edquota qui va ouvrir un
�diteur (vi par d�faut) :
# edquota
Quotas for user eberkut:
/usr/home/eberkut: blocks in use: 0, limits (soft = 80, hard = 100)
inodes in use: 0, limits (soft = 40, hard = 60)
/usr/var: blocks in use: 0, limits (soft = 80, hard = 90)
inodes in use: 0, limits (soft = 60, hard = 80)
# quota -u eberkut
Les diff�rents attributs sont group�s par classes. Celles-ci repr�sentent donc
une politique coh�rente � appliquer � un utilisateur ou un groupe, comme d�j�
sugg�r�. Mais ces diff�rentes classes ont la particularit� de pouvoir �tre
h�rit�es. Ainsi, les valeurs sp�cifi�es dans une classe donn�es peuvent �tre
reprises dans une autre classe gr�ce � l'attribut 'tc'. Il existe ainsi une
classe 'default' qui contient une configuration basique dont tous les
utilisateurs pourront h�riter (et dont ils h�ritent effectivement si aucune
politique sp�cifique n'est indiqu�e). Il peut �tre alors int�ressant d'y
ajouter une classe 'root' qui augmentera la rigueur de l'authentification et
limitera au plus juste les ressources allou�es. La classe 'daemon' quant � elle
s'applique � tous les services lanc�s par /etc/rc au d�marrage. De plus, nous
pouvons m�me remplacer certains attributs, ou en ajouter de nouveaux, en les
�crivant dans la nouvelle classe, apr�s avoir sp�cifi� un h�ritage (toujours
avec 'tc').
Le format suivi dans login.conf est celui de termcap(5), avec ses bien-connues
colonnes s�par�es par des : ou ses valeurs s�par�es par des virgules. Un aper�u
en est donn� dans la manpage getcap(3) :
Comme vous le voyez, l'attribution se fait un peu de la m�me mani�re que pour
/etc/sysctl.conf, c'est-�-dire 'nom=valeur'. En plus de pouvoir �tre modifi�s
dans login.conf entre deux classes parentes, les utilisateurs peuvent changer
certains attributs en pla�ant un fichier .login_conf dans leur home directory
avec, pour seule classe, 'me'. Les variables que l'utilisateur peut lui-m�me
sp�cifier ne sont pas nombreuses, puisque authentification, limitation des
ressources et comptabilit� en sont soustrait. Cela permet tout de m�me de
sp�cifier dans un fichier unique lu par login(1) des variables d'environnement,
par exemple. Cette fonctionnalit� est sp�cifique � FreeBSD.
Chacun des attributs est valable pour tous processus lanc�s par un utilisateur
concern� par la classe d�finissant les premiers. Notez que pour des d�finitions
pr�cises de chacun d'entre eux, il faudra vous r�f�rer aux manpages de
{set,get}rlimit(2) qui sont les fonctions contr�lant ces limites. D'autre part,
chacun d'entre eux peut �tre pr�cis� comme une limite soft ou hard en ajoutant
respectivement le suffixe -cur et -max. Sans suffixe, la valeur de l'attribut
vaut pour les deux types de limites. Enfin, ces attributs d�crivent rapidement
toute l'API *rlimit, ce qui explique en partie le temps pass� dessus. Nous
t�cherons d'�tre plus succints par la suite.
o comptabilit�
- accounted est un attribut bool�en activant les options de comptabilit� pour
cette classe, avec le m�me effet que accton(8).
- passwordtime permet de d�finir la dur�e de validit� des mots de passe
- warnpassword indiquera alors quand il sera n�cessaire d'avertir
l'utilisateur avant d'atteindre passwordtime.
- expireperiod indique la dur�e au bout de laquelle un compte li� � une
classe expire.
- avec warnexpire, vous pouvez d�cider combien de temps avec l'expiration de
son compte un utilisateur sera pr�venu.
- avec graceexpire vous indiquez pendant combien de temps un utilisateur peut
encore se connecter avant l'expiration d�finitive.
- autodelete permet de d�finir la dur�e apr�s expiration au bout de laquelle
un compte expir� est effectivement supprim�. L'expiration du compte
n'implique en effet aucunement sa suppression automatique.
- daytime, weektime et monthtime permettent quant � eux de sp�cifier la dur�e
maximale de connexion d'un membre d'une classe, � l'�chelle du jour, de la
semaine et du moins respectivement.
- warntime d�finit le moment auquel il un utilisateur est averti, avant que
le temps de session n'ait expir�. Lorsque cette limite est atteinte,
'gracetime' permet de laisser un sursis � ce m�me utilisateur avant de
couper la connexion. Ces valeurs sont exprim�es en temps avant que la
limite ne soit atteinte.
- sessiontime sp�cifie la dur�e maximale que peut atteindre une session.
- sessionlimit sp�cifie le nombre maximal de sessions concurrentes, en
limitant le nombre de tty simultan�ment ouverts possible.
- ttys.accounted, ttys.exempt, host.accounted, host.exempt ont les m�mes sens
et syntaxes que les variables d'authentification ttys.* et host.*, mais
pour la comptabilit� bien s�r.
# vi /etc/login.conf
root:\
:tc=default:
:priority=5:\
users:\
:tc=default:
:cputime=2h:\
:filesize=100m:\
:coredumpsize=1m:\
:memoryuse-cur=5m:\
:memoryuse-max=15m:\
:vmemoryuse-cur=5m:\
:vmemoryuse-max=15m:\
:maxproc=32:\
:openfiles=128:\
:priority=20:\
:passwordtime=90d:\
:warnpasswordtime=7d:\
:sessionlimit=3:\
:times.allow=MoTuWeThFr0080-0020:\
:requirehome:\
wheel:\
:tc=users
:requirehome:\
:sessionlimit=unlimited:\
:times.allow=unlimited:\
# de m�me, ici nous donnons pour exemple des utilisations m�moire �lev�es,
# dans l'hypoth�se de serveurs charg�s
daemon:\
:tc=default:
:memoryuse-cur=20m:\
:memoryuse-max=60m:\
:vmemoryuse-cur=20m:\
:vmemoryuse-max=60m:\
:filesize=500m:\
:coredumpsize=5m:\
:openfiles=512:\
:maxproc-cur=128:\
:maxproc-max=512:\
:sbsize-cur=4k:\
:sbsize-max=16k:\
:priority=10:\
------------------------------------ SNiP -------------------------------------
# cap_mkdb /etc/login.conf
2.2.3. jail
Jail est un m�canisme tr�s puissant qui, comme son nom l'indique, offre la
la possibilit� d'affiner les privil�ges et la gestion des utilisateurs selon
un principe, similaire � chroot, d'emprisonnement des processus. Jail va
cependant beaucoup plus loin puisqu'il propose la reproduction d'un
environnement complet � l'int�rieur d'un environnement parent. La fonction
jail() se base sur une version renforc�e de chroot().
Construire une jail peut s'av�rer tr�s utile pour confiner un utilisateur ou
service auquel on ne fait aucune confiance ou bien qui risque de menacer
l'int�grit� et la stabilit� du syst�me. Pour cela jail offre un environnement
FreeBSD virtuel totalement op�rationnel avec ses propres fichiers de
configuration ou gestion des utilisateurs, le tout rattach� � un alias IP. De
plus, un processus une fois dans la jail est comme derri�re une glace sans
teint, il �volue librement mais ne peut pas voir au-del� de son environnement
tandis que l'h�te de la jail peut tout observer et surveiller. Ainsi, un
processus dans la jail ne peut pas en sortir, et vous pouvez d�l�guer des
comptes root au sein de chaque jail. Dans l'hypoth�se d'une attaque, l'intrus
obtiendrai par exemple d'abord un acc�s local par un exploit distant, puis un
acc�s root par un exploit local mais se verrait confiner � sa jail
(th�oriquement, jail �tant bas� sur chroot(), rien n'est s�r).
Jail se pose ici en pr�curseur du concept plus r�cent de honeypot, et peut tr�s
bien �tre utilis� comme tel pour inciter et surveiller des intrusions avec un
risque limit� de compromission totale de la machine, tout en conservant logs et
informations � l'abri. Pour conserver son int�grit�, une jail restreint les
actions possibles par rapport � un environnement complet. Il est ainsi interdit
de modifier le kernel (qui reste unique pour l'ensemble du syst�me) et charger
des modules kernel, modifier la configuration r�seau, monter des syst�mes de
fichiers, cr�er des devices, utiliser des raw sockets, modifier la MIB sysctl
ou les les securelevels. Tout ce qui n'est pas directement li� au
fonctionnement de la jail est interdit. Nous pouvons cependant utiliser comme
d'habitude des ports privil�gi�s, modifiers les permissions des fichiers et
utilisateurs � l'int�rieur de la jail, etc. afin de r�ellement cloner un
environnement classique.
Nous attribuons une adresse alias IP � notre jail puis nous cr�ons le
r�pertoire /jail/jailone dans lequel sera confiner notre environnement virtuel.
La commande make permet alors de construire un syst�me complet avec pour
destination la jailone, incluant binaires, fichiers de configuration et
arborescence des devices. Notez � la fin le lien symbolique vers le kernel,
ainsi que la cr�ation d'une fstab vide pour s'assurer du bon fonctionnement de
certains programmes.
Les jails ne sont pas encore persistantes, il est donc n�cessaire de configurer
votre rc.conf principal pour conserver la configuration ifconfig � chaque
reboot :
Puis il faudra copier la ligne suivante au sein de rc.local pour rendre la jail
persistante entre deux red�marrages :
En utilisant adduser et chpass comme vue pr�c�demment, nous n'avons plus qu'�
changer le password du root de la jail, puis � cr�er un utilisateur par service
que nous souhaitons confiner. Nous prendrons comme exemple named et httpd. Si
vous d�sirez autoriser l'acc�s � votre jail � des utilisateurs pr�existants,
il va vous falloir copier spwd.db. Pour cela nous n'allons recopier que les
informations qui nous int�ressent :
# sysctl -w jail.set_hostname_allowed=0
# sysctl -w jail.socket_unixiproute_only=1
# sysctl -w jail.sysvipc_allowed=0
# truncate 1G jailfile
Puis, pour mounter ces fichiers comme des partitions sur lesquelles installer
vos jail, utilisez 'vnconfig' pour transformer le fichier pr�c�dent en un
device (ici vn0c). Si aucun fichier n'est sp�cifi�, vnconfig utilisera la swap
pour cr�er le device. Vous pourrez alors en sp�cifier la taille avec l'option
-S suivi de la taille (en ko, mo, go et to), et la remplir de z�ros avec -T,
supplantant ainsi l'utilisation de truncate :
# vnconfig -S 1g -T vn0c
Si vous fa�tes tourner plusieurs services dans vos jails, il peut arriver
qu'une faille de s�curit� soit d�couverte, n�cessitant le patching de ce
service. Gr�ce � la virtualisation de la jail, vous pourriez utiliser NFS entre
celle-ci et l'environnement h�te. Il existe cependant une solution plus simple
consistant � utiliser mount_null qui permet de dupliquer une partie d'un
syst�me de fichier afin qu'elle soit vue par un chemin diff�rent. Comme patcher
et recompiler n�cessite l'acc�s � /usr/src, vous pr�servez votre s�curit� en
montant ce chemin en read-only du point de vue de la jail.
A noter tout de m�me qu'il est recommand� d'utiliser l'utilisateur named depuis
lequel bind - qui se placera quelques instants avec les droits root pour
r�cup�rer les file descriptor avant de revenir � des privil�ges plus
raisonnables - sera utilis�. Avec BIND il est �galement fortement recommand�
d'utiliser une cl� d'authentification TSIG entre vos serveurs DNS, de limiter
les AXFR ou transferts de zone � des serveurs DNS secondaires s�rs ou encore de
modifier la r�ponse � la requ�te host -l chaos version.bind qui peut donner �
l'attaquant des informations sur la version de BIND et donc d'�ventuels remote
buffer overflow possibles.
Si vous utilisez Apache en tant que httpd, n'oubliez pas d'�diter httpd.conf
afin de sp�cifier comme owner l'utilisateur www afin de ne pas avoir recourt �
nobody qui plus il sera utilis�, plus il gagnera de drois. Veillez aussi � ne
pas surcharger le syst�me et, plus particuli�rement, � ne pas atteindre trop
facilemenent le nombre de processus maximal par utilisateur (dans un tel cas si
le trafic est l�gitime passez en root jail pour adapter le param�tre par
sysctl).
Les droits de chaque jail pourra �tre g�rer plus finement gr�ce � des entr�es
sysctl sp�cifique, de la forme jail.jail_name.entry_name, pour chacun d'entre
elles. Ces nouvelles entr�es sont les suivantes :
# sysctl jail.jail_name.set_hostname_permitted=0
# sysctl jail.jail_name.sysvipc_permitted=1
# sysctl jail.jail_name.socket_ipv4_permitted=1
# sysctl jail.jail_name.socket_unix_permitted=1
# sysctl jail.jail_name.socket_route_permitted=1
# sysctl jail.jail_name.socket_other_permitted=0
# sysctl jail.jail_name.ipv4addr=192.168.1.1
Les jails peuvent - ou non - ainsi modifier leur hostname, les processus en
leur sein peuvent utiliser les IPC SysV, les sockets INET, les sockets UNIX,
les sockets route, tout autre type de socket, et enfin vous pouvez param�trer
l'adresse IP de la jail.
Une petite remarque mais de poids apr�s cet encensement : le projet jailNG est
d�j� vieux et ne montre plus aucun signe d'activit� nulle part depuis
longtemps. Le code risque donc de causer de nombreux probl�mes, et les
nouvelles fonctionnalit�s tardent � venir, sans doute depuis que Robert Watson,
d�sormais membre de la core team, est � la t�te du massif projet TrustedBSD,
visant l'impl�mentation du standard POSIX.1e � partir de FreeBSD 5.x, et
l'un des instigateurs du projet CBOSS qui chapeaute plusieurs d�veloppements
open source dans le domaine de la s�curit�. FreeBSD 5.0 a tout de m�me quelques
maigres am�liorations comme la configuration de securelevel ind�pendant pour
chaque jail.
2.3. int�grit�
Un danger majeur de la s�curit� des fichiers est repr�sent� par le bits SUID.
Ce bit plac� sur un fichier permet de l'utiliser avec les m�mes droits que le
propri�taire du fichier ce qui peut se r�v�ler dangereux si le propri�taire est
le root. Mais tout d'abord, nous recherchons les fichiers marqu�s SUID et SGID
(similaire � SUID mais � l'�chelle d'un groupe) avec find
Nous obtenons une liste de tous les fichiers ou repertoires avec le bit SUID ou
SGID. Parmi tout cela, il y a des ex�cutables que nous ne voulons pas forc�ment
laisser � la port�e de n'importe qui ou bien que nous n'avons pas l'intention
d'utiliser. La s�lection � effectuer parmi les fichiers SUID est laiss�e �
votre discr�tion selon votre utilisation. Cependant, il est fortement
recommand� de ne pas laisser des proc�dures shell en SUID surtout appartenant
au root, ceci pouvant �ventuellement entra�ner l'ex�cution ill�gitime de
commandes.
Pour effectuer nos modifications, nous utilisons l'utilitaire chmod qui nous
permet de modifier les permissions allou�es � un fichier. Pour calculer les
modes que nous d�sirons appliquer � tel fichier, nous nous basons sur le sch�ma
de permissions suivant :
4000 bit SUID (SetUserID on execution) dont nous avons d�j� parl�
2000 bit SGID (Set-Group-ID-on-execution) que nous avons �galement abord�
1000 sticky bit, sous freebsd ceci ne fonctionne que sur les r�pertoires et
permet aux utilisateurs de supprimer ou renommer uniquement les fichiers
dont ils sont propri�taires
0400 permet la lecture par le propri�taire
0200 permet l'�criture par le propri�taire
0100 permet l'ex�cution d'un fichier par le propri�taire et la recherche au
sein d'un r�pertoire
0040 permet la lecture par les membres du group
0020 permet l'�criture par les membres du group
0010 permet l'ex�cution d'un fichier par les membres du group et la recherche
au sein d'un r�pertoire
0004 permet la lecture par tous les autres utilisateurs
0002 permet l'�criture par tous les autres utilisateurs
0001 permet l'ex�cution d'un fichier par tous les autres utilisateurs et la
recherche au sein d'un r�pertoire
Et vous pouvez en faire de m�me avec certains r�pertoires que vous ne souhaitez
absolument pas voir compromis. En l'occurrence nous n'autorisons la lecture,
�criture et ex�cution par le root et uniquement l'ex�cution pour tous les
autres. Ceci pourra entra�ner � l'avenir des probl�mes d'acc�s, dans ce cas
un rapide chmod 755 sur le fichier ou ex�cutable incrimin� r�soudra l'affaire.
Notez que nous pouvons combiner ces op�rations avec quelque chose de plus
drastique dans le cas o� nous disposerions d'un securelevel assez �lev�. Ainsi,
si vous recompilez ou mettez � jour rarement vous pouvez �galement appliquer la
commande chflags �tudi�e plus haut sur les r�pertoires et fichiers de votre
choix en prenant garde aux probl�mes ult�rieurs en cas de compilation ou de
configuration. Profitez �galement es messages d'erreurs de chmod pour v�rifier
vos bits SUID/SGID et le d�s�lectionner sur les binaires sensibles.
Puis pour comparer nos sp�cifications et communiquer les r�sultats au root avec
un minimum d'indentation, nous n'avons plus qu'� effectuer
Une bonne id�e est de lancer les premi�res commandes une fois apr�s chaque
recompilation du syst�me et la v�rification une fois par semaine ou bien d�s
que vous avez un doute sur l'int�grit� de votre syst�me. Tout cela bien s�r par
l'interm�diaire de cron.
Un dernier outil tr�s utile que nous allons utiliser pour nous assurer de
l'int�grit� de notre syst�me sera KSEC pour Kernel Security Checker. KSEC ne
fait pas partie de la distribution officielle FreeBSD et n'est pas non plus
dans les ports. KSEC est l'adaptation � FreeBSD de l'outil de s�curit� Linux
KSTAT (Kernel Security Therapy Anti Trolls) par s0ftpr0ject. Pour vous procurer
l'un ou l'autre, rendez vous � http://www.s0ftpj.org/en/site.html.
Ces outils fonctionnent selon une conception hautement parano�aque du syst�me
et d�cide donc de ne prendre leurs informations que du kernel en utilisant la
librairie KVM et en limitant les op�rations sur le syscall ioctl(). Il va donc
nous servir � d�tecter la pr�sence de backdoors dans le syst�me sous leur
forme la plus redoutable, les modules kernel. KSEC est si pouss� qu'il peut
nous servir de remplacement � ifconfig pour la lecture. En effet, en observant
directement les structures ifnet ou les files descriptor bpf, il peut d�tecter
si une interface se trouve ou pas en mode promiscuous r�v�lateur d'un sniffer
et m�me fournir des informations et statistiques sur le trafic ou l'�tat des
interfaces. Ces v�rifications peuvent �tre effectu�es � travers les op�rations
suivantes pour l'interface fxp0 -- pr�ciser 'all' pour toutes les interfaces
disponibles :
# ksec -i fxp0
Mais KSEC va �galement nous servir � d�tecter une alt�ration de notre int�grit�
syst�me en v�rifiant si les adresses indiqu�es dans notre syscall table sont
effectivement les m�mes qu'annonc�es par /dev/kmem. La modification de la
syscall table est une m�thode tr�s r�pandue dans la conception de backdoors LKM
mais qui devient un peu ancienne et peut se voir remplacer par des m�thodes
d'hijacking des syscalls ou des pointeurs vers la syscall table, ou encore d'un
patching de /dev/kmem pour �viter ce type de d�tection. C'est sur ce dernier
point que l'utilisation des securelevels, emp�chant toute modification de
/dev/kmem, est judicieuse. Il peut �galement effectuer diff�rentes op�rations
de v�rification d'int�grit� des protocoles ou d'int�grit� des fichiers link�s
entre eux. Il ne nous reste plus qu'� effectuer une compilation de ces options
afin d'obtenir un rapport complet d'int�grit� syst�me :
# ksec -i interface -b -k -p
SSH signifie Secure Shell. A l'origine SSH est un remplacement des Berkeley r*
commandes tels que rsh, rlogin ou rcp consid�r�es comme tr�s peu s�res. SSH
utilise pour s�curiser la transmission un tunnel crypt� entre les 2 machines.
SSH a rapidement d�pass� toutes les attentes et il est devenu un remplacement
int�ressant pour telnet ou ftp lorsqu'ils sont n�cessaires pour des utilisateurs
r�guliers poss�dant un compte sur la machine en leur offrant une m�thode d'acc�s
� distance hautement s�curis�e et tr�s bien support�e. En particulier OpenSSH
est une version libre et recod�e du protocole SSH et fournit un client et un
serveur pour des nombreuses plate-formes unix. C'est lui que nous allons
maintenant utiliser pour la configuration de SSH.
# ee /etc/ssh/sshd_config
Port 22
# �vitez SSHv1 soumis � plusieurs vuln�rabilit�s
Protocol 2,1
# lorsque vous copierez ce fichier pour votre jail user pensez � mettre ici
# l'alias de votre jail.
ListenAddress 127.0.0.1, public_IP, jail_IP
HostKey /etc/ssh/ssh_host_key
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
ServerKeyBits 768
LoginGraceTime 60
KeyRegenerationInterval 3600
RhostsAuthentication no
RSAAuthentication yes
PubkeyAuthentication yes
X11Forwarding no
X11DisplayOffset 10
PrintMotd yes
# Syslog
SyslogFacility AUTH
LogLevel DEBUG
PermitRootLogin no
CheckMail yes
UseLogin yes
Il ne nous reste plus maintenant qu'� �diter encore une fois le fichier
rc.conf afin de s'assurer que sshd se lancera bien au d�marrage. Nous
transformons donc la ligne sshd_enable="NO" en sshd_enable="YES" et nous lui
adjoinions �galement la ligne sshd_flags="-4" afin de limiter l'utilisation �
des connexions IPv4. Pour g�n�rer vos cl�s il vous suffira alors d'ex�cuter
ssh-keygen ; bien que celui-ci soit d'hors et d�j� utilis� par rc.network avec
sshd_enable.
2.5. logging
Nous allons maintenant nous pencher sur les facilites que nous offre FreeBSD
dans le logging des diverses activit�s syst�me et utilisateur. Nous allons plus
particuli�rement �tudier le system accounting, le system logging et l'analyse
de ces logs par des moyens automatis�s.
Sous FreeBSD, nous avons la possibilit� d'activer le system accounting qui nous
offre la possibilit� d'enregistrer et de r�capituler les commandes ex�cut�es et
nous permet de conserver des informations d�taill�es sur les ressources syst�me
utilis�es, leur r�partition entre les utilisateurs, et de surveiller le
syst�me. Pour ce faire, nous disposons de accton et de sa. Accton permet
d'activer ou de d�sactiver le system accounting comme dans l�exemple
ci-dessous :
# accton /var/account/acct
Nous sp�cifions ici un fichier vers lequel sera redirige les donnes de
l'accounting, pour d�sactiver il suffit d'ex�cuter la m�me commande sans le
fichier en argument. Pour consulter les donnes de l'accounting il suffit
d'ex�cuter sa avec un classement par utilisateur
# sa -u
syslogd_enable="YES"
syslogd_flags="-ss -m 0"
Nous avons de plus ajoute des flags faisant en sorte que le daemon syslog
fonctionne en secure mode sans possibilit� de log ou de transmission depuis
l'ext�rieur. Puis pour affiner l'enregistrement des messages, nous allons
editer /etc/syslog.conf. Syslog.conf poss�de toute une syntaxe particuli�re :
Nous pouvons �galement utiliser des op�rateurs de comparaison comme < (plus
petit que), = (�gal), et > (plus grand que) afin de pr�ciser plusieurs niveaux
de logging pour un m�me facility.
auth,authpriv.* /var/log/authlog
cron.info /var/log/cron
mail.info /var/log/maillog
kern.* /var/log/kernel
security.* /var/log/security
security.=<err /dev/console
!ppp
*.* /var/log/ppp.log
!ipfw
*.* /var/log/ipfw.log
!sudo
*.* /var/log/sudo.log
!racoon
*.* /var/log/racoon.log
!nessusd
*.* /var/log/nessus.log
!argus
*.* /var/log/argus.log
ccyymmddThhmmss
20010915 000000 ou bien,
le 15 septembre 2001 � minuit. Ce format pouvant �tre simplifier en retirant
les champs superflus.
Enfin vous avez la possibilit� de sp�cifier un chemin pour obtenir le PID d'un
daemon particulier ainsi que la possibilit� de lui envoyer un signal (HUP par
d�faut) permettant d'�viter les conflits autour du fichier de log.
Une astuce int�ressante � mettre en pratique mais peu utilis�e consiste en une
synchronisation NTP. NTP signifie Network Time Protocol et permet a une machine
cliente de synchroniser son horloge sur un serveur de strate N lui-m�me se
synchronisant sur un serveur de strate sup�rieure ou directement sur un serveur
de r�f�rence. Le client peut aussi bien d�cider de se synchroniser � un serveur
de r�f�rence directement. C'est cette architecture pyramidale qui caract�rise
NTP. Maintenant qu'est ce que peut bien venir faire NTP dans la configuration
du syst�me de logging ? Et bien dans un avenir tr�s proche la corr�lation de
log a la recherche d'attaques ou d'information sur des attaques detectees par
un autre moyen se fera de mani�re centralis�e et dans ce cadre, une corr�lation
efficace doit se baser sur un timestamp fiable et universel a une portion de
r�seau concern�. Par ailleurs les applications critiques comme les serveurs
DNS ou les serveurs de services SMTP/NNTP fournissant une r�f�rence temporelle
a un utilisateur se doivent d'�tre � l'heure. Pour configurer notre machine
cliente, la configuration est extr�mement simple sous FreeBSD. Il nous suffit
d'�diter rc.conf et d'y placer les 2 lignes suivantes :
ntpdate_enable="YES"
ntpdate_flags="ntp-sop.inria.fr"
Enfin, il y a un outil que ne fait pas partie du syst�me proprement dit mais qui
peut s'av�rer grandement utile dans la surveillance et l'audit du r�seau et du
trafic, il s'agit d'Argus, un Audit Record Generation and Utilization System.
Argus est un programme userland agissant d'une mani�re similaire � un sniffer
en capturant le trafic passant sur une interface r�seau et g�n�rant des
rapports d'audit. Pour la capture du trafic, Argus se base sur TCPdump et la
libpcap. Concernant cet outil, vous trouverez un howto int�ressant sur
http://minithins.net ou http://www.hsc.fr/ressources/breves/argus_fr.html.en.
2.6. cron
Cron est l'un des outils Unix les plus classiques et les plus utiles qui soient
puisqu'il va nous permettre de lancer une t�che pr�cise � une date pr�cise.
Cron est de plus lanc� d�s le d�marrage puis tourne automatiquement en mode
daemon et se r�veille toutes les minutes pour v�rifier s�il a une t�che �
effectuer dans la minute � venir et, en passant, note toute modification de la
crontab. La crontab repr�sente le fichier depuis lequel cron va chercher les
informations, les commandes qu'il doit ex�cuter. Cron cherchera cette crontab
dans /var/cron/tab puis /etc/crontab.
Nous �ditons tout d'abord rc.conf afin de nous assurer que cron se lance bien.
Nous v�rifions et si besoin est ajoutons la ligne suivante :
cron_enable="YES"
Cette syntaxe �tant accompagn�e de quelques options bien pratiques telles que
l'indefinition (*), les listes (1,2,3,4) ou encore la fr�quence soit au sein
d'un champ(0-23/2) soit de mani�re g�n�rale gr�ce aux options :
# ee /etc/crontab
# sysctl -w net.inet.ip.fw.dyn_ack_lifetime=300
# sysctl -w net.inet.ip.fw.dyn_syn_lifetime=20
# sysctl -w net.inet.ip.fw.dyn_fin_lifetime=10
# sysctl -w net.inet.ip.fw.dyn_rst_lifetime=5
# sysctl -w net.inet.ip.fw.dyn_udp_lifetime=15
# sysctl -w net.inet.ip.fw.dyn_short_lifetime=30
# sysctl -w net.inet.ip.fw.dyn_max=1000
# sysctl -w net.inet.ip.fw.verbose=2
Bien qu'elles ne soient pas abord�es ici m�me, sachez qu'IPF dispose d'entr�es
similaires une fois install�, sous net.inet.ipf.* .
# ipfw show
N'oubliez pas �galement d'editer rc.conf afin d'y ajouter les lignes concernant
le firewalling telles que firewall_enable="YES", firewall_quiet="YES",
firewall_logging="YES" et firewall_type="simple". Pour ins�rer des r�gles dans
le ruleset, vous pouvez soit �diter la section simple de /etc/rc.firewall, soit
utiliser la commande ipfw selon le sch�ma suivant
ipfw command <number> action <protocol> from <host> <port> to <host> <port>
<ifspec>
- Les commandes peuvent �tre 'add' pour ajouter une r�gle, 'delete' pour
supprimer une r�gle individuellement et 'flush' pour la totalit� des r�gles,
ainsi que 'show' ou 'list' pour avoir les r�gles actuelles.
Chaque r�gle doit avoir un num�ro unique pour �viter la confusion et les
r�gles sont class�es selon l'ordre du matching.
- Les actions peuvent �tre 'allow' pour laisser passer un paquet, deny pour le
refuser silencieusement et 'reject' pour envoyer un icmp host unreachable
(erreur sp�cifiable avec les actions 'unreach' et 'reset'), 'check-state'
afin de v�rifier une correspondance avec les r�gles dynamiques, ou encore
'fwd' suivi de l'IP et �ventuellement du port si vous poss�dez des IP
routables. Nous avons �galement la possibilit� de logger - comme action
unique ou suppl�mentaire aux pr�c�dentes - avec 'log' auquel vous pouvez
ajouter 'logamount' pour overwriter l'option IPFIREWALL_VERBOSE_LIMIT.
- Les protocoles peuvent �tre 'all' ou 'ip' pour faire correspondre tous les
protocoles, ou bien le nom ou num�ro du protocole d�sir� en accord avec
/etc/protocols.
- Nous pouvons ensuite pr�ciser la source apr�s le champ 'from', la destination
apr�s le champ 'to' ainsi que les ports juste apr�s l'adresse source ou de
destination. Notez �galement la pr�sence de 'me' permettant de r�cup�rer l'IP
de notre firewall depuis ifconfig ce qui s'av�re tr�s utile en cas de
configuration dynamique. Enfin, pour les ports ou les adresses, IPFW supporte
d�sormais les op�rateurs logiques.
- Les mots cl�s ifspec nous permettant de travailler sur les interfaces. Nous
pouvons par exemple sp�cifier le matching des paquets uniquement en ingress
avec 'in' et en egress avec 'out', ou les interfaces v�rifi�es avec 'via'
suivi de l'interface, recv pour ne v�rifier que l'interface de r�ception et
xmit pour ne v�rifier que l'interface d'envoi.
- Pour la stateful inspection, 'keep-state' annonce un suivi dynamique pour ce
filtre, 'setup' matche les paquets avec le flag SYN uniquement, 'etablished'
concerne les paquets avec les flags ACK ou RST. Mais vous pouvez �galement
pr�ciser des 'ipoptions' (lssr, ssrr, rr, ts) ou 'tcpoptions' (mss, window,
cc, sack, ts) ainsi que des 'tcpflags' (fin, syn, rst, psh, ack et urg) ou
des 'icmptypes' (0, 3, 4, 5, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18).
D'autre part, le mot cl� 'limit' a �t� introduit r�cemment (4.5-RELEASE) pour
permettre de limiter le nombre de connexions simultan�es par association pour
un filtre donn�, ceci en pr�cisant l'adresse et/ou le port source, l'adresse
et/ou le port de destination puis la limite de connexions. Sachez enfin que
vous pouvez au niveau du firewall lui-m�me filtrer les utilisateurs via les
options 'uid' et 'gid' suivis de leur valeur.
Enfin, face � la menace d'abus de trust relationship par les tunnels IPSEC
ESP, il est d�sormais possible, depuis FreeBSD 4.9, de filtrer les connexions
initi�es via de tels tunnels, ce gr�ce au mot-cl� 'ipsec'. Attention, cette
option n'est valable que si vous utilisez des tunnels gif pour monter votre
tunnel.
Notez pour en finir avec les commandes ipfw qu'il existe un int�ressant patch
depuis FreeBSD 4.3 dit lifetime qui permet d'imposer une timeout � une
transmission via une r�gle du firewall qui la bloquera une fois ce timeout
atteint. Ce patch n'�tant pas int�gr� au syst�me de base, nous ne nous
attarderons pas sur son utilisation. Vous pourrez trouver toutes les
informations n�cessaires � l'installation du patch et � l'utilisation du nouveau
keyword � http://www.aarongifford.com/computers/ipfwpatch.html.
Lorsque vous lancez votre machine avec les options activant le firewall pour la
premi�re fois, environ 200 r�gles basiques sont automatiquement
g�n�r�es. Nous commen�ons donc par purger nos r�gles :
# ipfw flush
Nous rejetons ensuite sur l'interface d'entr�e tous les paquets avec pour source
une adresse r�serv�e non routable ou bien l'adresse de notre r�seau interne, et
nous journalisons ces cas manifestes de spoofing. Ces adresses sont r�pertori�es
sur le site de l'IANA et dans la RFC 1918.
Puis nous faisons diverger le trafic pour passer par natd pour la translation
d'adresses et de ports vers nos adresses priv�es. Cette r�gle est suivie de la
v�rification de chaque paquet contre la state table pour savoir si
il appartient ou non � une connexion d�j� accept�e. Nous pouvons ensuite
rejeter tous les paquets en �tat TCP �tabli ou les fragments IP puisqu'ils
seront assur�s de ne pas faire partie d'une connexion en cours.
Puis nous autorisons certaines communications comme DNS dont nous aurons repris
les adresses dans /etc/revolv.conf, suivi de l'administration de la machine via
SSH, et enfin nous autorisons Racoon, Argus et Nessus � communiquer. Pour les
clients derri�re le firewall, nous autorisons aussi en sortie les connexions
ftp, smtp, ssh, http, pop3, ntp, imap ainsi que https, ircs, pop3s.
Viennent ensuite les restrictions ICMP utilis� aussi bien en scanning qu'en
DoS. Nous laissons passer depuis l'ext�rieur les les echo reply, destination
unreachable, time exceeded, parameter problem, et timestamp reply. Vers
l'ext�rieur, nous autorisons les echo request, time exceeded (fragment
reassembly) et les timestamp request. Avec ceci, nous avons le minimum pour
assurer le path discovery, la v�rification de connectivit� et la d�tection.
Pour appliquer maintenant un filtrage de paquets aux services fournit par une
jail, nous faisons comme si c'�tait un filtrage sur l'environnement h�te,
seulement nous y substituons l'alias priv�e de la jail que nous filtrons en
passant par l'interface de loopback lo0.
Lors de la cr�ation de vos r�gles, faites attention � l'ordre dans lequel vous
les placez dans votre ruleset, aux interfaces sur lesquelles il faut les
appliquer et � leur destination. Comme sp�cifi� par les implementations notes
de ipfw(8), le nombre de fois o� un paquet est inspect� varie : de une fois
pour les paquets ayant une extr�mit� en local et pour les paquets bridg�s, �
2 fois pour les paquets dont les 2 extr�mit�s sont locales ou pour les paquets
forward�s. La seule mani�re de changer ce comportement est � travers sysctl :
# sysctl -w net.inet.ip.fw.one_pass=1
Mais soyez extr�mement prudent dans ce cas lors de l'�criture de ces r�gles
pour ne pas laisser entrer n'importe quel paquet construit sp�cialement apr�s
analyse des r�gles. Prendre en compte toutes ces informations, c'est v�rifier
qu'un paquet sera bien inspect� et au bon endroit.
Pour finir, nous refusons tout autre trafic que celui express�ment autoriser et
pour plus de s�ret�. Voir ci-dessous le fichier /etc/rc.firewall final.
${fwcmd} -f flush
# adresses r�serv�es
${fwcmd} add 201 deny log all from ${forbidden},${net}:${mask} to any in via \
${extif}
Pour que ces r�gles soient appliqu�es, vous devez soit redemarrer, soit
relancer init qui initialisera ces r�gles.
Le NAT pour Network Translation Adress est un m�canisme � l'origine cr�� pour
palier � la p�nurie d'adresses IP disponibles. Il permet d'utiliser une gateway
qui pour chaque communication va rediriger les transmissions entre adresses
externes routables et adresses internes non routables en r��crivant les ent�tes
correspondantes et en stockant les informations de correspondances dans une
hash table. Ainsi nous n'utilisons qu'une seule IP routable qui est celle de la
gateway NAT. Le NAT est un m�canisme de partage de connexion int�ressant mais
il ne fera pas l'affaire en cas de load balancing puisque sa m�thode de
queueing est bas� sur un Weighted Round Robin qui sert � tour de r�le chaque
queue en attente, or le NAT par WRR traite la priorit� selon l'impl�mentation
DiffServ Assured Forwarding rejetant ainsi les paquets basse priorit� sous
fortes contraintes. De plus le d�bit de congestion du NAT est assez bas, encore
plus si vous utilisez natd qui est userland entra�nant une copie depuis le
kernel vers le userland. Pr�f�rez ipnat/ipf en module kernel pour de meilleures
performances.
L'autre couple �tant ipfw/natd, nous allons maintenant voir une configuration
minimale de natd afin de relayer les requ�tes de notre h�te vers notre jail ou
toute autre machine se trouvant derri�re notre FreeBSD.
Pour commencer, nous �ditons le fichier rc.conf pour y ajouter les lignes
suivantes
gateway_enable="YES"
natd_enable="YES"
natd_interface="fxp0"
natd_flags="-f /etc/natd.rules"
Ainsi natd sera lanc� � chaque d�marrage avec comme fichier de configuration
natd.rules, que nous allons maintenant �diter. Pour plus d'informations sur les
r�gles utilis�es, reportez vous � la man page. Nous ne faisons qu'une rapide
introduction en rapport avec notre configuration s�curis�e. Cependant, notez
que la redirection via natd peut se faire � partir de l'adresse avec
redirect_adress, par port avec redirect_port et par protocoles avec
redirect_proto. Une derni�re r�gle peut s'av�rer tr�s utile pour les
utilisateurs d'IRC et FTP : la r�gle punch_fw suivi de basenumber:count
respectivement le num�ro de la r�gle de d�part suivi du nombre de r�gles
dynamiques pouvant �tre cr��es.
# DNS
redirect_port udp jail_IP_alias:53 public_IP_adress:53
# HTTP et HTTPS
# LSNAT > RFC 2391
redirect_port tcp jail_IP_alias:80,443 80,443
redirect_adress tcp www1_IP:80, www2_IP:80 jail_IP_adress:80
3. Outils
Nous allons nous pencher sur certains outils plus ou moins en rapport direct
avec le syst�me mais qui ne sont pas forc�ment disponible par d�faut ou alors
par les ports mais pas � jour, ou encore qui sont une caract�ristique du
syst�me bien sp�cifique. Ainsi nous allons ici d�couvrir quelques outils
permettant de renforcer notre s�curit� aussi bien de mani�re proactive que
r�active.
3.1. TCPdump
TCPdump est l'outil ultime pour sniffer le trafic d'un r�seau afin d'effectuer
son debugging. Il nous permettra de capturer tout ou partie du trafic r�seau
local afin de nous permettre de l'analyser afin de v�rifier le bon
fonctionnement de nos configurations r�seau. Pour ce faire TCPdump se base sur
la couche syst�me BPF pour Berkeley Packet Filter afin d'intercepter les trames
Ethernet et les paquets IP transitant par la machine en mode promiscuous (mode
o� le Network Interface Card ou NIC peut voir l'ensemble du trafic r�seau)
selon des expressions bpf similaires aux concepts d'expressions r�guli�res.
Cette m�thode de capture par BPF est fournit par la librairie libpcap
facilitant �norm�ment le d�veloppement de sniffers �volu�s.
La sortie quant � elle se pr�sente - dans le cas d'un paquet TCP ici - sous la
forme d'un timestamp, puis l'Initial Sequence Number suivi du num�ro de
s�quence du paquet, la taille du paquet entre parenth�ses, les flags TCP, le
num�ro d'acknowledgment, la window size, le flag IP renseignant sur l'etat de
la fragmentation et enfin les options TCP. La sortie peut bien s�r varier si
on capture un paquet UDP ou ICMP (avec dans ce dernier cas le type ICMP). Avec
les options d�j� pr�sent�es, nous obtenons �galement dans le dump les headers
de la couche liaison, vous pouvez bien s�r supprimer cette option pour plus de
simplicit�.
Bien entendu, nous n'avons pas besoin de capturer la totalit� des paquets
lorsque nous ne recherchons qu'une transmission particuli�re afin d'effectuer
du debugging ou autre analyse. Pour cela nous avons la possibilit� d'utiliser
les expressions BPF introduites plus haut. Elles nous permettent de tester
un octet donn� d'un paquet IP ou m�me de sa partie TCP/UDP/ICMP. Il est
�galement possible, gr�ce � des expressions bool�ennes de tester un ou
plusieurs bits de chaque octet. Les expressions BPF se placent simplement � la
fin des options de la ligne de commande TCPdump. Les expressions BPF classiques
sont subdivis�es en 3 groupes qui peuvent �tre combin�s entre eux pour
effectuer n'importe quel (ou presque :) matching.
Le premier groupe est constitu� des 'types' qui peuvent �tre 'host' pour
recherche une adresse IP ou un domaine, 'net' pour une classe r�seau - ce champ
peut �tre affin� en pr�cisant un 'mask' � sa suite - et 'port' pour un port.
Ces types sont les op�rateurs de base de la capture.
Nous avons ensuite les 'dir' qui sp�cifie la direction � rechercher. Nous avons
ici � notre disposition les mots-cl�s 'src' pour l'origine et 'dst' pour la
destination.
Enfin, nous avons le group 'proto' qui permet de rechercher des paquets
correspondants. Nous y trouvons 'ether' ou 'fddi' pour les couches liaisons
ethernet et assimil�s, 'arp' et 'rarp' pour les protocoles du m�me nom, 'ip' et
ip6' pour les versions d'IP v4 et v6, 'icmp' et 'icmp6' de mani�re similaire et
enfin 'tcp' et 'udp'.
A ces 3 groupes, il nous faut ajouter plusieurs expressions suppl�mentaires
telles que 'gateway' qui permet de matcher un paquet dont l'adresse Ethernet
correspond � l'expression mais pas l'adresse IP source ni destination et donc
d'obtenir les paquets ayant traverser une passerelle donn�e. Nous avons �galement
less
et greater afin de capturer les paquets inf�rieurs ou sup�rieurs � une longueur
donn�e.
Enfin nous avons les classiques op�rateurs logiques or, and et not repr�sentant
l'inclusion, la concat�nation ou l'exclusion.
ping of death
# tcpdump -Xni fxp0 icmp greater 65535
4 = IP Version
5 = IP header length
003c = IP total length
0a66 = IP ID
4000 = IP fragmentation (flags puis offset multiple de 8)
40 = IP TTL
06 = IP Protocol
a320 = IP checksum
c0a8 0001 = IP source
c0a8 0002 = IP destination
04c5 = TCP source port
0016 = TCP destination port
801e 78e3 = TCP sequence number
a = TCP data offset
002 = TCP Control bits (flags, ici SYN)
3fc4 = TCP Window Size
fe70 = TCP Checksum
0000 = Urgent Pointer
0204 05cc = TCP Maximum Segment Size (only with SYN)
0402 = TCP SackOK Permitted (only with SYN)
080a 0014 7e59 0000 0000 = TCP Timestamp (champ reply � 0, puisque SYN)
0103 = Padding
0300 = TCP Window Scale (only with SYN)
Pour ne pas avoir � retenir ce lourd sch�ma (qui est juste celui d'un flux
classique), vous pouvez ex�cuter � la suite de votre commande tcpdump et apr�s
un pipe unix, tcpdumpx �crit par Wietse Venema qui commente pr�cis�ment les
donn�es dump�es. Vous pourrez trouver ce programme �
ftp://ftp.porcupine.org/pub/debugging/.
* paquets IP fragment�s
MF : ip[6] & 32 != 0
DF : ip[6] & 64 != 0
offset : ip[6:2] & 0x1fff != 0
3.2. Nessus
Login : eberkut
Authentication (pass/cert) [pass] : pass
Login password : foobar
User rules
----------
nessusd has a rules system which allows you to restrict the hosts
that astro has the right to test. For instance, you may want
him to be able to scan his own host only.
Please see the nessus-adduser(8) man page for the rules syntax
Enter the rules for this user, and hit ctrl-D once you are done :
(the user can have an empty rules set)
^D
Login : eberkut
Password : foobar
DN :
Rules :
Notez que la syntaxe des r�gles d'acc�s est plut�t simpliste puisqu�elle
compte comme r�gles deny pour emp�cher le scan, accept pour l'autoriser et
default pour d�finir la policy par defaut � deny ou accept. Pour chaque r�gle,
vous sp�cifiez une adresse IP �ventuellement suivie d'un netmask en notation
CIDR ou la variable client_ip d�signant automatiquement la machine source du
client. Vous pouvez de plus vous servir de nessusd.users pour d�finir des
r�gles par utilisateurs (authentifi�s par password ou cl�). Voir nessusd(8)
pour plus de d�tails.
# password
eberkut:foobar
# rules
accept client_ip
default deny
Ces r�gles ainsi que d'autres options sont encore configurables apr�s
nessus-adduser par l'interm�diaire de nessusd.conf que nous allons d�cider
de conserver dans /etc plut�t que dans le r�pertoire nessus.
# log file
logfile = syslog
# rules file
rules = /etc/nessus/nessusd.rules
# user database
users = /etc/nessus/nessusd.users
# CGI path
cgi_path = /cgi-bin
# optimize test
optimize_test = yes
# Crypto options
negot_timeout = 600
force_pubkey_auth = yes
# peks has been deprecated, and the author of this document does'nt have any
# box to install Nessus and update this part of the configuration file. Sorry
peks_username = nessusd
peks_keylen = 1024
peks_keyfile = /etc/nessus/nessusd.private-keys
peks_usrkeys = /etc/nessus/nessusd.user-keys
peks_pwdfail = 3
cookie_logpipe = /etc/nessus/nessusd.logpipe
cookie_logpipe_suptmo = 2
# optimization
# read timeout for the test sockets
checks_read_timeout = 15
# espace entre 2 tests contre le m�me port en secondes
delay_between_tests = 5
------------------------------------ SNiP -------------------------------------
Pour la totalit� des tests impliquant l'utilisation de SSL ainsi que si vous
avez d�cid� d'utiliser l'authentification client/serveur par certificats, vous
allez devoir g�n�rer une certificat. Nessus dispose pour ce faire d'un script
nessus-mkcert (et nessus-mkcert-client pour g�n�rer une paire certificat/cl�
pour votre client).
/usr/local/etc/nessus/nessusd.conf updated
. Certification authority :
Certificate = /usr/local/com/nessus/CA/cacert.pem
Private key = /usr/local/var/nessus/CA/cakey.pem
. Nessus Server :
Certificate = /usr/local/com/nessus/CA/servercert.pem
Private key = /usr/local/var/nessus/CA/serverkey.pem
Pour lancer le daemon nessus maintenant configur�, il ne vous reste plus qu'�
ex�cuter
# nessusd -c /etc/nessus/nessusd.conf -D
Nous ajouterons enfin une petite parenth�se sur quelques fonctionnalit�s pour
le moment experimentales mais qui seront officiellement mises en place lors de
la release 1.1.0. La premi�re est la sauvegarde de Knowledge Base. En effet,
les informations receuillies et partag�es � travers la KB sont lib�r�es de la
m�moire apr�s chaque scan n�cessitant de refaire tout le processus
d'information gathering � chaque fois. Si vous d�sirez scanner r�guli�rement
votre r�seau, vous pourez pr�f�rer utiliser l'option du panel KB de l'interface
permettant d'activer la sauvegarde de la KB. Avant la version 1.1.0, cette
option n'existe que si vous avez compil� Nessus-core avec
# ./configure --enable-save-kb
Dans ce m�me panel KB, vous pouvez ensuite sp�cifier si il est n�cessaire de
scanner la totalit� des h�tes, uniquement ceux d�j� scann�s pr�c�demment ou
bien uniquement les h�tes nouveaux jamais scann�s. Par ailleurs vous pouvez
sp�cifier la r�utilisation de l'ancienne KB qui sera alors recharg�e en m�moire
et avec elle pr�ciser quels plugins vous ne voulez pas voir r�ex�cut�s : ne pas
refaire les scans, ne pas refaire les �tapes d'information gathering, ne pas
refaire les attaques ou bien ne pas refaire les DoS. Enfin, vous avez la
possibilit� de d�finir une limite de temps pendant laquelle l'ancienne KB est
valable en secondes.
Une autre fonctionnalit� exp�rimentale all�chante est la possibilit�
d'effectuer des scans d�tach�s, sans intervention du client. Apr�s l'activation
de la sauvegarde de KB, nous disposons dans le panel Scan options de nouvelles
entr�es : detached scan signifiant que le client n'obtiendra pas les donn�es en
temps r�el, continuous scan fait recommencer nessusd apr�s chaque fin de tests,
send results to this email adress permet de sp�cifier une adresse � laquelle
envoyer les r�sultats et enfin delay between two scans d�fini le temps en
secondes entre 2 scans de l'option continuous scan.
En combinant ces 2 fonctionnalit�s et en pla�ant une update des plugins dans la
crontab, nous avons la capacit� d�sormais d'effectuer un scan de mise � jour
r�gulier sans plus nous soucier de Nessus. Pour ce faire, nous devons activer
les options Enable KB saving, Only test hosts that have never been tested in
the past, Reuse the knowledge bases about the hosts for the test et les 4
options Do not execute dans le panel KB ; et enfin nous d�cidons que la KB sera
valable pour une semaine soit 604800 secondes. Puis, dans le panel Scan
options, nous cochons les options detached scan et continuous scan et pla�ons
le delai entre 2 scans � une heure, soit 3600 secondes. Vous pouvez sp�cifier
l'adresse root tout simplement comme destination des rapports. Ainsi, Nessus ne
scannera que les h�tes qui n'ont pas d�j� �t� scann� depuis les 7 derniers
jours, attendra une heure et recommencera qui plus est avec des plugins � jour
gr�ce � l'entr�e d'update dans la crontab.
Si vous avez quelques talents en programmation et en s�curit� et/ou que
vous souhaitez contribuer � Nessus, vous pouvez apprendre � cr�er des
plugins, qui font toute la valeur et la puissance de Nessus, � l'adresse
http://www.nessus.org/doc/nasl.html.
3.3. lsof
Par exemple nous pouvons lister uniquement les fichiers sockets Internet avec
l'option -i, l'option -n permettant de ne pas r�soudre les adresses.
# lsof -ni
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
portmap 156 daemon 3u IPv4 0xc3dabf00 0t0 UDP *:sunrpc (LISTEN)
ssh 259 root 16u IPv4 0xc3ddcd80 0t0 TCP *:ssh (LISTEN)
sendmail 287 daemon 4u IPv4 0xc3dddb60 0t0 TCP *:smtp (LISTEN)
Vous voyez que la pr�sentation du listing permet de voir les types de sockets,
TCP ou UDP, dans la colonne NODE puis l'adresse et le port d'�coute dans la
colonne NAME. Les lignes correspondant � des connexions en cours sont affich�es
avec une fl�che "->" s�parant les adresses et ports sources et destinations.
Les ports en �coute n'ont pas de fl�che et ne comportent qu'une adresse et un
port. Dans ce dernier cas, l'adresse peut �tre une �toile si le processus
�coute sur toutes les adresses simultan�ment.
Il est possible de demander � lsof de n'afficher qu'un port et/ou une adresse
IP donn�e. Notez que lsof supporte aussi bien les adresses IPv4 que v6, il
suffit d'adopter la notation correcte (loopback = 127.0.0.1 et ::1)
Mais lsof offre de nombreuses autres possibilit�s. Nous pouvons par exemple
lister l'ensemble des sockets quel que soit leur domaine (UNIX ou Internet)
# lsof -U -n -i
Ou bien lister des fichiers ouverts selon leur propri�taire par l'option -u ou
leur PID par l'option -p ainsi que par l'options -g pour filtrer � partir du
groupe. Nous pouvons sp�cifier plusieurs PID, GID et user en pla�ant des
virgules
Lsof poss�de enfin quelques fonctions bien pratiques. Tout d'abord � l'aide de
l'option -a, nous pouvons filtrer selon plusieurs arguments similaires. Ce qui
sur des sockets de domaine Internet, peut nous permettre de rechercher
plusieurs services ou adresses bien sp�cifiques.
Il faut aussi savoir que lsof peut s'effectuer en repeat mode afin d'obtenir
une surveillance constante ou r�guli�re. Ceci s'effectue � l'aide de l'option
+|-r temps o� temps d�signe le temps entre chaque r�p�tition en secondes.
L'option param�tr�e avec + au lieu de - permet d'arr�ter lsof lorsqu'il ne
liste plus rien en plus de l'arr�ter par un SIGINT.
Nous allons ici aborder 2 outils extr�mement pratiques pour FreeBSD permettant
d'emp�cher les attaques de type buffer overflow consistant � d�passer une
m�moire tampon statique pour �crire un code original ex�cut� avec les droits
du programme dont d�pend ce buffer. Nous disposons de libparanoia et du gcc
protector patch.
libparanoia est une librairie qui intercepte les appels � des fonctions
pr�sum�es sensibles et les remplace par des fonctions similaires en tous
points et fonctionnalit�s, � la seule diff�rence que ces fonctions sont
modifi�es pour emp�cher toutes tentatives de corruption de la pile m�moire
ce qui permet de nous pr�venir des failles de type stack overflow ou return-
into-libc tr�s document�es et largement r�pandues ces derni�res ann�es.
Les fonctions ANSI C pr�sum�es sensibles sont strcpy, strcat, gets, sprintf et
scanf qui sont connues pour �tre souvent exploit�es � des fins ill�gitimes. Le
probl�me essentiel vient du fait que le langage C n'inclut aucunes techniques
natives de v�rification lorsque nous manipulons des variables dans une m�moire
tampon. Ce comportement permet, � l'occasion, d'�crire dans cette m�moire afin
d'y faire ex�cuter diverses commandes - pouvant entra�ner jusqu'� la
compromission compl�te du syst�me si ledit programme est ex�cut� avec les
droits root. L'id�e de base de libparanoia est de ne jamais ex�cuter de
nouvelles instructions suite � ces fonctions si la stack a �t� modifi�. On
pr�f�rera alors tuer le processus ou appeler une fonction d'exit. La m�thode
peut para�tre brutale mais ceci suppose une corruption de la m�moire tampon
de ce programme et, dans ce contexte, entraver un instant le bon d�roulement
d'un programme ou d'un unique processus para�t bien moins grave que de risquer
la compromission compl�te du syst�me.
Nous installons libparanoia par son port dans /usr/ports/security/libparanoia.
Nous vous recommandons ensuite d'ex�cuter le script copy-to-libc qui permet de
patcher directement la libc FreeBSD quelque en soit la version.
# ./copy-to-libc
|------------------------|
| arguments |
|------------------------|
| return adress |
|------------------------|
| previous frame pointer |
|------------------------|
| guard |
|------------------------|
| arrays |
|------------------------|
| local variables |
|------------------------|
Toutes ces protections se heurtent bien s�r aux limitations du langage C, par
exemple on ne peut prot�ger un pointeur faisant partie d'une structure contenant
�galement un tableau puisque le r�agencement est interdit. Ou encore,
l'utilisation des options d'optimisation de GCC peut entra�ner la non
utilisation des protections du patch. Cependant, le GCC Protector Patch reste
une option int�ressante dans la lutte contre les attaques par stack overflow.
Pour l'installer et construire FreeBSD avec cette protection, nous devons
d'abord patcher GCC puis le construire ind�pendamment du syst�me.
# cd /usr
# patch -p1 < protector.patch
# cd /usr/src/gnu/lib/libgcc
# make depend && make all install clean
# cd /usr/src/gnu/usr.bin/cc
# make depend && make all install clean
# cd /usr/src/lib/libc
# make depend && make all install clean
Et nous n'avons plus qu'� recompiler le monde ! Ce patch est valable depuis
FreeBSD 4.3 et fonctionne avec les versions de GCC 2.95.2, 2.95.3 et 3.0.
Cependant, des probl�mes peuvent appara�tre � la compilation d'un programme ne
faisant pas appel � la variable d'environnement CFLAGS comme XFree. Plus
d'informations � http://www.trl.ibm.com/projects/security/ssp/.
3.5. tunneling
Depuis la configuration de sshd plus haut, vous devez avoir OpenSSH d'or et
deja install�. Nous allons donc nous contenter ici de d�velopper ses options de
tunneling. Nous ex�cutons la commande suivante
L'option -N nous met en tunnel only, l'option -f permet de faire tourner ssh en
T�che de fond et -L permet de pr�ciser les donn�es du tunnel qui sont le port
local puis le port distant entre lesquels s'effectuera le tunnel. Il ne reste
alors plus qu'� rentrer l'h�te distant comme d'habitude. Une fois le tunnel
�tabli, toute connexion avec comme source le port local indiqu� dans le tunnel
et comme destination le port distant indiqu� dans le tunnel, transitera au sein
du tunnel SSH mis en place.
La seconde solution consiste � cr�er et utiliser des tunnels SSL avec Stunnel,
c'est notamment la solution appliqu�e dans le cadre d'IRCS, le r�seau IRC
securis�. Pour ce faire, nous avons besoin d'OpenSSL qui est install� dans le
catalogue cvsup src-all et de Stunnel que nous trouverons dans
/usr/ports/security.
Puis pour lancer une connexion distante en mode client, nous ex�cutons la
commande suivante
Nous devons tout d'abord configurer une interface gif pour le tunneling IPv6/4
over IPv6/4 afin de cr�er le tunnel IPSec. Pour ne pas avoir � le retaper au
d�marrage, ajoutez une entr�e ifconfig_gif0 � votre rc.conf.
Nous utilisons l'interface gif pour qu'elle g�re le tunnel entre IP publique et
nous permette donc d'utiliser nos IP priv�es pour la configuration des r�gles
de chiffrement. De cette mani�re, les paquets seront bien rout�s au niveau de
la routing table du kernel, et non pas via la SPD, suivant un forwarding path
classique et les connexions apparaissent dans netstat. Avec gif, il est
possible de filtrer et sniffer au niveau de l'interface gif. Sans gif
(c'est-�-dire en utilisant les adresses publiques des passerelles IPSec), il
reste possible de filtrer sur les interfaces priv�es et �ventuellement sniffer
via des r�gles tee.
# setkey -FP
# setkey -F
# sysctl -w net.inet.ipsec.esp_trans_deflev=1
# sysctl -w net.inet.ipsec.esp_net_deflev=1
# sysctl -w net.inet.ipsec.ah_trans_deflev=1
# sysctl -w net.inet.ipsec.ah_net_deflev=1
# sysctl -w net.inet.ipsec.def_policy=0
# sysctl -w net.key.prefered_oldsa=0
# sysctl -w net.inet.ipsec.ecn=1
Maintenant que notre tunnel IPSec est pr�t � servir, il nous reste � configurer
Racoon afin d'assurer l'�change des cl�s sym�triques et SAs. Pour obtenir notre
configuration IPSec, nous modifions rc.conf pour ex�cuter setkey au d�marrage
avec le fichier ipsec.conf en argument.
...
ipsec_enable="YES"
ipsec_file="/etc/ipsec.conf"
...
# SAD entry
# SA AH avec cle 160 bits
add localhost_public_IP remote_public_IP ah 1500 -A hmac-sha1 123ABC456EFG789HIJ10
add remote_public_IP localhost_public_IP ah 1600 -A hmac-sha1 123ABC456EFG789HIJ10
# SA ESP avec cle 128 bits
add localhost_public_IP remote_public_IP esp 1500 -E blowfish-cbc 123ABC456EFG789H
add remote_public_IP localhost_public_IP esp 1600 -E blowfish-cbc 123ABC456EFG789H
# SPD entry
spdadd internal_net/24 remote_internal_net/24 any -P out ipsec \
esp/tunnel/localhost_public_IP-remote_public_IP/default;
spdadd remote_internal_range/24 internal_range/24 any -P in ipsec \
esp/tunnel/remote_public_IP-localhost_public_IP/default;
------------------------------------ SNiP -------------------------------------
# cat /etc/racoon/psk.txt
remote_public_IP shared_key
Puis nous nous occupons de racoon.conf lui-m�me que nous �ditons � partir du
fichier de configuration par d�faut.
# cp /usr/local/etc/racoon/racoon.conf.dist /etc/racoon.conf
# ee racoon.conf
# Padding options
padding
{
maximum_length 20;
randomize off;
strict_check on;
exclusive_tail off;
}
# Phase 1. anonymous signifie que cette phase est appliqu�e � tous les h�tes.
# Vous pouvez configurer des phases 1 et 2 pour des h�tes particuliers.
remote anonymous
{
exchange_mode main,aggressive ;
# mode de negociation, aggressive est plus rapide, mais main offre
# un m�canisme de cookie, la prot�ction d'identit� et la fixation du
# Diffie-Hellman group id
doi ipsec_doi;
situation identity_only;
nonce_size 16;
lifetime time 1 min; # sec,min,hour
lifetime byte 2 MB; # B,KB,GB
initial_contact on;
proposal_check obey; # obey, strict ou claim
#support_mip6 on; # support de Mobile IPv6 (cf. snapshots KAME)
proposal
{
encryption_algorithm blowfish;
hash_algorithm sha1;
authentication_method pre_shared_key ;
# groupe Diffie-Hellman
dh_group 2 ;
}
}
# Phase 2.
sainfo anonymous
{
pfs_group 2;
lifetime time 2 hour ;
lifetime byte 100 MB ;
encryption_algorithm 3des, blowfish, rijndael, twofish ;
authentication_algorithm hmac_sha1, hmac_md5 ;
# compression IPCOMP
compression_algorithm deflate ;
}
------------------------------------ SNiP -------------------------------------
Vous pouvez aussi utiliser pour plus de s�curit� des certificats au format PEM
en lieu et place des psk toujours sujettes au brute force. L'utilisation des
certificats de type X.509v3 support�s par racoon nous permet de rester
parfaitement interop�rable en conformit� avec le standard PKIX. Nous allons
avoir besoin d'openssl qui se trouve dans la base FreeBSD pour g�n�rer une
paire de cl�s priv�/publique puis un certificat � signer.
Commen�ons par g�n�rer notre paire de cl�s RSA � 1024 bits et stock�es au
format PEM (Privacy Enhanced Mail).
Une fois cette (longue) op�ration termin�e, la commande suivante nous permet
d'effectuer une requ�te PKCS#10 de certification d'une cl� publique et d'un
distinguished name voire d'une certains nombres d'attributs (voir RFC 2986).
# openssl req -new -nodes -newkey rsa:1024 -sha1 -keyform PEM -keyout \
privkey.pem -outform PEM -out request.pem
Maintenant pour utiliser les certificats en lieu et place des psk, nous allons
devoir proc�der � quelques modifications de racoon.conf. Tout d'abord dans la
section remote, nous devons placer
...
certificate_type x509 "certificat" "cle_privee";
my_identifier user_fqdn "cns@minithins.net";
...
...
authentication_method rsasig;
...
Nous ajoutons finalement une entr�e dans la crontab pour que racoon se lance �
chaque reboot ou bien nous pouvons placer un script lan�ant racoon dans
/usr/local/etc/rc.d/.
4. Conclusion
-------------------------------------------------------------------------------
* every reader or user of this document acknowledges that he his aware that
no guarantee is given regarding its contents, on any account, and
specifically concerning veracity, accuracy and fitness for any purpose;
* no modification is made other than cosmetic, change of representation
format, translation, correction of obvious syntactic errors, or as
permitted by the clauses below;
* comments and other additions may be inserted, provided they clearly
appear as such; translations or fragments must clearly refer to an
original complete version, preferably one that is easily accessed
whenever possible;
* translations, comments and other additions must be dated and their
author(s) must be identifiable (possibly via an alias);
* this licence is preserved and applies to the whole document with
modifications and additions (except for brief quotes), independently of
the representation format;
* whatever the mode of storage, reproduction or dissemination, anyone able
to access a digitized version of this document must be able to make a
digitized copy in a format directly usable, and if possible editable,
according to accepted, and publicly documented, public standards;
* redistributing this document to a third party requires simultaneous
redistribution of this licence, without modification, and in particular
without any further condition or restriction, expressed or implied,
related or not to this redistribution. In particular, in case of
inclusion in a database or collection, the owner or the manager of the
database or the collection renounces any right related to this inclusion
and concerning the possible uses of the document after extraction from
the database or the collection, whether alone or in relation with other
documents.