सुरक्षित स्रोत कोड

1. खास जानकारी

सोर्स कोड को सुरक्षित रखने की तकनीकें, तरीकों का एक सेट होती हैं. इनका इस्तेमाल, सोर्स कोड की सुरक्षा को बेहतर बनाने के लिए किया जा सकता है. इन तकनीकों की मदद से, सोर्स कोड में मौजूद कमजोरियों की पहचान की जा सकती है और उन्हें ठीक किया जा सकता है. साथ ही, सोर्स कोड को बिना अनुमति के ऐक्सेस होने से रोका जा सकता है और सोर्स कोड में बदलाव होने से बचाया जा सकता है.

सोर्स कोड को सुरक्षित रखने की कुछ सामान्य तकनीकों में ये शामिल हैं:

  • लिंटिंग: लिंटिंग, सोर्स कोड में गड़बड़ियों और स्टाइल से जुड़ी समस्याओं की जांच करने की प्रोसेस है. ऐसा करने के लिए, लिंट टूल का इस्तेमाल किया जाता है. यह एक ऐसा प्रोग्राम है जो सोर्स कोड का विश्लेषण करता है और संभावित समस्याओं की पहचान करता है. लिंट टूल का इस्तेमाल, कई तरह की गड़बड़ियों की जांच करने के लिए किया जा सकता है. इनमें सिंटैक्स से जुड़ी गड़बड़ियां, सेमेटिक गड़बड़ियां, स्टाइल से जुड़ी गड़बड़ियां, और सुरक्षा से जुड़ी जोखिम शामिल हैं.
  • स्टैटिक ऐप्लिकेशन सिक्योरिटी टेस्टिंग (एसएएसटी): एसएएसटी, सुरक्षा जांच का एक तरीका है. यह सुरक्षा से जुड़ी कमजोरियों की पहचान करने के लिए, सोर्स कोड, बाइनरी कोड या बाइट कोड का विश्लेषण करता है. SAST टूल का इस्तेमाल, Go, Java, Python, C++, और C# जैसी कई प्रोग्रामिंग भाषाओं में मौजूद जोखिमों का पता लगाने के लिए किया जा सकता है.
  • लाइसेंस स्कैनिंग: लाइसेंस स्कैनिंग, किसी सॉफ़्टवेयर ऐप्लिकेशन में इस्तेमाल किए गए तीसरे पक्ष के सॉफ़्टवेयर कॉम्पोनेंट के लाइसेंस की पहचान करने की प्रोसेस है. यह ज़रूरी है, क्योंकि इससे यह पक्का करने में मदद मिलती है कि ऐप्लिकेशन, लाइसेंस की शर्तों का पालन करता हो. इससे कानूनी समस्याओं से बचा जा सकता है.

इन तकनीकों का इस्तेमाल, सॉफ़्टवेयर डेवलपमेंट लाइफ़ साइकल के सभी चरणों में सोर्स कोड की सुरक्षा को बेहतर बनाने के लिए किया जा सकता है. डेवलपमेंट प्रोसेस के शुरुआती दौर में गड़बड़ियों की पहचान करने के लिए, लिंटिंग का इस्तेमाल किया जा सकता है. कोड को कंपाइल या डिप्लॉय करने से पहले, कमजोरियों का पता लगाने के लिए SAST का इस्तेमाल किया जा सकता है. साथ ही, लाइसेंस स्कैनिंग का इस्तेमाल करके यह पक्का किया जा सकता है कि ऐप्लिकेशन, लाइसेंस की शर्तों का पालन करता है.

इन तकनीकों का इस्तेमाल करके, सोर्स कोड की सुरक्षा को बेहतर बनाया जा सकता है. साथ ही, सुरक्षा से जुड़ी समस्याओं के होने का जोखिम भी कम किया जा सकता है.

आपको क्या सीखने को मिलेगा

इस लैब में, सॉफ़्टवेयर के सोर्स कोड को सुरक्षित रखने के टूल और तकनीकों पर फ़ोकस किया जाएगा.

  • लिंटिंग
  • स्टैटिक ऐप्लिकेशन की सुरक्षा जांच
  • लाइसेंस की स्कैनिंग

इस लैब में इस्तेमाल किए जाने वाले सभी टूल और निर्देश, Cloud Shell में इस्तेमाल किए जाएंगे.

2. सेटअप और ज़रूरी शर्तें

अपने हिसाब से एनवायरमेंट सेट अप करना

  1. Google Cloud Console में साइन इन करें और नया प्रोजेक्ट बनाएं या किसी मौजूदा प्रोजेक्ट का फिर से इस्तेमाल करें. अगर आपके पास पहले से कोई Gmail या Google Workspace खाता नहीं है, तो आपको एक खाता बनाना होगा.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • प्रोजेक्ट का नाम, इस प्रोजेक्ट में हिस्सा लेने वाले लोगों के लिए डिसप्ले नेम होता है. यह एक वर्ण स्ट्रिंग है, जिसका इस्तेमाल Google API नहीं करते. इसे कभी भी अपडेट किया जा सकता है.
  • प्रोजेक्ट आईडी, Google Cloud के सभी प्रोजेक्ट के लिए यूनीक होता है. साथ ही, इसे सेट करने के बाद बदला नहीं जा सकता. Cloud Console, अपने-आप एक यूनीक स्ट्रिंग जनरेट करता है. आम तौर पर, आपको यह जानने की ज़रूरत नहीं होती कि यह स्ट्रिंग क्या है. ज़्यादातर कोडलैब में, आपको प्रोजेक्ट आईडी का रेफ़रंस देना होगा. आम तौर पर, इसे PROJECT_ID के तौर पर पहचाना जाता है. अगर आपको जनरेट किया गया आईडी पसंद नहीं आता है, तो कोई दूसरा आईडी जनरेट किया जा सकता है. इसके अलावा, आपके पास खुद से भी यह पता लगाने का विकल्प है कि यह सुविधा उपलब्ध है या नहीं. इस चरण के बाद, इसे बदला नहीं जा सकता. यह प्रोजेक्ट के दौरान बना रहेगा.
  • आपकी जानकारी के लिए बता दें कि तीसरी वैल्यू, प्रोजेक्ट नंबर होती है. इसका इस्तेमाल कुछ एपीआई करते हैं. दस्तावेज़ में इन तीनों वैल्यू के बारे में ज़्यादा जानें.
  1. इसके बाद, आपको Cloud के संसाधनों/एपीआई का इस्तेमाल करने के लिए, Cloud Console में बिलिंग की सुविधा चालू करनी होगी. इस कोडलैब को चलाने में ज़्यादा खर्च नहीं आता. इस ट्यूटोरियल के बाद, आपसे कोई शुल्क न लिया जाए, इसके लिए संसाधनों को बंद किया जा सकता है. इसके लिए, आपने जो संसाधन बनाए हैं उन्हें मिटाएं या पूरा प्रोजेक्ट मिटाएं. Google Cloud के नए उपयोगकर्ता, 300 डॉलर के मुफ़्त ट्रायल वाले कार्यक्रम में शामिल हो सकते हैं.

Cloud Shell एडिटर शुरू करना

इस लैब को Google Cloud Shell एडिटर के साथ इस्तेमाल करने के लिए डिज़ाइन और टेस्ट किया गया था. एडिटर को ऐक्सेस करने के लिए,

  1. https://console.cloud.google.com पर जाकर, अपना Google प्रोजेक्ट ऐक्सेस करें.
  2. सबसे ऊपर दाएं कोने में, Cloud Shell एडिटर आइकॉन पर क्लिक करें

8560cc8d45e8c112.png

  1. आपकी विंडो के सबसे नीचे एक नया पैनल खुलेगा
  2. 'एडिटर खोलें' बटन पर क्लिक करें

9e504cb98a6a8005.png

  1. एडिटर दाईं ओर एक्सप्लोरर और बीच में एडिटर के साथ खुलेगा
  2. स्क्रीन पर सबसे नीचे, टर्मिनल पैनल भी उपलब्ध होना चाहिए
  3. अगर टर्मिनल खुला नहीं है, तो नई टर्मिनल विंडो खोलने के लिए, `ctrl+`` बटन का इस्तेमाल करें

एनवायरमेंट सेटअप करना

इस लैब में इस्तेमाल किए जाने वाले कमांड को आसान बनाने के लिए, GOPATH को किसी एक डायरेक्ट्री पर सेट करें.

export GOPATH=$HOME/gopath

अपने काम को सेव करने के लिए डायरेक्ट्री बनाना

mkdir -p workspace
cd workspace

सोर्स कोड का रिपॉज़िटरी क्लोन करना

git clone https://gitlab.com/gcp-solutions-public/shift-left-security-workshop/source-code-lab.git
cd source-code-lab
export WORKDIR=$(pwd)

3. लिंटिंग

लिंटिंग का इस्तेमाल, स्टाइल से जुड़ी आम गड़बड़ियों या सिंटैक्स से जुड़ी गड़बड़ियों की जांच करने के लिए किया जाता है. कई टीमों के लिए एक जैसा सिंटैक्स पैटर्न उपलब्ध कराने से, कोड की सुरक्षा में मदद मिलती है. इससे कोड की समीक्षा तेज़ी से की जा सकती है, जानकारी शेयर की जा सकती है, और कोड को आसानी से समझा जा सकता है.

इसके अलावा, लिंटिंग की सुविधा से सिंटैक्स से जुड़ी आम गलतियों का पता चलता है. इन गलतियों की वजह से, लाइब्रेरी या मुख्य एपीआई के गलत या कम असरदार इस्तेमाल जैसी सामान्य कमजोरियां हो सकती हैं.

staticcheck लिंकिंग टूल इंस्टॉल करना

 go get honnef.co/go/tools/cmd/staticcheck@latest

प्रोजेक्ट की रूट डायरेक्ट्री में Go Linter (staticcheck) चलाएं

 staticcheck

आउटपुट की समीक्षा करना

main.go:42:29: unnecessary use of fmt.Sprintf (S1039)

आपको गड़बड़ी इसलिए दिखती है, क्योंकि http.ListenAndServe() में स्ट्रिंग डाली जा सकती है. हालांकि, मौजूदा कोड में Sprintf का इस्तेमाल किया गया है, लेकिन स्ट्रिंग में वैरिएबल नहीं डाले गए हैं

कमांड के बंद होने का स्टेटस देखें.

echo $?

इस मामले में, कमांड की वजह से गड़बड़ी हुई है, इसलिए बाहर निकलने का स्टेटस 1 या उससे ज़्यादा होगा. यह एक ऐसा तरीका है जिसका इस्तेमाल, सीआई/सीडी पाइपलाइन में टूल के काम करने या न करने का पता लगाने के लिए किया जा सकता है.

main.go फ़ाइल में बदलाव करें और कोड ठीक करें:

  • main() तरीके में, LINTING - Step 1 के नीचे मौजूद लाइन को टिप्पणी के तौर पर हटाएं. इसके लिए, लीडिंग स्लैश(//) जोड़ें.
  • main() तरीके में, LINTING - Step 2 के ठीक नीचे मौजूद दो लाइनों से कमरेंट हटाएं. इसके लिए, स्लैश हटाएं.

प्रोजेक्ट की रूट डायरेक्ट्री में staticcheck को फिर से चलाएं

staticcheck

कमांड से कोई नतीजा नहीं मिलना चाहिए. जैसे, कोई खाली लाइन.

कमांड के बंद होने की स्थिति देखें.

  echo $?

इस मामले में, कमांड से कोई गड़बड़ी नहीं हुई है, इसलिए, बाहर निकलने की स्थिति शून्य होगी.

4. स्टैटिक ऐप्लिकेशन की सुरक्षा जांच

एएसटी/स्टैटिक सुरक्षा जांच - आम तौर पर होने वाली कमजोरियों और जोखिम ( सीडब्ल्यूई) का पता लगाने के लिए, स्टैटिक कोड का विश्लेषण करता है

AST टूल इंस्टॉल करना (gosec)

    export GOSEC_VERSION="2.15.0"
    curl -sfL https://raw.githubusercontent.com/securego/gosec/master/install.sh | \
          sh -s -- -b $(go env GOPATH)/bin v${GOSEC_VERSION}

सोर्स कोड के लिए, नीति फ़ाइल के साथ gosec चलाएं

gosec -conf policies/gosec-policy.json -fmt=json ./...

आउटपुट कुछ ऐसा दिखना चाहिए

{
    "Golang errors": {},
    "Issues": [
        {
            "severity": "HIGH",
            "confidence": "LOW",
            "cwe": {
                "ID": "798",
                "URL": "https://cwe.mitre.org/data/definitions/798.html"
            },
            "rule_id": "G101",
            "details": "Potential hardcoded credentials",
            "file": "/home/random-user-here/shift-left-security-workshop/labs/source-code-lab/main.go",
            "code": "31: \t// STEP 2: Change this and the reference below to something different (ie, not \"pawsword\" or \"password\")\n32: \tvar pawsword = \"im-a-cute-puppy\"\n33: \tfmt.Println(\"Something a puppy would use: \", username, pawsword)\n",
            "line": "32",
            "column": "6"
        }
    ],
    "Stats": {
        "files": 1,
        "lines": 89,
        "nosec": 0,
        "found": 1
    }
}

टूल को एक संभावित समस्या का पता चला है: Potential hardcoded credentials

5. लाइसेंस की स्कैनिंग

सुरक्षा के लिए लाइसेंस ज़रूरी हैं, क्योंकि कानूनी तौर पर आपसे ऐसा सोर्स कोड दिखाने के लिए कहा जा सकता है जिसे शायद आपको दिखाना न हो. इस कॉन्सेप्ट को " copyleft" लाइसेंस कहा जाता है. इन लाइसेंस के साथ डिपेंडेंसी का इस्तेमाल करने पर, आपको सोर्स कोड दिखाना होगा.

golicense इंस्टॉल करें

mkdir -p /tmp/golicense
wget -O /tmp/golicense/golicense.tar.gz https://github.com/mitchellh/golicense/releases/download/v0.2.0/golicense_0.2.0_linux_x86_64.tar.gz
pushd /tmp/golicense
tar -xzf golicense.tar.gz
chmod +x golicense
mv golicense $(go env GOPATH)/bin/golicense
popd

बाइनरी फ़ाइल बनाना

go build

लाइसेंस की जांच, मौजूदा नीति फ़ाइल के साथ करें. इस फ़ाइल में "BSD-3-Clause" लाइसेंस की अनुमति नहीं है

golicense policies/license-policy.hcl hello-world

ध्यान दें: यह मिलते-जुलते आउटपुट के साथ काम नहीं करेगा:

 🚫 rsc.io/sampler    BSD 3-Clause "New" or "Revised" License
 🚫 rsc.io/quote      BSD 3-Clause "New" or "Revised" License
 🚫 golang.org/x/text BSD 3-Clause "New" or "Revised" License

"BSD-3-Clause" को deny सूची से allow सूची में ले जाने के लिए, नीति फ़ाइल policies/license-policy.hcl में बदलाव करें.

लाइसेंस की जांच फिर से करना

golicense policies/license-policy.hcl hello-world

ध्यान दें: इससे मिलता-जुलता आउटपुट मिलना चाहिए:

    ✅ rsc.io/quote      BSD 3-Clause "New" or "Revised" License
    ✅ rsc.io/sampler    BSD 3-Clause "New" or "Revised" License
    ✅ golang.org/x/text BSD 3-Clause "New" or "Revised" License

6. बधाई हो

बधाई हो, आपने कोडलैब पूरा कर लिया है!

आपको क्या सीखने को मिला

  • सोर्स कोड को सुरक्षित रखने के लिए टूल और तरीके

पिछली बार अपडेट किए जाने की तारीख: 23/3/23