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 kodundaki güvenlik açıklarını belirleyip düzeltmeye, kaynak koduna yetkisiz erişimi önlemeye ve kaynak kodunun değiştirilmesini engellemeye yardımcı olabilir.
Yaygın olarak kullanılan bazı güvenli kaynak kodu teknikleri şunlardır:
- Linting: Linting, kaynak kodunda hata ve stil sorunları olup olmadığını kontrol etme işlemidir. Bu işlem, kaynak kodu analiz edip olası sorunları belirleyen bir program olan lint aracı kullanılarak yapılır. Lint araçları, söz dizimi hataları, anlamsal hatalar, stil hataları ve güvenlik açıkları da dahil olmak üzere çeşitli hataları kontrol etmek için kullanılabilir.
- Statik uygulama güvenliği testi (SAST): SAST, güvenlik açıklarını belirlemek 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++ ve C# dahil olmak üzere çeşitli programlama dillerindeki güvenlik açıklarını bulmak için kullanılabilir.
- Lisans tarama: Lisans tarama, bir yazılım uygulamasında kullanılan üçüncü taraf yazılım bileşenlerinin lisanslarını belirleme işlemidir. Bu, uygulamanın lisans şartlarına uygun olmasını sağlamaya yardımcı olduğundan önemlidir ve yasal sorunların önlenmesine yardımcı olabilir.
Bu teknikler, yazılım geliştirme yaşam döngüsünün tüm aşamalarında kaynak kodun güvenliğini artırmak 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 uygun olmasını sağlamak için kullanılabilir.
Bu teknikleri kullanmak, kaynak kodun 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ğlama araçları ve tekniklerine odaklanılacaktır.
- Linting
- 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
Yönlendirmesiz 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ı için görünen addı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 sabittir (ayarlandıktan sonra değiştirilemez). Cloud Console, benzersiz bir dizeyi otomatik olarak oluşturur. Genellikle bu dizenin ne olduğuyla ilgilenmezsiniz. Çoğu codelab'de proje kimliğine (genellikle
PROJECT_IDolarak tanımlanır) başvurmanız gerekir. Oluşturulan kimliği beğenmezseniz başka bir rastgele kimlik oluşturabilirsiniz. Dilerseniz kendi adınızı deneyerek kullanılabilir olup olmadığını kontrol edebilirsiniz. Bu adımdan sonra değiştirilemez ve proje süresince geçerli kalır. - Bazı API'lerin kullandığı üçüncü bir değer olan Proje Numarası da vardır. Bu üç değer hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
- Ardından, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i tamamlamak neredeyse hiç maliyetli değildir. Bu eğitimin ötesinde faturalandırma ücreti alınmaması 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ğerinde ücretsiz deneme programından yararlanabilir.
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 Cloud Shell düzenleyici simgesini tıklayın.

- Pencerenizin alt kısmında yeni bir bölme açılır.
- Open Editor (Düzenleyiciyi Aç) düğmesini tıklayın.

- Düzenleyici, sağda bir gezgin ve merkezi alanda bir düzenleyiciyle açılır.
- Ekranın alt kısmında bir terminal bölmesi de bulunmalıdır.
- Terminal açık 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 dizine ayarlayın.
export GOPATH=$HOME/gopath
Çalışmalarımızı saklamak için bir dizin oluşturma
mkdir -p workspace
cd workspace
Kaynak kodu deposunu klonlayın
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
Linting, söz dizimiyle ilgili yaygın stil tabanlı hataları veya kusurları kontrol etmek için kullanılır. Linting, birden fazla ekip arasında ortak bir söz dizimi kalıbı sağlayarak güvenliğe yardımcı olur. Bu sayede kod incelemeleri, bilgi paylaşımı ve kod netliği daha hızlı gerçekleşir.
Ayrıca, hata analizi yapma, 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ı da tanımlar.
staticcheck bağlama 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
Çıkışı inceleyin
main.go:42:29: unnecessary use of fmt.Sprintf (S1039)
http.ListenAndServe() bir dize kabul ettiğinden ve mevcut kod, değişkenleri dizeye aktarmadan Sprintf kullandığından bu hatayı alırsınız.
Komut çıkış durumunu inceleyin.
echo $?
Bu durumda, komut hatayla sonuçlandığından çıkış durumu 1 veya daha büyük olur. Bu, aracın başarılı olup olmadığını belirlemek için CI/CD ardışık düzeninde kullanılabilecek bir yöntemdir.
main.go dosyasını düzenleyip kodu düzeltin:
main()yönteminin içindekiLINTING - Step 1satırının önüne eğik çizgi(//) ekleyerek satırı yorum satırı haline getirin.LINTING - Step 2yönteminin içindekimain()işaretinin hemen altındaki iki satırın başındaki eğik çizgileri kaldırarak bu satırları yorum satırı olmaktan çıkarın.
Projenin kök dizininde staticcheck komutunu yeniden çalıştırın.
staticcheck
Komut herhangi bir sonuç döndürmemelidir (ör. boş bir satır).
Komutun çıkış durumunu inceleyin.
echo $?
Bu durumda, komut hataya neden olmadığından çı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}
Kaynak koduna karşı politika dosyasıyla gosec'yı çalıştırma
gosec -conf policies/gosec-policy.json -fmt=json ./...
Çıkış şu ş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, güvenlik açısından önemlidir. Çünkü lisanslar, yasal olarak, göstermek istemeyebileceğiniz kaynak kodunu açığa çıkarmanızı gerektirebilir. Bu kavram, söz konusu lisanslara sahip bağımlılıkları kullanırsanız kaynak kodu göstermenizi gerektiren "copyleft" lisansları olarak adlandırılır.
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
"BSD-3-Clause" lisanslarına izin vermeyen mevcut politika dosyasıyla lisans kontrolünü ç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 olmalıdır:
🚫 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 politika dosyasını değiştirerek "BSD-3-Clause" öğesini deny listesinden allow listesine taşıyın.
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ı olmalıdır:
✅ 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 kodunu güvenli hale getirme araçları ve teknikleri
—
Son güncelleme: 23.03.2023