Делая свой первый ДАМП базы данных в PostgreSQL на Debian-сервере, можно столкнуться с проблемой «Отказано в доступе (Permission denied)«.
В терминале Debian мы вводим команды от пользователя postgres, который автоматически появляется в системе при установке PostgreSQL в Debian. Если попытаться сделать ДАМП от имени другого пользователя (например от «root«), то в таком случае мы будем получать ошибку вида «роль «root» не существует«.
Простая команда выгрузки базы данных для последующей загрузки в другое место выглядит примерно таким образом:
pg_dump tabletkadb > /var/www/tabletkadb.sql
В такой формулировке мы получаем отказ.
pg_dump — это название программы, которая будет сохранять нашу базу данных на диск в Debian.
tabletkadb — это название нашей базы данных в СУБД PostgreSQL, которая живёт в Debian.
> — это стрелочка, указывающая направление вывода информации (то есть «Куда нужно вывести ДАМП?»)
/var/www/tabletkadb.sql — это полный путь до файла от корня файловой системы в Debian, куда наш ДАМП должен сохраниться. Для удобства восприятия мы называем файл точно так же как называется база данных. Только к этому файлу добавляется расширение «.sql«.
Почему не получается сделать ДАМП базы данных в PostgreSQL при Отказе в доступе в папку «/var/www/«?
Если мы сейчас посмотрим на директорию, в которую пытаемся сохранить наш файл, то обнаружим, что права на запись файла в эту директорию имеются только у пользователя «root«. Это суперпользователь системы Debian, а значит никто другой не сможет ничего в неё записать(создать) кроме самого «root-пользователя«.
cd /var ls -l
Вывод такой:
Это значит, что в папке «/var/www/» создавать другие файлы и папки может только пользователь «root«.
Именно по этой причине мы получаем «Отказ в доступе«, потому что все остальные пользователи не являются владельцами данной директории, а также не имеют доступа на её изменение.
Как решить проблему доступа к папке «/var/www/» для пользователя postgres в Debian?
Мы можем создать в папке «/var/www/» ещё одну папку и задать для неё нужные права владения и доступа. Для простоты понимания называть её будем «postgres-dump-directory«.
Но для возможности её создания сперва нужно сменить пользователя в терминале на «root«, потому что сейчас только «root» имеет право создавать и получать.
su - root
Вводим пароль суперпользователя.
Затем создаём нужную директорию
mkdir /var/www/postgres-dump-directory/
Скриншот из программы FileZilla.
Права естественным образом унаследовались от её создателя.
Теперь нужно сменить владельца для данной директории.
chown -R postgres:postgres /var/www/postgres-dump-directory/
Смотрим обновлённый список директорий с правами:
ls -l /var/www
Вывод такой:
С этого момент мы можем сделать наш ДАМП в директорию «/var/www/postgres-dump-directory/» от пользователя postgres в терминале.
Снова меняем пользователя:
su - postgres
По-умолчанию, после установки PostgreSQL у пользователя postgres нет пароля, поэтому переход с root на postgres будет безпарольным.
Немного подправляем нашу команду:
pg_dump tabletkadb > /var/www/postgres-dump-directory/tabletkadb.sql
Да, это не «/var/www/«. Это сделано из соображений безопасности. Для директории «/var/www/» подходит пользователь www-data и группа www-data, который по сути является веб-сервером в операционной системе и который имеет возможность вносить изменения в нужные папки и файлы от лица веб-сервера (от лица nginx или apache).
Изменение прав для всей директории «/var/www/» с пользователя «www-data» на пользователя «postgres» опасно! Может повредить работоспособность сайтов. Имейте это ввиду.
Куда можно сделать ДАМП базы данных PostgreSQL без установки прав доступа в Debian?
При стандартной установке системы Debian и её программ, пользователь postgres имеет доступ к папке «/tmp«.
В эту временную папку можно делать ДАМПЫ из PostgreSQL.
Если посмотреть на права доступа для директории, то можно увидеть уникальную картину:
Код прав доступа для «/tmp» имеет значение «drwxrwxrwt«.
Среди всех папок и файлов в корневом каталоге, только «/tmp» имеет ключ «t» на конце в правах доступа. Что это означает?
drwxrwxrwt и что такое «липкий бит» в файловых системах UNIX? Когда он используется?
Его первоначальное использование состояло в том, чтобы дать ОС подсказку о том, что исполняемый файл должен быть кэширован в памяти, чтобы он загружался быстрее. Это использование в основном устарело, поскольку сейчас операционные системы довольно умны в таких вещах. На самом деле, я думаю, сейчас некоторые ОС используют это как намёк на то, что исполняемый файл не должен кэшироваться.
Наиболее распространённое использование сегодня — это создание каталога, в котором любой может создать файл, но только владелец файла в этом каталоге может удалить его. Традиционно, если у вас есть каталог, в который любой может писать, любой может также удалить из него файл. установка липкого бита в каталоге делает так, что только владелец файла может удалить файл из доступного для записи каталога.
Классическим использованием этого является каталог «/tmp» .
«t» в режиме — это и есть липкий бит. Если бы это не было установлено, обычному пользователю было бы довольно легко вызвать хаос, удалив все из «/tmp«. Поскольку многие демоны помещают сокеты в «/tmp«, это, по сути, будет локальной DOS.
Информационные ссылки
Раздел официальной документации «Выгрузка в SQL» — https://postgrespro.ru/docs/postgresql/15/backup-dump
Программа pg_dump — https://postgrespro.ru/docs/postgresql/15/app-pgdump
ОС Debian — Раздел «Управление правами» — https://www.debian.org/doc/manuals/debian-handbook/sect.rights-management.ru.html
ОС Debian — Закреплённый Бит (sticky bit) — https://wiki.debian.org/PermissionsOld
Команда cd — https://manpages.debian.org/bullseye/tcl8.6-doc/cd.3tcl.en.html
Команда chown — https://manpages.debian.org/bullseye/coreutils/chown.1.en.html
Команда mkdir — https://manpages.debian.org/bullseye/coreutils/mkdir.1.en.html
Команда su — https://manpages.debian.org/bullseye/util-linux/su.1.en.html
Команда ls — https://manpages.debian.org/bullseye/coreutils/ls.1.en.html