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

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

Команда 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