Как сменить пользователя в postgresql
Если вывод выглядит, как у меня на картинке, то postgresql установлен. Если нет «Repo : installed» , то придется установить. Стоит обратить внимание, на то что, если вы устанавливали posgresql вместе с осью сразу, то в некоторых дистрибутивах за вас уже все сделали и инициализировать базу не нужно, пропускаем эти манипуляции ! Остается только настроить под себя, создать пароль на локального пользователя postgres и создать пароль на администратора базы данных postgres, через утилиту «psql», описание процедуры находится ниже. Вернемся к установке, в консоли от root , вводим :
#yum install postgresql
#yum install qt3-PostgreSQL
установив все зависимости , yum спросит про установить или нет , отвечаете «Y» , пакеты установятся. В самом низу будет виден результат. Вообще , если есть необходимость использовать весь пакет postgresql, то рекомендую установить его так :
#yum install postgresql*
#yum install qt3-PostgreSQL
В результате будет установлены все пакеты, начинающиеся на имя «postgresql» и пакет «qt3-PostgreSQL». Все делается от пользователя root. Убеждаемся всегда о положительном завершении процедуры установки. Теперь у вас проинсталлирован postgresql, но не стоит спешить его запускать, даже если он и запуститься по команде
#service postgresql start
То скорей всего, выдаст ошибку, так как мы еще не создали «template1» базы. От греха подальше перегружаем систему, смотрим, что у нас стартует, выдает ошибки или нет. Убедившись , что установка не внесла проблемных изменений, конфликтов и возвращаемся крутить postgresql дальше. Необходимо инициализировать сервер и базы данных для работы с ними от пользователя postgres.
#su root вводим пароль пользователя root
Переходим в каталог var/lib/pgsql/data , для этого вводим:
#cd /var/lib/pgsql/data/
#ls (вывод имеющихся файлов )
Если в этой папке присутствуют, какие нить файлы, базы данных, то лучше все зачистить, для большей наглядности рекомендую это сделать с помощью файлового менеджера «MC»:
#mc /var/lib/pgsql/data/ Переходим в каталог, выделяем все файлы с помощью клавиши "Insert" и нажимаем "F8".
Если «MC» еще не установлен, то рекомендую его проинсталлировать , так как для начинающего пользователя это палка-выручалка номер один . Тем более что установить его не сложно:
#yum install mc (он вам еще пригодится, особенно если не стоит ни каких Х-ов)
Входим в консоль пользователем «postgres», который был автоматически создан при установке и вводим команду создания необходимых файлов баз данных и инициализации сервера.
#su postgres
bash-4.1$initdb -D /var/lib/pgsql/data
Получится вывод как на скрине:
Базы данных инициализируются для пользователя «postgres». Не думаю, что вы часто будете сидеть под пользователем «root», это не совсем корректно! После рекомендую запустить «Postgresql» через команду от root:
#service postgresql start
Вывод должен быть положительным ! Так сразу будет ясно, стартанет ли наш сервер при загрузке системы. Добавим в автозагрузку , для наглядности , через команду:
#setup
Установим пароль для локального пользователя «postgres»:
#passwd postgres
Пароль рекомендую установить ! И чем сложней, тем лучше, это поможет вам избежать некоторых проблем с безопасностью! )))
Смена пароля администратора баз данных postgres, пароль администратора должен быть установлен, иначе сторонние приложения не будут взаимодействовать с базами данных, да и безопасности прибавит, что не лишне при работе с серверами баз данных:
#su postgres
bash-4.1$psql
postgres=#\password postgres
Не забываем подправить конфиг под себя ! Дело в том, что по умолчанию нет аутентификации локальных пользователей, а так же нет возможности использовать posgresql server для сетевого использования. Локальные пользователи подключаются свободно, что необходимо подправить. Открываем для редактирования конфигурационный файл /var/lib/pgsql/data/pg_hba.conf и приводим его в такой вид , как на картинке:
Теперь локальные пользователи проходят аутентификацию по паролю в md5 . Если необходимо , чтобы к серверу подключались из сети или определенного узла, то добавляем свои правила подобные локальным пользователям. Стоит лишний раз подумать про безопасность соединении к базе, так как если не шифровать трафик, то он спокойно может быть перехвачен. Ну и фаервол (на Федоре это iptables , мощный и могучий, главное держать талмут под рукой и понимать как он работает) стоит под настроить , под доступ к серверу баз данных только с тех хостов , которым он разрешен.
Для более глубокого изучения рекомендую хорошо погуглить данный вопрос, а лучше почитать полную документацию на http://postgresql.ru.net/. С помощью данной статьи вы получаете работоспособный postgresql, а статья используется мной как напоминалака в случаи, когда что то позабылось ). Для соответствующих программ нужно установить соответствующие модули, обычно описаны в readme к программе. Успешной вам настройки и использования pstgresql.
Создание нового пользователя и управление его правами.
Добавить нового пользователя можно командой :
postgres=#CREATE USER имя_пользователя PASSWORD 'пароль'; (в ответ: «CREATE ROLE», что говорит о положительном результате).
Если есть надобность сделать обычного пользователя «суперпользователем» , то вводим
postgres=#ALTER USER 'имя_пользователя' SUPERUSER; (в случае успеха получаем ответ ALTER ROLE).
Отменяем права супер пользователя:
postgres=#ALTER USER 'имя_пользователя' NOSUPERUSER; (в случае успеха получаем ответ ALTER ROLE).
«ALTER USER» очень полезная команда, она позволяет выставить права пользователям, те , которые они заслужили. Далее чуть приведу информации по данному аператору с «postgresql.ru.net», которая понадобится почти каждому, да и вообщем очень рекомендую ознакомиться с содержанием данного сайта, особенно если решили серьезно заняться этим делом ) .
ALTER USER ALTER USER Имя_пользователя [ [ WITH ] option [ . ] ]
SUPERUSER | NOSUPERUSER - Как говорилось выше , дать или отнять прова суперпользователя. CREATEDB | NOCREATEDB - Дать разрешение создавать или запретить создавать базы данных пользователю. CREATEROLE | NOCREATEROLE - Дать пользователю возможность создавать роли доступа. CREATEUSER | NOCREATEUSER - Дать возможность пользователю создавать других пользователей или отнять данную привилегию.
ALTER USER Имя_пользователя RENAME TO Новое _имя_пользователя - Переименовать одного пользователя в другого.
Проверяем наличие пользователей, которые могут работать с базами данных:
postgres=#\du (в выводе будет список пользователей с их разрешениями).
Вход под желанным пользователем, по умолчанию вход производится от пользователя «postgresql»:
bash-4.1$psql –U имя_пользователя
Создание базы данных и управление ими.
Создание базы данных можно сделать двумя способами:
1. Меняем пользователя на Postgres:
#su postgres
bash-4.1$createdb Имя_создаваемой_базы
bash-4.1$exit
2. Надо сменить пользователя на Postgres и запустить утилиту psql.
#su postrges
bash-4.1$psql
postgres=#CREATE DATABASE имя_базы ;
Вывод существующих баз данных производится по команде:
postgres=#\l
Для того чтобы созданный пользователь мог работать с определенной базой данных , нужно изменить права доступа к данной базе данных и дабы все происходило нормально отдать эту базу данных во владения этому пользователю! Проделываем следующие шаги:
postgres=#\q (выход из утилиты psql , если вы еще не выходили)
Следующая команда выполняется от пользователя «postgres», так что если что входим :
#su postgres
bash-4.1$psql имя_базы (вход в утилиту с редактированием нужной базы данных)
здесь будет имя базы=# GRANT ALL PRIVILEGES ON DATABASE имя_базы TO имя_пользователя;
Ответ : GRANT
postgres=#\q
bash-4.1$psql
postgres=#ALTER DATABASE имя_базы_данных owner to Имя_пользователя кому отдать базу данных ;
postgres=#\l - Смотрим вывод и кому чего принадлежит.
После данных действий пользователь получает права на базу данных и получает ее в свое пользование. Обычно этого с головой достаточно. Не забываем ставить знак « ; », там, где он стоит у меня при вводе команд, если вдруг подзабыли или пропустили – не страшно, поставьте на следующей строке и нажмите ввод. Выйти из утилиты psql можно командой:
postgres=#\q
Удаление ненужной базы данных:
#su postgres
bash-4.1$ dropdb Имя_удоляемой_базы_данных
или
bash-4.1$ psql
postgres=# DROP DATABASE Имя_удаляемой базы данных; в ответ "DROP DATABASE"
Бывает ситуация, когда по какой то причине захотелось глянуть, а не появилось ли в базе данных каких нить данных ), и нам на помощь прийдет:
#su postgres
bash-4.1$psql Имя_Базы_данных
Сдесь_будет_имя_базы_данных =# \d - и мы получаем вывод таблиц из данной базы данных.
Резервное копирование и восстановление отдельных баз данных.
Резервная копия отдельной базы данных производится с помощью «pg_dump«.
Утилита очень проста в использовании, но перед использованием нужно создать каталог для резервных копий и дабы не путаться создать отдельную папку для резервного копирования индивидуальной базы.
#mkdir /home/rezervdb
#mkdir /home/rezervdb/Имя_базы_данных
#chown -R postgres: /home/rezervdb
Так как мы не работаем под пользователем root с базами данных , то входим под пользователем postgres:
#su postgres
pg_dump Имя_базы_данных > /home/rezervdb/Имя_базы_данных/Имя_базы.pgdump
Вводим пароль пользователя postgres, после чего проверяем создания копии базы:
bash-4.1$cd /home/rezervdb/Имя_базы_данных/
bash-4.1$ls - В выводе видим нашу свеж созданную копию базы данных.
Восстановить, переименовать, переместить проще простого : bash-4.1$ cat /home/Имя_базы_данных/Имя_базы.pgdump | psql Имя_базы
Если нам нужно создать и сразу заархивировать копию базы данных, что бывает очень полезно при больших по объему базах данных, то используем стандартные средства:
bash-4.1$pg_dump Имя_базы_данных | gzip > /home/rezervdb/Имя_базы_данных/Имя_базы.dump.gz
Восстанавление, переименование, перемещение:
bash-4.1$gunzip -c /home/rezervdb/Имя_базы_данных/Имя_базы.dump.gz | psql Имя_базы_данных_в_которую_востанавливаем
Резервное копирование и восстановление всего в один клик ).
# mkdir /home/rezervdb/postgres
#chown -R postgres: /home/rezervdb
#su postgres
bash-4.1$pg_dumpall > /home/rezervdb/postgres/db.out
Для востановления:
#su postgres bash-4.1$psql -f /home/rezervdb/postgres/db.out postgres
И на последок , если вы запутались, ни кто не отменял помощь из консоли ))) :
postgres-#\?
Выведит помощь по командам и их синтаксису, а ввод допустим:
postgres-#\h CREATE
Управление пользователями PostgreSQL
Для доступа к базам данных в кластере PostgreSQL создаются пользователи.
Чтобы создать базу данных в кластере, нужно сначала создать пользователя.
Пользователям для работы доступен только сам кластер — доступа к нодам кластера нет, так как они находятся на стороне Selectel. По умолчанию у всех пользователей в кластере одинаковые права.
К одной базе данных PostgreSQL можно выдать доступ нескольким пользователям, но владелец базы данных может быть только один. На объекты базы данных пользователям можно выдавать привилегии.
Владелец базы данных
При создании базы данных PostgreSQL нужно выбрать пользователя-владельца.
Владелец базы данных PostgreSQL — это пользователь, которому переходят права владения объектами удаленных пользователей. После удаления пользователя вы не потеряете доступ к объектам, которые он создал, а сможете управлять ими через владельца. В отличие от пользователя, владелец базы данных имеет доступ ко всем ее объектам и может совершать операции с ними.
Создать пользователя
- В панели управления перейдите в раздел Облачная платформа → Базы данных.
- Откройте страницу кластера баз данных → вкладка Пользователи.
- Нажмите Создать пользователя.
- Введите имя и пароль. Сохраните пароль — в панели управления он храниться не будет.
- Нажмите Сохранить.
Изменить пароль пользователя
После создания кластера пароль пользователя можно изменить. Не забудьте изменить пароль в своем приложении.
- В панели управления перейдите в раздел Облачная платформа → Базы данных.
- Откройте страницу кластера → вкладка Пользователи.
- В меню ( ) пользователя выберите Изменить пароль.
- Введите или сгенерируйте новый пароль и сохраните изменения.
Настроить доступ к базе данных
Выдать доступ пользователю
К одной базе данных PostgreSQL можно выдать доступ нескольким пользователям.
- В панели управления перейдите в раздел Облачная платформа → Базы данных.
- Откройте страницу кластера баз данных → вкладка Базы данных → страница базы данных.
- В блоке Имеют доступ нажмите Добавить и выберите пользователя.
Пользователь может только подключиться к базе данных ( CONNECT ) и не может выполнять операции с объектами. Чтобы дать пользователю доступ к объектам, выдайте ему нужные привилегии.
Изменить владельца базы данных
Владелец базы данных PostgreSQL назначается при ее создании. Владельца нельзя удалить (у каждой базы должен быть владелец), но его можно сменить на другого.
- В панели управления перейдите в раздел Облачная платформа → Базы данных.
- Откройте страницу кластера баз данных → вкладка Базы данных → страница базы данных.
- В списке Владелец базы выберите другого владельца.
Удалить доступ для пользователя
- В панели управления перейдите в раздел Облачная платформа → Базы данных.
- Откройте страницу кластера баз данных → вкладка Базы данных → страница базы данных.
- В блоке Имеют доступ удалите пользователя.
Настроить привилегии пользователя
У владельца базы данных есть доступ к операциям над любыми объектами базы данных (схемам, таблицам, функциям). По умолчанию владельцы объекта имеют доступ и все права на объект. Другим пользователям можно выдать привилегию (право доступа) на объект.
В базах данных версии PostgreSQL 14 и ниже, пользователям по умолчанию предоставляется привилегия CREATE на схему public . В PostgreSQL 15 предоставляется только привилегия CONNECT , варианты действий описаны в разделе Usage Patterns документации PostgreSQL.
Выдать привилегии
Выдать пользователям привилегии на объекты базы данных можно с помощью команды GRANT. Привилегии могут быть следующими: SELECT , INSERT , DELETE , USAGE .
Пример выдачи доступа на чтение ( SELECT ) к таблице table пользователю user :
GRANT SELECT ON table TO user;
Создать пользователя схемы с правами только на чтение
Вы можете создать пользователя с доступом к базе данных кластера, к таблице в схеме по умолчанию и ко всем таблицам схемы.
Автоматически все новые таблицы будут создаваться с доступом только на чтение (read-only) для этого пользователя.
- Создайте пользователя.
- Подключитесь к базе данных.
- Создайте схему schema и таблицу table :
CREATE SCHEMA schema; CREATE TABLE schema.table(i int); INSERT INTO schema.table(i) values(1);
GRANT USAGE ON SCHEMA schema TO user; GRANT SELECT ON ALL TABLES IN SCHEMA schema TO user; ALTER DEFAULT PRIVILEGES IN SCHEMA schema GRANT SELECT ON TABLES TO user;
Отозвать привилегии
Отозвать у пользователя привилегии можно с помощью команды REVOKE.
Пример отзыва привилегии у пользователя user на схему schema :
REVOKE USAGE ON SCHEMA schema FROM user;
Использование ролей и управление доступом в PostgreSQL
PostgreSQL – это открытая система управления базами данных (СУБД), основанная на языке запросов SQL. PostgreSQL – очень производительный инструмент, предназначенный для систематизации и хранения данных приложения.
Данное руководство научит вас управлять правами доступа PostgreSQL.
Примечание: Руководство выполнено на облачном сервере Ubuntu 12.04, однако все инструкции, кроме раздела по установке, можно применить и в других современных дистрибутивах Linux.
Установка PostgreSQL
Если СУБД PostgreSQL не была установлена ранее, установите её сейчас. Для этого используйте команды:
sudo apt-get update
sudo apt-get install postgresql postgresql-contrib
Во время установки PostgreSQL создает стандартного пользователя для работы. Перейдите в сессию этого пользователя.
sudo su — postgres
Права доступа PostgreSQL
PostgreSQL управляет доступом при помощи так называемых ролей.
Роли похожи на обычные системные права доступа Unix, однако, в отличие от Unix, они не делятся на пользователей и группы.
Роли могут быть членами других ролей, что позволяет им наследовать параметры привилегий определённых ранее ролей.
Просмотр ролей
Чтобы просмотреть существующие роли PostgreSQL, нужно открыть командную строку СУБД:
а затем ввести команду:
\du
List of roles
Role name | Attributes | Member of
————+————————————————+————
postgres | Superuser, Create role, Create DB, Replication | <>
Как видите, после установки в PostgreSQL существует всего одна роль, которая обладает широкими правами доступа.
Создание ролей PostgreSQL
Существует два базовых способа создания ролей: в командной строке PostgreSQL и в командной строке системы.
Создание роли в PostgreSQL
Проще всего создавать новые роли в командной строке PostgreSQL.
Для этого используется следующий синтаксис:
CREATE ROLE new_role_name;
Попробуйте создать новую роль (в руководстве она условно называется demo_role):
CREATE ROLE demo_role;
CREATE ROLE
Проверьте список существующих ролей:
\du
List of roles
Role name | Attributes | Member of
————+————————————————+————
demo_role | Cannot login | <>
postgres | Superuser, Create role, Create DB, Replication | <>
Как видите, в списке появилась новая роль. Обратите внимание: на данный момент у неё нет привилегий входа.
Создание роли в командной строке системы
Также можно создать роль при помощи команды createuser.
Закройте командную строку PostgreSQL:
Чтобы создать роль в командной строке системы, введите следующую команду (в руководстве эта роль будет условно называться test_user):
createuser test_user
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) n
Shall the new role be allowed to create more new roles? (y/n) n
Команда задаст ряд вопросов, которые определят начальные привилегии данной роли.
Снова откройте командную строку Postgres и запросите список существующих ролей:
psql
\du
List of roles
Role name | Attributes | Member of
————+————————————————+————
demo_role | Cannot login | <>
postgres | Superuser, Create role, Create DB, Replication | <>
test_user | | <>
Как видите, роли, созданные разными методами, не идентичны. Роль, созданная в командной строке системы, имеет привилегии входа.
Удаление ролей PostgreSQL
Теперь попробуйте уровнять привилегии ролей demo_role и test_user. Это можно сделать во время создания роли (то есть нужно удалить и заново создать demo_role). Также можно просто отредактировать привилегии существующей роли.
Но прежде чем приступить к управлению привилегиями PostgreSQL, нужно научиться удалять роли.
Для этого используется следующий синтаксис:
DROP ROLE role_name;
Delete the «demo_role» role by typing:
DROP ROLE demo_role;
DROP ROLE
Если заданной в команде роли не существует, команда вернёт ошибку:
DROP ROLE demo_role;
ERROR: role «demo_role» does not exist
Оператор IF EXISTS позволяет избежать этой ошибки; команда с таким оператором удалит роль, если она существует. Если указанной роли нет, команда не вернёт ошибку.
DROP ROLE IF EXISTS role_name;
То есть, в любом случае команда будет выполнена успешно и не вернёт ошибку.
DROP ROLE IF EXISTS demo_role;
NOTICE: role «demo_role» does not exist, skipping
DROP ROLE
Определение привилегий во время создания роли
Теперь попробуйте снова создать роль demo_role, заранее установив её права доступа. Права роли можно указать сразу после главного оператора create.
Синтаксис выглядит так:
CREATE ROLE role_name WITH optional_permissions;
Полный список опций доступа можно просмотреть при помощи команды:
Чтобы у пользователя, связанного с этой ролью, были привилегии входа, введите:
CREATE ROLE demo_role WITH LOGIN;
CREATE ROLE
Проверьте список существующих ролей и обратите внимание на то, что теперь обе роли имеют одинаковые привилегии:
\du
List of roles
Role name | Attributes | Member of
————+————————————————+————
demo_role | | <>
postgres | Superuser, Create role, Create DB, Replication | <>
test_user | | <>
Чтобы роль имела права входа без аргумента login, используйте вместо CREATE ROLE такую команду:
CREATE USER role_name;
Команда CREATE USER отличается только тем, что автоматически даёт роли привилегии входа.
Управление правами роли PostgreSQL
Чтобы изменить права доступа уже существующей роли, используйте команду ALTER ROLE.
Её базовый синтаксис:
ALTER ROLE role_name WITH attribute_options;
Для примера попробуйте вернуть роли demo_role её исходные привилегии:
ALTER ROLE demo_role WITH NOLOGIN;
ALTER ROLE
Просмотрите список ролей:
\du
List of roles
Role name | Attributes | Member of
————+————————————————+————
demo_role | Cannot login | <>
postgres | Superuser, Create role, Create DB, Replication | <>
test_user | | <>
Теперь у роли demo_role нет привилегий входа.
Вернуть привилегии входа можно при помощи команды:
ALTER ROLE demo_role WITH LOGIN;
Смена пользователя PostgreSQL
По умолчанию пользователи могут входить только локально, если имя системного пользователя совпадает с именем роли PostgreSQL.
Чтобы изменить это поведение, можно изменить тип входа или настроить PostgreSQL для прослушивания локального интерфейса (это изменит тип подключения на удалённый).
Рассмотрим второй вариант.
Для начала нужно установить пароль для пользователя, в сессию которого нужно перейти.
Установите пароль для test_user:
Команда предложит ввести и подтвердить пароль. Затем закройте интерфейс PostgreSQL и вернитесь в сессию системного пользователя.
По умолчанию PostgreSQL подразумевает, что для входа будет использоваться роль, одноименная системному пользователю, и что такая роль будет подключаться к одноименной базе данных.
Но в данном случае это не так, потому нужно явно указать опции. Для этого используйте синтаксис:
psql -U user_name -d database_name -h 127.0.0.1 -W
Примечание: Вместо user_name укажите имя пользователя, при помощи которого нужно установить соединение; вместо database_name укажите имя БД, к которой нужно подключиться.
Оператор -h 127.0.0.1 указывает, что нужно подключиться к локальной машине по сетевому интерфейсу. Это позволит проходить аутентификацию, даже если имя пользователя и имя роли не совпадают. Флаг –W значит, что при входе в PostgreSQL нужно ввести пароль.
Чтобы открыть сессию пользователя test_user, введите:
psql -U test_user -d postgres -h 127.0.0.1 -W
Password for user test_user:
Программа запросит установленный ранее пароль.
Примечание: Данная команда подключит пользователя к БД postgres, стандартной БД, созданной во время установки.
Попробуйте поработать в этой сессии; как видите, данный пользователь имеет довольно узкие привилегии.
Вернитесь в сессию администратора:
\q
sudo su — postgres
psql
Управление привилегиями PostgreSQL
Как передать привилегии
Как правило, при создании БД или таблицы права доступа к ней есть только у создавшей её роли. Но такое поведение можно изменить.
Передавать права доступа другим ролям можно при помощи команды GRANT; её базовый синтаксис:
GRANT permission_type ON table_name TO role_name;
Для примера создайте таблицу:
CREATE TABLE demo (
name varchar(25),
id serial,
start_date date);
NOTICE: CREATE TABLE will create implicit sequence «demo_id_seq» for serial column «demo.id»
CREATE TABLE
\d
List of relations
Schema | Name | Type | Owner
———+————-+———-+———-
public | demo | table | postgres
public | demo_id_seq | sequence | postgres
(2 rows)
Теперь попробуйте передать некоторые права доступа к таблице demo роли demo_role (пусть это будет право на обновление, UPDATE).
GRANT UPDATE ON demo TO demo_role;
Чтобы передать полные права на таблицу, используйте оператор ALL:
GRANT ALL ON demo TO test_user;
Чтобы передать права доступа всем пользователям системы, вместо имени пользователя укажите PUBLIC:
GRANT INSERT ON demo TO PUBLIC;
Чтобы просмотреть назначенные привилегии доступа, введите:
\z
Access privileges
Schema | Name | Type | Access privileges | Column access privileges
———+————-+———-+—————————-+—————————
public | demo | table | postgres=arwdDxt/postgres +|
| | | demo_role=w/postgres +|
| | | test_user=arwdDxt/postgres+|
| | | =a/postgres |
public | demo_id_seq | sequence | |
(2 rows)
Как отнять привилегии
Команда REVOKE отнимает привилегии.
REVOKE permission_type ON table_name FROM user_name;
Данная команда тоже может использовать операторы all и public.
REVOKE INSERT ON demo FROM PUBLIC;
Групповые роли PostgreSQL
PostgreSQL позволяет группировать роли, благодаря чему роли могут наследовать заранее установленные права доступа.
Для примера можно создать роль temporary_users и добавить в неё роли demo_role и test_user:
CREATE ROLE temporary_users;
GRANT temporary_users TO demo_role;
GRANT temporary_users TO test_user;
Теперь групповая роль temporary_users управлят привилегиями ролей demo_role и test_user.
Чтобы просмотреть сведения о принадлежности ролей можно с помощью команды:
\du
List of roles
Role name | Attributes | Member of
——————+————————————————+——————-
demo_role | |
postgres | Superuser, Create role, Create DB, Replication | <>
temporary_users | Cannot login | <>
test_user | |
Команда set role позволяет выбрать групповую роль, права которой нужно использовать.
Например, текущий пользователь postgres имеет права суперпользователя. Даже несмотря на то, что этот пользователь не является членом роли temporary_users, он может использовать её права:
SET ROLE temporary_users;
Теперь любая созданная таблица будет принадлежать групповой роли temporary_users.
CREATE TABLE hello (
name varchar(25),
id serial,
start_date date);
Просмотреть владельцев таблиц можно с помощью команды:
\d
List of relations
Schema | Name | Type | Owner
———+—————+———-+——————
public | demo | table | postgres
public | demo_id_seq | sequence | postgres
public | hello | table | temporary_users
public | hello_id_seq | sequence | temporary_users
(4 rows)
Как видите, новая таблица принадлежит роли temporary_users.
Чтобы вернуть оригинальные права текущей роли, введите:
Чтобы передать пользователю привилегии всех ролей, членом которых он является, используйте команду:
ALTER ROLE test_user INHERIT;
Чтобы удалить групповую роль (или любую роль), используйте:
DROP ROLE temporary_users;
ERROR: role «temporary_users» cannot be dropped because some objects depend on it
DETAIL: owner of table hello
owner of sequence hello_id_seq
Эта команда вернёт ошибку, потому что роли temporary_users принадлежит таблица. Сначала нужно передать права на таблицу другой роли:
ALTER TABLE hello OWNER TO demo_role;
Теперь роль таблица принадлежит роли demo_role.
\d
List of relations
Schema | Name | Type | Owner
———+—————+———-+————
public | demo | table | postgres
public | demo_id_seq | sequence | postgres
public | hello | table | demo_role
public | hello_id_seq | sequence | demo_role
(4 rows)
После этого роль temporary_users можно удалить:
DROP ROLE temporary_users;
Это удалит роль temporary_users; члены этой групповой роли не будут удалены.
Заключение
Теперь у вас есть базовые навыки работы с привилегиями PostgreSQL. Управление правами доступа – очень важный аспект работы с данными; это позволяет каждому приложению использовать только необходимые ему данные, не вмешиваясь в работу других приложений.
Как войти под пользователем?
Я установил postgres9. далее работаю с ним через командную строку. Моя ОС linux mint 18.
После установки postgres, в ОС создался пользователь postgres, о чем говорит запись в /etc/passwd:
postgres:x:123:132:PostgreSQL administrator. /var/lib/postgresql:/bin/bash
Теперь я хотел бы создать пользователя postgres и работать под ним, а не под суперпользователем. Для этого я зашел в postgres под суперпользователем:
sudo -u postgres psql
и создал нового пользователя, новую БД, дал права пользователю на эту БД:
postgres=# CREATE USER user1 WITH PASSWORD 'qwerty1'; CREATE ROLE
postgres=# CREATE DATABASE database1; CREATE DATABASE
postgres=# GRANT ALL PRIVILEGES ON DATABASE database1 to user1; GRANT
postgres=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+-------------+-------------+----------------------- database1 | postgres | UTF8 | ru_RU.UTF-8 | ru_RU.UTF-8 | =Tc/postgres + | | | | | postgres=CTc/postgres+ | | | | | user1=CTc/postgres
Далее я выхожу из аккаунта суперпользователя и пытаюсь залогиниться под пользователем user1, но не получается:
postgres=# \q (ven) md@md ~/.MINT18/code/python/project0/ven/bin $ sudo -u user1 psql sudo: неизвестный пользователь: user1 sudo: не удаётся инициализировать модуль политики
Подскажите пожалуйста в чём проблема и можно ли это исправить?
- Вопрос задан более трёх лет назад
- 13022 просмотра
1 комментарий
Простой 1 комментарий
zlodiak @zlodiak Автор вопроса
Bacon, а разве в 12 процедура входа под определённым пользователем сильно изменилась?
Решения вопроса 1
PostgreSQL DBA
sudo — запуск команды от имени пользователя ОС.
Пользователь ОС не имеет совсем ничего общего с пользователем в БД. Пользователя ОС вы не создали, ответ sudo закономерен.
Для использования psql sudo не нужен. Нужны настройки pg_hba.conf и сам psql. Например, psql -U user1 database1
Ответ написан более трёх лет назад
Нравится 1 5 комментариев
zlodiak @zlodiak Автор вопроса
Не получается. В соответствии с документацией я добавил в файл
/etc/postgresql/9.5/main/pg_hba.conf
строку
local database1 user1 trust
и снова попробовал зайти:
(ven) md@md ~/.MINT18/code/python/project0/ven/bin $ psql -U user1 database1 psql: FATAL: Peer authentication failed for user "user1" (ven) md@md ~/.MINT18/code/python/project0/ven/bin $
reload базе скомандовали?
Vitsliputsli @Vitsliputsli
Пользователь ОС не имеет совсем ничего общего с пользователем в БД.
Не совсем так, судя по ошибке «Peer authentication failed», у автора включена как раз аутентификация через пользователя ОС, т.е. PostgreSQL ищет и проверяет пароль пользователя в ОС.
Хотя он вроде пытался изменить это, значит либо ошибка в pg_hba.conf, либо не было reload.
ищет и проверяет пароль пользователя в ОС
Это неправда.
Метод peer вовсе не проверяет какой-либо пароль и даже не получает его по fe протоколу от клиента. Это лишь проверка соответствия символьного имени unix пользователя от имени которого выполняется подключение по unixsock на пользователя в базе.
https://github.com/postgres/postgres/blob/REL_11_S.
Что не противоречит утверждению
Пользователь ОС не имеет совсем ничего общего с пользователем в БД.
Это разные сущности, peer лишь проверяет совпадение имени. Пароли могут разные. пользователя может не быть на какой-то из сторон и т.д.
hba же необходимо смотреть целиком, от позиции строки в списке правил результат может меняться. Правила проверяются строго по порядку и применяется только первое совпадающее. Так если сначала сделать local all all peer а затем local all all trust — второе правило никогда не сработает.