1. Genel Bakış
Güvenli kaynak kodu teknikleri, kaynak kodun güvenliğini iyileştirmek için kullanılabilecek bir dizi uygulamadır. Bu teknikler, kaynak kodundaki güvenlik açıklarını tespit edip düzeltmeye, kaynak koda yetkisiz erişimi önlemeye ve kaynak kodun değiştirilmesine karşı koruma sağlamaya yardımcı olabilir.
Yaygın olarak kullanılan bazı güvenli kaynak kodu teknikleri şunlardır:
- Linting: Hata analizi, kaynak kodunda hata ve stil sorunlarını kontrol etme işlemidir. Bu inceleme, kaynak kodunu analiz eden ve olası sorunları belirleyen bir program olan lint aracını kullanarak yapılır. Söz dizimi hataları, anlam hataları, stil hataları ve güvenlik açıkları gibi çeşitli hataları kontrol etmek için Lint araçları kullanılabilir.
- Statik uygulama güvenlik testi (SAST): SAST, güvenlik açıklarını belirlemek için kaynak kodu, ikili kodu veya bayt kodunu analiz eden bir güvenlik testi türüdür. SAST araçları Go, Java, Python, C++ ve C# gibi çeşitli programlama dillerindeki güvenlik açıklarını bulmak için kullanılabilir.
- Lisans taraması: Lisans tarama, 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 uymasını sağlamaya yardımcı olduğundan 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. Hata analizi, geliştirme sürecinin erken aşamalarında hataları tespit etmek için kullanılabilir, SAST ise 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 uymasını sağlamak için kullanılabilir.
Bu tekniklerin kullanılması, kaynak kodun güvenliğini iyileştirmeye 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 tekniklere odaklanılmaktadır.
- Döşeme
- Statik Uygulama Güvenlik Testi
- Lisans Tarama
Bu laboratuvarda kullanılan tüm araç 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çıp 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ı için görünen addır. Google API'leri tarafından kullanılmayan bir karakter dizesidir. İstediğiniz zaman güncelleyebilirsiniz.
- Proje Kimliği, tüm Google Cloud projelerinde benzersizdir ve değiştirilemez (belirlendikten sonra değiştirilemez). Cloud Console, otomatik olarak benzersiz bir dize oluşturur. bunun ne olduğunu umursamıyorsunuz. Çoğu codelab'de proje kimliğini (genellikle
PROJECT_IDolarak tanımlanır) referans almanız gerekir. Oluşturulan kimliği beğenmezseniz rastgele bir kimlik daha oluşturabilirsiniz. Alternatif olarak, kendi ölçümünüzü deneyip mevcut olup olmadığına bakabilirsiniz. Bu adımdan sonra değiştirilemez ve proje süresince kalır. - Bilginiz için bazı API'lerin kullandığı üçüncü bir değer, yani Proje Numarası daha vardır. Bu değerlerin üçü hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
- Sonraki adımda, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i çalıştırmanın maliyeti, yüksek değildir. Bu eğitim dışında faturalandırma yapılmaması için kaynakları kapatmak isterseniz oluşturduğunuz kaynakları silebilir veya projenin tamamını silebilirsiniz. Yeni Google Cloud kullanıcıları, 300 ABD doları değerindeki ücretsiz denemeden yararlanabilir.
Cloud Shell Düzenleyici'yi Başlat
Bu laboratuvar, Google Cloud Shell Düzenleyici ile birlikte 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 Cloud Shell 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, orta alanda ise düzenleyici açılır.
- Ekranın alt kısmında da bir terminal bölmesi bulunmalıdır
- 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'ı tek bir dizin olarak ayarlayın.
export GOPATH=$HOME/gopath
Çalışmalarımızın depolanacağı bir dizin oluşturun
mkdir -p workspace
cd workspace
Kaynak kodu 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. Döşeme
Hata analizi, stile dayalı sık karşılaşılan hataları veya söz dizimiyle ilgili kusurları kontrol etmek için kullanılır. Lint, birden fazla ekip arasında ortak bir söz dizimi kalıbı sağlayarak daha hızlı kod incelemeleri, bilgi paylaşımı ve kod anlaşılırlığı sağlayarak güvenliğe yardımcı olur.
Ayrıca Linting, kitaplıkların veya temel API'lerin uygunsuz ya da daha az verimli kullanımı gibi yaygın güvenlik açıklarına yol açabilecek yaygın söz dizimi hatalarını tanımlar.
staticcheck bağlantı oluşturma aracını yükleyin
go get honnef.co/go/tools/cmd/staticcheck@latest
Proje kök dizininde Go Linter'ı (staticcheck) çalıştırın
staticcheck
Sonucu inceleyin
main.go:42:29: unnecessary use of fmt.Sprintf (S1039)
http.ListenAndServe() bir Dize kabul ettiği ve mevcut kod, dizeye değişken iletmeden Sprintf kullandığı için hata alırsınız.
Komut çıkış durumunu inceleyin.
echo $?
Bu durumda, komut bir hatayla sonuçlandığı için çıkış durumu 1 veya daha yüksek olur. Bu, aracın başarısını/başarısızlığını belirlemek için CI/CD ardışık düzeninde kullanılabilecek bir yöntemdir.
main.go dosyasını düzenleyin ve kodu düzeltin:
main()yönteminin içinde, önüne eğik çizgi(//) ekleyerekLINTING - Step 1altındaki satırı inceleyin.main()yönteminin içinde, başındaki eğik çizgileri kaldırarakLINTING - Step 2öğesinin hemen altındaki iki satırın açıklamasını kaldırın.
staticcheck dosyasını proje kök dizininde yeniden çalıştırın
staticcheck
Komut, hiçbir sonuç döndürmemelidir (ör. boş bir 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üvenlik Testi
AST/Statik güvenlik testi: Yaygın zayıf noktaları ve riskleri bulmak için statik kod analizi sunar ( CWE'ler)
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}
gosec öğesini kaynak koduna göre politika dosyasıyla çalıştır
gosec -conf policies/gosec-policy.json -fmt=json ./...
Çıkış şuna benzer 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 belirledi: Potential hardcoded credentials
5. Lisans Tarama
Lisanslar, yasal olarak açığa çıkarmak istemeyebileceğiniz kaynak kodunu açığa çıkarmanızı gerektirebileceğinden güvenlik açısından önemlidir. Kavram " copyleft" Bu lisanslar için bağımlılıklar kullanıyorsanız kaynak kodu açığa çıkarmanızı gerektiren lisansları.
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 program dosyasını oluşturma
go build
Lisans kontrolünü, "BSD-3-Clause" işlemine izin vermeyen geçerli politika dosyasıyla çalıştırın lisanslar
golicense policies/license-policy.hcl hello-world
NOT: Bu komut, 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" öğesini taşımak için policies/license-policy.hcl politika dosyasını değiştirin deny listesinden allow listesine.
Lisans kontrolünü yeniden yap
golicense policies/license-policy.hcl hello-world
NOT: Bu işlem, aşağıdakine benzer bir çıktıyla 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, codelab'i tamamladınız.
Öğrendikleriniz
- Kaynak kodun güvenliğini sağlamaya yönelik araçlar ve teknikler
—
Son güncelleme: 23.03.2023