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

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

Thông tin về lớp học lập trình này

subjectLần cập nhật gần đây nhất: thg 3 23, 2023
account_circleTác giả: Christopher Grant

1. Tổng quan

Cấu phần lưu trữ 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 hoặc nhiều khu vực cụ thể với mỗi 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ơ đồ sau đây cho thấy một trong nhiều cách bạn có thể sử dụng các kho lưu trữ ở nhiều chế độ cùng nhau. Sơ đồ này cho thấy quy trình làm việc trên hai dự án Google Cloud. Trong một dự án phát triển, nhà phát triển sẽ tạo một ứng dụng Java. Trong một dự án thời gian chạy riêng, một bản dựng khác sẽ tạo hình ảnh vùng chứa có ứng dụng để triển khai trên Google Kubernetes Engine.

5af5e4da3ccfdff3.png

Trong lớp học này, bạn sẽ tìm hiểu cách thực hiện các nhiệm vụ sau.

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

Thiết lập môi trường theo tốc độ của riêng bạn

  1. Đăng nhập vào Google Cloud Console rồi tạo một dự án mới hoặc sử dụng lại một 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ị cho 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 trên 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 thì bạn không cần quan tâm đến chuỗi này. 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 (thường được xác định là PROJECT_ID). Nếu không thích mã được tạo, bạn có thể tạo một mã ngẫu nhiên khác. Ngoài ra, bạn có thể thử dùng email của riêng mình để xem có thể sử dụng hay không. Bạn không thể thay đổi thông tin này sau bước này và thông tin này sẽ được giữ nguyên trong suốt thời gian của dự án.
  • Xin lưu ý rằng có một giá trị thứ ba là Mã 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.
  1. Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên/API trên Cloud. Việc tham gia lớp học lập trình này sẽ không tốn kém nhiều chi phí, nếu có. Để tắt các tài nguyên để không bị tính phí sau khi hoàn tất hướng dẫn này, bạn có thể xoá các tài nguyê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. 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 một cách để lưu trữ các gói riêng tư và chia sẻ các gói đó trên các ứng dụng khác

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ấ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 Uỷ quyền nếu lời nhắc uỷ quyền Cloud Shell xuất hiện

Chuyển đến Google Cloud Console – Cấu phần phần mềm đăng ký – Kho lưu trữ và lưu ý kho lưu trữ Maven mới tạo có tên là 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

Sẽ trả về một 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 Artifact Registry

Chạy lệnh sau để in cấu hình kho lưu trữ để 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ề xml để thêm vào pom.xml của dự án.

  • Mục 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.
  • Mục distributionManagement chỉ định kho lưu trữ từ xa mà dự án sẽ đẩy đến khi được triển khai.
  • Phần extensions (tiện ích) thêm vào artifactregistry-maven-wagon để bật lớp Xác thực và lớp truyền tải cần thiết để kết nối với Artifact Registry
  • Lưu ý: Các phần mở rộng 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 các mục còn lại trong pom.xml được tải. Để đảm bảo phần tử mẹ có quyền truy cập vào phần mở rộng, bạn có thể đặt phần mở rộng đó trong tệp extensions.xml được tải trước pom.xml, nhờ đó cung cấp phần mở rộng cho các phần phụ thuộc mẹ.

Sao chép ba phần, sau đó mở pom.xml trong Trình chỉnh sửa Cloud Shell và thêm chế độ cài đặt được trả về vào cuối tệp ngay bên trong thẻ project đóng.

Mẹo: Trong cloudshell, hãy chạy lệnh sau trong 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 của bạn sẽ khác trong 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 lên Cấu phần phần mềm lưu trữ

Khi đã định cấu hình Cấu phần phần mềm trong Maven, bạn hiện có thể sử dụng Cấu phần phần mềm để lưu trữ các tệp jar Java cho các dự án khác trong tổ chức của mình.

Chạy lệnh sau để tải gói Java lên Cấu phần phần mềm:

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 pom.xml.

Kiểm tra gói Java trong Cấu phần phần mềm lưu trữ

Chuyển đến Cloud Console – Artifact Registry – Repositories (Cloud Console – Cấu phần phần mềm – Kho lưu trữ). 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ó trong đó:

147eac5168648db1.png

3. Kho lưu trữ từ xa

Kho lưu trữ từ xa có 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à định 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

Chuyển đến Cloud Console – Artifact Registry – Repositories (Bảng điều khiển Google Cloud – Cấu phần phần mềm – Kho lưu trữ) Nhấp vào maven-central-cache và nhận thấy rằng kho lưu trữ này đã được tạo và hiện đang trống

Xem lại kho lưu trữ trong dòng lệnh

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

Tích hợp kho lưu trữ vào dự án

Chạy lệnh sau để in cấu hình kho lưu trữ nhằm 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 pom.xml. Hãy nhớ không sao chép thẻ <repositories> bên ngoài từ kết quả.

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

Ví dụ: (tên dự án của bạn sẽ khác trong 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 thiết bị đầu cuối để tạo extensions.xml cho dự án của bạn. Để sử dụng cơ chế tiện ích cốt lõi, hãy đảm bảo Maven có thể phân giải các phần phụ thuộc gốc hoặc trình bổ trợ từ Cấu phần phần mềm.

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

Kéo các 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

Chuyển đến Cloud Console – Artifact Registry – Repositories (Cloud Console – Cấu phần phần mềm – Kho lưu trữ) Nhấp vào maven-central-cache và kiểm tra để đảm bảo rằng các cấu phần phần mềm nhị phân được lưu vào bộ nhớ đệm tại đó:

9deea93caa5fefd7.png

4. Kho lưu trữ ảo

Kho lưu trữ ảo đóng vai trò là 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. Điều này giúp đơn giản hoá cấu hình ứng dụng cho người dùng cấu phần phần mềm và tăng cường 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 về 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 kho lưu trữ vào dự án

Chạy lệnh sau để in cấu hình kho lưu trữ để 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 từ kết quả.

Ví dụ: (tên dự án của bạn sẽ khác trong 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 phần phụ thuộc từ Kho lưu trữ ảo

Vì kho lưu trữ ảo là một đường truyền và sẽ không lưu trữ bất kỳ gói thực tế nào, nên để minh hoạ rõ ràng quá trình này, bạn sẽ xoá kho lưu trữ maven-central-cache mà bạn đã tạo trước đó và tạo lại kho lưu trữ đó để 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ể xem lại kho lưu trữ trống trong bảng điều khiển. Chuyển đến Cloud Console – Cấu phần phần mềm – Kho lưu trữ

Bây giờ, hãy thực hành kho lưu trữ ảo bằng cách tạo 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

Chuyển đến Cloud Console – Artifact Registry – Repositories (Bảng điều khiển trên đám mây – Cấu phần phần mềm – Kho lưu trữ). Nhấp vào maven-central-cache và kiểm tra để đảm bảo rằng 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 lấy từ maven-central-cache:

9deea93caa5fefd7.png

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

  • 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 maven central vào bộ nhớ đệm
  • Sử dụng Kho lưu trữ ảo để kết hợp nhiều kho lưu trữ thượng nguồn 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/23