Güvenli Kaynak Kodu

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

  1. 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.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 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.
  1. 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:

  1. https://console.cloud.google.com adresinden Google projenize erişin.
  2. Sağ üst köşedeki bulut kabuğu düzenleyici simgesini tıklayın.

8560cc8d45e8c112.png

  1. Pencerenizin alt kısmında yeni bir bölme açılır.
  2. Düzenleyiciyi aç düğmesini tıklayın.

9e504cb98a6a8005.png

  1. Düzenleyici, sağ tarafta bir gezgin ve orta alanda düzenleyiciyle açılır.
  2. Ekranın alt kısmında bir terminal bölmesi de bulunur.
  3. 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çindeki LINTING - 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öntemindeki LINTING - 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