Ошибка получения мандатных атрибутов на сервере для пользователя postgresql

Пытаюсь организовать подключение к postgres разных пользователей по сессиям и выдать разные права. Встал вопрос в том, что под суперпользователем вход проходит корректно, однако при отсутствии у учетки прав суперпользователя при входе выдает ошибку: Произошла ошибка: Error connecting to...

carrot


11.07.2018

Пытаюсь организовать подключение к postgres разных пользователей по сессиям и выдать разные права. Встал вопрос в том, что под суперпользователем вход проходит корректно, однако при отсутствии у учетки прав суперпользователя при входе выдает ошибку:

Произошла ошибка:

Error connecting to server: Сбой: Роль «%название роли, под которой пытаюсь выполнить вход%» не существует.

До этого выдавал ошибку:

Произошла ошибка:

Error connecting to server: Сбой: ошибка получения мандатных атрибутов на сервере пользователя «%название роли, под которой пытаюсь выполнить вход%»

Т.е. при входе с учетки test01 с правами суперпользователя он успешно входит в систему, даже если не были выданы мандатные права, однако, если убрать SUPERUSER, то вылетает одна из двух предыдущих ошибок

11.07.2018

1. Какой утилитой подключаетесь и с какими параметрами?
2. Есть учетная запись пользователя в системе и соответствующая роль в постгресе?

carrot


11.07.2018

1. Какой утилитой подключаетесь и с какими параметрами?
2. Есть учетная запись пользователя в системе и соответствующая роль в постгресе?

1. Подключаюсь при помощи pgAdmin III, так же использовал psql, всё тоже самое
2. Существует роль, так же создавал роль с названием как у системы. Нужно, чтобы всё было ориентированно на сервер, чтобы можно было авторизоваться под любой ролью

11.07.2018

Нужно, чтобы всё было ориентированно на сервер, чтобы можно было авторизоваться под любой ролью

Таким образом подразумевается что используется ALD. В таком случае ставим постгрес в соответствии с документацией для работы в ЕПП. Создаем ключи для постгреса в домене:

Код:

ald-admin service-add postgres/server.domain
ald-admin sgroup-svc-add postgres/server.domain
ald-client update-svc-keytab postgres/server.domain --ktfile="/etc/postgresql-common/krb5.keytab"
chown postgres /etc/postgresql-common/krb5.keytab

В pg_hba.conf вписываем строчку
host all all 10.0.0.0/8 gss сеть на свою меняем
В postgresql.conf меняем строчки:
ac_ignore_socket_maclabel = false
krb_server_keyfile = ‘/etc/postgresql-common/krb5.keytab’
listen_addresses = ‘*’
port = 5432

перезапускаем постгрес
service postgresql restart
Устанавливаем максимальные мандатные метки для СУБД
psql -U postgres -c "MAC LABEL ON TABLESPACE pg_default IS '{3,-1}';"

Дальше регистрируем учетную запись пользователя в ALD, назначаем мандатные уровни
регистрируем в постгресе роль с точно таким же логином
createuser -U postgres alduser
Создаем БД
createdb -U postgres test
Назначаем права для пользователя на эту БД:
psql -U postgres test -c «GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO alduser
Пробуем подключиться:
psql -h server.domain test

05.10.2018

Логи нужно смотреть. Если всё в точности сделали, то должно работать.
Перегружаться пробовали? :)

10.10.2018

Таким образом подразумевается что используется ALD. В таком случае ставим постгрес в соответствии с документацией для работы в ЕПП. Создаем ключи для постгреса в домене:

Код:

ald-admin service-add postgres/server.domain
ald-admin sgroup-svc-add postgres/server.domain
ald-client update-svc-keytab postgres/server.domain --ktfile="/etc/postgresql-common/krb5.keytab"
chown postgres /etc/postgresql-common/krb5.keytab

В pg_hba.conf вписываем строчку
host all all 10.0.0.0/8 gss сеть на свою меняем
В postgresql.conf меняем строчки:
ac_ignore_socket_maclabel = false
krb_server_keyfile = ‘/etc/postgresql-common/krb5.keytab’
listen_addresses = ‘*’
port = 5432

перезапускаем постгрес
service postgresql restart
Устанавливаем максимальные мандатные метки для СУБД
psql -U postgres -c "MAC LABEL ON TABLESPACE pg_default IS '{3,-1}';"

Дальше регистрируем учетную запись пользователя в ALD, назначаем мандатные уровни
регистрируем в постгресе роль с точно таким же логином
createuser -U postgres alduser
Создаем БД
createdb -U postgres test
Назначаем права для пользователя на эту БД:
psql -U postgres test -c «GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO alduser
Пробуем подключиться:
psql -h server.domain test

@kostia, не получается выполнить команду psql -U postgres -c «MAC LABEL ON TABLESPACE pg_default IS ‘{3,-1}’;», выдает «Вы не можете назначить мандатную метку с таким значением».
Я так понимаю, что пользователь postgres с меткой {0,0} не может задавать метку выше своей, но как тогда все-такие повышать метки сущностей в БД?

10.10.2018

А у вас какая версия посгреса? В астре 1.4 два постгреса, 9.2 и 9.3. Вот выше описанное работает на версии 9.3

10.10.2018

А у вас какая версия посгреса? В астре 1.4 два постгреса, 9.2 и 9.3. Вот выше описанное работает на версии 9.3

У меня Astra 1.6 и postgres 9.6. Думал, может принцип такой же для моей версии

carrot


26.12.2018

Решил проблему двумя строчками в терминал на сервере:

Код:

sudo useradd <Пользователь, которого мы хотим завести на сервере> -p <Пароль> -g postgres
sudo usermac -c 0:0 <Пользователь>

Первой строчкой создаем пользователя в системе, дабы он смог подключаться к базе данных
Второй строчкой решаем проблему с мандатными правами, выдавая минимальные

Теперь можно войти в базу при помощи данного пользователя

У меня Astra 1.6 и postgres 9.6. Думал, может принцип такой же для моей версии

Может вам это тоже поможет

17.01.2019

Добрый день!Коллеги, помогите пожалуйста!Буду очень благодарен.
Смоленск 1.6; Postgresql 9.6;
Установлен Apache2, авторизация через Kerberos настроена и работает. Проверял с другой машины.
Домен инициализирован. Два ALD занесены в списки доверенных у друг друга.

Задача: С другой машины авторизоваться под доменным пользователем в созданной базе на сервере,который находится на другой машине ALD.

Имя пользователя в postgres и ALD идентичны: alduser2. В конфиге тоже прописан он же. Метод gss.
Проблема: При попытке авторизации удалённо выдаёт ошибку: «пользователь не прошёл проверку (gssapi)»
Фото конфигурационных файлов прилагаю. Вроде всё сделал правильно. Не пойму,что не так?Удалял postgres устанавливал заново такая же ситуация.
krb_srvname если расскоментировать, то перестаёт работать совсем, порт перестаёт отвечать(принимать) запросы.
Локально я могу зайти, создал базу,добавил таблицу,пользователю alduser2 дал все права на БД и select для таблицы.
Помогите пожалуйста!

  • 20190117_114918.jpg

    1.3 МБ
    Просмотры: 630

  • 20190117_114937.jpg

    1.9 МБ
    Просмотры: 689

  • 20190117_115455.jpg

    2.3 МБ
    Просмотры: 655

  • 20190117_115505.jpg

    1.6 МБ
    Просмотры: 641

210 / 108 / 43

Регистрация: 12.12.2016

Сообщений: 381

1

Как под вновь созданным пользователем зайти в БД?

06.07.2018, 20:52. Показов 8142. Ответов 4


Создал в БД пользователя: bob. Добавил ему роль админ: SUPERUSER CREATEDB CREATEROLE.
Как теперь этим пользователем зайти в БД? В документации написано, что должен быть такой пользователь ОС — Боб. Создал, пытаюсь зайти — «ошибка получения мандатных атрибутов на сервере для пользователя bob».
Как решить проблему?



0



1187 / 917 / 367

Регистрация: 02.09.2012

Сообщений: 2,796

09.07.2018, 14:03

2

В вашей ОС активна мандатная система безопасности. Что там у Вас? SELinux, AppArmor, AstraLinux, ………
Ищите ответ в этом направлении, что и как пользователю ОС bob нужно разрешить, чтобы получать доступ к PG.



0



210 / 108 / 43

Регистрация: 12.12.2016

Сообщений: 381

09.07.2018, 18:52

 [ТС]

3

grgdvo, Астра Смоленск SE 1.5.
Нет информации нигде, а так что есть не работает.
Был вариант в политике безопасности у учетной записи, есть раздел мандатного доступа, во только как его настроить — непонятно. Нашел ссылку на РусБИТех вики, а она закрыта/удалена…

Добавлено через 19 минут
Кстати, тему переименовали…
Я указывал про Астру Смоленск.



0



1187 / 917 / 367

Регистрация: 02.09.2012

Сообщений: 2,796

10.07.2018, 00:22

4

Лучший ответ Сообщение было отмечено New Life как решение

Решение

Я думаю тщательный поиск в гугль должен решить проблему.
Например, вот здесь какая-то магия с доступом описана



1



210 / 108 / 43

Регистрация: 12.12.2016

Сообщений: 381

10.07.2018, 17:49

 [ТС]

5

grgdvo, спасибо большое, правда, вместо pdpl-user -z <username> использовал pdp-ulbls -l 0:3 <username>, заработало.



0



Использование ролей и управление доступом в PostgreSQL

Как видите, после установки в 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 | <>

Как видите, в списке появилась новая роль. Обратите внимание: на данный момент у неё нет привилегий входа.

[SOLVED] postgresql.service start error. Job for postgresql failed because process exited with error

Создание роли в командной строке системы

Также можно создать роль при помощи команды 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 и запросите список существующих ролей:

Как видите, роли, созданные разными методами, не идентичны. Роль, созданная в командной строке системы, имеет привилегии входа.

Удаление ролей 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

1.Роли базы данных, атрибуты ролей в POSTGRES

Определение привилегий во время создания роли

Теперь попробуйте снова создать роль 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. Управление правами доступа – очень важный аспект работы с данными; это позволяет каждому приложению использовать только необходимые ему данные, не вмешиваясь в работу других приложений.

Источник: www.8host.com

PostgreSQL: ошибка получения мандатных атрибутов

Проблема возникает с PostgreSQL 9.4 в Astra Linux Special Edition 1.5 при попытке подключения созданным пользователем:

«СБОЙ: ошибка получения мандатных атрибутов на сервере для пользователя»

Спросил Робот 13 ноября 2017 Вопрос просмотрен 16752 раз 16.75K просмотров 08.10.2020 Astra Linux SE Версия 1.5

5 ответов

Анонимный пользователь ответил 21 апреля 2019 0 комментариев

Для версии 1.6 это выглядит так.

Если возникает ошибка:

ошибка получения мандатных атрибутов на сервере для пользователя «replicator», ошибка 13 — Отказано в доступе

Значит не хватает прав доступа к каталогам. Нужно:

usermod -a -G shadow postgres
setfacl -d -m u:postgres:r /etc/parsec/macdb
setfacl -R -m u:postgres:r /etc/parsec/macdb
setfacl -m u:postgres:rx /etc/parsec/macdb
setfacl -d -m u:postgres:r /etc/parsec/capdb
setfacl -R -m u:postgres:r /etc/parsec/capdb
setfacl -m u:postgres:rx /etc/parsec/capdb

Если возникает ошибка:

ошибка получения мандатных атрибутов на сервере для пользователя «replicator», ошибка 2 — Нет такого файла или каталога

Нужно инициализировать мандатные права у вашего пользователя:

usermac -z пользователь

ilias_div 5 ответил 8 октября 2020 0 комментариев

Настройка «установить в файле /etc/parsec/mswitch.conf, параметр zero_if_notfound в yes» работает только для астры без домена ald. Если на астре настроена авторизаиця через домен, то после parsec запрашивается ald, если там одноименного пользователя тоже нет — то запрашивается kerberos, а поскольку он не настроен — то в postgres возвращается ошибка, и пользователь не подключается. В логе постгреса ошибки:

2020-10-07 18:32:03 [2684] АУДИТ: ОТКАЗ, Подключение, [local], «my_user», SU = «неопределено» (0), CU = «неопределено» (0): ошибка получения мандатных атрибутов на сервере для пользователя «my_user», ошибка 25 — Неприменимый к данному устройству ioctl

Как в таком случае заставить постгрес вести себя согласно доке и разрешить подключать пользователей, которые есть только в самом постгресе?

kraynopp 12 ответил 30 мая 2019 0 комментариев

Проблему удалось решить. Файл /etc/parsec/mswitch.conf, параметр zero_if_notfound установить в yes.

В этом случае все пользователи БД, для которых не удалось получить мандатные атрибуты, получат нулевую метку.

MasterAler 5 ответил 21 мая 2019 1 комментарий

setfacl -d -m u:postgres:r /etc/parsec/macdb

Вот это всё да, только без пробела — «u:postgres:r». Спасибо за ответ! Убивался с этими правами на каталоги довольно долго сейчас при переходе на новую версию.

И тем не менее. Господа, а, видимо, кто-то уже сталкивался со всем этим делом на Astra Linux 1.6 Smolensk?

На Astra Linux 1.5 при желании назначить пользователя, ассоциированного с ролью входа для PostgreSQL работало вот так:

pdp-ulbls -l 0:0 my_db_user
setfacl -R -m u:postgres:rx /etc/parsec/macdb
setfacl -R -m u:postgres:rx /etc/parsec/capdb

А теперь даже pdpl-user я вызывал (pdp-ulbls -l 0:0 -c 0:0x1) и как-то не захотело оно, применил вот этот, обсуждаемый рецепт, теперь надо наш deb-пакет править. Туда что, вот всю эту пачку команд загонять? Это нормально для Astra? А то выглядит костылём.

Источник: lab50.net

Как узнать под какой мандатной меткой выполняется запрос к PostgreSQL?

Мне необходимо в своей функции на PostgreSQL по разному обрабатывать данные полученные под разными мандатными метками. Но не могу найти, есть ли возможность из под постреса получить мандатную метку из под которой выполняется запрос к моей функции?

Отслеживать
задан 26 ноя 2019 в 15:01
384 1 1 серебряный знак 13 13 бронзовых знаков
У Вас обычный постгрес или генно-модифицированный создателями астры?
26 ноя 2019 в 15:19
26 ноя 2019 в 15:27

я правильно понимаю что Вы хотите внутри встроенной процедуры узнать macid юзера который сделал запрос по сети?

26 ноя 2019 в 15:30
26 ноя 2019 в 15:33

насколько я все это понимаю — метка прокидывается на уровне tcp соединения, если этот сервис запущен на той же машине что и бд и это сервис инициирует запросы к бд, то внутри постгеса вы узнаете мак метку этого сервииса..

Источник: ru.stackoverflow.com

psql: FATAL: ошибка идентификации пользователя «postgres»

Я установил PostgreSQL и pgAdminIII на свою коробку Ubuntu Karmic.

Я могу успешно использовать pgAdminIII (т.е. подключиться / войти в систему), однако, когда я пытаюсь войти на сервер, используя то же имя пользователя / pwd в командной строке (используя psql), я получаю сообщение об ошибке:

psql: FATAL: Ident authentication failed for user «postgres»

Кто-нибудь сейчас как решить эту проблему?

Это сообщение stackoverflow сработало для меня: stackoverflow.com/a/18664239/2110769

Вы установили правильные настройки в pg_hba.conf?

Это не работает для меня. Я потратил на это часы! Все, что я хочу сделать, это запустить команды psql в моем терминале. Что мне нужно, чтобы файл выглядел так, чтобы сделать это?

Не забывайте ‘;’ в конце каждого утверждения на PSQL. Звучит глупо, но бывает, хе-хе.

Для тех, кто использует rails, мне нужно было установить pg_hba.conf и изменить «идент» на «пароль». Менять его на доверие не получалось.

Следующие шаги работают для новой установки postgres 9.1 на Ubuntu 12.04. (Работал для postgres 9.3.9 и в Ubuntu 14.04.)

По умолчанию postgres создает пользователя с именем «postgres». Мы авторизируемся как она и дадим ей пароль.

$ sudo -u postgres psql password Enter password: . .

Выйдите из системы psql , набрав q или ctrl+d . Затем мы подключаемся как «postgres». Эта -h localhost часть важна : она сообщает psql клиенту, что мы хотим подключиться через TCP-соединение (которое настроено на использование аутентификации по паролю), а не через соединение PEER (которое не заботится о пароле).

$ psql -U postgres -h localhost

Если вы установили, PGHOST=localhost вам не нужно указывать -h опцию каждый раз. Это также работает с другими pg_* командами, такими как pg_dump .

Это действительно задокументировано здесь: help.ubuntu.com/12.04/serverguide/postgresql.html
Это было необходимо для включения установки Mediawiki на Debian с PostgreSQL.
2 года спустя, и мне нужно сделать это на Mac тоже.
плохо, потому что есть проблема безопасности, см. здесь: serverfault.com/questions/110154/…

Редактировать этот файл /etc/postgresql/8.4/main/pg_hba.conf и заменить ident или peer либо md5 или trust , в зависимости от того, хотите ли вы его запрашивают пароль на свой компьютер или нет. Затем перезагрузите файл конфигурации с помощью:

/etc/init.d/postgresql reload
перезапуск одной команды postgresql: /etc/init.d/postgresql restart
Зачем перезапускать, когда перезагрузка — это все, что тебе нужно?
В этом случае: «/etc/init.d/postgresql-8.4 reload»
этот здесь работал для меня. Перехода с peer на md5 было достаточно.

Хорошо, я noob postgresql, но я должен сообщить, что это restart сработало только для меня, а не reload — после изменения /etc/postgresql/9.5/main/pg_hba.conf (изменения peer на trust ).

Вы получаете эту ошибку, потому что вы не проходите аутентификацию клиента. Исходя из сообщения об ошибке, у вас, вероятно, есть конфигурация postgres по умолчанию, которая устанавливает метод аутентификации клиента «IDENT» для всех соединений PostgreSQL.

Вы должны обязательно прочитать раздел 19.1 «Аутентификация клиента» в руководстве по PostgreSQL, чтобы лучше понять доступные параметры аутентификации (для каждой записи в pg_hba.conf ), но здесь приведен соответствующий фрагмент, который поможет вам решить проблему (из руководства по версии 9.5) ):

доверять

Разрешить соединение безоговорочно. Этот метод позволяет любому, кто может подключиться к серверу базы данных PostgreSQL, войти в систему под любым желаемым пользователем PostgreSQL без необходимости ввода пароля или какой-либо другой аутентификации. Подробнее см. В разделе 19.3.1.

отклонять

Отклонить соединение безоговорочно.

Это полезно для «отфильтровывания» определенных хостов из группы, например, строка отклонения может заблокировать соединение определенного хоста, в то время как более поздняя строка позволяет подключаться остальным хостам в определенной сети.

md5

Требуйте от клиента предоставления пароля с двойным хэшированием MD5 для аутентификации. Подробнее см.

В разделе 19.3.2.

пароль

Требовать от клиента предоставить незашифрованный пароль для аутентификации. Поскольку пароль передается в виде открытого текста по сети, его нельзя использовать в ненадежных сетях. Подробнее см. В разделе 19.3.2.

GSS

Используйте GSSAPI для аутентификации пользователя.

Это доступно только для соединений TCP / IP. См. Раздел 19.3.3 для деталей.

ССПИ

Используйте SSPI для аутентификации пользователя. Это доступно только в Windows. См.

Раздел 19.3.4 для деталей.

идент

Получите имя пользователя операционной системы клиента, связавшись с сервером идентификации на клиенте, и проверьте, соответствует ли оно запрошенному имени пользователя базы данных. Идентификационная аутентификация может использоваться только на соединениях TCP / IP.

Если указано для локальных подключений, будет использоваться одноранговая аутентификация. См. Раздел 19.3.5 для деталей.

сверстников

Получите имя пользователя операционной системы клиента из операционной системы и проверьте, соответствует ли оно запрашиваемому имени пользователя базы данных. Это доступно только для локальных подключений. См.

Раздел 19.3.6 для подробной информации.

LDAP

Аутентификация с использованием сервера LDAP. См. Раздел 19.3.7 для деталей.

радиус

Аутентификация с использованием сервера RADIUS. См. Раздел 19.3.8 для деталей.

верняк

Аутентификация с использованием клиентских сертификатов SSL.

См. Раздел 19.3.9 для деталей.

Пэм

Выполните аутентификацию с использованием службы сменных модулей аутентификации (PAM), предоставляемой операционной системой. См. Раздел 19.3.10 для деталей.

Итак . чтобы решить проблему, с которой вы столкнулись, вы можете выполнить одно из следующих действий:

  1. Измените методы проверки подлинности, определенные в вашем pg_hba.conf файле trust , на md5 , или password (в зависимости от ваших требований безопасности и простоты) для локальных записей подключения, которые вы там определили.
  2. Обновление pg_ident.conf для сопоставления пользователей вашей операционной системы с пользователями PostgreSQL и предоставления им соответствующих прав доступа, в зависимости от ваших потребностей.
  3. Оставьте параметры IDENT в покое и создайте пользователей в своей базе данных для каждого пользователя операционной системы, которому вы хотите предоставить доступ. Если пользователь уже прошел аутентификацию в ОС и вошел в систему, PostgreSQL не потребует дополнительной аутентификации и предоставит доступ этому пользователю на основе любых привилегий (ролей), назначенных ему в базе данных. Это конфигурация по умолчанию.

Примечание. Расположение pg_hba.conf и pg_ident.conf зависит от ОС.

Для меня это лучший ответ. Когда вы знаете все эти варианты, вы можете легко настроить конф. И особенно, когда вы работаете с Dev-машиной, вы можете просто установить «идент» для всех записей, чтобы не тратить свое время. Спасибо

Это было полезно для меня тоже. В моем случае файл pg_hba.conf был настроен на peer, я изменил его на пароль. Обратите внимание, что при установке vanilla мне также пришлось установить пароль для пользователя postgres, sudo su — postgres psql, password установить пароль. Затем запустите соединение по умолчанию из pdgadmin3 с именем пользователя postgres и вашим установленным паролем.

И где этот файл найден? Конечно, вам может потребоваться составить список, поскольку между версиями, похоже, нет согласованности. Я думаю, что я просто бегу найти на ‘/’.

На Ubuntu-16.04 это /etc/postgresql/9.6/main/pg_hba.conf .

Как новичок в psql, это огромная помощь, и она должна быть принятым ответом, поскольку она обслуживает различные методы аутентификации

Простое добавление -h localhost бита — это все, что мне нужно для работы

Источник: qastack.ru

16.06.2020

Тайный смысл флага CCR в Postgresql и целостность мандатных атрибутов кластера баз данных.

Тонкие вопросы скользкой дорожки защиты данных вашей супер-пупер секретной системы всегда были спорными и имели под собой много неявных перипетий, виновником некоторых из них является неполная документация, баги, низкая квалификация или вообще, простите, раздолбайство.

Поверьте, когда вы беседуете c представителем соответствующих органов на тему утечки конфиденциалки с грифом «ОВ» (Особая Важность» — ДД), последнее, на что вы обратите внимание, пока не потечёте мыслями, глядя на холодную сталь турбийона Vacheron Constantin на руке требующего от вас объяснений безликого человека в штатском, который равнодушно примостился на столе генерального и, попивая кофе из его чашки, составляет протокол перьевым раритетом Visconti’s Ripple, это ваше святая уверенность что все рассосется. Но вы считаете себя ценным кадром, которого должны выручать при любом раскладе. Не переживайте, эти ваши мысли скоро разобьются вдребезги. Останутся причитания жены про то, что она предупреждала вас раньше и что как теперь выплачивать ипотеку , теплые носки в дорогу и потертый дачный «адибас» с растянутыми коленями, но зато с начёсом. Вас, правда, это теперь мало тревожит в липком предчувствии…
Так, может, коллеги, все-таки научимся делать наши ИТ-системы защищенными и не допускать утечек?

База данных Postgresql, входящая в состав Astra Linux SE, имеет свой собственный механизм обеспечения безопасности, в том числе, и мандатной. Этот механизм, конечно же, интегрирован в общую системы защиты ОС, но, как говорится в известном анекдоте, «Есть нюансы». Дело в том, что механизм МРД в базе, работая по правильной модели, реализован совсем по-другому. В postgresql.conf более 10 параметров, комбинация которых определяет, как будет вести себя база и работать МРД . А ведь еще есть ссылочная целостность между таблицами с разными атрибутами, есть вызываемые функции и триггеры, принадлежащие одним пользователям , обращающиеся к объектам других юзеров с разными метками и категориями!

Фразу «читайте документация» я пропускаю по причине, как говорят юристы, ничтожности. Только пытливый ум, коллегии, и традиционный бубен.

Немного похвастаюсь, что уже почти готов 3-х дневный курс «Advanced PostgreSQL для разработчика и безопасника» , одну главу выложу в нашей традиционной рублике. Поговорим про контейнерный признак CCR, который, казалось бы, так похож на признак CCNR в ОС!

Целостность мандатных атрибутов кластера баз данных и ТАйный сМысл флага CCR в Postgresql

В СУБД PostgreSQL ДП-модель накладывает ограничение на мандатную метку конфиденциальности объекта: метка объекта не может превышать метку контейнера, в котором он содержится

44екцы2.png

Согласно ДП-модели в части реализации мандатного управления доступом дополнительно к мандатной метке конфиденциальности вводится понятие объектов-контейнеров (объектов, которые могут содержать другие объекты). Для задания способа доступа к объектам внутри контейнеров используется мандатный признак CCR (Container Clearance Required). В случае когда он установлен, доступ к контейнеру и его содержимому определяется его мандатной меткой конфиденциальности, в противном случае доступ к содержимому разрешен без учета уровня конфиденциальности контейнера.

В качестве главного контейнера выбрано табличное пространство pg_global, которое создается одно на кластер базы данных. Таким образом, кластер является совокупностью ролей, баз данных и табличных пространств.

При создании мандатная метка объекта БД устанавливается равной текущей мандатной метке создавшего его пользователя, мандатный признак CCR при этом выставляется значение ON.

С одной стороны, метка CCR «обратно» аналогична метке CCNR в ОС, но есть некие отличие. Проведем исследование.

Для просмотра мандатного признака CCR кластера может быть использована следующая команда:

—————————————————————————————————————————————————————————————————-
sudo -u postgres psql mtest

mtest=# SELECT cluster_macccr;

cluster_macccr
—————————————————————————————————————————————————————————————————-

Таким образом мы видим, что метка выставлена по умолчанию

—————————————————————————————————————————————————————————————————-

Задаем мандатный уровень для всего кластера БД:

—————————————————————————————————————————————————————————————————-

MAC LABEL ON CLUSTER IS ‘{3,0}’;

Что идентично:

MAC LABEL ON TABLESPACE pg_global IS ‘{3,0}’;

го6гш74.png

Команда проходит без ошибок, не смотря что в контейнере, то есть, в БД, существуют объекты (хотя бы базы со схемами, созданные по умолчанию).

Важно! В ОС у нас аналогичная команда до снятым флагом CCNR на директории, была бы невозможна, так как в контейнере без флага CCNR могут находиться только объекты с равными мандатными атрибутами. Обратите внимание, что , даже создавая в папке файл от пользователя, вошедшего под 0-м уровнем, в директории без CCNR объекты автоматом получат уровень контейнера! (для этого пользователь должен быть, естественно, root, или обладать соответствующими parsec-привилегиями. Если в этой ситуации директория будет иметь флаг, то объекты создадутся с уровнем, соответствующим сессии пользователя.
Никакого нарушения модели тут нет, так обычный непривилегированный пользователь на меньшем уровне даже не увидит папку без флага CCNR, если ее уровень больше:

ддш665р3.png

Создадим в кластере (наш контейнер) объект – базу данных.

—————————————————————————————————————————————————————————————————-

postgres=# CREATE DATABASE ccrtest;

CREATE DATABASE

—————————————————————————————————————————————————————————————————-

Посмотрим ее maclabel,- он будет равен «0»

Дадим ей уровни конфиденциальности:

—————————————————————————————————————————————————————————————————-

sudo -u postgres psql ccrtest;

ccrtest=# MAC LABEL ON DATABASE ccrtest IS ‘{3,0}’;
MAC LABEL

ccrtest=# MAC LABEL ON DATABASE ccrtest IS ‘{2,0}’;
MAC LABEL

—————————————————————————————————————————————————————————————————-

Важно! Изменять ССR для базы можно только будучи подсоединенным к этой базе!

Как видите, мы можем понижать в контейнере уровень объектов.

Теперь изменим метку CCR контейнера (кластера):

—————————————————————————————————————————————————————————————————-

ccrtest=# MAC CCR ON CLUSTER IS ON;

MAC CCR

ccrtest=#

—————————————————————————————————————————————————————————————————-

Операция прошла без ошибок! Там в чем же разница, если мы можем создавать объекты меньшего уровня и с меткой, и без?

Смотрим определение CCR из документации:

«В случае когда CCR установлен, доступ к контейнеру и его содержимому определяется его мандатной меткой конфиденциальности, в противном случае доступ к содержимому разрешен без учета уровня конфиденциальности контейнера».

Посмотрим на примере, что это значит:

Наша свежесозданная база данных ccrtest имеет мандатный атрибут «3» и установленный по умолчанию флаг CCR:

—————————————————————————————————————————————————————————————————-

MAC LABEL ON DATABASE ccrtest IS ‘{3,0}’;
MAC CCR ON DATABASE ccrtest ccrtest IS ON;

—————————————————————————————————————————————————————————————————-

Создадим непривилегированного пользователя c именем как и у пользователя ОС, имеющего нулевой уровень:

—————————————————————————————————————————————————————————————————-

CREATE USER u0 WITH password ‘qwerty’;

—————————————————————————————————————————————————————————————————-

И пытаемся залогиниться к базе:

—————————————————————————————————————————————————————————————————-

root@web:~# psql -h localhost ccrtest u1

—————————————————————————————————————————————————————————————————-

Пароль пользователя u1:
psql: СБОЙ: база данных «ccrtest» не существует

—————————————————————————————————————————————————————————————————-

Ошибка! Пользователь меньшими атрибутами не может войти в БД (таблицу, и т д, если установлен флаг CCR.

Снимем его с базы данных и проверим возможность подключения:

—————————————————————————————————————————————————————————————————-

MAC CCR ON DATABASE ccrtest IS off;

root@web:~# psql -h localhost ccrtest u1

Пароль пользователя u1:

psql: СБОЙ: permission denied for cluster, insufficient MAC attributes

—————————————————————————————————————————————————————————————————-

Опять возникает ошибка, но по другой причине – у вышестоящего объекта (кластера) мы флаг оставили. Убираем флаг с кластера и пытаемся войти еще раз и видим, что аутентификация прошла успешно:

—————————————————————————————————————————————————————————————————-

ccrtest=# MAC CCR ON CLUSTER IS off;

root@web:~# psql -h localhost ccrtest u1

Пароль пользователя u1:

psql (9.6.10)SSL-соединение (протокол: TLSv1.2, шифр: ECDHE-RSA-AES256-GCM-SHA384, бит: 256, сжат

Введите «help», чтобы получить справку.

—————————————————————————————————————————————————————————————————-

ддш665р3.png

Для вывода информации о соблюдении ДП-модели между объектами-контейнерами и находящимися в них объектами реализована SQL-функция check_mac_integrity, которая выводит информацию в следующем виде:

–    objid — Идентификатор объекта;

–    classid — Идентификатор класса объекта;

–    cobjid — Идентификатор контейнера, содержащего объект;

–    cclassid — Идентификатор класса контейнера, содержащего объект;

–    status — Результат проверки. Может принимать следующие значения: OK(модель соблюдается для объекта и контейнера) и FAIL(модель не соблюдается для объекта и контейнера).

тнрот42цфы.png

Обновлено: 11.02.2023

Не могу зайти под созданным пользователем и паролем, в свою серверную часть
И так, создал серверную часть сайта, все работает, кроме авторизации.. Захожу на свою же созданную.

Зайти в консоль под другим пользователем
Здравствуйте, проблема такая: когда сервер стоит на localhost’e то проблем нет никаких, но когда я.

Не удается зайти под локальным пользователем
Здравствуйте! Не могу зайти в Windows под локальным юзером, комп в домене. И еще один вопрос где в.

После изменения переменных окружения не могу зайти под пользователем
Имеется ОС Oracle Linux на ней установлен Oracle 12. Настраивал переменные окружения и выполнил.

В вашей ОС активна мандатная система безопасности. Что там у Вас? SELinux, AppArmor, AstraLinux, .
Ищите ответ в этом направлении, что и как пользователю ОС bob нужно разрешить, чтобы получать доступ к PG.

grgdvo, Астра Смоленск SE 1.5.
Нет информации нигде, а так что есть не работает.
Был вариант в политике безопасности у учетной записи, есть раздел мандатного доступа, во только как его настроить — непонятно. Нашел ссылку на РусБИТех вики, а она закрыта/удалена.

Добавлено через 19 минут
Кстати, тему переименовали.
Я указывал про Астру Смоленск.

Решение

Я думаю тщательный поиск в гугль должен решить проблему.
Например, вот здесь какая-то магия с доступом описана
grgdvo, спасибо большое, правда, вместо pdpl-user -z <username> использовал pdp-ulbls -l 0:3 <username>, заработало.

Я отключил Администратора и теперь не могу зайти ни под каким пользователем
Я отключил Администратора и теперь немогу зайти не под каим пользователем непускает.

Как зайти под SYS.
Платформа windows XP, Oracle 10g 10.2.0 Вот такая проблема есть, через isqlplus.

Как зайти на сайт под выбранным ip?
Искал, но наверно плохо.. Нужно именно подставить ip, и чтоб сайт думал что это с его захожу.

Не пускает на сервер под созданным именем входа
При попытке входа на sql server management 2014 под созданным именем входа выдаёт ошибку 18456, что.

Проблема возникает с PostgreSQL 9.4 в Astra Linux Special Edition 1.5 при попытке подключения созданным пользователем:

«СБОЙ: ошибка получения мандатных атрибутов на сервере для пользователя»

Ошибка возникает при использовании локальных пользователей, без настроенного ALD.

$ sudo setfacl -mR u: postgres:rx /etc/parsec/macdb
$ sudo setfacl -mR u: postgres:rx /etc/parsec/capdb

Для версии 1.6 это выглядит так.

Если возникает ошибка:

ошибка получения мандатных атрибутов на сервере для пользователя «replicator», ошибка 13 — Отказано в доступе

Значит не хватает прав доступа к каталогам. Нужно:

usermod -a -G shadow postgres
setfacl -d -m u: postgres:r /etc/parsec/macdb
setfacl -R -m u: postgres:r /etc/parsec/macdb
setfacl -m u: postgres:rx /etc/parsec/macdb
setfacl -d -m u: postgres:r /etc/parsec/capdb
setfacl -R -m u: postgres:r /etc/parsec/capdb
setfacl -m u: postgres:rx /etc/parsec/capdb

Если возникает ошибка:

ошибка получения мандатных атрибутов на сервере для пользователя «replicator», ошибка 2 — Нет такого файла или каталога

Нужно инициализировать мандатные права у вашего пользователя:

usermac -z пользователь

setfacl -d -m u: postgres:r /etc/parsec/macdb

Вот это всё да, только без пробела — «u:postgres:r». Спасибо за ответ! Убивался с этими правами на каталоги довольно долго сейчас при переходе на новую версию.

И тем не менее. Господа, а, видимо, кто-то уже сталкивался со всем этим делом на Astra Linux 1.6 Smolensk?

На Astra Linux 1.5 при желании назначить пользователя, ассоциированного с ролью входа для PostgreSQL работало вот так:

pdp-ulbls -l 0:0 my_db_user
setfacl -R -m u: postgres:rx /etc/parsec/macdb
setfacl -R -m u: postgres:rx /etc/parsec/capdb

Есть способ короче: usermac -z user. А делать это надо один раз после установки PostgreSQL. – Администрация 21 мая 2019

Проблему удалось решить. Файл /etc/parsec/mswitch.conf, параметр zero_if_notfound установить в yes.

В этом случае все пользователи БД, для которых не удалось получить мандатные атрибуты, получат нулевую метку.

Настройка «установить в файле /etc/parsec/mswitch.conf, параметр zero_if_notfound в yes» работает только для астры без домена ald. Если на астре настроена авторизаиця через домен, то после parsec запрашивается ald, если там одноименного пользователя тоже нет — то запрашивается kerberos, а поскольку он не настроен — то в postgres возвращается ошибка, и пользователь не подключается. В логе постгреса ошибки:

Как в таком случае заставить постгрес вести себя согласно доке и разрешить подключать пользователей, которые есть только в самом постгресе?

Для не больших (по объему) и не сложных по уровням доступа БД, действительно, можно обойтись набором представлений.
В cложной БД это затруднительно.
Пусть в таблице есть N столбцов, в которых используются метки доступа в среднем M уровней.
Тогда может понадобиться создать NxM представлений.
А если таких таблиц, скажем, P, то и представлений будет PxNxM.
Причем это статичные (заранее спроектированные и созданные) представления, как правило, встроенные в приложения, которые требуют администрирования по доступу к ним разных пользователей.
Если в процессе работы с БД надо динамически менять уровни доступа к информации (например, создавать новые), то синхронно надо создавать и соответствующие представления, после чего каким-то образом встраивать их в приложения.

Вообщем — да. Только, я, всё таки, сказал бы, что не в «сложной БД», а именно в «БД со сложными правилами конроля доступа». И от объёма самой базы это не сильно зависит.

В реальных системах, как правило, применяется комбинированный подход.

Зачем городить отдельное представление на каждый «уровень»? Можно просто ограничивать в представление чего оно выдает на основании либо каких-то реальных данных в таблице (например, инфу по региону могут смотреть только работники этого региона), либо на основании какого-то определенного для этой записи уровня доступа (т.е. как хочет vlad2006)

Что это за «мандатные атрибуты»? от слова «мандат»?

Я занималась тестированием мандатных меток на ОС astra linux со встроенным Postgres
Мы так и не перешли на использование мандатных меток -поэтому консультировать почему не работает не могу-поскольку этим сейчас не занимаюсь и подзабыла как там что делается
но проверяла я так -может вам поможет эта информация
Установила на сервере пакет тестирования мандатного доступа postgresql-se-test-9.3
В результате этого пакета создается тестовый кластер Postgresql,создаются пользователи OC и выполняется тестирование мандатного доступа на уровне базы Postgresql,потом в конце тестирования база удаляется)
Изменила командный файл на тестирования(закомментировала строку удаления базы).Тестирование прошло нормально!Я создала в этой базе рядового пользователя и нормально к ней подключилась).восстановила свою базу.Подключилась к базе рядовым пользователем loader успешно!
это результат достигнут я думаю выполнением команд

setfacl -m u:postgres:rx /etc/parsec/macdb
setfacl -m u:postgres:rx /etc/parsec/capdb
setfacl -d -m u:postgres:r /etc/parsec/macdb
setfacl -d -m u:postgres:r /etc/parsec/capdb
setfacl -R -m u:postgres:r /etc/parsec/macdb/*
setfacl -R -m u:postgres:r /etc/parsec/capdb/*

Завёл пользователя в ОС
Завёл такого же пользователя в СУБД

выполнил команды:
setfacl -m u:postgres:rx /etc/parsec/macdb
setfacl -m u:postgres:rx /etc/parsec/capdb
setfacl -d -m u:postgres:r /etc/parsec/macdb
setfacl -d -m u:postgres:r /etc/parsec/capdb
setfacl -R -m u:postgres:r /etc/parsec/macdb/*
setfacl -R -m u:postgres:r /etc/parsec/capdb/*

затем команду: usermod -a -G shadow postgres

sudo -u <имя пользователя> psql

Мне пишут: psql: Сбой ошибка получения мандатных атрибутов на сервере для пользователя <>

Дмитрий Димитров

Артём Макаренко

Шурик, Новая директория не создается, физически она есть на жестком диске но нет пути к нему.

Антон Золотухин

Здравствуйте, я не силен в линуксе, но на работе попал в не приятную историю, на компе стоите astra linux 1.5 smolensk и почему то при загрузке операционной системы вместо привычного графического интерфейса(fly) запускается терминальный режим, как можно восстановить fly? бекапа нет

Шурик Попов

Артём, попробуйте удалить этого пользователя с удалением его домашнего каталога и создать снова (если это не админ, конечно) . Или проверьте права доступа к этим директориям

Шурик Попов

Антон, что то устанавливали или удаляли? Или какие то настройки делали перед этим? Если нет, то может помочь перезагрузка компа. Если и это нет, попробовать залогиниться в консольном режиме и запустить оконный менеджер вручную

Антон Золотухин

Шурик, при вводе startx рабочий стол, запускается, а команды, так как я уже писал по работе столкнулся, да вводились дали бумагу и по ней делал, а так как все надо было сделать вчера время подготовиться не было

Антон Золотухин

Шурик, неправильно написал — при вводе от рута рабочий стол fly запускается а от пользователей пишет xparsec: cant make privileged socket due to: -1 error code, может я где привелегии доступа сбил? К файлам, а команды присылать их на лист из разрых моментов ?

Разграничение прав доступа — важнейший элемент обеспечения безопасности информационной системы, однако сама по себе безопасность не самоцель, хотя об этом не всегда помнят. Если на одном компьютере разместить исключительно секретные материалы и физически отрезать его от сети, то проблемы с безопасностью будут решены. В ряде случаев так и поступают, однако выделять по компьютеру на каждую категорию секретности неразумно — иногда требуется, не покидая защищенную систему, иметь доступ ко всей информации, в том числе и несекретной. Каким образом, запуская в защищенной среде таких разных ОС, как Astra Linux Special Edition и SELinux/SEPGSQL, приложение, использующее СУБД PostgreSQL, обеспечить разграничение прав доступа и предоставить пользователю ровно тот уровень секретности, который ему положен? При этом очевидно, что ставить мандатную СУБД поверх немандатной ОС бессмысленно.

Всегда можно представить ситуацию, когда в большой базе данных лишь часть информации секретна и важно обеспечить гранулированность доступности. Например, сотрудники районных отделений полиции получают доступ к данным только о жителях своего района, а на уровне города должна быть доступна информация о любом жителе мегаполиса. Такое разграничение доступа реализуется на уровне записей, или строк таблицы (Row Level Security, RLS), однако оно поддерживается не всеми СУБД.

В современных безопасных системах может быть реализована комбинация дискреционного (избирательного) разграничения доступа (Discretionary Access Control, DAC), ролевого разграничения доступа (Role Based Access Control, RBAC) и мандатного (принудительного, обычно многоуровневого) разграничения доступа (Mandatory Access Control, MAC). Как правило, они реализуются именно в таком порядке: следующий «поверх» предыдущего. То есть ресурс, доступный по правилам мандатного доступа, заведомо доступен по правилам дискреционного доступа, но не наоборот.

Мандатное управление доступом обсуждается редко, мало того, его иногда трактуют искаженно, опираясь на опыт работы с бумажными документами, для которых установлены различные уровни секретности. Перенос представлений о работе с бумажными документами на работу с электронными, на уровни доступа ОС и тем более на СУБД, иногда дезориентирует — сходство обманчиво. Для многоуровневой политики имеется простой принцип «читай вниз, пиши вверх», который не похож на то, что подразумевается в реальном мире. Принцип «Write up, read down. No read up, no write down» (субъект, обладающий определенным уровнем доступа, не может читать информацию, относящуюся к более высокому уровню, но может читать менее секретные документы; субъект, обладающий определенным уровнем доступа, не сможет создавать объекты с более низким уровнем допуска, чем имеет сам, но при этом может писать в более высокоуровневые объекты), входящий в модель Белла — Лападулы, прописан и в отечественных документах, регламентирующих требования к безопасности информационных систем. Первая половина этого принципа очевидна, а про вторую этого сказать нельзя: невозможно представить себе ситуацию из «бумажного» мира, когда сотрудник получает доступ на запись в документ высокой секретности, не имея при этом права (и возможности) его читать. Однако именно так исключается попадание данных, доступных высокоуровневым объектам, в низкоуровневые объекты.

Мандатное разграничение доступа еще называют принудительным контролем доступа: пользователь не может управлять доступом к информации, а сами правила доступа жестко определены политикой безопасности. Наличие разграничения доступа MAC, DAC и RBAC — обязательное требование при защите информации категории «гостайна», однако для разных ОС и СУБД оно может трактоваться по-разному. Например, в мандатном управлении доступа для операционной системы Astra Linux пользователь сам может выбирать уровень секретности из тех, что разрешены ему системным администратором, и этот уровень будет сохраняться на протяжении сессии. Теоретически мандатная система доступа не обязательно должна иметь различные уровни конфиденциальности (секретности или доступа), однако в реальной жизни редко находятся причины использовать немногоуровневую политику: именно она обязательна для систем с обеспечением гостайны.

Имеется некоторый набор средств для реализации мандатных ОС, но для российской действительности актуальны две — SELinux [1] и Astra Linux Special Edition [2].

SELinux (Security-Enhanced Linux) представляет собой обычный дистрибутив Linux, скомпилированный с набором модулей (LSM, Linux Security Modules), перехватывающих системные вызовы.

Модули представляют собой «крюки» («хуки»), к которым можно «подвесить» свои обработчики. Код SELinux открыт, и мандатный доступ строится поверх обычной системы доступа Linux — то есть файл, недоступный в Linux, будет недоступен и в SELinux, но не наоборот. При определении доступности файла система сравнивает метки субъекта и объекта, а затем принимает решение о допустимости операции. Метка представляет собой набор полей, содержимое которых может по-разному задаваться в различных политиках безопасности. Для создателей и пользователей мандатных систем наиболее интересна многоуровневая политика защиты (Multi Level Security, MLS), основанная на иерархии уровней секретности (чувствительности) и набора категорий. Пользователь SELinux — это сущность, определенная в политике, отвечающая за конкретный набор ролей и других атрибутов контекста безопасности. Пользователи SELinux отличаются от пользователей Linux, поэтому необходимо сопоставление (mapping) между ними через политику SELinux, позволяющее пользователям Linux наследовать ограничения пользователей SELinux.

Версия Astra Linux Special Edition разработана компанией «РусБИТех» на основе подсистемы PARSEC, целиком реализованной в виде модулей LSM, причем разработчики не декларируют следование модели Белла — Лападулы, а предлагают собственную патентованную «мандатную сущностно-ролевую ДП-модель» (модель логического управления доступом «Д» и информационными потоками «П»). Объекты располагаются в монотонной по доступу иерархии контейнеров (каталог — это контейнер для файлов, таблица базы данных — контейнер для записей). Уровень конфиденциальности контейнера не уступает уровню содержащихся в нем объектов. По умолчанию запись «вверх» в модели безопасности Astra Linux невозможна — можно писать только на свой уровень. Однако, поскольку работать с такой жесткой системой запретов трудно, а в некоторых ситуациях просто невозможно, вводятся средства игнорирования мандатных меток контейнера или объекта. Атрибут «ehole» мандатной метки позволяет игнорировать любые мандатные правила, а бит CCR делает «прозрачными» контейнеры, непрозрачные для нижележащих уровней секретности.

MAC В POSTGRESQL ДЛЯ SELINUX

В среде SELinux для поддержки разграничения доступа MAC для СУБД PostgreSQL имеется расширение sepgsql, которому необходима поддержка в ядре операционной системы, поэтому он может работать только в Linux 2.6.28 и выше. Это расширение работает на базе мандатной системы SELinux, используемой в Red Hat, CentOS, Fedora и др., а также в их российских собратьях: ОС «Синергия-ОС» (РФЯЦ-ВНИИЭФ), ОС «Заря» и ряде других.

При принятии решения о предоставлении доступа к объекту базы данных, sepqsql сверяется с политиками безопасности SELinux, поскольку внутри sepgsql нет самостоятельного механизма назначения, хранения и модификации меток пользователей. Расширение обеспечивает присвоение меток безопасности пользователям и объектам базы данных через внешних «провайдеров», одним из которых является SELinux. Можно назначать метки безопасности схемам, таблицам, столбцам, последовательностям, представлениям и функциям. Когда расширение sepgsql активно, метки безопасности автоматически назначаются поддерживаемым объектам базы в момент их создания в соответствии с политикой безопасности, которая учитывает метку создателя, метку, назначенную родительскому объекту создаваемого объекта, и, в некоторых случаях, имя создаваемого объекта. Для схем родительским объектом является текущая база данных; для таблиц, последовательностей, представлений и функций — схема, содержащая эти объекты; для столбцов — таблица.

Существующая реализация sepgsql имеет ряд особенностей и ограничений, которые необходимо принимать во внимание, но самое важное — это неспособность ограничения доступа на уровне строк. В версиях PostgreSQL 9.5 и 9.6 и во всех версиях Postgres Pro такая возможность предусмотрена.

MAC В POSTGRESQL ДЛЯ ASTRA LINUX

Защищенные версии СУБД PostgreSQL, поставляемые компанией «РусБИТех» вместе с Astra Linux Special Edition v.1.5, собраны со специальными патчами, позволяющими взаимодействовать с мандатной системой PARSEC. Они базируются на стандартных версиях PostgreSQL 9.2 либо PostgreSQL 9.4 и отличаются реализацией мандатного разграничения (в 9.4 более полный функционал и реализована ДП-модель управления доступом и информационными потоками, соответствующая модели безопасности в ОС Astra Linux). СУБД PostgreSQL использует механизмы ОС для того, чтобы пользователь получил те же поля метки мандатного доступа, что и пользователь ОС, вошедший с соответствующими мандатными атрибутами. В сессии возможен только один уровень конфиденциальности, а не диапазон, как в SELinux и sepgsql.

В качестве главного контейнера выбрано табличное пространство pg_global — одно на кластер базы данных. Применение мандатных прав доступа работает на уровне доступа к объектам базы данных и на уровне доступа непосредственно к данным. В отличие от sepgsql, эта реализация поддерживает разграничение на уровне записи: записи рассматриваются как объекты, а содержащие их таблицы — как контейнеры. Метки системных объектов располагаются в записях таблиц системного каталога, непосредственно описывающих защищаемый объект.

«СИНЕРГИЯ-БД»

В реальности встречаются ситуации, когда sepgsql недостаточно, — например, когда требуется защита на уровне строк. В поставку ОС Astra Linux входит защищенная СУБД, привязанная к мандатной системе безопасности ОС Astra Linux. При этом многие потребители нуждаются в защищенной, но платформенно-независимой СУБД. Кроме того, такую комбинацию СУБД и ОС проще сертифицировать: получить сертификат на комбинацию защищенной сертифицированной ОС и защищенной сертифицированной СУБД легче, чем на комплекс, в котором СУБД и ОС тесно взаимосвязаны. В последнем случае при изменении ОС (даже при переходе на другую версию той же ОС) придется заново начинать процесс инспекционного контроля сертифицированного продукта или процедуру сертификации.

Однако абсолютно кросс-платформенное решение невозможно — ОС, созданные даже на основе одного и того же ядра Linux, могут сильно отличаться [3]. Технически задача упростится, если исключить из набора платформ специфические ОС и взять за основу стандартные средства SELinux. Но тогда пришлось бы отказаться от поддержки платформы Astra Linux, популярной на ряде отечественных предприятий.

Возможно компромиссное решение — создать ПО связующего слоя, которое предоставит все необходимые для работы защищенной СУБД мандатные атрибуты, не требуя изменения кода ядра СУБД и исходного кода расширений ОС. Однако разработчикам придется потрудиться и над тем, чтобы универсальность не достигалась в ущерб производительности СУБД.

Мандатная СУБД «Синергия-БД», включающая в себя такое ПО промежуточного слоя, обеспечивает достаточную функциональность и приемлемую производительность (потери на уровне 15%). Эта СУБД разработана РФЯЦ-ВНИИЭФ и компанией Postgres Professional и представляет собой кросс-платформенную среду, работающую на отечественных системах «Синергия-ОС» и Astra Linux Special Edition.

Поскольку Astra Linux и «Синергия-ОС» по-разному решают проблемы доступа, то унификацию берет на себя ПО связующего слоя. Например, в Astra Linux пользователь регистрируется в системе с одним на сессию уровнем конфиденциальности, а «Синергия-ОС» предоставляет своим пользователям диапазон уровней — в этом случае «Синергия-БД» выбирает минимальный уровень из возможных. При этом, чтобы избежать деградации производительности СУБД, атрибуты безопасности пользователя кэшируются на время сессии. Пользоваться базой могут не только сотрудники с определенным уровнем доступа, заданным параметрами пользователя в ОС, но и те, кто входит в систему без метки доступа.

За основу «Синергии-БД» была взята версия СУБД PostgreSQL 9.5.5, в которой имеются штатные методы аутентификации, настраиваемые через pg_hba.conf. На рис. 1 показан порядок взаимодействия удаленных пользователей с подсистемами безопасности двух разных ОС и «Синергии-БД». Рис. 1. Политики ОС управляют правами доступа удаленного клиента

Пользователь авторизуется через механизмы СУБД, например PAM (Pluggable Authentication Modules — «подключаемые модули аутентификации») или GSS (Generic Security Services — «общий программный интерфейс сервисов безопасности», например Kerberos), после чего запускается проверка механизма мандатного доступа. Например, если таблица-контейнер «прозрачна», то для любого пользователя она открыта для чтения и записи, но увидит он в ней только те строки, уровень конфиденциальности которых равен его собственному или меньше. Это и есть разделение доступа на уровне строк, отвечающее модели Белла — Лападулы.

На рис. 2 приведена иерархия объектов «Синергии-БД» — если наследуется таблица, то она считается логически входящей в контейнер родительской таблицы. Видно, что доступ к средствам процедурных языков базы данных (и тем более к функциям) определяется на уровне базы данных, а не на глобальном уровне. Рис. 2. Объекты-контейнеры и содержимое контейнеров в «Синергии-БД»

Модульная структура провайдеров безопасности дает возможность подключать новые модули и интегрировать СУБД в состав других защищенных ОС, имеющих мандатное разграничение доступа, что существенно упрощает и ускоряет процесс сертификации. ***

Очевидно, что по разным причинам безопасные мандатные системы будут достаточно активно развиваться, а значит, будут развиваться подходы к обеспечению совместимости и кросс-платформенности ОС и СУБД. Кроме того, дополнительные исследования потребуются в области организации работы сетей в мандатной среде, обеспечения репликации, а также создания удобных интерфейсов взаимодействия с различными ОС и СУБД.

Читайте также:

      

  • Mac os где находится рабочий стол
  •   

  • Пришло время обновить ваше устройство windows 10 как убрать
  •   

  • Как восстановить загрузку windows xp после установки windows 7
  •   

  • Анабиоз сон разума вылетает на виндовс 10
  •   

  • Аналог icloud для windows

23 февраля, 2016 12:20 пп
93 574 views
| 1 комментарий

Linux, Ubuntu

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, нужно открыть командную строку СУБД:

psql

а затем ввести команду:

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:

q

Чтобы создать роль в командной строке системы, введите следующую команду (в руководстве эта роль будет условно называться 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;

Полный список опций доступа можно просмотреть при помощи команды:

h CREATE ROLE

Чтобы у пользователя, связанного с этой ролью, были привилегии входа, введите:

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:

password test_user

Команда предложит ввести и подтвердить пароль. Затем закройте интерфейс PostgreSQL и вернитесь в сессию системного пользователя.

q
exit

По умолчанию 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       |                                                | {temporary_users}
postgres        | Superuser, Create role, Create DB, Replication | {}
temporary_users | Cannot login                                   | {}
test_user       |                                                | {temporary_users}

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

Чтобы вернуть оригинальные права текущей роли, введите:

RESET ROLE;

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

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. Управление правами доступа – очень важный аспект работы с данными; это позволяет каждому приложению использовать только необходимые ему данные, не вмешиваясь в работу других приложений.

Tags: PostgreSQL, Ubuntu 12.04

Понравилась статья? Поделить с друзьями:
  • Ошибка получения курса валют передана пустая валюта 1с ут 11
  • Ошибка подушки безопасности пежо 308
  • Ошибка получения курса валют передана пустая валюта 1с erp
  • Ошибка подушки безопасности пежо 307
  • Ошибка получения криптографического контекста код ошибки 2