Принцип наименьших привилегий (Principle of Least Privilege, PoLP) — фундаментальный принцип информационной безопасности: каждый субъект системы (пользователь, процесс, сервис) должен иметь только минимальный набор прав, необходимых для выполнения своей задачи, и не более.
Как работает
Принцип реализуется на нескольких уровнях. На уровне пользователей: веб-сервер работает от пользователя www-data без прав sudo, не может изменить системные файлы. На уровне процессов: Nginx мастер-процесс запускается от root (для привязки к порту 80), рабочие процессы — от www-data. На уровне сети: файервол разрешает только необходимые порты.
Применительно к базам данных: приложение подключается к MariaDB пользователем с правами только SELECT/INSERT/UPDATE на конкретных таблицах — не как root. SQL-инъекция при таких правах не может сделать DROP TABLE или прочитать системные таблицы.
История
Принцип сформулировал Джером Солцер совместно с Майклом Шредером в статье 1975 года «The Protection of Information in Computer Systems». Это одна из восьми фундаментальных принципов защиты систем. В 1980-х принцип PoLP стал обязательным требованием военных стандартов США (Orange Book, DoD). Современные реализации: SELinux, AppArmor, capabilities Linux, RBAC в Kubernetes.
Реализация на Linux-сервере
# Создать системного пользователя без shell и домашней директории
useradd -r -s /usr/sbin/nologin myapp
# Запустить сервис от этого пользователя (systemd unit)
[Service]
User=myapp
Group=myapp
# Linux capabilities: дать процессу только нужное
# Привязаться к порту 80 без root
setcap cap_net_bind_service=+ep /usr/bin/node
# Проверить capabilities
getcap /usr/bin/node
PoLP в контейнерах
Docker: добавление --no-new-privileges запрещает контейнеру повышать привилегии через setuid. --read-only монтирует файловую систему контейнера только для чтения. --cap-drop ALL --cap-add NET_BIND_SERVICE убирает все capabilities кроме необходимых.
В Kubernetes SecurityContext задаёт PoLP на уровне Pod: runAsNonRoot: true, allowPrivilegeEscalation: false, readOnlyRootFilesystem: true.
На что обращать внимание
Слишком жёсткие ограничения нарушают работу легитимных функций — находите баланс. Аудит прав раз в квартал: sudo -l, список пользователей с shell, SUID-файлы (find / -perm /4000). Компрометация сервиса с минимальными правами ограничивает ущерб одним приложением, не даёт root всей системы — основная ценность PoLP.
RBAC и управление доступом
Role-Based Access Control (RBAC) реализует PoLP через роли: пользователю назначается роль «developer» с правом деплоя, но без доступа к продакшен-базе данных. В Kubernetes: ServiceAccount получает только право читать ConfigMap в конкретном namespace. В MariaDB: роль app_readonly с SELECT на определённых таблицах.
Временные привилегии: вместо постоянного sudo права используйте sudo -l для просмотра разрешённых команд. HashiCorp Vault выдаёт временные (TTL: 1 час) credentials для баз данных — после истечения доступ автоматически отзывается. Это исключает утечку долгоживущих паролей.
Аудит прав
Регулярный аудит — неотъемлемая часть PoLP:
# Все пользователи с shell (не /usr/sbin/nologin)
grep -v nologin /etc/passwd | grep -v false
# Пользователи в группе sudo/wheel
getent group sudo
getent group wheel
# SUID-файлы (могут давать root-права)
find / -perm /4000 -type f 2>/dev/null
# Что может sudo текущий пользователь
sudo -l