Alibaba Cloud Service Mesh (ASM), Istio AuthorizationPolicy kaynakları aracılığıyla IP tabanlı erişim kontrolünü destekler. Giriş ağ geçidi veya sidecar proxy düzeyinde belirli istemci IP adreslerinden gelen trafiği reddetmek için ipBlocks veya remoteIpBlocks kullanın.
Önkoşullar
Bir küme eklenmiş v1.15.3.25 veya sonraki bir sürüme sahip bir ASM örneğiniz olmalıdır. Bkz. ASM örneğine küme ekleme.
Otomatik sidecar proxy enjeksiyonu etkinleştirilmiş olmalıdır. Bkz. Otomatik sidecar proxy enjeksiyonunu etkinleştirme.
HTTPBin uygulaması dağıtılmış ve erişilebilir durumda olmalıdır. Bkz. HTTPBin uygulamasını dağıtma.
Çalışma mantığı
DENY eylemine sahip bir AuthorizationPolicy, belirtilen IP adresleriyle eşleşen istekleri engeller. Hangi IP'nin değerlendirileceğini iki kaynak alanı belirler:
**
ipBlocks**: Proxy ile doğrudan TCP bağlantısı kuran eşin IP adresiyle (downstream_remote_address) eşleşir.**
remoteIpBlocks**: GenellikleX-Forwarded-Forüstbilgisinden çıkarılan orijinal istemci IP'siyle eşleşir.
ipBlocks veya remoteIpBlocks seçimi
Doğru alan, istemci IP'sinin proxy'ye nasıl ulaştığına bağlıdır:
| Trafik yolu | İstemci IP kaynağı | Kullanılacak alan |
|---|---|---|
| İstemci doğrudan ASM ağ geçidine bağlanır (Katman 7 proxy yok) | Paket kaynak adresi | ipBlocks veya remoteIpBlocks (her ikisi de çalışır) |
| İstemci ile ASM ağ geçidi arasında bir Katman 7 proxy bulunur | X-Forwarded-For üstbilgisi |
remoteIpBlocks |
Ağ geçidi ve sidecar uygulama farkları
Ağ geçidine ve sidecar proxy'e uygulanan ilkeler farklı davranır çünkü her proxy farklı bir downstream_remote_address görür:
| Uygulama noktası | **downstream_remote_address değeri** |
**ipBlocks davranışı** |
|---|---|---|
Ağ geçidi (istio-system ad alanı, seçici istio: ingressgateway) |
Gerçek istemci IP'si (geçerli bağlantı noktasıyla) | Gerçek istemci IP'siyle eşleşir |
Sidecar proxy (default ad alanı, seçici app: <workload>) |
X-Forwarded-For değerinden çıkarılan istemci IP'si (bağlantı noktası 0) |
Gerçek TCP kaynağı ağ geçidi pod IP'si olduğu için istemci IP'siyle eşleşmez |
Sidecar proxy, trafiği doğrudan istemciden değil ağ geçidi pod'undan aldığından sidecar üzerindeki ipBlocks ağ geçidi pod IP'siyle eşleşir. Sidecar düzeyinde istemci IP'sine göre filtreleme yapmak için remoteIpBlocks kullanın.
Kullanım notları
Aşağıdaki örneklerde ağ geçidinin
externalTrafficPolicyalanıLocalolarak ayarlanmıştır.externalTrafficPolicyClusterolarak ayarlanırsa kaynak IP adresleri korunmaz ve IP tabanlı erişim kontrolü beklendiği gibi çalışmaz.
Ağ geçidinde bir IP'yi reddetme (Katman 7 proxy yok)
İstemci, ara Katman 7 proxy olmadan doğrudan ASM ağ geçidine bağlandığında ağ geçidi günlüklerindeki downstream_remote_address ve x_forwarded_for değerleri gerçek istemci IP'sini yansıtır. IP tabanlı erişim kontrolü için hem ipBlocks hem de remoteIpBlocks kullanılabilir.
HTTPBin uygulamasına bağlantıyı doğrulamak için aşağıdaki komutu çalıştırın:
curl <gateway-external-ip>:80/ -I
Ağ geçidi günlüğü örneği
{
"downstream_remote_address": "106.XX.XX.1:58656",
"x_forwarded_for": "106.11.XX.X",
"response_code": "200",
"upstream_cluster": "outbound|8000||httpbin.default.svc.cluster.local",
"user_agent": "curl/7.88.1"
}
downstream_remote_address ve x_forwarded_for alanlarının her ikisi de gerçek istemci IP'sini (106.11.XX.X) içerir.
Sidecar proxy günlüğü örneği
{
"downstream_remote_address": "106.11.XX.X:0",
"x_forwarded_for": "106.11.XX.X",
"response_code": "200",
"upstream_cluster": "inbound|80||",
"user_agent": "curl/7.88.1"
}
x_forwarded_for alanı gerçek istemci IP'sini gösterir. downstream_remote_address alanı da istemci IP'sini gösterir ancak sidecar düzeyinde bağlantı noktası bilgisi kaybolduğu için bağlantı noktası 0 değerindedir.
ipBlocks kullanarak bir IP'yi reddetme
-
Aşağıdaki AuthorizationPolicy'i içeren
gateway-test.yamladlı bir dosya oluşturun:<client-ip>yerine engellenecek IP adresini yazın.apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: gateway-test namespace: istio-system spec: action: DENY rules: - from: - source: ipBlocks: - <client-ip> # Example: 106.11.XX.X selector: matchLabels: istio: ingressgateway -
Yetkilendirme ilkesini dağıtın:
kubectl apply -f gateway-test.yaml -
Bir istek göndererek ilkeyi doğrulayın: Beklenen çıktı: IP'nin engellendiğini onaylayan
403 Forbiddenyanıtı.curl <gateway-external-ip>:80/ -IHTTP/1.1 403 Forbidden content-length: 19 content-type: text/plain server: istio-envoy
remoteIpBlocks kullanarak bir IP'yi reddetme
ipBlocks yaklaşımından tek farkı, AuthorizationPolicy'deki kaynak alandır. remoteIpBlocks alanı, doğrudan TCP bağlantısı kaynağı yerine X-Forwarded-For üstbilgisini değerlendirir.
-
Aşağıdaki AuthorizationPolicy'i içeren
gateway-test.yamladlı bir dosya oluşturun:apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: gateway-test namespace: istio-system spec: action: DENY rules: - from: - source: remoteIpBlocks: - <client-ip> # Example: 106.11.XX.X selector: matchLabels: istio: ingressgateway -
Yetkilendirme ilkesini dağıtın:
kubectl apply -f gateway-test.yaml -
İlkeyi doğrulayın: Beklenen çıktı:
curl <gateway-external-ip>:80/ -IHTTP/1.1 403 Forbidden content-length: 19 content-type: text/plain server: istio-envoy
Sidecar proxy'de bir IP'yi reddetme
İlke ağ geçidi yerine sidecar proxy'yi hedeflediğinde ipBlocks ve remoteIpBlocks farklı davranır.
ipBlocks neden sidecar'da istemci IP'siyle eşleşmez
-
Aşağıdaki AuthorizationPolicy'i içeren
gateway-test.yamladlı bir dosya oluşturun:NotAd alanı
defaultve seçici giriş ağ geçidi yerinehttpbiniş yükünü hedefler.apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: gateway-test namespace: default spec: action: DENY rules: - from: - source: ipBlocks: - <client-ip> # Example: 106.11.XX.X selector: matchLabels: app: httpbin -
Yetkilendirme ilkesini dağıtın:
kubectl apply -f gateway-test.yaml -
İlkeyi doğrulayın: Beklenen çıktı: Sidecar proxy
downstream_remote_addressalanında istemci IP'si yerine ağ geçidi pod IP'sini gördüğünden istek200 OKile başarılı olur.ipBlocksalanı doğrudan TCP bağlantısı kaynağıyla eşleşir ve bu kaynak ağ geçidi pod'dur.ipBlockskullanarak sidecar düzeyinde trafiği engellemek için istemci IP'si yerine ağ geçidi pod IP'sini belirtin. Sidecar'da istemci IP'sine göre filtreleme yapmak için bunun yerineremoteIpBlockskullanın.curl <gateway-external-ip>:80/ -IHTTP/1.1 200 OK server: istio-envoy content-type: text/html; charset=utf-8
remoteIpBlocks kullanarak sidecar'da bir IP'yi reddetme
-
Aşağıdaki AuthorizationPolicy'i içeren
gateway-test.yamladlı bir dosya oluşturun:apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: gateway-test namespace: default spec: action: DENY rules: - from: - source: remoteIpBlocks: - <client-ip> # Example: 106.11.XX.X selector: matchLabels: app: httpbin -
Yetkilendirme ilkesini dağıtın:
kubectl apply -f gateway-test.yaml -
İlkeyi doğrulayın: Beklenen çıktı: Gerçek istemci IP'sini içeren
X-Forwarded-Forüstbilgisini değerlendirdiğindenremoteIpBlocksyapılandırması isteği engeller.curl <gateway-external-ip>:80/ -IHTTP/1.1 403 Forbidden content-length: 19 content-type: text/plain server: istio-envoy
İstemci ile ağ geçidi arasında Katman 7 proxy bulunduğunda bir IP'yi reddetme
İstemci ile ASM ağ geçidi arasında bir veya daha fazla Katman 7 proxy (yük dengeleyici veya CDN gibi) bulunduğunda X-Forwarded-For üstbilgisi birden çok IP adresi içerir. Her proxy önceki atlamanın IP'sini ekler.
Bu senaryoda IP tabanlı erişim kontrolü için yalnızca remoteIpBlocks geçerlidir. ipBlocks alanı fiziksel eş IP'siyle eşleşir ve bu IP istemci değil Katman 7 proxy'dir.
Ağ geçidi günlüğü örneği
{
"downstream_remote_address": "106.11.XX.X:62232",
"x_forwarded_for": "56.5.X.X, 72.9.X.X, 98.1.X.X, 106.11.XX.X",
"response_code": "200",
"upstream_cluster": "outbound|8000||httpbin.default.svc.cluster.local"
}
x_forwarded_for üstbilgisi dört IP adresi içerir:
56.5.X.X, 72.9.X.X, 98.1.X.X-- ASM ağ geçidine ulaşmadan önce yukarı akış Katman 7 proxy'leri tarafından ayarlanır.106.11.XX.X-- ASM ağ geçidi tarafından eklenir.
downstream_remote_address (106.11.XX.X:62232), ağ geçidine doğrudan bağlanan eşin (son Katman 7 proxy) IP'sini gösterir.
Sidecar proxy günlüğü örneği
{
"downstream_remote_address": "106.11.XX.X:0",
"x_forwarded_for": "56.5.X.X, 72.9.X.X, 98.1.X.X, 106.11.XX.X",
"response_code": "200",
"upstream_cluster": "inbound|80||"
}
x_forwarded_for değeri ağ geçidi günlüğüyle aynıdır. downstream_remote_address değeri, x_forwarded_for zincirindeki son IP'dir (sidecar düzeyinde bağlantı noktası bilgisi korunmadığından bağlantı noktası 0 değerindedir).
Ağ geçidinde X-Forwarded-For'daki son IP'yi reddetme
Varsayılan olarak (numTrustedProxies = 0), remoteIpBlocks ağ geçidi tarafından X-Forwarded-For üstbilgisine eklenen son IP adresini değerlendirir. Bu, ağ geçidine doğrudan bağlanan eşin IP'sidir.
-
Aşağıdaki AuthorizationPolicy'i içeren
gateway-test.yamladlı bir dosya oluşturun:apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: gateway-test-ap-wg-gateway-test-istio-system-gateway-ingressgateway namespace: istio-system spec: action: DENY rules: - from: - source: remoteIpBlocks: - <last-proxy-ip> # Example: 106.11.XX.X selector: matchLabels: istio: ingressgateway -
Yetkilendirme ilkesini dağıtın:
kubectl apply -f gateway-test.yaml -
İlkeyi doğrulayın: Beklenen çıktı:
curl <gateway-external-ip>:80/ -H 'X-Forwarded-For: 56.5.X.X, 72.9.X.X, 98.1.X.X' -IHTTP/1.1 403 Forbidden content-length: 19 content-type: text/plain server: istio-envoy
X-Forwarded-For zincirindeki belirli bir IP'yi hedeflemek için numTrustedProxies kullanma
numTrustedProxies ayarı, X-Forwarded-For zincirinde remoteIpBlocks tarafından hangi IP adresinin değerlendirileceğini kontrol eder. N olarak ayarlandığında ağ geçidi kendisine en yakın N proxy'yi güvenilir olarak kabul eder ve sağdan (N+1)'inci proxy'nin IP'sini değerlendirir.
Örneğin, X-Forwarded-For: 56.5.X.X, 72.9.X.X, 98.1.X.X ve ağ geçidinin 106.11.XX.X eklemesi durumunda:
| numTrustedProxies | Güvenilir proxy'ler (sağdan) | remoteIpBlocks tarafından değerlendirilen IP |
|---|---|---|
| 0 (varsayılan) | Yok | 106.11.XX.X (son IP, ağ geçidi tarafından eklenir) |
| 2 | 106.11.XX.X, 98.1.X.X |
72.9.X.X (sağdan üçüncü) |
Giriş ağ geçidinde numTrustedProxies ayarlama
Giriş ağ geçidi YAML dosyasının spec alanına aşağıdaki açıklamayı ekleyin. Giriş ağ geçidi yapılandırmasını düzenleme talimatları için bkz. ASM konsolunda giriş ağ geçidini yönetme.
podAnnotations:
proxy.istio.io/config: '{"gatewayTopology" : { "numTrustedProxies": 2 } }'
Bu yapılandırma ağ geçidi pod'larını yeniden başlatır.
Ağ geçidi yeniden başlatıldıktan sonra etkisini doğrulayın:
curl <gateway-external-ip>:80/ -H 'X-Forwarded-For: 56.5.X.X, 72.9.X.X, 98.1.X.X' -I
Beklenen çıktı:
HTTP/1.1 200 OK
server: istio-envoy
content-type: text/html; charset=utf-8
numTrustedProxies: 2 ayarı nedeniyle remoteIpBlocks 106.11.XX.X yerine 72.9.X.X (sağdan üçüncü IP) değerini değerlendirdiğinden istek başarılı olur. 72.9.X.X reddetme listesinde olmadığından isteğe izin verilir.
numTrustedProxies ayarlandıktan sonra değerlendirilen IP'yi reddetme
numTrustedProxies 2 olarak ayarlandığında remoteIpBlocks tarafından değerlendirilen IP'yi reddeden bir ilke oluşturun:
-
Aşağıdaki AuthorizationPolicy'i içeren
gateway-test.yamladlı bir dosya oluşturun:apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: gateway-test-ap-wg-gateway-test-istio-system-gateway-ingressgateway namespace: istio-system spec: action: DENY rules: - from: - source: remoteIpBlocks: - 72.9.X.X selector: matchLabels: istio: ingressgateway -
Yetkilendirme ilkesini dağıtın:
kubectl apply -f gateway-test.yaml -
İlkeyi doğrulayın: Beklenen çıktı:
curl <gateway-external-ip>:80/ -H 'X-Forwarded-For: 56.5.X.X, 72.9.X.X, 98.1.X.X' -IHTTP/1.1 403 Forbidden content-length: 19 content-type: text/plain server: istio-envoy
İlkeyi ağ geçidi yerine sidecar proxy'ye uygulama
Ağ geçidinde yapılandırılan numTrustedProxies ayarı sidecar proxy'lere uygulanmaz. Sidecar proxy'ler varsayılan numTrustedProxies değeri olan 0 değerini kullanır; bu da remoteIpBlocks öğesinin sidecar tarafından alınan X-Forwarded-For zincirindeki son IP'yi değerlendirdiği anlamına gelir.
-
HTTPBin sidecar'ını hedefleyen aşağıdaki AuthorizationPolicy'i içeren
gateway-test.yamladlı bir dosya oluşturun:apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: gateway-test namespace: default spec: action: DENY rules: - from: - source: remoteIpBlocks: - 72.9.X.X selector: matchLabels: app: httpbin -
Yetkilendirme ilkesini dağıtın:
kubectl apply -f gateway-test.yaml -
İlkeyi doğrulayın: Beklenen çıktı: Sidecar'ın
numTrustedProxiesdeğeri0olduğundanremoteIpBlocksX-Forwarded-Forzincirindeki son IP'yi (106.11.XX.X) değerlendirir ve istek başarılı olur.72.9.X.Xson IP olmadığından reddetme kuralı tetiklenmez.72.9.X.XIP'sini sidecar düzeyinde reddetmek için sidecar proxy'de denumTrustedProxiesayarlayın veyaremoteIpBlocksdeğerini sidecar'ın değerlendirdiği IP'yle (X-Forwarded-Forüstbilgisindeki son IP) eşleşecek şekilde değiştirin.curl <gateway-external-ip>:80/ -H 'X-Forwarded-For: 56.5.X.X, 72.9.X.X, 98.1.X.X' -IHTTP/1.1 200 OK server: istio-envoy content-type: text/html; charset=utf-8
Sonraki adımlar
Giriş ağ geçidi oluşturma -- ASM giriş ağ geçidlerini yapılandırma ve yönetme.
ASM güvenlik ilkeleri -- AuthorizationPolicy yapılandırmasını basitleştiren ASM tarafından yönetilen güvenlik ilkeleri dahil olmak üzere ek erişim kontrol seçeneklerini keşfetme.