Postgres rolleri en iyi uygulama uygulamasıdır


21

Millet,

Postgres kullanıcı erişim denetimi tasarımımı daha iyi ve en iyi uygulamalarla daha uyumlu hale getirmek için yardımınızı kullanabilirim. Küçük bir prodüksiyon Postgres sunucusunu piyasaya sürmeye yardım ediyorum ancak bir DB yöneticisi değilim, bu yüzden tehlikeli olacak kadar bilgim var.

Bir Postgres v9.2 kurulumu olan bir sunucu var. Bu yükleme, her biri tamamen farklı bir "müşteriye" hizmet veren birden çok veritabanını barındırır. Başka bir deyişle, müşteri1 veritabanı2'yi kullanmamalı, böyle kullanmamalıdır. Normal işlemler sırasında, veritabanlarına, hepsi Postgres'le aynı sunucuda bulunan eşleşen bir CakePHP örneği ile erişilir. Bu dağıtımda olası optimizasyonlar olsa da, çoğunlukla Psql rolleriyle ilgileniyorum.

Okuduklarımdan yola çıkarak üç çeşit rolün anlaşılacağı anlaşılıyor:

  • Varsayılan olmayan şifre ile Süper kullanıcı postgres
  • Rutin bakım, DB oluşturma, yedekleme, geri yükleme için süper kullanıcı ayrıcalıklarına sahip olmayan bir yönetici rolü. Tüm müşteri veritabanlarıyla bir şeyler yapabilmeli.
  • Sadece kendi veritabanında CRUD yeteneği ile kullanıcı rolleri. Uygulamayı temizlerse kendi veritabanlarında daha fazla haklara tolere edilebilir.

Bu tasarımı uygulamak daha az kendime güvendiğim yerdir. Tabloya karşı DB'nin mülkiyeti ve kimlerden biraz kimsesiz kalması gerektiğine bakılmaksızın. Aşağıda veritabanlarım ve kullanıcılarım var. Uygulamayı değerlendirmek için bu yeterli bilgi mi?

     Role name |                   Attributes                   |     Member of     
    -----------+------------------------------------------------+-------------------
     admin     | Create role, Create DB                         | {user1, user2}
     postgres  | Superuser, Create role, Create DB              | {}
     user1     |                                                | {}
     user2     |                                                | {}

    postgres=# \l
                                 List of databases
       Name    |  Owner   | Encoding | Collate | Ctype |   Access privileges   
    -----------+----------+----------+---------+-------+-----------------------
     admin     | postgres | UTF8     | en_US   | en_US | =Tc/postgres         +
               |          |          |         |       | postgres=CTc/postgres+
               |          |          |         |       | admin=CTc/postgres
     postgres  | postgres | UTF8     | en_US   | en_US | 
     template0 | postgres | UTF8     | en_US   | en_US | =c/postgres          +
               |          |          |         |       | postgres=CTc/postgres
     template1 | postgres | UTF8     | en_US   | en_US | =c/postgres          +
               |          |          |         |       | postgres=CTc/postgres
     user1     | admin    | UTF8     | en_US   | en_US | =Tc/admin            +
               |          |          |         |       | admin=CTc/admin      +
               |          |          |         |       | user1=CTc/admin
     user2     | admin    | UTF8     | en_US   | en_US | =Tc/admin            +
               |          |          |         |       | admin=CTc/admin      +
               |          |          |         |       | user2=CTc/admin

Dış bağlantıları ve şifreleri temizlemede önlemek için, pg_hba.conf şöyledir:

local   all             all                                     md5
host    all             all             127.0.0.1/32            md5
host    all             all             ::1/128                 md5

1
Tecrübelerime göre, büyük miktarda başka avantajlar da getiren en iyi ayrılık, her müşteri için ayrı PostGreSQL kümeleri (örneğin hizmetler) çalıştırmaktır. Şu anda büyük bir üretim ortamı için şu anda yaptığımız şey budur ve DB sayısı gerçekten büyüyüp her biri gerçekten küçük olmadıkça, bunu farklı bir şekilde yapmam. Tabii ki, uygulama aynı zamanda her kiracı (müşteri) için farklı bir veri kaynağına nasıl bağlanacağını bilmeye ihtiyaç duyuyor.
Florin Asăvoaie, 28:15

@ FlorinAsăvoaie yanına onun sözünü. Her veritabanının kendine ait sahibi ve sorgusu kullanıcısı olması gerekmez mi? Bu, bazı kullanıcıları bakım amacıyla bir şifre kasasına koymak daha kolay olacaktır.
hspaans

Yanıtlar:


5

Bunun eski bir soru olduğunu biliyorum, ancak bununla ilgili biraz araştırma yapmak zorunda olduğum için, şimdi bile cevaplamaya çalışacağım.

Ne yapmaya çalışıyorsanız , veritabanı düzeyinde çoklu kiracılık denir . Bu iki yolla gerçekleştirilebilir:

  1. Tek bir veritabanı kümesinde, OP'nin nasıl tanımlandığı, ancak kişisel tercihim şöyle olacaktır:

    • postgres kullanıcısı eş kimlik doğrulaması kullanıyor ve şifre bağlantılarına izin verilmiyor. MD5 kimlik doğrulaması, bence, kötü bir uygulamadır. Veritabanının tutarlılığı veya bu tür şeylerle ilgili herhangi bir sorun yaşarsanız, postgres'in eş kimlik doğrulamasını kullanmasına izin verirseniz, yine de giriş yapabilirsiniz.
    • Her müşteri kendi şemasını almalı ve veritabanını almalıdır . Bunun birkaç nedeni var:
      • Veritabanının tamamına sahip olmak birçok ayrıcalık sağlayacaktır.
      • Yalnızca belirli tablolara sahip olmak, geliştiriciler için sorun yaratacaktır ve her zaman yöneticilerden izin ve başka şeyler eklemesini istemek zorunda kalacaktır.
      • Dolayısıyla, normal bir kurulumda, her biri şemaları içinde tablolar, görünümler, tetikleyiciler vb. Dahil olmak üzere şeyler oluşturma erişimine sahip olacaktı.
      • Hepsi kullanıcı adı dışında aynı bağlantı dizesini kullanır. Postgreslerde, varsayılan olarak, kullanıcı adınızla bir şema varsa, otomatik olarak search_path içindedir.
    • Bir güvenlik önlemi olarak her şemaya erişebilecek bir yönetici kullanıcısı olmamayı tercih ederim. Her şemayı kendi kullanıcılarına atarak veya PostgreSQL'in PITR tekniğini kullanarak yedekleme yapmanız gerekir. Postgres kullanıcısını yeni şemalar oluşturmak için kullanmaya ihtiyacınız olacak, bir sudo kuralı ve bunun için bir script seçeceğim.
    • Güvenlik iyi uygulamaların çoğu, varsayılan şemayı bırakmanızı tavsiye eder - işte başlıyoruz.
    • Bu çözüm, her bir müşterinin DB'si küçükse ve tonlarca müşteriniz varsa son derece uygundur.
    • Uygulamanız çoklu kiracılıkla ilgileniyorsa, tüm müşteriler için tek bir bağlantı havuzu kullanabilir. Elbette, bu, yukarıdaki güvenlik geliştirmelerinin çoğunu ortadan kaldırır, ancak özellikle çok sayıda müşteriniz olduğunda (500-1000 ayrı veri kaynağınız varsa ve bağlantı havuzu kullanıyorsanız, oldukça zor olacaktır) performans avantajlarına sahip olabilir.
  2. Her müşteri kendi veritabanı kümesini alır. Bu benim tercih ettiğim çözüm, çünkü genellikle her müşteri için büyük veritabanları olan uygulamalarla çalışıyorum.

    • Bu, çok iyi veri ayrımı getiriyor. Her müşteri için ayrı depolama birimleri kullanabilir, CPU ve Bellek sınırlamaları atayabilirsiniz (docker kullanarak?).
    • Her müşterinin kendi örneğinde neye ihtiyacı olduğu konusunda gerçekten iyi esneklik. Bunlar benzer olabilir veya farklı özelliklere sahip olabilir.
    • Her iki yönde de ölçeklendirmek çok kolaydır (yukarı ve dışarı).
    • Ayrıca her kümenin bağlantılar için dinlediği ve veri kaynağının yeniden yapılandırılması gerekmemesi için ölçeklendirmeyi yapan ayrı sanal IP'ler kullanıyorum.
    • PITR yedekleri müşteri başınadır, bu nedenle şema başına çoklu kiracılığa göre tek bir müşteriyi geri yüklemek daha kolay olacaktır.
    • Karmaşık kurulumlarda, her müşterinin birden fazla veritabanına, şemasına, kullanıcısına ve rolüne vb. İhtiyacı olabilir. Bu nedenle bu durumlarda bu daha iyi bir çözümdür.

Ayrıca yukarıdakilerin bir birleşimini kullanabilir ve bir yönlendirici olarak pgBouncer kullanabilirsiniz.

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.