Nous sommes un projet open source et nous avons un serveur web Apache avec un MediaWiki 1.25. C'est une installation autonome, donc nous n'avons pas les complications de hébergement partagé avec plusieurs utilisateurs . Après environ 20 ans et quelques migrations, nous avions un nombre considérable de fichiers appartenant à "aucun utilisateur" et "aucun groupe".
Nous avons nettoyé les autorisations du système de fichiers en définissant efficacement les autorisations sur les fichiers et les répertoires sur root:Apache
, le propriétaire ayant le droit de l'utiliser avec rw
et le groupe était intitulé avec r
. Ce n'était pas un hasard; nous avons plutôt identifié les autorisations manquantes avec des commandes telles que _find /var/www -nouser
_, _find /var/www -nogroup
_, _find /var/www \! -user root
_ et _find /var/www \! -group Apache
_.
Nous avons également identifié deux cas spéciaux: root:root
et Apache:apache
et réinitialisez les autorisations. root:root
a été réinitialisé car cela signifiait que le fichier n'était pas accessible au serveur Web. Apache:apache
a été réinitialisé car cela signifiait qu'un composant à haut risque disposait d'autorisations en écriture.
Problème : Nous avons réussi à interrompre les téléchargements et les miniatures MediaWiki, qui, je crois, ont été causés par le Apache:apache
réinitialiser. Cela convient surtout parce que les administrateurs utilisent cette fonctionnalité et nous savons ce qui a provoqué la rupture. J'essaie maintenant de corriger la rupture, mais je ne peux pas déterminer ce que les autorisations du système de fichiers sont supposées être. Recherche en cours révèle les autorisations au niveau de l'application pour des éléments tels que _LocalSettings.php
_ et _$wgGroupPermissions
_. Et les documents d'architecture MediaWiki n'en discutent pas.
Question : Quelles sont les autorisations du système de fichiers supposées être pour une installation MediaWiki dans une configuration non partagée?
Pour être complet, le terme "non partagé" désigne le cas d'utilisation "utilisateur unique" cité. Quelles sont les autorisations des fichiers/dossiers de mon site Web sur un serveur Web Linux? Le VM est dédié pour nous, et il y a un seul utilisateur Apache, MediaWiki et MySQL (MediaWiki semble se greffer sur Apache, il n'y a donc que des utilisateurs Apache et MySQL).
Nous sommes not dans un environnement d'hébergement partagé avec différentes instances d'Apache et de MediaWiki s'exécutant dans différents contextes utilisateur ou avec des autorisations de fichier différentes pour chaque entité distincte. abonné.
Voici l'exception lorsque je tente de télécharger un fichier. J'avais l'habitude de pouvoir le télécharger lorsque les autorisations du système de fichiers étaient "rapides et lâches":
_[724f5260] /wiki/Special:Upload MWException from line 1856 of /var/www/html/w/includes/filerepo/file/LocalFile.php: Could not acquire lock for 'Vs2005-dynamic.Zip.'
Backtrace:
#0 /var/www/html/w/includes/filerepo/file/LocalFile.php(1148): LocalFile->lock()
#1 /var/www/html/w/includes/upload/UploadBase.php(715): LocalFile->upload(string, string, boolean, integer, array, boolean, User)
#2 /var/www/html/w/includes/specials/SpecialUpload.php(476): UploadBase->performUpload(string, boolean, boolean, User)
#3 /var/www/html/w/includes/specials/SpecialUpload.php(195): SpecialUpload->processUpload()
#4 /var/www/html/w/includes/specialpage/SpecialPage.php(384): SpecialUpload->execute(NULL)
#5 /var/www/html/w/includes/specialpage/SpecialPageFactory.php(582): SpecialPage->run(NULL)
#6 /var/www/html/w/includes/MediaWiki.php(267): SpecialPageFactory::executePath(Title, RequestContext)
#7 /var/www/html/w/includes/MediaWiki.php(566): MediaWiki->performRequest()
#8 /var/www/html/w/includes/MediaWiki.php(414): MediaWiki->main()
#9 /var/www/html/w/index.php(41): MediaWiki->run()
#10 {main}
_
Voici les contextes des utilisateurs pour le serveur Web en cours d'exécution.
_$ Sudo ps aux | egrep -i '(Apache|http|media|wiki)'
root 127 0.0 1.2 552216 13424 ? Ss 01:35 0:12 /usr/sbin/httpd -DFOREGROUND
Apache 7318 0.5 2.5 564804 27140 ? S 11:57 0:05 /usr/sbin/httpd -DFOREGROUND
Apache 7346 0.3 2.4 565124 25548 ? S 11:58 0:03 /usr/sbin/httpd -DFOREGROUND
Apache 7351 0.6 3.4 574220 36580 ? S 11:58 0:05 /usr/sbin/httpd -DFOREGROUND
Apache 7477 0.1 1.3 554088 14012 ? S 12:10 0:00 /usr/sbin/httpd -DFOREGROUND
Apache 7487 0.9 2.9 571148 30632 ? S 12:11 0:00 /usr/sbin/httpd -DFOREGROUND
_
La migration de MediaWiki 1.27 est prévue. Nous attendons que les autorisations soient correctes.
Vous trouverez ci-dessous une nouvelle installation LAMP sous Red Hat 7 ou un clone (CentOS 7, Scientific Linux 7, Orcale 7, etc.). Définissez Selinux sur Permissive pour l’installation.
setenforce 0
Commencez par obtenir la version de Mediawiki de votre choix https://releases.wikimedia.org/mediawiki/ , au moment de la rédaction de cet article, la dernière est https://releases.wikimedia.org/mediawiki/ 1.27/mediawiki-1.27.0.tar.gz et décompressez-le dans/var/www/html/w.
Accédez à https://www.example.com/w et suivez les instructions à l'écran pour générer le contenu utilisé pour LocalSettings.php. Créez LocalSettings.php avec
vi /var/www/html/w/LocalSettings.php
et coller le contenu dans le fichier (i -> entrer en mode insertion, CTRL+SHIFT+v coller du contenu, ESC -> pour sortir du mode insertion, ZZ (deux fois la lettre Z) pour enregistrer et quitter vi). Maintenant, sécurisez LocalSettings.php avec
chown root:Apache /var/www/html/w/LocalSettings.php
chmod 640 /var/www/html/w/LocalSettings.php
Supprimez mw-config s'il existe, car il n'est utilisé que lors de la première installation de mediawiki.
rm -rf /var/www/html/w/mw-config
Activez l'utilisation des fichiers .htaccess en créant un fichier de configuration personnalisé pour Apache httpd.
cat >> /etc/httpd/conf.d/custom.conf << EOF
<Directory "/var/www/html/w">
AllowOverride All
</Directory>
EOF
Maintenant, il faut personnaliser LocalSettings.php à son goût. Voici un aperçu des variables pouvant être personnalisées: https://www.mediawiki.org/wiki/Manual:Configuration_settings
Puisque nous voulons accéder à notre installation Mediawiki sous https://www.example.com/wiki , nous devons définir $ wgArticlePath dans LocalSettings.php. Ajoutez simplement la ligne suivante au bas de LocalSettings.php
$wgArticlePath = "/wiki/$1";
et mettez à jour /etc/httpd/conf.d/ssl.conf en ajoutant une ligne.
<VirtualHost _default_:443>
Alias /wiki /var/www/html/w/index.php # <-- only add this line
Les captchas sont gênants mais, s'ils sont configurés correctement, efficaces pour réduire le spam. Voir https://www.mediawiki.org/wiki/Extension:ConfirmEdit pour les options de configuration.
Nous voulons maintenant avoir une liste noire de mots qui ne peuvent être utilisés dans aucun article.
$wgSpamRegex = "/".
"s-e-x|zoofilia|sexyongpin|grusskarte|geburtstagskarten|animalsex|".
"sex-with|dogsex|adultchat|adultlive|camsex|sexcam|livesex|sexchat|".
"chatsex|onlinesex|adultporn|adultvideo|adultweb.|hardcoresex|hardcoreporn|".
"teenporn|xxxporn|lesbiansex|livegirl|livenude|livesex|livevideo|camgirl|".
"spycam|voyeursex|casino-online|online-casino|kontaktlinsen|cheapest-phone|".
"laser-eye|eye-laser|fuelcellmarket|lasikclinic|cragrats|parishilton|".
"paris-hilton|paris-tape|2large|fuel-dispenser|fueling-dispenser|huojia|".
"jinxinghj|telematicsone|telematiksone|a-mortgage|diamondabrasives|".
"reuterbrook|sex-plugin|sex-zone|lazy-stars|eblja|liuhecai|".
"buy-viagra|-cialis|-levitra|boy-and-girl-kissing|".
"dirare\.com|adipex|phentermine|adult-website\.com|".
"overflow\s*:\s*auto|".
"height\s*:\s*[0-4]px|".
"==<center>\[|".
"\<\s*a\s*href|".
"display\s*:\s*none".
"/i";
$wgSummarySpamRegex = "/".
"s-e-x|zoofilia|sexyongpin|grusskarte|geburtstagskarten|animalsex|".
"sex-with|dogsex|adultchat|adultlive|camsex|sexcam|livesex|sexchat|".
"chatsex|onlinesex|adultporn|adultvideo|adultweb.|hardcoresex|hardcoreporn|".
"teenporn|xxxporn|lesbiansex|livegirl|livenude|livesex|livevideo|camgirl|".
"spycam|voyeursex|casino-online|online-casino|kontaktlinsen|cheapest-phone|".
"laser-eye|eye-laser|fuelcellmarket|lasikclinic|cragrats|parishilton|".
"paris-hilton|paris-tape|2large|fuel-dispenser|fueling-dispenser|huojia|".
"jinxinghj|telematicsone|telematiksone|a-mortgage|diamondabrasives|".
"reuterbrook|sex-plugin|sex-zone|lazy-stars|eblja|liuhecai|".
"buy-viagra|-cialis|-levitra|boy-and-girl-kissing|".
"dirare\.com|adipex|phentermine|adult-website\.com|".
"overflow\s*:\s*auto|".
"height\s*:\s*[0-4]px|".
"==<center>\[|".
"\<\s*a\s*href|".
"display\s*:\s*none".
"/i";
Pour les sites de taille petite à moyenne, l'extension "Moderation", https://www.mediawiki.org/wiki/Extension:Moderation est assez efficace pour lutter contre le SPAM. Ajoutez les lignes suivantes à la fin de LocalSettings.php
$wgGroupPermissions['user']['move'] = false;
$wgGroupPermissions['user']['upload'] = false;
$wgGroupPermissions['user']['purge'] = false;
$wgGroupPermissions['user']['SpecialPages'] = false;
$wgGroupPermissions['bureaucrat']['move'] = true;
$wgGroupPermissions['bureaucrat']['upload'] = true;
$wgGroupPermissions['bureaucrat']['purge'] = true;
$wgGroupPermissions['bureaucrat']['SpecialPages'] = true;
#Moderation (This section to be placed at the bottom of LocalSettings.php)
require_once "$IP/extensions/Moderation/Moderation.php";
$wgGroupPermissions['sysop']['moderation'] = true; # Allow sysops to use Special:Moderation
$wgGroupPermissions['sysop']['skip-moderation'] = true; # Allow sysops to skip moderation
$wgGroupPermissions['bot']['skip-moderation'] = true; # Allow bots to skip moderation
$wgGroupPermissions['bureaucrat']['skip-moderation'] = true; # Allow bureaucrat to skip moderation
#$wgGroupPermissions['checkuser']['moderation-checkuser'] = false; # Don't let checkusers see IPs on Special:Moderation
$wgAddGroups['sysop'][] = 'automoderated'; # Allow sysops to assign "automoderated" flag
$wgRemoveGroups['sysop'][] = 'automoderated'; # Allow sysops to remove "automoderated" flag
$wgLogRestrictions["newusers"] = 'moderation';
Obtenir l'extension de modération avec
git clone https://github.com/edwardspec/mediawiki-moderation.git
et copiez les fichiers dans "/ var/www/html/w/extensions/Moderation". Maintenant, lancez le script de mise à jour mediawiki avec
cd /var/www/html/w
php maintenance/update.php
Terminez maintenant la sécurisation de l’installation de Mediawiki. Ceci peut être nécessaire pour Selinux, par exemple. base de données sur un serveur différent, etc.
setsebool -P httpd_can_network_connect 1
setsebool -P httpd_can_network_connect_db 1
Ceci est nécessaire à Selinux pour exécuter Mediawiki.
setsebool -P httpd_builtin_scripting 1
setsebool -P httpd_execmem 1
Définissez les droits d'utilisateur et les droits spéciaux Selinux. Apache httpd dispose donc d'un accès en lecture, contrairement à d'autres utilisateurs que root.
chown -R root:Apache /var/www/html/
find /var/www/html/w -type d -exec chmod 750 {} \;
find /var/www/html/w -type f -exec chmod 640 {} \;
Mediawiki écrit dans les images et dans le cache, ils ont donc besoin de conditions d'écriture spéciales.
chown -R Apache:apache /var/www/html/w/images
chown -R Apache:apache /var/www/html/w/cache
semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/w/cache(/.*)?"
semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/w/images(/.*)?"
restorecon -R /var/www/html/w
Vous avez trouvé Selinux se plaindre de hugetlbfs, ajoutez donc une exception.
cd /var/log/audit
grep hugetlbfs audit.log | audit2allow -M hugetlbfs
semodule -i hugetlbfs.pp
Maintenant, redémarrez Apache httpd et ramenez Selinux à l’application.
setenforce 1
systemctl restart httpd
Naturellement, cela ne couvre que les bases et Mediawiki offre des milliers de façons de le personnaliser davantage en fonction de vos besoins et de vos besoins en matière de sécurité.
N'oubliez pas de faire des sauvegardes régulières.
D'autres suggestions peuvent être trouvées ici https://www.pozzo-balbi.com/help/Mediawiki .
Une explication pour la partie SELinux.
Je ne connais pratiquement rien à propos de mediawiki mais j'utilise SELinux tous les jours, alors je me suis dit que j'aiderais à expliquer ce que vous définissez. J'ai eu les définitions de différentes pages de manuel.
httpd_can_network_connect_db
(service HTTPD)
Autoriser les scripts et les modules HTTPD à se connecter en réseau aux bases de données.
httpd_can_network_connect
(service HTTPD)
Autoriser les scripts et les modules HTTPD à se connecter au réseau.
httpd_builtin_scripting
(service HTTPD)
Autoriser HTTPD à prendre en charge les scripts intégrés
setsebool -P httpd_execmem 1
Autoriser les scripts et les modules httpd execmem/execstack. Je remettrais ceci à 0 et regardais le journal d'audit pour voir si le wiki de média avait réellement besoin de ce paramètre. Activer ce booléen n'est pas recommandé du point de vue de la sécurité, car cela réduit la protection contre les dépassements de mémoire tampon.
semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/w/cache(/.*)?"
semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/w/images(/.*)?"
restorecon -R /var/www/html/w
La commande Semanage fcontext ajoute, -a
, le type selinux, -t
, httpd_sys_rw_content_t (signifie essentiellement que httpd permet de rw dans le répertoire et que tout ce qui se trouve dans le répertoire par défaut) dans les dossiers /var/www/html/w/{cache,images}
Le restorecon -R /var/www/html/w
ajoute le nouveau type de répertoire à la base de données SELinux. Je l'exécuterais en tant que restorecon -Rv /var/www/html/w/*
pour que je puisse voir les modifications apportées.
J'ai essayé de garder les définitions brèves, si vous avez besoin de plus de détails, je peux vous en donner plus.
grep hugetlbfs audit.log | audit2allow -M hugetlbfs
semodule -i hugetlbfs.pp
Cette commande pratique génère des règles de stratégie SELinux à partir du fichier audit.log. Audit2allow crée le fichier de politique que semodule utilise pour ajouter au module de politique SELinux. Pour plus d'informations, reportez-vous aux pages de manuel relatives à audit2allow et à semodule. Je ne veux pas entrer trop dans les détails avec ces 2-là, car ça peut être un terrier de lapin.