Terjemahan artikel disiapkan khusus untuk siswa kursus Keamanan Linux .
Baca bagian pertama
5. Jangan Meninggalkan Data Sensitif dalam Gambar Docker
Terkadang saat membuat aplikasi di dalam gambar Docker, Anda memerlukan data sensitif seperti kunci SSH pribadi untuk mengekstraksi kode dari repositori pribadi atau token untuk menginstal paket tertutup. Jika Anda menyalinnya ke wadah Docker perantara, mereka di-cache di lapisan yang ditambahkan, bahkan jika Anda menghapusnya nanti. Token dan kunci ini harus disimpan di luar
Dockerfile
.
Gunakan bangunan multi-tahap
Menggunakan dukungan Docker untuk pembuatan multi-tahap, memanipulasi rahasia di lapisan tengah gambar, yang kemudian dihapus sehingga tidak ada data sensitif yang mencapai bangunan akhir. Gunakan kode berikut untuk menambahkan data rahasia ke middleware:
FROM: ubuntu as intermediate WORKDIR /app COPY secret/key /tmp/ RUN scp -i /tmp/key build@acme/files . FROM ubuntu WORKDIR /app COPY --from=intermediate /app .
Gunakan Perintah Rahasia Docker
Gunakan fungsi alfa di Docker untuk mengelola data sensitif untuk memasang file sensitif tanpa menyimpannya:
Anda dapat mempelajari lebih lanjut tentang mengelola data sensitif di situs web Docker.
Waspadalah terhadap penyalinan rekursif
Anda juga harus memperhatikan menyalin file ke gambar yang dibuat. Sebagai contoh, perintah berikut secara rekursif menyalin seluruh folder konteks perakitan ke gambar Docker, yang juga dapat mengakibatkan menyalin file sensitif:
COPY . .
Jika ada file sensitif di folder Anda, hapus atau gunakan
.dockerignore
untuk mengabaikannya:
private.key appsettings.json
6. Gunakan tag tetap untuk kekebalan
Setiap gambar Docker dapat memiliki beberapa tag yang mewakili variasi gambar yang sama. Tag yang paling umum adalah yang
latest
, mewakili versi terbaru dari suatu gambar. Tag gambar tidak dapat diubah, dan penulis gambar dapat mempublikasikan tag yang sama beberapa kali.
Ini berarti bahwa gambar dasar untuk file Docker Anda dapat berubah antar build. Ini dapat menyebabkan perilaku yang tidak terduga karena perubahan yang dilakukan pada gambar dasar.
Ada beberapa cara untuk memperbaiki masalah ini:
- Lebih suka tag paling spesifik yang tersedia. Jika gambar memiliki beberapa tag, seperti
:8
dan :8.0.1
atau bahkan :8.0.1-alpine
, lebih suka yang terakhir, karena ini adalah tautan yang paling spesifik ke gambar. Hindari menggunakan tag yang paling umum, seperti yang terbaru. Saat menyematkan tag tertentu, perlu diingat bahwa tag itu pada akhirnya dapat dihapus. - Untuk mengatasi masalah bahwa tag gambar tertentu menjadi tidak dapat diakses dan menjadi batas tampilan iklan untuk grup yang mengandalkannya, pertimbangkan untuk memulai mirror lokal dari gambar itu di registri atau akun yang berada di bawah kendali Anda sendiri. Penting untuk mempertimbangkan biaya pemeliharaan yang diperlukan untuk pendekatan ini, karena ini berarti Anda harus memelihara registri. Merupakan praktik yang baik untuk mereplikasi gambar yang ingin Anda gunakan di registri Anda untuk memastikan bahwa gambar yang Anda gunakan tidak berubah.
- Jadilah sangat spesifik! Alih-alih menarik tag, tarik gambar menggunakan tautan SHA256 tertentu ke gambar Docker, yang memastikan Anda mendapatkan gambar yang sama untuk setiap permintaan. Namun, perhatikan bahwa menggunakan tautan SHA256 dapat memiliki risiko berikut - jika gambar berubah, hash mungkin tidak lagi berfungsi.
7. Gunakan COPY sebagai ganti ADD
Docker menyediakan dua perintah untuk menyalin file dari host ke gambar Docker saat dibuat:
COPY
dan
ADD
. Perintah serupa di alam, tetapi berbeda dalam fungsinya:
- COPY - menyalin file lokal secara rekursif, menunjukkan sumber dan file target atau direktori. Dengan COPY Anda harus mendeklarasikan lokasi.
- ADD - menyalin file lokal secara rekursif, secara implisit membuat direktori tujuan jika tidak ada, dan menerima arsip sebagai URL lokal atau jauh sebagai sumber, yang diperluas atau dimuat, masing-masing, masing-masing, ke direktori tujuan.
Meskipun perbedaan antara ADD dan COPY tidak begitu mendasar, mereka penting. Waspadai mereka untuk menghindari kemungkinan masalah keamanan: - Ketika URL jarak jauh digunakan untuk mengunduh data langsung ke lokasi aslinya, ini dapat menyebabkan serangan broker yang memodifikasi konten file yang diunduh. Selain itu, asal dan keaslian URL jarak jauh harus diverifikasi lebih lanjut. Saat menggunakan COPY, sumber file yang akan diunduh dari URL jarak jauh harus dinyatakan melalui koneksi TLS yang aman, dan asalnya juga harus diverifikasi.
- Catatan tentang ruang dan lapisan gambar: menggunakan COPY memungkinkan Anda untuk memisahkan penambahan arsip dari lokasi yang jauh dan membukanya di lapisan yang berbeda, yang mengoptimalkan cache gambar. Jika file jarak jauh diperlukan, gabungkan semuanya menjadi satu perintah RUN, yang kemudian mengunduh, mengekstrak, dan membersihkan, mengoptimalkan operasi satu-lapisan pada beberapa lapisan yang akan diperlukan menggunakan ADD.
- Ketika arsip lokal digunakan, ADD secara otomatis mengekstraknya ke direktori tujuan. Meskipun ini mungkin dapat diterima, itu menambah risiko terkena bom ritsleting dan kerentanan Zip Slip , yang kemudian dapat diluncurkan secara otomatis.
8. Gunakan tag metadata
Label gambar memberikan metadata untuk gambar yang Anda buat. Ini membantu pengguna lebih mudah memahami cara menggunakan gambar. Tag yang paling umum adalah "pengelola," yang menunjukkan alamat email dan nama orang yang mendukung gambar ini. Tambahkan metadata menggunakan perintah
LABEL
berikut:
LABEL maintainer="me@acme.com"
Selain kontak pengelola, tambahkan metadata apa pun yang penting bagi Anda. Metadata ini dapat berisi: hash komit, tautan ke rakitan yang sesuai, status kualitas (apakah semua tes telah dilewati?), Kode sumber, tautan ke lokasi file SECURITY.TXT, dll.
Merupakan praktik yang baik untuk mendukung file
SECURITY.TXT (RFC5785), yang mengarah ke kebijakan Pengungkapan Bertanggung Jawab Anda untuk skema label Docker Anda saat menambahkan yang baru, misalnya:
LABEL securitytxt="https://www.example.com/.well-known/security.txt"
Lihat informasi label lainnya untuk gambar Docker:
https://label-schema.org/rc1/9. Gunakan unit multi-tahap untuk gambar kecil dan aman
Saat Anda membuat aplikasi menggunakan
Dockerfile
, banyak artefak dibuat yang hanya diperlukan pada waktu pembangunan. Ini bisa berupa alat pengembangan dan pustaka yang diperlukan untuk kompilasi, atau dependensi yang diperlukan untuk menjalankan tes unit, file sementara, rahasia, dll.
Menyimpan artefak ini dalam gambar dasar yang dapat digunakan dalam produksi mengarah pada peningkatan ukuran gambar Docker, yang dapat sangat mempengaruhi waktu yang diperlukan untuk mengunduhnya dan juga meningkatkan permukaan serangan, akibatnya lebih banyak paket yang akan diinstal. Hal yang sama berlaku untuk gambar Docker yang Anda gunakan - Anda mungkin perlu membangun gambar Docker tertentu, tetapi tidak menjalankan kode aplikasi Anda.
Golang adalah contoh yang bagus. Untuk membuat aplikasi Golang, Anda memerlukan kompiler Go. Kompiler membuat file yang dapat dieksekusi yang berjalan pada sistem operasi apa pun, tanpa ketergantungan, termasuk gambar bersih.
Ini adalah alasan bagus mengapa Docker memiliki kemampuan untuk membangun secara bertahap. Fungsi ini memungkinkan Anda untuk menggunakan beberapa gambar sementara selama proses perakitan, hanya menyimpan gambar terakhir bersama dengan informasi yang Anda salin ke dalamnya. Jadi, Anda memiliki dua gambar:
- Gambar pertama adalah ukuran yang sangat besar, ditambah dengan banyak dependensi yang digunakan untuk membuat aplikasi dan menjalankan tes.
- Gambar kedua sangat ringan dalam hal ukuran dan jumlah perpustakaan, hanya berisi salinan artefak yang diperlukan untuk menjalankan aplikasi dalam produksi.
10. Gunakan linter
Gunakan linter untuk menghindari kesalahan umum dan membangun praktik terbaik yang dapat diikuti oleh insinyur secara otomatis.
Salah satu linter adalah
hadolint . Ini menganalisis Dockerfile dan mengeluarkan peringatan tentang kesalahan yang tidak sesuai dengan rekomendasinya.

Hadolint menjadi lebih kuat ketika digunakan dalam lingkungan pengembangan terintegrasi (IDE). Misalnya, ketika menggunakan hadolint sebagai
ekstensi VSCode, kesalahan
linting muncul selama input. Ini membantu dalam menulis buruh pelabuhan terbaik lebih cepat.
Pelajari lebih lanjut tentang melindungi gambar Docker Anda.