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

1. Genel Bakış

Artifact Registry, farklı yapı türlerini depolamanıza, tek bir projede birden fazla depo oluşturmanıza ve her depoyla belirli bir bölgeyi veya çoklu bölgeyi ilişkilendirmenize olanak tanır. Birkaç depo modu vardır. Her mod farklı bir amaca hizmet eder. Aşağıdaki şemada, depoları farklı modlarda birlikte kullanabileceğiniz birçok olası yol gösterilmektedir. Bu şemada, iki Google Cloud projesinin iş akışı gösterilmektedir. Bir geliştirme projesinde, geliştiriciler 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 container görüntüsü 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 Depo'yu kullanın
  • Maven merkezi paketleri önbelleğe almak için Remote Repositories'i kullanın
  • Birden fazla yukarı akış deposunu tek bir yapılandırmada birleştirmek için Sanal Depoları kullanın

Kendi hızınızda ortam kurulumu

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

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

Workspace Kurulumu

gcloud'u kurun

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, özel paketlerinizi depolayabileceğiniz ve diğer uygulamalarınızda paylaşabileceğiniz bir yöntem sunar.

Standart maven deposu oluşturma

Cloud Shell'den aşağıdaki komutu çalıştırarak Java yapıları için depo oluşturun:

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üntülenirse Yetkilendir'i tıklayın

Google Cloud Console - Artifact Registry - Repositories'e (Depolar) gidin ve container-dev-java-repo adlı yeni oluşturduğunuz Maven deposunu tıklayın. 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'

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

Aşağıdaki komutu çalıştırarak Java projenize eklenecek depo yapılandırmasını yazdırın:

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

Önceki komut, projelerinize (pom.xml) eklenecek olan xml dosyasını döndürür.

  • Depolar bölümü, Maven'in mevcut proje tarafından kullanılmak üzere uzak yapıları nereye indirebileceğini belirtir.
  • distributionManagement bölümü, projenin dağıtıldığında hangi uzak depoya aktaracağını belirtir.
  • extensions bölümü, Artifact Registry'ye bağlanmak için gerekli olan kimlik doğrulama ve aktarım katmanını etkinleştirecek eserregistry-maven-wagon'u ekler.
  • Not: Uzantılar pom.xml veya extensions.xml dosyasında bulunabilir. Projenin bir üst projeye bağlı olduğu durumlarda, bu bağımlılıklara pom.xml dosyasındaki diğer girişler yüklenmeden önce erişilir. Üst öğenin uzantıya erişebildiğinden emin olmak için uzantı, pom.xml dosyasından önce yüklenen bir extensions.xml dosyasına yerleştirilebilir. Böylece, üst bağımlılıklar için kullanılabilir hale gelir.

Üç bölümü kopyalayın, ardından pom.xml öğesini Cloud Shell Düzenleyici'de açın ve döndürülen ayarları dosyanın alt kısmındaki project kapanış etiketinin hemen içine ekleyin.

İpucu: Cloudshell'de, düzenleyiciyi geçerli dizinde açmak için terminalde aşağıdaki komutu çalıştırın.

cloudshell workspace .

Örnek: (projenizin adları URL'lerinizde 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ükleyin

Maven'de yapılandırılan Artifact Registry sayesinde artık Artifact Registry'yi kullanarak Java jar'larını kuruluşunuzdaki diğer projeler tarafından kullanılmak üzere depolayabilirsiniz.

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 istiyorsanız pom.xml dosyasındaki sürümü artırın.

Artifact Registry'de Java paketini kontrol edin

Cloud Console - Artifact Registry - Repositories sayfasına gidin container-dev-java-repo klasörünü tıklayın ve hello-world ikili yapısının mevcut olup olmadığını kontrol edin:

147eac5168648db1.png

3. Uzak depolar

Remote Repositories, daha fazla güvenilirlik ve güvenlik için üçüncü taraf paketleri önbelleğe alma özelliği sunar.

Uzak depo oluşturma

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

Maven Central yapıları için uzak depo oluşturmak üzere Cloud Shell'den 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

Depoyu konsolda inceleme

Cloud Console - Artifact Registry - Repositories'e gidin maven-central-cache klasörünü tıklayın. Oluşturulduğunu ve şu anda boş olduğunu göreceksiniz

Terminaldeki depoyu inceleyin

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

Depoyu projenize entegre edin

Aşağıdaki komutu çalıştırarak Java projenize eklenecek depo yapılandırmasını yazdırın:

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

Depo bölümünü pom.xml dosyanıza ekleyin. Dış <depolar> depolarını kopyalamadığınızdan emin olun etiketini çıkartın.

Yeni eklenen deponun kimliğini "central" olarak değiştirin ile birlikte her depo girişinin benzersiz bir kimliğe sahip olduğundan emin olun.

Örnek: (projenizin adları URL'lerinizde 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>

Projeniz için extensions.xml oluşturmak üzere terminalinizde aşağıdaki komutları çalıştırın. Temel uzantı mekanizmasını kullanarak Maven'in Artifact Registry'deki üst veya eklenti bağımlılıklarını çözümleyebilmesini sağlayı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

Bağımlıları Remote Repository'den çekme

Remote Repository'yi kullanarak uygulamanızı derlemek için aşağıdaki komutu çalıştırın:

rm -rf ~/.m2/repository 
mvn compile

Paketleri konsolda inceleyin

Cloud Console - Artifact Registry - Repositories'e gidin maven-central-cache sayfasını tıklayın ve orada önbelleğe alınmış ikili yapıların olup olmadığını kontrol edin:

9deea93caa5fefd7.png

4. Sanal depolar

Sanal Depolar, tek bir yapılandırma üzerinden birden fazla depoya erişilebilecek bir arayüz görevi görür. Bu sayede, yapılarınızın tüketicileri için istemci yapılandırmasını basitleştirir ve bağımlılık karışıklığı 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 depo 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 edin

Aşağıdaki komutu çalıştırarak Java projenize eklenecek depo yapılandırmasını yazdırın:

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

Pond'unuzdaki depolar bölümünün tamamını, çıkıştaki bir sanal depo bölümüyle değiştirin.

Örnek: (projenizin adları URL'lerinizde 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 Depo'dan çekme

Sanal kod deposu, geçiş özellikli olduğundan ve gerçek paketleri depolamayacağından, süreci açıkça göstermek için daha önce oluşturduğunuz maven-central-cache deposunu silip yeniden oluşturarak boş depoyla baştan başlamanız gerekir.

Ö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ş depoyu konsolda inceleyebilirsiniz. Cloud Console - Artifact Registry - Repositories'e gidin

Şimdi aşağıdaki komutla projenizi derleyerek sanal depoyu çalıştırın

rm -rf ~/.m2/repository 
mvn compile

Paketleri konsolda inceleyin

Cloud Console - Artifact Registry - Repositories bölümüne gidin maven-central-cache bölümünü tıklayın ve ikili yapıların sanal kod deposundan çekilecek şekilde yapılandırıldığından ancak maven-central-cache'den çekilip çekilmediğini kontrol edin:

9deea93caa5fefd7.png

5. Tebrikler!

Tebrikler, codelab'i tamamladınız.

İşledikleriniz

  • Özel paketlerinizi dağıtmak için Standart Depolar kullanıldı
  • Maven merkezi paketleri önbelleğe almak için Remote Repositories kullanıldı
  • Birden fazla yukarı akış deposunu tek bir yapılandırmada birleştirmek için Sanal Kod 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.03.2023