Skip to main contentSkip to footer

Exemples d'installation

Le même installateur sur les hôtes qu'il rencontre d'habitude : un déploiement avec Ansible ou cloud-init, une image de référence, un serveur avec un panneau de contrôle, un hôte mail ou base de données, un conteneur LXC, et un VPS derrière un pare-feu cloud. Chaque exemple utilise les options et les variables que documente la page d'installation, rien ici n'est une seconde porte d'entrée.

Sans intervention, sur beaucoup d'hôtes

Trois choses font qu'une installation sans intervention fonctionne, et chaque exemple ci-dessous repose dessus. Les conditions d'utilisation sont acceptées d'avance avec REPORTEDIP_ACCEPT_TERMS=1, parce qu'il n'y a personne pour taper yes. La clé voyage dans l'environnement et jamais en argument, parce que /proc/<pid>/cmdline est lisible par tout utilisateur local et que l'environnement ne l'est pas. Et les réponses aux questions qu'un terminal poserait sont données en variables, pour qu'aucun hôte n'attende une réponse : REPORTEDIP_MODE, REPORTEDIP_BAN et REPORTEDIP_NOTIFY_EMAIL. Omettez-en une et la valeur par défaut d'une configuration neuve s'applique, c'est-à-dire drop, bannissements locaux activés, et pas de courrier.

L'exécution est idempotente. Sur un hôte qui a déjà /etc/reportedip-agent/config.yaml, le script pose le binaire et s'arrête, et la configuration n'est pas touchée. Les mises à niveau n'ont pas besoin du déploiement : l'agent se met à jour lui-même toutes les six heures à partir d'une version signée. La seule chose à faire après chaque installation est la liste blanche : l'installateur y met l'adresse d'où venait la session, et votre plage d'administration n'y est pas tant que vous ne l'ajoutez pas.

Ansible

Une liste de tâches, pas un rôle, parce qu'il n'y a rien à mettre en template : l'installateur sonde l'hôte lui-même. La clé vient du vault, la tâche est sautée sur un hôte qui a déjà une configuration, et la tâche de liste blanche traite une adresse déjà présente comme inchangée, ce qui est exactement ce que l'agent rapporte.

yaml
- name: Install the ReportedIP Agent
  ansible.builtin.shell: curl -fsSL https://reportedip.com/agent/install.sh | sh
  args:
    creates: /etc/reportedip-agent/config.yaml
  environment:
    REPORTEDIP_ACCEPT_TERMS: "1"
    REPORTEDIP_KEY: "{{ reportedip_api_key }}"
    REPORTEDIP_MODE: "drop"
    REPORTEDIP_BAN: "true"
    REPORTEDIP_NOTIFY_EMAIL: "ops@example.org"
  no_log: true

- name: Whitelist the management range
  ansible.builtin.command:
    argv: [reportedip-agent, whitelist, add, "{{ management_range }}", "management"]
  register: rip_whitelist
  changed_when: rip_whitelist.rc == 0
  failed_when: rip_whitelist.rc != 0 and "already in" not in (rip_whitelist.stderr ~ rip_whitelist.stdout)

- name: Confirm the host is healthy
  ansible.builtin.command: reportedip-agent status
  changed_when: false

no_log garde la clé hors de la sortie d'Ansible et de ses journaux ; l'installateur lui-même la garde hors de la liste des processus. Un hôte de rebond qui n'est pas l'endroit d'où vous administrez a besoin de --admin-ip, qui n'existe que comme argument : REPORTEDIP_ADMIN_IP n'existe pas, et install.sh ne transmet aucun argument à la configuration. Lancez le script avec REPORTEDIP_NO_SETUP=1, puis reportedip-agent install --admin-ip 203.0.113.0/24 dans une seconde tâche, avec le même bloc d'environnement.

cloud-init

La même ligne dans runcmd. Ce qui change, c'est l'endroit où vit la clé : les user data sont lisibles depuis l'intérieur de l'instance par tout processus qui atteint le service de métadonnées, une clé placée là est donc une clé que chaque application de l'hôte peut lire. Là où cela compte, récupérez-la au démarrage depuis un coffre de secrets et transmettez-la dans l'environnement de cette seule commande.

yaml
#cloud-config
runcmd:
  - [sh, -c, "curl -fsSL https://reportedip.com/agent/install.sh | REPORTEDIP_ACCEPT_TERMS=1 REPORTEDIP_KEY=YOUR_API_KEY REPORTEDIP_NOTIFY_EMAIL=ops@example.org sh"]
  - [reportedip-agent, whitelist, add, "203.0.113.0/24", "management"]
  - [reportedip-agent, sync]

Une image de référence

Placez le binaire dans l'image et rien d'autre. REPORTEDIP_NO_SETUP=1 télécharge, vérifie et installe le binaire et s'arrête là : pas de configuration, pas d'unités, pas d'enregistrement. La mise en place s'exécute une fois au premier démarrage, sur le vrai hôte, parce que deux choses qu'elle écrit ne doivent pas être clonées : l'identifiant d'installation, qui est ce par quoi le service distingue un serveur d'un autre, et la liste blanche automatique, qui porte l'adresse de la session qui l'a lancée. Une image qui porte un identifiant d'installation fait de chaque clone le même serveur dans le registre, et une licence est alors comptée une fois pour tous et n'est attribuée de façon fiable à aucun d'eux.

bash
# In the image build:
curl -fsSL https://reportedip.com/agent/install.sh | REPORTEDIP_ACCEPT_TERMS=1 REPORTEDIP_KEY=YOUR_API_KEY REPORTEDIP_NO_SETUP=1 sh

# At first boot of the clone, once:
REPORTEDIP_ACCEPT_TERMS=1 REPORTEDIP_KEY=YOUR_API_KEY reportedip-agent install --notify-email ops@example.org
reportedip-agent sync

Panneaux de contrôle

reportedip-agent doctor nomme le panneau qu'il trouve sous /usr/local : ISPConfig, Plesk, cPanel ou DirectAdmin. Ce que l'installateur configure au-delà du nom dépend du fait que la disposition des journaux par site de ce panneau ait été mesurée ou non. Aujourd'hui, c'est ISPConfig ; pour les autres, le panneau est nommé, les journaux standard sont trouvés, et les journaux par domaine sont à ajouter vous-même. doctor liste aussi les sources configurées avec les fichiers vers lesquels elles pointent, et reportedip-agent test <log> montre ce qu'un journal produirait avant de l'ajouter.

ISPConfig

Mesuré sur des hôtes de production. L'installateur trouve les journaux par site sous /var/log/ispconfig/httpd/*/access.log et error.log sous forme de glob, un site ajouté plus tard est donc couvert sans rien changer, le journal de connexion au panneau /var/log/ispconfig/auth.log comme source panel, et le journal mail, pure-ftpd (qu'ISPConfig installe sous le nom pure-ftpd-mysql) et fail2ban quand ils tournent. Sur un hôte d'hébergement, cela a donné 196 fichiers de journaux pour 62 lignes de configuration. Les listes mail, web et ftp suivent les services actifs et les ports qui n'écoutent pas seulement sur la boucle locale ; ssh et edge sont toujours actives.

Plesk

Nommé par /usr/local/psa. Le journal mail standard est trouvé ; les journaux web par domaine ne sont pas configurés, parce que leur disposition n'a pas été mesurée. Ils vivent d'habitude sous /var/www/vhosts/system/<domain>/logs/ sous le nom access_log, plus proxy_access_log là où nginx est devant Apache. Vérifiez avec ls, puis ajoutez une source web avec un glob et une source web-error pour les journaux d'erreurs. Un pare-feu de panneau qui réécrit les tables quand ses règles sont appliquées ne retire pas l'agent pour de bon : la prochaine synchronisation remarque que la chaîne a disparu et la reconstruit, et reportedip-agent sync le fait tout de suite.

yaml
sources:
  - type: sshd
  - type: postfix
    path: /var/log/maillog
  - type: dovecot
    path: /var/log/maillog
  - type: web
    glob: "/var/www/vhosts/system/*/logs/access_log"
  - type: web
    glob: "/var/www/vhosts/system/*/logs/proxy_access_log"
  - type: web-error
    glob: "/var/www/vhosts/system/*/logs/error_log"

cPanel

Nommé par /usr/local/cpanel. Trois choses diffèrent d'un hôte ordinaire. Les journaux par domaine sont les domlogs, d'habitude /var/log/apache2/domlogs/ avec /usr/local/apache/domlogs qui pointe dessus ; une source web avec un glob les couvre. Le serveur de mail est Exim et son journal est /var/log/exim_mainlog, qui n'est pas l'un des chemins que l'installateur cherche, la source exim s'ajoute donc à la main. Et là où csf tourne, /var/log/lfd.log est une source à part entière, csf, et chaque blocage que fait lfd est signalé par elle ; Imunify360 a une source par interrogation, marquée expérimentale. Lancez d'abord test sur chaque journal : un domlog avec un format personnalisé ne produit rien, et il vaut mieux l'apprendre dans un terminal que devant un compteur vide une semaine plus tard.

yaml
sources:
  - type: sshd
  - type: web
    glob: "/var/log/apache2/domlogs/*"
    exclude: ["*-ssl_log", "*.bkup*"]
  - type: exim
    path: /var/log/exim_mainlog
  - type: csf
    path: /var/log/lfd.log

DirectAdmin

Nommé par /usr/local/directadmin. Les journaux par domaine sont d'habitude sous /var/log/httpd/domains/, un <domain>.log et un <domain>.error.log chacun, et Exim écrit /var/log/exim/mainlog, qui là encore n'est pas un chemin que l'installateur essaie. Deux globs et un chemin couvrent l'hôte.

Un serveur de mail, un serveur de base de données

Mail

Un hôte qui fait tourner Postfix et Dovecot n'a besoin de rien de plus. L'installateur voit les services ou les ports en écoute et configure les deux sources sur le seul journal mail, et la liste mail atterrit sur les ports mail fixes 25, 465, 587, 110, 995, 143 et 993. Les seuils sont par source d'événement et bas à dessein, parce qu'un serveur de mail voit peu d'échecs légitimes : trois échecs SASL en une heure, cinq destinataires rejetés, trois rejets amavis, dix échecs Dovecot. Un hôte qui fait tourner Exim à la place reçoit la source exim quand le journal est à l'un des chemins Debian ou Red Hat. Ce qui quitte la machine est identique partout : l'adresse, les identifiants de catégorie, une phrase générée, et aucune ligne du journal.

Base de données

Un hôte de base de données qui n'écoute que sur SSH et sur le port de la base reçoit une seule source, sshd, et deux listes qui comptent : ssh sur le port SSH et edge, qui s'applique à chaque port et donc aussi au port de la base. L'agent ne lit aucun journal de base de données, il ne verra donc pas une attaque par force brute contre la base elle-même ; la réponse à cela n'est pas sur cette page, c'est une règle de pare-feu qui tient le port à l'écart d'internet. Ce que l'agent ajoute, c'est qu'une adresse que le réseau connaît déjà comme attaquant est rejetée avant sa première tentative de connexion, sur chaque port.

Conteneurs LXC et pare-feu cloud

Proxmox LXC

L'agent a besoin de deux choses d'un conteneur : systemd, qu'un conteneur LXC avec une distribution systemd possède, et un backend de pare-feu qu'il peut utiliser, ce qui est la question ouverte. Que nft ou ipset puisse créer un ensemble à l'intérieur du conteneur dépend des privilèges du conteneur, et dans un conteneur non privilégié, ce n'est d'habitude pas possible. L'installateur ne devine pas : le bloc des prérequis nomme le backend qu'il a trouvé, et une installation sans backend passe en signalement seul, ce que doctor dit en toutes lettres. Lancez un sync après l'installation et lisez status : une chaîne qui est là est la réponse. Là où elle n'y est pas, le blocage se fait sur l'hôte Proxmox, et le conteneur continue de détecter et de signaler.

Un VPS derrière un pare-feu cloud

Un pare-feu de fournisseur filtre avant que le paquet n'atteigne l'hôte. Ce qu'il rejette n'apparaît jamais dans un journal, les compteurs et les ensembles de l'agent ne voient donc que ce que le fournisseur a laissé passer ; ce n'est pas un défaut, c'est l'ordre des couches. Deux choses valent la peine sur un VPS. Mettez la plage depuis laquelle vous administrez dans la liste blanche juste après l'installation, parce que la liste blanche automatique ne contient que l'adresse d'où venait la session. Et connaissez le chemin du retour avant d'en avoir besoin : la console du fournisseur est hors bande, elle ne passe pas par les ensembles du noyau, une adresse d'administration bannie n'est donc qu'à un reportedip-agent unban <address> de la console, et chaque bannissement local expire de lui-même de toute façon.

Dernière mise à jour: · Maintenu par l’équipe ReportedIP

Security Focused
Conforme au RGPD
Made in Germany
Retour aux docs