Подтвердить что ты не робот

Что такое GRANT ИСПОЛЬЗОВАНИЕ НА SCHEMA?

Я пытаюсь создать в первый раз базу данных Postgres, так что это, наверное, глупый вопрос. Я назначил базовые разрешения только для чтения роли db, которые должны обращаться к базе данных из моих php-скриптов, и у меня есть любопытство: если я выполняю

GRANT some_or_all_privileges ON ALL TABLES IN SCHEMA schema TO role;

есть ли необходимость выполнить также

GRANT USAGE ON SCHEMA schema TO role;

?

Из документации:

ИСПОЛЬЗОВАНИЕ: для схем позволяет доступ к объектам, содержащимся в указанной схемы (при условии, что собственная привилегия объектов требования также соблюдаются). По сути, это позволяет получателю "искать" объекты внутри схемы.

Я думаю, что если я могу выбрать или манипулировать любыми данными, содержащимися в схеме, я могу получить доступ к любым объектам самой схемы. Я ошибаюсь? Если нет, для чего используется GRANT USAGE ON SCHEMA? И что означает документация в точности с "предполагая, что требования к привилегиям объектов также выполняются"?

4b9b3361

Ответ 1

GRANT на разные объекты раздельные. GRANT ИНГ на базе не GRANT права на схеме внутри. Аналогично, предоставление GRANT для схемы не дает прав на таблицы внутри.

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

Проверка прав проводится в следующем порядке:

Do you have 'USAGE' on the schema? 
    No:  Reject access. 
    Yes: Do you also have the appropriate rights on the table? 
        No:  Reject access. 
        Yes: Check column privileges.

Ваша путаница может возникнуть из-за того, что public схема имеет по умолчанию GRANT всех прав на роль public, членом которой является каждый пользователь/группа. Таким образом, все уже используют эту схему.

Фраза:

(при условии, что собственные требования к привилегиям объектов также выполнены)

Говорится, что для использования объектов внутри нее вы должны иметь USAGE в схеме, но наличие USAGE в схеме само по себе недостаточно для использования объектов в схеме, вы также должны иметь права на сами объекты.

Это как дерево каталогов. Если вы создаете каталог somedir с файлом somefile внутри него, то установите его так, чтобы только ваш собственный пользователь rwx------ доступ к каталогу или файлу (режим rwx------ в директории, режим rw------- в файле), тогда никто другой не сможет rw------- список каталог, чтобы увидеть, что файл существует.

Если бы вы предоставили права на чтение для файла (режим rw-r--r--), но не изменили разрешения для каталога, это не имело бы никакого значения. Никто не мог увидеть файл для того, чтобы прочитать его, потому что у них нет прав перечислять каталог.

Если вместо этого вы установите в каталоге rwx-r-xr-x, настроив его так, чтобы люди могли просматривать и просматривать каталог, но не меняя права доступа к файлу, люди могли бы перечислить файл, но не могли прочитать его, потому что у них не было бы доступа к файл.

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

То же самое в Pg. Вы нужны как схемы USAGE прав и права на объект для выполнения действий на объекте, например, SELECT, из таблицы.

(Аналогия немного падает в том, что PostgreSQL еще не имеет защиты на уровне строк, поэтому пользователь все еще может "увидеть", что таблица существует в схеме, SELECT непосредственно из pg_class. Они не могут взаимодействовать с ней в в любом случае, так что это просто часть списка, которая не совсем одинакова.)

Ответ 2

Для производственной системы вы можете использовать эту конфигурацию:

--ACCESS DB
REVOKE CONNECT ON DATABASE nova FROM PUBLIC;
GRANT  CONNECT ON DATABASE nova  TO user;

--ACCESS SCHEMA
REVOKE ALL     ON SCHEMA public FROM PUBLIC;
GRANT  USAGE   ON SCHEMA public  TO user;

--ACCESS TABLES
REVOKE ALL ON ALL TABLES IN SCHEMA public FROM PUBLIC ;
GRANT SELECT                         ON ALL TABLES IN SCHEMA public TO read_only ;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO read_write ;
GRANT ALL                            ON ALL TABLES IN SCHEMA public TO admin ;

Ответ 3

Ну, это мое окончательное решение для простой базы данных для Linux:

# Read this before!
#
# * roles in postgres are users, and can be used also as group of users
# * $ROLE_LOCAL will be the user that access the db for maintenance and
#   administration. $ROLE_REMOTE will be the user that access the db from the webapp
# * you have to change '$ROLE_LOCAL', '$ROLE_REMOTE' and '$DB'
#   strings with your desired names
# * it preferable that $ROLE_LOCAL == $DB

#-------------------------------------------------------------------------------

//----------- SKIP THIS PART UNTIL POSTGRES JDBC ADDS SCRAM - START ----------//

cd /etc/postgresql/$VERSION/main
sudo cp pg_hba.conf pg_hba.conf_bak
sudo -e pg_hba.conf

# change all 'md5' with 'scram-sha-256'
# save and exit

//------------ SKIP THIS PART UNTIL POSTGRES JDBC ADDS SCRAM - END -----------//

sudo -u postgres psql

# in psql:
create role $ROLE_LOCAL login createdb;
\password $ROLE_LOCAL
create role $ROLE_REMOTE login;
\password $ROLE_REMOTE

create database $DB owner $ROLE_LOCAL encoding "utf8";
\connect $DB $ROLE_LOCAL

# Create all tables and objects, and after that:

\connect $DB postgres

revoke connect on database $DB from public;
revoke all on schema public from public;
revoke all on all tables in schema public from public;

grant connect on database $DB to $ROLE_LOCAL;
grant all on schema public to $ROLE_LOCAL;
grant all on all tables in schema public to $ROLE_LOCAL;
grant all on all sequences in schema public to $ROLE_LOCAL;
grant all on all functions in schema public to $ROLE_LOCAL;

grant connect on database $DB to $ROLE_REMOTE;
grant usage on schema public to $ROLE_REMOTE;
grant select, insert, update, delete on all tables in schema public to $ROLE_REMOTE;
grant usage, select on all sequences in schema public to $ROLE_REMOTE;
grant execute on all functions in schema public to $ROLE_REMOTE;

alter default privileges for role $ROLE_LOCAL in schema public
    grant all on tables to $ROLE_LOCAL;

alter default privileges for role $ROLE_LOCAL in schema public
    grant all on sequences to $ROLE_LOCAL;

alter default privileges for role $ROLE_LOCAL in schema public
    grant all on functions to $ROLE_LOCAL;

alter default privileges for role $ROLE_REMOTE in schema public
    grant select, insert, update, delete on tables to $ROLE_REMOTE;

alter default privileges for role $ROLE_REMOTE in schema public
    grant usage, select on sequences to $ROLE_REMOTE;

alter default privileges for role $ROLE_REMOTE in schema public
    grant execute on functions to $ROLE_REMOTE;

# CTRL+D