Melakukan hardening pada keamanan cluster Anda

Dokumen ini menjelaskan cara meningkatkan keamanan cluster yang dibuat dengan Google Distributed Cloud (khusus software) di bare metal.

Mengamankan penampung menggunakan SELinux

Anda dapat mengamankan penampung dengan mengaktifkan SELinux, yang didukung untuk Red Hat Enterprise Linux (RHEL). Jika mesin host menjalankan RHEL dan Anda ingin mengaktifkan SELinux untuk cluster, Anda harus mengaktifkan SELinux di semua mesin host. Lihat mengamankan penampung menggunakan SELinux untuk mengetahui detailnya.

Menggunakan seccomp untuk membatasi penampung

Mode komputasi aman (seccomp) tersedia di Google Distributed Cloud versi 1.11 dan yang lebih baru. Menjalankan penampung dengan profil seccomp akan meningkatkan keamanan cluster Anda karena membatasi panggilan sistem yang diizinkan penampung untuk dilakukan ke kernel. Hal ini mengurangi kemungkinan kerentanan kernel dieksploitasi.

Profil seccomp default berisi daftar panggilan sistem yang diizinkan untuk dilakukan penampung. Semua panggilan sistem yang tidak ada dalam daftar tidak diizinkan. seccomp diaktifkan secara default di cluster versi 1.11 dan yang lebih tinggi. Artinya, semua penampung sistem dan beban kerja pelanggan dijalankan dengan profil seccomp default runtime penampung. Bahkan penampung dan beban kerja yang tidak menentukan profil seccomp dalam file konfigurasinya akan dikenai pembatasan seccomp.

Cara menonaktifkan seccomp di seluruh cluster atau pada workload tertentu

Anda hanya dapat menonaktifkan seccomp selama pembuatan cluster atau upgrade cluster. bmctl update tidak dapat digunakan untuk menonaktifkan fitur ini. Jika Anda ingin menonaktifkan seccomp dalam cluster, tambahkan bagian clusterSecurity berikut ke file konfigurasi cluster:

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: example
  namespace: cluster-example
spec:
...
  clusterSecurity:
    enableSeccomp: false
...

Jika beberapa workload Anda perlu menjalankan panggilan sistem yang diblokir seccomp secara default, Anda tidak perlu menonaktifkan seccomp di seluruh cluster. Sebagai gantinya, Anda dapat memilih workload tertentu untuk dijalankan di unconfined mode. Menjalankan beban kerja di unconfined mode akan membebaskan beban kerja tersebut dari batasan yang diterapkan profil seccomp pada seluruh cluster.

Untuk menjalankan penampung di unconfined mode, tambahkan bagian securityContext berikut ke manifes Pod:

apiVersion: v1
kind: Pod
....
spec:
  securityContext:
    seccompProfile:
      type: Unconfined
....

Jangan jalankan penampung sebagai pengguna root

Secara default, proses dalam penampung dijalankan sebagai root. Hal ini berpotensi menimbulkan masalah keamanan, karena jika proses keluar dari penampung, proses tersebut akan berjalan sebagai root di mesin host. Oleh karena itu, sebaiknya jalankan semua beban kerja Anda sebagai pengguna non-root.

Bagian berikut menjelaskan dua cara menjalankan penampung sebagai pengguna non-root.

Metode #1: tambahkan petunjuk USER di Dockerfile

Metode ini menggunakan Dockerfile untuk memastikan bahwa penampung tidak berjalan sebagai pengguna root. Di Dockerfile, Anda dapat menentukan pengguna yang akan menjalankan proses di dalam penampung. Cuplikan berikut dari Dockerfile menunjukkan cara melakukannya:

....

#Add a user with userid 8877 and name nonroot
RUN useradd −u 8877 nonroot

#Run Container as nonroot
USER nonroot
....

Dalam contoh ini, perintah Linux useradd -u membuat pengguna bernama nonroot di dalam penampung. Pengguna ini memiliki ID pengguna (UID) 8877.

Baris berikutnya di Dockerfile menjalankan perintah USER nonroot. Perintah ini menentukan bahwa mulai dari titik ini dalam image, perintah dijalankan sebagai pengguna nonroot.

Berikan izin ke UID 8877 agar proses penampung dapat dijalankan dengan benar untuk nonroot.

Metode #2: menambahkan kolom securityContext dalam file manifes Kubernetes

Metode ini menggunakan file manifes Kubernetes untuk memastikan bahwa penampung tidak berjalan sebagai pengguna root. Setelan keamanan ditentukan untuk Pod, dan setelan keamanan tersebut pada gilirannya diterapkan ke semua penampung dalam Pod.

Contoh berikut menunjukkan kutipan file manifes untuk Pod tertentu:

apiVersion: v1
kind: Pod
metadata:
  name: name-of-pod
spec:
  securityContext:
    runAsUser: 8877
    runAsGroup: 8877
....

Kolom runAsUser menentukan bahwa untuk setiap penampung di Pod, semua proses berjalan dengan ID pengguna 8877. Kolom runAsGroup menentukan bahwa proses ini memiliki ID grup utama (GID) 8877. Jangan lupa untuk memberikan izin yang diperlukan dan memadai ke UID 8877 sehingga proses penampung dapat dijalankan dengan benar.

Hal ini memastikan bahwa proses dalam penampung dijalankan sebagai UID 8877, yang memiliki hak istimewa lebih sedikit daripada root.

Penampung sistem di software Google Distributed Cloud khusus membantu menginstal dan mengelola cluster. UID dan GID yang digunakan oleh penampung ini dapat dikontrol oleh kolom startUIDRangeRootlessContainers dalam spesifikasi cluster. startUIDRangeRootlessContainers adalah kolom opsional yang, jika tidak ditentukan, memiliki nilai 2000. Nilai yang diizinkan untuk startUIDRangeRootlessContainers adalah 1000-57000. Nilai startUIDRangeRootlessContainers hanya dapat diubah selama upgrade. Penampung sistem menggunakan UID dan GID dalam rentang startUIDRangeRootlessContainers hingga startUIDRangeRootlessContainers + 2999.

Contoh berikut menunjukkan kutipan file manifes untuk resource Cluster:

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: name-of-cluster
spec:
 clusterSecurity:
    startUIDRangeRootlessContainers: 5000
...

Pilih nilai untuk startUIDRangeRootlessContainers sehingga ruang UID dan GID yang digunakan oleh penampung sistem tidak tumpang-tindih dengan ruang yang ditetapkan untuk beban kerja pengguna.

Cara menonaktifkan mode tanpa root

Mulai rilis Google Distributed Cloud 1.10, penampung platform kontrol Kubernetes dan penampung sistem berjalan sebagai pengguna non-root secara default. Google Distributed Cloud menetapkan UID dan GID pengguna ini dalam rentang 2000-4999. Namun, penetapan ini dapat menyebabkan masalah jika UID dan GID tersebut telah dialokasikan ke proses yang berjalan di dalam lingkungan Anda.

Mulai rilis 1.11, Anda dapat menonaktifkan mode tanpa root saat mengupgrade cluster. Jika mode tanpa root dinonaktifkan, penampung bidang kontrol Kubernetes dan penampung sistem akan berjalan sebagai pengguna root.

Untuk menonaktifkan mode tanpa root, lakukan langkah-langkah berikut:

  1. Tambahkan bagian clusterSecurity berikut ke file konfigurasi cluster:

    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
      name: example
      namespace: cluster-example
    spec:
    ...
      clusterSecurity:
        enableRootlessContainers: false
    ...
    
  2. Upgrade cluster Anda. Untuk mengetahui detailnya, lihat Mengupgrade cluster.

Membatasi kemampuan workload dalam modifikasi mandiri

Workload Kubernetes tertentu, terutama workload sistem, memiliki izin untuk menjalankan modifikasi mandiri Sebagai contoh, beberapa workload melakukan penskalaan otomatis secara vertikal. Meskipun berguna, ini akan memungkinkan penyerang yang telah menyusupi node untuk menjelajahi cluster lebih dalam lagi. Misalnya, penyerang dapat membuat workload pada node melakukan modifikasi mandiri untuk dijalankan sebagai akun layanan dengan hak istimewa yang berada di namespace yang sama.

Idealnya, workload seharusnya sejak awal tidak diizinkan untuk melakukan modifikasi mandiri. Jika memerlukan modifikasi mandiri, Anda dapat membatasi izin dengan menerapkan batasan Pemilah Komunikasi atau Pengontrol Kebijakan, seperti NoUpdateServiceAccount dari library open source Pemilah Komunikasi, yang memberikan beberapa solusi keamanan bermanfaat.

Saat Anda men-deploy kebijakan, biasanya Anda perlu mengizinkan pengontrol yang mengelola siklus proses cluster untuk mengabaikan kebijakan tersebut. Hal ini diperlukan agar pengontrol dapat membuat perubahan pada cluster, seperti menerapkan upgrade cluster. Misalnya, jika Anda men-deploy kebijakan NoUpdateServiceAccount di cluster, Anda harus menetapkan parameter berikut di Constraint:

parameters:
  allowedGroups:
  - system:masters
  allowedUsers: []

Menonaktifkan port hanya baca kubelet

Mulai rilis 1.15.0, Google Distributed Cloud menonaktifkan port 10255, port hanya baca kubelet, secara default. Semua workload pelanggan yang dikonfigurasi untuk membaca data dari port kubelet 10255 yang tidak aman ini harus dimigrasikan untuk menggunakan port kubelet 10250 yang aman.

Hanya cluster yang dibuat dengan versi 1.15.0 atau yang lebih tinggi yang menonaktifkan port ini secara default. Port hanya baca kubelet 10255 tetap dapat diakses untuk cluster yang dibuat dengan versi lebih rendah dari 1.15.0, bahkan setelah cluster diupgrade ke versi 1.15.0 atau yang lebih tinggi.

Perubahan ini dilakukan karena kubelet membocorkan informasi sensitivitas rendah melalui port 10255, yang tidak diautentikasi. Informasi tersebut mencakup informasi konfigurasi lengkap untuk semua Pod yang berjalan di Node, yang dapat bernilai bagi penyerang. API ini juga mengekspos metrik dan informasi status, yang dapat memberikan insight sensitif bisnis.

Menonaktifkan port hanya baca kubelet direkomendasikan oleh Tolok Ukur Kubernetes CIS.

Pemeliharaan

Memantau buletin keamanan dan mengupgrade cluster adalah tindakan keamanan penting yang harus dilakukan setelah cluster Anda aktif dan berjalan.

Memantau buletin keamanan

Tim keamanan GKE memublikasikan buletin keamanan untuk kerentanan tingkat keparahan tinggi dan kritis.

Buletin ini mengikuti skema penomoran kerentanan Google Cloud yang umum dan ditautkan dari halaman buletin Google Cloud utama dan catatan rilis.

Gunakan feed XML ini untuk berlangganan buletin keamanan untuk Google Kubernetes Engine (GKE) dan produk terkait. Berlangganan

Jika tindakan pelanggan diperlukan untuk mengatasi kerentanan tinggi dan kritis ini, Google akan menghubungi pelanggan melalui email. Selain itu, Google juga dapat menghubungi pelanggan untuk memberikan kontrak dukungan melalui saluran dukungan.

Untuk informasi selengkapnya tentang cara Google mengelola kerentanan dan patch keamanan untuk GKE dan GKE Enterprise, lihat Patching keamanan.

Mengupgrade cluster

Kubernetes secara rutin memperkenalkan fitur keamanan baru dan memberikan patch keamanan. Rilis Google Distributed Cloud menggabungkan peningkatan keamanan Kubernetes yang mengatasi kerentanan keamanan yang dapat memengaruhi cluster Anda.

Anda bertanggung jawab untuk terus mengupdate cluster. Untuk setiap rilis, tinjau catatan rilis. Untuk meminimalkan risiko keamanan pada cluster Anda, rencanakan untuk mengupdate ke rilis patch baru setiap bulan dan versi minor setiap empat bulan.

Salah satu dari banyak keuntungan mengupgrade cluster adalah file kubeconfig cluster akan otomatis dimuat ulang. File kubeconfig mengautentikasi pengguna ke cluster. File kubeconfig ditambahkan ke direktori cluster saat Anda membuat cluster dengan bmctl. Nama dan jalur default-nya adalah bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig. Saat Anda mengupgrade cluster, file kubeconfig cluster tersebut akan otomatis diperpanjang. Jika tidak, masa berlaku file kubeconfig akan berakhir satu tahun setelah dibuat.

Untuk mengetahui informasi tentang cara mengupgrade cluster, lihat mengupgrade cluster.

Menggunakan Kontrol Layanan VPC dengan Cloud Interconnect atau Cloud VPN

Cloud Interconnect menyediakan koneksi berlatensi rendah dan ketersediaan tinggi yang memungkinkan Anda mentransfer data dengan andal antara mesin bare metal lokal dan jaringan Virtual Private Cloud (VPC) Google Cloud. Untuk mempelajari Cloud Interconnect lebih lanjut, lihat Ringkasan penyediaan Dedicated Interconnect.

Cloud VPN menghubungkan jaringan peer dengan aman ke jaringan Virtual Private Cloud (VPC) Anda melalui koneksi IPsec VPN. Untuk mempelajari Cloud VPN lebih lanjut, lihat ringkasan Cloud VPN.

Kontrol Layanan VPC berfungsi dengan Cloud Interconnect atau Cloud VPN untuk memberikan keamanan tambahan bagi cluster Anda. Kontrol Layanan VPC membantu mengurangi risiko pemindahan data yang tidak sah. Dengan Kontrol Layanan VPC, Anda dapat menambahkan project ke perimeter layanan yang melindungi resource dan layanan dari permintaan yang berasal dari luar perimeter. Untuk mempelajari perimeter layanan lebih lanjut, lihat Detail dan konfigurasi perimeter layanan.

Untuk sepenuhnya melindungi cluster yang dibuat dengan Google Distributed Cloud, Anda perlu menggunakan VIP Terbatas dan menambahkan API berikut ke perimeter layanan:

  • Artifact Registry API (artifactregistry.googleapis.com)
  • Resource Manager API (cloudresourcemanager.googleapis.com)
  • Compute Engine API (compute.googleapis.com)
  • Connect gateway API (connectgateway.googleapis.com)
  • Google Container Registry API (containerregistry.googleapis.com)
  • GKE Connect API (gkeconnect.googleapis.com)
  • GKE Hub API (gkehub.googleapis.com)
  • GKE On-Prem API (gkeonprem.googleapis.com)
  • Identity and Access Management (IAM) API (iam.googleapis.com)
  • Cloud Logging API (logging.googleapis.com)
  • Cloud Monitoring API (monitoring.googleapis.com)
  • Config Monitoring for Ops API (opsconfigmonitoring.googleapis.com)
  • Service Control API (servicecontrol.googleapis.com)
  • Cloud Storage API (storage.googleapis.com)

Saat Anda menggunakan bmctl untuk membuat atau mengupgrade cluster, gunakan flag --skip-api-check untuk mengabaikan pemanggilan Service Usage API (serviceusage.googleapis.com). Service Usage API tidak didukung oleh Kontrol Layanan VPC.