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

1. Genel Bakış

Artifact Registry, farklı yapay ürün 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ı yöntemden biri gösterilmektedir. Şemada, iki Google Cloud projesi arasındaki bir iş akışı gösterilmektedir. 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ım için 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 yukarı akış deposunu tek bir yapılandırmada birleştirmek için sanal depoları kullanma

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.pnga99b7ace416376c4.pngbd84a6d3004737c5.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 otomatik olarak benzersiz bir dize 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.

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 klonlayın

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

2. Standart depolar

Standart depolar, özel paketlerinizi depolamanın ve diğer uygulamalarınızda paylaşmanın bir yolunu sunar.

Standart bir Maven deposu oluşturma

Cloud Shell'den aşağıdaki komutu çalıştırarak Java yapıları için bir 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ünürse Yetkilendir'i tıklayın.

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

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

Java projenize eklenecek depo yapılandırmasını yazdırmak için 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'yi döndürür.

  • repositories bölümü, Maven'in geçerli proje tarafından kullanılmak üzere uzak yapıları nereden indirebileceğini belirtir.
  • distributionManagement bölümü, projenin dağıtıldığında hangi uzak depoya gönderileceğini belirtir.
  • extensions (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 pom.xml veya extensions.xml içinde bulunabilir. Projenin bir üst projeye bağlı olduğu durumlarda, bu bağımlılıklara pom.xml'deki girişlerin geri kalanı yüklenmeden önce erişilir. Üst öğenin uzantıya erişebilmesi için uzantı, pom.xml'den önce yüklenen bir extensions.xml dosyasına yerleştirilebilir. Böylece, üst öğe bağımlılıkları için kullanılabilir.

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

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

cloudshell workspace .

Örnek: (URL'lerinizde 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'da Artifact Registry'yi yapılandırdıktan sonra, kuruluşunuzdaki diğer projelerde kullanılacak 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 istiyorsanız pom.xml dosyasındaki sürümü artırdığınızdan emin olun.

Artifact Registry'deki Java paketini kontrol etme

Cloud Console - Artifact Registry - Repositories'e gidin. container-dev-java-repo simgesini tıklayın ve hello-world ikili yapısının mevcut olduğunu doğrulayın:

147eac5168648db1.png

3. Uzak depolar

Uzak depolar, güvenilirliği ve güvenliği artırmak 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 belgelerini inceleyin.

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

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

Cloud Console - Artifact Registry - Repositories'e gidin. maven-central-cache simgesini tıklayın. Oluşturulduğunu ve şu anda boş olduğunu fark edin.

Depoyu terminalde inceleme

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

Depoyu projenize entegre etme

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

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

pom.xml dosyanıza depo bölümünü ekleyin. Çıkıştan dıştaki <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'lerinizde 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>

Projeniz için extensions.xml oluşturmak üzere terminalinizde aşağıdaki komutları çalıştırın. Maven'in üst veya eklenti bağımlılıklarını Artifact Registry'den çözebilmesini sağlamak için çekirdek uzantıları mekanizmasını kullanı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ı çekme

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

rm -rf ~/.m2/repository 
mvn compile

Konsoldaki paketleri inceleyin

Cloud Console - Artifact Registry - Repositories'e gidin. maven-central-cache simgesini tıklayın ve orada önbelleğe alınan ikili yapıların şunları yaptığını kontrol edin:

9deea93caa5fefd7.png

4. Sanal depolar

Sanal depolar, tek bir yapılandırma üzerinden erişilebilen birden fazla depo için arayüz görevi görür. Bu, yapıtları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 depoyu 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 eklenecek depo yapılandırmasını yazdırmak için aşağıdaki komutu çalıştırın:

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

pom dosyanızdaki tüm depolar bölümünü, çıktıda yer alan sanal depolar bölümüyle değiştirin.

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


Sanal depodan bağımlılıkları çekme

Sanal depo, geçişli bir depo olduğundan herhangi bir gerçek paketi 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ş depoyu konsolda inceleyebilirsiniz. Cloud Console - Artifact Registry - Repositories'e (Cloud Console - Artifact Registry - Depolar) gidin.

Şimdi aşağıdaki komutla projenizi oluşturarak sanal depoyu kullanın.

rm -rf ~/.m2/repository 
mvn compile

Konsoldaki paketleri inceleyin

Cloud Console - Artifact Registry - Repositories'e gidin. maven-central-cache simgesini tıklayın ve ikili yapılar sanal depodan çekilecek şekilde yapılandırıldığını ancak sonuçta maven-central-cache'dan çekildiğini kontrol edin:

9deea93caa5fefd7.png

5. Tebrikler!

Tebrikler, codelab'i tamamladınız.

Kapsamda olanlar

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

Temizleme

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

gcloud projects delete ${PROJECT_ID}

—

Son güncelleme: 22.03.2023