Mengamankan Penerapan GKE Anda dengan Otorisasi Biner

Google Kubernetes Engine dan model container yang mendasarinya memberikan peningkatan skalabilitas dan pengelolaan untuk aplikasi yang dihosting di Cloud. Lebih mudah dari sebelumnya untuk meluncurkan aplikasi perangkat lunak yang fleksibel sesuai dengan kebutuhan waktu proses sistem Anda.

Fleksibilitas ini, bagaimanapun, bisa datang dengan tantangan baru. Dalam lingkungan seperti itu, mungkin sulit untuk memastikan bahwa setiap komponen dibuat, diuji, dan dirilis sesuai dengan praktik dan standar terbaik Anda, dan hanya perangkat lunak resmi yang diterapkan ke lingkungan produksi Anda.

Binary Authorization (BinAuthz) adalah layanan yang bertujuan untuk mengurangi beberapa masalah ini dengan menambahkan penegakan kebijakan waktu penerapan ke cluster Kubernetes Engine Anda. Kebijakan dapat ditulis untuk meminta satu atau beberapa pihak tepercaya (disebut "attestor") untuk menyetujui gambar sebelum dapat diterapkan. Untuk pipeline penerapan multi-tahap di mana image berkembang dari pengembangan ke pengujian ke cluster produksi, attestor dapat digunakan untuk memastikan bahwa semua proses yang diperlukan telah selesai sebelum perangkat lunak berpindah ke tahap berikutnya.

Identitas attestor dibuat dan diverifikasi menggunakan kunci publik kriptografi, dan pengesahan ditandatangani secara digital menggunakan kunci privat yang sesuai. Ini memastikan bahwa hanya pihak tepercaya yang dapat mengizinkan penerapan perangkat lunak di lingkungan Anda.

Pada waktu penerapan, Otorisasi Biner memberlakukan kebijakan yang Anda tentukan dengan memeriksa bahwa gambar penampung telah melewati semua batasan yang diperlukan - termasuk bahwa semua pengesah yang diperlukan telah memverifikasi bahwa gambar tersebut siap untuk diterapkan. Jika gambar lolos, layanan memungkinkannya untuk diterapkan. Jika tidak, penerapan akan diblokir dan gambar tidak dapat diterapkan hingga sesuai.

866ef6a5bf86cf5.png

Apa yang Akan Anda Bangun

Codelab ini menjelaskan cara mengamankan cluster GKE menggunakan Binary Authorization. Untuk melakukan ini, Anda akan membuat kebijakan yang harus dipatuhi oleh semua penyebaran, dan menerapkannya ke cluster. Sebagai bagian dari pembuatan kebijakan, Anda akan membuat attestor yang dapat memverifikasi gambar container, dan menggunakannya untuk menandatangani dan menjalankan gambar kustom.

Tujuan dari codelab ini adalah untuk memberikan gambaran singkat tentang bagaimana penandatanganan kontainer bekerja dengan Otorisasi Biner. Dengan pengetahuan ini, Anda akan merasa nyaman membuat pipeline CI / CD yang aman, diamankan oleh attestor tepercaya.

Apa yang akan Anda Lea rn

  • Cara mengaktifkan Otorisasi Biner di cluster GKE
  • Cara menentukan kebijakan Otorisasi Biner
  • Cara membuat attestor dan mengaitkannya dengan kebijakan
  • Cara menandatangani gambar sebagai attestor

Apa yang Anda Butuhkan

Karena Otorisasi Biner menyangkut keamanan infrastruktur Anda, biasanya itu akan berinteraksi dengan banyak orang dengan tanggung jawab yang berbeda. Dalam codelab ini, Anda akan bertindak sebagai semuanya. Sebelum memulai, penting untuk menjelaskan berbagai peran yang akan Anda ambil:

4426da76922fea23.png Penerima :

  • Orang / proses ini bertanggung jawab untuk menjalankan kode di cluster.
  • Mereka tidak terlalu peduli dengan bagaimana jaminan keamanan diberlakukan, itu pekerjaan orang lain.
  • Mungkin seorang Insinyur Perangkat Lunak atau saluran pipa otomatis.

5b1748abb8d8b699.png Pembuat Kebijakan:

  • Orang ini bertanggung jawab atas gambaran besar kebijakan keamanan organisasi.
  • Tugas mereka adalah membuat daftar periksa aturan yang harus dilalui sebelum penampung dapat berjalan.
  • Mereka bertanggung jawab atas rantai kepercayaan, termasuk siapa yang perlu menandatangani gambar sebelum dianggap aman.
  • Mereka tidak selalu peduli dengan detail teknis tentang cara menyesuaikan diri dengan aturan. Mereka bahkan mungkin tidak tahu apa yang dilakukan perangkat lunak dalam wadah. Mereka hanya tahu tentang apa yang perlu dilakukan sebelum kepercayaan dapat dibangun.

dca98cc118cd9139.png Penyokong kebenaran

  • Orang / proses ini bertanggung jawab atas satu tautan dalam rantai kepercayaan sistem.
  • Mereka memegang kunci kriptografi, dan menandatangani gambar jika melewati proses persetujuan mereka.
  • Sementara Pembuat Kebijakan menentukan kebijakan dengan cara abstrak tingkat tinggi, Attestor bertanggung jawab untuk menegakkan beberapa aspek kebijakan secara konkret.
  • Mungkin orang sungguhan, seperti penguji QA atau manajer, atau mungkin bot dalam sistem CI.
  • Keamanan sistem bergantung pada kepercayaan mereka, jadi kunci privat mereka harus disimpan dengan aman.

Masing-masing peran ini dapat mewakili seorang individu, atau tim orang-orang di organisasi Anda. Dalam lingkungan produksi, peran ini kemungkinan akan dikelola oleh project Google Cloud Platform (GCP) terpisah, dan akses ke resource akan dibagikan di antara mereka secara terbatas menggunakan Cloud IAM .

a37eb2ed54b9c2eb.png

Sebagai Deployer:

Menyiapkan Lingkungan

Codelab ini dapat diselesaikan melalui browser web Anda menggunakan Google Cloud Shell. Klik tautan berikut untuk membuka sesi baru:

Buka Google Cloud Shell

Mengatur Proyek Anda

Langkah pertama kita adalah menyetelproject GCP tempat Anda ingin menjalankan codelab. Anda dapat menemukan daftar proyek di bawah akun Anda dengan perintah berikut:

gcloud projects list

Saat Anda mengetahui project mana yang ingin Anda gunakan, setel di variabel lingkungan sehingga Anda dapat menggunakannya untuk codelab lainnya:

PROJECT_ID=<YOUR_CHOSEN_PROJECT_ID>
gcloud config set project $PROJECT_ID

Membuat Direktori Kerja

Melalui codelab ini, Anda akan membuat beberapa file konfigurasi. Anda mungkin ingin membuat direktori baru untuk mengerjakan:

mkdir binauthz-codelab ; cd binauthz-codelab

Mengaktifkan API

Sebelum menggunakan Binary Authorization, Anda harus mengaktifkan API yang relevan di project GCP Anda:

//enable GKE to create and manage your cluster
gcloud services enable container.googleapis.com
//enable BinAuthz to manage a policy on the cluster
gcloud services enable binaryauthorization.googleapis.com
//enable KMS to manage cryptographic signing keys
gcloud services enable cloudkms.googleapis.com

Atau, Anda dapat mengaktifkan API untuk proyek Anda melalui Library API Google Cloud Platform .

Menyiapkan Cluster

Selanjutnya, siapkan cluster Kubernetes untukproject Anda melalui Kubernetes Engine. Perintah berikut akan membuat cluster baru bernama "binauthz-codelab" di zona us-central1-a dengan otorisasi biner diaktifkan:

gcloud beta container clusters create \
    --enable-binauthz \
    --zone us-central1-a \
    binauthz-codelab

Setelah cluster Anda dibuat, tambahkan ke lingkungan lokal Anda sehingga Anda dapat berinteraksi dengannya secara lokal menggunakan kubectl :

gcloud container clusters get-credentials binauthz-codelab --zone us-central1-a

Menjalankan Pod

Sekarang, mari tambahkan container ke cluster baru. Perintah berikut akan membuat Dockerfile sederhana yang dapat Anda gunakan:

cat << EOF > Dockerfile
   FROM alpine
   CMD tail -f /dev/null
EOF

Penampung ini tidak akan melakukan apa pun selain menjalankan perintah "tail -f / dev / null", yang akan membuatnya menunggu selamanya. Ini bukan wadah yang sangat berguna, tetapi ini akan memungkinkan Anda untuk menguji keamanan cluster Anda.

Buat penampung dan dorong ke Google Container Registry (GCR) :

#set the GCR path you will use to host the container image
CONTAINER_PATH=us.gcr.io/${PROJECT_ID}/hello-world

#build container
docker build -t $CONTAINER_PATH ./

#push to GCR
gcloud auth configure-docker --quiet
docker push $CONTAINER_PATH

Sekarang Anda dapat melihat penampung yang baru dibuat di antarmuka web Container Registry .

8d95f439df5fedb2.png

Sekarang, jalankan container di cluster Anda:

kubectl create deployment hello-world --image=$CONTAINER_PATH
.dll

Jika semuanya bekerja dengan baik, wadah Anda harus berjalan tanpa suara.

Anda dapat memverifikasi ini dengan mendaftar pod yang sedang berjalan:

kubectl get pods

a1724f9d39373710.png

Sebagai Pembuat Kebijakan:

Menambahkan Kebijakan

Anda sekarang memiliki cluster yang disiapkan dan menjalankan kode Anda. Sekarang, amankan cluster dengan kebijakan.

Langkah pertama adalah membuat file kebijakan:

cat > ./policy.yaml << EOM
    globalPolicyEvaluationMode: ENABLE
    defaultAdmissionRule:
      evaluationMode: ALWAYS_DENY
      enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
EOM

Kebijakan ini relatif sederhana. Baris globalPolicyEvaluationMode menyatakan bahwa kebijakan ini memperluas kebijakan global yang ditentukan oleh Google. Ini memungkinkan semua container GKE resmi dijalankan secara default. Selain itu, kebijakan tersebut mendeklarasikan defaultAdmissionRule yang menyatakan bahwa semua pod lainnya akan ditolak . Aturan admisi menyertakan bariscementMode , yang menyatakan bahwa semua pod yang tidak sesuai dengan aturan ini harus diblokir agar tidak dapat berjalan di cluster.

Untuk petunjuk tentang cara membuat kebijakan yang lebih kompleks, lihat dokumentasi Binary Authorization .

ce424657bce1501f.png

Sekarang, Anda dapat menerapkan kebijakan tersebut ke proyek Anda:

gcloud container binauthz policy import policy.yaml

Selain itu, kebijakan juga dapat disetel melalui UI Google Cloud Console .

Sebagai Deployer:

Menguji Kebijakan

Kebijakan baru Anda harus mencegah gambar container kustom apa pun untuk diterapkan di cluster. Anda dapat memverifikasi ini dengan menghapus pod Anda dan mencoba menjalankannya lagi:

kubectl delete deployment --all
kubectl delete event --all
kubectl create deployment hello-world --image=$CONTAINER_PATH

Jika Anda memeriksa cluster untuk pod, Anda akan melihat bahwa tidak ada pod yang berjalan saat ini:

kubectl get pods

Anda mungkin perlu menjalankan perintah untuk kedua kalinya untuk melihat pod menghilang. kubectl memeriksa pod terhadap kebijakan tersebut, menemukan bahwa pod tersebut tidak sesuai dengan aturan, dan menolaknya.

Anda dapat melihat penolakan tersebut terdaftar sebagai acara kubectl :

kubectl get event --template \
  '{{range.items}}{{"\033[0;36m"}}{{.reason}}:{{"\033[0m"}}{{.message}}{{"\n"}}{{end}}'

d57096ad40933ded.png

Attestor dalam Otorisasi Biner diterapkan di atas Cloud Container Analysis API , jadi penting untuk menjelaskan cara kerjanya sebelum melanjutkan. Container Analysis API dirancang untuk memungkinkan Anda mengaitkan metadata dengan gambar container tertentu.

Sebagai contoh, Catatan mungkin dibuat untuk melacak kerentanan Heartbleed . Vendor keamanan kemudian akan membuat pemindai untuk menguji gambar penampung untuk mengetahui kerentanannya, dan membuat Kejadian yang terkait dengan setiap penampung yang disusupi.

208aa5ebc53ff2b3.png

Bersamaan dengan kerentanan pelacakan, Analisis Penampung dirancang untuk menjadi API metadata umum. Otorisasi Biner menggunakan Analisis Penampung untuk mengaitkan tanda tangan dengan gambar penampung yang mereka verifikasi **. ** Catatan Analisis Penampung digunakan untuk mewakili satu attestor, dan Kejadian dibuat serta dikaitkan dengan setiap penampung yang telah disetujui attestor.

Binary Authorization API menggunakan konsep "attestor" dan "attestation", tetapi konsep ini diterapkan menggunakan Notes dan Occurrences yang sesuai di Container Analysis API.

63a701bd0057ea17.png

Saat ini, cluster akan melakukan penolakan penampung-semua pada semua gambar yang tidak berada di repositori resmi. Langkah Anda selanjutnya adalah membuat attestor, sehingga Anda dapat mengizinkan penampung tepercaya secara selektif.

Sebagai Attestor:

Membuat Catatan Analisis Penampung

36f8f5ade32507f7.png

Mulailah dengan membuat file JSON yang berisi data yang diperlukan untuk Note Anda. Perintah ini akan membuat file JSON yang berisi Catatan Anda secara lokal:

cat > ./create_note_request.json << EOM
{
  "attestation": {
    "hint": {
      "human_readable_name": "This note represents an attestation authority"
    }
  }
}
EOM

Sekarang, kirimkan Catatan ke proyek Anda menggunakan Container Analysis API:

NOTE_ID=my-attestor-note

curl -vvv -X POST \
    -H "Content-Type: application/json"  \
    -H "Authorization: Bearer $(gcloud auth print-access-token)"  \
    --data-binary @./create_note_request.json  \
    "https://containeranalysis.googleapis.com/v1/projects/${PROJECT_ID}/notes/?noteId=${NOTE_ID}"

Anda dapat memverifikasi bahwa Note telah disimpan dengan mengambilnya kembali:

curl -vvv  \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://containeranalysis.googleapis.com/v1/projects/${PROJECT_ID}/notes/${NOTE_ID}"

Membuat Attestor di Otorisasi Biner

af0267ab7f7757f9.png

Catatan Anda sekarang disimpan dalam Container Analysis API. Untuk menggunakan attestor Anda, Anda juga harus mendaftarkan catatan tersebut ke Binary Authorization:

ATTESTOR_ID=my-binauthz-attestor

gcloud container binauthz attestors create $ATTESTOR_ID \
    --attestation-authority-note=$NOTE_ID \
    --attestation-authority-note-project=${PROJECT_ID}

Untuk memverifikasi semuanya berfungsi seperti yang diharapkan, cetak daftar otoritas terdaftar:

gcloud container binauthz attestors list

9ef5aba66d1b06d3.png

Anda juga seharusnya dapat melihat attestor baru Anda melalui UI Google Cloud Console .

Menambahkan Peran IAM

Sebelum Anda dapat menggunakan attestor ini, Anda harus memberikan Otorisasi Biner izin yang sesuai untuk melihat Catatan Analisis Penampung yang Anda buat. Ini akan memungkinkan Otorisasi Biner untuk menanyakan API Analisis Penampung untuk memastikan bahwa setiap pod telah ditandatangani dan disetujui untuk dijalankan.

Izin di Otorisasi Biner ditangani melalui akun layanan yang dibuat secara otomatis.

Pertama, temukan alamat email akun layanan:

PROJECT_NUMBER=$(gcloud projects describe "${PROJECT_ID}"  --format="value(projectNumber)")
BINAUTHZ_SA_EMAIL="service-${PROJECT_NUMBER}@gcp-sa-binaryauthorization.iam.gserviceaccount.com"

Sekarang, gunakan untuk membuat permintaan Container Analysis IAM JSON:

cat > ./iam_request.json << EOM
{
  'resource': 'projects/${PROJECT_ID}/notes/${NOTE_ID}',
  'policy': {
    'bindings': [
      {
        'role': 'roles/containeranalysis.notes.occurrences.viewer',
        'members': [
          'serviceAccount:${BINAUTHZ_SA_EMAIL}'
        ]
      }
    ]
  }
}
EOM

Buat permintaan curl untuk memberikan peran IAM yang diperlukan:

curl -X POST  \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    --data-binary @./iam_request.json \
    "https://containeranalysis.googleapis.com/v1/projects/${PROJECT_ID}/notes/${NOTE_ID}:setIamPolicy"

Menambahkan Kunci KMS

1e3af7c177f7a311.png

Sebelum Anda dapat menggunakan attestor ini, otoritas Anda perlu membuat pasangan kunci kriptografi yang dapat digunakan untuk menandatangani gambar kontainer. Ini dapat dilakukan melalui Google Cloud Key Management Service (KMS) .

Pertama, tambahkan beberapa variabel lingkungan untuk mendeskripsikan kunci baru

KEY_LOCATION=global
KEYRING=binauthz-keys
KEY_NAME=codelab-key
KEY_VERSION=1

Buat gantungan kunci untuk menampung satu set kunci

gcloud kms keyrings create "${KEYRING}" --location="${KEY_LOCATION}"

Buat pasangan kunci penandatanganan asimetris baru untuk attestor

gcloud kms keys create "${KEY_NAME}" \
    --keyring="${KEYRING}" --location="${KEY_LOCATION}" \
    --purpose asymmetric-signing  --default-algorithm="ec-sign-p256-sha256"

Anda akan melihat kunci Anda muncul di halaman KMS Google Cloud Console. Sekarang, kaitkan kunci dengan otoritas Anda melalui perintah gcloud binauthz :

gcloud beta container binauthz attestors public-keys add  \
    --attestor="${ATTESTOR_ID}"  \
    --keyversion-project="${PROJECT_ID}"  \
    --keyversion-location="${KEY_LOCATION}" \
    --keyversion-keyring="${KEYRING}" \
    --keyversion-key="${KEY_NAME}" \
    --keyversion="${KEY_VERSION}"

Jika Anda mencetak daftar otoritas lagi, Anda sekarang akan melihat kunci terdaftar:

gcloud container binauthz attestors list

c5ad61fbf14f1885.png

Perhatikan bahwa beberapa kunci dapat didaftarkan untuk setiap otoritas. Ini bisa berguna jika otoritas mewakili sekelompok orang. Misalnya, siapa pun di tim QA dapat bertindak sebagai QA Attestor, dan menandatangani dengan kunci pribadi masing-masing.

Sebagai Attestor:

Sekarang setelah otoritas Anda diatur dan siap digunakan, Anda dapat menggunakannya untuk menandatangani gambar container yang Anda buat sebelumnya.

Membuat Pengesahan yang Ditandatangani

858d7e6feeb6f159.png

Pengesahan harus menyertakan tanda tangan kriptografi untuk menyatakan bahwa gambar container tertentu telah diverifikasi oleh attestor dan aman dijalankan di cluster Anda. Untuk menentukan gambar container mana yang akan diuji, Anda perlu menentukan intisasinya. Anda dapat menemukan intisari untuk tag penampung tertentu yang dihosting di Container Registry dengan menjalankan:

DIGEST=$(gcloud container images describe ${CONTAINER_PATH}:latest \
    --format='get(image_summary.digest)')

Sekarang, Anda dapat menggunakan gcloud untuk membuat pengesahan Anda. Perintah tersebut hanya mengambil detail kunci yang ingin Anda gunakan untuk penandatanganan, dan gambar container tertentu yang ingin Anda setujui

gcloud beta container binauthz attestations sign-and-create  \
    --artifact-url="${CONTAINER_PATH}@${DIGEST}" \
    --attestor="${ATTESTOR_ID}" \
    --attestor-project="${PROJECT_ID}" \
    --keyversion-project="${PROJECT_ID}" \
    --keyversion-location="${KEY_LOCATION}" \
    --keyversion-keyring="${KEYRING}" \
    --keyversion-key="${KEY_NAME}" \
    --keyversion="${KEY_VERSION}"

Dalam istilah Analisis Penampung , ini akan membuat kejadian baru, dan melampirkannya ke catatan attestor Anda. Untuk memastikan semuanya bekerja seperti yang diharapkan, Anda dapat membuat daftar pengesahan Anda

gcloud container binauthz attestations list \
   --attestor=$ATTESTOR_ID --attestor-project=${PROJECT_ID}

Sekarang, ketika Anda mencoba menjalankan gambar kontainer itu, Otorisasi Biner akan dapat menentukan bahwa itu ditandatangani dan diverifikasi oleh attestor dan aman untuk dijalankan

Sekarang setelah gambar Anda diverifikasi dengan aman oleh attestor, mari jalankan gambar di cluster.

Sebagai Pembuat Kebijakan:

Memperbarui Kebijakan

Saat ini, cluster Anda menjalankan kebijakan dengan satu aturan: izinkan container dari repositori resmi, dan tolak yang lainnya.

Ubah untuk mengizinkan gambar apa pun diverifikasi oleh attestor:

cat << EOF > updated_policy.yaml
    globalPolicyEvaluationMode: ENABLE
    defaultAdmissionRule:
      evaluationMode: REQUIRE_ATTESTATION
      enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
      requireAttestationsBy:
      - projects/${PROJECT_ID}/attestors/${ATTESTOR_ID}
EOF

Anda sekarang harus memiliki file baru di disk, bernama updated_policy.yaml. Sekarang, alih-alih aturan default yang menolak semua gambar, ini pertama-tama memeriksa attestor Anda untuk verifikasi.

822240fc0b02408e.png

Unggah kebijakan baru ke Otorisasi Biner:

gcloud container binauthz policy import updated_policy.yaml

Sebagai Deployer:

Menjalankan Gambar Terverifikasi

Selanjutnya Anda akan menjalankan gambar yang ditandatangani dan memverifikasi bahwa pod tersebut berjalan dengan perintah berikut:

kubectl create deployment hello-world-signed --image="${CONTAINER_PATH}@${DIGEST}"

Sekarang periksa untuk melihat apakah pod Anda sedang berjalan:

kubectl get pods

Anda akan melihat pod Anda telah lulus kebijakan dan berjalan di cluster.

Selamat! Anda sekarang dapat membuat jaminan keamanan khusus untuk cluster Anda dengan menambahkan aturan yang lebih kompleks ke kebijakan tersebut.

Hapus cluster:

gcloud container clusters delete binauthz-codelab --zone us-central1-a

Hapus gambar container:

gcloud container images delete $CONTAINER_PATH@$DIGEST --force-delete-tags

Hapus Attestor:

gcloud container binauthz attestors delete my-binauthz-attestor

Hapus sumber daya Analisis Penampung:

curl -vvv -X DELETE  \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://containeranalysis.googleapis.com/v1/projects/${PROJECT_ID}/notes/${NOTE_ID}"