# Az - Container Registry {{#include ../../../../banners/hacktricks-training.md}} ## Basic Information Azure Container Registry (ACR) एक सुरक्षित, निजी रजिस्ट्री है जो आपको **Azure क्लाउड में कंटेनर इमेज को स्टोर, प्रबंधित और एक्सेस करने** की अनुमति देती है। यह कई Azure सेवाओं के साथ सहजता से एकीकृत होती है, जो बड़े पैमाने पर स्वचालित निर्माण और तैनाती कार्यप्रवाह प्रदान करती है। भू-प्रतिकृति और भेद्यता स्कैनिंग जैसी सुविधाओं के साथ, ACR कंटेनराइज्ड अनुप्रयोगों के लिए उद्यम-ग्रेड सुरक्षा और अनुपालन सुनिश्चित करने में मदद करता है। ### Permissions ये हैं **विभिन्न अनुमतियाँ** [according to the docs](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-roles?tabs=azure-cli#access-resource-manager) जो एक Container Registry पर दी जा सकती हैं: - Access Resource Manager - Create/delete registry - Push image - Pull image - Delete image data - Change policies - Sign images कुछ **बिल्ट-इन भूमिकाएँ** भी हैं जिन्हें सौंपा जा सकता है, और **कस्टम भूमिकाएँ** बनाना भी संभव है। ![]() ### Authentication > [!WARNING] > यह बहुत महत्वपूर्ण है कि भले ही रजिस्ट्री नाम में कुछ बड़े अक्षर हों, आपको हमेशा **छोटे अक्षरों** का उपयोग करके लॉगिन, इमेज पुश और पुल करना चाहिए। ACR में प्रमाणित होने के 4 तरीके हैं: - **Entra ID के साथ**: यह ACR में प्रमाणित होने का **डिफ़ॉल्ट** तरीका है। यह ACR में प्रमाणित होने के लिए **`az acr login`** कमांड का उपयोग करता है। यह कमांड **`~/.docker/config.json`** फ़ाइल में **क्रेडेंशियल्स** को **स्टोर** करेगा। इसके अलावा, यदि आप इस कमांड को ऐसे वातावरण से चला रहे हैं जिसमें डॉकर सॉकेट तक पहुंच नहीं है जैसे कि **क्लाउड शेल** में, तो ACR में प्रमाणित होने के लिए **`--expose-token`** ध्वज का उपयोग करके **टोकन** प्राप्त करना संभव है। फिर प्रमाणित होने के लिए आपको उपयोगकर्ता नाम के रूप में `00000000-0000-0000-0000-000000000000` का उपयोग करना होगा जैसे: `docker login myregistry.azurecr.io --username 00000000-0000-0000-0000-000000000000 --password-stdin <<< $TOKEN` - **एक प्रशासनिक खाते के साथ**: प्रशासनिक उपयोगकर्ता डिफ़ॉल्ट रूप से अक्षम होता है लेकिन इसे सक्षम किया जा सकता है और फिर रजिस्ट्री तक पहुंच प्राप्त करना संभव होगा प्रशासनिक खाते के **उपयोगकर्ता नाम** और **पासवर्ड** के साथ जिसमें रजिस्ट्री के लिए पूर्ण अनुमतियाँ होती हैं। यह अभी भी समर्थित है क्योंकि कुछ Azure सेवाएँ इसका उपयोग करती हैं। ध्यान दें कि इस उपयोगकर्ता के लिए **2 पासवर्ड** बनाए जाते हैं और दोनों मान्य होते हैं। आप इसे `az acr update -n --admin-enabled true` के साथ सक्षम कर सकते हैं। ध्यान दें कि उपयोगकर्ता नाम आमतौर पर रजिस्ट्री का नाम होता है (और `admin` नहीं)। - **एक टोकन के साथ**: रजिस्ट्री तक पहुंच के लिए एक **विशिष्ट `scope map`** (अनुमतियाँ) के साथ एक **टोकन** बनाना संभव है। फिर, इस टोकन नाम का उपयोग उपयोगकर्ता नाम के रूप में और रजिस्ट्री में प्रमाणित होने के लिए कुछ उत्पन्न पासवर्ड का उपयोग करना संभव है `docker login -u -p aregistry-url>` - **एक सेवा प्रमुख के साथ**: एक **सेवा प्रमुख** बनाना और इमेज खींचने के लिए **`AcrPull`** जैसी भूमिका सौंपना संभव है। फिर, यह SP appId को उपयोगकर्ता नाम के रूप में और एक उत्पन्न गुप्त को पासवर्ड के रूप में उपयोग करके **रजिस्ट्री में लॉगिन** करना संभव होगा। रजिस्ट्री पर पहुंच के लिए SP उत्पन्न करने के लिए [docs](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-auth-service-principal) से उदाहरण स्क्रिप्ट: ```bash #!/bin/bash ACR_NAME=$containerRegistry SERVICE_PRINCIPAL_NAME=$servicePrincipal # Obtain the full registry ID ACR_REGISTRY_ID=$(az acr show --name $ACR_NAME --query "id" --output tsv) PASSWORD=$(az ad sp create-for-rbac --name $SERVICE_PRINCIPAL_NAME --scopes $ACR_REGISTRY_ID --role acrpull --query "password" --output tsv) USER_NAME=$(az ad sp list --display-name $SERVICE_PRINCIPAL_NAME --query "[].appId" --output tsv) echo "Service principal ID: $USER_NAME" echo "Service principal password: $PASSWORD" ``` ### Encryption केवल **Premium SKU** **encryption at rest** के लिए **images** और अन्य artifacts का समर्थन करता है। ### Networking केवल **Premium SKU** **private endpoints** का समर्थन करता है। अन्य केवल **public access** का समर्थन करते हैं। एक सार्वजनिक endpoint का प्रारूप `.azurecr.io` है और एक निजी endpoint का प्रारूप `.privatelink.azurecr.io` है। इस कारण से, registry का नाम Azure में सभी के बीच अद्वितीय होना चाहिए। ### Microsoft Defender for Cloud यह आपको registry में **images** को **vulnerabilities** के लिए **scan** करने की अनुमति देता है। ### Soft-delete **soft-delete** सुविधा आपको निर्दिष्ट संख्या के दिनों के भीतर **deleted registry** को **recover** करने की अनुमति देती है। यह सुविधा **disabled by default** है। ### Webhooks यह registry के अंदर **webhooks** **create** करना संभव है। इस webhook में उस URL को निर्दिष्ट करना आवश्यक है जहाँ एक **request भेजी जाएगी जब भी एक push या delete action किया जाता है**। इसके अलावा, Webhooks एक scope को इंगित कर सकते हैं ताकि उन repositories (images) को इंगित किया जा सके जो प्रभावित होंगी। उदाहरण के लिए, 'foo:*' का अर्थ है repository 'foo' के तहत घटनाएँ। एक हमलावर के दृष्टिकोण से, registry में किसी भी कार्रवाई करने से पहले इसे जांचना दिलचस्प है, और यदि आवश्यक हो तो इसे अस्थायी रूप से हटा देना चाहिए, ताकि पता न चले। ### Connected registries यह मूल रूप से एक registry से दूसरी registry में **images** को **mirror** करने की अनुमति देता है, जो आमतौर पर ऑन-प्रिमाइसेस स्थित होती है। इसके 2 मोड हैं: **ReadOnly** और **ReadWrite**। पहले में, images केवल **pulled** की जाती हैं स्रोत registry से, और दूसरे में, images को स्रोत registry में भी **pushed** किया जा सकता है। Azure से registry तक पहुँचने के लिए, एक **token** उत्पन्न होता है जब connected registry का उपयोग किया जाता है। ### Runs & Tasks Runs & Tasks Azure में container से संबंधित क्रियाएँ निष्पादित करने की अनुमति देता है जो आपको आमतौर पर स्थानीय रूप से या CI/CD pipeline में करने की आवश्यकता होती है। उदाहरण के लिए, आप registry में **build, push, और run images** कर सकते हैं। एक container को build और run करने का सबसे आसान तरीका एक नियमित Run का उपयोग करना है: ```bash # Build echo "FROM mcr.microsoft.com/hello-world" > Dockerfile az acr build --image sample/hello-world:v1 --registry mycontainerregistry008 --file Dockerfile . # Run az acr run --registry mycontainerregistry008 --cmd '$Registry/sample/hello-world:v1' /dev/null ``` हालांकि, यह ऐसे रन को ट्रिगर करेगा जो हमलावर के दृष्टिकोण से बहुत दिलचस्प नहीं हैं क्योंकि उनके साथ कोई प्रबंधित पहचान संलग्न नहीं है। हालांकि, **tasks** के साथ **system और user managed identity** संलग्न हो सकते हैं। ये tasks वे हैं जो कंटेनर में **privileges को बढ़ाने** के लिए उपयोगी हैं। प्रिविलेज़ एस्कलेशन सेक्शन में यह देखना संभव है कि प्रिविलेज़ को बढ़ाने के लिए tasks का उपयोग कैसे किया जाए। ### Cache कैश फीचर **एक बाहरी रिपॉजिटरी से इमेज डाउनलोड करने** और नए संस्करणों को रजिस्ट्री में स्टोर करने की अनुमति देता है। इसके लिए Azure Vault से क्रेडेंशियल्स का चयन करके कुछ **credentials configured** होना आवश्यक है। यह हमलावर के दृष्टिकोण से बहुत दिलचस्प है क्योंकि यह **एक बाहरी प्लेटफॉर्म पर पिवट करने** की अनुमति देता है यदि हमलावर के पास क्रेडेंशियल्स तक पहुंचने के लिए पर्याप्त अनुमतियाँ हैं, **एक बाहरी रिपॉजिटरी से इमेज डाउनलोड करने** और कैश को कॉन्फ़िगर करना **persistency mechanism** के रूप में भी उपयोग किया जा सकता है। ## Enumeration > [!WARNING] > यह बहुत महत्वपूर्ण है कि भले ही रजिस्ट्री नाम में कुछ बड़े अक्षर हों, आपको इसे एक्सेस करने के लिए URL में केवल छोटे अक्षर ही उपयोग करने चाहिए। ```bash # List of all the registries # Check the network, managed identities, adminUserEnabled, softDeletePolicy, url... az acr list # Get the details of a registry az acr show --name # List tokens of a registry az acr token list --registry --resource-group # List repositories in a registry az acr repository list --name --resource-group # List the tags of a repository az acr repository show-tags --repository --name --resource-group # List deleted repository tags ## At the time of this writing there isn't yet any command to restore it az acr repository list-deleted --name # List tasks ## Check the git URL or the command az acr task list --registry # List tasks runs az acr task list-runs --registry # List connected registries az acr connected-registry list --registry # List cache az acr cache list --registry # Get cache details az acr cache show --name --registry ``` ## विशेषाधिकार वृद्धि और पोस्ट एक्सप्लॉइटेशन {{#ref}} ../az-privilege-escalation/az-automation-accounts-privesc.md {{#endref}} ## संदर्भ - [https://learn.microsoft.com/en-us/azure/container-registry/container-registry-authentication?tabs=azure-cli](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-authentication?tabs=azure-cli) - [https://learn.microsoft.com/en-us/azure/container-registry/container-registry-roles?tabs=azure-cli#access-resource-manager](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-roles?tabs=azure-cli#access-resource-manager) {{#include ../../../../banners/hacktricks-training.md}}