
कंटेनर और बाइनरी के लिए कोड हस्ताक्षर और पारदर्शिता
Sigstore का उपयोग करके OCI कंटेनरों (और अन्य आर्टिफैक्ट) पर हस्ताक्षर करना!
Cosign का उद्देश्य हस्ताक्षरों को अदृश्य बुनियादी ढांचा बनाना है।
Cosign समर्थन करता है:
Cosign को sigstore परियोजना के भाग के रूप में विकसित किया गया है।
हम एक स्लैक चैनल का भी उपयोग करते हैं!
आमंत्रण लिंक के लिए यहाँ क्लिक करें।
Homebrew, Arch, Nix, GitHub Action और Kubernetes स्थापनाओं के लिए स्थापना दस्तावेज़ देखें।
Linux और macOS बाइनरी के लिए GitHub रिलीज़ संपत्तियाँ देखें।
🚨 यदि आप हमारी GCS बाल्टी से cosign के रिलीज़ डाउनलोड कर रहे हैं - तो कृपया 31 जुलाई, 2023 की अप्रचलन सूचना पर अधिक जानकारी देखें। 🚨
यदि आपके पास Go 1.22+ है, तो आप एक विकास वातावरण सेटअप कर सकते हैं:```shell $ git clone https://github.com/sigstore/cosign $ cd cosign $ go install ./cmd/cosign $ $(go env GOPATH)/bin/cosign
## योगदान देना
यदि आप `cosign` में योगदान देने में रुचि रखते हैं, तो कृपया [योगदान दस्तावेज़ीकरण](https://github.com/sigstore/cosign/blob/HEAD/CONTRIBUTING.md) पढ़ें।
भविष्य का Cosign विकास अगले प्रमुख रिलीज़ पर केंद्रित होगा जो [sigstore-go](https://github.com/sigstore/sigstore-go) पर आधारित होगा।
अनुरक्षक sigstore-go के भीतर सुविधा विकास पर ध्यान केंद्रित करेंगे। sigstore-go में योगदान, विशेष रूप से अपनी स्वयं की कुंजियाँ लाने और हस्ताक्षर करने के आसपास, की सराहना की जाती है।
कृपया पहले अच्छे मुद्दों के लिए [मुद्दा ट्रैकर](https://github.com/sigstore/sigstore-go/issues) देखें।
Cosign 2.x एक स्थिर रिलीज़ है और इसे समय-समय पर सुविधा अद्यतन और बग फिक्स प्राप्त होते रहेंगे। छोटे दायरे और आकार वाले PRs की त्वरित समीक्षा होने की सबसे अधिक संभावना है।
जो PRs API में महत्वपूर्ण रूप से संशोधन या तोड़-फोड़ करते हैं, उन्हें स्वीकार नहीं किया जाएगा। जो PRs आकार में महत्वपूर्ण हैं लेकिन ब्रेकिंग परिवर्तन नहीं लाते हैं, उन्हें स्वीकार किया जा सकता है, लेकिन sigstore-go में PRs की तुलना में उन्हें कम प्राथमिकता माना जाएगा।
## Dockerfile
Dockerfile के माध्यम से ghcr.io/sigstore/cosign/cosign इमेज का उपयोग करके cosign को कैसे स्थापित और उपयोग करें, यहाँ बताया गया है:```shell
FROM ghcr.io/sigstore/cosign/cosign:v2.4.1 as cosign-bin
# Source: https://github.com/chainguard-images/static
FROM cgr.dev/chainguard/static:latest
COPY --from=cosign-bin /ko-app/cosign /usr/local/bin/cosign
ENTRYPOINT [ "cosign" ]
यह दिखाता है कि कैसे:
ध्यान दें कि आपको हमेशा इमेजों पर उनके डाइजेस्ट (@sha256:...) के आधार पर हस्ताक्षर करना चाहिए
न कि टैग (:latest) के आधार पर, क्योंकि अन्यथा आप किसी ऐसी चीज़ पर हस्ताक्षर कर सकते हैं जो
आपने इरादा नहीं किया था!```shell
cosign sign $IMAGE
Generating ephemeral keys... Retrieving signed certificate...
Note that there may be personally identifiable information associated with this signed artifact.
This may include the email address associated with the account with which you authenticate.
This information will be used for signing this artifact and will be stored in public transparency logs and cannot be removed later.
By typing 'y', you attest that you grant (or have permission to grant) and agree to have this information stored permanently in transparency logs. Are you sure you would like to continue? [y/N] y Your browser will now be opened to: https://oauth2.sigstore.dev/auth/auth?access_type=online&client_id=sigstore&code_challenge=OrXitVKUZm2lEWHVt1oQWR4HZvn0rSlKhLcltglYxCY&code_challenge_method=S256&nonce=2KvOWeTFxYfxyzHtssvlIXmY6Jk&redirect_uri=http%3A%2F%2Flocalhost%3A57102%2Fauth%2Fcallback&response_type=code&scope=openid+email&state=2KvOWfbQJ1caqScgjwibzK2qJmb Successfully verified SCT... tlog entry created with index: 12086900 Pushing signature to: $IMAGE
Cosign आपको OIDC के माध्यम से प्रमाणित करने का संकेत देगा, जहाँ आप अपने ईमेल पते से साइन इन करेंगे।
पर्दे के पीछे, cosign Fulcio प्रमाणपत्र प्राधिकरण से एक कोड साइनिंग प्रमाणपत्र का अनुरोध करेगा।
प्रमाणपत्र का विषय उस ईमेल पते से मेल खाएगा जिससे आपने लॉग इन किया था।
Cosign तब हस्ताक्षर और प्रमाणपत्र को Rekor पारदर्शिता लॉग में संग्रहीत करेगा, और हस्ताक्षर को उस छवि के साथ OCI रजिस्ट्री पर अपलोड करेगा जिस पर आप हस्ताक्षर कर रहे हैं।
### कंटेनर सत्यापित करें
छवि को सत्यापित करने के लिए, आपको `--certificate-identity` और `--certificate-oidc-issuer` फ़्लैग के माध्यम से अपेक्षित प्रमाणपत्र विषय और प्रमाणपत्र जारीकर्ता को पास करना होगा:```
cosign verify $IMAGE --certificate-identity=$IDENTITY --certificate-oidc-issuer=$OIDC_ISSUER
आप प्रमाणपत्र पहचान और जारीकर्ता फ़्लैग के लिए एक रेगेक्स भी पास कर सकते हैं, --certificate-identity-regexp और --certificate-oidc-issuer-regexp।
यदि छवि के लिए सार्वजनिक कुंजी से मेल खाने वाला कम से कम एक cosign स्वरूपित हस्ताक्षर पाया जाता है तो यह कमांड 0 लौटाता है।
अन्य हस्ताक्षर प्रारूपों के बारे में जानकारी और चेतावनियों के लिए नीचे विस्तृत उपयोग देखें।
कोई भी मान्य पेलोड stdout पर json प्रारूप में मुद्रित होते हैं। ध्यान दें कि इन हस्ताक्षरित पेलोड में कंटेनर छवि का डाइजेस्ट शामिल होता है, जिससे हम सुनिश्चित हो सकते हैं कि ये "पृथक" हस्ताक्षर सही छवि को कवर करते हैं।```shell $ cosign verify --key cosign.pub $IMAGE_URI:1h The following checks were performed on these signatures:
### एयर-गैप वातावरण में कंटेनर सत्यापित करें
**नोट:** यह अनुभाग पुराना है।
**नोट:** अधिकांश सत्यापन कार्यप्रवाहों में TUF रिपॉजिटरी से समय-समय पर सेवा कुंजियों का अनुरोध करना आवश्यक होता है।
सार्वजनिक-अच्छे इंस्टेंस का उपयोग करके हस्ताक्षरों के एयरगैप सत्यापन के लिए, आपको प्रोडक्शन TUF रिपॉजिटरी से [trusted root](https://github.com/sigstore/root-signing/blob/main/targets/trusted_root.json) फ़ाइल प्राप्त करनी होगी। इस फ़ाइल की सामग्री बिना सूचना के बदल जाएगी। TUF का उपयोग न करने पर, आपको इस फ़ाइल की अपनी एयरगैप कॉपी को अद्यतित रखने के लिए अपना स्वयं का तंत्र बनाना होगा।
Cosign एक [बंडल](https://github.com/sigstore/cosign/blob/HEAD/specs/SIGNATURE_SPEC.md#properties) को सत्यापित करके पूरी तरह से ऑफलाइन सत्यापन कर सकता है, जो आमतौर पर इमेज मैनिफेस्ट पर एक एनोटेशन के रूप में वितरित किया जाता है।
जब तक यह एनोटेशन मौजूद है, तब तक ऑफलाइन सत्यापन किया जा सकता है।
यह बंडल एनोटेशन डिफ़ॉल्ट रूप से कुंजी रहित हस्ताक्षर के लिए हमेशा शामिल किया जाता है, इसलिए डिफ़ॉल्ट `cosign sign` कार्यक्षमता में ऑफलाइन सत्यापन के लिए आवश्यक सभी सामग्री शामिल होगी।
एयर-गैप वातावरण में छवि को सत्यापित करने के लिए, छवि और हस्ताक्षर स्थानीय रूप से फ़ाइल सिस्टम पर उपलब्ध होने चाहिए।
एक छवि को `cosign save` का उपयोग करके स्थानीय रूप से सहेजा जा सकता है (नोट, यह चरण नेटवर्क कनेक्शन के साथ किया जाना चाहिए):```
cosign initialize # This will pull in the latest TUF root
cosign save $IMAGE_NAME --dir ./path/to/dir
अब, एक एयर-गैप्ड वातावरण में, इस स्थानीय इमेज को सत्यापित किया जा सकता है:```shell
cosign verify
--certificate-identity $CERT_IDENTITY
--certificate-oidc-issuer $CERT_OIDC_ISSUER
--offline=true
--new-bundle-format=false \ # for artifacts signed without the new protobuf bundle format
--trusted-root ~/.sigstore/root/tuf-repo-cdn.sigstore.dev/targets/trusted_root.json \ # default location of trusted root
--local-image ./path/to/dir
आपको इस छवि को सही ढंग से सत्यापित करने के लिए `$CERT_IDENTITY` और `$CERT_OIDC_ISSUER` के अपेक्षित मान प्रदान करने होंगे। यदि आपने कुंजी युग्म से हस्ताक्षर किया है, तो वही कमांड काम करेगा, बशर्ते सार्वजनिक कुंजी सामग्री स्थानीय रूप से उपलब्ध हो:```
cosign verify --key cosign.pub --offline --local-image ./path/to/dir
कुंजीहीन ब्लॉब हस्ताक्षर (cosign sign-blob बिना --key) का उपयोग करें और अपेक्षित हस्ताक्षरकर्ता पहचान के विरुद्ध सत्यापित करें:```shell
$ cosign sign-blob artifact --bundle artifact.sigstore.json --yes
$ cosign verify-blob artifact
--bundle artifact.sigstore.json
--certificate-identity "https://github.com/ORG/REPO/.github/workflows/release.yml@refs/heads/main"
--certificate-oidc-issuer "https://token.actions.githubusercontent.com"
### समस्या निवारण
यदि आपको Cosign के साथ समस्याएँ आती हैं, तो पहले सुनिश्चित करें कि आप एक हालिया रिलीज़ का उपयोग कर रहे हैं: Cosign परियोजना सबसे हालिया रिलीज़ के साथ-साथ v2 श्रृंखला की अंतिम रिलीज़ का भी सक्रिय रूप से समर्थन करती है।
#### सामान्य समस्याएँ और समाधान
1. सत्यापन विफल होता है `failed to verify timestamps: threshold not met for verified log entry integrated timestamps: 0 < 1`: हो सकता है कि आप एक हस्ताक्षर सत्यापित कर रहे हों जिसके लिए RFC3161 टाइमस्टैम्प समर्थन की आवश्यकता है
* सबसे हालिया Cosign में अपग्रेड करें या
* Cosign 2.6.x के साथ, `--use-signed-timestamps` का उपयोग करें
1. सत्यापन विफल होता है `no signatures found`: हो सकता है कि आप एक इमेज हस्ताक्षर सत्यापित कर रहे हों जिसके लिए Rekor v2 पारदर्शिता लॉग के समर्थन की आवश्यकता है
* सबसे हालिया Cosign में अपग्रेड करें
1. हस्ताक्षर HTTP त्रुटियों के साथ विफल होता है: Cosign के साथ हस्ताक्षर कई Sigstore सेवाओं पर निर्भर करता है। यदि इनमें से कोई भी सेवा विफल हो जाती है तो विफलता पर पुनः प्रयास करना एक उपयोगी समाधान हो सकता है -- विशिष्ट विफलताओं के लिए मुद्दे दर्ज करना भी सराहनीय है
#### मेरी समस्या कुछ और है
कृपया एक [मुद्दा](https://github.com/sigstore/cosign/issues/new/choose) खोलें या [स्लैक चैनल](#info) में पूछें।
## अन्य आर्टिफैक्ट्स के साथ काम करना
OCI रजिस्ट्रियाँ केवल कंटेनर इमेज से अधिक संग्रहीत करने के लिए उपयोगी हैं!
`Cosign` में OCI प्रोटोकॉल का उपयोग करके सामान्य आर्टिफैक्ट्स, जिनमें बाइनरी, स्क्रिप्ट और कॉन्फ़िगरेशन फ़ाइलें शामिल हैं, प्रकाशित करने के लिए कुछ उपयोगिताएँ भी शामिल हैं।
यह अनुभाग दिखाता है कि कैसे इनका लाभ उठाकर एक उपयोग में आसान, पश्च-संगत आर्टिफैक्ट वितरण प्रणाली बनाई जाए जो Sigstore के बाकी हिस्सों के साथ अच्छी तरह से एकीकृत होती है।
अधिक जानकारी के लिए [दस्तावेज़ीकरण](https://docs.sigstore.dev/cosign/signing/other_types/) देखें।
### ब्लॉब्स
आप `cosign upload blob` के साथ एक आर्टिफैक्ट प्रकाशित कर सकते हैं:```shell
$ echo "my first artifact" > artifact
$ BLOB_SUM=$(shasum -a 256 artifact | cut -d' ' -f 1) && echo "$BLOB_SUM"
c69d72c98b55258f9026f984e4656f0e9fd3ef024ea3fac1d7e5c7e6249f1626
$ BLOB_NAME=my-artifact-$(uuidgen | head -c 8 | tr 'A-Z' 'a-z')
$ BLOB_URI=ttl.sh/$BLOB_NAME:1h
$ BLOB_URI_DIGEST=$(cosign upload blob -f artifact $BLOB_URI) && echo "$BLOB_URI_DIGEST"
Uploading file from [artifact] to [ttl.sh/my-artifact-f42c22e0:5m] with media type [text/plain]
File [artifact] is available directly at [ttl.sh/v2/my-artifact-f42c22e0/blobs/sha256:c69d72c98b55258f9026f984e4656f0e9fd3ef024ea3fac1d7e5c7e6249f1626]
Uploaded image to:
ttl.sh/my-artifact-f42c22e0@sha256:790d47850411e902aabebc3a684eeb78fcae853d4dd6e1cc554d70db7f05f99f
आपके उपयोगकर्ता इसे "प्रत्यक्ष" URL से curl या wget जैसे मानक उपकरणों के साथ डाउनलोड कर सकते हैं:```shell $ curl -L ttl.sh/v2/$BLOB_NAME/blobs/sha256:$BLOB_SUM > artifact-fetched
डाइजेस्ट सीधे URL में बेक किया गया है, इसलिए वे उसे भी जांच सकते हैं:```shell
$ cat artifact-fetched | shasum -a 256
c69d72c98b55258f9026f984e4656f0e9fd3ef024ea3fac1d7e5c7e6249f1626 -
आप इसे सामान्य cosign sign कमांड और फ्लैग्स के साथ हस्ताक्षर कर सकते हैं:```shell
$ cosign sign --key cosign.key $BLOB_URI_DIGEST
Enter password for private key:
Pushing signature to: ttl.sh/my-artifact-f42c22e0
हमेशा की तरह, सुनिश्चित करें कि आपके द्वारा हस्ताक्षरित किसी भी छवि को उसके डाइजेस्ट से संदर्भित करें ताकि यह सुनिश्चित हो सके कि आप गलत चीज़ पर हस्ताक्षर नहीं कर रहे हैं!
#### Tekton Bundles
Tekton बंडलों को OCI रजिस्ट्री के भीतर अपलोड और प्रबंधित किया जा सकता है।
विनिर्देश [यहाँ](https://tekton.dev/docs/pipelines/tekton-bundle-contracts/) है।
इसका मतलब है कि उन पर `cosign` के साथ हस्ताक्षर और सत्यापन भी किया जा सकता है।
Tekton Bundles को वर्तमान में [tkn cli](https://github.com/tektoncd/cli) के साथ अपलोड किया जा सकता है, लेकिन हम भविष्य में इस समर्थन को `cosign` में जोड़ सकते हैं।```shell
$ tkn bundle push us.gcr.io/dlorenc-vmtest2/pipeline:latest -f task-output-image.yaml
Creating Tekton Bundle:
- Added TaskRun: to image
Pushed Tekton Bundle to us.gcr.io/dlorenc-vmtest2/pipeline@sha256:124e1fdee94fe5c5f902bc94da2d6e2fea243934c74e76c2368acdc8d3ac7155
$ cosign sign --key cosign.key us.gcr.io/dlorenc-vmtest2/pipeline@sha256:124e1fdee94fe5c5f902bc94da2d6e2fea243934c74e76c2368acdc8d3ac7155
Enter password for private key:
tlog entry created with index: 5086
Pushing signature to: us.gcr.io/dlorenc-vmtest2/demo:sha256-124e1fdee94fe5c5f902bc94da2d6e2fea243934c74e76c2368acdc8d3ac7155.sig
Web Assembly Modules को OCI रजिस्ट्री में भी संग्रहीत किया जा सकता है, इस विनिर्देश का उपयोग करके।
Cosign इन्हें cosign wasm upload कमांड का उपयोग करके अपलोड कर सकता है:```shell
$ cosign upload wasm -f hello.wasm us.gcr.io/dlorenc-vmtest2/wasm
$ cosign sign --key cosign.key us.gcr.io/dlorenc-vmtest2/wasm@sha256:9e7a511fb3130ee4641baf1adc0400bed674d4afc3f1b81bb581c3c8f613f812
Enter password for private key:
tlog entry created with index: 5198
Pushing signature to: us.gcr.io/dlorenc-vmtest2/wasm:sha256-9e7a511fb3130ee4641baf1adc0400bed674d4afc3f1b81bb581c3c8f613f812.sig
#### eBPF
[eBPF](https://ebpf.io) मॉड्यूल को भी एक OCI रजिस्ट्री में संग्रहीत किया जा सकता है, इस [विनिर्देश](https://github.com/solo-io/bumblebee/tree/main/spec) का उपयोग करके।
नीचे दी गई छवि `bee` टूल का उपयोग करके बनाई गई थी। अधिक जानकारी [यहाँ](https://github.com/solo-io/bumblebee/) पाई जा सकती है।
Cosign फिर इन छवियों पर हस्ताक्षर कर सकता है जैसे वह किसी भी अन्य OCI छवि पर कर सकता है।```shell
$ bee build ./examples/tcpconnect/tcpconnect.c localhost:5000/tcpconnect:test
$ bee push localhost:5000/tcpconnect:test
$ cosign sign --key cosign.key localhost:5000/tcpconnect@sha256:7a91c50d922925f152fec96ed1d84b7bc6b2079c169d68826f6cf307f22d40e6
Enter password for private key:
Pushing signature to: localhost:5000/tcpconnect
$ cosign verify --key cosign.pub localhost:5000/tcpconnect:test
Verification for localhost:5000/tcpconnect:test --
The following checks were performed on each of these signatures:
- The cosign claims were validated
- The signatures were verified against the specified public key
[{"critical":{"identity":{"docker-reference":"localhost:5000/tcpconnect"},"image":{"docker-manifest-digest":"sha256:7a91c50d922925f152fec96ed1d84b7bc6b2079c169d68826f6cf307f22d40e6"},"type":"cosign container image signature"},"optional":null}]
Cosign में in-toto अटेस्टेशन के लिए अंतर्निहित समर्थन है। इनका विनिर्देश यहाँ परिभाषित है।
आप निम्नलिखित कमांड का उपयोग करके एक स्थानीय predicate फ़ाइल से एक अटेस्टेशन बना और हस्ताक्षर कर सकते हैं:```shell $ cosign attest --predicate --key cosign.key $IMAGE_URI_DIGEST
सभी मानक कुंजी प्रबंधन प्रणालियाँ समर्थित हैं।
पेलोड्स को DSSE हस्ताक्षर स्पेक का उपयोग करके हस्ताक्षरित किया जाता है, जिसे [यहाँ](https://github.com/secure-systems-lab/dsse) परिभाषित किया गया है।
सत्यापित करने के लिए:```shell
$ cosign verify-attestation --key cosign.pub $IMAGE_URI
अधिक जानकारी के लिए उपयोग दस्तावेज़ीकरण देखें।
हार्डवेयर के साथ cosign का उपयोग कैसे करें, इसकी जानकारी के लिए हार्डवेयर टोकन दस्तावेज़ीकरण देखें।
cosign रजिस्ट्री इंटरैक्शन के लिए go-containerregistry का उपयोग करता है, जिसमें आमतौर पर उत्कृष्ट अनुकूलता होती है, लेकिन कुछ रजिस्ट्रियों में थोड़ी विचित्रताएँ हो सकती हैं।
आज, cosign का परीक्षण किया गया है और यह निम्नलिखित रजिस्ट्रियों के साथ काम करता है:
हम व्यापक रजिस्ट्री समर्थन के लिए लक्ष्य रखते हैं। उन रजिस्ट्रियों में छवियों पर हस्ताक्षर करने के लिए जो अभी तक OCI मीडिया प्रकार को पूरी तरह से समर्थन नहीं करती हैं, किसी को लीगेसी समकक्षों पर वापस जाने के लिए COSIGN_DOCKER_MEDIA_TYPES का उपयोग करने की आवश्यकता हो सकती है। उदाहरण के लिए:```shell
COSIGN_DOCKER_MEDIA_TYPES=1 cosign sign --key cosign.key legacy-registry.example.com/my/image@$DIGEST
कृपया परीक्षण में मदद करें और यदि आपको कोई समस्या दिखे तो बग दर्ज करें!
निर्देश [ट्रैकिंग इश्यू](https://github.com/sigstore/cosign/issues/40) में पाए जा सकते हैं।
## सावधानियाँ
### जानबूझकर छोड़ी गई सुविधाएँ
`cosign` केवल ECDSA-P256 कुंजियाँ उत्पन्न करता है और SHA256 हैश का उपयोग करता है, दोनों अस्थायी कुंजी रहित हस्ताक्षर और प्रबंधित कुंजी हस्ताक्षर के लिए।
कुंजियाँ PEM-एन्कोडेड PKCS8 प्रारूप में संग्रहीत की जाती हैं।
हालाँकि, आप किसी भी एल्गोरिदम से किसी भी प्रारूप में हस्ताक्षर संग्रहीत करने और पुनर्प्राप्त करने के लिए `cosign` का उपयोग कर सकते हैं।
### वे चीज़ें जो शायद बदलनी चाहिएँ
#### पेलोड प्रारूप
`cosign` केवल Red Hat के [सरल हस्ताक्षर](https://www.redhat.com/en/blog/container-image-signing) प्रारूप का समर्थन करता है पेलोड के लिए।
यह इस प्रकार दिखता है:```json
{
"critical": {
"identity": {
"docker-reference": "testing/manifest"
},
"image": {
"Docker-manifest-digest": "sha256:20be...fe55"
},
"type": "cosign container image signature"
},
"optional": {
"creator": "Bob the Builder",
"timestamp": 1458239713
}
}
नोट: यह cosign generate $IMAGE_URI_DIGEST का उपयोग करके छवि संदर्भ के लिए उत्पन्न किया जा सकता है।
मुझे इस प्रारूप को किसी और चीज़ में बदलने में खुशी होगी यदि यह समझ में आता है। एक विकल्प के लिए https://github.com/notaryproject/nv2/issues/40 देखें।
cosign हस्ताक्षर OCI रजिस्ट्री में अलग-अलग ऑब्जेक्ट के रूप में संग्रहीत होते हैं, जिनमें उस ऑब्जेक्ट का केवल एक कमजोर संदर्भ होता है जिस पर वे "हस्ताक्षर" करते हैं।
इसका मतलब है कि यह संबंध रजिस्ट्री के लिए अस्पष्ट है, और जब छवि हटा दी जाती है तो हस्ताक्षर नहीं हटाए जाएंगे या कचरा-संग्रहित नहीं होंगे।
इसी तरह, उन्हें आसानी से एक वातावरण से दूसरे में कॉपी किया जा सकता है, लेकिन यह स्वचालित नहीं है।
एकाधिक हस्ताक्षर एक सूची में संग्रहीत होते हैं जो दुर्भाग्य से आज एक रेस कंडीशन है। हस्ताक्षर जोड़ने के लिए, क्लाइंट "पढ़ें-जोड़ें-लिखें" ऑपरेशन का आयोजन करते हैं, इसलिए प्रतिस्पर्धा के मामले में अंतिम लेखन जीतेगा।
cosign डिफ़ॉल्ट रूप से हस्ताक्षरों को उसी रेपो में संग्रहीत करेगा जिसमें वह हस्ताक्षर कर रही छवि है।
हस्ताक्षरों के लिए एक अलग रेपो निर्दिष्ट करने के लिए, आप COSIGN_REPOSITORY पर्यावरण चर सेट कर सकते हैं।
यह प्रदान की गई छवि में रेपो को इस प्रकार बदल देगा:```shell $ export COSIGN_REPOSITORY=gcr.io/my-new-repo $ cosign sign --key cosign.key $IMAGE_URI_DIGEST
तो `gcr.io/dlorenc-vmtest2/demo` के लिए हस्ताक्षर `gcr.io/my-new-repo/demo:sha256-DIGEST.sig` में संग्रहीत किया जाएगा।
नोट: विभिन्न रजिस्ट्रियाँ "रिपॉजिटरी" के लिए अलग-अलग प्रारूप की अपेक्षा कर सकती हैं।
* [GCR](https://cloud.google.com/container-registry) का उपयोग करने के लिए, एक रजिस्ट्री नाम
जैसे `gcr.io/$REPO` पर्याप्त है, जैसा कि ऊपर दिए गए उदाहरण में है।
* [Artifact Registry](https://cloud.google.com/artifact-registry) का उपयोग करने के लिए,
एक पूर्ण इमेज नाम निर्दिष्ट करें जैसे
`$LOCATION-docker.pkg.dev/$PROJECT/$REPO/$STORAGE_IMAGE`, केवल एक
रिपॉजिटरी नहीं। उदाहरण के लिए, ```shell
$ export COSIGN_REPOSITORY=us-docker.pkg.dev/my-new-repo/demo
$ cosign sign --key cosign.key $IMAGE_URI_DIGEST
जहाँ sha256-DIGEST gcr.io/dlorenc-vmtest2/demo का डाइजेस्ट से मेल खाएगा। केवल एक रिपॉजिटरी जैसे $LOCATION-docker.pkg.dev/$PROJECT/$REPO निर्दिष्ट करना Artifact Registry में काम नहीं करेगा।
cosign minisign और signify जैसे उपकरणों से प्रेरित है।
उत्पन्न निजी कुंजियाँ PEM प्रारूप में संग्रहीत की जाती हैं। कुंजियाँ एक पासवर्ड के तहत scrypt को KDF के रूप में और nacl/secretbox को एन्क्रिप्शन के लिए उपयोग करके एन्क्रिप्ट की जाती हैं।
उनके पास ENCRYPTED SIGSTORE PRIVATE KEY का एक PEM हेडर है:```shell
-----BEGIN ENCRYPTED SIGSTORE PRIVATE KEY-----
...
-----END ENCRYPTED SIGSTORE PRIVATE KEY-----
सार्वजनिक कुंजियाँ डिस्क पर PEM-एन्कोडेड मानक PKIX प्रारूप में `PUBLIC KEY` हेडर के साथ संग्रहीत की जाती हैं।```
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAELigCnlLNKgOglRTx1D7JhI7eRw99
QolE9Jo4QUxnbMy5nUuBL+UZF9qqfm/Dg1BNeHRThHzWh2ki9vAEgWEDOw==
-----END PUBLIC KEY-----
cosign हस्ताक्षरों को एक OCI रजिस्ट्री में संग्रहीत करता है, और नामकरण परंपरा (हम जिस पर हस्ताक्षर कर रहे हैं उसके sha256 पर आधारित टैग) का उपयोग करके हस्ताक्षर सूचकांक का पता लगाता है।
reg.example.com/ubuntu@sha256:703218c0465075f4425e58fac086e09e1de5c340b12976ab9eb8ad26615c3715 में हस्ताक्षर reg.example.com/ubuntu:sha256-703218c0465075f4425e58fac086e09e1de5c340b12976ab9eb8ad26615c3715.sig पर स्थित हैं।
मोटे तौर पर (होस्टनाम में पोर्ट को अनदेखा करते हुए): s/:/-/g और s/@/:/g का उपयोग करके हस्ताक्षर सूचकांक खोजें।
इस रणनीति के आसपास कुछ चेतावनियों के लिए प्रतिस्पर्धा स्थितियाँ देखें।
वैकल्पिक कार्यान्वयन पारदर्शिता लॉग, स्थानीय फाइल सिस्टम, एक अलग रिपॉजिटरी रजिस्ट्री, हस्ताक्षर सूचकांक का एक स्पष्ट संदर्भ, एक नया रजिस्ट्री API, grafeas आदि का उपयोग कर सकते हैं।
cosign वर्तमान में केवल रजिस्ट्री में "मैनिफेस्ट" के रूप में संग्रहीत आर्टिफैक्ट्स के लिए काम करता है। प्रस्तावित तंत्र मनमानी चीजों पर हस्ताक्षर करने का समर्थन करने के लिए पर्याप्त लचीला है।
cosign कुंजियाँ उत्पन्न करने और हस्ताक्षर करने के लिए KMS प्रदाता का उपयोग करने का समर्थन करता है। अभी cosign Hashicorp Vault, AWS KMS, GCP KMS, Azure Key Vault का समर्थन करता है और हम भविष्य में और अधिक का समर्थन करने की उम्मीद कर रहे हैं!
अतिरिक्त KMS प्रदाता बाहरी प्लगइन के रूप में उपलब्ध हैं, जैसे OVHcloud KMS।
अधिक विवरण के लिए KMS दस्तावेज़ देखें।
oras का उपयोग करके एक आर्टिफैक्ट को रजिस्ट्री में पुश करें (इस मामले में, cosign स्वयं!):```shell
$ oras push us-central1-docker.pkg.dev/dlorenc-vmtest2/test/artifact ./cosign
Uploading f53604826795 cosign
Pushed us-central1-docker.pkg.dev/dlorenc-vmtest2/test/artifact
Digest: sha256:551e6cce7ed2e5c914998f931b277bc879e675b74843e6f29bc17f3b5f692bef
अब इसे हस्ताक्षरित करें! बेशक `cosign` का उपयोग करते हुए:```shell
$ cosign sign --key cosign.key us-central1-docker.pkg.dev/dlorenc-vmtest2/test/artifact@sha256:551e6cce7ed2e5c914998f931b277bc879e675b74843e6f29bc17f3b5f692bef
Enter password for private key:
Pushing signature to: us-central1-docker.pkg.dev/dlorenc-vmtest2/test/artifact:sha256-551e6cce7ed2e5c914998f931b277bc879e675b74843e6f29bc17f3b5f692bef.sig
अंत में, cosign को cosign से फिर से सत्यापित करें:```shell
$ cosign verify --key cosign.pub us-central1-docker.pkg.dev/dlorenc-vmtest2/test/artifact@sha256:551e6cce7ed2e5c914998f931b277bc879e675b74843e6f29bc17f3b5f692bef
The following checks were performed on each of these signatures:
{"Critical":{"Identity":{"docker-reference":""},"Image":{"Docker-manifest-digest":"sha256:551e6cce7ed2e5c914998f931b277bc879e675b74843e6f29bc17f3b5f692bef"},"Type":"cosign container image signature"},"Optional":null}
## FAQ
### Notary v2 का उपयोग क्यों नहीं करें?
इसका संक्षेप में उत्तर देना कठिन है।
इस पोस्ट में कुछ तुलनाएँ हैं:
[Notary V2 और Cosign](https://medium.com/@dlorenc/notary-v2-and-cosign-b816658f044d)
यदि आपको अन्य तुलना पोस्ट मिलें, तो कृपया यहाँ PR भेजें और हम उन सभी को लिंक कर देंगे।
### containers/image हस्ताक्षर का उपयोग क्यों नहीं करें?
`containers/image` हस्ताक्षर `cosign` के करीब है, और हम पेलोड प्रारूपों का पुन: उपयोग करते हैं।
`cosign` इस मायने में भिन्न है कि यह PGP के बजाय ECDSA-P256 कुंजियों से हस्ताक्षर करता है, और
हस्ताक्षरों को रजिस्ट्री में संग्रहीत करता है।
### TUF का उपयोग क्यों नहीं करें?
मेरा मानना है कि यह उपकरण TUF का पूरक है, और इन्हें एक साथ उपयोग किया जा सकता है।
मैंने अभी तक प्रयास नहीं किया है, लेकिन सोचता हूँ कि हम TUF भंडारण के लिए भी रजिस्ट्री का पुन: उपयोग कर सकते हैं।
## डिज़ाइन आवश्यकताएँ
* हस्ताक्षर भंडारण, क्वेरी या पुनर्प्राप्ति के लिए कोई बाहरी सेवाएँ नहीं
* हम जितना संभव हो उतना रजिस्ट्री समर्थन का लक्ष्य रखते हैं
* सब कुछ रजिस्ट्री API पर काम करना चाहिए
* PGP की बिल्कुल आवश्यकता नहीं होनी चाहिए।
* उपयोगकर्ताओं को एक इमेज के सभी हस्ताक्षर खोजने में सक्षम होना चाहिए
* हस्ताक्षरकर्ता पुश के बाद इमेज पर हस्ताक्षर कर सकते हैं
* कई संस्थाएँ एक इमेज पर हस्ताक्षर कर सकती हैं
* इमेज पर हस्ताक्षर करने से इमेज परिवर्तित नहीं होती
* शुद्ध-गो कार्यान्वयन
## भविष्य के विचार
### रजिस्ट्री API परिवर्तन
रजिस्ट्री में चीज़ों को संग्रहीत करने के लिए हम जिन नामकरण परंपरा और पढ़ें-संशोधित-लिखें अद्यतन पैटर्न का उपयोग करते हैं, वे थोड़े, ठीक है, 'हैकी' हैं।
मुझे लगता है कि वे आज उपलब्ध सबसे अच्छे (एकमात्र) वास्तविक विकल्प हैं, लेकिन यदि रजिस्ट्री API
बदलता है तो हम इनमें सुधार कर सकते हैं।
### अन्य प्रकार
`cosign` रजिस्ट्री में किसी भी चीज़ पर हस्ताक्षर कर सकता है।
ये उदाहरण एक एकल इमेज पर हस्ताक्षर करना दिखाते हैं, लेकिन आप एक मल्टी-प्लेटफ़ॉर्म `Index`,
या किसी भी अन्य प्रकार की कलाकृति पर भी हस्ताक्षर कर सकते हैं।
इसमें Helm Charts, Tekton Pipelines, और वितरण के लिए वर्तमान में OCI रजिस्ट्रियों का उपयोग करने वाली कोई भी अन्य चीज़ शामिल है।
इसका अर्थ यह भी है कि नए कलाकृति प्रकारों को रजिस्ट्री में अपलोड और हस्ताक्षरित किया जा सकता है।
संग्रहीत और हस्ताक्षर करने के लिए एक दिलचस्प प्रकार TUF रिपॉजिटरी होगी।
मैंने अभी तक प्रयास नहीं किया है, लेकिन मुझे काफी यकीन है कि TUF को इसके ऊपर लागू किया जा सकता है।
### टैग हस्ताक्षर
`cosign` हस्ताक्षर रजिस्ट्री में संग्रहीत वस्तुओं के डाइजेस्ट की रक्षा करते हैं।
वैकल्पिक `annotations` समर्थन (`cosign sign` के `-a` फ़्लैग के माध्यम से) का उपयोग हस्ताक्षरित और हस्ताक्षर द्वारा संरक्षित पेलोड में अतिरिक्त डेटा जोड़ने के लिए किया जा सकता है।
इसका एक उपयोग-मामला टैग->डाइजेस्ट मैपिंग पर हस्ताक्षर करना हो सकता है।
यदि आप प्रमाणित करना चाहते हैं कि एक विशिष्ट टैग (या टैग का सेट) एक डाइजेस्ट की ओर इंगित करना चाहिए, तो आप
कुछ इस प्रकार चला सकते हैं:```shell
$ docker push $IMAGE_URI
The push refers to repository [dlorenc/demo]
994393dc58e7: Pushed
5m: digest: sha256:1304f174557314a7ed9eddb4eab12fed12cb0cd9809e4c28f29af86979a3c870 size: 528
$ TAG=sign-me
$ cosign sign --key cosign.key -a tag=$TAG $IMAGE_URI_DIGEST
Enter password for private key:
Pushing signature to: dlorenc/demo:1304f174557314a7ed9eddb4eab12fed12cb0cd9809e4c28f29af86979a3c870.sig
तब आप -a फ्लैग का उपयोग करके cosign verify में यह जांच सकते हैं कि टैग->डाइजेस्ट मैपिंग भी हस्ताक्षर में शामिल है या नहीं।
यह उदाहरण यह सत्यापित करता है कि डाइजेस्ट $TAG जो (sha256:1304f174557314a7ed9eddb4eab12fed12cb0cd9809e4c28f29af86979a3c870) की ओर इंगित करता है, पर हस्ताक्षर किया गया है, और यह भी कि tag एनोटेशन का मान sign-me है:```shell
$ cosign verify --key cosign.pub -a tag=$TAG $IMAGE_URI | jq .
{
"Critical": {
"Identity": {
"docker-reference": ""
},
"Image": {
"Docker-manifest-digest": "97fc222cee7991b5b061d4d4afdb5f3428fcb0c9054e1690313786befa1e4e36"
},
"Type": "cosign container image signature"
},
"Optional": {
"tag": "sign-me"
}
}
Timestamps could also be added here, to implement TUF-style freeze-attack prevention.
### Base Image/Layer Signing
Again, `cosign` can sign anything in a registry.
You could use `cosign` to sign an image that is intended to be used as a base image,
and include that provenance metadata in resulting derived images.
This could be used to enforce that an image was built from an authorized base image.
Rough Idea:
* OCI manifests have an ordered list of `layer` `Descriptors`, which can contain annotations.
See [here](https://github.com/opencontainers/image-spec/blob/master/manifest.md) for the
specification.
* A base image is an ordered list of layers to which other layers are appended, as well as an
initial configuration object that is mutated.
* A derived image is free to completely delete/destroy/recreate the config from its base image,
so signing the config would provided limited value.
* We can sign the full set of ordered base layers, and attach that signature as an annotation to
the **last** layer in the resulting child image.
This example manifest manifest represents an image that has been built from a base image with two
layers.
One additional layer is added, forming the final image.```json
{
"schemaVersion": 2,
"config": {
"mediaType": "application/vnd.oci.image.config.v1+json",
"size": 7023,
"digest": "sha256:b5b2b2c507a0944348e0303114d8d93aaaa081732b86451d9bce1f432a537bc7"
},
"layers": [
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"size": 32654,
"digest": "sha256:9834876dcfb05cb167a5c24953eba58c4ac89b1adf57f28f2f9d09af107ee8f0"
},
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"size": 16724,
"digest": "sha256:3c3a4604a545cdc127456d94e421cd355bca5b528f4a9c1905b15da2eb4a4c6b",
"annotations": {
"dev.cosign.signature.baseimage": "Ejy6ipGJjUzMDoQFePWixqPBYF0iSnIvpMWps3mlcYNSEcRRZelL7GzimKXaMjxfhy5bshNGvDT5QoUJ0tqUAg=="
}
},
{
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
"size": 73109,
"digest": "sha256:ec4b8955958665577945c89419d1af06b5f7636b4ac3da7f12184802ad867736"
}
],
}
ध्यान दें कि इसे एकाधिक मध्यवर्ती आधार छवियों के लिए पुनरावर्ती रूप से लागू किया जा सकता है।
Cosign हस्ताक्षर (और उनके संरक्षित पेलोड) एक रजिस्ट्री में कलाकृतियों के रूप में संग्रहीत किए जाते हैं। ये हस्ताक्षर ऑब्जेक्ट भी हस्ताक्षरित किए जा सकते हैं, जिसके परिणामस्वरूप एक नई "प्रति-हस्ताक्षर" कलाकृति बनती है। यह "प्रति-हस्ताक्षर" हस्ताक्षर (या हस्ताक्षरों के समूह) और संदर्भित कलाकृति की रक्षा करता है, जो इसे स्वयं हस्ताक्षर(ों) के प्रमाण के रूप में कार्य करने की अनुमति देता है।
हस्ताक्षर कलाकृति पर हस्ताक्षर करने से पहले, हम पहले इसे एक यादगार नाम देते हैं ताकि हम इसे बाद में ढूंढ सकें।```shell $ cosign sign --key cosign.key -a sig=original $IMAGE_URI_DIGEST Enter password for private key: Pushing signature to: dlorenc/demo:sha256-97fc222cee7991b5b061d4d4afdb5f3428fcb0c9054e1690313786befa1e4e36.sig $ cosign verify --key cosign.pub dlorenc/demo | jq . { "Critical": { "Identity": { "docker-reference": "" }, "Image": { "Docker-manifest-digest": "97fc222cee7991b5b061d4d4afdb5f3428fcb0c9054e1690313786befa1e4e36" }, "Type": "cosign container image signature" }, "Optional": { "sig": "original" } }
<!-- TODO: https://github.com/sigstore/cosign/issues/2333 -->
अब उस हस्ताक्षर को एक यादगार नाम दें, फिर उस पर हस्ताक्षर करें:```shell
$ crane tag $(cosign triangulate $IMAGE_URI) mysignature
2021/02/15 20:22:55 dlorenc/demo:mysignature: digest: sha256:71f70e5d29bde87f988740665257c35b1c6f52dafa20fab4ba16b3b1f4c6ba0e size: 556
$ cosign sign --key cosign.key -a sig=counter dlorenc/demo:mysignature
Enter password for private key:
Pushing signature to: dlorenc/demo:sha256-71f70e5d29bde87f988740665257c35b1c6f52dafa20fab4ba16b3b1f4c6ba0e.sig
$ cosign verify --key cosign.pub dlorenc/demo:mysignature
{"Critical":{"Identity":{"docker-reference":""},"Image":{"Docker-manifest-digest":"71f70e5d29bde87f988740665257c35b1c6f52dafa20fab4ba16b3b1f4c6ba0e"},"Type":"cosign container image signature"},"Optional":{"sig":"counter"}}
अंत में, मूल हस्ताक्षर की जाँच करें:```shell $ crane manifest dlorenc/demo@sha256:71f70e5d29bde87f988740665257c35b1c6f52dafa20fab4ba16b3b1f4c6ba0e { "schemaVersion": 2, "config": { "mediaType": "application/vnd.oci.image.config.v1+json", "size": 233, "digest": "sha256:3b25a088710d03f39be26629d22eb68cd277a01673b9cb461c4c24fbf8c81c89" }, "layers": [ { "mediaType": "application/vnd.oci.descriptor.v1+json", "size": 217, "digest": "sha256:0e79a356609f038089088ec46fd95f4649d04de989487220b1a0adbcc63fadae", "annotations": { "dev.sigstore.cosign/signature": "5uNZKEP9rm8zxAL0VVX7McMmyArzLqtxMTNPjPO2ns+5GJpBeXg+i9ILU+WjmGAKBCqiexTxzLC1/nkOzD4cDA==" } } ] }
## रिलीज़ आवृत्ति
हम आवश्यकतानुसार रिलीज़ करते हैं। पैच रिलीज़ छोटे बग ठीक करने के लिए जारी की जाती हैं। माइनर रिलीज़ समय-समय पर जारी की जाती हैं जब कई बग ठीक होते हैं या सुविधाएँ जोड़ी जाती हैं। मेजर रिलीज़ तब जारी की जाएंगी जब ब्रेकिंग सुविधाएँ हों।
## सुरक्षा
यदि आप कोई सुरक्षा समस्या पाते हैं, तो कृपया sigstore के [सुरक्षा प्रक्रिया](https://github.com/sigstore/.github/blob/main/SECURITY.md) का संदर्भ लें।
## GitHub रिलीज़ एसेट्स में बंडल फ़ाइलें
`cosign` के GitHub रिलीज़ एसेट्स में [GoReleaser](https://github.com/sigstore/cosign/blob/ac999344eb381ae91455b0a9c5c267e747608d76/.goreleaser.yml#L166) द्वारा उत्पन्न Sigstore बंडल फ़ाइलें शामिल हैं, जो रिलीज़ बाइनरी की अखंडता को सत्यापित करने के लिए उपयोग किए जाने वाले cosign ब्लॉब पर हस्ताक्षर करते समय बनाई गई हैं। यह फ़ाइल cosign द्वारा स्वयं उपयोग नहीं की जाती है, बल्कि उन उपयोगकर्ताओं के लिए प्रदान की जाती है जो [रिलीज़ बाइनरी की अखंडता सत्यापित](https://docs.sigstore.dev/cosign/system_config/installation/#verifying-cosign-with-artifact-key) करना चाहते हैं।