Gunakan PrivateLink untuk akses pribadi lintas-VPC atau lintas akun, dan aktifkan Proxy Protocol v2 pada SLB untuk mengidentifikasi VPC sumber dan endpoint guna menerapkan kontrol akses tingkat granular.
Risiko keamanan
Di lingkungan cloud, layanan seperti platform database yang dibangun sendiri, aplikasi inferensi AI, dan Layanan Alibaba Cloud seperti Object Storage Service (OSS) sering dikonfigurasi dengan EIP atau titik akhir publik agar mudah diakses. Hal ini mengekspos layanan secara langsung ke Internet dan menimbulkan risiko keamanan:
Risiko serangan jaringan publik: Setiap layanan yang terpapar Internet merupakan target potensial serangan DDoS, pemindaian kerentanan dan eksploitasi, serta serangan brute-force.
Risiko pemalsuan identitas: Layanan Internet tradisional mengandalkan autentikasi berbasis username dan password. Jika kredensial bocor, penyerang dapat menyamar sebagai pengguna sah dari lokasi mana pun untuk mengakses, mencuri, atau merusak data. Akses publik tidak dapat membatasi jaringan sumber permintaan.
Saluran eksfiltrasi data: Karyawan internal dapat menggunakan akun cloud pribadi untuk mengekstraksi data perusahaan melalui titik akhir publik Layanan Alibaba Cloud seperti OSS. Karena lalu lintas ini mengalir melalui Internet, kebijakan jaringan perusahaan sulit diterapkan.
Praktik terbaik
Gunakan PrivateLink untuk akses lintas-VPC dalam zona yang sama
Deskripsi: Layanan jaringan (seperti layanan web) dideploy pada Instance ECS di VPC2. Koneksi PrivateLink antara VPC1 dan VPC2 memungkinkan layanan tersebut diakses dari VPC1 melalui alamat IP pribadi (endpoint).
Endpoint (konsumen layanan) dan layanan titik akhir (penyedia layanan) harus berada dalam zona yang sama. Zona endpoint harus merupakan subset dari zona layanan titik akhir. Misalnya, jika layanan titik akhir dideploy di Zona A dan Zona B, endpoint hanya dapat dibuat di Zona A atau Zona B.
Langkah utama:
Konfigurasi sisi server (penyedia layanan)
Buat load balancer: Di VPC2, buat Instance SLB yang mendukung PrivateLink, seperti CLB atau NLB berorientasi privat. Konfigurasikan kelompok server backend dan pendengar.
Buat layanan titik akhir: Di Konsol PrivateLink, buat layanan titik akhir dan asosiasikan dengan Instance SLB yang dibuat pada langkah sebelumnya.
Konfigurasi daftar putih layanan (hanya untuk akses lintas akun): Jika VPC1 milik Akun Alibaba Cloud yang berbeda, tambahkan UID akun tersebut ke daftar putih layanan dari layanan titik akhir.
Terima permintaan koneksi: Setelah klien menginisiasi koneksi, buka tab Connections pada layanan titik akhir dan terima permintaan yang tertunda. Atau, konfigurasikan layanan untuk menerima koneksi secara otomatis.
Konfigurasi sisi klien (konsumen layanan)
Buat endpoint: Di VPC1, buat endpoint dan pilih layanan titik akhir yang dibuat di sisi server.
Konfigurasi jaringan: Pilih vSwitch dan security group di VPC1 untuk endpoint guna mengontrol sumber daya mana di VPC1 yang dapat mengaksesnya.
Dapatkan detail endpoint: Setelah pembuatan, nama domain pribadi dan alamat IP akan dihasilkan.
Lakukan akses: Setelah penyedia layanan menerima koneksi, aplikasi di VPC1 dapat mengakses layanan di VPC2 melalui nama domain atau alamat IP yang dihasilkan.
Gunakan Proxy Protocol untuk mengontrol VPC yang dapat diakses beserta alamat IP pribadinya
Saat Anda menyediakan layanan melalui PrivateLink, server dapat mengidentifikasi endpoint atau VPC sumber setiap permintaan dan menerapkan aturan keamanan yang sesuai. Misalnya, Anda dapat membatasi suatu akun hanya menerima akses dari VPC sah. Bahkan jika kredensial bocor, jaringan yang tidak sah tidak dapat mengakses layanan tersebut.
Berdasarkan Gunakan PrivateLink untuk akses lintas-VPC dalam zona yang sama, Anda dapat mengaktifkan aplikasi sisi server untuk mengidentifikasi VPC sumber dan menerapkan kontrol akses.
Aktifkan Proxy Protocol v2: Aktifkan Proxy Protocol v2 pada pendengar NLB dan berlangganan ID VPC serta ID endpoint.
# Gunakan Cloud Assistant CLI untuk mengaktifkan Proxy Protocol v2 pada pendengar tertentu dan berlangganan ID VPC serta ID endpoint. aliyun nlb UpdateListenerAttribute \ --ListenerId lsn-xxxxxxxxxxxxxxxx \ --ProxyProtocolEnabled true \ --ProxyProtocolV2Config '{"Ppv2VpcIdEnabled":true,"Ppv2PrivateLinkEpIdEnabled":true}' \ --RegionId cn-hangzhou--ListenerId: ID pendengar yang dibuat untuk layanan web.--ProxyProtocolEnabled: Atur ketrueuntuk mengaktifkan Proxy Protocol. Protokol ini meneruskan informasi koneksi klien dalam paket pertama setelah handshake TCP. Layanan backend harus mendukung protokol ini. Lihat Langkah 2 untuk detailnya. Jika tidak, layanan akan terganggu.--ProxyProtocolV2Config: Menambahkan bidang Type-Length-Value (TLV) yang ditentukan Alibaba Cloud. Contoh ini berlangganan ID VPC sumber dan ID endpoint PrivateLink.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=0Tabel berikut menjelaskan cara mengurai TLV.
Deskripsi/Konten
Konten asli
Header protokol
Memperbaiki tanda tangan Proxy Protocol
0d0a0d0a000d0a515549540a
Versi 2, perintah PROXY
21
TCP/IPv4
11
Data berikut panjangnya 84 byte
0054
Informasi alamat
IP sumber: 10.0.0.14
0a00000e
IP tujuan: 10.0.0.15
0a00000f
Port sumber: 59074
e6c2
Port tujuan: 80
0050
TLV1
Tipe 03
034 byte
00040764b56b
0764b56b
TLV2
Tipe e1 (tipe kustom)
e124 byte
0018ID endpoint PrivateLink:
ep-bp1i288487e586152d4b
0265702d6270316932383834383765353836313532643462
TLV3
Tipe e1 (tipe kustom)
e1
26 byte
001a
ID VPC:
vpc-bp179qeke0wzo1mr8bxhl
017670632d627031373971656b6530777a6f316d72386278686c
TLV4
04(PP2_TYPE_NETNS), digunakan untuk meneruskan namespace jaringan04
6 byte
0006000000000000000000000000Jika layanan web Anda menggunakan Nginx, konfigurasikan agar mendukung Proxy Protocol:
(Memerlukan NGINX Plus R16 atau versi lebih baru, atau Nginx open source 1.13.11 atau lebih baru.)
server { listen 80 proxy_protocol; # Aktifkan Proxy Protocol v1/v2. # Konfigurasi lainnya... }Nginx secara otomatis mengurai TLV Proxy Protocol pada port 80, tetapi versi standar hanya mendukung pengambilan alamat IP dari TLV.
Gunakan ekstensi Lua untuk menangani ID VPC dan ID endpoint PrivateLink yang dikustomisasi Alibaba Cloud.
Plugin Lua berikut dalam nginx.conf menangani koneksi TCP, membaca paket dari socket, dan mengurai buffer TLV.
Data yang diurai disimpan dalam konteks permintaan. Saat permintaan /login dilakukan, kode memverifikasi ID endpoint PrivateLink:
-- Definisikan memori bersama sebelum blok http. lua_shared_dict tlv_cache 10m; stream { server { listen 80; # Jangan aktifkan proxy_protocol. Biarkan kode Lua di bawah menanganinya. preread_by_lua_block { -- 1. Coba baca header protokol tetap 16 byte. local sock = ngx.req.socket(true) local header, err = sock:receive(16) if not header then ngx.log(ngx.ERR, "gagal menerima header proxy protocol: ", err) return end -- 2. Periksa signature protokol (12 byte). if string.sub(header, 1, 12) ~= "\x0D\x0A\x0D\x0A\x00\x0D\x0A\x51\x55\x49\x54\x0A" then -- Jika bukan Proxy Protocol, kembalikan data yang telah dibaca ke buffer agar permintaan asli tidak rusak. sock:setreused(header) return end -- 3. Urai sisa header protokol. local ver_cmd = string.byte(header, 13) -- Versi dan perintah local family = string.byte(header, 14) -- Keluarga alamat dan protokol local len = string.byte(header, 15) * 256 + string.byte(header, 16) -- Panjang total bagian variabel if len == 0 then -- Tidak ada informasi alamat atau TLV. Kembali langsung. return end -- 4. Baca bagian panjang variabel (berisi alamat dan TLV). local variable_part, err = sock:receive(len) if not variable_part or #variable_part < len then ngx.log(ngx.ERR, "gagal membaca bagian variabel (alamat + tlvs): ", err) return end -- 5. Tentukan panjang informasi alamat berdasarkan keluarga alamat. 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. Pisahkan informasi alamat dan data TLV. local address_block = string.sub(variable_part, 1, addr_len) -- Anda dapat mengurai informasi alamat jika diperlukan. local tlv_string = string.sub(variable_part, addr_len + 1) -- 7. Urai data TLV. local tlvs = {} local pos = 1 while pos <= #tlv_string do -- Pastikan ada minimal 3 byte (Tipe, Panjang). if pos + 2 > #tlv_string then ngx.log(ngx.ERR, "data TLV tidak valid: byte tidak cukup untuk tipe dan panjang") 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) -- Pastikan panjang nilai tidak melebihi batas. if pos + 2 + tlv_length > #tlv_string then ngx.log(ngx.ERR, "data TLV tidak valid: panjang melebihi data yang tersedia") 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 nilai biner dalam Base64 agar mudah disimpan dan dilihat. value = ngx.encode_base64(tlv_value) }) pos = pos + 3 + tlv_length end -- 8. Simpan TLV yang diurai dalam memori bersama. if #tlvs > 0 then local cjson = require "cjson" local tlv_cache = ngx.shared.tlv_cache -- Gunakan alamat IP klien sebagai kunci untuk menyimpan data TLV. local client_ip = ngx.var.remote_addr local tlv_json = cjson.encode(tlvs) tlv_cache:set(client_ip, tlv_json, 60) -- Simpan selama 60 detik. -- Opsional: Simpan juga dalam ngx.ctx agar dapat digunakan oleh layer stream. ngx.ctx.proxy_protocol_tlvs = tlvs end } proxy_pass localhost:8080; # Teruskan permintaan HTTP berikutnya ke server HTTP untuk diproses. } } http { server { listen 8080; # Lokasi khusus untuk menangani permintaan /login. location /login { access_by_lua_block { local cjson = require "cjson" local tlv_cache = ngx.shared.tlv_cache -- Ambil data TLV dari memori bersama. local client_ip = ngx.var.remote_addr local tlv_json = tlv_cache:get(client_ip) if not tlv_json then ngx.log(ngx.ERR, "Data TLV tidak ditemukan untuk klien: ", client_ip) return ngx.exit(ngx.HTTP_FORBIDDEN) end local tlvs = cjson.decode(tlv_json) -- Ekstrak nilai TLV kedua (ID endpoint PrivateLink). local privateLinkEndId = nil if tlvs[2] then privateLinkEndId = tlvs[2].value -- Nilai dalam format Base64. end -- Definisikan ID endpoint yang diharapkan (dalam format Base64). local expected_value = "ZXAtYnAxaTI4ODQ4N2U1ODYxNTJkNGI=" -- Nilai contoh. Sesuaikan sesuai kebutuhan. -- Verifikasi ID endpoint. if privateLinkEndId ~= expected_value then ngx.log(ngx.ERR, "Akses ke /login ditolak: nilai TLV tidak cocok. Diharapkan '", expected_value, "', diperoleh '", tostring(privateLinkEndId), "'") return ngx.exit(ngx.HTTP_FORBIDDEN) end -- Jika verifikasi berhasil, permintaan dilanjutkan untuk diproses. } proxy_pass http://your_python_backend; } # Tangani semua permintaan lainnya. location / { proxy_pass http://your_python_backend; } } # Definisi upstream layanan backend Python Anda. upstream your_python_backend { server 127.0.0.1:5000; # Asumsikan program backend Anda berjalan di port 5000. } }
Gunakan PrivateLink untuk mengakses Layanan Alibaba Cloud
Beberapa Layanan Alibaba Cloud mendukung akses melalui PrivateLink, yang memungkinkan Anda mengonfigurasi akun yang diizinkan untuk mengakses melalui jaringan pribadi dan menghindari risiko keamanan dari jaringan publik.
Akun pribadi berisiko menyebabkan eksfiltrasi data. Oleh karena itu, konfigurasikan akun perusahaan agar hanya mengizinkan akses dari jaringan pribadi yang sah, sehingga mencegah eksploitasi meskipun kredensial dikompromikan.
Skenario Ancaman
Buat endpoint untuk Layanan Alibaba Cloud: Di Konsol PrivateLink, buat gateway endpoint untuk Layanan Alibaba Cloud yang perlu diakses, seperti OSS, lalu asosiasikan dengan VPC dan tabel rute perusahaan Anda.
Konfigurasi kebijakan akses endpoint: Batasi akses hanya untuk identitas RAM (seperti pengguna atau peran) yang termasuk dalam Akun Alibaba Cloud perusahaan Anda. Langkah ini mencegah akun lain, seperti akun pribadi karyawan, mengakses OSS melalui saluran pribadi ini.
Konfigurasi kebijakan RAM (opsional): Untuk kontrol yang lebih granular, konfigurasikan kebijakan untuk Pengguna RAM atau peran agar menegakkan bahwa akses ke OSS harus berasal dari VPC tertentu.
Kemampuan kepatuhan
Periksa akses dari VPC ke alamat IP publik Alibaba Cloud
Analisis log aliran VPC untuk mengidentifikasi lalu lintas keluar dari VPC Anda ke alamat IP publik Alibaba Cloud yang dapat dioptimalkan dengan PrivateLink.
Langkah-langkah:
Aktifkan log aliran VPC: Aktifkan log aliran untuk VPC tempat bisnis inti Anda berada dan kirimkan log ke Simple Log Service (SLS).
Analisis lalu lintas keluar: Di Konsol SLS, kueri log aliran VPC dan filter lalu lintas keluar dengan
direction = out.Filter dan Temukan:
Filter paket respons: Filter lalu lintas dengan port tujuan kurang dari 1024 dan lalu lintas respons layanan lain yang dikenal untuk mengurangi kebisingan.
Identifikasi alamat IP publik Alibaba Cloud: Kueri kepemilikan alamat IP tujuan (
dstaddr) menggunakan alat seperti ipip.net. Fokus pada alamat IP publik yang dimiliki Alibaba Cloud.Lokalisasi Instance ECS sumber: Gunakan bidang
vm-iddalam log aliran untuk mengidentifikasi Instance ECS yang menginisiasi akses.
Analisis log contoh
Analisis log ini untuk mengidentifikasi instance mana yang mengakses sumber daya cloud melalui Internet.
Bidang utama dalam log contoh ini:
srcaddr: 10.0.1.171(alamat IP pribadi dalam VPC)dstaddr: 47.110.154.20,dstport: 80(alamat IP publik tujuan dan port)direction: out,action: ACCEPT(arah keluar, diizinkan)protocol: 6(TCP)vm-id: i-bp1ifnznc1m4tp4krmb1(Instance ECS yang menginisiasi akses)
Verifikasi hasil:
Jika alamat IP publik tujuan adalah titik akhir publik untuk Layanan Alibaba Cloud seperti OSS atau ECS, beralihlah ke endpoint PrivateLink.
Jika alamat IP publik tujuan mengarah ke layanan (seperti EIP atau SLB) di VPC lain dalam akun Anda, komunikasi lintas-VPC ini dapat dioptimalkan dengan PrivateLink.