PostgreSQL | pg_dump Отказано в доступе (Permission denied) в Debian

PostgreSQL | pg_dump Отказано в доступе (Permission denied) в Debian

Делая свой первый ДАМП базы данных в PostgreSQL на Debian-сервере, можно столкнуться с проблемой «Отказано в доступе (Permission denied)«.

В терминале Debian мы вводим команды от пользователя postgres, который автоматически появляется в системе при установке PostgreSQL в Debian. Если попытаться сделать ДАМП от имени другого пользователя (например от «root«), то в таком случае мы будем получать ошибку вида «роль «root» не существует«.

Простая команда выгрузки базы данных для последующей загрузки в другое место выглядит примерно таким образом:

pg_dump tabletkadb > /var/www/tabletkadb.sql

В такой формулировке мы получаем отказ.

pg_dump Отказано в доступе (Permission denied) в Debian от пользователя postgres
pg_dump Отказано в доступе (Permission denied) в Debian от пользователя postgres

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 в Debian
Права на директорию var www для пользователя root в Debian

Это значит, что в папке «/var/www/» создавать другие файлы и папки может только пользователь «root«.

Именно по этой причине мы получаем «Отказ в доступе«, потому что все остальные пользователи не являются владельцами данной директории, а также не имеют доступа на её изменение.

 

Как решить проблему доступа к папке «/var/www/» для пользователя postgres в Debian?

Мы можем создать в папке «/var/www/» ещё одну папку и задать для неё нужные права владения и доступа. Для простоты понимания называть её будем «postgres-dump-directory«.

Но для возможности её создания сперва нужно сменить пользователя в терминале на «root«, потому что сейчас только «root» имеет право создавать и получать.

su - root

Вводим пароль суперпользователя.

Затем создаём нужную директорию

mkdir /var/www/postgres-dump-directory/

Скриншот из программы FileZilla.

Успешно создали директорию от root-пользоваетля в папке var www в Debian
Успешно создали директорию от root-пользоваетля в папке var www в Debian

Права естественным образом унаследовались от её создателя.

Теперь нужно сменить владельца для данной директории.

chown -R postgres:postgres /var/www/postgres-dump-directory/

Смотрим обновлённый список директорий с правами:

ls -l /var/www

Вывод такой:

Дали пользователю postgres права на изменение директории в var www postgres-dump-directory
Дали пользователю postgres права на изменение директории в var www postgres-dump-directory

 

С этого момент мы можем сделать наш ДАМП в директорию «/var/www/postgres-dump-directory/» от пользователя postgres в терминале.

Снова меняем пользователя:

su - postgres

По-умолчанию, после установки PostgreSQL у пользователя postgres нет пароля, поэтому переход с root на postgres будет безпарольным.

Делаем ДАМП в var www от имени postgres в Debian
Делаем ДАМП в var www от имени postgres в Debian

Немного подправляем нашу команду:

pg_dump tabletkadb > /var/www/postgres-dump-directory/tabletkadb.sql
ДАМП базы данных успешно сохранлся в одну из поддиректорий в var www в Debian
ДАМП базы данных успешно сохранлся в одну из поддиректорий в var www в Debian

Да, это не «/var/www/«. Это сделано из соображений безопасности. Для директории «/var/www/» подходит пользователь www-data и группа www-data, который по сути является веб-сервером в операционной системе и который имеет возможность вносить изменения в нужные папки и файлы от лица веб-сервера (от лица nginx или apache).

Изменение прав для всей директории «/var/www/» с пользователя «www-data» на пользователя «postgres» опасно! Может повредить работоспособность сайтов. Имейте это ввиду.

 

Куда можно сделать ДАМП базы данных PostgreSQL без установки прав доступа в Debian?

При стандартной установке системы Debian и её программ, пользователь postgres имеет доступ к папке «/tmp«.

В эту временную папку можно делать ДАМПЫ из PostgreSQL.

Если посмотреть на права доступа для директории, то можно увидеть уникальную картину:

Ключ -t- на конце прав доступа у папки tmp в Debian
Ключ -t- на конце прав доступа у папки tmp в Debian

Код прав доступа для «/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

Команда cdhttps://manpages.debian.org/bullseye/tcl8.6-doc/cd.3tcl.en.html

Команда chownhttps://manpages.debian.org/bullseye/coreutils/chown.1.en.html

Команда mkdirhttps://manpages.debian.org/bullseye/coreutils/mkdir.1.en.html

Команда suhttps://manpages.debian.org/bullseye/util-linux/su.1.en.html

Команда lshttps://manpages.debian.org/bullseye/coreutils/ls.1.en.html