ซอร์สโค้ดที่ปลอดภัย

1. ภาพรวม

เทคนิคการใช้ซอร์สโค้ดที่ปลอดภัยคือชุดแนวปฏิบัติที่นำไปใช้ปรับปรุงความปลอดภัยของซอร์สโค้ดได้ เทคนิคเหล่านี้สามารถช่วยระบุและแก้ไขช่องโหว่ในซอร์สโค้ด ป้องกันการเข้าถึงซอร์สโค้ดโดยไม่ได้รับอนุญาต และช่วยป้องกันไม่ให้มีการแก้ไขซอร์สโค้ด

เทคนิคซอร์สโค้ดที่ปลอดภัยที่พบบ่อยมีดังนี้

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

คุณสามารถใช้เทคนิคเหล่านี้เพื่อปรับปรุงความปลอดภัยของซอร์สโค้ดได้ในทุกขั้นตอนของวงจรการพัฒนาซอฟต์แวร์ Linting สามารถใช้เพื่อระบุข้อผิดพลาดตั้งแต่เนิ่นๆ ของกระบวนการพัฒนา, SAST สามารถใช้เพื่อค้นหาช่องโหว่ก่อนที่โค้ดจะถูกคอมไพล์หรือปรับใช้โค้ด และสามารถใช้การสแกนใบอนุญาตเพื่อให้มั่นใจว่าแอปพลิเคชันเป็นไปตามข้อกำหนดของใบอนุญาต

การใช้เทคนิคเหล่านี้จะช่วยเพิ่มความปลอดภัยของซอร์สโค้ดและลดความเสี่ยงที่จะเกิดการละเมิดด้านความปลอดภัย

สิ่งที่คุณจะได้เรียนรู้

ห้องปฏิบัติการนี้จะให้ความสำคัญกับเครื่องมือและเทคนิคในการรักษาความปลอดภัยซอร์สโค้ดของซอฟต์แวร์

  • ไม่เป็นขุย
  • การทดสอบความปลอดภัยของแอปพลิเคชันแบบคงที่
  • การสแกนใบอนุญาต

เครื่องมือและคำสั่งทั้งหมดที่ใช้ในห้องทดลองนี้จะดำเนินการใน Cloud Shell

2. การตั้งค่าและข้อกำหนด

การตั้งค่าสภาพแวดล้อมตามเวลาที่สะดวก

  1. ลงชื่อเข้าใช้ Google Cloud Console และสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

เริ่มต้นเครื่องมือแก้ไข Cloud Shell

ห้องทดลองนี้ออกแบบและทดสอบเพื่อใช้กับ Google Cloud Shell Editor วิธีเข้าถึงเครื่องมือแก้ไข

  1. เข้าถึงโปรเจ็กต์ของ Google ที่ https://console.cloud.google.com
  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. ไม่เป็นขุย

การใช้ Lint เพื่อตรวจสอบข้อผิดพลาดหรือข้อบกพร่องเกี่ยวกับรูปแบบที่พบได้บ่อยซึ่งเกี่ยวข้องกับไวยากรณ์ Linting ช่วยรักษาความปลอดภัยด้วยการระบุรูปแบบไวยากรณ์ที่ใช้กันทั่วไปในทีมต่างๆ ซึ่งช่วยให้การตรวจสอบโค้ดรวดเร็วขึ้น การแชร์ความรู้ และความชัดเจนของโค้ด

นอกจากนี้ Linting ยังระบุข้อผิดพลาดทางไวยากรณ์ที่พบบ่อยซึ่งอาจนำไปสู่ช่องโหว่ทั่วไป เช่น การใช้ไลบรารีหรือ 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" ที่กำหนดให้คุณต้องแสดงซอร์สโค้ดหากใช้ทรัพยากร Dependency กับใบอนุญาตเหล่านั้น

ติดตั้ง 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" ใบอนุญาต

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" จากรายการ 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