Yazılım Tedarik Zincirinin Güvenliğini Sağlama

1. Genel Bakış

Artifact Registry, farklı yapı türü depolamanızı, tek bir projede birden fazla depo oluşturmanızı ve her depoyla belirli bir bölgeyi veya çoklu bölgeyi ilişkilendirmenizi sağlar. Birkaç depolama alanı modu vardır. Her mod farklı bir amaca hizmet eder. Aşağıdaki şemada, farklı modlarda birlikte kullanabileceğiniz birçok yöntemden biri gösterilmektedir. Şemada, iki Google Cloud projesindeki bir iş akışı gösterilmektedir. Geliştiriciler, geliştirme projesinde bir Java uygulaması oluşturur. Ayrı bir çalışma zamanı projesinde, başka bir derleme Google Kubernetes Engine'e dağıtılacak uygulamayı içeren bir kapsayıcı resmi oluşturur.

5af5e4da3ccfdff3.png

Bu laboratuvarda, aşağıdaki görevleri nasıl gerçekleştireceğinizi öğreneceksiniz.

  • Özel paketlerinizi dağıtmak için standart depoları kullanma
  • Maven Central paketlerini önbelleğe almak için uzak depoları kullanma
  • Birden fazla yayın öncesi deposunu tek bir yapılandırmada birleştirmek için sanal depolar kullanma

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ğer 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.

Workspace Kurulumu

gcloud'u ayarlama

Cloud Shell'de proje kimliğinizi ve proje numaranızı ayarlayın. Bunları PROJECT_ID ve PROJECT_NUMBER değişkenleri olarak kaydedin.

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')

API'leri etkinleştir

gcloud services enable artifactregistry.googleapis.com

Depoyu klonlama

git clone https://github.com/GoogleCloudPlatform/java-docs-samples
cd java-docs-samples/container-registry/container-analysis

2. Standart depolar

Standart depolar, gizli paketlerinizi depolamanızı ve diğer uygulamalarınızda paylaşmanızı sağlar.

Standart bir maven deposu oluşturma

Java yapıları için bir depo oluşturmak üzere Cloud Shell'de aşağıdaki komutu çalıştırın:

gcloud artifacts repositories create container-dev-java-repo \
    --repository-format=maven \
    --location=us-central1 \
    --description="Java package repository for Container Dev Workshop"

Cloud Shell yetkilendirme istemi görünürse Yetkilendir'i tıklayın.

Google Cloud Console - Artifact Registry - Depolama Alanları'na gidin ve container-dev-java-repo adlı yeni oluşturduğunuz Maven deposuna dikkat edin. Bu depoyu tıkladığınızda şu anda boş olduğunu görebilirsiniz.

gcloud artifacts repositories describe container-dev-java-repo \
    --location=us-central1

Aşağıdakine benzer bir yanıt döndürmelidir

Encryption: Google-managed key
Repository Size: 0.000MB
createTime: '2023-03-21T19:01:45.461589Z'
description: Java package repository for Container Dev Workshop
format: MAVEN
mavenConfig: {}
mode: STANDARD_REPOSITORY
name: projects/qwiklabs-gcp-03-4304110dc461/locations/us-central1/repositories/container-dev-java-repo
updateTime: '2023-03-21T19:01:45.461589Z'

Maven'i Artifact Registry için yapılandırma

Java projenize eklemek için depo yapılandırmasını yazdırmak üzere aşağıdaki komutu çalıştırın:

gcloud artifacts print-settings mvn \
    --repository=container-dev-java-repo \
    --location=us-central1

Önceki komut, projelerinizin pom.xml dosyasına eklenecek xml'i döndürür.

  • Depo bölümü, Maven'in geçerli proje tarafından kullanılmak üzere uzak yapıları indirebileceği yerleri belirtir.
  • distributionManagement bölümü, projenin dağıtıldığında hangi uzak depoya itileceğini belirtir.
  • Uzantılar bölümüne, Artifact Registry'ye bağlanmak için gereken kimlik doğrulama ve aktarım katmanını etkinleştiren artifactregistry-maven-wagon eklenir.
  • Not: Uzantıların pom.xml veya extensions.xml dosyalarında bulunabileceği unutulmamalıdır. Projenin bir üst projeye bağımlı olduğu durumlarda, pom.xml'deki girişlerin geri kalanı yüklenmeden önce bu bağımlılıklara erişilir. Üst öğenin uzantıya erişebilmesi için uzantı, pom.xml dosyasından önce yüklenen bir extensions.xml dosyasına yerleştirilebilir. Böylece üst öğe bağımlılıkları için kullanılabilir hale gelir.

Üç bölümü kopyalayın, ardından Cloud Shell Düzenleyici'de pom.xml dosyasını açın ve döndürülen ayarları, dosyanın en altına, kapatıcı project etiketinin hemen içine ekleyin.

İpucu: Düzenleyiciyi mevcut dizinde açmak için Cloud Shell'de terminalde aşağıdaki komutu çalıştırın.

cloudshell workspace .

Örnek: (URL'lerinizdeki proje adlarınız farklı olacaktır.)

  ...

  <distributionManagement>
    <snapshotRepository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/container-dev-java-repo</url>
    </snapshotRepository>
    <repository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/container-dev-java-repo</url>
    </repository>
  </distributionManagement>

  <repositories>
    <repository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/container-dev-java-repo</url>
      <releases>
        <enabled>true</enabled>
      </releases>
      <snapshots>
        <enabled>true</enabled>
      </snapshots>
    </repository>
  </repositories>

  <build>
    <extensions>
      <extension>
        <groupId>com.google.cloud.artifactregistry</groupId>
        <artifactId>artifactregistry-maven-wagon</artifactId>
        <version>2.2.0</version>
      </extension>
    </extensions>
  </build>

</project>

Java paketinizi Artifact Registry'ye yükleme

Maven'de yapılandırılmış Artifact Registry ile artık kuruluşunuzdaki diğer projeler tarafından kullanılmak üzere Java jar'larını depolamak için Artifact Registry'yi kullanabilirsiniz.

Java paketinizi Artifact Registry'ye yüklemek için aşağıdaki komutu çalıştırın:

mvn deploy -DskipTests

Bu komutu tekrar çalıştırmak isterseniz pom.xml dosyasında sürümü artırdığınızdan emin olun.

Artifact Registry'de Java paketini kontrol etme

Cloud Console - Artifact Registry - Repositories (Cloud Console - Artifact Registry - Depolar) bölümüne gidin. container-dev-java-repo'yi tıklayın ve hello-world ikili yapının orada olup olmadığını kontrol edin:

147eac5168648db1.png

3. Uzak depolar

Uzak Depolar, daha fazla güvenilirlik ve güvenlik için üçüncü taraf paketlerini önbelleğe alma olanağı sunar.

Uzak depo oluşturma

Not: Kimlik doğrulama ve yapılandırma hakkında ayrıntılı bilgi için ürün dokümanlarını inceleyin.

Maven Central yapıları için uzak bir depo oluşturmak üzere Cloud Shell'de aşağıdaki komutu çalıştırın:

gcloud artifacts repositories create maven-central-cache \
    --project=$PROJECT_ID \
    --repository-format=maven \
    --location=us-central1 \
    --description="Remote repository for Maven Central caching" \
    --mode=remote-repository \
    --remote-repo-config-desc="Maven Central" \
    --remote-mvn-repo=MAVEN-CENTRAL

Konsolda deposu inceleme

Cloud Console - Artifact Registry - Repositories (Cloud Console - Artifact Registry - Depolar) bölümüne gidin. maven-central-cache öğesini tıklayın ve oluşturulduğunu ve şu anda boş olduğunu fark edin.

Terminalde deposu inceleme

gcloud artifacts repositories describe maven-central-cache \
    --location=us-central1

Depoyu projenize entegre etme

Java projenize eklemek için depo yapılandırmasını yazdırmak üzere aşağıdaki komutu çalıştırın:

gcloud artifacts print-settings mvn \
    --repository=maven-central-cache \
    --location=us-central1

Depo bölümünü pom.xml dosyanıza ekleyin. Çıktıda dış <repositories> etiketini kopyalamadığınızdan emin olun.

Her depo girişinin benzersiz bir kimliğe sahip olmasını sağlamak için yeni eklenen deponun kimliğini "central" olarak değiştirin.

Örnek: (URL'lerinizdeki proje adlarınız farklı olacaktır.)

  ...

  <distributionManagement>
    <snapshotRepository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/container-dev-java-repo</url>
    </snapshotRepository>
    <repository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/container-dev-java-repo</url>
    </repository>
  </distributionManagement>

  <repositories>
    <repository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/container-dev-java-repo</url>
      <releases>
        <enabled>true</enabled>
      </releases>
      <snapshots>
        <enabled>true</enabled>
      </snapshots>
    </repository>

    <repository>
      <id>central</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/maven-central-cache</url>
      <releases>
        <enabled>true</enabled>
      </releases>
      <snapshots>
        <enabled>true</enabled>
      </snapshots>
    </repository>


  </repositories>

  <build>
    <extensions>
      <extension>
        <groupId>com.google.cloud.artifactregistry</groupId>
        <artifactId>artifactregistry-maven-wagon</artifactId>
        <version>2.2.0</version>
      </extension>
    </extensions>
  </build>

</project>

Maven'in Artifact Registry'den üst öğe veya eklenti bağımlılıklarını çözebilmesini sağlayan temel uzantılar mekanizmasını kullanmak için projeniz için bir extensions.xml oluşturmak üzere terminalinizde aşağıdaki komutları çalıştırın.

mkdir .mvn 
cat > .mvn/extensions.xml << EOF
<extensions xmlns="http://maven.apache.org/EXTENSIONS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/EXTENSIONS/1.0.0 http://maven.apache.org/xsd/core-extensions-1.0.0.xsd">
  <extension>
    <groupId>com.google.cloud.artifactregistry</groupId>
    <artifactId>artifactregistry-maven-wagon</artifactId>
    <version>2.2.0</version>
  </extension>
</extensions>
EOF

Uzak depodan bağımlılıkları alma

Uygulamanızı uzak deposu kullanarak derlemek için aşağıdaki komutu çalıştırın:

rm -rf ~/.m2/repository 
mvn compile

Konsoldaki paketleri inceleme

Cloud Console - Artifact Registry - Repositories (Cloud Console - Artifact Registry - Depolar) bölümüne gidin. maven-central-cache simgesini tıklayın ve buradaki ikili yapıların önbelleğe alınmış olup olmadığını kontrol edin:

9deea93caa5fefd7.png

4. Sanal depolar

Sanal Depolar, birden fazla depoya tek bir yapılandırma üzerinden erişilebilmesi için bir arayüz görevi görür. Bu, yapılarınızı kullananlar için istemci yapılandırmasını basitleştirir ve bağımlılığı karıştırma saldırılarını azaltarak güvenliği artırır.

Politika dosyası oluşturma

cat > ./policy.json << EOF
[
  {
    "id": "private",
    "repository": "projects/${PROJECT_ID}/locations/us-central1/repositories/container-dev-java-repo",
    "priority": 100
  },
  {
    "id": "central",
    "repository": "projects/${PROJECT_ID}/locations/us-central1/repositories/maven-central-cache",
    "priority": 80
  }
]

EOF

Sanal deposu oluşturma

gcloud artifacts repositories create virtual-maven-repo \
    --project=${PROJECT_ID} \
    --repository-format=maven \
    --mode=virtual-repository \
    --location=us-central1 \
    --description="Virtual Maven Repo" \
    --upstream-policy-file=./policy.json

Depoyu projenize entegre etme

Java projenize eklemek için depo yapılandırmasını yazdırmak üzere aşağıdaki komutu çalıştırın:

gcloud artifacts print-settings mvn \
    --repository=virtual-maven-repo \
    --location=us-central1

pom dosyanızdaki repositories bölümünün tamamını, çıktıdaki tek bir sanal repositories bölümüyle değiştirin.

Örnek: (URL'lerinizdeki proje adlarınız farklı olacaktır.)

  ...


  <distributionManagement>
    <snapshotRepository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/container-dev-java-repo</url>
    </snapshotRepository>
    <repository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/container-dev-java-repo</url>
    </repository>
  </distributionManagement>

  <repositories>
    <repository>
      <id>artifact-registry</id>
      <url>artifactregistry://us-central1-maven.pkg.dev/qwiklabs-gcp-04-3c51830ea757/virtual-maven-repo</url>
      <releases>
        <enabled>true</enabled>
      </releases>
      <snapshots>
        <enabled>true</enabled>
      </snapshots>
    </repository>
  </repositories>

  <build>
    <extensions>
      <extension>
        <groupId>com.google.cloud.artifactregistry</groupId>
        <artifactId>artifactregistry-maven-wagon</artifactId>
        <version>2.2.0</version>
      </extension>
    </extensions>
  </build>

</project>


Bağımlılıkları sanal depodan alma

Sanal depo geçişli olduğundan ve gerçek paketler depolamaz. Bu nedenle, süreci net bir şekilde göstermek için daha önce oluşturduğunuz maven-central-cache deposunu silip yeniden oluşturarak boş bir depoyla tekrar başlayacaksınız.

Önbellek deposunu yeniden oluşturmak için aşağıdaki komutları çalıştırın

gcloud artifacts repositories delete maven-central-cache \
    --project=$PROJECT_ID \
    --location=us-central1 \
    --quiet

gcloud artifacts repositories create maven-central-cache \
    --project=$PROJECT_ID \
    --repository-format=maven \
    --location=us-central1 \
    --description="Remote repository for Maven Central caching" \
    --mode=remote-repository \
    --remote-repo-config-desc="Maven Central" \
    --remote-mvn-repo=MAVEN-CENTRAL

Boş deposu konsolda inceleyebilirsiniz. Cloud Console - Artifact Registry - Repositories (Cloud Console - Artifact Registry - Depolar) bölümüne gidin.

Artık aşağıdaki komutla projenizi oluşturarak sanal deposu kullanabilirsiniz.

rm -rf ~/.m2/repository 
mvn compile

Konsoldaki paketleri inceleme

Cloud Console - Artifact Registry - Repositories (Cloud Console - Artifact Registry - Repositories) sayfasına gidin. maven-central-cache'yi tıklayın ve ikili yapıların sanal depodan çekilecek şekilde yapılandırıldığını ancak nihayetinde maven-central-cache'den çekildiğini kontrol edin:

9deea93caa5fefd7.png

5. Tebrikler!

Tebrikler, kod laboratuvarını tamamladınız.

Kapsamınız

  • Özel paketlerinizi dağıtmak için Standart Depolar'ı kullandıysanız
  • Maven Central paketlerini önbelleğe almak için uzak depolar kullanıldı
  • Birden fazla yayın öncesi deposunu tek bir yapılandırmada birleştirmek için sanal depolar kullanıldı

Temizleme

Projeyi silmek için aşağıdaki komutu çalıştırın

gcloud projects delete ${PROJECT_ID}

Son güncelleme: 22.3.23