การรักษาความปลอดภัยซัพพลายซอฟต์แวร์

1. ภาพรวม

Artifact Registry ช่วยให้คุณจัดเก็บอาร์ติแฟกต์ประเภทต่างๆ สร้างที่เก็บหลายรายการในโปรเจ็กต์เดียว และเชื่อมโยงภูมิภาคหรือหลายภูมิภาคกับที่เก็บแต่ละรายการ โหมดที่เก็บมีด้วยกันหลายโหมด แต่ละโหมดมีจุดประสงค์ต่างกัน แผนภาพต่อไปนี้แสดงหนึ่งในวิธีที่เป็นไปได้มากมายที่คุณใช้ที่เก็บในโหมดต่างๆ ร่วมกันได้ แผนภาพดังกล่าวแสดงเวิร์กโฟลว์ของโปรเจ็กต์ Google Cloud 2 โปรเจ็กต์ ในโปรเจ็กต์การพัฒนา นักพัฒนาจะสร้างแอปพลิเคชัน Java ในโปรเจ็กต์รันไทม์ที่แยกต่างหาก บิลด์อื่นจะสร้างอิมเมจคอนเทนเนอร์ด้วยแอปพลิเคชันเพื่อทำให้ใช้งานได้กับ Google Kubernetes Engine

5af5e4da3ccfdff3.png

ในห้องทดลองนี้ คุณจะได้ดูวิธีดำเนินการต่อไปนี้

  • ใช้ที่เก็บมาตรฐานสำหรับการทำให้แพ็กเกจส่วนตัวของคุณใช้งานได้
  • ใช้ที่เก็บระยะไกลเพื่อแคชแพ็กเกจ Maven Central
  • ใช้ที่เก็บเสมือนเพื่อรวมที่เก็บอัปสตรีมหลายรายการไว้ในการกำหนดค่าเดียว

การตั้งค่าสภาพแวดล้อมตามเวลาที่สะดวก

  1. ลงชื่อเข้าใช้ Google Cloud Console และสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่อีกครั้ง หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • ชื่อโครงการคือชื่อที่แสดงของผู้เข้าร่วมโปรเจ็กต์นี้ เป็นสตริงอักขระที่ Google APIs ไม่ได้ใช้ โดยคุณจะอัปเดตได้ทุกเมื่อ
  • รหัสโปรเจ็กต์จะไม่ซ้ำกันในทุกโปรเจ็กต์ของ Google Cloud และจะเปลี่ยนแปลงไม่ได้ (เปลี่ยนแปลงไม่ได้หลังจากตั้งค่าแล้ว) Cloud Console จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ปกติแล้วคุณไม่สนว่าอะไรเป็นอะไร ใน Codelab ส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (โดยปกติจะระบุเป็น PROJECT_ID) หากคุณไม่ชอบรหัสที่สร้างขึ้น คุณสามารถสร้างรหัสแบบสุ่มอื่นได้ หรือคุณจะลองดำเนินการเองแล้วดูว่าพร้อมให้บริการหรือไม่ และไม่สามารถเปลี่ยนแปลงได้หลังจากขั้นตอนนี้และจะยังคงอยู่ตลอดระยะเวลาของโปรเจ็กต์
  • สำหรับข้อมูลของคุณ ค่าที่ 3 คือหมายเลขโปรเจ็กต์ที่ API บางตัวใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 ค่าเหล่านี้ในเอกสารประกอบ
  1. ถัดไป คุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของระบบคลาวด์ การใช้งาน Codelab นี้น่าจะไม่มีค่าใช้จ่ายใดๆ หากมี หากต้องการปิดทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ คุณสามารถลบทรัพยากรที่คุณสร้างหรือลบทั้งโปรเจ็กต์ได้ ผู้ใช้ใหม่ของ Google Cloud จะมีสิทธิ์เข้าร่วมโปรแกรมทดลองใช้ฟรี$300 USD

การตั้งค่าพื้นที่ทำงาน

ตั้งค่า gcloud

ตั้งค่ารหัสและหมายเลขโปรเจ็กต์ใน Cloud Shell บันทึกเป็นตัวแปร PROJECT_ID และ PROJECT_NUMBER

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

เปิดใช้ API

gcloud services enable artifactregistry.googleapis.com

โคลนที่เก็บ

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

2. ที่เก็บมาตรฐาน

ที่เก็บมาตรฐานเป็นวิธีจัดเก็บแพ็กเกจส่วนตัวของคุณและแชร์ในแอปพลิเคชันอื่นๆ ของคุณ

สร้างที่เก็บ Maven มาตรฐาน

จาก Cloud Shell ให้เรียกใช้คำสั่งต่อไปนี้เพื่อสร้างที่เก็บสำหรับอาร์ติแฟกต์ Java

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

คลิก "ให้สิทธิ์" หากข้อความแจ้งการให้สิทธิ์ Cloud Shell ปรากฏขึ้น

ไปที่ Google Cloud Console - Artifact Registry - Repositories และสังเกตที่เก็บ Maven ที่สร้างขึ้นใหม่ชื่อ container-dev-java-repo หากคลิก เราพบว่าที่เก็บว่างเปล่าในขณะนี้

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

ควรแสดงคำตอบที่คล้ายกับข้อความต่อไปนี้

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 สำหรับ Artifact Registry

เรียกใช้คำสั่งต่อไปนี้เพื่อพิมพ์การกำหนดค่าที่เก็บเพื่อเพิ่มในโปรเจ็กต์ Java

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

คำสั่งก่อนหน้าจะแสดง XML ที่จะเพิ่มไปยัง pom.xml ของโปรเจ็กต์

  • ส่วนที่เก็บจะระบุตำแหน่งที่ Maven สามารถดาวน์โหลดอาร์ติแฟกต์ระยะไกลเพื่อใช้กับโปรเจ็กต์ปัจจุบัน
  • ส่วน distributionManagement จะระบุที่เก็บระยะไกลที่โปรเจ็กต์จะพุชไปเมื่อทำให้ใช้งานได้
  • ส่วน extensions จะเพิ่ม artifactregistry-maven-wagon ซึ่งจะเปิดใช้การตรวจสอบสิทธิ์และเลเยอร์การรับส่งข้อมูลที่จำเป็นสำหรับการเชื่อมต่อกับ Artifact Registry
  • หมายเหตุ: ส่วนขยายอยู่ใน pom.xml หรือ extensions.xml ได้ ในกรณีที่โปรเจ็กต์ต้องพึ่งพาโปรเจ็กต์ระดับบนสุด ระบบจะเข้าถึงทรัพยากร Dependency เหล่านั้นก่อนโหลดรายการที่เหลือใน pom.xml เพื่อให้มั่นใจว่าผู้เผยแพร่โฆษณาหลักมีสิทธิ์เข้าถึงส่วนขยาย สามารถวางส่วนขยายดังกล่าวในไฟล์ extensions.xml ที่โหลดก่อน pom.xml ทำให้ใช้งานกับทรัพยากร Dependency ระดับบนสุดได้

คัดลอกทั้ง 3 ส่วนแล้วเปิด pom.xml ใน Cloud Shell Editor แล้วเพิ่มการตั้งค่าที่แสดงผลที่ด้านล่างของไฟล์ภายในแท็กปิด project

เคล็ดลับ: ใน Cloudshell ให้เรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัลเพื่อเปิดตัวแก้ไขในไดเรกทอรีปัจจุบัน

cloudshell workspace .

ตัวอย่าง: (ชื่อโปรเจ็กต์จะแตกต่างออกไปใน URL)

  ...

  <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 ไปยัง Artifact Registry

เมื่อกำหนดค่า Artifact Registry ใน Maven แล้ว ตอนนี้คุณสามารถใช้ Artifact Registry เพื่อจัดเก็บ Java jar สำหรับโครงการอื่นๆ ในองค์กรไว้ใช้

เรียกใช้คำสั่งต่อไปนี้เพื่ออัปโหลดแพ็กเกจ Java ไปยัง Artifact Registry

mvn deploy -DskipTests

หากต้องการเรียกใช้คำสั่งนี้อีกครั้ง โปรดเพิ่มเวอร์ชันใน pom.xml

ตรวจสอบแพ็กเกจ Java ใน Artifact Registry

ไปที่ Cloud Console - Artifact Registry - Repositories คลิก container-dev-java-repo แล้วตรวจสอบว่ามีอาร์ติแฟกต์ไบนารี hello-world อยู่ไหม

147eac5168648db1.png

3. ที่เก็บระยะไกล

ที่เก็บระยะไกลช่วยให้สามารถแคชแพ็กเกจของบุคคลที่สามเพื่อเพิ่มความน่าเชื่อถือและความปลอดภัย

สร้างที่เก็บระยะไกล

หมายเหตุ: โปรดดูรายละเอียดการตรวจสอบสิทธิ์และการกำหนดค่าในเอกสารประกอบเกี่ยวกับผลิตภัณฑ์

จาก Cloud Shell ให้เรียกใช้คำสั่งต่อไปนี้เพื่อสร้างที่เก็บระยะไกลสำหรับอาร์ติแฟกต์ Maven Central

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

ตรวจสอบที่เก็บในคอนโซล

ไปที่ Cloud Console - Artifact Registry - Repositories คลิก maven-central-cache เพื่อดูว่ามีการสร้างแล้วและว่างเปล่าอยู่ในขณะนี้

ตรวจสอบที่เก็บในเทอร์มินัล

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

ผสานรวมที่เก็บลงในโปรเจ็กต์ของคุณ

เรียกใช้คำสั่งต่อไปนี้เพื่อพิมพ์การกำหนดค่าที่เก็บเพื่อเพิ่มในโปรเจ็กต์ Java

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

เพิ่มส่วนที่เก็บลงใน pom.xml ของคุณ อย่าคัดลอก<repositories>ด้านนอก จากเอาต์พุต

เปลี่ยนรหัสของที่เก็บที่เพิ่มเข้ามาใหม่เป็น "central" เพื่อตรวจสอบว่ารายการที่เก็บแต่ละรายการมีรหัสที่ไม่ซ้ำกัน

ตัวอย่าง: (ชื่อโปรเจ็กต์จะแตกต่างออกไปใน URL)

  ...

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

เรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัลเพื่อสร้าง extensions.xml สำหรับโปรเจ็กต์ของคุณ หากต้องการใช้กลไกส่วนขยายหลักในการตรวจสอบว่า Maven จะสามารถแปลงทรัพยากร Dependency ระดับบนสุดหรือปลั๊กอินจาก Artifact Registry ได้

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

ดึงทรัพยากร Dependency จากที่เก็บระยะไกล

เรียกใช้คำสั่งต่อไปนี้เพื่อคอมไพล์แอปพลิเคชันโดยใช้ที่เก็บระยะไกล

rm -rf ~/.m2/repository 
mvn compile

ตรวจสอบแพ็กเกจในคอนโซล

ไปที่ Cloud Console - Artifact Registry - Repositories คลิก maven-central-cache แล้วตรวจสอบว่าอาร์ติแฟกต์ของไบนารีอยู่ในแคชหรือไม่

9deea93caa5fefd7.png

4. ที่เก็บเสมือน

ที่เก็บเสมือนทำหน้าที่เป็นอินเทอร์เฟซสำหรับที่เก็บหลายที่สามารถเข้าถึงได้ผ่านการกำหนดค่าเดียว ซึ่งช่วยลดความซับซ้อนในการกำหนดค่าไคลเอ็นต์สำหรับผู้บริโภคที่ใช้อาร์ติแฟกต์และเพิ่มความปลอดภัยโดยการลดการโจมตีแบบ Dependency ทำให้เกิดความสับสน

สร้างไฟล์นโยบาย

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

สร้างที่เก็บเสมือน

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

ผสานรวมที่เก็บลงในโปรเจ็กต์ของคุณ

เรียกใช้คำสั่งต่อไปนี้เพื่อพิมพ์การกำหนดค่าที่เก็บเพื่อเพิ่มในโปรเจ็กต์ Java

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

แทนที่ส่วนที่เก็บทั้งหมดใน Pom ด้วยส่วนที่เก็บเสมือน 1 ส่วนจากเอาต์พุต

ตัวอย่าง: (ชื่อโปรเจ็กต์จะแตกต่างออกไปใน URL)

  ...


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


ดึงทรัพยากร Dependency จากที่เก็บเสมือน

เนื่องจากที่เก็บเสมือนเป็นช่องทางผ่านและจะไม่เก็บแพ็กเกจจริงใดๆ เพื่อแสดงให้เห็นถึงขั้นตอนอย่างชัดเจนที่คุณจะลบที่เก็บ maven-central-cache ที่สร้างก่อนหน้านี้และสร้างขึ้นใหม่ เพื่อเริ่มต้นอีกครั้งด้วยที่เก็บที่ว่างเปล่า

เรียกใช้คำสั่งต่อไปนี้เพื่อสร้างที่เก็บแคชใหม่

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

คุณตรวจสอบที่เก็บที่ว่างเปล่าได้ในคอนโซล ไปที่ Cloud Console - Artifact Registry - Repositories

ใช้ที่เก็บเสมือนด้วยการสร้างโปรเจ็กต์ด้วยคำสั่งต่อไปนี้

rm -rf ~/.m2/repository 
mvn compile

ตรวจสอบแพ็กเกจในคอนโซล

ไปที่ Cloud Console - Artifact Registry - Repositories คลิก maven-central-cache แล้วตรวจสอบว่าอาร์ติแฟกต์ไบนารีได้รับการกำหนดค่าให้ดึงจากที่เก็บเสมือน แต่ท้ายที่สุดแล้วถูกดึงจาก maven-central-cache

9deea93caa5fefd7.png

5. ยินดีด้วย

ยินดีด้วย คุณศึกษา Codelab จบแล้ว

สิ่งที่คุณได้ครอบคลุม

  • ที่เก็บมาตรฐานที่ใช้สำหรับการทำให้แพ็กเกจส่วนตัวของคุณใช้งานได้
  • ใช้ที่เก็บระยะไกลเพื่อแคชแพ็กเกจ Maven Central
  • ใช้ที่เก็บเสมือนเพื่อรวมที่เก็บอัปสตรีมหลายรายการไว้ในการกำหนดค่าเดียว

ล้างข้อมูล

เรียกใช้คำสั่งต่อไปนี้เพื่อลบโปรเจ็กต์

gcloud projects delete ${PROJECT_ID}

อัปเดตครั้งล่าสุด: 22/3/23