Affichage des résultats 1 à 10 sur 13

Discussion: Sécuriser un serveur asterisk - recapitulatif

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Senior
    Date d'inscription
    septembre 2010
    Localisation
    Where the sun shines
    Messages
    1 418
    Downloads
    0
    Uploads
    0

    Sécuriser un serveur asterisk - recapitulatif

    bonjour

    j'aimerais reprendre dans ce post l'ensemble des éléments nécessaires à bien sécuriser son asterisk. Il y a sur le forum plein d'infos là-dessus, mais je vise à faire quelque chose de complet, sous forme de pointeurs vers d'autres articles quand c'est possible - c'est trop de temps de faire un article détaillé, mais vous saurez ou regarder.
    Il convient de connaitre un peu linux pour le comprendre, et à défaut, google est votre ami.
    L'idée est de mettre à jour ce message au fil du temps. N'hésitez pas à suggèrer d'autres points
    Cdlt
    J.

    1/ la réalité du danger
    Chaque IP est scannée par des robots entre 10 et 20 fois par jour, pour trouver un serveur voip. Un des packages les plus utilisés est sipvicious, mais il y en a d'autres. Une fois que le robot a trouvé un serveur qui réponde, il passe en mode bruteforce pour trouver un username, puis un password. Au mieux, il ne trouver rien, et pendant plusieurs jours votre bande passante est saturée, dégradant la qualité du service, au pire, il trouve un user/pass, je ne vous décris pas la suite...
    Les attaques peuvent aussi venir de clients utilisant normalement le service, et recherchant des appels gratuits, des employés, etc...

    2/ En premier
    Mettez votre asterisk derrière un firewall, et n'ouvrez pas le port 5060 - c'est le plus sur. Vous n'avez pas besoin d'ouvrir le 5060 si vous vous enregistrez / connectez à un fournisseur de VOIP. Votre serveur va lancer les paquets qui ouvriront le firewall. Les seuls éléments nécéssaires alors sont: régler correctement (quand c'est possible) la durée de vie de l'ouverture du port UDP - généralement, 30s ou 60s. Pour maintenir le port ouvert, utilisez l'option qualify=yes et descendez qualifyfreq à une valeur inférieure à celle de fermeture auto du port

    3/ En premier (c'est aussi important que le 2....)
    lisez, et comprenez le fichier: README-SERIOUSLY.bestpractices.txt - il est sous la racine des sources, à défaut: http://bit.ly/NFnvga
    en particulier, le "Proper Device Naming", "Secure Passwords".

    4/ Sécurisez les autres applis (ssh, pas de telnet, http), en appliquant les best practices pour chaque appli, et en les tenant à jour

    5/ Dans tous les cas, et surtout si votre asterisk est accessible depuis l'extérieur
    Mettre en place des règles IPTABLES sérieuses. Pour cela, cet article du forum est pas mal: http://www.asterisk-france.org/conte...quer-les-scans
    mais j'adore celui là: https://blog.ls20.com/securing-your-...with-iptables/

    les points intéressants dans ce message sont le filtrage par useragent, le filtrage des dos.

    Idéalement, le mieux si vous avez des postes nomades, est de passer par un vpn:
    http://www.asterisk-france.org/conte...n-de-vpn-pptpd

    6/ Si vous avez bien implémenté les règles iptables, presqu'aucun scanner ne viendra troubler votre tranquillité. Cependant, de temps en temps, l'un deux arrivera à passer => installez fail2ban:
    http://www.asterisk-france.org/conte...-avec-fail2ban

    pour ssh et asterisk

    7/ Bien sur, évitez les mots de passe trop faciles; freepbx vous propose un module de détection des mots de passe faibles, utilisez le.

    8/ faites un petit script shell qui compte le nombre de minutes sur votre asterisk, par heure (par exemple) et qui vous notifie par email au delà d'une certaine limite. vous pourrez toujours arreter les frais en cas de soucis, plutôt que de s'en appercevoir après plusieurs jours

    9/ Allowguest=no, alwaysreject=yes
    allowguest autorise un client sans user ni mot de passe à passer des appels => TRES DANGEREUX
    alwaysreject permet de renvoyer la meme erreur, que ce soit le username ou le password qui soit incorrect. cela complique les attaques bruteforce

    10/ Positionner le contexte par défaut
    dans la section general de sip, rajouter une ligne
    context=contexctquinexistepas
    de façon à positionner le contexte par défaut pour les appels entrants à un contexte inexistant. les contextes corrects seront spécifiés au niveau de chaque trunk/peer

    11/ Inclusions de contextes
    Bien vérifier les inclusions de contextes, de manière à ne pas donner des droits excessifs à des postes qui n'en ont pas l'usage

    12/ un article qui résume tout ca:
    http://www.star2billing.com/securing-asterisk/

    13/ On peut aussi bloquer les IP par origine géographique
    http://www.asterisk-france.org/threa...P-des-scanners

    Voila... ca ne vous garantira jamais à 100%, mais ne pas appliquer ces conseils vous garanti à 100% d'être pirtaté !!!
    Dernière modification par jean ; 05/01/2016 à 15h38.

  2. #2
    Membre Association
    Date d'inscription
    août 2010
    Localisation
    région parisienne
    Messages
    386
    Downloads
    0
    Uploads
    0
    salut,

    Merci pour ce post qui devrait servir a beaucoup
    C'est marrant, je suis en train de faire un 'memoire' pour ma VAE et je parle dedans de sécurisation asterisk,
    Grosso modo, je parle des mêmes choses que toi.

    je rajouterai dans ton guide :

    -attention au context par défaut et aux inclusions de contexte

  3. #3
    Membre Senior
    Date d'inscription
    janvier 2011
    Localisation
    Villejuif 94
    Messages
    337
    Downloads
    0
    Uploads
    0

    autoriser ou pas les appels anonymes

    Bonjour,

    J'autorise pour ma part les appels entrants SIP non authentifiés. Je restreins la portée à ma sda dans le context sip-default. je rejette le reste en logeant ce qui ressemble à des tentatives d'injection.
    extrait extensions.ael

    context sip-default {
    _33123456XXX => jump ${EXTEN:7:4}@default;
    _0123456XXX => jump ${EXTEN:7:4}@default
    _6XXX => jump ${EXTEN:7:4}@default
    s => {
    if(${REGEX("&,/|@" ${EXTEN})}) {
    Log(WARNING, invalid extension ${EXTEN} from ${CHANNEL(peerip)});
    Playback(invalid,noanswer);
    Wait(.5);
    Congestion();
    }
    Set(TIMEOUT(absolute)=15);
    Answer();
    Wait(2);
    Playback(ss-noservice);
    Playtones(congestion);
    Congestion(5);
    }
    }

  4. #4
    Membre Senior
    Date d'inscription
    septembre 2010
    Localisation
    Where the sun shines
    Messages
    1 418
    Downloads
    0
    Uploads
    0
    Citation Envoyé par olppp Voir le message
    Bonjour,

    J'autorise pour ma part les appels entrants SIP non authentifiés. Je restreins la portée à ma sda dans le context sip-default. je rejette le reste en logeant ce qui ressemble à des tentatives d'injection.
    extrait extensions.ael
    }
    cela reste un cas d'usage très particulier ! je note en tous cas l'usage du langage ael... c'est l'avenir

  5. #5
    Membre Senior
    Date d'inscription
    octobre 2014
    Messages
    124
    Downloads
    0
    Uploads
    0
    Bonjour,

    Merci pour le recueil d'info !

    Je voudrais approfondir sur le point suivant :

    8/ faites un petit script shell qui compte le nombre de minutes sur votre asterisk, par heure (par exemple) et qui vous notifie par email au delà d'une certaine limite. vous pourrez toujours arreter les frais en cas de soucis, plutôt que de s'en appercevoir après plusieurs jours
    Comment faire pour interroger asterisk sur le nombre d'heure ? Est-il possible de le faire par user/numéro ?

  6. #6
    Membre Senior
    Date d'inscription
    septembre 2010
    Localisation
    Where the sun shines
    Messages
    1 418
    Downloads
    0
    Uploads
    0
    en fait, cela dépend de l'implémentation - freepbx, asterisk pur, asterisk avec mysql....

    avec asterisk classique, qui genere tous les appels dans master.csv, un debut de prog en php donne le code plus bas - il suffit alors de filtrer par nom de trunk, accountcode, etc... et de faire les totaux et de les comparer avec ce qui tu estimes normal

    Code:
    <?Php
    
    $logfile="/var/log/asterisk/cdr-csv/Master.csv"
    
    $handle = fopen($logfile, "r");
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
       list($accountcode,$src, $dst, $dcontext, $clid, $channel, $dstchannel, $lastapp, $lastdata, $start, $answer, $end, $duration, $billsec, $disposition, $amaflags, $uniqueid, $userfield ) = $data;
       echo "\nAccountcode = " . $accountcode;
       echo "\nsrc = " . $src;
       echo "\ndst = " . $dst;
       echo "\ndcontext = " . $dcontext;
       echo "\nclid = " .$clid;
       echo "\nchannel = " . $channel;
       echo "\ndstchannel = " . $dstchannel;
       echo "\nlastapp = " .$lastapp;
       echo "\nlastdata = " .$lastdata;
       echo "\nstart = " .$start;
       echo "\nanswer = " .$answer;
       echo "\nend = " .$end;
       echo "\nduration = " . $duration;
       echo "\nbillsec = " .$billsec;
       echo "\ndisposition = " .$disposition;
       echo "\namaflags = " .$amaflags;
       echo "\nuniqueid = " . $uniqueid;
       echo "\nuserfield = " .$userfield;
       echo "\n";
    
    }
    fclose($handle);
    ?>

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •