원문 보기: https://dawoum.duckdns.org/wiki/Shellbox
Shellbox는 명령 실행을 위한 라이브러리이고, 원격 명령 실행을 위한 서버와 클라이언트이기도 합니다. 그것은 주로 LilyPond (Score 확장에 의해 사용)를 샌드박스하고 미디어위키에 대해 같은 컨테이너에서 실행할 필요 없이 외부 바이너리를 활용할 수 있는 방법을 제공하기 위해 구현되었습니다. 그것은 RFC: PHP microservice for containerized shell execution를 통해 설계되고 승인되었습니다. Shellbox는 미디어위키 1.36부터 사용할 수 있습니다.
미디어위키에서 Shellbox를 사용하는 방법에 대한 정보는 Manual:BoxedCommand에서 확인할 수 있습니다.
Server setup
Shellbox를 외부 네트워크 접근을 가지지 않는 격리된 컨테이너 내부에서 권한이 없는 사용자로 실행하도록 설정하는 것이 추천됩니다. 위키미디어는 이 목적으로 Kubernetes를 사용하고 재사용 가능한 Helm chart를 가지고 있습니다.
컨테이너 내부에 다음 패키지를 설치해야 합니다: Apache2 (httpd), PHP-FPM, 그리고 셸에서 실행해야 하는 명령어 (예를 들어 lilypond, imagemagick 등).
다음 예제에서는 컨테이너 내부 호스트 이름으로 shellbox.internal을 사용합니다.
- Shellbox 소스와 종속성을 가져옵니다:
cd /srv
git clone https://gerrit.wikimedia.org/r/mediawiki/libs/Shellbox shellbox
cd shellbox
composer install --no-dev
- Shellbox에 대한 권한이 없는 사용자를 만듭니다:
useradd -r shellbox
- Shellbox에 대한 임시 작업 디렉토리를 만듭니다:
install -o shellbox -g shellbox -d /var/tmp/shellbox
- 임시 작업 디렉토리 /srv/shellbox/config/config.json을 참조하는 Shellbox 구성 파일을 만듭니다:
{
"url": "http://shellbox.internal/shellbox",
"tempDir": "/var/tmp/shellbox"
}
- 비밀 키를 생성합니다; 128비트 최소 강도를 사용하는 것이 강력히 권장되므로 여기서는 16개의 난수 바이트를 16진수 문자열로 포맷하여 사용합니다:
php -r 'print bin2hex(fread(fopen("/dev/urandom","r"),16))."\n";'
- 아파키 구성 /etc/apache2/sites-available/shellbox.internal.conf를 만들고, 비밀 키를 안에 붙여넣습니다:
<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>
- 서버에서 아파치를 실행하도록 구성된 사용자 또는 그룹이 아닌 다른 시스템 사용자 또는 그룹의 비밀 키에 대한 권한 없는 읽기 및 권한 없는 수정으로부터 아파치 구성 파일을 보호합니다:
chown root:root /etc/apache2/sites-available/shellbox.internal.conf
chmod 600 /etc/apache2/sites-available/shellbox.internal.conf
- PHP-FPM 풀 구성을 만듭니다. 이런 방식으로 구성하면 Shellbox는 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
MediaWiki configuration
$wgShellboxUrls = [
'default' => 'http://shellbox.internal/shellbox'
];
$wgShellboxSecretKey = '... your secret key ...';
Pre-built containers
위키미디어에는 Shellbox, 그것의 종속성, 및 PHP-FPM을 포함하는 사전-빌드된 컨테이너가 있습니다:
현재 이러한 이미지는 안정성을 보장하지 않고 버전 관리도 되어 있지 않습니다 (이 문제를 알아내는 데 도움이 필요합니다).
Routes
Shellbox는 수동 및 자동 건강 검사를 위한 /healthz 경로를 노출합니다. 그것은 역시 샌드박스 PHP 코드를 실행하기 위한 PHP-RPC 인터페이스도 있습니다.
Notes
Shellbox는 크로스 플랫폼 요청을 지원하지 않으므로, 윈도우에서 미디어위키를 실행하려면, 윈도우에서 Shellbox도 실행해야 합니다.