açık bir PostgreSQL portu nasıl güvenli hale getirilir


29

Demek durum bu. Bir müşterinin PostgreSQL veritabanına erişimi olduğu 5432 numaralı açık bir TCP bağlantı noktasına sahip olmamız gerekiyor.

Belli nedenlerden ötürü, sadece sonuncusu olarak sadece "hayır" diyemeyiz.

En büyük sıkıntılar neler? Altyapımızı nasıl koruyabilirim?

Neyse: neden olmamalıdır dünyaya açılacak? Sanırım, belki de 20 yaşındaki, bakımsız bir FTP sunucusundan daha güvenli.

PS VPN iyi değil. Bazı şifreleme belki (Ona JDBC bağlantı URL verebilir eğer çalışır ).


4
SSH tünelleri bir seçenek değil mi? Bu nasıl yapılır makalesi aslında PostgreSQL'i örnek olarak kullanır . Bağlanmayı kolaylaştırmak için müşteriye önceden yapılandırılmış bir SSH istemcisi sağlayabilirsiniz.
Lucifer Sam,

@LuciferSam Hayır. Db, yaklaşık 100 şirket makinesinde şirket içi geliştirilmiş bir java uygulaması tarafından kullanılacak. Onları yapılandırmanın tek yolu, yerel ağ yönetimine bir jdbc bağlantısı URL'si vermektir, diğerleri çok çok sorunludur.

@milkman uygulama ne yapar? belki bunun yerine bir RESTful sunucusu sorgulayabilir? Açıkçası,
SQL’i REST’e geçirmek

@ tedder42 Bizim tarafımızdan da barındırılan CMS kullanıcılarının veritabanını düzenler. Kaynağını değiştirme iznimiz yok.

Yanıtlar:


41

SSL isteyin, SELinux'u açık tutun, günlükleri izleyin ve geçerli bir PostgreSQL sürümü kullanın .

Sunucu tarafı

SSL iste

Gelen postgresql.confseti ssl=onve (docs ve yorumları görmek için keyfile ve certfile uygun yüklü olduğundan emin olun postgresql.conf).

İstemcide özel kurulum yapılmadan müşteriler tarafından güvenilmesini sağlamak için bir CA'dan sertifika satın almanız gerekebilir.

In pg_hba.confgibi kullanım şey:

hostssl theuser thedatabase 1.2.3.4/32 md5

... muhtemelen kullanıcı ve / veya veritabanı için "tümü" ile ve daha geniş bir kaynak IP adres filtresi ile.

Giriş yapabilen kullanıcıları sınırlandırın, uzak kullanıcı girişini reddetme

Mümkünse kullanıcılar için "hepsine" izin verme; İhtiyaç duymamak için süper kullanıcı oturum açmalarına uzaktan izin vermek istemezsiniz.

Kullanıcıların sınır hakları

Giriş yapabilen kullanıcıların haklarını sınırlayın. Onlara CREATEDBveya CREATEUSERhaklar vermeyin .

REVOKECONNECTdoğru PUBLICtüm veritabanları üzerinde, daha sonra veritabanına o erişebileceğini gereken tek kullanıcılar / rolleri geri vermek. (Kullanıcıları rollere ayırın ve doğrudan bireysel kullanıcılara değil rollere hak verin.)

Uzaktan erişime sahip kullanıcıların yalnızca ihtiyaç duydukları DB'lere bağlanabildiğinden ve yalnızca gerçekten ihtiyaç duydukları şemalar, tablolar ve sütunlar üzerinde haklara sahip olduklarından emin olun. Bu, yerel kullanıcılar için de iyi bir pratiktir, sadece mantıklı bir güvenliktir.

Müşteri kurulumu

PgJDBC'de şu parametreyi iletinssl=true :

JDBC sürücüsüne bir SSL bağlantısı kurmasını denemek için bağlantı URL parametresini ssl = true olarak eklemelisiniz.

... ve sunucunun sertifikasını müşterinin güvenilir mağazasına kurun veya kullanıcının sertifikayı yüklemesini istemiyorsanız, Java'nın yerleşik güvenilir deposundaki CA'lardan biri tarafından güvenilen bir sunucu sertifikası kullanın.

Devam eden aksiyon

Şimdi PostgreSQL'i güncel tuttuğunuzdan emin olun . PostgreSQL'in sadece birkaç ön-güvenlik güvenlik açığı vardı, ama bu sıfırdan fazla, bu yüzden güncel kal. Yine de yapmalısınız, hata düzeltmeleri olması gereken güzel şeyler.

Hiçbir zaman erişmeniz gerekmediğini bildiğiniz büyük bloklar / bölgeler varsa, önüne güvenlik duvarı ekleyin.

Bağlantıları ve bağlantıları kes postgresql.conf. Pratik ise sorguları günlüğe yaz. Pratik bir izinsiz giriş tespit sistemi veya fail2ban veya benzeri bir cihaz çalıştırın. Postgres ile fail2ban için burada uygun bir nasıl yapılır

Günlük dosyalarını izleyin.

Bonus paranoya

Düşünmek için ekstra adımlar ...

İstemci sertifikaları gerektir

İsterseniz pg_hba.conf, istemcinin sunucu tarafından güvenilen bir X.509 istemci sertifikası sunmasını istemek için de kullanabilirsiniz . Sunucu sertifikasıyla aynı CA'yı kullanmasına gerek yoktur, bunu bir homebrew openssl CA ile yapabilirsiniz. Bir JDBC kullanıcısının, istemci sertifikasını Java Anahtar Deposuna alması keytoolve bazı JSSE sistem özelliklerini, Java'yı anahtar deposuna yönlendirmesi için yapılandırması gerekir, bu yüzden tamamen şeffaf değildir.

Örneği karantinaya al

Gerçekten paranoyak olmak istiyorsanız, istemciye, ayrı bir kapta / VM'de ya da en azından farklı bir kullanıcı hesabı altında, sadece ihtiyaç duydukları veri tabanları ile çalıştırın.

Bu şekilde PostgreSQL örneğini tehlikeye atarlarsa daha fazla elde edemezler.

SELinux kullanın

Bunu söylememeliydim, ama ...

RHEL 6 veya 7 gibi SELinux destekli bir makine çalıştırın ve SELinux'u kapatmayın veya izin verilen moda getirmeyin . Zorlama modunda tutun.

Varsayılan olmayan bir bağlantı noktası kullanın

Sadece belirsizliğin sağladığı güvenlik aptallıktır. Mantıklı şeyleri yaptıktan sonra biraz belirsizliği kullanan güvenlik muhtemelen zarar vermez.

Yaşamı otomatik saldırganlar için biraz zorlaştırmak için Pg'yi varsayılan olmayan bir bağlantı noktasında çalıştırın.

Öne bir proxy koy

PgBouncer veya PgPool-II'yi PostgreSQL'in önünde, bağlantı havuzu ve proxy olarak da çalıştırabilirsiniz. Bu şekilde, proxy'nin SSL'yi yönetmesine izin verebilirsiniz, gerçek veritabanı sunucusu değil. Proxy, ayrı bir VM'de veya makinede olabilir.

İstemci uygulamasında zaten yerleşik bir havuz yoksa, bağlantı havuzu proxy'lerinin kullanılması yine de PostgreSQL ile iyi bir fikirdir. Java uygulama sunucularının çoğu, Rails, vb. Dahili havuzlamaya sahiptir. O zaman bile, bir sunucu tarafı havuz proxy'si zararsızdır.


3
İstemcide statik bir $ IP varsa, bununla birlikte güvenlik duvarında da $ port'a izin verin.
user9517 GoFundMonica

Çok teşekkür ederim! Pgjdbc'nin bu paragrafı var, ancak ona yalnızca bir jdbc bağlantı URL'si verebilirim ve java uygulamasıyla (özel, tartışılmaz) çalışıp çalışmayacağından emin değilim. Tamam, değilse, yeni bir soru soracağım. Ayrıntılı cevabınız için teşekkür ederiz!

1
@lesto Aslında, bir VPN'yi açığa vurmak , saldırı yüzeyini yalnızca bir sınırlı hizmete kıyasla büyük ölçüde arttırıyor. İnsanlar VPN'in uzaktaki makinedeki tüm zararlı yazılımların tüm çevre güvenliğini aşması ve ağın bağırsaklarına girmesi için bir saldırı kanalı haline geldiğini unutuyorlar. Onları yalnızca, İnternet barındıranlar kadar toksik gördükleri bir DMZ'ye bağlanırlarsa kabul edilebilir buluyorum.
Craig Ringer

1
@CraigRinger Korumanın geri kalanını kaldırmak için değil, servisi VPN içine almak için
demiyorum

1
@lesto Elbette, bir VPN'in maalesef birçok yöneticinin yaptığı gibi Magic Security Sos olarak değerlendirilmezse yararlı bir ekstra katman olabileceğine karar verdi.
Craig Ringer

2

Craigs'in etkileyici eylem planının basit bir uzantısı:

Belki kullanıcı sadece göreceli olarak az sayıda ağ sağlayıcısı kullanıyordur (örneğin, taşınırken mobil ağ sağlayıcısı, evden iş ağı ve işyerinden giden ip ağı).

Çoğu ağ sağlayıcısının birçok IP adresi vardır, ancak gerçekten çok sayıda alt ağ yoktur. Böylece, müşterinizin kullandığı ağ kesimlerine postgresql erişimini sınırlayan bir iptables filtresi verebilirsiniz. Bu, net olarak rastgele seçilen sorun kaynaklarının saldırı olanaklarını büyük ölçüde azaltmıştır.

Basit bir destek senaryosu:

  1. Müşteriniz sizi "Giriş yapamıyorum" diye çağırıyor .
  2. tcpdump -i eth0 -p tcp port 5432Nereden geldiğini bir komutla öğreniyorsun.
  3. Bir ile whois 1.2.3.4bu ip tarafından kullanılan ip adresini alabilirsiniz. Örneğin, olabilir 1.2.3.0/24.
  4. Bir iptables -A INPUT -s 1.2.3.0/24 -p tcp --dport 5432 -j ACCEPT(veya benzer bir) ile tcp'nin yeni alt ağı ile bağlantılarına izin verirsiniz.

uifKalıcı ve sezgisel olarak bildirilebilen iptables kurallarını sağlayabilen çok iyi bir perl betiği var . ("Uif iptables" için Google).


1
İlginç bir fikir, ancak bu biraz kırılgan geliyor.
nishantjr

@nishantjr Elbette bağımsız bir çözüm değil, sadece işleri daha iyi hale getirme imkanı.
peterh, Monica

Yolları bu örneğin bkz yapmak için daha pratik bir yaklaşım, beyaz liste bireysel ISP ve / veya ülkelere olabilir stackoverflow.com/questions/16617607/...
Josip Rodin

1

İşte PostgreSQL için yukarıda bağlantılı HOWTO'ya dayanan ancak Ubuntu paketleriyle çalışacak, başka bir hata koşulu yakalayacak ve daha hızlı hale getirmek için çeşitli hata ayıklama iletilerini atlayacak şekilde ayarlanmış oldukça basit bir Fail2ban yapılandırması:

/etc/fail2ban/filter.d/local-postgresql.conf:

[Definition]

failregex = <HOST>\(\d+\) FATAL:  password authentication failed for .+$
            <HOST>\(\d+\) FATAL:  no pg_hba.conf entry for host .+$

ignoreregex = duration:

/etc/fail2ban/jail.d/local-postgresql.conf:

[local-postgresql]
enabled  = true
filter   = local-postgresql
action   = iptables[name=PostgreSQL, port=5432, protocol=tcp]
           sendmail-whois[name=PostgreSQL, dest=root@localhost]
logpath  = /var/log/postgresql/postgresql-9.3-main.log
maxretry = 3

1

Fail2ban güçlü bir araçtır, ancak bir filtrenin olduğu gibi çalışacağına güvenmeyin. Herhangi bir filtreyi failregex aracını kullanarak test edin ve herhangi bir tekliften kaçmayı unutmayın (yani "admin", \ "admin \" olur). Örnek olarak, /etc/log/postgresql/postgresql-9.3-main.log sayfamdan aşağıdaki filter failregex satırını test etmek benim için işe yaramadı.

fail2ban-regex '2016-09-20 14:30:09 PDT FATAL:  password authentication failed for user "admin"' '<HOST>\(\d+\) FATAL:  password authentication failed for .+$'

Yukarıdaki bana verdi

Başarısızlık: toplam 0

Log formatıyla eşleşmesi için failregex'i güncellemem gerekti.

fail2ban-regex '2016-09-20 14:30:09 PDT FATAL:  password authentication failed for user "admin"' 'FATAL:  password authentication failed for user \"<HOST>\"'

Bu bana olumlu bir sonuç verdi.

Başarısızlık: 1 toplam

Fail2ban-regex testi tüm günlük dosyalarına da uygulanabilir.

fail2ban-regex /var/log/postgresql/postgresql-9.3-main.log /etc/fail2ban/filter.d/postgresql.local

Yukarıdakiler güncellenmiş failge ile aşağıdaki pozitif sonucu verdiler.

Başarısızlık: toplam 169

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.