Ringkasan kebijakan otorisasi
Tidak seperti aplikasi monolitik yang mungkin berjalan di satu tempat, aplikasi microservice yang didistribusikan secara global melakukan panggilan melintasi batas jaringan. Ini berarti lebih banyak titik masuk ke aplikasi Anda, dan lebih banyak peluang terhadap serangan berbahaya. Dan karena pod Kubernetes memiliki IP sementara, aturan {i>firewall<i} berbasis IP tradisional tidak memadai untuk mengamankan akses antara sebagian besar workload standar dan berbasis cloud. Dalam arsitektur microservice, pendekatan baru terhadap keamanan diperlukan. Meningkatkan fitur keamanan seperti Akun layanan Kubernetes dan kebijakan keamanan Istio, Cloud Service Mesh menyediakan lebih banyak kemampuan untuk membantu Anda mengamankan menggunakan berbagai aplikasi obrolan.
Halaman ini memberikan ringkasan AuthorizationPolicy
kepada operator aplikasi
resource kustom (CR). Kebijakan otorisasi memungkinkan
Anda mengaktifkan kontrol akses pada
pada lapisan aplikasi (L7) dan transport (L3/4). Anda mengonfigurasi
kebijakan otorisasi untuk menentukan perizinan—apa yang dimaksud dengan layanan atau
yang diizinkan untuk dilakukan?
Kebijakan otorisasi
Permintaan antara layanan di mesh Anda (dan antara pengguna akhir dan layanan)
diizinkan secara default. Anda menggunakan CR AuthorizationPolicy
untuk menentukan
kebijakan untuk workload Anda. Setelah Anda menerapkan
kebijakan otorisasi,
Cloud Service Mesh mendistribusikannya ke proxy file bantuan. Saat permintaan masuk ke
proxy file bantuan memeriksa kebijakan otorisasi untuk menentukan
permintaan harus diizinkan
atau ditolak.
Cakupan kebijakan
Anda dapat menerapkan kebijakan ke seluruh mesh layanan, ke namespace, atau ke beban kerja individu.
Untuk menerapkan kebijakan seluruh mesh, tentukan namespace root,
istio-system
, di kolommetadata:namespace
:apiVersion: "security.istio.io/v1beta1" kind: "AuthorizationPolicy" metadata: name: "mesh-wide" namespace: istio-system spec: ...
Untuk menerapkan kebijakan ke namespace, tentukan namespace di Kolom
metadata:namespace
:apiVersion: "security.istio.io/v1beta1" kind: "AuthorizationPolicy" metadata: name: "currencyservice" namespace: currencyservice spec: ...
Untuk membatasi kebijakan ke workload tertentu, sertakan
selector
kolom tersebut.apiVersion: "security.istio.io/v1beta1" kind: "AuthorizationPolicy" metadata: name: "frontend" namespace: demo spec: selector: matchLabels: app: frontend ...
Struktur dasar
Kebijakan otorisasi mencakup cakupan kebijakan, action
, dan daftar
rules
:
Seperti yang telah dijelaskan di bagian sebelumnya, ruang lingkup kebijakan dapat berupa seluruh mesh, namespace, atau beban kerja tertentu. Jika Anda menyertakannya, Kolom
selector
menentukan target kebijakan.Kolom
action
menentukan apakah akanALLOW
atauDENY
permintaan. Jika Anda tidak menentukan suatu tindakan, secara default, tindakan tersebut akan ditetapkan keALLOW
. Sebagai kejelasan, kami menyarankan agar Anda selalu menentukan tindakan. (Otorisasi kebijakan juga mendukungAUDIT
danCUSTOM
actions.)rules
menentukan kapan harus memicu tindakan.
Dalam contoh berikut:
Kebijakan ini diterapkan ke permintaan ke layanan
frontend
di Namespacedemo
.Permintaan diizinkan jika "hello:world" ada di header permintaan; jika tidak, permintaan akan ditolak.
apiVersion: "security.istio.io/v1beta1"
kind: "AuthorizationPolicy"
metadata:
name: "hello-world"
namespace: demo
spec:
selector:
matchLabels:
app: frontend
action: ALLOW
rules:
- when:
- key: request.headers[hello]
values: ["world"]
Kontrol akses pada operasi permintaan
Anda dapat mengontrol akses ke permintaan tertentu
operasi
seperti metode HTTP atau port TCP dengan menambahkan bagian to
pada rules
.
Pada contoh berikut, hanya metode HTTP GET
dan POST
yang diizinkan
ke currencyservice
dalam namespace demo
.
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: currencyservice
namespace: demo
spec:
selector:
matchLabels:
app: currencyservice
action: ALLOW
rules:
- to:
- operation:
methods: ["GET", "POST"]
Kontrol akses pada identitas terautentikasi
Pada contoh sebelumnya, kebijakan mengizinkan permintaan dari
sebagian besar workload standar
dan berbasis cloud. Jika Anda memiliki
STRICT
TLS bersama (mTLS) diaktifkan,
Anda dapat membatasi akses berdasarkan
identitas workload atau namespace yang
permintaan berasal dari
source
bagian.
Gunakan kolom
principals
ataunotPrincipal
untuk mengontrol akses di pada tingkat workload Anda.Gunakan kolom
namespaces
ataunotNamespaces
untuk mengontrol akses di pada level namespace.
Semua kolom di atas mengharuskan Anda mengaktifkan STRICT
mTLS. Jika Anda
tidak dapat menyetel STRICT
mTLS, lihat
Menolak permintaan teks biasa untuk alternatif
solusi.
Beban kerja yang diidentifikasi
Dalam contoh berikut, permintaan ke currencyservice
hanya diizinkan
dari layanan frontend
. Permintaan ke currencyservice
dari sumber lain
workload ditolak.
apiVersion: "security.istio.io/v1beta1"
kind: "AuthorizationPolicy"
metadata:
name: "currencyservice"
namespace: demo
spec:
selector:
matchLabels:
app: currencyservice
action: ALLOW
rules:
- from:
- source:
principals: ["example-project-1234.svc.id.goog/ns/demo/sa/frontend-sa"]
Untuk menentukan akun layanan, principals
untuk
Certificate authority Cloud Service Mesh (Mesh CA)
dan Certificate Authority Service
(Layanan CA) harus dalam format berikut:
principals: ["PROJECT_ID.svc.id.goog/ns/NAMESPACE/sa/SERVICE_ACCOUNT_NAME"]
PROJECT_ID.svc.id.goog
adalah
domain tepercaya untuk Mesh CA. Jika Anda
menggunakan Istio CA (sebelumnya dikenal sebagai Citadel), domain kepercayaan default
cluster.local
.
Namespace yang diidentifikasi
Contoh berikut menunjukkan kebijakan yang menolak permintaan jika sumbernya tidak
namespace foo
:
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: httpbin-deny
namespace: foo
spec:
selector:
matchLabels:
app: httpbin
version: v1
action: DENY
rules:
- from:
- source:
notNamespaces: ["foo"]
Pencocokan nilai
Sebagian besar kolom dalam kebijakan otorisasi mendukung semua pencocokan berikut skema:
- Pencocokan persis: pencocokan string persis.
- Pencocokan karakter pengganti menggunakan karakter pengganti
"*"
:- Awalan cocok: string dengan akhiran
"*"
. Misalnya,"test.example.*"
cocok dengan"test.example.com"
atau"test.example.com.cn"
. - Pencocokan akhiran: string dengan awalan
"*"
. Misalnya,"*.example.com"
cocok dengan"eng.example.com"
atau"test.eng.example.com"
.
- Awalan cocok: string dengan akhiran
- Pencocokan kehadiran: Untuk menentukan bahwa kolom harus ada dan tidak boleh kosong, gunakan
format
fieldname: ["*"]
. Ini berbeda dengan meninggalkan kolom tidak ditentukan, yang berarti mencocokkan apa pun, termasuk yang kosong.
Ada beberapa pengecualian. Misalnya, kolom berikut hanya mendukung pencocokan persis:
- Kolom
key
di bagianwhen
ipBlocks
di bawah bagiansource
- Kolom
ports
di bagianto
Contoh kebijakan berikut mengizinkan akses di jalur dengan awalan /test/*
atau akhiran */info
:
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: tester
namespace: default
spec:
selector:
matchLabels:
app: products
action: ALLOW
rules:
- to:
- operation:
paths: ["/test/*", "*/info"]
Pencocokan pengecualian
Untuk mencocokkan kondisi negatif seperti notValues
di kolom when
,
notIpBlocks
di kolom source
, notPorts
di kolom to
, Cloud Service Mesh
mendukung pencocokan pengecualian. Contoh berikut memerlukan permintaan yang valid
principals
, yang berasal dari autentikasi JWT, jika jalur permintaan adalah
bukan /healthz
. Dengan demikian, kebijakan ini mengecualikan permintaan ke jalur /healthz
dari
autentikasi JWT:
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: disable-jwt-for-healthz
namespace: default
spec:
selector:
matchLabels:
app: products
action: ALLOW
rules:
- to:
- operation:
notPaths: ["/healthz"]
from:
- source:
requestPrincipals: ["*"]
Menolak permintaan teks biasa
Di Cloud Service Mesh 1.5 dan yang lebih baru, mTLS otomatis diaktifkan secara default. Dengan mTLS otomatis, proxy file bantuan klien otomatis mendeteksi jika server file bantuan. File bantuan klien mengirimkan mTLS ke workload dengan file bantuan dan mengirim teks biasa ke workload tanpa file bantuan. Untuk keamanan terbaik, sebaiknya bahwa Anda mengaktifkan STRICT mTLS.
Jika Anda tidak dapat mengaktifkan mTLS dengan mode STRICT
untuk beban kerja atau
namespace, Anda dapat:
- membuat kebijakan otorisasi untuk secara eksplisit mengizinkan traffic dengan
namespaces
atauprincipals
yang tidak kosong, atau - tolak traffic dengan
namespaces
atauprincipals
kosong.
Karena namespaces
dan principals
hanya dapat diekstrak dengan mTLS
permintaan, kebijakan ini secara efektif menolak
traffic teks polos apa pun.
Kebijakan berikut menolak permintaan jika akun utama dalam permintaan
kosong (yang berlaku untuk permintaan teks biasa). Kebijakan ini mengizinkan
permintaan jika akun utama tidak kosong. ["*"]
berarti kecocokan yang tidak kosong, dan
gunakan dengan notPrincipals
berarti
cocok dengan akun utama kosong.
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: require-mtls
namespace: NAMESPACE
spec:
action: DENY
rules:
- from:
- source:
notPrincipals: ["*"]
Prioritas kebijakan otorisasi
Anda dapat mengonfigurasi kebijakan otorisasi ALLOW
dan DENY
yang terpisah, tetapi Anda
perlu memahami prioritas kebijakan dan
perilaku {i>default<i} untuk memastikan bahwa
kebijakan tersebut melakukan
apa yang Anda inginkan. Diagram berikut menjelaskan kebijakan tersebut
prioritas tinggi.
Contoh kebijakan di bagian berikut menggambarkan beberapa kebijakan perilaku mereka dan situasi di mana Anda mungkin menganggapnya berguna.
Jangan izinkan apa pun
Contoh berikut menunjukkan kebijakan ALLOW
yang tidak cocok dengan apa pun. Menurut
secara default, jika tidak ada kebijakan ALLOW
lain, permintaan akan selalu ditolak.
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: allow-nothing
spec:
action: ALLOW
Praktik keamanan yang baik adalah dengan
memulai dari kebijakan {i>allow-nothing<i} dan
secara bertahap menambahkan lebih banyak kebijakan ALLOW
untuk membuka lebih banyak akses ke workload.
Tolak semua akses
Contoh berikut menunjukkan kebijakan DENY
yang cocok dengan semuanya. Karena
DENY
kebijakan dievaluasi sebelum ALLOW
kebijakan, semua permintaan ditolak
meskipun ada kebijakan ALLOW
yang cocok dengan permintaan tersebut.
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: deny-all
spec:
action: DENY
rules:
- {}
Kebijakan tolak semua berguna jika Anda ingin menonaktifkan sementara semua akses ke sebagian besar workload standar dan berbasis cloud.
Izinkan semua akses
Contoh berikut menunjukkan kebijakan ALLOW
yang cocok dengan semuanya, dan
memungkinkan akses penuh
ke suatu beban kerja. Kebijakan allow-all membuat ALLOW
kebijakan tidak berguna karena selalu mengizinkan permintaan.
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: allow-all
spec:
action: ALLOW
rules:
- {}
Kebijakan {i>allow-all<i} berguna jika Anda
ingin mengekspos akses penuh untuk sementara ke
suatu beban kerja. Jika ada kebijakan DENY
, permintaan tetap dapat ditolak
karena DENY
kebijakan dievaluasi sebelum kebijakan ALLOW
.
Praktik terbaik
Membuat akun layanan Kubernetes untuk setiap layanan, dan menentukan menggunakan akun layanan di Deployment. Contoh:
apiVersion: v1 kind: ServiceAccount metadata: name: frontend-sa namespace: demo --- apiVersion: apps/v1 kind: Deployment metadata: name: frontend namespace:demo spec: selector: matchLabels: app: frontend template: metadata: labels: app: frontend spec: serviceAccountName: frontend-sa ...
Mulai dengan kebijakan izinkan apa pun dan secara bertahap menambahkan kebijakan
ALLOW
lainnya untuk membuka lebih banyak akses ke workload.Jika Anda menggunakan JWT untuk layanan Anda:
Buat kebijakan
DENY
untuk memblokir permintaan yang tidak diautentikasi, misalnya:apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: requireJWT namespace: admin spec: action: DENY rules: - from: - source: notRequestPrincipals: ["*"]
Terapkan kebijakan yang tidak diizinkan.
Tentukan
ALLOW
kebijakan untuk setiap workload. Untuk contoh, lihat Token JWT.
Langkah selanjutnya
Pelajari fitur keamanan Cloud Service Mesh lebih lanjut:
- Mengonfigurasi autentikasi pengguna Cloud Service Mesh
- Mengonfigurasi kebijakan audit untuk layanan Anda
- Mengonfigurasi keamanan transportasi
- Mengintegrasikan Identity-Aware Proxy dengan Cloud Service Mesh
- Praktik Terbaik untuk menggunakan gateway keluar Cloud Service Mesh di cluster GKE
Pelajari lebih lanjut kebijakan otorisasi dari dokumentasi Istio: