Bảo mật nguồn cung cấp phần mềm

1. Tổng quan

Artifact Registry cho phép bạn lưu trữ nhiều loại cấu phần phần mềm, tạo nhiều kho lưu trữ trong một dự án và liên kết một khu vực hoặc nhiều khu vực cụ thể với từng kho lưu trữ. Có một số chế độ kho lưu trữ. Mỗi chế độ phục vụ một mục đích khác nhau. Sơ đồ dưới đây cho thấy một trong nhiều cách mà bạn có thể sử dụng cùng lúc các kho lưu trữ ở nhiều chế độ. Sơ đồ này cho thấy một quy trình làm việc giữa 2 dự án trên Google Cloud. Trong một dự án phát triển, nhà phát triển sẽ xây dựng một ứng dụng Java. Trong một dự án thời gian chạy riêng biệt, một bản dựng khác sẽ tạo hình ảnh vùng chứa bằng ứng dụng để triển khai cho Google Kubernetes Engine.

5af5e4da3ccfdff3.pngs

Trong phòng thí nghiệm này, bạn sẽ tìm hiểu cách thực hiện các thao tác sau.

  • Sử dụng Kho lưu trữ chuẩn để triển khai các gói riêng tư
  • Sử dụng Kho lưu trữ từ xa để lưu các gói trung tâm maven vào bộ nhớ đệm
  • Sử dụng Kho lưu trữ ảo để kết hợp nhiều kho lưu trữ ngược dòng trong một cấu hình

Thiết lập môi trường theo tiến độ riêng

  1. Đăng nhập vào Google Cloud Console rồi tạo dự án mới hoặc sử dụng lại dự án hiện có. Nếu chưa có tài khoản Gmail hoặc Google Workspace, bạn phải tạo một tài khoản.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Tên dự án là tên hiển thị của những người tham gia dự án này. Đây là một chuỗi ký tự không được API của Google sử dụng. Bạn có thể cập nhật thông tin này bất cứ lúc nào.
  • Mã dự án là duy nhất trong tất cả các dự án Google Cloud và không thể thay đổi (không thể thay đổi sau khi đã đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường bạn không quan tâm đến sản phẩm đó là gì. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham chiếu đến Mã dự án (mã này thường được xác định là PROJECT_ID). Nếu không thích mã đã tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Ngoài ra, bạn có thể thử phương pháp của riêng mình và xem có được cung cấp hay không. Bạn không thể thay đổi thông tin này sau bước này và thông báo đó sẽ vẫn tồn tại trong thời gian của dự án.
  • Đối với thông tin của bạn, có giá trị thứ ba, Project Number (Số dự án) mà một số API sử dụng. Tìm hiểu thêm về cả ba giá trị này trong tài liệu này.
  1. Tiếp theo, bạn sẽ phải bật tính năng thanh toán trong Cloud Console để sử dụng API/tài nguyên trên đám mây. Việc chạy qua lớp học lập trình này sẽ không tốn nhiều chi phí. Để tắt các tài nguyên nhằm tránh bị tính phí ngoài hướng dẫn này, bạn có thể xoá các tài nguyên bạn đã tạo hoặc xoá toàn bộ dự án. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí 300 USD.

Thiết lập Workspace

Thiết lập gcloud

Trong Cloud Shell, hãy đặt mã dự án và số dự án. Hãy lưu các biến này dưới dạng biến PROJECT_IDPROJECT_NUMBER.

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

Bật API

gcloud services enable artifactregistry.googleapis.com

Sao chép kho lưu trữ

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

2. Kho lưu trữ chuẩn

Kho lưu trữ chuẩn cung cấp cách thức lưu trữ các gói riêng tư và chia sẻ chúng trên các ứng dụng khác của bạn

Tạo kho lưu trữ maven chuẩn

Trên Cloud Shell, hãy chạy lệnh sau để tạo kho lưu trữ cho các cấu phần phần mềm Java:

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

Nhấp vào Cho phép nếu lời nhắc uỷ quyền Cloud Shell xuất hiện

Truy cập vào Google Cloud Console - Artifact Registry - Kho lưu trữ và lưu ý rằng kho lưu trữ Maven mới tạo có tên container-dev-java-repo. Nếu nhấp vào kho lưu trữ này, bạn có thể thấy kho lưu trữ này hiện đang trống.

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

Phải trả về phản hồi tương tự như sau

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'

Định cấu hình Maven cho Sổ đăng ký cấu phần phần mềm

Chạy lệnh sau để in cấu hình kho lưu trữ cần thêm vào dự án Java:

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

Lệnh trước đó trả về tệp xml để thêm vào tệp pom.xml của dự án.

  • Phần Repository (kho lưu trữ) chỉ định nơi Maven có thể tải các cấu phần phần mềm từ xa xuống để dự án hiện tại sử dụng.
  • Phần distributionManagement chỉ định kho lưu trữ từ xa mà dự án sẽ đẩy đến khi triển khai.
  • Phần extensions (phần mở rộng) thêm vào coroutineregistry-maven-wagon để bật lớp Xác thực và truyền tải cần thiết để kết nối với Artifact Registry
  • Lưu ý: Các tiện ích có thể tồn tại trong pom.xml hoặc extensions.xml. Trong trường hợp dự án phụ thuộc vào một dự án mẹ, các phần phụ thuộc đó sẽ được truy cập trước khi tải phần còn lại của các mục nhập trong tệp pom.xml. Để đảm bảo phần tử mẹ có quyền truy cập vào tiện ích này, bạn có thể đặt tiện ích này trong tệp extensions.xml được tải trước pom.xml, nhờ đó có thể sử dụng được các phần phụ thuộc mẹ.

Sao chép 3 phần, sau đó mở pom.xml trong Cloud Shell Editor và thêm các chế độ cài đặt được trả về vào cuối tệp ngay trong thẻ đóng project.

Mẹo: Trong Cloudshell, hãy chạy lệnh sau trong cửa sổ dòng lệnh để mở trình chỉnh sửa trong thư mục hiện tại.

cloudshell workspace .

Ví dụ: (tên dự án sẽ khác trong các 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>

Tải gói Java của bạn lên Artifact Registry

Khi Artifact Registry được định cấu hình trong Maven, giờ đây bạn có thể sử dụng Artifact Registry để lưu trữ các jar Java cho các dự án khác trong tổ chức của bạn.

Chạy lệnh sau để tải gói Java của bạn lên Artifact Registry:

mvn deploy -DskipTests

Nếu bạn muốn chạy lại lệnh này, hãy nhớ tăng phiên bản trong tệp pom.xml.

Kiểm tra gói Java trong Artifact Registry

Truy cập Cloud Console – Artifact Registry - Repositories Nhấp vào container-dev-java-repo và kiểm tra để đảm bảo cấu phần phần mềm nhị phân hello-world có:

147eac5168648db1.pngS

3. Kho lưu trữ từ xa

Kho lưu trữ từ xa cung cấp khả năng lưu các gói của bên thứ ba vào bộ nhớ đệm để tăng độ tin cậy và bảo mật.

Tạo kho lưu trữ từ xa

Lưu ý: Để biết thông tin chi tiết về việc xác thực và cấu hình, hãy xem tài liệu về sản phẩm.

Trên Cloud Shell, hãy chạy lệnh sau để tạo kho lưu trữ từ xa cho các cấu phần phần mềm 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

Xem lại kho lưu trữ trong bảng điều khiển

Truy cập vào Cloud Console – Artifact Registry - Repositories Hãy nhấp vào maven-central-cache. Bạn sẽ thấy thư này đã được tạo và hiện đang trống

Xem xét kho lưu trữ trong thiết bị đầu cuối

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

Tích hợp repo vào dự án của bạn

Chạy lệnh sau để in cấu hình kho lưu trữ cần thêm vào dự án Java:

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

Thêm phần kho lưu trữ vào tệp pom.xml. Đảm bảo không sao chép <Repository> bên ngoài thẻ khỏi dữ liệu đầu ra.

Thay đổi mã của kho lưu trữ mới được thêm thành "trung tâm" để đảm bảo mỗi mục nhập kho lưu trữ đều có một mã nhận dạng duy nhất.

Ví dụ: (tên dự án sẽ khác trong các 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>

Chạy các lệnh sau trong dòng lệnh để tạo extensions.xml cho dự án của bạn. Để sử dụng cơ chế tiện ích cốt lõi, đảm bảo Maven có thể phân giải các phần phụ thuộc mẹ hoặc trình bổ trợ từ 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

Lấy phần phụ thuộc từ Kho lưu trữ từ xa

Chạy lệnh sau để biên dịch ứng dụng bằng Kho lưu trữ từ xa:

rm -rf ~/.m2/repository 
mvn compile

Xem lại các gói trong bảng điều khiển

Truy cập Cloud Console – Artifact Registry - Repositories Nhấp vào maven-central-cache rồi kiểm tra để đảm bảo các cấu phần phần mềm nhị phân đã được lưu vào bộ nhớ đệm ở đó:

9deea93caa5fefd7.pngs

4. Kho lưu trữ ảo

Kho lưu trữ ảo đóng vai trò như một giao diện để truy cập vào nhiều kho lưu trữ thông qua một cấu hình duy nhất. Việc này giúp đơn giản hoá cấu hình ứng dụng cho người sử dụng cấu phần phần mềm, đồng thời tăng tính bảo mật bằng cách giảm thiểu các cuộc tấn công gây nhầm lẫn phần phụ thuộc.

Tạo tệp chính sách

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

Tạo kho lưu trữ ảo

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

Tích hợp repo vào dự án của bạn

Chạy lệnh sau để in cấu hình kho lưu trữ cần thêm vào dự án Java:

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

Thay thế toàn bộ phần kho lưu trữ trong pom bằng một phần kho lưu trữ ảo trong kết quả.

Ví dụ: (tên dự án sẽ khác trong các 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>


Lấy các phần phụ thuộc từ Kho lưu trữ ảo

Vì Kho lưu trữ ảo là một phương thức truyền qua và sẽ không lưu trữ bất kỳ gói thực tế nào, để minh hoạ rõ ràng quy trình bạn sẽ xoá kho lưu trữ maven-central-cache mà bạn đã tạo trước đó và tạo lại nó, để bắt đầu lại với một kho lưu trữ trống

Chạy các lệnh sau để tạo lại kho lưu trữ bộ nhớ đệm

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

Bạn có thể kiểm tra kho lưu trữ trống trong bảng điều khiển. Truy cập vào Cloud Console - Artifact Registry - Repositories

Bây giờ, hãy vận dụng kho lưu trữ ảo bằng cách xây dựng dự án bằng lệnh sau

rm -rf ~/.m2/repository 
mvn compile

Xem lại các gói trong bảng điều khiển

Truy cập Cloud Console – Artifact Registry - Repositories Nhấp vào maven-central-cache rồi kiểm tra để đảm bảo các cấu phần phần mềm nhị phân đã được định cấu hình để lấy từ kho lưu trữ ảo nhưng cuối cùng cũng được lấy từ maven-central-cache:

9deea93caa5fefd7.pngs

5. Xin chúc mừng!

Xin chúc mừng, bạn đã hoàn thành lớp học lập trình!

Nội dung bạn đã đề cập

  • Dùng kho lưu trữ chuẩn để triển khai các gói riêng tư của bạn
  • Sử dụng Kho lưu trữ từ xa để lưu các gói trung tâm maven vào bộ nhớ đệm
  • Đã sử dụng kho lưu trữ ảo để kết hợp nhiều kho lưu trữ ngược dòng trong một cấu hình

Dọn dẹp

Chạy lệnh sau để xoá dự án

gcloud projects delete ${PROJECT_ID}

Lần cập nhật gần đây nhất: 22/3/2023