MAATRIX / Блог / PrivateBin на Ubuntu 24.04: пошаговая установка

PrivateBin на Ubuntu 24.04: пошаговая установка

MAATRIX

Если вы отправляете коллегам логи, конфиги или куски кода через обычный pastebin, сервер-хозяин теоретически видит всё, что вы туда вставили, — открытым текстом. PrivateBin решает эту проблему иначе: текст шифруется прямо в браузере, ключ никогда не попадает на сервер, а сам сервер хранит только нечитаемый набор байт. Ниже — пошаговая установка PrivateBin на свой VPS с Ubuntu 24.04: от чистой системы до рабочего HTTPS-сервиса.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Как устроено шифрование PrivateBin

Прежде чем ставить, стоит понять, зачем вообще городить отдельный сервис, если есть обычный pastebin. Разница не в интерфейсе, а в модели доверия.

Когда вы создаёте вставку, JavaScript в браузере генерирует ключ, шифрует текст этим ключом (AES-256 в режиме GCM) и отправляет на сервер уже зашифрованный блоб. Сам ключ остаётся в URL-фрагменте после символа # — а всё, что идёт после #, браузер по стандарту не отправляет на сервер вообще, ни в заголовках, ни в логах доступа. Получается, что человек, управляющий сервером (в том числе вы сами, если это чужой сервер), физически не может расшифровать содержимое без ссылки целиком.

Это даёт три практических свойства, которых нет у обычного pastebin:

  • Сервер хранит мусор. Дамп базы или бэкап диска не раскрывает содержимое вставок — там только шифротекст.
  • Есть выбор срока жизни. Вставку можно сделать одноразовой (удалится после первого просмотра) или с ограничением по времени — от 5 минут до месяца.
  • Опциональная защита паролем. Можно потребовать дополнительный пароль поверх ключа из ссылки — тогда даже перехват самой ссылки не даёт доступа к тексту.

Обратная сторона: если получатель потерял ссылку целиком (с фрагментом после #), восстановить текст не сможете и вы сами — это осознанный компромисс, а не баг.

Шаг 1. Подготовка сервера

Возьмите чистый VPS с Ubuntu 24.04, root-доступом и доменом, который уже указывает на его IP. PrivateBin — лёгкое PHP-приложение без базы данных в классическом понимании (по умолчанию хранит вставки в виде файлов), поэтому 1 ядра и 1 ГБ RAM хватает с запасом даже под заметную нагрузку.

Обновите систему и поставьте базовые утилиты:

apt update && apt upgrade -y
apt install -y curl gnupg2 ca-certificates lsb-release unzip

Локацию сервера выбирайте по тому, кто будет пользоваться сервисом: RU-площадка даёт минимальный пинг для российской команды, US и UK удобнее для международной работы или доступа к зарубежным сервисам. У MAATRIX доступны все три локации, оплата принимается картой РФ, через СБП или криптовалютой — не придётся привязывать иностранную карту ради одного внутреннего инструмента.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Шаг 2. Nginx и PHP-FPM

PrivateBin написан на PHP и штатно работает за Nginx с PHP-FPM. Ставим стек:

apt install -y nginx php8.3-fpm php8.3-cli php8.3-gd php8.3-mbstring php8.3-curl php8.3-zip php8.3-xml

В Ubuntu 24.04 в штатных репозиториях идёт PHP 8.3 — этого достаточно, PrivateBin поддерживает 8.1 и выше. Проверьте версию и запустите сервис:

php -v
systemctl enable --now php8.3-fpm

Создайте директорию под сайт:

mkdir -p /var/www/privatebin
chown -R www-data:www-data /var/www/privatebin

Шаг 3. Установка PrivateBin

Официальный способ — скачать релиз с GitHub, а не клонировать репозиторий целиком (в релизе уже собраны зависимости через Composer). Проверьте актуальную версию на странице релизов проекта и подставьте её вместо 1.7.4 при необходимости:

cd /tmp
curl -LO https://github.com/PrivateBin/PrivateBin/archive/refs/tags/1.7.4.tar.gz
tar -xzf 1.7.4.tar.gz
cp -r PrivateBin-1.7.4/* /var/www/privatebin/

Если релизный архив на GitHub не содержит папку vendor (зависит от того, как собран конкретный тег), доставьте её через Composer:

apt install -y composer
cd /var/www/privatebin
composer install --no-dev --optimize-autoloader

Создайте директории для данных и конфига и выставьте права:

mkdir -p /var/www/privatebin/data /var/www/privatebin/cfg
cp /var/www/privatebin/cfg/conf.sample.php /var/www/privatebin/cfg/conf.php 2>/dev/null || true
chown -R www-data:www-data /var/www/privatebin
find /var/www/privatebin -type d -exec chmod 750 {} \;
find /var/www/privatebin -type f -exec chmod 640 {} \;
chmod -R 770 /var/www/privatebin/data

Обратите внимание: если файл cfg/conf.php не появился автоматически, скопируйте его из cfg/conf.php.sample внутри распакованного архива — имя файла-примера отличается между версиями, проверьте, что реально лежит в папке cfg/ после распаковки.

Шаг 4. Базовая конфигурация PrivateBin

Откройте /var/www/privatebin/cfg/conf.php — это INI-подобный файл с секциями. Ключевые параметры в секции [main]:

[main]
name = "PrivateBin"
basepath = ""
discussion = false
opendiscussion = false
password = true
fileupload = false
burnafterreadingselected = false
defaultformatter = "plaintext"
sizelimit = 10485760
template = "bootstrap"
languageselection = false
urlshortener = ""
qrcode = true
zerobincompatibility = false
httpwarning = true
compression = "zlib"

Разберите то, что реально влияет на использование:

  • password = true — разрешает ставить дополнительный пароль на вставку поверх ключа из ссылки.
  • burnafterreadingselected — если true, чекбокс «сжечь после прочтения» будет отмечен по умолчанию (сама опция доступна пользователю в любом случае).
  • sizelimit — лимит на вставку в байтах, 10485760 — это 10 МБ.
  • fileupload — включает загрузку файлов и изображений, а не только текста.

Срок хранения вставок задаётся отдельной секцией [expire]:

[expire]
default = "1week"

[expire_options]
5min = 300
10min = 600
1hour = 3600
1day = 86400
1week = 604800
1month = 2592000
never = 0

Секция [traffic] защищает от спама — ограничивает частоту создания новых вставок с одного IP:

[traffic]
limit = 10
header = ""

limit = 10 значит не более одной новой вставки в 10 секунд с одного адреса; header можно указать (например, X-Forwarded-For), если сервис стоит за обратным прокси и реальный IP клиента приходит в заголовке.

Хранилище по умолчанию — файловое ([model] class = Filesystem), данные лежат в data/ в виде поддиректорий по первым символам ID вставки. Для одного сервера этого достаточно; PrivateBin также поддерживает бэкенды на GD-хранилище S3-совместимого облака и на базе данных (class = Database с драйвером sqlite, mysql или pgsql) — это уже актуально при горизонтальном масштабировании за балансировщиком, но для типового использования файлового хранилища хватает с запасом.

Шаг 5. Настройка Nginx и HTTPS

Создайте конфиг сайта:

nano /etc/nginx/sites-available/privatebin

Официальный проект рекомендует такой блок (адаптируйте домен и версию PHP):

server {
    listen 80;
    server_name paste.example.com;
    root /var/www/privatebin;
    index index.php;

    client_max_body_size 12M;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    location ~ /(cfg|data|lib|tpl|vendor)/ {
        deny all;
    }

    location ~ /\.ht {
        deny all;
    }
}

client_max_body_size должен быть не меньше sizelimit из conf.php с запасом на служебные данные — иначе Nginx будет обрывать крупные вставки до того, как их увидит PHP. Блок location ~ /(cfg|data|lib|tpl|vendor)/ закрывает прямой доступ к служебным папкам — без него теоретически можно было бы скачать сырые файлы шифротекста напрямую по HTTP, минуя интерфейс.

Активируйте сайт и проверьте синтаксис:

ln -s /etc/nginx/sites-available/privatebin /etc/nginx/sites-enabled/
nginx -t
systemctl reload nginx

Для HTTPS проще всего Certbot с автопродлением:

apt install -y certbot python3-certbot-nginx
certbot --nginx -d paste.example.com

Certbot сам допишет блок listen 443 ssl и настроит редирект с 80 на 443. Если предпочитаете более простой вариант с автоматическим выпуском сертификата без отдельной команды, посмотрите Caddy с авто-SSL на Ubuntu 24.04 — там же разбор, чем этот подход отличается от связки Nginx + Certbot, если пока не определились с выбором.

HTTPS для PrivateBin не косметика: без него ключ шифрования, идущий во фрагменте URL, и сам зашифрованный блоб передаются по каналу, который может прослушать кто угодно между браузером и сервером. Шифрование содержимого не спасает, если транспорт открытый, — ссылку с ключом легко перехватить в том же незащищённом Wi-Fi.

Шаг 6. Автоочистка устаревших вставок

Вставки с истёкшим сроком жизни не удаляются сами по себе — PrivateBin проверяет срок при обращении к конкретной вставке, но не чистит диск фоном. Штатный способ — CLI-скрипт bin/cronjob.php, вызываемый по расписанию:

crontab -e -u www-data

Добавьте строку:

0 3 * * * /usr/bin/php /var/www/privatebin/bin/cronjob.php > /dev/null 2>&1

Скрипт проходит по всем вставкам, сверяет время истечения и удаляет просроченные. Без этого шага директория data/ будет только расти — заброшенные burn-after-reading вставки, которые никто не открыл, и вставки с истёкшим сроком продолжат занимать место на диске бесконечно.

Шаг 7. Фаервол и базовое ограждение

Откройте только нужные порты:

ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable

Если сервис публичный и доступен из интернета, есть смысл поставить fail2ban против брутфорса SSH и от чрезмерно активных ботов, дёргающих HTTP — гайд с настройкой готовых джейлов есть в статье про fail2ban на Ubuntu 24.04.

Отдельно стоит подумать, нужен ли сервис вообще публично. Если PrivateBin ставится для внутренней команды (обмен секретами, конфигами, токенами между разработчиками), логичнее закрыть его VPN-туннелем или ограничить доступ по IP через Nginx (allow/deny), а не выставлять наружу открытым HTTPS-эндпоинтом — риск в этом случае не в шифровании содержимого, а в самой возможности заспамить сервис или устроить перебор ID вставок.

Резервные копии — только директория data/ и файл cfg/conf.php, ключей шифрования на сервере нет и бэкапить их не нужно (их и не существует отдельно от ссылок, которые уже разошли пользователям). Если нужна автоматизация регулярных снапшотов, подойдёт BorgBackup — инкрементальные бэкапы с дедупликацией забирают только изменения.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

Частые вопросы

Чем PrivateBin отличается от обычного pastebin вроде Pastebin.com?

Тем, что шифрование происходит в браузере до отправки на сервер. Классический pastebin хранит текст в открытом виде (или шифрует его сам, зная ключ) — администратор такого сервиса технически может прочитать любую вставку. У PrivateBin ключ никогда не покидает клиент, поэтому даже полный доступ к серверу не даёт прочитать содержимое без ссылки с фрагментом.

Что будет, если получатель откроет одноразовую ссылку дважды?

Второй запрос вернёт ошибку — вставка с опцией «сжечь после прочтения» удаляется на сервере сразу после первой успешной расшифровки. Если нужна возможность открыть текст повторно (например, сверить его через день), не включайте burn-after-reading, а используйте вставку с ограничением по времени.

Можно ли восстановить текст, если потеряна только часть ссылки?

Нет. ID вставки (часть до #) без ключа (часть после #) бесполезен — сервер отдаст только шифротекст. Это не баг и не недоработка бэкапа, а прямое следствие модели «сервер ничего не знает»: потерянная ссылка равносильна утраченному тексту.

Нужна ли база данных для PrivateBin?

Нет, для одного сервера штатно используется файловое хранилище — никакой отдельной установки MySQL или PostgreSQL не требуется. СУБД-бэкенд имеет смысл только при развёртывании нескольких инстансов PrivateBin за общим балансировщиком с общим хранилищем.

Как ограничить, кто может создавать новые вставки?

Кроме [traffic] в conf.php, который тормозит частые запросы с одного IP, можно закрыть создание вставок (POST /) на уровне Nginx через allow/deny по IP или вынести весь сервис за VPN — тогда сама возможность обратиться к серверу будет только у своих.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →