Làm cách nào tôi có thể tạo người dùng chỉ đọc để sao lưu trong PostgreSQL?


15

Có đúng là nó KHÔNG THỂ tạo ra một người dùng sao lưu chỉ đọc trong PostgreQuery không?

Tôi đã được thông báo trên kênh IRC rằng đơn giản là bạn không thể chỉ có người dùng dự phòng không có quyền sở hữu. Tôi thấy nó rất lạ nên tôi muốn chắc chắn rằng mình không thiếu thứ gì.

Dưới đây là những gì tôi đã thử nhưng nó không mang lại cho tôi kết quả mà tôi đang tìm kiếm. Khi tôi làm pg_dumptrên một bảng nhất định, tôi nhận được Permission denied for relation...:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO backup; 
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO backup; 
GRANT SELECT, USAGE ON ALL SEQUENCES IN SCHEMA public TO backup;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, USAGE ON SEQUENCES TO backup;

Mọi sự trợ giúp sẽ rất được trân trọng!


Câu trả lời:


9

Không, nó dễ dàng (bây giờ dù sao đi nữa).

  1. Cấp quyền kết nối cho người dùng mới

    GRANT CONNECT ON DATABASE mydb TO myReadolyUser;
  2. Cấp quyền trên tất cả các đối tượng cơ sở dữ liệu hiện tại . Đây là đặc trưng của lược đồ và bạn sẽ phải chạy một bản sao cho mỗi lược đồ bạn muốn cho người dùng của mình sử dụng,

    GRANT SELECT ON ALL TABLES IN SCHEMA mySchema TO myReadonlyUser;

    Từ các tài liệu , ALL TABLESbao gồm mọi thứ bạn muốn.

    Ngoài ra còn có một tùy chọn để cấp đặc quyền cho tất cả các đối tượng cùng loại trong một hoặc nhiều lược đồ. Chức năng này hiện chỉ được hỗ trợ cho các bảng, trình tự và chức năng (nhưng lưu ý rằng TẤT CẢ CÁC BẢNG được coi là bao gồm các chế độ xem và bảng nước ngoài.

  3. Sau đó ALTER DEFAULT PRIVLEGESđể cấp các SELECT đặc quyền trong tương lai cho các đối tượng chưa được tạo.

    ALTER DEFAULT PRIVILEGES IN SCHEMA mySchema
    GRANT SELECT ON TABLES TO myReadonlyUser;

Tôi nhận thấy rằng khi chạy ALTER DEFAULT PRIVILEGES ... myReadonlyUser, 2 dòng bổ sung được thêm vào kết xuất : ALTER DEFAULT PRIVILEGES FOR ROLE root IN SCHEMA public REVOKE ALL ON TABLES FROM PUBLIC; ALTER DEFAULT PRIVILEGES FOR ROLE root IN SCHEMA public REVOKE ALL ON TABLES FROM root;. Âm thanh như thế này có nghĩa là root sẽ không thể làm bất cứ điều gì trên các bảng mới. Điều này có đúng không?
dthor

Ngoài ra, nếu các bảng bigintcủa bạn sử dụng người dùng chỉ đọc của bạn có thể cũng sẽ cầnGRANT SELECT ON ALL SEQUENCES
dthor 11/11/19

6

Cách đơn giản và tốt đẹp là tạo một siêu người dùng với quyền chỉ đọc.

  • Đăng nhập psqlnhư postgres hoặc superuser khác.
  • Tạo vai trò siêu người dùng mới và đặt thành chỉ đọc:

    CREATE USER backadm SUPERUSER  password '<PASS>';
    ALTER USER backadm set default_transaction_read_only = on;
    • Thay thế <PASS>bằng mật khẩu đã chọn của bạn.
    • Bạn có thể thay thế backadmbằng tên người dùng được chọn. (Tôi đặt backadmcho Backup Administrator).
    • KHÔNG quên dấu ngoặc đơn cho mật khẩu.

Bây giờ bạn có thể sử dụng vai trò này để sao lưu.


6
Ewww. Một siêu người dùng để sao lưu? Ông đặc biệt yêu cầu chỉ đọc. Người dùng đó là một SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITEhoặc ALTER USER backadm set default_transaction_read_only = off;không có quyền truy cập vào cơ sở dữ liệu không hạn chế.
Evan Carroll

Người dùng này vẫn có thể bỏ các bảng / lược đồ / cơ sở dữ liệu bất kể các giao dịch đó chỉ được đọc.
Igor Mukhin

4

Lưu ý blog được tham chiếu trong câu trả lời do @Gyre đưa ra sẽ không hoạt động để tạo người dùng chỉ đọc "ứng dụng" (nghĩa là để tạo vai trò chỉ đọc cho ứng dụng web để kết nối với cơ sở dữ liệu) và có thể mở ra một cách nghiêm túc lỗ hổng bảo mật, vì nó dễ dàng bị phá vỡ, như được giải thích trong phản hồi danh sách postgresql này . Để tham khảo, bởi khách hàng ghi đè cài đặt phiên:

SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITE

Tham khảo 'Quyền quản lý trong bản trình bày của postgresql được liên kết trong wiki postgres để biết phương pháp chi tiết hơn, tương tự như phương pháp được đăng trong câu hỏi.


Đây không thực sự là một câu trả lời, nó là một bài phê bình về các câu trả lời khác vì không an toàn mà tôi đã sao chép như một nhận xét. Tôi đã trả lời đúng câu hỏi này ngay bây giờ.
Evan Carroll

3

Sau khi thử nghiệm lại với giải pháp của Evan Caroll, tôi đã gặp phải lỗi này:

LRI: quyền bị từ chối cho 'bảng' quan hệ

còn thiếu một sự cho phép khác:

GRANT SELECT ON ALL SEQUENCES IN SCHEMA mySchema TO myReadonlyUser

Thêm quyền này cho phép tôi sao lưu với người dùng chỉ đọc của mình.


2

Tôi đã thực hiện một số nghiên cứu thích hợp và dường như DOES là một giải pháp cho việc này. Tôi đã đi qua bài viết trên blog này giải thích hoàn hảo những gì cần phải làm. Tôi hy vọng điều này sẽ giúp cho những người đang tìm kiếm câu trả lời giống như tôi. Rõ ràng - khôi phục lại các bản sao lưu được thực hiện theo cách này là một câu hỏi khác.


Thay vì chỉ liên kết với bài đăng trên blog, bạn nên thêm một số chi tiết vào câu trả lời của mình trong trường hợp bài đăng trên blog bị liên kết (xem en.wikipedia.org/wiki/Link_rot )
Max Vernon

Ý tưởng cơ bản từ blogpost là ALTER USER set default_transaction_read_only = on;, điều đó không ngăn người dùng thay đổi nó.
xanh

Ewww. Một siêu người dùng để sao lưu? Ông đặc biệt yêu cầu chỉ đọc. Người dùng đó là một ĐẶC ĐIỂM SESSION AS AS TRANSACTION READ WRITE hoặc ALTER USER backadm set default_transaction_read_only = off; tránh xa việc truy cập không hạn chế vào cơ sở dữ liệu.
Evan Carroll
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.