Alibaba Cloud Service Mesh (ASM), Open Policy Agent (OPA) eklentisiyle entegre çalışır ve uygulamalarınız için ayrıntılı erişim kontrol ilkeleri tanımlamanıza olanak tanır. v1.8.6.41 veya sonraki sürümlerdeki ASM örnekleri, OPA ilkelerini pod'lara otomatik olarak göndermek için bir ConfigMap yapılandırmanızı destekler; bu sayede ilkeler dinamik olarak güncellenebilir. Bu konuda, ASM'de OPA ilkelerini nasıl dinamik olarak güncelleyeceğiniz gösterilmektedir.
Önkoşullar
v1.8.6.41-gb1d8f288-aliyun veya daha yeni bir sürümde ASM örneği oluşturmuş olmalısınız. Daha fazla bilgi için bkz. ASM örneği oluşturma.
Yönetilen bir ACK kümesi oluşturmuş olmalısınız. Daha fazla bilgi için bkz. Yönetilen ACK kümesi oluşturma.
Kümeyi ASM örneğine ekleme işlemini tamamlamış olmalısınız.
Arka plan bilgileri
CNCF tarafından kuluçka projesi olarak barındırılan Open Policy Agent (OPA), uygulamalarınız için ayrıntılı erişim kontrolü uygulamanıza olanak tanıyan bir ilke altyapısıdır. Genel amaçlı bir ilke altyapısı olarak OPA, mikroservislerinizin yanında bağımsız bir hizmet olarak dağıtılabilir. Bir uygulamayı korumak için mikroservise gelen her isteğin yetkilendirilmesi gerekir. Mikroservis, isteğin izin verilip verilmediğini belirlemek üzere OPA API'sini sorgular.
Adım 1: OPA'yı etkinleştirin
ASM konsolu oturumunu açın.
Sol gezinme bölmesinde seçeneğini belirleyin.
Mesh Management sayfasında, yapılandırmak istediğiniz ASM örneğini bulun. ASM örneğinin adını tıklayın veya Actions sütunundaki Manage öğesini tıklayın.
Basic Information sayfasında, sağ üst köşedeki Settings seçeneğini tıklayın.
Settings Update panelinde Enable OPA plug-in seçeneğini işaretleyin.
-
OK seçeneğini tıklayın.
Basic Information sayfasında, OPA Plug-in durumu Enable olarak değişir.
Adım 2: ConfigMap'leri oluşturun
ASM, OPA ilkelerinin dinamik güncellenmesini destekler. Service Mesh yapılandırmasında openpolicyagent.org/policy=rego etiketini kullanabilirsiniz. Bu şekilde, ilke tüm ad alanlarında OPA sidecar enjekte edilmiş tüm pod'lara otomatik olarak gönderilir. ConfigMap kaldırıldığında, ilke de pod'lardan kaldırılır.
Bir pod için OPA ilkesi tanımlarken yalnızca bir adet
default allowalanı dahil edebilirsiniz. Birden fazla OPA ilkesiyle ilişkili ConfigMap aynı poda uygulanıyorsa ve her ilke birdefault allowalanı tanımlıyorsa, çokludefault allowalanları dinamik güncellemelerin başarısız olmasına neden olur.OPA sidecar, başlatma işlemi için
opa-policyadlı bir ConfigMap'e bağımlıdır. Bu ConfigMap'i silerseniz, ilgili OPA ilkesi de OPA sidecar'dan kaldırılır. ConfigMap'i yeniden oluşturmak ilkeyi geri yüklemez; pod'u yeniden oluşturmanız gerekir.
Kümenin kubeconfig dosyasını alın ve kubectl kullanarak kümeye bağlanın.
-
opa-policy adlı bir ConfigMap oluşturun.
OPA sidecar, başlatma işlemi için
opa-policyadlı bir ConfigMap gerektirir. Bu ConfigMap dinamik güncellemeleri destekler. Yalnızca temel ilke yapılandırması için bu ConfigMap'i kullanın. Karmaşık ilkeleri diğer ConfigMap'ler aracılığıyla dinamik olarak ekleyin.-
Aşağıdaki içeriği kullanarak opa-policy adlı bir YAML dosyası oluşturun:
apiVersion: v1 kind: ConfigMap metadata: name: opa-policy data: policy.rego: | ### The paths allowed in this policy are required for dynamic OPA policy updates. If these paths are not configured, the updates will fail. package istio.authz import input.parsed_path allow { parsed_path[0] = "v1" parsed_path[1] = "policies" } -
ConfigMap'i oluşturmak için aşağıdaki komutu çalıştırın:
kubectl apply -f opa-policy.yaml
-
-
opa-policy-add adlı bir ConfigMap oluşturun.
OPA ilkenizi tanımlamak için bu ConfigMap'i kullanın.
-
Aşağıdaki içeriği kullanarak opa-policy-add adlı bir YAML dosyası oluşturun:
apiVersion: v1 kind: ConfigMap metadata: name: opa-policy-add labels: ### You must configure the following label in the ConfigMap. Otherwise, the OPA policy that the ConfigMap defines cannot be dynamically updated. openpolicyagent.org/policy: rego data: policy.rego: | ### The following code shows the definition of a sample policy. Define a policy based on your actual needs. package istio.authz import input.attributes.request.http as http_request default allow = false allow { roles_for_user[r] required_roles[r] } roles_for_user[r] { r := user_roles[user_name][_] } required_roles[r] { perm := role_perms[r][_] perm.method = http_request.method perm.path = http_request.path } user_name = parsed { [_, encoded] := split(http_request.headers.authorization, " ") [parsed, _] := split(base64url.decode(encoded), ":") } user_roles = { "guest1": ["guest"], "admin1": ["admin"] } role_perms = { "guest": [ {"method": "GET", "path": "/productpage"}, ], "admin": [ {"method": "GET", "path": "/productpage"}, {"method": "GET", "path": "/api/v1/products"}, ], }user_roles: Kullanıcılara rol atar. Bu örnekte,guestrolüguest1kullanıcısına veadminrolüadmin1kullanıcısına atanır.role_perms: Her rol için izinleri ayarlar. Bu örnekte,guestrolünün /productpage yolundaki uygulamaya erişmesine veadminrolünün /productpage ile /api/v1/products yollarındaki uygulamalara erişmesine izin verilir.
-
ConfigMap'i oluşturmak için aşağıdaki komutu çalıştırın:
kubectl apply -f opa-policy-add.yaml
-
-
İlke gönderim sonucunu görüntülemek için aşağıdaki komutu çalıştırın:
Gönderim durumu, ConfigMap'in
annotationsalanında güncellenir.kubectl get configmap opa-policy-add -o yamlKomut çıktısında ConfigMap'i inceleyin:
-
Gönderim başarılıysa, ConfigMap'te aşağıdaki bilgileri görürsünüz.
openpolicyagent.org/policy-status: '{"status":"ok"}' Gönderim başarısız olursa, ilgili bir hata iletisi görüntülenir.
-
Adım 3: OPA sidecar enjekte edin
Örnek Bookinfo uygulamasını ASM örneğine dağıtın ve Bookinfo uygulamasının her pod'una bir OPA sidecar enjekte edilip edilmediğini kontrol edin.
Bookinfo örnek uygulamasını ASM örneğine dağıtın. Daha fazla bilgi için bkz. Uygulamayı ASM örneğine dağıtma.
Gerekirse Istio sanal hizmetlerini ve bir giriş ağ geçidi hizmetini tanımlayın. Daha fazla bilgi için bkz. Istio ile sürüm tabanlı trafik yönlendirme.
-
Bookinfo uygulamasındaki her uygulamanın pod'larına OPA sidecar enjekte edilip edilmediğini kontrol edin.
Container Service Management Console oturumunu açın.
Sol gezinme bölmesinde Cluster seçeneğini tıklayın.
Cluster List sayfasında, hedef kümenin adını tıklayın veya Actions sütunundaki Details seçeneğini tıklayın.
Küme yönetimi sayfasının sol gezinme bölmesinde seçeneğini belirleyin.
-
Pods sayfasında, Namespace açılır listesinden default değerini seçin ve hedef uygulamanın pod adını tıklayın.
Containers sekmesinde, bir sidecar proxy'sinin (istio-proxy) ve bir OPA sidecar'ının (opa-istio) enjekte edildiğini doğrulayın. Bu kontrolü her uygulama pod'u için tekrarlayın.
Adım 4: OPA ilkesinin erişim kontrolünü beklendiği gibi uyguladığını doğrulayın
-
Aşağıdaki komutları çalıştırın. Sonuçlar,
guestrolüne sahipguest1kullanıcısının/productpageadresindeki uygulamaya erişebildiğini ancak/api/v1/productsadresindeki erişiminin reddedildiğini gösterir.curl -X GET http://{{The IP address of the ingress gateway service}}/productpage --user guest1:password -IBeklenen çıktı aşağıdaki gibidir:
HTTP/1.1 200 OKcurl -X GET http://{{The IP address of the ingress gateway service}}/api/v1/products --user guest1:password -IBeklenen çıktı aşağıdaki gibidir:
HTTP/1.1 403 Forbidden -
Aşağıdaki komutları çalıştırın. Sonuçlar,
adminrolüne sahipadmin1kullanıcısının hem/productpagehem de/api/v1/productsyollarındaki uygulamalara erişebildiğini gösterir.curl -X GET http://{{The IP address of the ingress gateway service}}/productpage --user admin1:password -IBeklenen çıktı aşağıdaki gibidir:
HTTP/1.1 200 OKcurl -X GET http://{{The IP address of the ingress gateway service}}/api/v1/products --user admin1:password -IBeklenen çıktı aşağıdaki gibidir:
HTTP/1.1 200 OKYukarıdaki sonuçlar, tanımlanan OPA ilkesinin erişim kontrolünü beklendiği gibi uyguladığını gösterir.
Adım 5: OPA ilkesini dinamik olarak güncelleyin
-
opa-policy-add adlı ConfigMap'i güncellemek için ACK kümesinde aşağıdaki komutu çalıştırın:
kubectl replace -n {The namespace where the ACK cluster resides} -f - <<EOF apiVersion: v1 kind: ConfigMap metadata: name: opa-policy-add labels: ### You must configure the following label in the ConfigMap. Otherwise, the OPA policy that the ConfigMap defines cannot be dynamically updated. openpolicyagent.org/policy: rego data: policy.rego: | ### The following code shows the definition of a sample policy. Define a policy based on your actual needs. package istio.authz import input.attributes.request.http as http_request default allow = false allow { roles_for_user[r] required_roles[r] } roles_for_user[r] { r := user_roles[user_name][_] } required_roles[r] { perm := role_perms[r][_] perm.method = http_request.method perm.path = http_request.path } user_name = parsed { [_, encoded] := split(http_request.headers.authorization, " ") [parsed, _] := split(base64url.decode(encoded), ":") } user_roles = { "guest1": ["guest", "admin"], "admin1": ["admin"] } role_perms = { "guest": [ {"method": "GET", "path": "/productpage"}, ], "admin": [ {"method": "GET", "path": "/productpage"}, {"method": "GET", "path": "/api/v1/products"}, ], } EOFuser_roles: Kullanıcılara rol atar. Bu örnekte,guest1kullanıcısına hemguesthem deadminrolleri verilirkenadmin1kullanıcısınaadminrolü verilir.role_perms: Her rol için izinleri ayarlar. Bu örnekte,guestrolünün /productpage yolundaki uygulamaya erişmesine veadminrolünün /productpage ile /api/v1/products yollarındaki uygulamalara erişmesine izin verilir.
-
İlke gönderim sonucunu görüntülemek için aşağıdaki komutu çalıştırın:
Gönderim durumu, ConfigMap'in
annotationsalanında güncellenir.kubectl get configmap opa-policy-add -o yamlKomut çıktısında ConfigMap'i inceleyin:
-
Gönderim başarılıysa, ConfigMap'te aşağıdaki bilgileri görürsünüz.
openpolicyagent.org/policy-status: '{"status":"ok"}' Gönderim başarısız olursa, ilgili bir hata iletisi görüntülenir.
-
Adım 6: OPA ilkesinin dinamik olarak güncellendiğini doğrulayın
Aşağıdaki cURL komutlarını çalıştırın. Sonuçlar, admin rolünün guest1 kullanıcısına atandığını gösterir. Ayrıca, guest1 kullanıcısının /productpage veya /api/v1/products içeren bir URL kullanarak uygulamaya erişim iznine sahip olduğu görülür.
curl -X GET http://{{The IP address of the ingress gateway service}}/productpage --user guest1:password -I
Beklenen çıktı aşağıdaki gibidir:
HTTP/1.1 200 OK
curl -X GET http://{{The IP address of the ingress gateway service}}/api/v1/products --user guest1:password -I
Beklenen çıktı aşağıdaki gibidir:
HTTP/1.1 200 OK
OPA ilkesi güncellenmeden önce, guest1 kullanıcısı /productpage içeren bir URL kullanarak uygulamaya erişebilir ancak /api/v1/products içeren bir URL ile erişemez. OPA ilkesi güncellendikten sonra, guest1 kullanıcısı /productpage veya /api/v1/products içeren bir URL kullanarak uygulamaya erişebilir. Bu sonuç, OPA ilkesinin dinamik olarak güncellendiğini gösterir.