Halaman ini berlaku untuk Apigee dan Apigee hybrid.
Lihat dokumentasi Apigee Edge.
Apa
Kebijakan AccessControl memungkinkan Anda mengizinkan atau menolak akses ke API berdasarkan alamat IP tertentu.
Kebijakan ini adalah Kebijakan standar dan dapat di-deploy ke jenis lingkungan apa pun. Untuk mengetahui informasi tentang jenis kebijakan dan ketersediaan dengan setiap jenis lingkungan, lihat Jenis kebijakan.
Video: Tonton video singkat untuk mempelajari lebih lanjut cara mengizinkan atau menolak akses ke API Anda berdasarkan alamat IP tertentu.
Meskipun Anda dapat melampirkan kebijakan ini di mana saja dalam alur proxy API, sebaiknya Anda memeriksa alamat IP di awal alur ( Permintaan / ProxyEndpoint / Pra-Alur), bahkan sebelum autentikasi atau pemeriksaan kuota.
Anda juga harus mempertimbangkan untuk menggunakan Google Cloud Armor dengan Apigee sebagai cara alternatif untuk mengamankan API Anda.
Sampel
Nilai mask dalam contoh IPv4 berikut mengidentifikasi mana dari empat octet (8, 16, 24, 32
bit) yang dipertimbangkan aturan kecocokan saat mengizinkan atau menolak akses. Nilai defaultnya adalah 32. Lihat
atribut mask
dalam referensi Elemen untuk mengetahui informasi
selengkapnya.
Tolak 198.51.100.1
<AccessControl name="ACL"> <IPRules noRuleMatchAction = "ALLOW"> <MatchRule action = "DENY"> <SourceAddress mask="32">198.51.100.1</SourceAddress> </MatchRule> </IPRules> </AccessControl>
Menolak semua permintaan dari alamat klien: 198.51.100.1
Izinkan permintaan dari alamat klien lainnya.
Menolak penggunaan variabel
<AccessControl name="ACL"> <IPRules noRuleMatchAction = "ALLOW"> <MatchRule action = "DENY"> <SourceAddress mask="{kvm.mask.value}">{kvm.ip.value}</SourceAddress> </MatchRule> </IPRules> </AccessControl>
Misalnya, Anda menggunakan peta nilai kunci (KVM) untuk menyimpan nilai untuk masking dan IP.
Ini adalah pendekatan praktis untuk mengubah IP dan masking selama runtime tanpa harus mengupdate
dan men-deploy ulang proxy API. Anda dapat menggunakan kebijakan KeyValueMapOperations untuk mengambil variabel yang berisi nilai untuk kvm.mask.value
dan kvm.ip.value
(dengan asumsi bahwa itulah nama variabel dalam kebijakan KVM yang berisi nilai mask dan nilai IP dari KVM Anda).
Jika nilai yang Anda ambil adalah 24
untuk mask dan 198.51.100.1
untuk alamat IP, kebijakan AccessControl akan menolak semua permintaan dari: 198.51.100.*
Semua alamat klien lainnya akan diizinkan.
Tolak 198.51.100.*
<AccessControl name="ACL"> <IPRules noRuleMatchAction = "ALLOW"> <MatchRule action = "DENY"> <SourceAddress mask="24">198.51.100.1</SourceAddress> </MatchRule> </IPRules> </AccessControl>
Menolak semua permintaan dari alamat klien: 198.51.100.*
Izinkan permintaan dari alamat klien lainnya.
198.51.*.*
<AccessControl name="ACL"> <IPRules noRuleMatchAction = "ALLOW"> <MatchRule action = "DENY"> <SourceAddress mask="16">198.51.100.1</SourceAddress> </MatchRule> </IPRules> </AccessControl>
Menolak semua permintaan dari alamat klien: 198.51.*.*
Izinkan permintaan dari alamat klien lainnya.
Menolak 198.51.100.*, mengizinkan 192.0.2.1
<AccessControl name="ACL"> <IPRules noRuleMatchAction = "ALLOW"> <MatchRule action = "ALLOW"> <SourceAddress mask="32">192.0.2.1</SourceAddress> </MatchRule> <MatchRule action = "DENY"> <SourceAddress mask="24">198.51.100.1</SourceAddress> </MatchRule> </IPRules> </AccessControl>
Menolak semua permintaan dari alamat klien: 198.51.100.*, tetapi mengizinkan 192.0.2.1.
Izinkan permintaan dari alamat klien lainnya.
Izinkan 198.51.*.*
<AccessControl name="ACL"> <IPRules noRuleMatchAction = "DENY"> <MatchRule action = "ALLOW"> <SourceAddress mask="16">198.51.100.1</SourceAddress> </MatchRule> </IPRules> </AccessControl>
Izinkan semua permintaan dari alamat: 198.51.*.*
Menolak permintaan dari alamat klien lainnya.
Mengizinkan beberapa IP
<AccessControl name="ACL"> <IPRules noRuleMatchAction = "DENY"> <MatchRule action = "ALLOW"> <SourceAddress mask="24">198.51.100.1</SourceAddress> <SourceAddress mask="24">192.0.2.1</SourceAddress> <SourceAddress mask="24">203.0.113.1</SourceAddress> </MatchRule> </IPRules> </AccessControl>
Mengizinkan permintaan dari alamat klien: 198.51.100.* 192.0.2.* 203.0.113.*
Menolak semua alamat lain.
Menolak beberapa IP
<AccessControl name="ACL"> <IPRules noRuleMatchAction = "ALLOW"> <MatchRule action = "DENY"> <SourceAddress mask="24">198.51.100.1</SourceAddress> <SourceAddress mask="24">192.0.2.1</SourceAddress> <SourceAddress mask="24">203.0.113.1</SourceAddress> </MatchRule> </IPRules> </AccessControl>
Menolak permintaan dari alamat klien: 198.51.100.* 192.0.2.* 203.0.113.*
Izinkan semua alamat lainnya.
Mengizinkan beberapa IP, menolak beberapa IP
<AccessControl name="ACL"> <IPRules noRuleMatchAction = "DENY"> <MatchRule action = "DENY"> <SourceAddress mask="24">198.51.100.1</SourceAddress> <SourceAddress mask="24">192.0.2.1</SourceAddress> <SourceAddress mask="24">203.0.113.1</SourceAddress> </MatchRule> <MatchRule action = "ALLOW"> <SourceAddress mask="16">198.51.100.1</SourceAddress> <SourceAddress mask="16">192.0.2.1</SourceAddress> <SourceAddress mask="16">203.0.113.1</SourceAddress> </MatchRule> </IPRules> </AccessControl>
Izinkan: 198.51.*.* 192.0.*.* 203.0.*.*
Menolak sebagian daftar yang diizinkan: 198.51.100.* 192.0.2.* 203.0.113.*
Catatan penggunaan
Selain melindungi API Anda dari IP berbahaya, kebijakan AccessControl juga memberi Anda kontrol atas akses IP yang sah. Misalnya, jika Anda hanya ingin komputer yang berada di bawah kontrol perusahaan Anda untuk mengakses API yang ditampilkan di lingkungan pengujian, Anda dapat mengizinkan rentang alamat IP untuk jaringan internal Anda. Developer yang bekerja dari rumah dapat mengakses API ini menggunakan VPN.
Konfigurasi dan eksekusi kebijakan AccessControl melibatkan hal berikut:
- Tentukan serangkaian aturan pencocokan dengan salah satu dari dua tindakan (Izinkan atau Tolak) yang terkait dengan setiap aturan.
- Untuk setiap aturan pencocokan, tentukan alamat IP (elemen SourceAddress).
- Lihat Cara kebijakan memilih alamat IP yang akan dievaluasi untuk menentukan alamat IP mana dalam pesan yang Anda konfigurasikan aturannya untuk ditangani.
- Konfigurasikan mask untuk setiap alamat IP. Anda mengizinkan atau menolak akses berdasarkan nilai mask pada alamat IP. Lihat Tentang penyamaran IP dengan notasi CIDR.
- Tentukan urutan pengujian aturan.
- Semua aturan pencocokan dijalankan dalam urutan yang ditentukan. Jika aturan cocok, tindakan yang sesuai akan dijalankan dan aturan kecocokan berikutnya akan dilewati.
- Jika aturan yang sama dikonfigurasi dengan tindakan ALLOW dan DENY, aturan yang ditentukan terlebih dahulu dalam urutan akan dipicu dan aturan berikutnya (dengan tindakan lainnya) akan dilewati.
Cara kebijakan memilih alamat IP yang akan dievaluasi
Alamat IP dapat berasal dari berbagai sumber dalam permintaan. Misalnya, header pesan True-Client-IP
mungkin berisi alamat IP, dan header X-Forwarded-For
mungkin berisi satu atau beberapa alamat IP. Bagian ini menjelaskan cara mengonfigurasi kebijakan AccessControl untuk mengevaluasi alamat IP yang tepat yang ingin Anda evaluasi.
Berikut adalah logika yang digunakan kebijakan AccessControl untuk menentukan alamat IP mana yang akan dievaluasi:
1. Header True-Client-IP
Kebijakan ini pertama-tama memeriksa alamat IP di header True-Client-IP
. Jika header berisi alamat IP yang valid, kebijakan akan mengevaluasi alamat tersebut.
2. Header X-Forwarded-For
Jika tidak ada header True-Client-IP
, atau jika Anda telah menetapkan elemen <IgnoreTrueClientIPHeader> ke benar(true), kebijakan akan mengevaluasi alamat IP di header X-Forwarded-For
.
Apigee otomatis mengisi header X-Forwarded-For
dengan alamat IP yang diterima dari handshake TCP eksternal terakhir (seperti IP klien atau
router). Jika ada beberapa alamat IP di header, alamat tersebut kemungkinan merupakan rantai server yang memproses permintaan. Namun, daftar alamat
juga dapat berisi alamat IP yang di-spoof. Jadi, bagaimana kebijakan mengetahui alamat mana yang akan
dievaluasi?
Dimensi X-Forwarded-For di analisis Apigee
Apigee Analytics menulis nilai header X-Forwarded-For
ke dimensi x_forwarded_for_ip
. Untuk menentukan IP klien yang membuat
permintaan ke Apigee, gunakan nilai dalam dimensi
ax_resolved_client_ip
, tetapi kecualikan ax_true_client_ip
,
yang tidak didukung dengan kebijakan AccessControl. Lihat
Referensi metrik, dimensi, dan filter Analytics.
Tentang penyamaran IP dengan notasi CIDR
Notasi CIDR (Classless Inter-Domain Routing) adalah cara untuk menunjukkan rentang alamat IP melalui masking. Hal ini berlaku untuk IPv4 dan IPv6. Begini cara kerjanya. Kita akan menggunakan IPv4 dalam contoh untuk memudahkan.
Alamat IP adalah kelompok angka yang dipisahkan titik. Dalam istilah biner, setiap grup adalah jumlah bit tertentu (8 untuk IPv4 dan 16 untuk IPv6). Alamat IPv4 198.51.100.1 terlihat seperti ini dalam biner:
11000110.00110011.01100100.00000001
Artinya, ada 4 grup yang terdiri dari 8 bit, atau total 32 bit. Dengan CIDR, Anda dapat menunjukkan rentang dengan menambahkan /angka (1-32) ke alamat IP, seperti ini:
198.51.100.1/24
Dalam hal ini, 24 adalah angka yang akan Anda gunakan untuk nilai atribut mask
dalam kebijakan ini.
Notasi ini berarti, "Simpan 24 bit pertama persis seperti apa adanya, bit yang tersisa dapat berupa nilai apa pun dari 0 hingga 255". Contoh:
Simpan persis seperti apa adanya | Kemungkinan nilai untuk grup terakhir |
---|---|
198.51.100. | 0 - 255 |
Perhatikan bahwa mask terjadi di akhir grup tiga. Hal ini membuat semuanya rapi dan bagus, yang pada dasarnya membuat mask seperti ini: 198.51.100.*. Pada umumnya, menggunakan kelipatan 8 (IPv4) dan 16 (IPv6) akan memberi Anda tingkat masking yang Anda inginkan:
IPv4: 8, 16, 24, 32
IPv6: 16, 32, 48, 64, 80, 96, 112, 128
Namun, Anda dapat menggunakan angka lain untuk kontrol yang lebih terperinci, yang melibatkan sedikit penghitungan biner. Berikut adalah contoh yang menggunakan mask 30, seperti dalam 198.51.100.1/30, dengan 1 terakhir adalah 00000001 dalam biner:
Simpan persis seperti apa adanya | Nilai yang memungkinkan |
---|---|
11000110.00110011.01100100.000000 (30 bit pertama) | 00000000, 00000001, 00000010, atau 00000011 |
198.51.100. | 0, 1, 2, atau 3 |
Dalam contoh ini, dengan konfigurasi yang ditetapkan ke <SourceAddress
mask="30">198.51.100.1</SourceAddress>
, IP berikut akan diizinkan (atau
ditolak, bergantung pada aturan Anda):
- 198.51.100.0
- 198.51.100.1
- 198.51.100.2
- 198.51.100.3
Referensi elemen
Referensi elemen menjelaskan elemen dan atribut kebijakan AccessControl.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <AccessControl async="false" continueOnError="false" enabled="true" name="Access-Control-1"> <DisplayName>Access Control 1</DisplayName> <IPRules noRuleMatchAction = "ALLOW"> <MatchRule action = "ALLOW"> <SourceAddress mask="32">198.51.100.1</SourceAddress> </MatchRule> <MatchRule action = "DENY"> <SourceAddress mask="24">198.51.100.1</SourceAddress> </MatchRule> </IPRules> <ValidateBasedOn>X_FORWARDED_FOR_ALL_IP</ValidateBasedOn> </AccessControl>
Atribut <AccessControl>
<AccessControl async="false" continueOnError="false" enabled="true" name="Access-Control-1">
Elemen <ClientIPVariable>
Menentukan variabel alur yang berisi alamat IP yang diperiksa kebijakan terhadap IPRules. Jika variabel flow tidak berisi alamat IP yang valid (ipv4 atau ipv6), kebijakan akan menampilkan error.
Misalkan variabel flow ditetapkan ke 12.31.34.52
. Pada contoh berikut, akses ditolak. Jika variabel ditetapkan ke 10.11.12.13
, akses akan diberikan.
<AccessControl name='ACL'> <ClientIPVariable>FLOW_VARIABLE</ClientIPVariable> <IPRules noRuleMatchAction = 'DENY'> <MatchRule action = 'ALLOW'> <SourceAddress mask='32'>10.11.12.13</SourceAddress> </MatchRule> </IPRules> </AccessControl>
Default | T/A |
---|---|
Kehadiran | Opsional |
Jenis | Variabel flow |
Elemen <IgnoreTrueClientIPHeader>
Jika Anda menetapkannya ke benar (true), kebijakan akan mengabaikan header True-Client-IP
dan mengevaluasi alamat IP di header X-Forwarded-For
, mengikuti
perilaku evaluasi X-Forwarded-For yang telah Anda konfigurasikan.
<AccessControl async="false" continueOnError="false" enabled="true" name="Access-Control-1"> <DisplayName>Access Control-1</DisplayName> <IgnoreTrueClientIPHeader>true</IgnoreTrueClientIPHeader> ... </AccessControl>
Default | false |
---|---|
Kehadiran | Opsional |
Jenis | Boolean |
Elemen <IPRules>
Elemen induk yang berisi aturan yang mengizinkan atau menolak alamat IP. Atribut
noRuleMatchAction
memungkinkan Anda menentukan cara menangani alamat IP apa pun yang
tidak tercakup dalam aturan pencocokan Anda.
<IPRules noRuleMatchAction = "ALLOW">
Default | T/A |
---|---|
Kehadiran | Opsional |
Jenis | T/A |
Atribut
Atribut | Deskripsi | Jenis | Default | Kehadiran |
---|---|---|---|---|
noRuleMatchAction |
Tindakan yang perlu dilakukan (izinkan atau tolak akses) jika aturan kecocokan yang ditentukan tidak di-resolve
(tidak cocok).
Nilai yang valid: ALLOW atau DENY
|
String | IZINKAN | Wajib |
Elemen <IPRules>/<MatchRule>
Tindakan yang akan diambil (mengizinkan atau menolak akses) jika alamat IP cocok dengan SourceAddress yang Anda tentukan.
<IPRules noRuleMatchAction = "ALLOW"> <MatchRule action = "ALLOW"> <SourceAddress mask="32">198.51.100.1</SourceAddress> </MatchRule> <MatchRule action = "DENY"> <SourceAddress mask="24">198.51.100.1</SourceAddress> </MatchRule> </IPRules>
Default | T/A |
---|---|
Kehadiran | Opsional |
Jenis | T/A |
Atribut
Atribut | Deskripsi | Jenis | Default | Kehadiran |
---|---|---|---|---|
action |
Tindakan yang perlu dilakukan (izinkan atau tolak akses) jika aturan kecocokan yang ditentukan tidak di-resolve (tidak cocok). Nilai yang valid: ALLOW atau DENY |
String | IZINKAN | Wajib |
Elemen <IPRules>/<MatchRule>/<SourceAddress>
Rentang alamat IP klien.
Nilai yang valid: Alamat IP yang valid (notasi desimal bertitik). Untuk perilaku karakter pengganti, gunakan
atribut mask
.
<IPRules noRuleMatchAction = "ALLOW"> <MatchRule action = "ALLOW"> <SourceAddress mask="{variable}">198.51.100.1</SourceAddress> </MatchRule> <MatchRule action = "DENY"> <SourceAddress mask="24">{variable}</SourceAddress> </MatchRule> </IPRules>
Seperti yang ditunjukkan pada contoh sebelumnya, elemen SourceAddress
juga mendukung
Template pesan untuk
atribut mask
atau alamat IP, yang
berarti Anda dapat menetapkan nilai menggunakan variabel yang saat ini tersedia di
alur proxy API.
Misalnya, Anda dapat menyimpan alamat IP dalam peta nilai kunci (KVM) dan menggunakan kebijakan KeyValueMapOperations untuk mengambil alamat IP dan menetapkannya ke variabel (seperti kvm.ip.value
). Kemudian, Anda dapat menggunakan variabel tersebut untuk alamat IP:
<SourceAddress mask="24">{kvm.ip.value}</SourceAddress>
Menetapkan mask dan/atau alamat IP dengan variabel memberi Anda fleksibilitas untuk mengubah nilai saat runtime tanpa harus mengubah dan men-deploy ulang proxy API.
Default | T/A |
---|---|
Kehadiran | Opsional |
Jenis | String (khusus satu alamat IP) |
Atribut
Atribut | Deskripsi | Jenis | Default | Kehadiran |
---|---|---|---|---|
masker |
Atribut
setara dengan notasi CIDR berikut: 198.51.100.1/24 Nilai valid: IPv4: 1-32 IPv6: 1-128 Nilai nol (0) hanya valid untuk IP 0.0.0.0, sehingga tidak praktis. Menetapkan mask dengan variabel Atribut
|
Bilangan bulat | T/A | Wajib |
Elemen <ValidateBasedOn>
Jika header HTTP X-Forwarded-For
berisi beberapa alamat IP, gunakan elemen ValidateBasedOn
ini untuk mengontrol alamat IP mana yang dievaluasi.
Gunakan pendekatan ini untuk mengevaluasi alamat IP hanya jika Anda yakin dengan validitas alamat IP yang ingin dievaluasi. Misalnya, jika Anda memilih untuk mengevaluasi semua alamat IP di header X-Forwarded-For
, Anda harus dapat memercayai validitas alamat tersebut, dan/atau menyiapkan aturan DENY atau ALLOW yang komprehensif untuk mengizinkan hanya IP tepercaya yang memanggil proxy API Anda.
Alamat IP paling kiri di header adalah milik klien, dan alamat IP paling kanan adalah server yang meneruskan permintaan ke layanan saat ini. Alamat IP paling kanan, atau terakhir, adalah alamat yang diterima Apigee dari handshake TCP eksternal terakhir.
Nilai yang Anda masukkan di elemen ini memungkinkan Anda menentukan apakah akan memeriksa semua alamat IP di header (default), hanya alamat IP pertama, atau hanya alamat IP terakhir.
<AccessControl async="false" continueOnError="false" enabled="true" name="Access-Control-1"> <DisplayName>Access Control 1</DisplayName> <IPRules noRuleMatchAction = "ALLOW"> <MatchRule action = "DENY"> <SourceAddress mask="32">198.51.100.1</SourceAddress> </MatchRule> </IPRules> <ValidateBasedOn>X_FORWARDED_FOR_ALL_IP</ValidateBasedOn> </AccessControl>
Default | X_FORWARDED_FOR_ALL_IP |
---|---|
Kehadiran | Opsional |
Nilai valid |
|
Skema
Setiap jenis kebijakan ditentukan oleh skema XML (.xsd). Sebagai referensi, skema kebijakan tersedia di GitHub.
Referensi error
Bagian ini menjelaskan kode kesalahan dan pesan error yang ditampilkan dan variabel kesalahan yang disetel oleh Apigee saat kebijakan ini memicu error. Informasi ini penting untuk diketahui apakah Anda mengembangkan aturan kesalahan untuk menangani kesalahan. Untuk mempelajari lebih lanjut, lihat Yang perlu Anda ketahui tentang error kebijakan dan Menangani kesalahan.
Error runtime
Error ini dapat terjadi saat kebijakan dieksekusi.
Kode kesalahan | Status HTTP | Penyebab | Perbaikan |
---|---|---|---|
accesscontrol.IPDeniedAccess |
403 |
Alamat IP klien, atau alamat IP yang diteruskan
dalam permintaan API, cocok dengan alamat IP yang ditentukan dalam elemen <SourceAddress> dalam
elemen <MatchRule> Kebijakan Kontrol Akses, dan atribut action dari elemen
<MatchRule> ditetapkan ke DENY . |
build |
accesscontrol.InvalidIPAddressInVariable |
500 |
Variabel flow di <ClientIPVariable> berisi alamat IP yang tidak valid. |
Variabel kesalahan
Variabel ini ditetapkan saat terjadi error runtime. Untuk informasi selengkapnya, lihat Variabel khusus untuk error kebijakan.
Variabel | Dari mana | Contoh |
---|---|---|
fault.name="fault_name" |
fault_name adalah nama kesalahan, seperti yang tercantum dalam tabel Error runtime di atas. Nama kesalahan adalah bagian terakhir dari kode kesalahan. | fault.name Matches "IPDeniedAccess" |
acl.policy_name.failed |
policy_name adalah nama kebijakan yang ditentukan pengguna yang menampilkan kesalahan. | acl.AC-AllowAccess.failed = true |
Contoh respons kesalahan
{ "fault":{ "faultstring":"Access Denied for client ip : 52.211.243.3" "detail":{ "errorcode":"steps.accesscontrol.IPDeniedAccess" } } }
Contoh aturan kesalahan
<FaultRule name="IPDeniedAccess"> <Step> <Name>AM-IPDeniedAccess</Name> <Condition>(fault.name Matches "IPDeniedAccess") </Condition> </Step> <Condition>(acl.failed = true) </Condition> </FaultRule>