Melewati rahasia ke wadah Docker

26

Saya memiliki gambar docker dasar yang digunakan untuk menjalankan perangkat lunak analisis gambar. Untuk setiap wadah yang dibuat dari gambar, ada satu set pengaturan konfigurasi yang beberapa di antaranya adalah rahasia (kunci enkripsi, informasi pelanggan, dll.) Yang digunakan oleh perangkat lunak untuk menganalisis dan mendistribusikan gambar yang diproses. Bagaimana saya bisa dengan aman menyampaikan rahasia ini ke sebuah wadah?

PrestonM
sumber
Gudang Hashicorp
030

Jawaban:

23

Anda memiliki 3 metode untuk mendapatkan rahasia aplikasi di dalam wadah buruh pelabuhan. 2 yang pertama melibatkan konfigurasi buruh pelabuhan. Yang terakhir adalah meminta aplikasi Anda secara langsung mengambil rahasia dari toko rahasia.

1 - Variabel lingkungan

Menurut panduan "The 12 Factor App" , rahasia hanyalah konfigurasi, dan mereka harus selalu diatur di lingkungan. Anda bisa mengatur rahasia Anda sebagai variabel lingkungan selama menjalankan buruh pelabuhan, dan aplikasi Anda mengaksesnya dari sana.

2 - Volume yang dipasang

Anda dapat memiliki semua rahasia Anda dalam konfigurasi / file rahasia tertentu, kemudian pasang itu ke instance Anda sebagai volume yang dipasang .

3 - Ambil dari toko rahasia

Seperti yang disebutkan @ 030, Anda dapat menggunakan Hashicorp Vault (atau "Amazon Secrets Manager", atau layanan apa pun seperti itu).
Aplikasi Anda, atau aplikasi sespan dapat mengambil rahasia yang dibutuhkan secara langsung, tanpa harus berurusan dengan konfigurasi apa pun pada wadah Docker. Metode ini akan memungkinkan Anda untuk menggunakan rahasia yang dibuat secara dinamis (fitur yang sangat menarik dari sistem tersebut) dan tanpa harus khawatir tentang rahasia yang dapat dilihat dari sistem file atau dari memeriksa variabel env dari wadah buruh pelabuhan.

Opini pribadi

Saya percaya variabel env adalah cara untuk pergi. Lebih mudah untuk mengelola, dan Anda masih dapat menarik dari toko rahasia seperti Hashicorp Vault, jika Anda memiliki CI Anda membangun sistem menarik rahasia selama membangun dan mengaturnya ketika Anda menyebarkan. Anda mendapatkan yang terbaik dari kedua dunia, dan manfaat tambahan dari pengembang Anda tidak perlu menulis kode aplikasi untuk mengambil rahasia. Pengembang harus fokus pada fungsi kode mereka, dan tidak berurusan dengan tugas admin seperti mengambil kata sandi.

Kode aplikasi Anda harus difokuskan pada fungsi aplikasi itu sendiri, dan tidak berurusan dengan tugas-tugas backend seperti mengambil kata sandi. Sama seperti 12 App faktor menyatakan.

Sunting: mengubah kalimat terakhir untuk menghapus implikasi silo-ing Pengembang vs SysAdmin. Tugas itu sendiri harus terpisah dari perspektif kode, tetapi DevOps adalah tentang orang yang sama mengingat dan tidak dibatasi.

Opini Pribadi (Pembaruan)

Per @ Dirk berkomentar luar biasa ( Melewati rahasia ke wadah Docker ), ada argumen yang sangat kuat untuk memprioritaskan toko rahasia di atas ENV vars, karena tidak ingin membocorkannya.

BoomShadow
sumber
2
Ini mempromosikan silo. DevOps melakukan berbagai hal bersama-sama alih-alih melemparkan sesuatu ke dinding.
030
2
Kode harus dikeluarkan dari komponen infrastruktur. Orang-orang yang sebenarnya dapat membuat kode otomatisasi infrastruktur dan basis kode aplikasi, tetapi tugas itu sendiri harus terpisah. Saya melihat kalimat terakhir dari jawaban asli saya adalah melenyapkan para devs, orang-orang. Itu adalah kesalahan. Saya akan mengeditnya agar lebih jelas.
BoomShadow
7
Menempatkan rahasia ke dalam variabel lingkungan menawarkan berbagai kemungkinan bagi mereka untuk dibocorkan. Beberapa contoh: Semua orang yang memiliki akses ke daemon Docker pada mesin yang menjalankan wadah dapat melihatnya menggunakan perintah inspectatau exec. Variabel lingkungan sering dibuang ke stdoutatau ke dalam file log ketika dijalankan dalam beberapa mode debug. Semua proses anak yang dilahirkan dapat membaca dan mengeksposnya yang mungkin di luar kendali Anda. Informasi lebih lanjut misalnya di sini: diogomonica.com/2017/03/27/…
Dirk
1
Saya juga bergulat dengan pertanyaan ini. Yang saya tidak mengerti adalah, bahkan jika Anda menggunakan kredensial kredensial untuk mengamankan rahasia Anda, Anda masih harus mengautentikasi untuk mendapatkan akses ke brankas itu, dan yang mungkin memerlukan beberapa rahasia. Kekhawatiran yang sama berlaku untuk menggunakan file KeyStore yang dilindungi kata sandi. Apakah kita selalu terjebak dengan melewati setidaknya "kepercayaan meta" di lingkungan?
Wheezil
1
@Wheezil, meta-kredensial lebih mudah diamankan daripada banyak kredensial tertentu. Anda dapat sering dan secara otomatis memutar kredensial meta. kredensial meta dapat menuju ke vault yang ada pada host yang diamankan dan dapat memiliki hal-hal seperti daftar putih ip sehingga hanya menerima koneksi dari subnet produksi Anda. Anda juga dapat memastikan bahwa vault menggunakan enkripsi saat istirahat dan enkripsi dalam penerbangan dan saling menyematkan sertifikat dan semua praktik terbaik lainnya yang membuat semuanya lebih aman.
simbo1905
1

Ada pilihan lain hanya menggunakan pipa:

docker run -d -i --name $n alpine sh -c 'read A; echo "[$A]"; exec some-server'
docker exec -i $n sh -c 'cat > /proc/1/fd/0' <<< _a_secret_

Pertama, buat daemon docker dengan -i, perintah read Aakan hang menunggu input dari /proc/1/fd/0; Kemudian jalankan perintah buruh pelabuhan kedua, baca rahasia dari stdin dan arahkan ke proses gantung terakhir.

James ZM Gao
sumber