1. ภาพรวม
เทคนิคซอร์สโค้ดที่ปลอดภัยคือชุดแนวทางปฏิบัติที่ใช้เพื่อปรับปรุงความปลอดภัยของซอร์สโค้ดได้ เทคนิคเหล่านี้ช่วยระบุและแก้ไขช่องโหว่ในซอร์สโค้ด ป้องกันการเข้าถึงซอร์สโค้ดโดยไม่ได้รับอนุญาต และปกป้องซอร์สโค้ดจากการแก้ไขได้
เทคนิคซอร์สโค้ดที่ปลอดภัยที่พบบ่อยมีดังนี้
- การวิเคราะห์ซอร์สโค้ด: การวิเคราะห์ซอร์สโค้ดคือกระบวนการตรวจสอบซอร์สโค้ดเพื่อหาข้อผิดพลาดและปัญหาด้านรูปแบบ โดยใช้เครื่องมือ Lint ซึ่งเป็นโปรแกรมที่วิเคราะห์ซอร์สโค้ดและระบุปัญหาที่อาจเกิดขึ้น คุณสามารถใช้เครื่องมือ Lint เพื่อตรวจสอบข้อผิดพลาดต่างๆ ได้ ซึ่งรวมถึงข้อผิดพลาดทางไวยากรณ์ ข้อผิดพลาดทางความหมาย ข้อผิดพลาดด้านรูปแบบ และช่องโหว่ด้านความปลอดภัย
- การทดสอบความปลอดภัยของแอปพลิเคชันแบบคงที่ (SAST): SAST คือการทดสอบความปลอดภัยประเภทหนึ่งที่วิเคราะห์ซอร์สโค้ด ไบนารีโค้ด หรือไบต์โค้ดเพื่อระบุช่องโหว่ด้านความปลอดภัย คุณสามารถใช้เครื่องมือ SAST เพื่อค้นหาช่องโหว่ในภาษาโปรแกรมต่างๆ ได้ เช่น Go, Java, Python, C++ และ C#
- การสแกนใบอนุญาต: การสแกนใบอนุญาตคือกระบวนการระบุใบอนุญาตของคอมโพเนนต์ซอฟต์แวร์ของบุคคลที่สามที่ใช้ในแอปพลิเคชันซอฟต์แวร์ ซึ่งมีความสำคัญเนื่องจากจะช่วยให้มั่นใจว่าแอปพลิเคชันเป็นไปตามข้อกำหนดของใบอนุญาต ซึ่งจะช่วยหลีกเลี่ยงปัญหาทางกฎหมายได้
เทคนิคเหล่านี้สามารถใช้เพื่อปรับปรุงความปลอดภัยของซอร์สโค้ดในทุกขั้นตอนของวงจรการพัฒนาซอฟต์แวร์ การวิเคราะห์ซอร์สโค้ด ใช้เพื่อระบุข้อผิดพลาดในช่วงต้นของกระบวนการพัฒนาซอฟต์แวร์ SAST ใช้เพื่อค้นหาช่องโหว่ก่อนที่จะคอมไพล์หรือทำให้ใช้งานได้โค้ด และการสแกนใบอนุญาตใช้เพื่อให้แน่ใจว่าแอปพลิเคชันเป็นไปตามข้อกำหนดของใบอนุญาต
การใช้เทคนิคเหล่านี้จะช่วยปรับปรุงความปลอดภัยของซอร์สโค้ดและลดความเสี่ยงของการละเมิดความปลอดภัยได้
สิ่งที่คุณจะได้เรียนรู้
ห้องทดลองนี้จะมุ่งเน้นที่เครื่องมือและเทคนิคในการรักษาความปลอดภัยของซอร์สโค้ดซอฟต์แวร์
- การวิเคราะห์ซอร์สโค้ด
- การทดสอบความปลอดภัยของแอปพลิเคชันแบบคงที่
- การสแกนใบอนุญาต
เครื่องมือและคำสั่งทั้งหมดที่ใช้ในแล็บนี้จะดำเนินการใน Cloud Shell
2. การตั้งค่าและข้อกำหนด
การตั้งค่าสภาพแวดล้อมแบบเรียนรู้ด้วยตนเอง
- ลงชื่อเข้าใช้ Google Cloud Console แล้วสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี



- ชื่อโปรเจ็กต์คือชื่อที่แสดงสำหรับผู้เข้าร่วมโปรเจ็กต์นี้ ซึ่งเป็นสตริงอักขระที่ Google APIs ไม่ได้ใช้ โดยคุณจะอัปเดตได้ทุกเมื่อ
- รหัสโปรเจ็กต์จะไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมดและเปลี่ยนแปลงไม่ได้ (เปลี่ยนไม่ได้หลังจากตั้งค่าแล้ว) Cloud Console จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ซึ่งโดยปกติแล้วคุณไม่จำเป็นต้องสนใจว่าสตริงนั้นคืออะไร ใน Codelab ส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (โดยปกติจะระบุเป็น
PROJECT_ID) หากไม่ชอบรหัสที่สร้างขึ้น คุณก็สร้างรหัสแบบสุ่มอีกรหัสหนึ่งได้ หรือคุณจะลองใช้ชื่อของคุณเองเพื่อดูว่าพร้อมใช้งานหรือไม่ก็ได้ คุณจะเปลี่ยนแปลงรหัสนี้หลังจากขั้นตอนนี้ไม่ได้ และรหัสจะยังคงอยู่ตลอดระยะเวลาของโปรเจ็กต์ - โปรดทราบว่ายังมีค่าที่ 3 ซึ่งคือหมายเลขโปรเจ็กต์ที่ API บางตัวใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 นี้ได้ในเอกสารประกอบ
- จากนั้นคุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของ Cloud การทำตาม Codelab นี้ไม่ควรมีค่าใช้จ่ายมากนัก หรืออาจไม่มีเลย หากต้องการปิดทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ คุณสามารถลบทรัพยากรที่สร้างขึ้นหรือลบทั้งโปรเจ็กต์ได้ ผู้ใช้ Google Cloud รายใหม่มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรีมูลค่า$300 USD
เริ่มต้น Cloud Shell Editor
Lab นี้ออกแบบและทดสอบเพื่อใช้กับ Google Cloud Shell Editor วิธีเข้าถึงเครื่องมือแก้ไข
- เข้าถึงโปรเจ็กต์ Google ที่ https://console.cloud.google.com
- คลิกไอคอนโปรแกรมแก้ไข Cloud Shell ที่มุมขวาบน

- แผงใหม่จะเปิดขึ้นที่ด้านล่างของหน้าต่าง
- คลิกปุ่ม "เปิดเครื่องมือแก้ไข"

- เครื่องมือแก้ไขจะเปิดขึ้นพร้อมกับ Explorer ทางด้านขวาและเครื่องมือแก้ไขในพื้นที่ส่วนกลาง
- นอกจากนี้ ควรมีแผงเทอร์มินัลที่ด้านล่างของหน้าจอด้วย
- หากเทอร์มินัลไม่ได้เปิดอยู่ ให้ใช้ชุดค่าผสมของปุ่ม `ctrl+`` เพื่อเปิดหน้าต่างเทอร์มินัลใหม่
การตั้งค่าสภาพแวดล้อม
ตั้งค่า GOPATH เป็นไดเรกทอรีเดียวเพื่อลดความซับซ้อนของคำสั่งที่ใช้ใน Lab นี้
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. การวิเคราะห์ซอร์สโค้ด
การวิเคราะห์ซอร์สโค้ดจะใช้เพื่อตรวจสอบข้อผิดพลาดหรือข้อบกพร่องที่พบบ่อยซึ่งอิงตามรูปแบบที่เกี่ยวข้องกับไวยากรณ์ การ Linting ช่วยรักษาความปลอดภัยด้วยการจัดรูปแบบไวยากรณ์ทั่วไปในหลายๆ ทีม ซึ่งจะช่วยให้การตรวจทานโค้ด การแชร์ความรู้ และความชัดเจนของโค้ดเร็วขึ้น
นอกจากนี้ การวิเคราะห์ซอร์สโค้ด ยังระบุข้อผิดพลาดทางไวยากรณ์ที่พบบ่อยซึ่งอาจนำไปสู่ช่องโหว่ที่พบบ่อย เช่น การใช้ไลบรารีหรือ Core API อย่างไม่เหมาะสมหรือไม่มีประสิทธิภาพ
ติดตั้งเครื่องมือลิงก์ 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 ขึ้นไป นี่เป็นวิธีหนึ่งที่ใช้ในไปป์ไลน์ CI/CD เพื่อพิจารณาความสำเร็จ/ความล้มเหลวของเครื่องมือได้
แก้ไขไฟล์ main.go และแก้ไขโค้ด
- แสดงความคิดเห็นในบรรทัดด้านล่าง
LINTING - Step 1ภายในเมธอดmain()โดยการเพิ่มเครื่องหมายทับนำหน้า(//) - ยกเลิกการแสดงความคิดเห็นของ 2 บรรทัดที่อยู่ใต้
LINTING - Step 2โดยตรงภายในเมธอดmain()โดยนำเครื่องหมายทับนำหน้าออก
เรียกใช้ staticcheck อีกครั้งในไดเรกทอรีรากของโปรเจ็กต์
staticcheck
คำสั่งไม่ควรแสดงผลลัพธ์ใดๆ (เช่น บรรทัดว่าง)
ตรวจสอบสถานะการออกของคำสั่ง
echo $?
ในกรณีนี้ เนื่องจากคำสั่งไม่ได้ทำให้เกิดข้อผิดพลาด สถานะการออกจึงเป็นศูนย์
4. การทดสอบความปลอดภัยของแอปพลิเคชันแบบคงที่
การทดสอบความปลอดภัยแบบคงที่/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
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
แก้ไขไฟล์นโยบาย policies/license-policy.hcl เพื่อย้าย "BSD-3-Clause" จากรายการ deny ไปยังรายการ allow
เรียกใช้การตรวจสอบใบอนุญาตอีกครั้ง
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. ขอแสดงความยินดี
ยินดีด้วย คุณทำ Codelab เสร็จแล้ว
สิ่งที่คุณได้เรียนรู้
- เครื่องมือและเทคนิคในการรักษาความปลอดภัยของซอร์สโค้ด
—
อัปเดตล่าสุด: 23/3/23