VPC'ler arası veya hesaplar arası özel erişim sağlamak amacıyla PrivateLink kullanın ve kaynak VPC'leri ile uç noktaları tanımlayarak ayrıntılı erişim kontrolü uygulamak üzere SLB üzerinde Proxy Protocol v2'yi etkinleştirin.
Güvenlik riskleri
Cloud ortamlarında, kendi kendine oluşturulan veritabanı platformları, yapay zeka çıkarım uygulamaları ve Object Storage Service (OSS) gibi Alibaba Cloud hizmetlerine kolay erişim sağlamak amacıyla genellikle EIP'ler veya genel uç noktalar yapılandırılır. Bu durum, hizmetleri doğrudan İnternet'e açar ve aşağıdaki güvenlik risklerini beraberinde getirir:
Genel ağ saldırısı riski: İnternet'e açık olan herhangi bir hizmet, DDoS saldırıları, güvenlik açığı taramaları ve istismarları ile kaba kuvvet saldırıları için potansiyel bir hedeftir.
Kimlik taklit etme riski: Geleneksel İnternet hizmetleri kullanıcı adı ve parola kimlik doğrulamasına dayanır. Kimlik bilgileri sızdırıldığında saldırganlar, meşru kullanıcıları herhangi bir yerden taklit ederek verilere erişebilir, bunları çalabilir veya değiştirebilir. Genel erişim, isteklerin kaynak ağını kısıtlamaz.
Veri sızdırma kanalı: Kurum içi çalışanlar, OSS gibi Alibaba Cloud hizmetlerinin genel uç noktalarını kullanarak kurumsal verileri kişisel cloud hesapları üzerinden sızdırabilir. Bu trafik İnternet üzerinden aktığından kurumun ağ ilkelerinin uygulanması zorlaşır.
En iyi uygulamalar
Aynı alan içindeki VPC'ler arası erişim için PrivateLink kullanın
Açıklama: VPC2'deki bir ECS örneğine bir ağ hizmeti (örneğin bir web hizmeti) dağıtılmıştır. VPC1 ile VPC2 arasındaki bir PrivateLink bağlantısı, hizmetin VPC1'den özel bir IP adresi (uç nokta) üzerinden erişilmesine olanak tanır.
: Uç nokta (hizmet tüketici) ve uç nokta hizmeti (hizmet sağlayıcı) aynı alanda bulunmalıdır. Uç nokta alanları, uç nokta hizmeti alanlarının bir alt kümesi olmalıdır. Örneğin, bir uç nokta hizmeti Alan A ve Alan B'de dağıtılmışsa uç nokta yalnızca Alan A veya Alan B'de oluşturulabilir.
Temel adımlar:
-
Sunucu tarafı (hizmet sağlayıcı) yapılandırması
Yük dengeleyici oluşturun: VPC2'de, özel yönlendirmeli CLB veya NLB gibi PrivateLink'i destekleyen bir SLB örneği oluşturun. Bir arka uç sunucu grubu ve dinleyici yapılandırın.
Uç nokta hizmeti oluşturun: PrivateLink konsolunda bir uç nokta hizmeti oluşturun ve bunu önceki adımda oluşturduğunuz SLB örneğiyle ilişkilendirin.
Hizmet izin listesini yapılandırın (yalnızca hesaplar arası erişim için): VPC1 farklı bir Alibaba Cloud hesabına aitse hesabın UID'sini uç nokta hizmetinin hizmet izin listesine ekleyin.
Bağlantı isteğini kabul edin: İstemci bir bağlantı başlattıktan sonra uç nokta hizmetinin Connections sekmesine gidin ve bekleyen isteği kabul edin. Alternatif olarak, hizmeti bağlantıları otomatik olarak kabul edecek şekilde yapılandırın.
-
İstemci tarafı (hizmet tüketici) yapılandırması
Uç nokta oluşturun: VPC1'de bir uç nokta oluşturun ve sunucu tarafında oluşturulan uç nokta hizmetini seçin.
Ağı yapılandırın: Uç nokta için VPC1'de bir vSwitch ve bir güvenlik grubu seçerek VPC1'deki hangi kaynakların bu uç noktaya erişebileceğini kontrol edin.
Uç nokta ayrıntılarını alın: Oluşturma işleminden sonra özel bir etki alanı adı ve IP adresi oluşturulur.
Erişimi başlatın: Hizmet sağlayıcı bağlantıyı kabul ettikten sonra VPC1'deki uygulamalar, oluşturulan etki alanı adı veya IP adresi aracılığıyla VPC2'deki hizmete erişebilir.
Erişilebilir VPC'leri ve özel IP adreslerini kontrol etmek için Proxy Protocol kullanın
PrivateLink üzerinden hizmet sağladığınızda sunucu, her isteğin kaynak uç noktasını veya VPC'sini tanımlayabilir ve buna göre güvenlik kuralları uygulayabilir. Örneğin, bir hesabın yalnızca meşru bir VPC'den gelen erişimi kabul etmesini kısıtlayabilirsiniz. Kimlik bilgileri sızdırılsa bile yetkisiz ağlar hizmete erişemez.
Aynı alan içindeki VPC'ler arası erişim için PrivateLink kullanın bölümünde açıklanan adımlara ek olarak, sunucu tarafı uygulamanın kaynak VPC'yi tanımlamasını ve erişim kontrolü uygulamasını sağlayabilirsiniz.
-
Proxy Protocol v2'yi etkinleştirin: NLB dinleyicisinde Proxy Protocol v2'yi etkinleştirin ve VPC ID ile endpoint ID aboneliklerini yapılandırın.
# Use the Cloud Assistant CLI to enable Proxy Protocol v2 for a specified listener and subscribe to the VPC ID and endpoint ID. aliyun nlb UpdateListenerAttribute \ --ListenerId lsn-xxxxxxxxxxxxxxxx \ --ProxyProtocolEnabled true \ --ProxyProtocolV2Config '{"Ppv2VpcIdEnabled":true,"Ppv2PrivateLinkEpIdEnabled":true}' \ --RegionId cn-hangzhou--ListenerId: Web hizmeti için oluşturulan dinleyici kimliği.--ProxyProtocolEnabled: Proxy Protocol'u etkinleştirmek içintrueolarak ayarlayın. Bu protokol, TCP el sıkışmasından sonraki ilk pakette istemci bağlantı bilgilerini iletir. Arka uç hizmetinin bu protokolü desteklemesi gerekir. Ayrıntılar için 2. Adımı inceleyin. Aksi takdirde hizmet kesintiye uğrar.--ProxyProtocolV2Config: Alibaba Cloud tarafından tanımlanan Type-Length-Value (TLV) alanlarını ekler. Bu örnek, kaynak VPC ID ve PrivateLink uç nokta ID aboneliklerini yapılandırır.17 7.005726 10.0.0.186 10.0.0.184 TCP 74 3059 → 80 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 WS=128 18 7.005753 10.0.0.184 10.0.0.186 TCP 62 80 → 3059 [SYN, ACK] Seq=0 Ack=1 Win=64240 Len=0 MSS=1460 WS=128 19 7.006781 10.0.0.186 10.0.0.184 TCP 54 3059 → 80 [ACK] Seq=1 Ack=1 Win=64256 Len=0 20 7.006804 10.0.0.186 10.0.0.184 HTTP 154 Continuation 21 7.006814 10.0.0.184 10.0.0.186 TCP 54 80 → 3059 [ACK] Seq=1 Ack=101 Win=64256 Len=0 22 7.006805 10.0.0.186 10.0.0.184 HTTP 210 GET /login HTTP/1.1 23 7.006821 10.0.0.184 10.0.0.186 TCP 54 80 → 3059 [ACK] Seq=1 Ack=257 Win=64128 Len=0Aşağıdaki tabloda TLV'nin nasıl ayrıştırılacağı açıklanmaktadır.
Açıklama/İçerik
Orijinal içerik
Protokol başlığı
Proxy Protocol sabit imzası
0d0a0d0a000d0a515549540a
Sürüm 2, PROXY komutu
21
TCP/IPv4
11
Aşağıdaki veriler 84 bayt uzunluğundadır
0054
Adres bilgisi
Kaynak IP: 10.0.0.14
0a00000e
Hedef IP: 10.0.0.15
0a00000f
Kaynak bağlantı noktası: 59074
e6c2
Hedef bağlantı noktası: 80
0050
TLV1
Type 03
034 bayt
00040764b56b
0764b56b
TLV2
Type e1 (özel tür)
e124 bayt
0018PrivateLink uç nokta ID:
ep-bp1i288487e586152d4b
0265702d6270316932383834383765353836313532643462
TLV3
Type e1 (özel tür)
e1
26 bayt
001a
VPC ID:
vpc-bp179qeke0wzo1mr8bxhl
017670632d627031373971656b6530777a6f316d72386278686c
TLV4
04(PP2_TYPE_NETNS), ağ ad alanını iletmek için kullanılır04
6 bayt
0006000000000000000000000000 -
Web hizmetiniz Nginx kullanıyorsa Proxy Protocol'u destekleyecek şekilde yapılandırın:
(NGINX Plus R16 veya sonrası ya da açık kaynaklı Nginx 1.13.11 veya sonrası gerektirir.)
server { listen 80 proxy_protocol; # Enable Proxy Protocol v1/v2. # Other configurations... }Nginx, 80 numaralı bağlantı noktasında Proxy Protocol TLV'yi otomatik olarak ayrıştırır ancak standart sürüm yalnızca TLV'den IP adresini almaya olanak tanır.
Alibaba Cloud tarafından özelleştirilen VPC ID'leri ve PrivateLink uç nokta ID'lerini işlemek için bir Lua uzantısı kullanın.
nginx.conf dosyasındaki aşağıdaki Lua eklentisi TCP bağlantılarını işler, soketten paketleri okur ve TLV arabelleğini ayrıştırır.
Ayrıştırılan veriler istek bağlamında depolanır. Bir /login isteği yapıldığında kod PrivateLink uç nokta ID'sini doğrular:
-- Define shared memory before the http block. lua_shared_dict tlv_cache 10m; stream { server { listen 80; # Do not enable proxy_protocol. Let the Lua code below handle it. preread_by_lua_block { -- 1. Try to read the fixed 16-byte protocol header. local sock = ngx.req.socket(true) local header, err = sock:receive(16) if not header then ngx.log(ngx.ERR, "failed to receive proxy protocol header: ", err) return end -- 2. Check the protocol signature (12 bytes). if string.sub(header, 1, 12) ~= "\x0D\x0A\x0D\x0A\x00\x0D\x0A\x51\x55\x49\x54\x0A" then -- If it is not the Proxy Protocol, put the read data back into the buffer to avoid corrupting the original request. sock:setreused(header) return end -- 3. Parse the rest of the protocol header. local ver_cmd = string.byte(header, 13) -- Version and command local family = string.byte(header, 14) -- Address family and protocol local len = string.byte(header, 15) * 256 + string.byte(header, 16) -- Total length of the variable part if len == 0 then -- No address or TLV information. Return directly. return end -- 4. Read the variable-length part (contains address and TLV). local variable_part, err = sock:receive(len) if not variable_part or #variable_part < len then ngx.log(ngx.ERR, "failed to read variable part (address + tlvs): ", err) return end -- 5. Determine the length of the address information based on the address family. local addr_len = 0 local protocol = family & 0x0F local address_family = family >> 4 if address_family == 1 then -- AF_INET (IPv4) addr_len = 12 elseif address_family == 2 then -- AF_INET6 (IPv6) addr_len = 36 elseif address_family == 3 then -- AF_UNIX addr_len = 216 end -- 6. Separate the address information and TLV data. local address_block = string.sub(variable_part, 1, addr_len) -- You can parse the address information if needed. local tlv_string = string.sub(variable_part, addr_len + 1) -- 7. Parse the TLV data. local tlvs = {} local pos = 1 while pos <= #tlv_string do -- Make sure there are at least 3 bytes (Type, Length). if pos + 2 > #tlv_string then ngx.log(ngx.ERR, "malformed TLV data: not enough bytes for type and length") break end local tlv_type = string.byte(tlv_string, pos) local tlv_length = string.byte(tlv_string, pos + 1) * 256 + string.byte(tlv_string, pos + 2) -- Make sure the length of the value does not exceed the boundary. if pos + 2 + tlv_length > #tlv_string then ngx.log(ngx.ERR, "malformed TLV data: length exceeds available data") break end local tlv_value = string.sub(tlv_string, pos + 3, pos + 2 + tlv_length) table.insert(tlvs, { type = tlv_type, length = tlv_length, -- Encode the binary value in Base64 for easy storage and viewing. value = ngx.encode_base64(tlv_value) }) pos = pos + 3 + tlv_length end -- 8. Cache the parsed TLV in shared memory. if #tlvs > 0 then local cjson = require "cjson" local tlv_cache = ngx.shared.tlv_cache -- Use the client IP address as the key to store the TLV data. local client_ip = ngx.var.remote_addr local tlv_json = cjson.encode(tlvs) tlv_cache:set(client_ip, tlv_json, 60) -- Cache for 60 seconds. -- Optional: Also store in ngx.ctx for the stream layer to use. ngx.ctx.proxy_protocol_tlvs = tlvs end } proxy_pass localhost:8080; # Pass subsequent HTTP requests to the HTTP server for processing. } } http { server { listen 8080; # Dedicated location to handle /login requests. location /login { access_by_lua_block { local cjson = require "cjson" local tlv_cache = ngx.shared.tlv_cache -- Get TLV data from shared memory. local client_ip = ngx.var.remote_addr local tlv_json = tlv_cache:get(client_ip) if not tlv_json then ngx.log(ngx.ERR, "No TLV data found for client: ", client_ip) return ngx.exit(ngx.HTTP_FORBIDDEN) end local tlvs = cjson.decode(tlv_json) -- Extract the value of the second TLV (PrivateLink endpoint ID). local privateLinkEndId = nil if tlvs[2] then privateLinkEndId = tlvs[2].value -- Base64-encoded value. end -- Define the expected endpoint ID (Base64-encoded). local expected_value = "ZXAtYnAxaTI4ODQ4N2U1ODYxNTJkNGI=" -- Example value. Modify it as needed. -- Verify the endpoint ID. if privateLinkEndId ~= expected_value then ngx.log(ngx.ERR, "Access to /login denied: TLV value mismatch. Expected '", expected_value, "', got '", tostring(privateLinkEndId), "'") return ngx.exit(ngx.HTTP_FORBIDDEN) end -- If the verification is successful, the request continues to be processed. } proxy_pass http://your_python_backend; } # Handle all other requests. location / { proxy_pass http://your_python_backend; } } # Your Python backend service upstream definition. upstream your_python_backend { server 127.0.0.1:5000; # Assume your backend program runs on port 5000. } }
Alibaba Cloud hizmetlerine erişmek için PrivateLink kullanın
Bazı Alibaba Cloud hizmetleri PrivateLink erişimini destekler. Bu sayede yetkili hesaplar için özel ağ erişimi yapılandırabilir ve genel ağ güvenlik risklerinden kaçınabilirsiniz.
Kişisel hesaplar veri sızdırma riski oluşturur. Kurumsal hesapları yalnızca meşru özel ağlardan erişime izin verecek şekilde yapılandırarak kimlik bilgileri ele geçirildiğinde bunun kötüye kullanılmasını önleyin.
Tehdit senaryosu
Bir Alibaba Cloud hizmeti için uç nokta oluşturun: PrivateLink konsolunda, OSS gibi erişmeniz gereken Alibaba Cloud hizmeti için bir ağ geçidi uç noktası oluşturun ve bunu kuruluşunuzun VPC'si ve yönlendirme tablosuyla ilişkilendirin.
Uç nokta erişim ilkesi yapılandırın: Erişimi, kuruluşunuzun Alibaba Cloud hesabına ait olan RAM kimlikleriyle (kullanıcılar veya roller gibi) kısıtlayın. Bu, çalışanların kişisel hesapları gibi diğer hesapların bu özel kanal üzerinden OSS'ye erişmesini engeller.
RAM ilkesi yapılandırın (isteğe bağlı): Daha ayrıntılı kontrol sağlamak için RAM kullanıcıları veya rolleri için ilkeler yapılandırarak OSS'ye erişimin belirtilen bir VPC'den gelmesini zorunlu kılın.
Uyumluluk yetenekleri
Bir VPC'den bir Alibaba Cloud genel IP adresine erişimi kontrol etme
VPC akış günlükleri analiz ederek VPC'nizden PrivateLink ile optimize edilebilecek Alibaba Cloud genel IP adreslerine giden trafiği belirleyin.
Adımlar:
VPC akış günlüklerini etkinleştirin: Temel işinizin bulunduğu VPC için akış günlüklerini etkinleştirin ve günlükleri Simple Log Service (SLS) hizmetine iletin.
Giden trafiği analiz edin: SLS konsolunda VPC akış günlüklerini sorgulayın ve
direction = outfiltresini uygulayarak giden trafiği filtreleyin.-
Filtreleme ve konumlandırma:
Yanıt paketlerini filtreleyin: Hedef bağlantı noktaları 1024'ten küçük olan trafiği ve bilinen diğer hizmet yanıt trafiğini filtreleyerek gürültüyü azaltın.
Alibaba Cloud genel IP adreslerini belirleyin: ipip.net gibi araçları kullanarak hedef IP adreslerinin (
dstaddr) sahipliğini sorgulayın. Alibaba Cloud'a ait genel IP adreslerine odaklanın.Kaynak ECS örneğini konumlandırın: Akış günlüğündeki
vm-idalanını kullanarak erişimi başlatan ECS örneğini belirleyin.
Örnek günlük analizi
Hangi örneklerin İnternet üzerinden cloud kaynaklarına eriştiğini belirlemek için bu günlükleri analiz edin.
Bu örnek günlükteki anahtar alanlar:
srcaddr: 10.0.1.171(VPC içindeki özel IP adresi)dstaddr: 47.110.154.20,dstport: 80(hedef genel IP adresi ve bağlantı noktası)direction: out,action: ACCEPT(giden, izin verildi)protocol: 6(TCP)vm-id: i-bp1ifnznc1m4tp4krmb1(erişimi başlatan ECS örneği)
Sonucu doğrulayın:
Hedef genel IP adresi OSS veya ECS gibi bir Alibaba Cloud hizmetinin genel uç noktasıysa PrivateLink uç noktasına geçiş yapın.
Bir hedef genel IP adresi hesabınız içindeki başka bir VPC'deki bir hizmeti (EIP veya SLB gibi) işaret ediyorsa bu VPC'ler arası iletişim PrivateLink ile optimize edilebilir.