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

  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ı 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_ID olarak 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.
  1. 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:

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

8560cc8d45e8c112.png

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

9e504cb98a6a8005.png

  1. Düzenleyici, sağda bir gezgin ve merkezi alanda bir düzenleyiciyle açılır.
  2. Ekranın alt kısmında bir terminal bölmesi de bulunmalıdır.
  3. 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çindeki LINTING - Step 1 satırının önüne eğik çizgi(//) ekleyerek satırı yorum satırı haline getirin.
  • LINTING - Step 2 yönteminin içindeki main() 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