Hibah minimal untuk akses tabel tunggal baca saja di PostgreSQL

10

Berikut ini adalah daftar perintah yang tampaknya berfungsi untuk membuat pengguna baru (login) dan memberikan akses hanya baca untuk satu tabel yang ditentukan pada PostgreSQL.

Mari kita asumsikan bahwa perintah-perintah ini dijalankan pada saat login dengan hak istimewa yang cukup (mis. postgresLogin pada instalasi default).

CREATE ROLE user_name NOSUPERUSER NOCREATEDB 
NOCREATEROLE NOINHERIT LOGIN PASSWORD 'pwd' VALID UNTIL 'infinity';

Sekarang saya ingin memberikan selectpada tabel tab_abcdi database db_xyz, jadi begini (database db_xyzdipilih sebagai arus melalui PgAdmin atau sesuatu seperti itu):

grant select on tab_abc to user_name;

Pertanyaannya adalah: apakah ini cukup atau harus ada lebih banyak hibah (database connect, usagemungkin)?

Perintah-perintah ini sepertinya bekerja untuk saya, tetapi instalasi default saya memiliki pengaturan keamanan default. Apa hibah tambahan yang harus saya tambahkan jika admin server mengkonfigurasi keamanan yang lebih kuat?

Tampaknya saya tidak perlu memberikan connectatau tidak usage- apakah itu implisit saat memberikan select? Apakah selalu demikian?

WildWezyr
sumber

Jawaban:

12

Pertanyaannya adalah: apakah ini cukup atau harus ada lebih banyak hibah (koneksi database, penggunaan mungkin)?

Keamanan mungkin diperkeras dari default terutama pada poin-poin ini:

  • The pg_hba.confberkas. Ini menyaring koneksi sebelum hak istimewa basis data apa pun dipertimbangkan. Defaultnya relatif terbuka untuk koneksi lokal, tetapi mungkin dibatasi untuk daftar eksplisit dari database, nama pengguna, dan asal-usul jaringan.

  • Izin untuk publik , peran semu yang dimiliki siapa pun. Seorang pengguna dapat secara implisit terhubung hanya jika hak koneksi terhubung diberikan PUBLIC. Lihat Pengguna yang dibuat dapat mengakses semua database di PostgreSQL tanpa hibah . Basis data mungkin mencabut semua hak istimewa dari publik. Lihat REVOKE dalam dokumen untuk versi PostgreSQL utama yang Anda gunakan.

  • Adanya publicskema. Ini dibuat dengan database secara default untuk kenyamanan tetapi tidak wajib. Alih-alih menghapus izin publik dari publicskema, mungkin masuk akal bagi DBA untuk hanya menjatuhkan publicskema ketika pengguna baru seharusnya tidak memiliki izin implisit sama sekali.

Dalam kasus ketika default-default ini telah dihapus, untuk membaca satu tabel seorang pengguna baru harus diberikan:

GRANT CONNECT ON DATABASE dbname TO username;

Di tingkat basis data:

GRANT USAGE ON SCHEMA schemaname TO username;
GRANT SELECT ON schemaname.tablename TO username;
Daniel Vérité
sumber