1. Genel Bakış
Güvenli kaynak kodu teknikleri, kaynak kodunun güvenliğini artırmak için kullanılabilecek bir dizi uygulamadır. Bu teknikler, kaynak koddaki güvenlik açıklarını tespit edip düzeltmeye, kaynak koda yetkisiz erişimi önlemeye ve kaynak kodun değiştirilmesini engellemeye yardımcı olabilir.
Yaygın güvenli kaynak kodu tekniklerinden bazıları şunlardır:
- Linting: Linting, kaynak kodun hata ve üslup sorunları açısından kontrol edilmesi işlemidir. Bu işlem, kaynak kodunu analiz eden ve olası sorunları belirleyen bir program olan lint aracı kullanılarak yapılır. Lint araçları; söz dizimi hataları, anlam hataları, stil hataları ve güvenlik açıkları gibi çeşitli hataları kontrol etmek için kullanılabilir.
- Statik uygulama güvenliği testi (SAST): SAST, güvenlik açıklarını tespit etmek için kaynak kodu, ikili kod veya bayt kodunu analiz eden bir güvenlik testi türüdür. SAST araçları; Go, Java, Python, C++, C# gibi çeşitli programlama dillerindeki güvenlik açıklarını bulmak için kullanılabilir.
- Lisans taraması: Lisans taraması, bir yazılım uygulamasında kullanılan üçüncü taraf yazılım bileşenlerinin lisanslarını tanımlama işlemidir. Bu, uygulamanın lisans şartlarına uygun olmasını sağlayarak yasal sorunların önlenmesine yardımcı olduğundan önemlidir.
Bu teknikler, yazılım geliştirme yaşam döngüsünün tüm aşamalarında kaynak kodun güvenliğini iyileştirmek için kullanılabilir. Linting, geliştirme sürecinin erken aşamalarında hataları tespit etmek için kullanılabilir. SAST, kod derlenmeden veya dağıtılmadan önce güvenlik açıklarını bulmak için kullanılabilir. Lisans taraması ise uygulamanın lisans şartlarına uyduğundan emin olmak için kullanılabilir.
Bu tekniklerin kullanılması, kaynak kodunun güvenliğini artırmaya ve güvenlik ihlali riskini azaltmaya yardımcı olabilir.
Öğrenecekleriniz
Bu laboratuvarda, yazılım kaynak kodunun güvenliğini sağlamaya yönelik araçlar ve teknikler ele alınacaktır.
- Tüylenme
- Statik Uygulama Güvenliği Testi
- Lisans Tarama
Bu laboratuvarda kullanılan tüm araçlar ve komutlar Cloud Shell'de gerçekleştirilecektir.
2. Kurulum ve Gereksinimler
Kendi hızınızda ortam kurulumu
- Google Cloud Console'da oturum açın ve yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Gmail veya Google Workspace hesabınız yoksa hesap oluşturmanız gerekir.
- Proje adı, bu projenin katılımcılarının görünen adıdır. Google API'leri tarafından kullanılmayan bir karakter dizesidir. Dilediğiniz zaman bunu güncelleyebilirsiniz.
- Proje kimliği, tüm Google Cloud projelerinde benzersizdir ve değiştirilemez (ayarlandıktan sonra değiştirilemez). Cloud Console, benzersiz bir dize otomatik olarak oluşturur. Bu dizenin ne olduğu genellikle önemli değildir. Çoğu kod laboratuvarında proje kimliğine (genellikle
PROJECT_ID
olarak tanımlanır) referans vermeniz gerekir. Oluşturulan kimliği beğenmezseniz rastgele başka bir kimlik oluşturabilirsiniz. Alternatif olarak, kendi anahtarınızı deneyerek kullanılabilir olup olmadığını görebilirsiniz. Bu adımdan sonra değiştirilemez ve proje boyunca geçerli kalır. - Bazı API'lerin kullandığı üçüncü bir değer (Proje Numarası) olduğunu belirtmek isteriz. Bu değerlerin üçü hakkında daha fazla bilgiyi dokümanlar bölümünde bulabilirsiniz.
- Ardından, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i çalıştırmak çok pahalı olmayacaktır. Bu eğitimden sonra faturalandırılmamak için kaynakları kapatmak üzere oluşturduğunuz kaynakları veya projenin tamamını silebilirsiniz. Google Cloud'un yeni kullanıcıları 300 ABD doları değerindeki ücretsiz deneme programına uygundur.
Cloud Shell Düzenleyici'yi başlatma
Bu laboratuvar, Google Cloud Shell Düzenleyici ile kullanılmak üzere tasarlanmış ve test edilmiştir. Düzenleyiciye erişmek için:
- https://console.cloud.google.com adresinden Google projenize erişin.
- Sağ üst köşedeki bulut kabuğu düzenleyici simgesini tıklayın.
- Pencerenizin alt kısmında yeni bir bölme açılır.
- Düzenleyiciyi aç düğmesini tıklayın.
- Düzenleyici, sağ tarafta bir gezgin ve orta alanda düzenleyiciyle açılır.
- Ekranın alt kısmında bir terminal bölmesi de bulunur.
- Terminal AÇIK DEĞİLSE yeni bir terminal penceresi açmak için "ctrl+" tuş kombinasyonunu kullanın.
Ortam Kurulumu
Bu laboratuvarda kullanılan komutları basitleştirmek için GOPATH'i tek bir dizin olarak ayarlayın.
export GOPATH=$HOME/gopath
Çalışmalarımızı barındıracak bir dizin oluşturma
mkdir -p workspace
cd workspace
Kaynak kod deposunu klonlama
git clone https://gitlab.com/gcp-solutions-public/shift-left-security-workshop/source-code-lab.git
cd source-code-lab
export WORKDIR=$(pwd)
3. Tüylenme
Linting, söz dizimine bağlı yaygın stil hatalarını veya kusurları kontrol etmek için kullanılır. Linting, birden fazla ekip arasında ortak bir söz dizimi kalıbı sağlayarak daha hızlı kod incelemelerine, bilgi paylaşımına ve kodun netliğine yol açan güvenlik önlemlerine yardımcı olur.
Ayrıca, linting, kitaplıkların veya temel API'lerin yanlış veya daha az verimli kullanımı gibi yaygın güvenlik açıklarına neden olabilecek yaygın söz dizimi hatalarını tespit eder.
staticcheck
bağlantı aracını yükleme
go get honnef.co/go/tools/cmd/staticcheck@latest
Proje kök dizininde Go Linter'ı (staticcheck) çalıştırın
staticcheck
Çıktıyı inceleme
main.go:42:29: unnecessary use of fmt.Sprintf (S1039)
http.ListenAndServe()
bir dize kabul ettiği ve mevcut kodda dize değişkeni iletmeden Sprintf
kullanıldığı için bu hatayı alırsınız.
Komutun çıkış durumunu inceleyin.
echo $?
Bu durumda, komut bir hatayla sonuçlandığından çıkış durumu 1 veya daha büyük olur. Bu, aracın başarısını/başarısızlığını belirlemek için CI/CD ardışık düzeninde kullanılabilecek yöntemlerden biridir.
main.go
dosyasını düzenleyip kodu düzeltin:
main()
yönteminin içindekiLINTING - Step 1
satırının önüne eğik çizgi(//
) ekleyerek bu satırı yoruma alın.- Baştaki eğik çizgileri kaldırarak
main()
yöntemindekiLINTING - Step 2
'ün hemen altındaki iki satırın yorumunu kaldırın.
Proje kök dizininde staticcheck
'yi yeniden çalıştırın.
staticcheck
Komut hiçbir sonuç döndürmemelidir (ör. boş satır).
Komutun çıkış durumunu inceleyin.
echo $?
Bu durumda, komut bir hatayla sonuçlanmadığı için çıkış durumu sıfır olur.
4. Statik Uygulama Güvenliği Testi
AST/Statik güvenlik testi: Yaygın zayıflıkları ve açıkları ( CWE'ler) arayan statik kod analizi sağlar.
AST aracını yükleyin (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}
Politika dosyasıyla kaynak koda karşı gosec
'ü çalıştırma
gosec -conf policies/gosec-policy.json -fmt=json ./...
Çıkış şuna benzer şekilde olmalıdır
{ "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 } }
Araç, olası bir sorun tespit etti: Potential hardcoded credentials
5. Lisans Tarama
Lisanslar, yasal olarak göstermek istemeyebileceğiniz kaynak kodunu göstermenizi zorunlu kılabileceğinden güvenlik açısından önemlidir. Bu kavrama "copyleft" lisansları denir. Bu lisanslarla bağımlılıkları kullanıyorsanız kaynak kodu göstermenizi gerektirir.
golicense
uygulamasını yükle
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
İkili dosyayı derleme
go build
Lisans kontrolünü, "BSD-3-Clause" lisanslarına izin vermeyen mevcut politika dosyasıyla çalıştırın
golicense policies/license-policy.hcl hello-world
NOT: Bu işlem, aşağıdakine benzer bir çıkışla başarısız olur:
🚫 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" lisansını deny
listesinden allow
listesine taşımak için policies/license-policy.hcl
politika dosyasını değiştirin.
Lisans kontrolünü yeniden çalıştırma
golicense policies/license-policy.hcl hello-world
NOT: Bu işlem, benzer bir çıkışla başarılı olur:
✅ 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. Tebrikler
Tebrikler, kod laboratuvarını tamamladınız.
Öğrendikleriniz
- Kaynak kodunu güvence altına alma araçları ve teknikleri
—
Son güncelleme: 23.3.23