Sunucuya erişimi kısıtlayın ve uygulamanızın önüne bir WAF koyun

İlk dağıtımdan itibaren erpc worker, SSH'ye yalnızca sizin adresinizden izin verir ve gelen diğer tüm bağlantıları düşürür. Bir [waf] tablosu, API'nizin önüne filtreleyen bir proxy koyar.
Bu sayfada bir ön sürüm olan ERPC CLI v0.1.0-rc.4 anlatılır.

Güvenlik duvarı

Bir dağıtım, uygulama ilk kez başlamadan önce sunucunun güvenlik duvarını ayarlar:
  • SSH yalnızca firewall.ssh_allow adreslerinden ve dağıtımın geldiği adresten;
  • gelen diğer tüm bağlantılar düşürülür, firewall.app_allow adreslerinden run.port bağlantı noktasına gelenler hariç; WAF'ın arkasındaki bir uygulamada bunun yerine WAF'ın bağlantı noktası, ve bu da yalnızca sunucudaki WAF, [waf] tablosunun şimdi oluşturduğu kuralları zaten çalıştırıyorsa (aşağıda).
Her değişiklik 120 saniyelik bir geri alma zamanlayıcısı altında çalışır ve yalnızca yeni bir bağlantı içeri girebildiğinde kalıcı olur; böylece hatalı bir değişiklik sizi dışarıda bırakamaz.
Ancak allowlist, oluşturulduğu adresten daha uzun yaşar: ev adresiniz değişirse, içeri geri dönmenin yolu bir ERPC sunucusu için ERPC desteği, kendi sunucunuz için ise sağlayıcının konsoludur. Bir ev adresine güvenmeden önce, sunucuya erişebileceğiniz ikinci bir adresi (bir ofis, bir VPN çıkışı) firewall.ssh_allow içinde tutun.
Adresiniz değişirse, yöneticilerinizin kullandığı tüm sabit adresleri ekleyin:
bash
erpc worker firewall allow --to ssh 203.0.113.10 198.51.100.7
KomutNe yapar
erpc worker firewall listSunucuya kimin erişebileceğini gösterir: erpc.toml ile sunucunun tablosu yan yana
erpc worker firewall allow --to ssh|app <addresses>Adreslerin içeri girmesine izin verir ve bunu uygular. SSH'ye tek tek adreslerden izin verilir; bir ağ yalnızca --to app ile kabul edilir
erpc worker firewall deny --to ssh|app <addresses>Onların içeri girmesine izin vermeyi bırakır
erpc worker firewall syncSunucunun güvenlik duvarını yeniden erpc.toml dosyasında yazılanla aynı hâle getirir

Uygulamanızın önüne bir WAF koyun

erpc.toml dosyasına tek bir tablo ekleyin:
toml
[waf]
port = 8080
Ardından erpc worker deploy, sunucuda kendine ait bir systemd biriminde (erpc-waf-<app>-<env>) bir HTTP ters proxy çalıştırır: proxy, anahtarı, gizli değeri ve worker'a ait hiçbir şeyi olmayan, 1 GiB bellekle sınırlandırılmış, ayrıcalıksız bir dinamik kullanıcı olarak çalışır. waf.port üzerinde dinler, her isteği uygulamadan önce okur, kurallarında adı geçeni reddeder ve geri kalanını 127.0.0.1:<run.port> üzerindeki uygulamaya iletir.
  • Uygulama loopback üzerinde kalır. Kendi bağlantı noktası dışarıdan asla açılmaz. erpc worker api ve sağlık kontrolü, WAF'ı atlayarak uygulamaya loopback üzerinden ulaşır.
  • Kimin bağlanabileceğini yine güvenlik duvarının listesi belirler; WAF'ın bağlantı noktası, bu listenin herkese izin verebileceği tek yerdir:
    sh
    erpc worker firewall allow --to app 0.0.0.0/0     # and ::/0
    Listede kimse yoksa WAF dinler ama kimse içeri alınmaz ve dağıtım bunu söyler.
  • Bağlantı noktası, WAF onu dinlemeye başladığında açılır, asla daha önce değil. WAF'ı ayağa kalkmayan bir dağıtım başarısız olur ve nedenini söyler; uygulama ise çalışmaya devam eder.
  • [waf] tablosunu değiştirdiğinizde, bir dağıtım yeni kuralları yerine koyana kadar bağlantı noktası yeni hiç kimseye açılmaz.
  • [waf] tablosunu erpc.toml dosyasından çıkarıp dağıtım yapmak, WAF'ı sunucudan kaldırır.

WAF ayarları

Yalnızca port zorunludur. Tüm anahtarlar, varsayılan değerleriyle:
toml
[waf]
port = 8080          # the public port, 1024 or above; the app keeps [run] port
methods = ["GET", "POST", "PUT", "DELETE"]
allow_paths = []     # every path
deny_paths = []
max_body_bytes = 1048576
max_header_bytes = 16384
rate = { per_second = 50, burst = 100 }
max_connections_per_address = 32
ban = { after = 100, window_secs = 60, for_secs = 600 }
block_probes = true
header_timeout_secs = 10
body_timeout_secs = 30
upstream_timeout_secs = 30
new_connections = { per_second = 50, burst = 100 }
AnahtarNe yaparReddedilen ne alır
methodsİletilen yöntemler, büyük harflerle (en fazla 16; asla CONNECT değil)405, Allow ile
allow_pathsİletilen yollar; hiçbiri listelenmemişse tüm yollar. Bir desen tek bir yoldur ya da * ile bitiyorsa bir önekin altındaki her şeydir: /api/*, /api ve altındaki her şeydir. Yüzde kodlaması bir kez çözülmüş yolla, büyük/küçük harfe duyarlı olarak karşılaştırılır404
deny_pathsReddedilen yollar; aynı biçimde yazılır ve önce denetlenir403
max_body_bytesEn büyük istek gövdesi, en fazla 64 MiB413
max_header_bytesİstek satırı ile başlıkların toplamda en büyük boyutu, 1024 ile 65536 arası431
rateBir adresten saniyedeki istek sayısı ve hız sınırı devreye girmeden önce aynı anda kaç istek429, Retry-After ile
max_connections_per_addressBir adresin aynı anda tuttuğu bağlantılarBağlantı yanıtsız kapatılır
banafter sayıda engellenen istek window_secs içinde gerçekleştikten sonra adres for_secs boyunca (en fazla 30 gün) reddedilirBağlantıları yanıtsız kapatılır
block_probesTarama araçlarının istediklerini reddeder (/.env, /.git, /wp-login.php ve benzerleri)403
header_timeout_secsBir istemcinin bir isteğin baş kısmını göndermek için ne kadar süresi olduğu, 1 ile 120 arası. Ayrıca bir gövdenin ortasında durmuş ya da yanıtını almayı bırakmış bir istemcinin ne kadar bekleneceğiBaş kısmı için 408; durmuş bir gövde için 400; alınmayan bir yanıt için bağlantı kapatılır
body_timeout_secsBir isteğin gövdesinin toplamda ne kadar sürebileceği, 1 ile 600 arası; WAF'ın uygulamayı beklediği süre sayılmaz408
upstream_timeout_secsUygulamanın bağlantıyı kabul etmek ve yanıt vermeye başlamak için ne kadar süresi olduğu, 1 ile 600 arası504; uygulama dinlemiyorsa 502
new_connectionsGüvenlik duvarının, bir adresten WAF'ın bağlantı noktasına saniyede açılan yeni TCP bağlantıları için kendi sınırı; bunlar, proxy onları görmeden önce nftables tarafından düşürülür. nftables'ın adres kümesi doluyken kümede olmayan bir adres sayılmaz, bu yüzden kümede yeniden yer açılana kadar bu sınır ona uygulanmaz; proxy'nin kendi sınırları (rate, max_connections_per_address, ban) yine de uygulanırPaket düşürülür
rate, max_connections_per_address, ban ve new_connections, false ile kapatılır (ban = false); dışarıda bırakılan bir anahtar varsayılan değerini alır. erpc worker check, herhangi bir dağıtımdan önce [waf] tablosunun ne yapacağını ve nesinin yanlış olduğunu söyler.

WAF'ın ayar gerektirmeden yaptıkları

  • Belirsizlik içermeyen tek bir HTTP/1 isteği olarak okunamayan bir istek 400 alır; normal biçimde olmayan bir yol da öyle.
  • Protokol değiştirme isteği (Upgrade) 501 alır.
  • Her reddetme yasaklama sayacına eklenir ve her reddetme kendi bağlantısını sonlandırır.
  • Adres derken bir IPv4 adresi ya da bir IPv6 /64 kastedilir.
  • WAF, istemcinin proxy'ye olan bağlantısına ait başlıkları (Connection ve onun adını verdiği başlıklar, Keep-Alive, Proxy-Authenticate, Proxy-Authorization, Proxy-Connection, TE, Trailer), Expect başlığını, adında alt çizgi bulunan başlıkları ve istemcinin kendi Forwarded, X-Real-IP ve X-Forwarded-Proto başlıklarını iletmez. X-Real-IP başlığını bağlantının geldiği adrese ayarlar ve bu adresi X-Forwarded-For başlığının sonuna ekler; X-Forwarded-For başlığının yalnızca son girdisi proxy'nin kendi beyanıdır.

WAF'ın ne yaptığını görme

KomutGösterdiği
erpc worker statusWAF'ın bağlantı noktası, nereye ilettiği, ne zamandan beri çalıştığı ve o zamandan bu yana sayımlar
erpc worker firewall listWAF'ın bağlantı noktasına kimin erişebileceği ve kurala göre neyin engellendiği
erpc worker logs --wafEngellenen her istek: kural, durum, istemcinin adresi, yöntem ve hedefin ilk 200 baytı
İletilen bir istek log satırı bırakmaz ve hiçbir başlık ya da gövde asla loglanmaz; engellenen bir isteğin sorgusu ise 200 baytın yettiği kadarıyla loglanır. Bir istemcinin gönderdiği şey terminalinize yazamaz: WAF, journal'ını yazdırılabilir ASCII olarak yazar.

WAF'ın yapmadıkları

  • TLS yok. Kendi bağlantı noktasında düz HTTP/1.1 konuşur.
  • HTTP/2 yok: ona 400 ile yanıt verir.
  • WebSocket yok, başka herhangi bir Upgrade da yok: 501.
  • Gövdelerin içine bakmaz. Bir gövde ölçülür, asla okunmaz. Tarama isteği listesi kısadır ve bir gürültü filtresidir, bir güvence değildir: uygulama girdisini yine de kendisi denetler.
  • Kimlik doğrulama yok. Uygulamayı kimin çağırabileceğine uygulamanın kendisi ve güvenlik duvarının listesi karar verir.
  • Bir adres bir istemcidir. Tek bir NAT, proxy veya CDN arkasındaki istemciler aynı hız sınırını ve aynı yasaklamayı paylaşır; çok sayıda adresi olan bir istemcinin de adresi kadar hız sınırı olur.
  • Yasaklamalar ve sayımlar WAF yeniden başladığında unutulur.
  • En fazla 8192 adresi hatırlar ve aynı anda en fazla 1024 bağlantı tutar.
  • Yalnızca IPv4 üzerinde dinler, bu yüzden app_allow içindeki bir IPv6 girdisi henüz hiçbir yere ulaşmaz.
  • Bir yol, çözüldüğü baytlar olarak karşılaştırılır. Yolları daha gevşek okuyan bir uygulamaya (büyük/küçük harfi yok sayan, ; parametrelerini kabul eden, iki kez çözen) deny_paths kapsamının dışında kalan bir adla ulaşılabilir. allow_paths tarafında böyle bir açık yoktur: listelenmeyen iletilmez.
  • Yavaş okuyan bir istemciye sonuna kadar hizmet verilir. Bir yanıtı ne kadar yavaş olursa olsun almaya devam eden bir istemciye sonuna kadar hizmet verilir.
  • Bir istek seli büyük bir yüklemeyi kesebilir. WAF tek bir iş parçacığında çalışır, bu yüzden bir sel büyük bir yüklemeyi 408 ile kesebilir. Büyük gövdeler alan bir uygulama body_timeout_secs değerini max_body_bytes ile birlikte yükseltir.
Worker kılavuzu, app_allow üzerindeki bir değişikliğin ne zaman bir sonraki dağıtıma kadar bekletildiği de dahil olmak üzere her kuralı içerir.