PostgreSQL - як швидко скинути користувача з наявними привілеями


122

Я намагаюся зробити обмежених користувачів БД для програми, над якою я працюю, і я хочу відкинути користувача бази даних Postgres, який я використовую для експерименту. Чи є спосіб скасувати користувача, не спершу відкликати всі його права вручну або відкликати всі гранти, які має користувач?

Відповіді:


144

Як щодо

DROP USER <username>

Це фактично псевдонім для DROP ROLE.

Ви повинні відмовитись від експліцитності будь-яких привілеїв, пов’язаних із цим користувачем, а також перемістити його право власності на інші ролі (або скинути об'єкт).

Це найкраще досягти шляхом

REASSIGN OWNED BY <olduser> TO <newuser>

і

DROP OWNED BY <olduser>

Останній видалить будь-які привілеї, надані користувачеві.

Дивіться документи про постгреси для DROP ROLE та більш детальний опис цього.


Доповнення:

Мабуть, спроба скинути користувача за допомогою команд, згаданих тут, спрацює лише в тому випадку, якщо ви їх виконуєте під час підключення до тієї ж бази даних, з якої були зроблені оригінальні GRANTS, як обговорювалося тут:

https://www.postgresql.org/message-id/83894A1821034948BA27FE4DAA47427928F7C29922%40apde03.APD.Satcom.Local


11
Виконання: CREATE TABLE foo(bar SERIAL); ALTER TABLE foo OWNER TO postgres; CREATE USER testuser; GRANT ALL ON foo TO testuser; DROP USER testuser дали повідомлення про помилки: ERROR: role "testuser" cannot be dropped because some objects depend on it DETAIL: access to table foo. Однак, DROP OWNED BY testuserхитрість, очевидно, Постгрес вважає гранти об'єктами, що підлягають видаленню.
мільйозу

1
Будь ласка, уточнюйте, @Tim Kane and millimoose: Я дуже не хочу, щоб оригінальні таблиці були відкинуті, якщо Я ВИБОРУЮТЬСЯ НА ФОТО ТЕСТУВАЛІ, а потім ВІДПОВІДАЮТЬ ВЛАСНИМ ТЕСТУСЕРОМ. Я думаю, ви говорите про те, що DROP WNNED BY лише скидає гранти, але не відкидає об'єкт, на який було здійснено грант. Правильно?
Ендрю Вулф

1
Андрій, найкраще прочитати документацію для уточнення. DROP ВЛАСНІСТЮ буде видаляти таблиці , що належать цьому користувачу. REASSIGN WNED BY переназначить ці таблиці іншому користувачеві. Вибери один.
Тім Кейн

3
Якщо ви турбуєтесь про те, що ВИКЛАДАЄТЬСЯ, виймаючи занадто багато після того, як зробите ПРОВЕРЕНОГО ВЛАСНЕННЯ, коли привілеї все ще зберігаються, ви можете ЗАМЕНИТИ ВСІ НА ВСІ [ТАБЛИЦІ | ПОСЛІДКИ | ...] В СХЕМІ [схема схеми] З [роль]
jla

Дійсно, команда DROP OWNED BY є дещо неоднозначною за своїм значенням та наслідками. Мені довелося уважно прочитати док. Дякую за повідомлення, хлопці.
Sébastien Clément

49

Прийнята відповідь призвела до помилок для мене при спробі ПРИЗНАЧЕННЯ, ВЛАСНОГО або ВІДМОВЕНО ВЛАСНИМИ. Для мене працювало наступне:

REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM username;
DROP USER username;

Користувач може мати привілеї в інших схемах, і в цьому випадку вам доведеться запустити відповідну лінію REVOKE на "public", замінену на правильну схему. Щоб показати всі схеми та типи привілеїв для користувача, я змінив команду \ dp, щоб зробити цей запит:

SELECT 
  n.nspname as "Schema",
  CASE c.relkind 
    WHEN 'r' THEN 'table' 
    WHEN 'v' THEN 'view' 
    WHEN 'm' THEN 'materialized view' 
    WHEN 'S' THEN 'sequence' 
    WHEN 'f' THEN 'foreign table' 
  END as "Type"
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE pg_catalog.array_to_string(c.relacl, E'\n') LIKE '%username%';

Я не впевнений, які типи привілеїв відповідають відкликанню таблиць, послідовностей чи функцій, але я думаю, що всі вони підпадають під одну з трьох.


12
Мені довелося додати і це:REVOKE ALL PRIVILEGES ON DATABASE db_name FROM username;
Войцех Якубас

3
Також схеми привілеїв.
greatvovan

2
Для привілеїв схеми:revoke USAGE on SCHEMA some_schema from username;
Альфаа

Я спробував це, але проблема в моєму випадку зберігається. Я розмістив це як окреме запитання в stackoverflow.com/questions/61168608/…
Андрус,

17

Також зверніть увагу, якщо ви явно надали:

CONNECT ON DATABASE xxx TO GROUP ,

вам потрібно буде відкликати це окремо від ВІДКРИТИЙ ВЛАСНИЙ, використовуючи:

REVOKE CONNECT ON DATABASE xxx FROM GROUP


Я спробував усе вище, і це все ще не спрацювало для мене, поки я прокрутився трохи далі до цього, тому тепер у мене залишилося волосся. Дещо. : D дякую !!
Мітч Кент

6

Мені довелося додати ще один рядок, щоб REVOKE ...

Після запуску:

REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM username;

Я все ще отримував помилку: ім'я користувача не можна скинути, оскільки деякі об'єкти залежать від нього ДЕТАЛІ: привілеї для загальнодоступних схем

Мені цього не вистачало:

REVOKE USAGE ON SCHEMA public FROM username;

Тоді мені вдалося кинути роль.

DROP USER username;

Також вам може знадобитися скасувати привілеї для "SCHEMA pg_catalog", якщо ви, наприклад, створили користувача для pg_rewind, який має привілеї щодо таких функцій, як pg_read_binary_file.
GreenReaper

5

Ось що, нарешті, спрацювало для мене:

REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA myschem FROM user_mike;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA myschem FROM user_mike;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA myschem FROM user_mike;
REVOKE ALL PRIVILEGES ON SCHEMA myschem FROM user_mike;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschem REVOKE ALL ON SEQUENCES FROM user_mike;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschem REVOKE ALL ON TABLES FROM user_mike;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschem REVOKE ALL ON FUNCTIONS FROM user_mike;
REVOKE USAGE ON SCHEMA myschem FROM user_mike;
REASSIGN OWNED BY user_mike TO masteruser;
DROP USER user_mike ;

2

Немає REVOKE ALL PRIVILEGES ON ALL VIEWS, тому я закінчив:

do $$
DECLARE r record;
begin
  for r in select * from pg_views where schemaname = 'myschem'
  loop
    execute 'revoke all on ' || quote_ident(r.schemaname) ||'.'|| quote_ident(r.viewname) || ' from "XUSER"';
  end loop;
end $$;

і звичайне:

REVOKE ALL PRIVILEGES ON DATABASE mydb FROM "XUSER";
REVOKE ALL PRIVILEGES ON SCHEMA myschem FROM "XUSER";
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA myschem FROM "XUSER";
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA myschem FROM "XUSER";
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA myschem FROM "XUSER";

щоб досягти наступного:

drop role "XUSER";

0

У командному рядку є команда dropuserробити скидання користувача з postgres.

$ dropuser someuser

-19

Я зіткнувся з тією ж проблемою і тепер знайшов спосіб її вирішити. Спочатку потрібно видалити базу даних користувача, яку ви хочете залишити. Потім користувача можна легко видалити.

Я створив користувача під назвою "msf" і якийсь час намагався видалити користувача та відтворити його. Я дотримувався наступних кроків і досяг успіху.

1) Відкиньте базу даних

dropdb msf

2) скинути користувача

dropuser msf

Тепер я користувач успішно відмовився.


2
Це неймовірно косоокий підхід, оскільки він вимагав би відтворити схему бази даних для кожної ітерації моєї роботи. (Що стосується наявності дрібнозернистих дозволів на існуючій схемі бази даних; тобто найкраще, якщо схема бази даних залишатиметься недоторканою.)
мільмозу
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.