{"id":4553,"date":"2024-06-06T21:44:32","date_gmt":"2024-06-06T19:44:32","guid":{"rendered":"https:\/\/gokhan-gokalp.com\/?p=4553"},"modified":"2024-06-06T22:20:38","modified_gmt":"2024-06-06T20:20:38","slug":"securing-the-supply-chain-of-containerized-applications-to-reduce-security-risks-policy-enforcement-automated-governance-with-opa-gatekeeper-and-ratify-part-2","status":"publish","type":"post","link":"https:\/\/gokhan-gokalp.com\/tr\/securing-the-supply-chain-of-containerized-applications-to-reduce-security-risks-policy-enforcement-automated-governance-with-opa-gatekeeper-and-ratify-part-2\/","title":{"rendered":"Containerized Uygulamalar\u0131n Supply Chain\u2019ini G\u00fcvence Alt\u0131na Alarak G\u00fcvenlik Risklerini Azaltma (OPA Gatekeeper ve Ratify ile Otomatikle\u015ftirilmi\u015f Politika Uygulanmas\u0131) &#8211; B\u00f6l\u00fcm 2"},"content":{"rendered":"<p><\/p>\r\n<p>Makalenin ilk b\u00f6l\u00fcm\u00fcnde, <em>Software Supply Chain<\/em> g\u00fcvenli\u011finin \u00f6neminden ve containerized uygulamalar\u0131n g\u00fcvenlik risklerini azaltabilmek i\u00e7in <em>SDLC<\/em> s\u00fcre\u00e7leri boyunca al\u0131nabilecek \u00f6nlemlerden bahsetmi\u015ftik. Bu kapsamda,\u00a0shifting-left yakla\u015f\u0131m\u0131n\u0131n \u00f6neminden, yani \u00e7e\u015fitli g\u00fcvenlik unsurlar\u0131n\u0131n m\u00fcmk\u00fcn oldu\u011funca <em>SDLC<\/em> s\u00fcre\u00e7lerinin erken a\u015famalar\u0131na entegre edilmesinin faydalar\u0131ndan ve software supply chain i\u00e7erisinde g\u00fcvenilirlik, b\u00fct\u00fcnl\u00fck ve g\u00fcvenlik sa\u011flamak amac\u0131yla alabilece\u011fimiz \u00f6nlemlerden bahsetmi\u015ftik.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>E\u011fer makalenin ilk b\u00f6l\u00fcm\u00fcn\u00fc hen\u00fcz okumad\u0131ysan\u0131z, konunun b\u00fct\u00fcnl\u00fc\u011f\u00fc a\u00e7\u0131s\u0131ndan \u00f6ncelikle <em><a href=\"https:\/\/gokhan-gokalp.com\/securing-the-supply-chain-of-containerized-applications-to-reduce-security-risks-security-scanning-sboms-signingverifying-artifacts-part-1\/\" target=\"_blank\" rel=\"noopener\">buradan<\/a><\/em> ilk b\u00f6l\u00fcm\u00fc okuman\u0131z\u0131 tavsiye ederim.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>Makalenin bu b\u00f6l\u00fcm\u00fcnde ise <em><strong>kubernetes<\/strong><\/em> ortam\u0131nda <em>OPA Gatekeeper<\/em> ile <em>Ratify <\/em> kullanarak, \u00e7e\u015fitli politikalar\u0131 <strong>declarative<\/strong> bir \u015fekilde nas\u0131l tan\u0131mlayabilece\u011fimizi, containerized uygulamalar\u0131n da\u011f\u0131t\u0131lma i\u015flemleri s\u0131ras\u0131nda bu politikalar\u0131 nas\u0131l zorunlu k\u0131labilece\u011fimizi ve <strong>otomatikle\u015ftirilmi\u015f kararlarlar\u0131<\/strong> nas\u0131l alabilece\u011fimizi ele alaca\u011f\u0131z.<\/p>\r\n<p><a href=\"\/wp-content\/uploads\/2024\/06\/automated-gov-gokhan-gokalp.jpg\"><img decoding=\"async\" class=\"size-full wp-image-4649 lazyload\" data-src=\"\/wp-content\/uploads\/2024\/06\/automated-gov-gokhan-gokalp.jpg\" alt=\"\" width=\"2484\" height=\"1412\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2024\/06\/automated-gov-gokhan-gokalp.jpg 2484w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2024\/06\/automated-gov-gokhan-gokalp-300x171.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2024\/06\/automated-gov-gokhan-gokalp-1024x582.jpg 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2024\/06\/automated-gov-gokhan-gokalp-768x437.jpg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2024\/06\/automated-gov-gokhan-gokalp-1536x873.jpg 1536w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2024\/06\/automated-gov-gokhan-gokalp-2048x1164.jpg 2048w\" data-sizes=\"(max-width: 2484px) 100vw, 2484px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 2484px; --smush-placeholder-aspect-ratio: 2484\/1412;\" \/><\/a><\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\r\n<p><\/p>\r\n<p><strong><em>NOT<\/em><\/strong>: <em>Bu b\u00f6l\u00fcmden itibaren v1.20+ bir kubernetes ortam\u0131na sahip oldu\u011fumuzu varsayaca\u011f\u0131m.<\/em><\/p>\r\n<p><\/p>\r\n<\/blockquote>\r\n<p><\/p>\r\n<p><\/p>\r\n<h1 class=\"wp-block-heading\">OPA Gatekeeper &amp; Ratify<\/h1>\r\n<p><\/p>\r\n<p><\/p>\r\n<p><strong><em>Open Policy Agent<\/em> <\/strong>(<em>OPA<\/em>) &#8216;\u0131 daha \u00f6nce hi\u00e7 duymad\u0131ysan\u0131z, \u00e7e\u015fitli politikalar\u0131 <strong><em>Rego<\/em><\/strong> isimli declarative query dil&#8217;i ile <strong>code olarak<\/strong> tan\u0131mlayabilmemize olanak sa\u011flayan, <strong>genel ama\u00e7l\u0131 <\/strong>open-source bir politika engine&#8217;idir diyebiliriz. Daha fazla detay i\u00e7in ise, <a href=\"https:\/\/www.openpolicyagent.org\/docs\/latest\/#overview\" target=\"_blank\" rel=\"noreferrer noopener\" data-type=\"link\" data-id=\"https:\/\/www.openpolicyagent.org\/docs\/latest\/#overview\"><em>buraya<\/em><\/a> bir g\u00f6z atman\u0131z\u0131 \u015fiddetle tavsiye ederim. <strong><em>Gatekeeper<\/em><\/strong> i\u00e7in ise <em>OPA<\/em> constraint framework&#8217;\u00fcn\u00fc kullanarak \u00e7e\u015fitli politikalar\u0131 <strong><em>kubernetes<\/em><\/strong> \u00f6zelinde <em>ConstraintTemplate<\/em> &#8216;ler olarak tan\u0131mlayabilmemizi ve bu politikalar\u0131 zorunlu k\u0131labilmemizi sa\u011flayan bir <em>admission controller webhook<\/em> &#8216;udur diyebiliriz.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<figure class=\"wp-block-image size-large\"><a href=\"\/wp-content\/uploads\/2024\/04\/admission-controller-phases.png\"><img decoding=\"async\" width=\"1024\" height=\"381\" class=\"wp-image-4567 lazyload\" data-src=\"\/wp-content\/uploads\/2024\/04\/admission-controller-phases-1024x381.png\" alt=\"\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2024\/04\/admission-controller-phases-1024x381.png 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2024\/04\/admission-controller-phases-300x112.png 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2024\/04\/admission-controller-phases-768x286.png 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2024\/04\/admission-controller-phases.png 1278w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/381;\" \/><\/a>\r\n<figcaption class=\"wp-element-caption\">https:\/\/kubernetes.io\/blog\/2019\/03\/21\/a-guide-to-kubernetes-admission-controllers\/<\/figcaption>\r\n<\/figure>\r\n<p><\/p>\r\n<p><\/p>\r\n<p><em>Gatekeeper<\/em> ile containerized uygulamalar\u0131 <em>kubernetes<\/em> ortam\u0131nda fonksiyonel bir hale getirmeden \u00f6nce, bir ba\u015fka de\u011fi\u015fle admission request&#8217;i <em>API<\/em> server taraf\u0131nda intercept ederek, tan\u0131mlanm\u0131\u015f olan politikalara uygunluklar\u0131n\u0131 uyumluluk i\u00e7in kontrol edebilir, bu do\u011frultuda zorlayabilir ve b\u00f6ylece software supply chain g\u00fcvenli\u011fini ve governance modelini infrastructure seviyesinde de g\u00fc\u00e7lendirebilmekteyiz.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p><strong><em>Ratify<\/em><\/strong> ise container security supply chain alan\u0131nda supply chain artifact&#8217;lerini <strong>do\u011frulayabilmemize<\/strong> yard\u0131mc\u0131 olan bir ba\u015fka open source bir projedir. <em>Ratify<\/em> asl\u0131nda her ortamda \u00e7al\u0131\u015fabilecek bir executable olsa da, <em>kubernetes<\/em> \u00f6zelinde bakt\u0131\u011f\u0131m\u0131zda <em>Gatekeeper<\/em> i\u00e7in <strong>external bir data provider<\/strong> olarak hareket etmekte ve container image&#8217;leri ile ili\u015fkilendirmi\u015f oldu\u011fumuz <em>OCI<\/em> artifact metadata&#8217;lar\u0131na kar\u015f\u0131 politikalar tan\u0131mlayabilmemize ve onlar\u0131n do\u011frulanabilmesine olanak tan\u0131maktad\u0131r.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<h1 class=\"wp-block-heading\">Aksiyona Ge\u00e7elim!<\/h1>\r\n<p><\/p>\r\n<p><\/p>\r\n<h2 class=\"wp-block-heading\">Gatekeeper&#8217;\u0131 Haz\u0131rlayal\u0131m<\/h2>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>Makalenin ilk b\u00f6l\u00fcm\u00fcnde olu\u015fturmu\u015f oldu\u011fumuz software supply chain artifact&#8217;lerini ve imzalar\u0131n\u0131, da\u011f\u0131t\u0131lma \u00f6ncesi en basit yoldan pipeline \u00fczerinde nas\u0131l do\u011frulayabilece\u011fimizi <em>ORAS<\/em> ve <em>Notation CLI<\/em> ara\u00e7lar\u0131 ile birlikte ele alm\u0131\u015ft\u0131k. Ayr\u0131ca ilgili artifact&#8217;leri olu\u015ftururken makalenin bu b\u00f6l\u00fcm\u00fcnde <em>OPA Gatekeeper<\/em> ve <em>Ratify<\/em> &#8216;dan yararlanabilmek i\u00e7in, ilgili artifact&#8217;leri belirli formatlarda da olu\u015fturmu\u015ftuk.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>\u00d6rne\u011fin container g\u00fcvenlik taramas\u0131 sonucunu <em>SARIF<\/em> format\u0131nda, <em>SBOM<\/em> dok\u00fcman\u0131n\u0131 ise <em>SPDX<\/em> format\u0131nda ve <em>Notation<\/em> ile imzalam\u0131\u015f oldu\u011fumuz artifact&#8217;leri ise <em>COSE<\/em> format\u0131nda olu\u015fturmu\u015ftuk. \u015eimdi bu artifact&#8217;ler \u00f6zelinde <em>Ratify<\/em> &#8216;\u0131n <strong>do\u011frulay\u0131c\u0131<\/strong> plugin&#8217;lerinden yararlanarak daha spesifik kontrol politikalar\u0131n\u0131 declarative bir \u015fekilde nas\u0131l konfigure edip, zorunlu k\u0131labilece\u011fimize bir bakal\u0131m.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>\u00d6ncelikle <em>Ratify<\/em> &#8216;\u0131n do\u011frulama i\u015flemini ger\u00e7ekle\u015ftirip <em>Gatekeeper<\/em> &#8216;a geri bildirim verebilmesi i\u00e7in, ilgili container image&#8217; i ile ili\u015fkilendirmi\u015f oldu\u011fumuz supply chain artifact&#8217;lerine ilgili container registry \u00fczerinden eri\u015febilmesi gerekmektedir. <em>Ratify<\/em> arka planda ise bunun i\u00e7in <em>ORAS<\/em> arac\u0131ndan yararlanmaktad\u0131r. Bu makale serisi kapsam\u0131nda ise container registry olarak <em>Azure Container Registry<\/em> (<em>ACR<\/em>) kullanm\u0131\u015ft\u0131k. Bu noktada <em>Ratify<\/em>, <em>ORAS<\/em> &#8216;\u0131n ilgili registry&#8217;e eri\u015febilmesi i\u00e7in bizlere bir ka\u00e7 farkl\u0131 auth provider se\u00e7ene\u011fi sunmaktad\u0131r. Ben ilgili <em>AKS<\/em> cluster&#8217;\u0131n\u0131 (<em>v1.20+<\/em>) <em>ACR<\/em> entegrasyonu ile olu\u015fturdu\u011fum i\u00e7in, bu noktada <em>kubelet identity<\/em> &#8216;sini (<em><strong>managed identity<\/strong><\/em>) kullan\u0131yor olaca\u011f\u0131m. Dilerseniz kendi olu\u015fturaca\u011f\u0131n\u0131z user-assigned managed identity&#8217;i veya workload identity se\u00e7eneklerini de kullanabilirsiniz. Bunun ilgili se\u00e7eneklere ise <a href=\"https:\/\/ratify.dev\/docs\/reference\/oras-auth-provider\" target=\"_blank\" rel=\"noreferrer noopener\" data-type=\"link\" data-id=\"https:\/\/ratify.dev\/docs\/reference\/oras-auth-provider\"><em>buradan<\/em><\/a> eri\u015febilirsiniz.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>\u00d6ncelikle <em>Gatekeeper<\/em> &#8216;\u0131<em> external data<\/em> \u00f6zelli\u011fi ile ilgili <em>kubernetes<\/em> ortam\u0131na kurulumunu ger\u00e7ekle\u015ftirmemiz gerekmektedir.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>Bu noktada h\u0131zl\u0131 ilerleyebilmek i\u00e7in, <em>Gatekeeper<\/em> ve <em>Ratify<\/em> ara\u00e7lar\u0131n\u0131n kurulum i\u015flemlerini bir \u00f6nceki makale kapsam\u0131nda kullanm\u0131\u015f oldu\u011fumuz <em>CICD<\/em> template&#8217;i i\u00e7erisinde ger\u00e7ekle\u015ftirece\u011fim. Ayr\u0131ca imzalanm\u0131\u015f artifact&#8217;lerin politikalar arac\u0131l\u0131\u011f\u0131 ile do\u011frulanabilmesi konusunda <em>Ratify<\/em> &#8216;\u0131n built-in plugin&#8217;i olan <em>Notation<\/em> &#8216;\u0131 da kullanabilmemiz i\u00e7in, imzalama s\u00fcre\u00e7leri s\u0131ras\u0131nda Notation arac\u0131 ile olu\u015fturuyor oldu\u011fumuz <em>CA<\/em> certificate\u2019ini, kurulum i\u015flemi s\u0131ras\u0131nda <em>Ratify<\/em> &#8216;a sa\u011fl\u0131yor olmam\u0131z gerekmektedir. E\u011fer certificate olu\u015fturma i\u015flemlerini <em>CI<\/em> boyunca on-the-fly ger\u00e7ekle\u015ftirmek yerine <em>Azure Key Vault<\/em> gibi merkezi bir noktada ger\u00e7ekle\u015ftiriyor olsayd\u0131k, ozaman kurulum i\u015flemlerini farkl\u0131 noktalarda da ele alabilirdik.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>\u015eimdi daha \u00f6nce \u201c<em>Dev<\/em>\u201d ad\u0131nda olu\u015fturmu\u015f oldu\u011fumuz stage&#8217;in i\u00e7erisinde bulunan \u201c<em>VerifyArtifacts<\/em>\u201d job&#8217;\u0131ndan sonra a\u015fa\u011f\u0131daki \u015fekilde \u201c<em>DeployToDev<\/em>\u201c ad\u0131nda yeni bir job ekleyelim. Bu job i\u00e7erisinde de ilk a\u015fama olarak, ilgili artifact&#8217;lerin \u201c<em>SigningStage<\/em>\u201c i\u00e7erisinde imzalama i\u015flemlerinin ger\u00e7ekle\u015fmesinin ard\u0131ndan pipeline artifact\u2019i olarak payla\u015f\u0131yor oldu\u011fumuz <em>Notation<\/em> certificate&#8217;ini, olu\u015fturmu\u015f oldu\u011fumuz bu yeni job i\u00e7erisine download edece\u011fiz.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<pre class=\"wp-block-code\"><code>  - job: DeployToDev\r\n    displayName: 'Deploy to Dev'\r\n    dependsOn: VerifyArtifacts\r\n    steps:\r\n    - task: DownloadPipelineArtifact@2\r\n      inputs:\r\n        buildType: 'current'\r\n        artifactName: 'notation'\r\n        downloadPath: '$(Agent.BuildDirectory)\/..\/..\/.config\/notation\/localkeys'\r\n    - task: AzureCLI@2\r\n      displayName: 'Prepare OPA Gatekeeper &amp; Ratify'\r\n      inputs:\r\n        azureSubscription: 'DevOpsPoC'\r\n        scriptType: 'bash'\r\n        scriptLocation: 'inlineScript'\r\n        inlineScript: |\r\n          curl https:\/\/raw.githubusercontent.com\/helm\/helm\/main\/scripts\/get-helm-3 | bash\r\n\r\n          az aks get-credentials --resource-group YOUR_AKS_RG --name YOUR_AKS_NAME\r\n\r\n          helm repo add gatekeeper https:\/\/open-policy-agent.github.io\/gatekeeper\/charts\r\n\r\n          helm upgrade --install gatekeeper gatekeeper\/gatekeeper --atomic  \\\r\n              --namespace gatekeeper-system --create-namespace \\\r\n              --set enableExternalData=true \\\r\n              --set validatingWebhookTimeoutSeconds=5 \\\r\n              --set mutatingWebhookTimeoutSeconds=2 \\\r\n              --set externaldataProviderResponseCacheTTL=10s<\/code><\/pre>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>Ard\u0131ndan <em>Gatekeeper<\/em> &#8216;in kurulum i\u015flemini ilgili <em>AKS<\/em> cluster&#8217;\u0131na <em>Helm<\/em> vas\u0131tas\u0131yla ger\u00e7ekle\u015ftiriyoruz. <em>Gatekeeper<\/em> kurulumunun ard\u0131ndan ise <em>Ratify<\/em> &#8216;\u0131n kurulumunu kullanmak istedi\u011fimiz do\u011frulay\u0131c\u0131 plugin&#8217;leri ile birlikte ger\u00e7ekle\u015ftirmeye ba\u015flayabiliriz.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<h2 class=\"wp-block-heading\">Ratify<\/h2>\r\n<p><\/p>\r\n<p><\/p>\r\n<h3 class=\"wp-block-heading\">Notation ile \u0130mzalar\u0131n Do\u011frulanmas\u0131<\/h3>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>\u015eimdi ilgili task&#8217;\u0131n devam\u0131 olarak, a\u015fa\u011f\u0131daki gibi <em>Ratify<\/em> <em>helm<\/em> chart&#8217;\u0131n\u0131 konfigure edelim ve <em>Gatekeeper<\/em> ile ayn\u0131 namespace i\u00e7erisine kurulumunun ger\u00e7ekle\u015ftirilmesini sa\u011flayal\u0131m.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<pre class=\"wp-block-code\"><code>          helm repo add ratify https:\/\/deislabs.github.io\/ratify\r\n\r\n          helm upgrade --install ratify ratify\/ratify --version 1.12.1 \\\r\n              --namespace gatekeeper-system \\\r\n              --set featureFlags.RATIFY_CERT_ROTATION=true \\\r\n              --set logger.level=debug \\\r\n              --set-file notationCerts={$(Agent.BuildDirectory)\/..\/..\/.config\/notation\/localkeys\/order-api.io.crt} \\\r\n              --set oras.authProviders.azureManagedIdentityEnabled=true \\\r\n              --set azureManagedIdentity.clientId=\\\"YOUR_CLIENT_ID\\\" \\\r\n              --set azureManagedIdentity.tenantId=\"YOUR_TENANT_ID\"\r\n\r\n          kubectl apply -f https:\/\/deislabs.github.io\/ratify\/library\/default\/template.yaml\r\n          kubectl apply -f https:\/\/deislabs.github.io\/ratify\/library\/default\/samples\/constraint.yaml<\/code><\/pre>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>Bu noktada <em>Ratify<\/em> &#8216;a, farkl\u0131 do\u011frulama i\u015flemlerinde kullanabilmesi i\u00e7in ilgili artifact metadata&#8217;lar\u0131na <em>ACR<\/em> \u00fczerinden eri\u015febilmesi amac\u0131yla sa\u011flam\u0131\u015f oldu\u011fumuz <em>Azure Managed Identity<\/em> bilgilerini kullanmas\u0131n\u0131 s\u00f6yl\u00fcyoruz. Ayr\u0131ca, <em>Notation<\/em>, daha \u00f6nce de bahsetti\u011fimiz gibi <em>Ratify<\/em> i\u00e7erisinde varsay\u0131lan imza do\u011frulay\u0131c\u0131s\u0131 olarak geldi\u011fi i\u00e7in, &#8220;<em>notationCerts<\/em>&#8221; parametresi ile imzalama i\u015flemlerinde kullanm\u0131\u015f oldu\u011fumuz <em>CA<\/em> certificate&#8217;ini sa\u011fl\u0131yoruz. B\u00f6ylece <em>Ratify<\/em>, <em>kubernetes<\/em> i\u00e7erisinde sadece imzalanm\u0131\u015f container image&#8217;lerini \u00e7al\u0131\u015ft\u0131rmam\u0131za olanak sa\u011flayacakt\u0131r.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>Makalenin giri\u015finde <em>Gatekeeper<\/em> &#8216;\u0131 tan\u0131mlarken, <em>OPA<\/em> constraint framework&#8217;\u00fcn\u00fc kullanarak \u00e7e\u015fitli politikalar\u0131 <em>kubernetes<\/em> \u00f6zelinde <strong><em>ConstraintTemplate<\/em><\/strong> &#8216;ler olarak yani <strong><em>CRD-based<\/em><\/strong> olarak tan\u0131mlayabilmemizi ve bu politikalar\u0131 zorunlu k\u0131labilmemizi sa\u011flamaktad\u0131r demi\u015ftik.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p><em>OPA Constraint<\/em> ve <em>ConstraintTemplate<\/em> konseptine k\u0131saca de\u011finmek gerekirse, <em>ConstraintTemplate<\/em>, k\u0131s\u0131tlamalar\u0131 (constraint) uygulamak i\u00e7in kullan\u0131lacak olan politika mant\u0131\u011f\u0131n\u0131n ve k\u0131s\u0131tlaman\u0131n schema&#8217;s\u0131n\u0131n tan\u0131mland\u0131\u011f\u0131 <em>ConstraintTemplate<\/em> tipinde bir <em>CRD<\/em> &#8216;dir. Ayr\u0131ca <em><strong>Rego<\/strong><\/em> politikalar\u0131n\u0131 da konfig\u00fcrasyon olarak tan\u0131mlad\u0131\u011f\u0131m\u0131z yerdir. Tan\u0131mlanm\u0131\u015f olan bu politikan\u0131n uygulanabilmesi i\u00e7in ise, bir instance&#8217;\u0131n\u0131n al\u0131nmas\u0131 gerekmektedir. Bu i\u015flemi ise, <em>CRD-based Constraint<\/em> &#8216;ler tan\u0131mlayarak ger\u00e7ekle\u015ftirmekteyiz.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>\u015eimdi yukar\u0131daki kod blo\u011funda <em>kubectl<\/em> ile uyguluyor oldu\u011fumuz temel bir <em>OPA Gatekeeper<\/em> <em>ConstraintTemplate<\/em> &#8216;ine (template.yaml) bir bakal\u0131m.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<pre class=\"wp-block-code\"><code>apiVersion: templates.gatekeeper.sh\/v1beta1\r\nkind: ConstraintTemplate\r\nmetadata:\r\n  name: ratifyverification\r\nspec:\r\n  crd:\r\n    spec:\r\n      names:\r\n        kind: RatifyVerification\r\n  targets:\r\n    - target: admission.k8s.gatekeeper.sh\r\n      rego: |\r\n        package ratifyverification\r\n        \r\n        # Get data from Ratify\r\n        remote_data := response {\r\n          images := [img | img = input.review.object.spec.containers[_].image]\r\n          response := external_data({\"provider\": \"ratify-provider\", \"keys\": images})\r\n        }\r\n\r\n        # Base Gatekeeper violation\r\n        violation[{\"msg\": msg}] {\r\n          general_violation[{\"result\": msg}]\r\n        }\r\n        \r\n        # Check if there are any system errors\r\n        general_violation[{\"result\": result}] {\r\n          err := remote_data.system_error\r\n          err != \"\"\r\n          result := sprintf(\"System error calling external data provider: %s\", [err])\r\n        }\r\n        \r\n        # Check if there are errors for any of the images\r\n        general_violation[{\"result\": result}] {\r\n          count(remote_data.errors) &gt; 0\r\n          result := sprintf(\"Error validating one or more images: %s\", remote_data.errors)\r\n        }\r\n        \r\n        # Check if the success criteria is true\r\n        general_violation[{\"result\": result}] {\r\n          subject_validation := remote_data.responses[_]\r\n          subject_validation[1].isSuccess == false\r\n          result := sprintf(\"Subject failed verification: %s\", [subject_validation[0]])\r\n        }<\/code><\/pre>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>Bu noktada <em>ConstraintTemplate<\/em>, i\u00e7erisinde <em>Rego<\/em> dilinde uygulanacak olan politika mant\u0131\u011f\u0131n\u0131n bulundu\u011fu <em>RatifyVerification<\/em> tipinde bir <em>CRD<\/em> schema&#8217;s\u0131 olu\u015fturmaktad\u0131r.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>Bu noktada \u00f6zellikle a\u015fa\u011f\u0131daki sat\u0131r&#8217;a dikkat edersek,<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<pre class=\"wp-block-code\"><code>response := external_data({\"provider\": \"ratify-provider\", \"keys\": images})\r\n        }<\/code><\/pre>\r\n<p><\/p>\r\n<p><\/p>\r\n<p><em>Gatekeeper<\/em> &#8216;\u0131n container image&#8217;ini do\u011frulayabilmesi i\u00e7in external data sa\u011flay\u0131c\u0131s\u0131 olarak <em>Ratify<\/em> &#8216;\u0131 kulland\u0131\u011f\u0131n\u0131 g\u00f6rebiliriz.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>\u015eimdi yine <em>kubectl<\/em> ile uyguluyor oldu\u011fumuz <em>Constraint <\/em>&#8216;e (constraint.yaml)\u00a0bir bakal\u0131m.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<pre class=\"wp-block-code\"><code>apiVersion: constraints.gatekeeper.sh\/v1beta1\r\nkind: RatifyVerification\r\nmetadata:\r\n  name: ratify-constraint\r\nspec:\r\n  enforcementAction: deny\r\n  match:\r\n    kinds:\r\n      - apiGroups: [\"\"]\r\n        kinds: [\"Pod\"]\r\n    namespaces: [\"default\"]<\/code><\/pre>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>Bahsetti\u011fimiz gibi, olu\u015fturulan bu <em>Constraint<\/em>, az \u00f6nce tan\u0131mlam\u0131\u015f oldu\u011fumuz <em>ConstraintTemplate<\/em> &#8216;in bir nevi instance &#8216;\u0131 g\u00f6revini g\u00f6rmektedir. Bu <em>Constraint<\/em> i\u00e7erisinde ise, <em>ConstraintTemplate<\/em> &#8216;de yer alan ilgili politika mant\u0131\u011f\u0131n\u0131n, &#8220;<em>default<\/em>&#8221; namespace&#8217;i alt\u0131ndaki t\u00fcm &#8220;<em>Pod<\/em>&#8221; lara uygulanmas\u0131 gerekti\u011fini belirtiyoruz.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>Bu noktadan itibaren, <em>Notation<\/em>, <em>Ratify<\/em> i\u00e7erisinde built-in bir do\u011frulay\u0131c\u0131 olarak geldi\u011fi ve <em>Ratify<\/em> &#8216;\u0131n kurulumunu ger\u00e7ekle\u015ftirirken\u00a0imzalama s\u0131ras\u0131nda kulland\u0131\u011f\u0131m\u0131z <em>CA<\/em> certificate&#8217;ini de iletti\u011fimiz i\u00e7in, kubernetes i\u00e7erisinde &#8220;<em>default<\/em>&#8221; namespace alt\u0131nda sadece bu certificate ile imzalanm\u0131\u015f olan container image&#8217;lerinin \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131na izin verilecektir.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>Test etmeye ge\u00e7meden \u00f6nce built-in gelen <em>Ratify<\/em> do\u011frulay\u0131c\u0131lar\u0131na <em>kubernetes<\/em> taraf\u0131nda bakt\u0131\u011f\u0131m\u0131zda ise, a\u015fa\u011f\u0131daki gibi <em>Notation<\/em> ve <em>Cosign<\/em> &#8216;\u0131n varsay\u0131lan olarak geldi\u011fini g\u00f6rebiliriz.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<figure class=\"wp-block-image size-large\"><a href=\"\/wp-content\/uploads\/2024\/05\/notation-verifier.jpg\"><img decoding=\"async\" width=\"1024\" height=\"566\" class=\"wp-image-4606 lazyload\" data-src=\"\/wp-content\/uploads\/2024\/05\/notation-verifier-1024x566.jpg\" alt=\"\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2024\/05\/notation-verifier-1024x566.jpg 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2024\/05\/notation-verifier-300x166.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2024\/05\/notation-verifier-768x424.jpg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2024\/05\/notation-verifier-1536x849.jpg 1536w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2024\/05\/notation-verifier-2048x1132.jpg 2048w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/566;\" \/><\/a><\/figure>\r\n<p><\/p>\r\n<p><\/p>\r\n<p><em>Notation<\/em> do\u011frulay\u0131c\u0131s\u0131na bakt\u0131\u011f\u0131m\u0131zda ise, container ile ili\u015fkilendirilmi\u015f &#8220;<em>application\/vnd.cncf.notary.signature<\/em>&#8221; tipindeki artifact metadata&#8217;lar\u0131 ile \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 da g\u00f6rebiliriz.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>\u015eimdi ilgili politikay\u0131 test edebilmek i\u00e7in a\u015fa\u011f\u0131daki task&#8217;\u0131 kullanarak imzalanmam\u0131\u015f \u00f6rnek bir container image&#8217;ini, ilgili <em>kubernetes<\/em> ortam\u0131na yay\u0131mlamay\u0131 deneyelim.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<pre class=\"wp-block-code\"><code>    - task: AzureCLI@2\r\n      displayName: 'Deploy the $(orderAPIImageName) container'\r\n      inputs:\r\n        azureSubscription: 'DevOpsPoC'\r\n        scriptType: 'bash'\r\n        scriptLocation: 'inlineScript'\r\n        inlineScript: |\r\n          cat &lt;<\/code><\/pre>\r\n<p><\/p>\r\n<p><\/p>\r\n<figure class=\"wp-block-image size-large\"><a href=\"\/wp-content\/uploads\/2024\/05\/unsigned-denied-scaled.jpg\"><img decoding=\"async\" width=\"1024\" height=\"539\" class=\"wp-image-4609 lazyload\" data-src=\"\/wp-content\/uploads\/2024\/05\/unsigned-denied-1024x539.jpg\" alt=\"\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2024\/05\/unsigned-denied-1024x539.jpg 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2024\/05\/unsigned-denied-300x158.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2024\/05\/unsigned-denied-768x404.jpg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2024\/05\/unsigned-denied-1536x808.jpg 1536w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2024\/05\/unsigned-denied-2048x1077.jpg 2048w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/539;\" \/><\/a>\r\n\r\n<\/figure>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>G\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi, yay\u0131mlama i\u015flemi, ilgili container image&#8217;inin olu\u015fturmu\u015f oldu\u011fumuz <em>CA<\/em> certificate&#8217;i taraf\u0131ndan imzalanmam\u0131\u015f olmas\u0131ndan dolay\u0131, <em>Gatekeeper<\/em> &#8216;\u0131n <em>Ratify<\/em> &#8216;dan ald\u0131\u011f\u0131 geri bildirim do\u011frultusunda ba\u015far\u0131s\u0131z ger\u00e7ekle\u015fti.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<h3 class=\"wp-block-heading\">SBOM &#8216;un Do\u011frulanmas\u0131<\/h3>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>\u015eimdi ise <em>Ratify<\/em> &#8216;\u0131n external plugin&#8217;lerinden olan <em>SBOM<\/em> do\u011frulay\u0131c\u0131s\u0131n\u0131 entegre edelim. Bunun i\u00e7in <em>Ratify<\/em> kurulumunu a\u015fa\u011f\u0131daki gibi \u00f6zelle\u015ftirmemiz gerekmektedir.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<pre class=\"wp-block-code\"><code>          helm upgrade --install ratify ratify\/ratify --version 1.12.1 \\\r\n              --namespace gatekeeper-system \\\r\n              --set featureFlags.RATIFY_CERT_ROTATION=true \\\r\n              --set logger.level=debug \\\r\n              --set-file notationCerts={$(Agent.BuildDirectory)\/..\/..\/.config\/notation\/localkeys\/order-api.io.crt} \\\r\n              --set oras.authProviders.azureManagedIdentityEnabled=true \\\r\n              --set azureManagedIdentity.clientId=\\\"YOUR_CLIENT_ID\\\" \\\r\n              --set azureManagedIdentity.tenantId=\"YOUR_TENANT_ID\" \\\r\n              --set sbom.enabled=true \\\r\n              --set sbom.notaryProjectSignatureRequired=true \\\r\n              --set sbom.disallowedPackages[0].name=\"EasyNetQ\" \\\r\n              --set sbom.disallowedPackages[0].version=\"6.3.1\"<\/code><\/pre>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>Bu noktada \u00f6rnek bir senaryo olarak, &#8220;<em>sbom.enabled<\/em>&#8221; parametresi ile <em>SBOM<\/em> do\u011frulay\u0131c\u0131s\u0131n\u0131 etkinle\u015ftiriyor ve &#8220;<em>6.3.1<\/em>&#8221; versiyonlu &#8220;<em>EasyNetQ<\/em>&#8221; paketini i\u00e7eren container image&#8217;lerinin <em>kubernetes<\/em> ortam\u0131nda \u00e7al\u0131\u015ft\u0131r\u0131lmamas\u0131 gerekti\u011fini belirtiyoruz. Ayr\u0131ca, makalenin ilk b\u00f6l\u00fcm\u00fcnde hat\u0131rlarsak, olu\u015fturmu\u015f oldu\u011fumuz <em>SBOM<\/em> dok\u00fcman\u0131n\u0131 da supply chain g\u00fcvenli\u011fi i\u00e7in imzalam\u0131\u015ft\u0131k. Sa\u011flad\u0131\u011f\u0131m\u0131z &#8220;<em>sbom.notaryProjectSignatureRequired<\/em>&#8221; parametresi ile ise <em>SBOM<\/em> dok\u00fcman\u0131 i\u00e7in olu\u015fturmu\u015f oldu\u011fumuz imzan\u0131n da do\u011frulanmas\u0131 gerekti\u011fini belirtiyoruz. Ek olarak, <em>SBOM<\/em> do\u011frulay\u0131c\u0131s\u0131 i\u00e7in de ayn\u0131 <em>ConstraintTemplate<\/em> ve <em>Constraint<\/em> manifest&#8217;lerini kullanaca\u011f\u0131z.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>\u015eimdi, <em>Ratify<\/em> &#8216;\u0131n <em>SBOM<\/em> do\u011frulay\u0131c\u0131 plugin&#8217;i <em>SBOM<\/em> dok\u00fcman\u0131n\u0131 <em>SPDX-JSON<\/em> format\u0131nda bekledi\u011fi i\u00e7in, makalenin ilk b\u00f6l\u00fcm\u00fcnde <em>Trivy<\/em> ile <em>SBOM<\/em> dok\u00fcman\u0131n\u0131 olu\u015fturuyor oldu\u011fumuz task&#8217;a d\u00f6nelim ve &#8220;<em>&#8211;format spdx<\/em>&#8221; parametresini &#8220;<em>&#8211;format spdx-json<\/em>&#8221; olarak g\u00fcncelleyelim.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>Ard\u0131ndan bir \u00f6nceki a\u015famada imzalanmam\u0131\u015f \u00f6rnek bir container image&#8217;ini yay\u0131mlamak i\u00e7in kullanm\u0131\u015f oldu\u011fumuz task&#8217;\u0131 a\u015fa\u011f\u0131daki gibi g\u00fcncelleyelim ve uygulanacak olan politika detaylar\u0131n\u0131 g\u00f6rebilmek i\u00e7in <em>Ratify<\/em> pod&#8217;unun log&#8217;lar\u0131n\u0131 getirecek olan task&#8217;\u0131 da job i\u00e7erisine dahil edelim.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<pre class=\"wp-block-code\"><code>    - task: AzureCLI@2\r\n      displayName: 'Deploy the $(orderAPIImageName) container'\r\n      inputs:\r\n        azureSubscription: 'DevOpsPoC'\r\n        scriptType: 'bash'\r\n        scriptLocation: 'inlineScript'\r\n        inlineScript: |\r\n          cat &lt;<\/code><\/pre>\r\n<p><\/p>\r\n<p><\/p>\r\n<figure class=\"wp-block-image size-large\"><a href=\"\/wp-content\/uploads\/2024\/05\/ratify-policy-summary-scaled.jpg\"><img decoding=\"async\" width=\"1024\" height=\"569\" class=\"wp-image-4616 lazyload\" data-src=\"\/wp-content\/uploads\/2024\/05\/ratify-policy-summary-1024x569.jpg\" alt=\"\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2024\/05\/ratify-policy-summary-1024x569.jpg 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2024\/05\/ratify-policy-summary-300x167.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2024\/05\/ratify-policy-summary-768x427.jpg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2024\/05\/ratify-policy-summary-1536x854.jpg 1536w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2024\/05\/ratify-policy-summary-2048x1138.jpg 2048w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/569;\" \/><\/a>\r\n\r\n<\/figure>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>Pipeline&#8217;\u0131 tekrar \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131zda ise &#8220;<em>Dev<\/em>&#8220;ortam\u0131na yay\u0131mlama i\u015fleminin yine ba\u015far\u0131s\u0131z ger\u00e7ekle\u015fti\u011fini ve &#8220;<em>verifierReports<\/em>&#8221; array&#8217;i i\u00e7erisinde sebep olan uygulanm\u0131\u015f politikalar\u0131 da g\u00f6rebilmekteyiz. \u0130lk rapor&#8217;a bakt\u0131\u011f\u0131m\u0131zda imza do\u011frulama a\u015famas\u0131n\u0131n ba\u015far\u0131l\u0131 ger\u00e7ekle\u015fti\u011fini fakat uygulama i\u00e7erisinde kullan\u0131lan &#8220;<em>6.3.1<\/em>&#8221; versiyonlu &#8220;<em>EasyNetQ<\/em>&#8221; paketi sebebiyle <em>SBOM<\/em> do\u011frulamas\u0131n\u0131n ba\u015far\u0131s\u0131z ger\u00e7ekle\u015fti\u011fini g\u00f6rebiliriz.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>Bu sayede organizasyon olarak software supply chain&#8217;imiz i\u00e7erisinde merkezi bir kontrol mekanizmas\u0131na sahip olabilir, ortamlar\u0131m\u0131zda bulunmas\u0131n\u0131 istemedi\u011fimiz spesifik paketlerin kontrollerini sa\u011flayabilmekteyiz. Ayr\u0131ca uygulamalar i\u00e7erisinde kullan\u0131lan bu open-source paketler organizasyon taraf\u0131ndan izin verilmeyen bir lisanslama modellerine sahiplerse, bunlar\u0131n kontrol\u00fcn\u00fc de &#8220;<em>&#8211;set sbom.disallowedLicenses={&#8220;MPL&#8221;}<\/em>&#8221; parametresi ile ger\u00e7ekle\u015ftirebilmekteyiz.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p><em>Ratify<\/em> &#8216;\u0131n kurulumu ile etkinle\u015ftirilen <em>SBOM<\/em> do\u011frulay\u0131c\u0131s\u0131n\u0131n manifest&#8217;ine ise, a\u015fa\u011f\u0131daki gibi eri\u015febilir ve istedi\u011fimiz gibi de\u011fi\u015fiklikleri \u00fczerinde ger\u00e7ekle\u015ftirebiliriz.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"\/wp-content\/uploads\/2024\/05\/verifier-sbom.jpg\"><img decoding=\"async\" width=\"1024\" height=\"419\" class=\"wp-image-4617 lazyload\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/419;width: 645px; height: auto;\" data-src=\"\/wp-content\/uploads\/2024\/05\/verifier-sbom-1024x419.jpg\" alt=\"\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2024\/05\/verifier-sbom-1024x419.jpg 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2024\/05\/verifier-sbom-300x123.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2024\/05\/verifier-sbom-768x314.jpg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2024\/05\/verifier-sbom-1536x628.jpg 1536w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2024\/05\/verifier-sbom-2048x838.jpg 2048w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" \/><\/a><\/figure>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>Bu noktada, &#8220;<em>Disallowed Packages<\/em>&#8221; i\u00e7erisinde &#8220;<em>6.3.1<\/em>&#8221; versiyonlu &#8220;<em>EasyNetQ<\/em>&#8221; paketinin yer ald\u0131\u011f\u0131n\u0131 ve bu do\u011frulay\u0131c\u0131s\u0131n\u0131n, container&#8217;lar ile ili\u015fkilendirilmi\u015f &#8220;<em>application\/spdx+json<\/em>&#8221; tipindeki artifact metadata&#8217;lar\u0131 ile ilgilendi\u011fini de g\u00f6rebilmekteyiz.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<h3 class=\"wp-block-heading\">G\u00fcvenlik Taramas\u0131 Sonu\u00e7lar\u0131n\u0131n Do\u011frulanmas\u0131<\/h3>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>Bu noktaya kadar, <em>CI<\/em> s\u00fcre\u00e7leri boyunca olu\u015fturmu\u015f oldu\u011fumuz supply chain artifact&#8217;lerinin imzalar\u0131n\u0131n ve <em>SBOM<\/em> dok\u00fcman\u0131n\u0131n do\u011frulama i\u015flemlerini politikalar arac\u0131l\u0131\u011f\u0131yla otomatikle\u015ftirdik. \u015eimdi ise olu\u015fturmu\u015f oldu\u011fumuz container g\u00fcvenlik taramas\u0131 sonu\u00e7lar\u0131n\u0131 politikalar ile nas\u0131l do\u011frulayabilece\u011fimize bir g\u00f6z atal\u0131m.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>Bu noktada <em>Ratify<\/em> &#8216;\u0131n yine external plugin&#8217;lerinden olan <em>Vulnerability Report<\/em> do\u011frulay\u0131c\u0131s\u0131n\u0131 kullanaca\u011f\u0131z. Bu do\u011frulay\u0131c\u0131, ilgili g\u00fcvenlik taramas\u0131 sonu\u00e7lar\u0131n\u0131n <em>SARIF<\/em> format\u0131nda ve &#8220;<em>application\/sarif+json<\/em>&#8221; tipinde bir artifact olarak ilgili container image&#8217;i ile ili\u015fkilendirilmi\u015f olmas\u0131n\u0131 beklemektedir.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>Ayn\u0131 \u015fekilde bu plugin&#8217;ini de kullanabilmek i\u00e7in, <em>Ratify<\/em> &#8216;\u0131 ve ilgili politikay\u0131 konfigure etmemiz gerekmektedir. \u00d6rnek senaryo gere\u011fi, <em>kubernetes<\/em> ortam\u0131na yay\u0131mlanacak t\u00fcm container&#8217;lar\u0131n, 24 saat i\u00e7erisinde olu\u015fturulmu\u015f g\u00fcvenlik taramas\u0131 sonu\u00e7lar\u0131na sahip olmas\u0131n\u0131 ve &#8220;<em>HIGH<\/em>&#8221; veya &#8220;<em>CRITICAL<\/em>&#8221; seviyede g\u00fcvenlik ihlallerini bulundurmamalar\u0131n\u0131 istedi\u011fimizi varsayal\u0131m.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<pre class=\"wp-block-code\"><code>          helm upgrade --install ratify ratify\/ratify --version 1.12.1 \\\r\n              --namespace gatekeeper-system \\\r\n              --set featureFlags.RATIFY_CERT_ROTATION=true \\\r\n              --set logger.level=debug \\\r\n              --set-file notationCerts={$(Agent.BuildDirectory)\/..\/..\/.config\/notation\/localkeys\/order-api.io.crt} \\\r\n              --set oras.authProviders.azureManagedIdentityEnabled=true \\\r\n              --set azureManagedIdentity.clientId=\\\"36929c64-3fae-485c-82bd-b743cddfee56\\\" \\\r\n              --set azureManagedIdentity.tenantId=\"fc3df655-65a6-41ff-821f-0aa2e451a17b\" \\\r\n              --set sbom.enabled=true \\\r\n              --set sbom.notaryProjectSignatureRequired=true \\\r\n              --set sbom.disallowedPackages[0].name=\"EasyNetQ\" \\\r\n              --set sbom.disallowedPackages[0].version=\"6.3.1\" \\\r\n              --set vulnerabilityreport.enabled=true \\\r\n              --set vulnerabilityreport.notaryProjectSignatureRequired=true \\\r\n              --set vulnerabilityreport.maximumAge=\"24h\" \\\r\n              --set vulnerabilityreport.disallowedSeverities=\"{\"high\",\"critical\"}\"\r\n\r\n          kubectl apply -f https:\/\/deislabs.github.io\/ratify\/library\/default\/template.yaml\r\n          kubectl apply -f https:\/\/deislabs.github.io\/ratify\/library\/default\/samples\/constraint.yaml\r\n          kubectl apply -f https:\/\/raw.githubusercontent.com\/deislabs\/ratify\/23b143d07a53fd61557703c9836e486353959530\/library\/vulnerability-report-validation\/template.yaml\r\n          kubectl apply -f https:\/\/raw.githubusercontent.com\/deislabs\/ratify\/v1.1.0\/library\/vulnerability-report-validation\/samples\/constraint.yaml<\/code><\/pre>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>Bu noktada, <em>SBOM<\/em> konfig\u00fcrasyonu ard\u0131ndan, &#8220;<em>vulnerabilityreport.enabled<\/em>&#8221; parametresi ile ilgili do\u011frulay\u0131c\u0131y\u0131 etkinle\u015ftiriyor, &#8220;<em>vulnerabilityreport.maximumAge<\/em>&#8221; ve &#8220;<em>vulnerabilityreport.disallowedSeverities<\/em>&#8221; parametreleri ile de g\u00fcvenlik taramas\u0131 sonu\u00e7lar\u0131n\u0131n 24 saat i\u00e7erisinde olu\u015fturulmu\u015f olmas\u0131n\u0131n ve &#8220;<em>HIGH<\/em>&#8221; veya &#8220;<em>CRITICAL<\/em>&#8221; seviyede g\u00fcvenlik ihlallerinin bulunmamas\u0131 gerekti\u011fini s\u00f6yl\u00fcyoruz.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p><em>Ratify<\/em> &#8216;\u0131 ilgili do\u011frulay\u0131c\u0131y\u0131 olu\u015fturmas\u0131 i\u00e7in konfigure ettikten sonra ise, bu do\u011frulay\u0131c\u0131n\u0131n da politika mant\u0131\u011f\u0131n\u0131n yer alt\u0131\u011f\u0131 kendi<em> Gatekeeper Constraint Template<\/em> &#8216;ini ve <em>Constraint<\/em> &#8216;ini olu\u015fturuyoruz.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>Bu do\u011frulay\u0131c\u0131n\u0131n da <em>Rego<\/em> politikas\u0131na h\u0131zl\u0131ca bir g\u00f6z atal\u0131m.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<pre class=\"wp-block-code\"><code>apiVersion: templates.gatekeeper.sh\/v1beta1\r\nkind: ConstraintTemplate\r\nmetadata:\r\n  name: vulnerabilityreportvalidation\r\nspec:\r\n  crd:\r\n    spec:\r\n      names:\r\n        kind: VulnerabilityReportValidation\r\n      validation:\r\n        openAPIV3Schema:\r\n          type: object\r\n          properties:\r\n            issuer:\r\n              type: string\r\n  targets:\r\n    - target: admission.k8s.gatekeeper.sh\r\n      rego: |\r\n        package vulnerabilityreportvalidation\r\n\r\n        # This template defines policy for vulnerability report validation.\r\n        # It checks the following:\r\n        # - If there are any system errors\r\n        # - If there are errors for any of the images\r\n        # - There is at least one vulnerability report that was verified\r\n        # - Only considers the latest vulnerability report\r\n        # - The latest vulnerability report is valid (isSuccess = true)\r\n        # - The latest vulnerability report has a valid notary project signature (if require_signature = true)\r\n\r\n        import future.keywords.if\r\n        import future.keywords.in\r\n        import future.keywords.every\r\n\r\n        default require_signature := false # change to true to require notary project signature on vulnerability report\r\n\r\n        # Get data from Ratify\r\n        remote_data := response {\r\n          images := [img | img = input.review.object.spec.containers[_].image]\r\n          images_init := [img | img = input.review.object.spec.initContainers[_].image]\r\n          images_ephemeral := [img | img = input.review.object.spec.ephemeralContainers[_].image]\r\n          other_images := array.concat(images_init, images_ephemeral)\r\n          all_images := array.concat(other_images, images)\r\n          response := external_data({\"provider\": \"ratify-provider\", \"keys\": all_images})\r\n        }\r\n\r\n        violation[{\"msg\": msg}] {\r\n          general_violation[{\"result\": msg}]\r\n        }\r\n\r\n        # Check if there are any system errors\r\n        general_violation[{\"result\": result}] {\r\n          err := remote_data.system_error\r\n          err != \"\"\r\n          result := sprintf(\"System error calling external data provider for vulnerability report verification: %s\", [err])\r\n        }\r\n\r\n        # Check if there are errors for any of the images\r\n        general_violation[{\"result\": result}] {\r\n          count(remote_data.errors) &gt; 0\r\n          result := sprintf(\"Error validating one or more images for vulnerability report verification: %s\", remote_data.errors)\r\n        }\r\n\r\n        # Check if the success criteria is true\r\n        general_violation[{\"result\": result}] {\r\n          subject_validation := remote_data.responses[_]\r\n          subject_result := subject_validation[1]\r\n          not process_vuln_reports(subject_result)\r\n          result := sprintf(\"Subject failed vulnerability report verification: %s\", [subject_validation[0]])\r\n        }\r\n\r\n        process_vuln_reports(subject_result) if {\r\n          # collect verifier reports from vulnerabilityreport verifier\r\n          vuln_results := [res | subject_result.verifierReports[i].type == \"vulnerabilityreport\"; res := subject_result.verifierReports[i]]\r\n          count(vuln_results) &gt; 0\r\n          # calculate the timestamp between current time and creation time\r\n          timestamp_diff_results_map := {diff_in_ns: i | diff_in_ns := time.now_ns() - time.parse_rfc3339_ns(vuln_results[i].extensions[\"createdAt\"])}\r\n          count(timestamp_diff_results_map) &gt; 0\r\n          # extract time difference durations into separate array to find global minimum\r\n          timestamp_diff_results_arr := [key | timestamp_diff_results_map[key]]\r\n          smallest_timestamp_diff := min(timestamp_diff_results_arr)\r\n          # validate latest report\r\n          process_vuln_report(vuln_results[timestamp_diff_results_map[smallest_timestamp_diff]])\r\n        }\r\n\r\n        process_vuln_report(report) if {\r\n          report.isSuccess == true\r\n          valid_signatures(report)\r\n        }\r\n\r\n        valid_signatures(_) := true {\r\n          require_signature == false\r\n        }\r\n\r\n        valid_signatures(report) := true {\r\n          require_signature\r\n          count(report.nestedResults) &gt; 0\r\n          some nestedResult in report.nestedResults\r\n          nestedResult.artifactType == \"application\/vnd.cncf.notary.signature\"\r\n          nestedResult.isSuccess\r\n        }<\/code><\/pre>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>Bu noktada,<em> Gatekeeper<\/em>, <em>Ratify<\/em> &#8216;\u0131 external data noktas\u0131 olarak kullanarak, ilgili <em>Vulnerability Report<\/em> do\u011frulay\u0131c\u0131s\u0131n\u0131n sonu\u00e7lar\u0131na elde ediyor ve i\u00e7erisinde g\u00fcncel bir g\u00fcvenlik rapor oldu\u011fundan emin oluyor. Ayr\u0131ca opsiyonel olarak ilgili artifact&#8217;in imzas\u0131n\u0131n do\u011frulanmas\u0131n\u0131 da ger\u00e7ekle\u015ftiriyor.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>Bu makalenin ilk k\u0131sm\u0131ndan hat\u0131rlayacak olursak \u00f6rnek olarak kulland\u0131\u011f\u0131m\u0131z <em>Order API<\/em> &#8216;\u0131n toplam <em>70<\/em> adet farkl\u0131 <em>CVE<\/em> &#8216;si bulunmaktayd\u0131.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"\/wp-content\/uploads\/2024\/06\/vulnerability-report-2-scaled.jpg\"><img decoding=\"async\" width=\"1024\" height=\"557\" class=\"wp-image-4633 lazyload\" style=\"--smush-placeholder-width: 1024px; --smush-placeholder-aspect-ratio: 1024\/557;width: 645px; height: auto;\" data-src=\"\/wp-content\/uploads\/2024\/06\/vulnerability-report-2-1024x557.jpg\" alt=\"\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2024\/06\/vulnerability-report-2-1024x557.jpg 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2024\/06\/vulnerability-report-2-300x163.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2024\/06\/vulnerability-report-2-768x418.jpg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2024\/06\/vulnerability-report-2-1536x835.jpg 1536w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2024\/06\/vulnerability-report-2-2048x1114.jpg 2048w\" data-sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" \/><\/a><\/figure>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>Pipeline, bekledi\u011fimiz gibi ba\u015far\u0131s\u0131z bir \u015fekilde ger\u00e7ekle\u015fti ve &#8220;<em>verifierReports<\/em>&#8221; array&#8217;i i\u00e7erisine bakt\u0131\u011f\u0131m\u0131zda ise, <em>SBOM<\/em> ile ilgili olu\u015fturmu\u015f oldu\u011fumuz politikay\u0131 de\u011fi\u015ftirmedi\u011fimiz i\u00e7in do\u011frulaman\u0131n yine &#8220;<em>EasyNetQ<\/em>&#8221; paketi nedeniyle ba\u015far\u0131s\u0131z oldu\u011funu g\u00f6r\u00fcyoruz. Buna ek olarak, bu sefer Vulnerability Report do\u011frulay\u0131c\u0131s\u0131n\u0131n da <em>Order API<\/em> container image&#8217;inin &#8220;<em>HIGH<\/em>&#8221; ve &#8220;<em>CRITICAL<\/em>&#8221; seviyelerde g\u00fcvenlik ihlalleri bulundurmas\u0131 sebebiyle ba\u015far\u0131s\u0131z ger\u00e7ekle\u015fti\u011fini g\u00f6rebiliriz.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<h1 class=\"wp-block-heading\">Toparlayal\u0131m<\/h1>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>Makalenin bu ikinci b\u00f6l\u00fcm\u00fcnde, <em>kubernetes<\/em> ortam\u0131nda <em>OPA Gatekeeper<\/em> ve <em>Ratify<\/em> kullanarak \u00e7e\u015fitli g\u00fcvenlik ve denetim politikalar\u0131n\u0131 declarative bir \u015fekilde nas\u0131l konfig\u00fcre edebilece\u011fimizi ve software supply chain g\u00fcvenli\u011fini art\u0131rmak i\u00e7in containerized uygulamalar\u0131n da\u011f\u0131t\u0131m i\u015flemleri s\u0131ras\u0131nda bu politikalar\u0131 otomatikle\u015ftirilmi\u015f kararlarla nas\u0131l zorunlu k\u0131labilece\u011fimize bir g\u00f6z att\u0131k.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p><em>Gatekeeper<\/em> &#8216;\u0131n, <em>Rego<\/em> dili ile \u00e7e\u015fitli politikalar\u0131 declarative bir \u015fekilde nas\u0131l tan\u0131mlayabilmemize olanak sa\u011flad\u0131\u011f\u0131na ve <em>Ratify<\/em> &#8216;\u0131n ise container security supply chain alan\u0131nda external bir data provider olarak bu s\u00fcre\u00e7leri nas\u0131l destekleyebilece\u011fine de\u011findik.<\/p>\r\n<p><\/p>\r\n<p><\/p>\r\n<p>\u00d6zetle, software supply chain g\u00fcvenli\u011finin sa\u011flanmas\u0131 ad\u0131na otomatikle\u015ftirilmi\u015f kararlar da dahil olmak t\u00fcm bu ad\u0131mlar\u0131n uygulanmas\u0131n\u0131n ve bunlar\u0131 <em>SDLC<\/em> s\u00fcre\u00e7lerine dahil etmenin \u00f6nemini g\u00f6rd\u00fck. Bu, organizasyonlar\u0131n kar\u015f\u0131la\u015fabilece\u011fi potansiyel g\u00fcvenlik risklerini en aza indirilebilmesine yard\u0131mc\u0131 olmakla beraber, g\u00fcvenilir bir yaz\u0131l\u0131m geli\u015ftirme ortam\u0131 olu\u015fturulmas\u0131na katk\u0131da bulunmaktad\u0131r.<\/p>\r\n<h1>Referanslar<\/h1>\r\n<blockquote>\r\n<p><em>https:\/\/ratify.dev\/docs\/what-is-ratify<\/em><br \/><em>https:\/\/kubernetes.io\/blog\/2019\/08\/06\/opa-gatekeeper-policy-and-governance-for-kubernetes\/<\/em><br \/><em>https:\/\/open-policy-agent.github.io\/gatekeeper\/website\/docs\/howto\/<\/em><\/p>\r\n<\/blockquote>\r\n<p><\/p>","protected":false},"excerpt":{"rendered":"<p>Makalenin ilk b\u00f6l\u00fcm\u00fcnde, Software Supply Chain g\u00fcvenli\u011finin \u00f6neminden ve containerized uygulamalar\u0131n g\u00fcvenlik risklerini azaltabilmek i\u00e7in SDLC s\u00fcre\u00e7leri boyunca al\u0131nabilecek \u00f6nlemlerden bahsetmi\u015ftik. Bu kapsamda,\u00a0shifting-left yakla\u015f\u0131m\u0131n\u0131n \u00f6neminden, yani \u00e7e\u015fitli g\u00fcvenlik unsurlar\u0131n\u0131n m\u00fcmk\u00fcn oldu\u011funca SDLC s\u00fcre\u00e7lerinin erken a\u015famalar\u0131na entegre edilmesinin faydalar\u0131ndan ve software supply chain i\u00e7erisinde g\u00fcvenilirlik, b\u00fct\u00fcnl\u00fck&#8230;<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/gokhan-gokalp.com\/tr\/securing-the-supply-chain-of-containerized-applications-to-reduce-security-risks-policy-enforcement-automated-governance-with-opa-gatekeeper-and-ratify-part-2\/\">Devam\u0131n\u0131 okuyun<span class=\"screen-reader-text\">Containerized Uygulamalar\u0131n Supply Chain\u2019ini G\u00fcvence Alt\u0131na Alarak G\u00fcvenlik Risklerini Azaltma (OPA Gatekeeper ve Ratify ile Otomatikle\u015ftirilmi\u015f Politika Uygulanmas\u0131) &#8211; B\u00f6l\u00fcm 2<\/span><\/a><\/div>\n","protected":false},"author":1,"featured_media":4650,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[418,375,680,434,368],"tags":[710,704,702,700,582,711,696,699,708,709,705,688,706,701,689,681,698,707,697,684,703],"class_list":["post-4553","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-azure","category-ci-continuous-integration","category-cloud","category-containerizing","category-microservices","tag-attestation","tag-automated-governance","tag-azure-pipelines","tag-cicd","tag-container-security","tag-containers","tag-gatekeeper","tag-guvenlik","tag-notary","tag-notation","tag-oci","tag-opa","tag-oras","tag-policy-as-code","tag-ratify","tag-sbom","tag-security","tag-signing-container-images","tag-software-supply-chain","tag-vulnerability-scan","tag-yaml-pipelines","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"tr","enabled_languages":["en","tr"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"tr":{"title":true,"content":true,"excerpt":false}}},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Containerized Uygulamalar\u0131n Supply Chain\u2019ini G\u00fcvence Alt\u0131na Alarak G\u00fcvenlik Risklerini Azaltma (OPA Gatekeeper ve Ratify ile Otomatikle\u015ftirilmi\u015f Politika Uygulanmas\u0131) - B\u00f6l\u00fcm 2 - G\u00f6khan G\u00f6kalp<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/gokhan-gokalp.com\/securing-the-supply-chain-of-containerized-applications-to-reduce-security-risks-policy-enforcement-automated-governance-with-opa-gatekeeper-and-ratify-part-2\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Containerized Uygulamalar\u0131n Supply Chain\u2019ini G\u00fcvence Alt\u0131na Alarak G\u00fcvenlik Risklerini Azaltma (OPA Gatekeeper ve Ratify ile Otomatikle\u015ftirilmi\u015f Politika Uygulanmas\u0131) - B\u00f6l\u00fcm 2 - G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"og:url\" content=\"https:\/\/gokhan-gokalp.com\/securing-the-supply-chain-of-containerized-applications-to-reduce-security-risks-policy-enforcement-automated-governance-with-opa-gatekeeper-and-ratify-part-2\/\" \/>\n<meta property=\"og:site_name\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"article:published_time\" content=\"2024-06-06T19:44:32+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-06-06T20:20:38+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2024\/06\/gokhan-gokalp-automated-governance.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"675\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"35 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/securing-the-supply-chain-of-containerized-applications-to-reduce-security-risks-policy-enforcement-automated-governance-with-opa-gatekeeper-and-ratify-part-2\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/securing-the-supply-chain-of-containerized-applications-to-reduce-security-risks-policy-enforcement-automated-governance-with-opa-gatekeeper-and-ratify-part-2\\\/\"},\"author\":{\"name\":\"G\u00f6khan G\u00f6kalp\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"headline\":\"Containerized Uygulamalar\u0131n Supply Chain\u2019ini G\u00fcvence Alt\u0131na Alarak G\u00fcvenlik Risklerini Azaltma (OPA Gatekeeper ve Ratify ile Otomatikle\u015ftirilmi\u015f Politika Uygulanmas\u0131) &#8211; B\u00f6l\u00fcm 2\",\"datePublished\":\"2024-06-06T19:44:32+00:00\",\"dateModified\":\"2024-06-06T20:20:38+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/securing-the-supply-chain-of-containerized-applications-to-reduce-security-risks-policy-enforcement-automated-governance-with-opa-gatekeeper-and-ratify-part-2\\\/\"},\"wordCount\":4939,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"image\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/securing-the-supply-chain-of-containerized-applications-to-reduce-security-risks-policy-enforcement-automated-governance-with-opa-gatekeeper-and-ratify-part-2\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2024\\\/06\\\/gokhan-gokalp-automated-governance.jpg\",\"keywords\":[\"Attestation\",\"Automated Governance\",\"Azure Pipelines\",\"CICD\",\"container security\",\"Containers\",\"Gatekeeper\",\"G\u00fcvenlik\",\"Notary\",\"Notation\",\"OCI\",\"OPA\",\"Oras\",\"Policy as Code\",\"Ratify\",\"SBOM\",\"Security\",\"Signing Container Images\",\"Software Supply Chain\",\"vulnerability scan\",\"YAML pipelines\"],\"articleSection\":[\"Azure\",\"CI (Continuous Integration)\",\"Cloud\",\"Containerizing\",\"Microservices\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/securing-the-supply-chain-of-containerized-applications-to-reduce-security-risks-policy-enforcement-automated-governance-with-opa-gatekeeper-and-ratify-part-2\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/securing-the-supply-chain-of-containerized-applications-to-reduce-security-risks-policy-enforcement-automated-governance-with-opa-gatekeeper-and-ratify-part-2\\\/\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/securing-the-supply-chain-of-containerized-applications-to-reduce-security-risks-policy-enforcement-automated-governance-with-opa-gatekeeper-and-ratify-part-2\\\/\",\"name\":\"Containerized Uygulamalar\u0131n Supply Chain\u2019ini G\u00fcvence Alt\u0131na Alarak G\u00fcvenlik Risklerini Azaltma (OPA Gatekeeper ve Ratify ile Otomatikle\u015ftirilmi\u015f Politika Uygulanmas\u0131) - B\u00f6l\u00fcm 2 - G\u00f6khan G\u00f6kalp\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/securing-the-supply-chain-of-containerized-applications-to-reduce-security-risks-policy-enforcement-automated-governance-with-opa-gatekeeper-and-ratify-part-2\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/securing-the-supply-chain-of-containerized-applications-to-reduce-security-risks-policy-enforcement-automated-governance-with-opa-gatekeeper-and-ratify-part-2\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2024\\\/06\\\/gokhan-gokalp-automated-governance.jpg\",\"datePublished\":\"2024-06-06T19:44:32+00:00\",\"dateModified\":\"2024-06-06T20:20:38+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/securing-the-supply-chain-of-containerized-applications-to-reduce-security-risks-policy-enforcement-automated-governance-with-opa-gatekeeper-and-ratify-part-2\\\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/securing-the-supply-chain-of-containerized-applications-to-reduce-security-risks-policy-enforcement-automated-governance-with-opa-gatekeeper-and-ratify-part-2\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/securing-the-supply-chain-of-containerized-applications-to-reduce-security-risks-policy-enforcement-automated-governance-with-opa-gatekeeper-and-ratify-part-2\\\/#primaryimage\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2024\\\/06\\\/gokhan-gokalp-automated-governance.jpg\",\"contentUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2024\\\/06\\\/gokhan-gokalp-automated-governance.jpg\",\"width\":1200,\"height\":675},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/securing-the-supply-chain-of-containerized-applications-to-reduce-security-risks-policy-enforcement-automated-governance-with-opa-gatekeeper-and-ratify-part-2\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Securing the Supply Chain of Containerized Applications to Reduce Security Risks (Policy Enforcement-Automated Governance with OPA Gatekeeper and Ratify) &#8211; Part 2\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\",\"name\":\"G\u00f6khan G\u00f6kalp\",\"description\":\"C# &amp; Python lover\",\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/gokhan-gokalp.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\",\"name\":\"G\u00f6khan G\u00f6kalp\",\"pronouns\":\"he\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"contentUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"caption\":\"G\u00f6khan G\u00f6kalp\"},\"logo\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\"},\"sameAs\":[\"https:\\\/\\\/gokhan-gokalp.com\"],\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/tr\\\/author\\\/gok-gokalp\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Containerized Uygulamalar\u0131n Supply Chain\u2019ini G\u00fcvence Alt\u0131na Alarak G\u00fcvenlik Risklerini Azaltma (OPA Gatekeeper ve Ratify ile Otomatikle\u015ftirilmi\u015f Politika Uygulanmas\u0131) - B\u00f6l\u00fcm 2 - G\u00f6khan G\u00f6kalp","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/gokhan-gokalp.com\/securing-the-supply-chain-of-containerized-applications-to-reduce-security-risks-policy-enforcement-automated-governance-with-opa-gatekeeper-and-ratify-part-2\/","og_locale":"tr_TR","og_type":"article","og_title":"Containerized Uygulamalar\u0131n Supply Chain\u2019ini G\u00fcvence Alt\u0131na Alarak G\u00fcvenlik Risklerini Azaltma (OPA Gatekeeper ve Ratify ile Otomatikle\u015ftirilmi\u015f Politika Uygulanmas\u0131) - B\u00f6l\u00fcm 2 - G\u00f6khan G\u00f6kalp","og_url":"https:\/\/gokhan-gokalp.com\/securing-the-supply-chain-of-containerized-applications-to-reduce-security-risks-policy-enforcement-automated-governance-with-opa-gatekeeper-and-ratify-part-2\/","og_site_name":"G\u00f6khan G\u00f6kalp","article_published_time":"2024-06-06T19:44:32+00:00","article_modified_time":"2024-06-06T20:20:38+00:00","og_image":[{"width":1200,"height":675,"url":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2024\/06\/gokhan-gokalp-automated-governance.jpg","type":"image\/jpeg"}],"author":"G\u00f6khan G\u00f6kalp","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"G\u00f6khan G\u00f6kalp","Tahmini okuma s\u00fcresi":"35 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/gokhan-gokalp.com\/securing-the-supply-chain-of-containerized-applications-to-reduce-security-risks-policy-enforcement-automated-governance-with-opa-gatekeeper-and-ratify-part-2\/#article","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/securing-the-supply-chain-of-containerized-applications-to-reduce-security-risks-policy-enforcement-automated-governance-with-opa-gatekeeper-and-ratify-part-2\/"},"author":{"name":"G\u00f6khan G\u00f6kalp","@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"headline":"Containerized Uygulamalar\u0131n Supply Chain\u2019ini G\u00fcvence Alt\u0131na Alarak G\u00fcvenlik Risklerini Azaltma (OPA Gatekeeper ve Ratify ile Otomatikle\u015ftirilmi\u015f Politika Uygulanmas\u0131) &#8211; B\u00f6l\u00fcm 2","datePublished":"2024-06-06T19:44:32+00:00","dateModified":"2024-06-06T20:20:38+00:00","mainEntityOfPage":{"@id":"https:\/\/gokhan-gokalp.com\/securing-the-supply-chain-of-containerized-applications-to-reduce-security-risks-policy-enforcement-automated-governance-with-opa-gatekeeper-and-ratify-part-2\/"},"wordCount":4939,"commentCount":1,"publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"image":{"@id":"https:\/\/gokhan-gokalp.com\/securing-the-supply-chain-of-containerized-applications-to-reduce-security-risks-policy-enforcement-automated-governance-with-opa-gatekeeper-and-ratify-part-2\/#primaryimage"},"thumbnailUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2024\/06\/gokhan-gokalp-automated-governance.jpg","keywords":["Attestation","Automated Governance","Azure Pipelines","CICD","container security","Containers","Gatekeeper","G\u00fcvenlik","Notary","Notation","OCI","OPA","Oras","Policy as Code","Ratify","SBOM","Security","Signing Container Images","Software Supply Chain","vulnerability scan","YAML pipelines"],"articleSection":["Azure","CI (Continuous Integration)","Cloud","Containerizing","Microservices"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/gokhan-gokalp.com\/securing-the-supply-chain-of-containerized-applications-to-reduce-security-risks-policy-enforcement-automated-governance-with-opa-gatekeeper-and-ratify-part-2\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/gokhan-gokalp.com\/securing-the-supply-chain-of-containerized-applications-to-reduce-security-risks-policy-enforcement-automated-governance-with-opa-gatekeeper-and-ratify-part-2\/","url":"https:\/\/gokhan-gokalp.com\/securing-the-supply-chain-of-containerized-applications-to-reduce-security-risks-policy-enforcement-automated-governance-with-opa-gatekeeper-and-ratify-part-2\/","name":"Containerized Uygulamalar\u0131n Supply Chain\u2019ini G\u00fcvence Alt\u0131na Alarak G\u00fcvenlik Risklerini Azaltma (OPA Gatekeeper ve Ratify ile Otomatikle\u015ftirilmi\u015f Politika Uygulanmas\u0131) - B\u00f6l\u00fcm 2 - G\u00f6khan G\u00f6kalp","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/gokhan-gokalp.com\/securing-the-supply-chain-of-containerized-applications-to-reduce-security-risks-policy-enforcement-automated-governance-with-opa-gatekeeper-and-ratify-part-2\/#primaryimage"},"image":{"@id":"https:\/\/gokhan-gokalp.com\/securing-the-supply-chain-of-containerized-applications-to-reduce-security-risks-policy-enforcement-automated-governance-with-opa-gatekeeper-and-ratify-part-2\/#primaryimage"},"thumbnailUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2024\/06\/gokhan-gokalp-automated-governance.jpg","datePublished":"2024-06-06T19:44:32+00:00","dateModified":"2024-06-06T20:20:38+00:00","breadcrumb":{"@id":"https:\/\/gokhan-gokalp.com\/securing-the-supply-chain-of-containerized-applications-to-reduce-security-risks-policy-enforcement-automated-governance-with-opa-gatekeeper-and-ratify-part-2\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/gokhan-gokalp.com\/securing-the-supply-chain-of-containerized-applications-to-reduce-security-risks-policy-enforcement-automated-governance-with-opa-gatekeeper-and-ratify-part-2\/"]}]},{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/gokhan-gokalp.com\/securing-the-supply-chain-of-containerized-applications-to-reduce-security-risks-policy-enforcement-automated-governance-with-opa-gatekeeper-and-ratify-part-2\/#primaryimage","url":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2024\/06\/gokhan-gokalp-automated-governance.jpg","contentUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2024\/06\/gokhan-gokalp-automated-governance.jpg","width":1200,"height":675},{"@type":"BreadcrumbList","@id":"https:\/\/gokhan-gokalp.com\/securing-the-supply-chain-of-containerized-applications-to-reduce-security-risks-policy-enforcement-automated-governance-with-opa-gatekeeper-and-ratify-part-2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/gokhan-gokalp.com\/"},{"@type":"ListItem","position":2,"name":"Securing the Supply Chain of Containerized Applications to Reduce Security Risks (Policy Enforcement-Automated Governance with OPA Gatekeeper and Ratify) &#8211; Part 2"}]},{"@type":"WebSite","@id":"https:\/\/gokhan-gokalp.com\/#website","url":"https:\/\/gokhan-gokalp.com\/","name":"G\u00f6khan G\u00f6kalp","description":"C# &amp; Python lover","publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/gokhan-gokalp.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe","name":"G\u00f6khan G\u00f6kalp","pronouns":"he","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","url":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","contentUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","caption":"G\u00f6khan G\u00f6kalp"},"logo":{"@id":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659"},"sameAs":["https:\/\/gokhan-gokalp.com"],"url":"https:\/\/gokhan-gokalp.com\/tr\/author\/gok-gokalp\/"}]}},"_links":{"self":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/4553","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/comments?post=4553"}],"version-history":[{"count":90,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/4553\/revisions"}],"predecessor-version":[{"id":4657,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/4553\/revisions\/4657"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/media\/4650"}],"wp:attachment":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/media?parent=4553"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/categories?post=4553"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/tags?post=4553"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}