16 KiB
Az - Container Registry
{{#include ../../../../banners/hacktricks-training.md}}
Basic Information
Azure Container Registry (ACR) एक सुरक्षित, निजी रजिस्ट्री है जो आपको Azure क्लाउड में कंटेनर इमेज को स्टोर, प्रबंधित और एक्सेस करने की अनुमति देती है। यह कई Azure सेवाओं के साथ सहजता से एकीकृत होती है, जो बड़े पैमाने पर स्वचालित निर्माण और तैनाती कार्यप्रवाह प्रदान करती है। भू-प्रतिकृति और भेद्यता स्कैनिंग जैसी सुविधाओं के साथ, ACR कंटेनराइज्ड अनुप्रयोगों के लिए उद्यम-ग्रेड सुरक्षा और अनुपालन सुनिश्चित करने में मदद करता है।
Permissions
ये हैं विभिन्न अनुमतियाँ according to the docs जो एक 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 <acrName> --admin-enabled trueके साथ सक्षम कर सकते हैं। ध्यान दें कि उपयोगकर्ता नाम आमतौर पर रजिस्ट्री का नाम होता है (औरadminनहीं)। - एक टोकन के साथ: रजिस्ट्री तक पहुंच के लिए एक विशिष्ट
scope map(अनुमतियाँ) के साथ एक टोकन बनाना संभव है। फिर, इस टोकन नाम का उपयोग उपयोगकर्ता नाम के रूप में और रजिस्ट्री में प्रमाणित होने के लिए कुछ उत्पन्न पासवर्ड का उपयोग करना संभव हैdocker login -u <registry-name> -p <password> aregistry-url> - एक सेवा प्रमुख के साथ: एक सेवा प्रमुख बनाना और इमेज खींचने के लिए
AcrPullजैसी भूमिका सौंपना संभव है। फिर, यह SP appId को उपयोगकर्ता नाम के रूप में और एक उत्पन्न गुप्त को पासवर्ड के रूप में उपयोग करके रजिस्ट्री में लॉगिन करना संभव होगा।
रजिस्ट्री पर पहुंच के लिए SP उत्पन्न करने के लिए docs से उदाहरण स्क्रिप्ट:
#!/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 का प्रारूप <registry-name>.azurecr.io है और एक निजी endpoint का प्रारूप <registry-name>.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 का उपयोग करना है:
# 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 में केवल छोटे अक्षर ही उपयोग करने चाहिए।
# 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 <registry-name>
# List tokens of a registry
az acr token list --registry <registry-name> --resource-group <res-group>
# List repositories in a registry
az acr repository list --name <registry-name> --resource-group <res-group>
# List the tags of a repository
az acr repository show-tags --repository <repository-name> --name <registry-name> --resource-group <res-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 <registry-name>
# List tasks
## Check the git URL or the command
az acr task list --registry <registry-name>
# List tasks runs
az acr task list-runs --registry <registry-name>
# List connected registries
az acr connected-registry list --registry <registry-name>
# List cache
az acr cache list --registry <registry-name>
# Get cache details
az acr cache show --name <cache-name> --registry <registry-name>
विशेषाधिकार वृद्धि और पोस्ट एक्सप्लॉइटेशन
{{#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-roles?tabs=azure-cli#access-resource-manager
{{#include ../../../../banners/hacktricks-training.md}}
