Shellbox
Shellbox je knihovna pro provádění příkazů a také server a klient pro vzdálené provádění příkazů. Primárně byl implementován do sandboxu LilyPond (používaný Score extension) a poskytuje způsob, jak MediaWiki může využívat externí binární soubory, aniž by je bylo nutné spouštět ve stejném kontejneru. Byl navržen a schválen prostřednictvím RFC:Mikroslužby PHP pro spouštění kontejnerového prostředí. Shellbox je použitelný od MediaWiki 1.36 .
Informace o používání Shellboxu v MediaWiki jsou k dispozici na Příručka:BoxedCommand .
Nastavení serveru
Doporučuje se nastavit Shellbox tak, aby běžel jako neprivilegovaný uživatel v izolovaném kontejneru bez přístupu k externí síti. Wikimedie pro tento účel používá Kubernetes a má Helm graf, který může být znovu použitelný.
Do kontejneru by měly být nainstalovány následující balíčky:
Apache2 (httpd
), PHP-FPM a jakékoli příkazy, které potřebujete (např. lilypond
, imagemagick
atd.).
V následujících příkladech používáme shellbox.internal
jako interní název hostitele kontejneru.
- Získání zdroj Shellbox a jeho závislosti:
cd /srv
git clone https://gerrit.wikimedia.org/r/mediawiki/libs/Shellbox shellbox
cd shellbox
composer install --no-dev
- Vytvoření neprivilegovaného uživatele pro Shellbox:
useradd -r shellbox
- Vytvoření dočasný pracovní adresář pro Shellbox:
install -o shellbox -g shellbox -d /var/tmp/shellbox
- Vytvoření konfigurační soubor Shellbox odkazující na dočasný pracovní adresář
/srv/shellbox/config/config.json
:
{
"url": "http://shellbox.internal/shellbox",
"tempDir": "/var/tmp/shellbox"
}
- Vygenerování tajného klíče. Důrazně se doporučuje používat 128bitovou minimální sílu, takže zde používáme 16 náhodných bajtů formátovaných do hexadecimálního řetězce:
php -r 'print bin2hex(fread(fopen("/dev/urandom","r"),16))."\n";'
- Vytvoření konfiguraci Apache
/etc/apache2/sites-available/shellbox.internal.conf
a vložte tajný klíč dovnitř:
<VirtualHost *:80>
ServerName shellbox.internal
DocumentRoot /srv/shellbox/public_html
Alias /shellbox /srv/shellbox/shellbox.php
SetEnv SHELLBOX_SECRET_KEY "...YOUR SECRET KEY HERE..."
<Directory /srv/shellbox/public_html>
Order deny,allow
Satisfy Any
</Directory>
<FilesMatch ".+\.php$">
SetHandler "proxy:unix:/run/php/shellbox.sock|fcgi://localhost"
</FilesMatch>
RewriteEngine On
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]
</VirtualHost>
- Chránění konfiguračního souboru Apache před neoprávněným čtením tajného klíče a neoprávněnými úpravami jakýmkoli jiným uživatelem systému nebo skupinou než těmi, kteří jsou nakonfigurováni ke spuštění samotného Apache na serveru:
chown root:root /etc/apache2/sites-available/shellbox.internal.conf
chmod 600 /etc/apache2/sites-available/shellbox.internal.conf
- Vytvoření konfigurace fondu PHP-FPM. Když je Shellbox nakonfigurován tímto způsobem, nemá oprávnění k připojení k socketu PHP-FPM:
[shellbox]
user = shellbox
group = shellbox
listen = /run/php/shellbox.sock
listen.owner = www-data
listen.group = www-data
pm = static
pm.max_children = 1
Konfigurace MediaWiki
$wgShellboxUrls = [
'default' => 'http://shellbox.internal/shellbox'
];
$wgShellboxSecretKey = '... your secret key ...';
Předpřipravené kontejnery
Wikimedie má předpřipravené kontejnery, které obsahují Shellbox, jeho závislosti a PHP-FPM:
Tyto obrázky v současné době nemají žádnou záruku stability/verzování (potřebujeme pomoc, jak to zjistit).
Trasy
Shellbox odhaluje cestu /healthz
pro manuální a automatické kontroly stavu.
Má také rozhraní PHP-RPC pro spouštění kódu PHP v sandboxu.
Poznámky
Shellbox nepodporuje multiplatformní požadavky, takže pokud spustíte MediaWiki na Windows, je nutné spustit Shellbox i na Windows.