সুরক্ষিত সোর্স কোড

১. সংক্ষিপ্ত বিবরণ

নিরাপদ সোর্স কোড কৌশল হলো এমন কিছু অনুশীলন যা সোর্স কোডের নিরাপত্তা উন্নত করতে ব্যবহার করা যেতে পারে। এই কৌশলগুলো সোর্স কোডের দুর্বলতা শনাক্ত ও সমাধান করতে, সোর্স কোডে অননুমোদিত প্রবেশ রোধ করতে এবং সোর্স কোডকে পরিবর্তন হওয়া থেকে রক্ষা করতে সাহায্য করে।

কিছু সাধারণ নিরাপদ সোর্স কোড কৌশলের মধ্যে রয়েছে:

  • লিন্টিং: লিন্টিং হলো সোর্স কোডে ভুল এবং শৈলীগত সমস্যা খুঁজে বের করার প্রক্রিয়া। এটি একটি লিন্ট টুল ব্যবহার করে করা হয়, যা এমন একটি প্রোগ্রাম যা সোর্স কোড বিশ্লেষণ করে এবং সম্ভাব্য সমস্যাগুলো শনাক্ত করে। সিনট্যাক্স ত্রুটি, শব্দার্থগত ত্রুটি, শৈলীগত ত্রুটি এবং নিরাপত্তা দুর্বলতাসহ বিভিন্ন ধরনের ত্রুটি পরীক্ষা করার জন্য লিন্ট টুল ব্যবহার করা যেতে পারে।
  • স্ট্যাটিক অ্যাপ্লিকেশন সিকিউরিটি টেস্টিং (SAST): SAST হলো এক ধরনের নিরাপত্তা পরীক্ষা যা নিরাপত্তা দুর্বলতা শনাক্ত করার জন্য সোর্স কোড, বাইনারি কোড বা বাইট কোড বিশ্লেষণ করে। Go, Java, Python, C++, এবং C# সহ বিভিন্ন প্রোগ্রামিং ভাষার দুর্বলতা খুঁজে বের করতে SAST টুল ব্যবহার করা যেতে পারে।
  • লাইসেন্স স্ক্যানিং: লাইসেন্স স্ক্যানিং হলো একটি সফটওয়্যার অ্যাপ্লিকেশনে ব্যবহৃত থার্ড-পার্টি সফটওয়্যার কম্পোনেন্টগুলোর লাইসেন্স শনাক্ত করার প্রক্রিয়া। এটি গুরুত্বপূর্ণ কারণ এর মাধ্যমে নিশ্চিত করা যায় যে অ্যাপ্লিকেশনটি লাইসেন্সের শর্তাবলী মেনে চলছে, যা আইনি সমস্যা এড়াতে সাহায্য করতে পারে।

সফটওয়্যার ডেভেলপমেন্ট লাইফ সাইকেলের সকল পর্যায়ে সোর্স কোডের নিরাপত্তা উন্নত করতে এই কৌশলগুলো ব্যবহার করা যেতে পারে। ডেভেলপমেন্ট প্রক্রিয়ার শুরুতে ত্রুটি শনাক্ত করতে লিন্টিং ব্যবহার করা যায়, কোড কম্পাইল বা ডেপ্লয় করার আগেই দুর্বলতা খুঁজে বের করতে SAST ব্যবহার করা যায়, এবং অ্যাপ্লিকেশনটি লাইসেন্সের শর্তাবলী মেনে চলছে কিনা তা নিশ্চিত করতে লাইসেন্স স্ক্যানিং ব্যবহার করা যায়।

এই কৌশলগুলো ব্যবহার করে সোর্স কোডের নিরাপত্তা উন্নত করা এবং নিরাপত্তা লঙ্ঘনের ঝুঁকি কমানো সম্ভব।

আপনি যা শিখবেন

এই ল্যাবে সফটওয়্যার সোর্স কোড সুরক্ষিত করার সরঞ্জাম এবং কৌশলগুলোর উপর আলোকপাত করা হবে।

  • লিন্টিং
  • স্ট্যাটিক অ্যাপ্লিকেশন নিরাপত্তা পরীক্ষা
  • লাইসেন্স স্ক্যানিং

এই ল্যাবে ব্যবহৃত সমস্ত টুল ও কমান্ড ক্লাউড শেল-এ সম্পাদন করা হবে।

২. সেটআপ এবং প্রয়োজনীয়তা

স্ব-গতিতে পরিবেশ সেটআপ

  1. Google Cloud Console- এ সাইন-ইন করুন এবং একটি নতুন প্রজেক্ট তৈরি করুন অথবা বিদ্যমান কোনো প্রজেক্ট পুনরায় ব্যবহার করুন। যদি আপনার আগে থেকে Gmail বা Google Workspace অ্যাকাউন্ট না থাকে, তবে আপনাকে অবশ্যই একটি তৈরি করতে হবে।

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • প্রজেক্টের নামটি হলো এই প্রজেক্টের অংশগ্রহণকারীদের প্রদর্শিত নাম। এটি একটি ক্যারেক্টার স্ট্রিং যা গুগল এপিআই ব্যবহার করে না। আপনি যেকোনো সময় এটি আপডেট করতে পারেন।
  • প্রজেক্ট আইডি সমস্ত গুগল ক্লাউড প্রজেক্ট জুড়ে অনন্য এবং অপরিবর্তনীয় (একবার সেট করার পর এটি পরিবর্তন করা যায় না)। ক্লাউড কনসোল স্বয়ংক্রিয়ভাবে একটি অনন্য স্ট্রিং তৈরি করে; সাধারণত এটি কী তা নিয়ে আপনার মাথা ঘামানোর প্রয়োজন হয় না। বেশিরভাগ কোডল্যাবে, আপনাকে প্রজেক্ট আইডি উল্লেখ করতে হবে (এটি সাধারণত PROJECT_ID হিসাবে চিহ্নিত করা হয়)। তৈরি করা আইডিটি আপনার পছন্দ না হলে, আপনি এলোমেলোভাবে আরেকটি তৈরি করতে পারেন। বিকল্পভাবে, আপনি নিজের আইডি দিয়ে চেষ্টা করে দেখতে পারেন যে সেটি উপলব্ধ আছে কিনা। এই ধাপের পরে এটি পরিবর্তন করা যাবে না এবং প্রজেক্টের পুরো সময়কাল জুড়ে এটি অপরিবর্তিত থাকবে।
  • আপনার অবগতির জন্য জানাচ্ছি যে, তৃতীয় একটি ভ্যালু রয়েছে, যা হলো প্রজেক্ট নাম্বার এবং কিছু এপিআই এটি ব্যবহার করে। ডকুমেন্টেশনে এই তিনটি ভ্যালু সম্পর্কে আরও বিস্তারিত জানুন।
  1. এরপর, ক্লাউড রিসোর্স/এপিআই ব্যবহার করার জন্য আপনাকে ক্লাউড কনসোলে বিলিং চালু করতে হবে। এই কোডল্যাবটি সম্পন্ন করতে খুব বেশি খরচ হওয়ার কথা নয়, এমনকি আদৌ কোনো খরচ নাও হতে পারে। এই টিউটোরিয়ালের পর যাতে কোনো বিলিং না হয়, সেজন্য রিসোর্সগুলো বন্ধ করতে আপনি আপনার তৈরি করা রিসোর্সগুলো অথবা পুরো প্রজেক্টটিই ডিলিট করে দিতে পারেন। গুগল ক্লাউডের নতুন ব্যবহারকারীরা ৩০০ মার্কিন ডলারের ফ্রি ট্রায়াল প্রোগ্রামের জন্য যোগ্য।

ক্লাউড শেল এডিটর শুরু করুন

এই ল্যাবটি গুগল ক্লাউড শেল এডিটর-এর সাথে ব্যবহারের জন্য ডিজাইন ও পরীক্ষা করা হয়েছে। এডিটরটি অ্যাক্সেস করতে,

  1. আপনার গুগল প্রজেক্টটি https://console.cloud.google.com -এ অ্যাক্সেস করুন।
  2. উপরের ডান কোণায় ক্লাউড শেল এডিটর আইকনে ক্লিক করুন

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)

৩. লিন্টিং

সিনট্যাক্স সম্পর্কিত সাধারণ স্টাইল-ভিত্তিক ভুল বা ত্রুটি পরীক্ষা করার জন্য লিন্টিং ব্যবহার করা হয়। লিন্টিং একাধিক টিমের মধ্যে একটি সাধারণ সিনট্যাক্স প্যাটার্ন প্রদান করে নিরাপত্তায় সহায়তা করে, যার ফলে দ্রুত কোড রিভিউ, জ্ঞান বিনিময় এবং কোডের স্বচ্ছতা বৃদ্ধি পায়।

এছাড়াও, লিন্টিং সাধারণ সিনট্যাক্স ভুলগুলো শনাক্ত করে, যা লাইব্রেরি বা কোর এপিআই-এর অনুপযুক্ত বা কম কার্যকর ব্যবহারের মতো সাধারণ দুর্বলতার কারণ হতে পারে।

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 $?

এক্ষেত্রে, যেহেতু কমান্ডটিতে একটি ত্রুটি ঘটেছে, তাই এক্সিট স্ট্যাটাস বা তার বেশি হবে। টুলটির সাফল্য/ব্যর্থতা নির্ধারণ করতে CI/CD পাইপলাইনে এই পদ্ধতিটি ব্যবহার করা যেতে পারে।

main.go ফাইলটি সম্পাদনা করুন এবং কোডটি সংশোধন করুন:

  • main() মেথডের ভিতরে LINTING - Step 1 এর নিচের লাইনটির শুরুতে স্ল্যাশ ( // ) যোগ করে লাইনটি কমেন্ট আউট করুন।
  • main() মেথডের ভিতরে LINTING - Step 2 ঠিক নিচের দুটি লাইনের শুরুতে থাকা স্ল্যাশগুলো মুছে দিয়ে লাইন দুটিকে আনকমেন্ট করুন।

প্রজেক্টের রুট ডিরেক্টরিতে staticcheck পুনরায় চালান।

staticcheck

কমান্ডটির কোনো ফলাফল ফেরত দেওয়া উচিত নয় (অর্থাৎ একটি খালি লাইন)।

কমান্ডটির প্রস্থান অবস্থা পরীক্ষা করুন।

  echo $?

এক্ষেত্রে, যেহেতু কমান্ডটির ফলে কোনো ত্রুটি ঘটেনি, তাই এক্সিট স্ট্যাটাস শূন্য হবে।

৪. স্ট্যাটিক অ্যাপ্লিকেশন নিরাপত্তা পরীক্ষা

AST/স্ট্যাটিক নিরাপত্তা পরীক্ষা - সাধারণ দুর্বলতা এবং ঝুঁকি ( CWE ) খুঁজে বের করার জন্য স্ট্যাটিক কোড বিশ্লেষণ প্রদান করে।

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

৫. লাইসেন্স স্ক্যানিং

নিরাপত্তার জন্য লাইসেন্স গুরুত্বপূর্ণ, কারণ এর মাধ্যমে আপনি আইনত এমন সোর্স কোড প্রকাশ করতে বাধ্য হতে পারেন যা আপনি প্রকাশ করতে চান না। এই ধারণাটিকে " কপিলেফট " লাইসেন্স বলা হয়, যা আপনাকে সোর্স কোড প্রকাশ করতে বাধ্য করে যদি আপনি সেই লাইসেন্সযুক্ত কোনো ডিপেন্ডেন্সি ব্যবহার করেন।

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

৬. অভিনন্দন

অভিনন্দন, আপনি কোডল্যাবটি সম্পন্ন করেছেন!

আপনি যা শিখেছেন

  • সোর্স কোড সুরক্ষিত করার সরঞ্জাম এবং কৌশল

সর্বশেষ হালনাগাদ: ২৩/৩/২৩