.----------------------------------------------------------------/ /--. | Armoring Slackware / / | | a k a / / 05 | | Roger Cadorette, consultant en sécuritée / / | '------------------------------------------------------------/ /------' '--' Votre premier réflexe en lisant ce titre, sera surement "RIPPEUR, y'a déjà un article paru sur le nom de armoring linux (red hat)," he, oui, je sais, je l'ai lu moi aussi "heye, il avoue sont crime". Je vous l'accorde, beaucoup de sujet traités ici sont aussi approchés dans le text armoring linux original. Mais il existe une différence majeur entre le texte qui suit et son homonyme, alors, que armoring linux se contente de vous dire quoi faire, moi je vous dis en plus comment faire, p-e que Lance Spitzner a manquer de papier virtuel et a voulu raccourcir sa création ( un peu comme dans la nouvelle au prix du papyrus de Isaac Asimov ou Moise raccourcie les 15 milliards d'années de la genese a 7 jour par manque de papier et de volonté d'écrire). Enfin, je suis mauvais joueur moi aussi, car si je voulais discuter de sécurité sur tout ses angles j'aurais un bon bouquin a écrire, je vais me contenter d'une vingtaine de K durant lequel j 'approfondirai 6 grands points de la sécurité sur une workstation linux. je me limiterai aux workstations pour la bonne raison que je cherche pas a vous donnez une formation d'admin réseau, mais simplement quelques trucs pratiques pour vous protégez. Évidemment, il existe (d'apres la légende) des hackers que rien n'arrête, mais les règles suivantes devrais suffire a tenir en respect une grande majorité des dit hackers. Comme les choses évoluent et que mes connaissances augmentes avec le temps, je publierai p-e d'autres articles sur le sujet dans les prochains. Mindkind, mais ne tenez pas cette promesse pour acquise, je le ferais que si j'ai envie de le faire, autrement dit, ce que je fais, je le fais parce que ca me fais plaisir de le faire. bon, j'ai fini de vous écoeurez avec mes explications, passons donc au salon (la théorie). Step 1, Shutdown useless deamons C'est un principe connu, le nombre de possibilités de hacking est proportionnelle au nombre de service qui est offert au public. Évidemment il serait dur de se passer de ftp et de telnet, mais si vous n'offrez aucun service a une communauté quelconque d'usagers, aussi bien ne pas démarrer ceux si, au pire des cas, si jamais vous en avez besoin par la suite, leur re-activation se fera en 1 tour de rein :]. En root taper pico /etc/inetd.conf (si vous avez pas pico, allez installer le package de pine sur linuxmafia.org, pico stun must :]) a pi prennez donc l'editeur qui vous plait, j'en ai rien a cirrer. Commenter (#) les lignes suivantes si ce n'est pas dejas fait, sauf évidemment si vous avez besoin du service (un * indique les lignes qui sont generalement pas # par default): # shell stream tcp nowait root /usr/sbin/tcpd in.rshd -L * # login stream tcp nowait root /usr/sbin/tcpd in.rlogind * # exec stream tcp nowait root /usr/sbin/tcpd in.rexecd # talk dgram udp wait root /usr/sbin/tcpd in.talkd # ntalk dgram udp wait root /usr/sbin/tcpd in.talkd * # klogin stream tcp nowait root /usr/sbin/tcpd rlogind -k # eklogin stream tcp nowait root /usr/sbin/tcpd rlogind -k -x # kshell stream tcp nowait root /usr/sbin/tcpd rshd -k # krbupdate stream tcp nowait root /usr/sbin/tcpd registerd # kpasswd stream tcp nowait root /usr/sbin/tcpd kpasswdd # pop2 stream tcp nowait root /usr/sbin/tcpd in.pop2d # pop3 stream tcp nowait root /usr/sbin/tcpd gnu-pop3d * # pop3 stream tcp nowait root /usr/sbin/tcpd ipop3d # imap2 stream tcp nowait root /usr/sbin/tcpd imapd * # tftp dgram udp wait nobody /usr/sbin/tcpd in.tftpd # bootps dgram udp wait root /usr/sbin/in.bootpd in.bootpd # finger stream tcp nowait nobody /usr/sbin/tcpd in.fingerd -u * # systat stream tcp nowait nobody /usr/sbin/tcpd /bin/ps -auwwx # netstat stream tcp nowait root /usr/sbin/tcpd /bin/netstat -a # netbios-ssn stream tcp nowait root /usr/sbin/smbd smbd # netbios-ns dgram udp wait root /usr/sbin/nmbd nmbd # rstatd/1-3 dgram rpc/udp wait root /usr/sbin/tcpd rpc.rstatd # rusersd/2-3 dgram rpc/udp wait root /usr/sbin/tcpd rpc.rusersd # walld/1 dgram rpc/udp wait root /usr/sbin/tcpd rpc.rwalld Ensuite nous allons changer telnet pour telnetsnoop. Nous pourrons par la suite, spyer les faits et geste de tout ceux qui se connecterons a notre box. # telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd * telnet stream tcp nowait root /usr/sbin/tcpd in.telnetsnoopd (notez qu'une connection telnetsnoop bouffe plus de ram qu'une connection telnet normal, donc si vous etes avare de votre precieuse ram, oublier cette derniere option.) sauvegarder et quitter, Step 2, ttysnooping la premiere etape est de savoir qui est connecté, vous pouvez obtenir cette information grâce a la commande finger ou who. personnellement je préfère finger qui donne plus d'information (genre l'ip source), mais tout ce que nous avons besoin de savoir pour ttysnoop c le tty utilisé par notre "ami" connecté. et: root@rewter:/home/wyzeman# finger Login Name Tty Idle Login Time Office Office Phone Mindkind tty3 14:38 Jan 15 14:17 root tty1 3 Jan 16 00:55 root tty2 13:21 Jan 15 13:00 wyzeman ttyp0 Jan 16 12:54 (192.168.1.2) root@rewter:/home/wyzeman# who root tty1 Jan 16 00:55 root tty2 Jan 15 13:00 Mindkind tty3 Jan 15 14:17 wyzeman ttyp0 Jan 16 12:54 avantage de who, ca prend moins de place :] par exemple si je voulais surveiller le malveillant wyzeman qui c'est logger, je n'aurais qua tapez de facon décontracté la commande suivante: root@rewter:~# ttysnoop ttyp0 Connected to ttyp0 snoop server... Ctrl+'\' (ASCII 28) to suspend, Ctrl+'-' (ASCII 31) to terminate. Snoop password: /*password root*/ Verified OK... Snoop started. wyzeman@rewter:~$ tout ce que vous taperez dans se tty, sera vu par wyzeman, donc si vous ne voulez pas vous faire remarquer faite gaffe a votre clavier (apres tout s'pas le temps de faire su et de marquer votre password au mauvais moment au mauvais endroit:]) si vous voulez discuter avec votre visiteur, je vous conseil d'ouvrir un éditeur de texte (genre pico), pour éviter les trop nombreux : wyzeman@rewter:~$ salut bash: salut: command not found wyzeman@rewter:~$ si vous voyez ce que je veux dire. Step 3 tcp-wraping le tcp wrapping se fait avec l'aide de 2 fichiers, soit, hosts.deny et hosts.allow c'est avec ces fichiers que l'on va indiquer avec qui on est prêt a négocier. L'école de pensée la plus fréquente veut que l'on renie tout le monde dans le fichier hosts.deny et qu'on indique qui qu'on accepte dans le fichier hosts.allows. alors commençons par le commencement et disons adieu a tout le monde. su pico /etc/hosts.deny ne reste plus qu'a ajouter la lignée suivante dans le fichier ALL:ALL sauvegarder et quitez A maintenant éditons le fichier hosts.allow ALL:LOCAL # pour accepter toute les connections de localhost (vous meme) ALL:192.168.1.1/255.255.255.0 # pour accepter toute les connections d'un réseau local (notez que si # vous etes en masquerading derriere un serveur, c'est plutot useless. # Ca revient a dire, tout le monde peu passer ( puisque l'ip source # se modifie pour l'ip de votre routeur avant d'arriver a vous. in.telnetd,in.ftpd:ALL # accept les connection telnet et ftp venant de partout in.telnetd, in.ftpd:192.168.1.1/255.255.255.0 # pour les connection telnet et ftp venant de votre reseau local vous avez saisi le principe ? la premiere partie indique le service (all pour tout les services) et la 2e parti les ip acceptés (192.168.1.1/255.255.255.0 represente tout le submask que 192.168.1.x) c'est tres pratique lorsque l'on connaît d'avance les ips qui auront a traiter avec notre ordinateur. Pour plus de sécurité si vous possédez plusieurs ordis sur le meme réseau et que vous voulez vous connecter de votre ecole par exemple , bien n'autoriser l'access a votre telnet que d'une 3e machine sur votre réseau (autrement dit, vous vous connectez sur votre rooteur, de votre rooteur a votre tiers ordi, et de celui ci a votre ordi. Comme ca, personne ne pourra utilisé votre rooteur pour atteindre directement votre ordi. in.telnetd: 192.168.1.3 (note: si vous utilisez telnetsnoop au lieu de telnet, remplacez in.telnetd par in.telnetsnoopd . si vous n'etes pas sur des noms de deamons a utiliser referez vous au fichier /etd/inetd.conf) Step 4 ipchains vous savez ce qui est kewl avec ipchains, c'est que vu de loin ca l'air terriblement compliqué, alors que c'est simple comme bonjour, alors en mettant un peu d'efforts on peu rire de ceux qui save pas comment ça marche. Peu importe ce que vous diras man ipchains ou ipchains -h vous avez en gros 4 commande a retenir : ipchains -A pour creer une regle ipchains -D pour effacer une regle ipchains -L pour faire la list de vos regle ipchains -F pour flusher tout vos regles (quand -d ne suffit plus :]) démontrons dès maintenant l'utilité de ipchains -l root@rewter:~# ipchains -L Chain input (policy ACCEPT): target prot opt source destination ports DENY icmp ------ anywhere anywhere any -> any ACCEPT udp ------ anywhere anywhere 27927 -> any ACCEPT udp ------ anywhere anywhere 29727 -> any ACCEPT udp ------ anywhere anywhere domain -> any ACCEPT udp ------ anywhere anywhere 4000 -> any DENY udp ------ anywhere anywhere 1:1024 -> any DENY udp ------ anywhere anywhere 2000:35535 -> any ACCEPT tcp ------ anywhere anywhere ftp -> any ACCEPT tcp ------ anywhere anywhere telnet -> any ACCEPT tcp ------ anywhere anywhere www -> any ACCEPT tcp ------ anywhere anywhere auth -> any ACCEPT tcp ------ anywhere anywhere 1024:5000 -> any ACCEPT tcp ------ anywhere anywhere 6660:6667 -> any DENY tcp ------ anywhere anywhere 2:1023 -> any DENY tcp ------ anywhere anywhere 10001:35535 -> any Chain forward (policy DENY): target prot opt source destination ports MASQ all ------ anywhere anywhere n/a Chain output (policy ACCEPT): il existe 3 lois chaine principales pour ipchains: input, forward, output input = ce qui rentre forward = ce que vous faites passer output = ce qui sort si vous voulez faire du masquerading caster tout de suite cette rulez: ipchains -A forward -j MASQ ce qui veut dire, ipchains creer une loi (A) dans la chaine forward qui va faire du masquerading (-j MASQ). Bon ben maintenant que nous sommes rendu des gros ingenieur reseau full hot on va diriger le trafic :] ipchains -A input -p icmp -j DENY ipchains -A input --sport 27927 -p udp -j ACCEPT ipchains -A input --sport 29727 -p udp -j ACCEPT ipchains -A input --sport 53 -p udp -j ACCEPT ipchains -A input --sport 4000 -p udp -j ACCEPT ipchains -A input --sport 1:1024 -p udp -j DENY ipchains -A input --sport 2000:35535 -p udp -j DENY ipchains -A input --sport 21 -p tcp -j ACCEPT ipchains -A input --sport 23 -p tcp -j ACCEPT ipchains -A input --sport 80 -p tcp -j ACCEPT ipchains -A input --sport 113 -p tcp -j ACCEPT ipchains -A input --sport 1024:5000 -p tcp -j ACCEPT ipchains -A input --sport 6660:6667 -p tcp -j ACCEPT ipchains -A input --sport 2:1023 -p tcp -j DENY ipchains -A input --sport 5001:35535 -p tcp -j DENY ce sont les lois qui ont créé ce que vous a démontré plus haut la commande ipchains -L. Décortiquons on peu ce qu'elles veulent dire: ipchains -A input -p icmp -j DENY ipchains crée une loi(-A) pour ce qui rentre (input( qui refusera (-j deny) le protocole icmp (-p icmp) comme aucun port ou ip n'est spécifié ipchains prend par défaut tout (tout les ip et tout le port ne laisse pas entrer le icmp). ipchains -A input --sport 27927 -p udp -j ACCEPT ipchains -A input --sport 29727 -p udp -j ACCEPT on voit ici que j'aime jouer a quake2, ipchains laisse passer tout ce qui est du protocol udp sur les port 27927 et 29727. contrairement a tcp-wrap on doit indiquer ce qu'on laisse passer avant ce qu'on ne veut pas laisser passer (donc par la suite on voit que je ferme tout les port udp, mais en réalité, tout ceux que j'ai dit de laisser passer avant demeureront ouvert. c'est vrai aussi pour l'inverse, si je fermerais les port au début, j'aurais beau faire 400 loi pour les ouvrir après, ils resteraient fermés. Vous pouvez aussi décider d'être plus sélectif sur vos loi en indiquant un ip, ou un range de ip particulier. ca sert généralement a donner des privilèges supérieurs a certain usager de votre réseau. ou a en rendre la progression un peu plus compliquer a l'intérieur de votre réseau. On peut décider a quel ip la loi va s'appliquer avec la commande suivante. ipchains -A input --source 192.168.1.1/192.168.1.10 23 -p tcp -j DENY cette règle bloquera toute les tentatives de connexions a votre serveur, a partir des poste de travaille 192.168.1.1 a 192.168.1.10 seul les postes de travaille avec un ip plus haut que 192.168.1.10 pourraient alors se connecter au telnet. Step 5 Show me the log petit truc avant de terminer afin de pouvoir toujours garder un oeil sur les connexion qui se font sur votre pc et/ou votre serveur. en root taper : tail -f /var/log/messages vous aurez ainsi un beau display des connexions qui se feront sur votre ordi. Si vous voulez être uber elite, vous pouvez inclure la commande suivante dans votre fichier /etc/inittab qui permettra d'effectuer le meme effet au démarrage de votre machine (usefull dans le cas d'un serveur) 1:2345:respawn:/usr/bin/tail -f /var/log/messages (1 représente le tty voulu (vous pouvez changer pour celui que vous voulez (tty = l'écran de sorti (genre alt-f1 alt-f2 etc.)))) Step 6 ftp, la porte d'entrée principale la plus par des distributions linux, vienne avec un gros défaut, un ftpd aux allures de passoire. il existe 2 trucs simples pour sécuriser votre ftpd, 1 limiter sont accès au user qui en on vraiment besoin, et 2 en mettre un moins standard afin d'éviter de tomber dans les mains de quelqu'un qui vous scannerait par hazard a la recherche un ftpd comme le votre, oserais-je dire wu-ftpd 2.6.0 ? La première étape, étant de limiter le nombre de user ayant accès a votre ftp, et de limiter l'importance de ceux ci,(c'est a dire qu'on a pas besoin d'être root pour transférer des fichiers, donc on peu empêcher le root de se connecter par ftp (ici on voit en grosse l'etre lumineuse (BRUTE FORCING). dirigeons nous donc dans notre fichier /etc/ftpuser . NOTER que ce fichier sert a déterminer les users qui N'ONT PAS DROIT d'accès au ftp, et non le contraire comme sont nom pourrais induire en erreur. Voici ce que contient mon fichier /etc/ftpuser : # # ftpusers This file describes the names of the users that may # _*NOT*_ log into the system via the FTP server. # This usually includes "root", "uucp", "news" and the # like, because those users have too much power to be # allowed to do "just" FTP... # # Version: @(#)/etc/ftpusers 2.00 04/30/93 # # Author: Fred N. van Kempen, si vous avez ca, c'est signe que j'explique pas trop mal :] sinon, allez lire la doc en anglais sur le site :] maintenant si vous êtes satisfait du produit installons le de façon plus permanente. Éditez votre fichier /etc/inittab et ajouter a la fin ce qui suit. # ncftpd nc:2345:respawn:/usr/local/etc/ncftpd/ncftpd -q /usr/local/etc/ncftpd/general.cf /usr/local/etc/ncftpd/domain.cf # end of /etc/inittab Au prochain démarrage, ncftpd se lancera tout seul. maintenant voyons comment ajouter des nouveau user, dans fait appelle a la commande linux adduser. ceci se fera facilement avec laide de la commande de ncftpd ncftpd_passwd mais au paravent vous devez éditer, dans domaine.cf quel liste de user/pass vous voulez utiliser, /etc/passwd est la par défaut, vous pouvez le gardez et rajouter /usr/local/etc/ncftpd/passwd.db . Vous pouvez aussi ne garder que la liste de user que vous crerez vous meme pour votre ftp et flusher /etc/passwd, il sagit d'un choix personnelle, évidemment flusher la reference a /etc/passwd est plus secure, mais si vous avez faite votre job dans /etc/ftpusers la garder vous éviteras de refaire un travaille déjà faite. vous pourrez donc ajouter des usagers ensuite grâce a la commande suivante: bash-2.04# ./ncftpd_passwd -f passwd.db -c -a "wyzeman:billybob:1010:110:moimeme:/home/ftp/wyzeman:/bin/bash" et modifier les mots de passe de la facon suivante :] New password for wyzeman: Verify password for wyzeman: Password changed for user wyzeman. bash-2.04# vous voici donc avec un ftp sécuritaire, vous voici prêt a allez écoeurer le monde sans vous faire toaster (sauf si vous tomber sur quelqu'un qui en sait plus que la plus par des prétendants hackers :], jespere pouvoir vous revenir dans le #2 avec quelques trucs supplémentaires. d'ici la, enjoy the ride and dont play with match Wyzeman