banner
云野阁

云野阁

闲云野鹤,八方逍遥

dockerイメージリポジトリの構築(Harbor)

タスク目標#

  1. docker イメージリポジトリの構築を完了する

タスクプラットフォーム#

  1. 物理デバイス --
  2. オペレーティングシステム:openEuler 22.03 LTS SP2

デプロイガイド#

タスク 1:環境要件#

  1. ハードウェア構成

下の図は、Harbor のデプロイに必要な最低ハードウェア構成と推奨ハードウェア構成を示しています。

image-20240323215852040

  1. ネットワークポート

Harbor は、ターゲットホストで以下のポートを開くことを要求します。

ポートプロトコル備考
443HTTPSHarbor ポータルとコア API はこのポートで HTTPS リクエストを受け付けます
4443HTTPSHarbor 用の Docker コンテンツ信頼サービスに接続します
80HTTPHarbor ポータルとコア API はこのポートで HTTP リクエストを受け付けます

タスク 2:基本環境の準備#

タスク 3:デプロイ#

  1. Harbor のダウンロード#

wget https://github.com/goharbor/harbor/releases/download/v2.9.1/harbor-offline-installer-v2.9.1.tgz
#解凍
tar -vzxf harbor-offline-installer-v2.9.1.tgz
  1. HTTPS 証明書のインストール#

    1. 簡易版#
    #証明書ディレクトリを作成し、権限を付与
    mkdir -p /data/cert/
    chmod  -R 777 /data/cert/
    cd /data/cert
    #秘密鍵を作成
    openssl genrsa -des3 -out harbor.key 2048
    #CA証明書を生成、ipはローカルip
    openssl req -sha512 -new \
         -subj "/C=CN/ST=hennan/L=zhengzhou/O=qishi/OU=qishi/CN=images.store.net.crt" \
         -key harbor.key \
         -out harbor.csr
     #証明書をバックアップ
     cp harbor.key  harbor.key.org
     #パスワードなしの秘密鍵に変換
     openssl rsa -in harbor.key.org -out harbor.key
     #証明書を使用して署名
      openssl x509 -req -days 100000  -in harbor.csr -signkey harbor.key -out harbor.crt
    
    1. 公式版#
      #保存ディレクトリを作成
      mkdir -p /data/harbor-ca
      cd /data/harbor-ca
      
      • 証明書発行機関証明書を生成

      1. CA 証明書の秘密鍵を生成
      openssl genrsa -out ca.key 4096
      
      1. CA 証明書を生成
      #CNの後の内容はipまたはドメイン名
      openssl req -x509 -new -nodes -sha512 -days 3650 \
       -subj "/C=CN/ST=henan/L=zhengzhou/O=qishi/OU=qishi/CN=hub-docker.xxx.net" \
       -key ca.key \
       -out ca.crt
      
      • サーバー証明書を生成

      1. 秘密鍵を生成
      #ドメイン名またはip名
      openssl genrsa -out hub-docker.xxx.net.key 4096
      
      1. 証明書署名要求(CSR)を生成
      openssl req -sha512 -new \
          -subj "/C=CN/ST=henan/L=zhengzhou/O=qishi/OU=qishi/CN=hub-docker.xxx.net" \
          -key hub-docker.xxx.net.key \
          -out hub-docker.xxx.net.csr
      
      1. x509 v3 拡張ファイルを生成
      cat > v3.ext <<-EOF
      authorityKeyIdentifier=keyid,issuer
      basicConstraints=CA:FALSE
      keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
      extendedKeyUsage = serverAuth
      subjectAltName = @alt_names
      
      [alt_names]
      DNS.1=hub-docker.xxx.net
      DNS.2=hub-docker.xxx
      DNS.3=hub-docker
      EOF
      
      1. v3.ext を使用して証明書を生成
      openssl x509 -req -sha512 -days 3650 \
          -extfile v3.ext \
          -CA ca.crt -CAkey ca.key -CAcreateserial \
          -in hub-docker.xxx.net.csr \
          -out hub-docker.xxx.net.crt
      
      • Harbor と Docker に証明書を提供

        • サーバー証明書と秘密鍵を Harbor が使用する証明書のディレクトリにコピー
        #Harborが使用する証明書のディレクトリを作成
        mkdir -p /data/cert/
        #証明書をコピー
         cp hub-docker.xxx.net.crt /data/cert/
         cp hub-docker.xxx.net.key /data/cert/
        
        • Docker 用に証明書を変換

             openssl x509 -inform PEM -in hub-docker.xxx.net.crt -out hub-docker.xxx.net.cert
             #Docker用証明書の保存ディレクトリを作成、命名方式はip:ポート、またはドメイン
             mkdir -p /etc/docker/certs.d/hub-docker.xxx.net/
             #証明書をコピー
             cp hub-docker.xxx.net.cert /etc/docker/certs.d/hub-docker.xxx.net/
             cp hub-docker.xxx.net.key /etc/docker/certs.d/hub-docker.xxx.net/
             cp ca.crt /etc/docker/certs.d/hub-docker.xxx.net/
             #Dockerを再起動
             systemctl restart docker
          
  2. Harbor のインストール#

設定ファイルを変更

cp harbor.yml.tmpl harbor.yml
vi harbor.yml
#################################
hostname: hub-docker.xxx.net   #ローカルipまたはカスタムドメインに変更
http:
   port: 80 #ポートはカスタマイズ可能
https:   
   port: 443 #ポートはカスタマイズ可能
certificate: /data/harbor/harbor-ca/hub-docker.xxx.net.crt #証明書パス
private_key: /data/harbor/harbor-ca/hub-docker.xxx.net.key #秘密鍵パス
harbor_admin_password: Harbor12345 #ログインパスワード
data_volume: /data/harbor-data #データ保存ディレクトリ
#################################

インストールを実行

./install.sh  --with-trivy

ブラウザで ip とポートを入力してアクセス(hosts を追加した後、ドメインでアクセス)

image-20240323220017893

タスク 4:docker login の認証情報を暗号化する(イメージをプルするホスト)#

  1. pass をインストール
 #基本環境
 yum install -y make
#passのソースコードを取得
wget https://git.zx2c4.com/password-store/snapshot/password-store-1.7.4.tar.xz
#/usr/local/ディレクトリに解凍
tar Jxf password-store-1.7.4.tar.xz -C /usr/local/
#インストールを実行
cd /usr/local/password-store-1.7.4
make install
#確認
 pass version
  1. docker-credential-helpers をインストール
#go基本環境をインストール
yum -y install golang-1.17.3
#docker-credential-helpersのソースコードを取得
wget https://github.com/docker/docker-credential-helpers/archive/refs/tags/v0.8.0.tar.gz
tar -xf v0.8.0.tar.gz
 mv docker-credential-helpers-0.8.0 docker-credential-helpers
 cd docker-credential-helpers/
 #pass方式でインストール
 make pass
 cp bin/build/docker-credential-pass /usr/bin/
 chmod +x /usr/bin/docker-credential-pass
  1. パスワード設定ファイルを変更
#鍵ペアを生成
 gpg --full-generate-key
 #鍵を表示
 gpg --list-keys
 ##################################################
 /root/.gnupg/pubring.kbx
------------------------
pub   rsa3072 2023-11-30 [SC] [有効期限:2025-11-29]
      56CCF64EC289B13B1C0F14CCF2BB16136358AEA4
uid             [ 重要 ] qishi <[email protected]>
sub   rsa3072 2023-11-30 [E] [有効期限:2025-11-29]
##################################################
 #初期化
 pass init 56CCF64EC289B13B1C0F14CCF2BB16136358AEA4
 
 #dockerリポジトリにログインし、認証情報が暗号化されているか確認
 docker login hub-docker.xxx.net
 cat /root/.docker/config.json
 #######################################
 {
        "auths": {
                "hub-docker.xxx.net": {}
        },
        "credsStore": "pass"
}
 #######################################
 
  #パスワードストアの保存ファイルディレクトリを作成
  pass insert docker-credential-helpers/docker-pass-initialized-check
 #パスワードストアのリストを表示
  docker-credential-pass list
  #パスワードストアを確認
  yum install tree -y
  pass
  #実際のパスに基づく
  pass show docker-credential-helpers/aW1hZ2VzLnN0b3JlLm5ldA==/admin

タスク 5:イメージのアップロードとダウンロード(イメージをプルするホスト)#

イメージをプルおよびアップロードするホストで、daemon.json ファイルを変更し、Docker を再起動します。

vi /etc/docker/daemon.json
{
  "insecure-registries": ["hub-docker.xxx.net"] #ipまたはドメイン
}

systemctl restart docker

イメージをプルおよびアップロード

#テスト用にnginxイメージをプル
docker pull nginx
#タグを再付与、testはharborに存在するプロジェクト
docker tag nginx:latest 172.20.1.55/test/nginx-test:1.0
docker tag nginx:latest hub-docker.xxx.net/test/nginx-test:1.0
#リポジトリにログインし、ユーザー名とパスワードを入力
docker login 172.20.1.55
docker login hub-docker.xxx.net
systemctl restart docker
#イメージをリポジトリにプッシュ
docker push 172.20.1.55/test/nginx-test:1.0
docker push hub-docker.xxx.net/test/nginx-test:1.0
#イメージをプル
docker pull 172.20.1.55/test/nginx-test:1.0
docker pull hub-docker.xxx.net/test/nginx-test:1.0

タスク 6:cosign でイメージに署名する(イメージをプルするホスト)#

mkdir -p /data/cosign
#cosignをダウンロード、インストール
wget https://github.com/sigstore/cosign/releases/download/v2.2.2/cosign-2.2.2-1.x86_64.rpm
rpm -ivh cosign-2.2.2-1.x86_64.rpm
#arm
wget https://github.com/sigstore/cosign/releases/download/v2.2.2/cosign-2.2.2-1.aarch64.rpm
rpm -ivh cosign-2.2.2-1.aarch64.rpm
#インストールを確認
cosign version
#鍵を生成
cosign generate-key-pair
#イメージに対して暗号化署名を行う
cosign sign  --allow-insecure-registry --key /data/cosign/cosign.key images.store.net/test/test-nginx:1.0.0

#暗号化を検証
cosign  verify  --allow-insecure-registry --key /data/cosign/cosign.pub images.store.net/test/test-nginx:1.0.0
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。