Kode Sumber yang Aman

1. Ringkasan

Teknik kode sumber yang aman adalah serangkaian praktik yang dapat digunakan untuk meningkatkan keamanan kode sumber. Teknik ini dapat membantu mengidentifikasi dan memperbaiki kerentanan dalam kode sumber, mencegah akses tidak sah ke kode sumber, dan melindungi kode sumber agar tidak dimodifikasi.

Beberapa teknik kode sumber aman yang umum antara lain:

  • Linting: Linting adalah proses pemeriksaan kode sumber untuk masalah error dan gaya. Hal ini dilakukan dengan menggunakan alat lint, yakni program yang menganalisis kode sumber dan mengidentifikasi potensi masalah. Alat lint dapat digunakan untuk memeriksa berbagai kesalahan, termasuk kesalahan sintaks, kesalahan semantik, kesalahan gaya, dan kerentanan keamanan.
  • Static application security testing (SAST): SAST adalah jenis pengujian keamanan yang menganalisis kode sumber, kode biner, atau kode byte untuk mengidentifikasi kerentanan keamanan. Alat SAST dapat digunakan untuk menemukan kerentanan dalam berbagai bahasa pemrograman, termasuk Go, Java, Python, C++, dan C#.
  • Pemindaian lisensi: Pemindaian lisensi adalah proses mengidentifikasi lisensi komponen software pihak ketiga yang digunakan dalam aplikasi software. Hal ini penting karena membantu memastikan bahwa aplikasi mematuhi persyaratan lisensi, yang dapat membantu menghindari masalah hukum.

Teknik-teknik ini dapat digunakan untuk meningkatkan keamanan kode sumber di semua tahap siklus hidup pengembangan software. Linting dapat digunakan untuk mengidentifikasi error di awal proses pengembangan, SAST dapat digunakan untuk menemukan kerentanan sebelum kode dikompilasi atau di-deploy, dan pemindaian lisensi dapat digunakan untuk memastikan bahwa aplikasi mematuhi persyaratan lisensi.

Menggunakan teknik ini dapat membantu meningkatkan keamanan kode sumber dan mengurangi risiko pelanggaran keamanan.

Yang akan Anda pelajari

Lab ini akan berfokus pada alat dan teknik untuk mengamankan kode sumber software.

  • Analisis lint
  • Pengujian Keamanan Aplikasi Statis
  • Pemindaian Lisensi

Semua alat dan perintah yang digunakan dalam lab ini akan dijalankan di Cloud Shell.

2. Penyiapan dan Persyaratan

Penyiapan lingkungan mandiri

  1. Login ke Google Cloud Console dan buat project baru atau gunakan kembali project yang sudah ada. Jika belum memiliki akun Gmail atau Google Workspace, Anda harus membuatnya.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Project name adalah nama tampilan untuk peserta project ini. String ini adalah string karakter yang tidak digunakan oleh Google API. Anda dapat memperbaruinya kapan saja.
  • Project ID bersifat unik di semua project Google Cloud dan tidak dapat diubah (tidak dapat diubah setelah ditetapkan). Cloud Console otomatis membuat string unik; biasanya Anda tidak peduli tentang apa itu. Di sebagian besar codelab, Anda harus mereferensikan Project ID (biasanya diidentifikasi sebagai PROJECT_ID). Jika Anda tidak menyukai ID yang dihasilkan, Anda dapat membuat ID acak lainnya. Atau, Anda dapat mencobanya sendiri dan lihat apakah ID tersebut tersedia. ID tidak dapat diubah setelah langkah ini dan akan tetap ada selama durasi project.
  • Sebagai informasi, ada nilai ketiga, Project Number yang digunakan oleh beberapa API. Pelajari lebih lanjut ketiga nilai ini di dokumentasi.
  1. Selanjutnya, Anda harus mengaktifkan penagihan di Konsol Cloud untuk menggunakan resource/API Cloud. Menjalankan operasi dalam codelab ini seharusnya tidak memerlukan banyak biaya, bahkan mungkin tidak sama sekali. Untuk mematikan resource agar tidak menimbulkan penagihan di luar tutorial ini, Anda dapat menghapus resource yang dibuat atau menghapus seluruh project. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program Uji Coba Gratis senilai $300 USD.

Memulai Cloud Shell Editor

Lab ini dirancang dan diuji agar dapat digunakan dengan Google Cloud Shell Editor. Untuk mengakses editor,

  1. Akses project Google Anda di https://console.cloud.google.com.
  2. Di sudut kanan atas, klik ikon Cloud Shell Editor

8560cc8d45e8c112.pngS

  1. Panel baru akan terbuka di bagian bawah jendela
  2. Klik tombol Open Editor

9e504cb98a6a8005.pngS

  1. Editor akan terbuka dengan penjelajah di sebelah kanan dan editor di area tengah
  2. Panel terminal juga harus tersedia di bagian bawah layar
  3. Jika terminal TIDAK terbuka, gunakan kombinasi tombol `ctrl+` untuk membuka jendela terminal baru

Penyiapan Lingkungan

Setel GOPATH ke satu direktori untuk menyederhanakan perintah yang digunakan dalam lab ini.

export GOPATH=$HOME/gopath

Membuat direktori untuk menyimpan pekerjaan kita

mkdir -p workspace
cd workspace

Meng-clone repo kode sumber

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

3. Analisis lint

Linting digunakan untuk memeriksa kesalahan atau cacat umum berbasis gaya yang terkait dengan sintaks. Linting membantu keamanan dengan menyediakan pola sintaksis umum di beberapa tim sehingga mempercepat peninjauan kode, berbagi pengetahuan, dan kejelasan kode.

Selain itu, Linting mengidentifikasi kesalahan sintaksis umum yang dapat menyebabkan kerentanan umum seperti penggunaan library atau API inti yang tidak tepat atau kurang efisien.

Menginstal alat penautan staticcheck

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

Jalankan Go Linter (staticcheck) di direktori root project

 staticcheck

Meninjau output

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

Anda mendapatkan error karena http.ListenAndServe() menerima String, dan kode saat ini menggunakan Sprintf tanpa meneruskan variabel ke string

Tinjau status keluar perintah.

echo $?

Dalam hal ini, karena perintah menghasilkan error, status keluar akan menjadi 1 atau lebih besar. Ini adalah salah satu metode yang dapat digunakan dalam pipeline CI/CD untuk menentukan keberhasilan/kegagalan alat.

Edit file main.go, dan perbaiki kodenya:

  • Jadikan baris di bawah LINTING - Step 1 sebagai komentar di dalam metode main(), dengan menambahkan garis miring di awal(//).
  • Hapus tanda komentar pada dua baris langsung di bawah LINTING - Step 2 di dalam metode main(), dengan menghapus garis miring di awal.

Jalankan kembali staticcheck di direktori utama project

staticcheck

Perintah seharusnya tidak menampilkan hasil apa pun (yaitu baris kosong.)

Periksa status keluar dari perintah.

  echo $?

Dalam hal ini, karena perintah tidak menghasilkan error, status keluarnya adalah nol.

4. Pengujian Keamanan Aplikasi Statis

Pengujian keamanan AST/Statis - Menyediakan analisis kode statis untuk mencari kelemahan dan eksposur umum ( CWE)

Instal alat 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}

Menjalankan gosec dengan file kebijakan terhadap kode sumber

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

Output harus serupa dengan ini

{
    "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
    }
}

Alat ini telah mengidentifikasi potensi masalah: Potential hardcoded credentials

5. Pemindaian Lisensi

Lisensi penting bagi keamanan karena secara hukum dapat mewajibkan Anda untuk mengekspos kode sumber yang mungkin tidak ingin Anda ungkap. Konsep ini disebut " copyleft" yang mengharuskan Anda mengekspos kode sumber jika menggunakan dependensi dengan lisensi tersebut.

Instal 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

Membangun file biner

go build

Jalankan pemeriksaan lisensi dengan file kebijakan saat ini yang tidak mengizinkan "BSD-3-Clause" lisensi

golicense policies/license-policy.hcl hello-world

CATATAN: Perintah ini akan gagal dengan output serupa:

 🚫 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

Ubah file kebijakan policies/license-policy.hcl untuk memindahkan "BSD-3-Clause" dari daftar deny ke daftar allow.

Jalankan ulang pemeriksaan lisensi

golicense policies/license-policy.hcl hello-world

CATATAN: Perintah ini akan berhasil dengan output yang serupa:

    ✅ 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. Selamat

Selamat, Anda telah menyelesaikan codelab!

Yang telah Anda pelajari

  • Alat dan teknik untuk mengamankan kode sumber

Terakhir diperbarui: 23/3/23