Bir uygulamanın her kullanıcısı için ayrı bir veritabanı hesabı kullanmak hiç iyi bir uygulama mı?


13

Alıştığım uygulamalar sunucu tabanlıdır ve birçok kullanıcı için tek bir veritabanı hesabı kullanır, uygulama kodu kullanıcının neler yapabileceğini veya tek kullanıcıyı kontrol eder.

Her bir kişinin kendi veritabanı hesabına ihtiyaç duyduğu başarılı karmaşık iş uygulamaları var mı ve her bir kullanıcının neye izin vermesi ve yapmasına izin verilmemesi gerektiğine dair politika kurallarını uygulamak için veritabanı sunucusuna güveniliyor mu?

Birden çok kişinin bir veritabanındaki bilgilere katkıda bulunduğu ve başkaları tarafından depolanan bilgilere (örneğin, müşteri kayıtlarına erişmesi gereken bir kuruluştaki meslektaşları) erişebildiği uygulamaları düşünüyorum.

Ayrıca bu tür bir kurulum için bir ad var mı?


1
Bunu kafasına çevirelim, yapmamak iyi bir uygulama olur mu?
Stevetech

Bazı durumlarda kesinlikle standart bir uygulama değildir. Birçok uygulamanın birçok son kullanıcısı vardır, ancak tek bir veritabanı kullanıcısı vardır - örneğin wordpress, drupal, roundcube, redmine. Bildiğim kadarıyla, bu uygulamaların her biri için önerilen kurulum veritabanı düzeyinde sadece bir kullanıcı hesabı var, ancak yüzlerce veya binlerce kullanıcı kolayca olabilir.
bdsl

@Stevetech, sorumun cevabının "Evet" olduğu anlaşılıyor. bunu tam bir cevaba genişletebilir misiniz?
bdsl

Yanıtlar:


6

Veri düzeyinde gerçekten sıkı kontrole ihtiyacınız varsa. Örneğin, kapsamlı denetim. Birden fazla kullanıcı aynı hesabı paylaşıyorsa denetim pek iyi değildir. Veri veritabanına doğrudan erişmesi gereken bazı kullanıcılarınız varsa.

Güvenlik bu kadar sıkıysa, veritabanını doğrudan göstermezsiniz. Bir hizmetiniz var ve istemcinin hizmetten veri alması gerekiyor.

Bir web uygulamasında veritabanı (ör. Bağlantı noktası 1433) genellikle doğrudan gösterilmez, bu nedenle bir güvenlik seviyeniz vardır. Web uygulama veritabanına erişir bile doğrudan kullanıcıların hala yok doğrudan veritabanına erişimi.

Kullanıcı adı ve şifre istemci uygulamasındaysa, saldırıya uğrayabilir. Bir etki alanı ise tümleşik güvenlik kullanabilirsiniz.

Veritabanında oldukça ince kontrollere sahip olabilirsiniz. Ancak satır seviyesi kontrolü biraz iş. Bir veritabanı iş kuralları için iyi bir araç değildir. İş kuralları ve ayrıntılı güvenlik genellikle uygulama düzeyinde uygulanır.

Yöneticiler tarafından kullanılan bazı saklı yordamların bulunduğu ve hangi yöneticiyi izlemek istediğiniz karma bir modunuz olabilir. Ayrıca, doğrudan rapor oluşturan kullanıcılara salt okuma erişimi verebilirsiniz.


5

Buradaki zorluk, veritabanı erişiminizin bir soyutlama ile yönetilmesidir. Kendileri olarak bağlanan kullanıcılar yerine, aslında bazı genelleştirilmiş uygulama rolünün kimliğini alırlar. Yalnızca bireysel bağlantının görünürlüğünü kaybetmezsiniz, aynı zamanda tüm bireysel kullanıcılarınız için farklı erişim türleri tanımlamanın ayrıntı düzeyini de kaybedersiniz.

Bu yaklaşımı kullanmanın ana nedeni basitliktir. Birçok uygulama, uygulamanın kullanıcısı veritabanı hakkında hiçbir bilgiye sahip olmayacak şekilde tasarlanmıştır. Özellikle uygulama kendi iç güvenliğini yönetiyorsa buna gerçekten ihtiyaç duymazlar. Bireysel kullanıcıların çoğu asla doğrudan veritabanına bağlanmaz, bu nedenle onlar için açık bir oturum tanımlamak gerekmez.

Veritabanınızın güvenliğinizi yönetmesine izin vermeniz gereken tek zaman, doğrudan veritabanınıza bağlanacak kullanıcılarınız varsa. Bu, uygulamanızın etrafında dolaştıkları ve artık güvenliği tek başına uygulayamayacağı anlamına gelir. Buradaki avantaj, güvenliğinizi tanımlama konusunda daha ayrıntılı olmanızdır. Dezavantajı, kullanıcıları ve izinlerini yönetmek için daha yüksek bir ek yüktür.

resim açıklamasını buraya girin

Bu tür bir erişime gereksinim duyuyorsanız, Rol Tabanlı Erişim Denetimi'ni kullanmak istersiniz . Rolleri, veritabanınızda ne tür izinlere ihtiyaç duyulduğuna bağlı olarak tanımlamalı ve daha sonra tek tek kullanıcıları bu roller altında gruplandırmalısınız. Bu, doğrudan erişiminizi yönetirken hızlı bir şekilde kontrolden çıkabilen güvenlik modeliniz üzerinde daha iyi denetim ve kontrol sağlar.

Buna melez bir yaklaşım var. Güvenliğinizin veritabanı tarafından kısmen yönetilmesini istiyorsanız, her biri rolleri tarafından tanımlanan birden çok uygulama kullanıcısı oluşturabilir ve yerine getirdikleri role göre bu kullanıcılara açıkça erişim verebilirsiniz. Bu, bazı güvenlik modeliniz için veritabanı motorundan yararlanabileceğiniz anlamına gelir, ancak yine de uygulama içinde bazı yönetiminizin olması gerekir. Uygulama kullanıcı modelinin karmaşıklığını artırır, ancak kullanımdaki farklı girişlerde size daha ayrıntılı ayrıntı verir.


4

En kısa zamanda güvenliği en ayrıntılı düzeyde uygulamaya başlamalısınız. Roller bu konuda yardımcı olur - insanlara aynı anda birkaç masaya erişim vermek bir kabus değildir.

Herkes için tek hesap burada ve başka yerlerde büyük bir soru kaynağı - "x kaydı silindi, kimin yaptığını nasıl öğrenebilirim?" - cevap veremezsiniz - bireysel hesaplar ve denetim olmadan .

"Denetim" demekle, herkes için çok iyi bir hesap olmasına rağmen, bu gerçek güvenliğe sahip olduğunuz anlamına gelmez. Örneğin, İK tablosundaki bir kayıt silinirse, söyleyebileceğin tek şey İK tablosuna erişimi olan bir kişinin bunu yaptığından - bu x kişi sayısıdır.

Sisteminizde, X eylemini gerçekleştiren bireysel seviyeye kadar takip edebilmek için eylemleri kaydeden tetikleyicilere ihtiyacınız vardır (bunun Oracle gibi otomatik yapılabileceği bir RDBMS'niz yoksa).

Her durumda, güvenliğinizi daima mümkün olduğunca çabuk ayrıntılı hale getirmelisiniz - insanlara tablolara yalnızca "bilmeye ihtiyaç duydukları" temelde erişim verin. Ve, her zaman tablolara eylemler için zaman damgaları ekleyin - insanlar sık ​​sık kimliklerini başkalarına verir - "Jimmy, 17: 49'da ofiste tek inandınız ..." - yine, bu zırhlı değil, sadece titremede başka bir ok.

Belki bize RDBMS'nizi verdiyseniz, durumunuzla ilgili daha spesifik / alakalı tavsiyeler alabilirsiniz?


Bunun doğrudan durumumla ilgili olduğunu düşünmüyorum, çoğunlukla meraktan sormaya çalışıyordum. Web uygulamaları ve MySQL ile çalışıyorum.
bdsl

1
Tüm veritabanlarının her bir insan son kullanıcının benzersiz bir oturum açmasını gerektirdiğini söylüyorsunuz, ancak tüm uygulama için sadece bir DBMS kullanıcısı kullanan birçok sunucu uygulamasını biliyorum ve bunu en iyi şekilde mahkum etmedim uygulama.
51'de bdsl

1
Entelektüel merakla ilgili yanlış bir şey yok - yayınınız iyi bir resepsiyona sahip gibi görünüyor. MySQL muhtemelen güvenlik kapasitesinin en kötüsüdür (diğer pek çok ülkede olduğu gibi ...), ancak MariaDB bunlara sahiptir ve aynı zamanda Açık Kaynaktır. Yorumuna cevap olarak - ne bahsediyoruz olduğunu iyi uygulama değil - bu kötü uygulama.
Vérace

1
@bdsl Sunucuyu iş uygulamasıyla karıştırıyorsunuz ve bu bir karışıklık kaynağı. İş uygulamaları, masaüstü uygulamalarını içerir.
paparazzo

1
@bdsl Ardından, masaüstü uygulamasını hariç tutmak istemiyorsanız sunucu uygulamaları terimini kullanmayı bırakın.
paparazzo

3

Evet öyle. Bir uygulamadan bir veritabanına tek bir güçlü kullanıcı olarak bağlanmak , en az ayrıcalık ilkesinin ihlalidir . Bu, çoğu SQL Enjeksiyon saldırısının temel nedenidir.

Bu genellikle cehalet, basitlik uğruna veya bazen performans için yapılır.

Veritabanları genellikle uzun ömürlüdür ve aynı anda ve zaman içinde birden fazla uygulama tarafından kullanılır. Birden çok uygulama yerine veritabanında erişim denetimini merkezileştirerek kaynak tasarrufu yapabilirsiniz.

Satır Güvenliği, Sütun Güvenliği ve Kimliğe Bürünme / Proxy Kimlik Doğrulaması'nı destekleyen bir db sunucusu seçmek istersiniz (gerçek db kullanıcıları + bağlantı havuzunu destekler)

Ayrıca yeteneksiz eklenti yazarları nedeniyle SQL enjeksiyonlarından kaçınmanın zor olduğu Wordpress gibi "eklenti" tabanlı uygulamalar için daha güvenli olacaktır. Her eklenti bir bütün olarak uygulama yerine db girişi alır.


Bir Wordpress sitesinin her kullanıcısının veritabanına farklı kimlik bilgileriyle bağlanması mümkün müdür?
bdsl

@bdsl evet öyle.
Neil McGuigan

1
Bunun nasıl yapılacağı ile ilgili herhangi bir rehbere bağlantı verebilir misiniz? Hızlı bir arama yaptım ve bulamadım. Bu, wordpress giriş sayfasının DB'de oturum açmak için gereken kimlik bilgilerini istediği anlamına mı geliyor?
bdsl

@bdsl benim php oldukça paslı. Spring (Java) ve PostgreSQL ile bunu nasıl yapacağınız aşağıda açıklanmıştır. blog.databasepatterns.com/2015/03/… . stackoverflow.com/questions/2998597/…
Neil McGuigan

1
Wordpress sadece eklenti tabanlı bir sistem örneğiydi. Güvenlik açısından kötü yapılmış.
Neil McGuigan
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.