Oluşturulan kullanıcı PostgreSQL'deki tüm veritabanlarına herhangi bir hibeye gerek duymadan erişebilir


44

PostgreSQL'i kurarken bir şeyleri kaçırmalıyım. Yapmak istediğim, belirli bir kullanıcının yalnızca belirlediğim veritabanlarına erişebilmesi için birbirinden yalıtılmış birden çok veritabanı ve kullanıcı oluşturmak. Ancak, belirleyebileceğim şeye göre, oluşturulan herhangi bir kullanıcının belirli bir hibe verilmeksizin tüm veritabanlarına erişimi vardır.

İşte bir Ubuntu Sunucusu 12.04'te ne yapıyorum:

  1. apt-get install postgresql
  2. sudo -u postgres createuser -DRSP mike1 (Yeni kullanıcı için şifreyi belirleme)
  3. sudo -u postgres veri yarattı1
  4. psql -h localhost -U mike1 data1 (Giriş yapması için mike1 kullanıcısı için parola belirtme)

Görünen o ki, yeni "mike1" kullanıcısı "data1" veritabanına bağlanma ve tablo oluşturma vs. ile ilgili herhangi bir problemi yok gibi görünüyor. 3. adımdaki sahibi). Gerçekten çalışması gerekiyor mu?

Yapmak istediğim, mike1'e data1'e tam erişim izni vermek ve ardından daha fazla kullanıcı ve veritabanı için bunu tekrarlamak; kullanıcıların, yalnızca benim seçtiğim bir (veya muhtemelen birkaç) veritabanına erişebilmelerini sağlamak.


1
Bir kullanıcı bir veritabanıyla sınırlı olsa bile, genel tabloları sorgulayabildiklerini ve bunun da veritabanı adlarının listesini ve kullanıcı listesini görmelerini sağlar.
kgrittn

Yanıtlar:


46

SQL seviyesinde, her kullanıcı aşağıdaki SQL komutu verilene kadar yeni oluşturulan bir veritabanına gerçekten bağlanabilir:

REVOKE connect ON DATABASE database_name FROM PUBLIC;

Bir kez yapıldığında, bağlanabilmesi gereken her kullanıcı veya role açıkça bağlantı ayrıcalığı verilmelidir:

GRANT connect ON DATABASE database_name TO rolename;

Düzenleme: Çok kiracılı bir senaryoda, yalnızca connectayrıcalıktan daha fazlası kaldırılır. Çok kiracılıkla ilgili ipuçları ve en iyi uygulamalar için, postgresql genel wiki'sini okumak isteyebilirsiniz: Paylaşılan Veritabanı Barındırma ve PostgreSQL'deki hakları yönetme .


Varsayılan, tam tersi olmalıydı. Rasgele oluşturulmuş bir parola ile bir kullanıcı oluşturmak ve postgrestüm veritabanlarına erişebileceğini bilerek tek bir DB'ye erişim vermek istiyorum .
TheRealChx101

24

KAMU varsayılan olarak veritabanına erişebilir, ancak verilere erişemez. KAMU’U GERİ ALABİLİRSİNİZ:

REVOKE CONNECT ON DATABASE your_database FROM PUBLIC;

Gelecekteki tüm veritabanları için bu ayarı istiyorsanız, template1 veritabanında CONNECT'i iptal edin (yeni bir veritabanı oluşturmak için varsayılan şablon veritabanı):

REVOKE CONNECT ON DATABASE template1 FROM PUBLIC;

Anlıyorum. Şimdi daha mantıklı. Sanırım buraya PostgreSQL'e yeni gelen biri olarak gelmemeliyim ve belki de KAMU’nun varsayılan olarak template1'de CONNECT ayrıcalığına sahip olmaması gerektiği konusunda tartışmalıyım :) Ama artık verilerin hiçbir zaman tehlikede olmadığını görüyorum :) Teşekkürler!
mikeplaka

1
Yeni gelen biri olarak, ayrıca ayarları tartışmaktan daha fazla hoş geldiniz. Bundan herkes öğrenebilir!
Frank Heikens

1
Aslında, bu CONNECT ayrıcalığı, şablondan yeni veritabanına aktarılmadığından, şablon1 üzerinde iptal edilmesi söz konusu etkiye sahip değildir.
Daniel Vérité

2
@ DanielVérité Görüyorum. Bu yüzden çözümün yeni bir veritabanı oluştururken her zaman REVOKE CONNECT'i hatırlamak ve yapmak olduğunu düşünüyorum. Bu gerçekten PostgreSQL yöneticileri tarafından yapılır mı, yoksa verilere erişilemediğinden bu kadar umrumda değil mi? Yine de, yalnızca çok kiracılı bir ortamda yetkilendirilmiş kullanıcılar arasında olması durumunda, bir tablo listesinin gelecekteki saldırılar için gereksiz bilgiler sağlayabileceğini düşünüyorum. Ayrıca: halkın REVOKE CONNECT olmayan herhangi bir veritabanında kendi tablolarını da oluşturabildiğini fark ettim. Varsayılan olarak sahip olmak biraz garip geliyor, söylemeliyim.
mikeplaka

1
Evet. Cevabımı ilgili bağlantılar ekliyorum, bu konuda birkaç doktora daha okumak isteyebilirsiniz.
Daniel Vérité

4

Bağlantı ayrıcalıklarını PUBLIC'ten varsayılan olarak iptal etmenin ve onlara özel olarak istenen şekilde vermenin yanı sıra, erişimi denetleyebileceğiniz diğer seviye pg_hba.conf dosyasıdır.

Dosyanın nerede saklandığını bulabilirsiniz:

SHOW hba_file;

Bu mekanizmayı kullanmayı seçerseniz, başlamanız için yeterli olabilecek gömülü yorumlar vardır. Dokümanlar burada:

http://www.postgresql.org/docs/current/interactive/auth-pg-hba-conf.html


Teşekkürler! Pg_hba.conf dosyasına baktım ancak bir kullanıcının bir veritabanına bağlanırken kimliğini nasıl doğruladığı ve kullanıcının aynı veritabanında sahip olduğu ayrıcalıkları yönetmediği izlenimindeydim .
mikeplaka

1
Bir kullanıcı sadece pg_hba.conf tarafından izin verilen veri tabanlarına bağlanabilir . Bu, yalnızca kullanıcı ve veritabanı kombinasyonunu değil aynı zamanda bağlandıkları ana bilgisayarı ve izin verilen doğrulama yöntemini de içerir. Bu kontrol ayrıntı derecesine ihtiyacınız yoksa , diğer cevaplarda tartışılan GRANT/ REVOKEtekniği muhtemelen daha kolaydır. Birincisi, dosyayı düzenlemek için bir OS girişine ihtiyaç duymak yerine, bunun için sadece bir süper kullanıcı veritabanı bağlantısına ihtiyacınız var.
kgrittn

0

Kullanıcıların diğer veritabanı adlarını bile listelemesini engellemenin bir yolunu aramaya başladım. Bunu REVOKE CONNECTengellemez.

Bu SO sorununun cevaplarına göre, bunu başarmanın (tavsiye edilebilir) bir yolu yoktur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.