PostgreSQL: quyền bị từ chối vì quan hệ


14

Tôi hơi bối rối về việc thiết lập quyền trong PostgreSQL.

Tôi có những vai trò sau:

                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 admin     | Superuser, Create role, Create DB, Replication | {}
 meltemi   | Create role, Create DB                         | {rails}
 rails     | Create DB, Cannot login                        | {}
 myapp     |                                                | {rails}

và cơ sở dữ liệu:

                                    List of databases
        Name         | Owner  | Encoding |   Collate   |    Ctype    | Access privileges 
---------------------+--------+----------+-------------+-------------+-------------------
 myapp_production    | rails  | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 ...

người dùng myappkhông gặp vấn đề khi truy vấn myapp_productioncơ sở dữ liệu thêm & xóa hồ sơ. Tôi cũng muốn meltemicó thể truy vấn cùng một cơ sở dữ liệu. Vì vậy, tôi đã tạo ra một vai trò railssở hữu cơ sở dữ liệu và thực hiện cả hai meltemimyappcác thành viên của rails. Nhưng tôi vẫn nhận được permission denied for relationlỗi. Meltemicó thể xem lược đồ nhưng không thể truy vấn DB.

Tôi chỉ nhận thấy (với \dtlệnh) đó myapplà chủ sở hữu của các bảng:

             List of relations
 Schema |       Name        | Type  | Owner 
--------+-------------------+-------+-------
 public | events            | table | myapp
 public | schema_migrations | table | myapp
 ...
 public | users             | table | myapp
 ...

Các bảng được tạo thông qua ORM (Di chuyển ActiveRecord của Rails).

Tôi biết ủy quyền rất khác nhau trong PostgreSQL (trái ngược với MySQL và những người khác tôi đã sử dụng). Tôi nên thiết lập cơ sở dữ liệu của mình như thế nào để những người dùng khác nhau có thể truy cập nó. Một số nên có thể CRUD nhưng những người khác chỉ có thể đọc, v.v ...

Cảm ơn vì bất kì sự giúp đỡ. Xin lỗi, tôi biết đây là một câu hỏi rất cơ bản nhưng tôi không thể tự tìm câu trả lời.

Câu trả lời:


4

Tôi vừa viết về điều này trong câu trả lời của tôi về Cấp quyền trên cơ sở dữ liệu postgresql cho một người dùng khác trên ServerFault.

Về cơ bản, giải pháp tốt nhất khi bạn có một người dùng và bạn muốn cấp cho người dùng khác quyền tương tự là biến người dùng đó thành một nhóm, tạo một người dùng mới có cùng tên với người dùng ban đầu là thành viên của nhóm và cấp nhóm đó cho người dùng khác quá.

Vì vậy, trong trường hợp của bạn, railsđược đổi tên thành nói myapp_users, sau đó bạn tạo một vai trò đăng nhập mới (người dùng) có tên railsGRANT myapp_users TO rails. Bây giờ bạn một GRANT myapp_users TO meltemi. Cả railstài khoản mới và meltemingười dùng hiện có quyền của railstài khoản cũ .

Để kiểm soát chi tiết hơn, tôi thường khuyên bạn nên tránh cho người dùng đăng nhập hàng ngày hoặc quyền sở hữu nhóm của họ đối với các bảng. Cấp cho họ quyền truy cập thông qua một NOINHERITnhóm mà họ phải rõ ràng SET GROUPhoặc tốt hơn là sử dụng một người dùng hoàn toàn khác cho các hoạt động đặc quyền như DDL và GRANTs. Thật không may, điều này không hoạt động với Rails, vì Rails thích áp dụng di chuyển bất cứ khi nào nó cảm thấy như vậy và AFAIK không cung cấp cho bạn khả năng chỉ định một người dùng khác, đặc quyền hơn để chạy di chuyển như.


OK, đọc bài bạn liên kết đến; rất hữu ích Bây giờ, nếu tôi hiểu đúng, tôi nghĩ bạn có thể sử dụng myappthay vì railsở trên? Bởi vì myappsở hữu các bảng (tôi không bao giờ chỉ định điều đó, việc di chuyển phải có). Dù sao, nó sẽ sorta có ý nghĩa nếu tôi đổi tên myappđể myapp_groupvà sau đó thực hiện một người dùng mới myappmà ray ứng dụng sẽ sử dụng để kết nối với DB. Thực hiện myappvà hiện có meltemi, cả hai thành viên của myapp_groupvai trò. Nhưng điều gì xảy ra khi tôi chạy di chuyển tiếp theo. nó sẽ không được sở hữu bằng cách myapptái tạo vấn đề một lần nữa chứ?!?
Meltemi

1
Bạn phải hiểu rằng PostgreSQL chỉ có roles(kể từ phiên bản 8.1). Các điều khoản usergroupđược giữ xung quanh vì lý do lịch sử và khả năng tương thích. Về cơ bản, một "nhóm" là một vai trò không có đặc quyền đăng nhập. Bạn có thể cấp myappcho meltemingay cả khi myappchỉ là một "người dùng" khác. Bắt đầu bằng cách đọc hướng dẫn ở đây .
Erwin Brandstetter

Tôi DO hiểu rolesvs groupsvs userstách trong Postgres, ít nhất tôi nghĩ tôi làm. Xin lỗi để sử dụng thuật ngữ sai (và khó hiểu) ở trên. Nhưng tôi vẫn không hiểu làm thế nào để thiết lập cơ sở dữ liệu của tôi vì vậy một vai trò không đăng nhập sở hữu cơ sở dữ liệu và hai vai trò đăng nhập myappmeltemicả hai có thể có quyền truy cập đầy đủ. Một trong những vai trò đó myappsẽ chạy di chuyển Rails , chắc chắn sẽ tạo ra các bảng mới, một lần nữa, được sở hữu bởi myapp, một người dùng đăng nhập. Tôi có nên tạo meltemimột 'thành viên' myappvà được thực hiện với nó không? Nhưng điều đó dường như chỉ là ... không?!?
Meltemi

1
@Meltemi: Nếu bạn muốn cấp tất cả các đặc quyền myappnắm giữ meltemi, thì đó sẽ là điều đúng đắn. Nếu bạn chỉ muốn meltemicó một tập hợp các đặc quyền, thì không. Sau đó tạo một vai trò nhóm để giữ tập hợp các đặc quyền và cấp cho meltemi. Rất có thể bạn sẽ quan tâm đến câu hỏi liên quan này trên SO . Tôi đã trả lời giải thíchDEFAULT PRIVILEGES
Erwin Brandstetter

@Meltemi Có, như thường lệ di chuyển Rails làm phức tạp hình ảnh. Rails thực sự sẽ cho phép bạn chỉ định một tài khoản người dùng khác để chạy di chuyển như. Bạn có thể có thể thêm một SET ROLElệnh để bắt đầu di chuyển và RESET ROLEkết thúc, nhưng tôi không tin Rails sẽ điều hành toàn bộ mọi thứ một cách gọn gàng. Quyền của Erwin; trong trường hợp này, cách giải quyết tốt nhất sẽ là GRANTđường ray người dùng trao quyền sở hữu cho người dùng khác, sử dụng người dùng thứ nhất làm nhóm cho nhóm thứ hai.
Craig Ringer
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.