Apakah aman untuk menyimpan kata sandi penting dalam variabel lingkungan server?

23

Saya memiliki sekelompok server, masing-masing dengan file konfigurasi yang saat ini berisi kata sandi teks-polos untuk sistem sensitif, misi-kritis (antrian pesan, penyimpanan data, dan layanan lainnya).

Beberapa orang memindahkan kata sandi penting dari file konfigurasi ke dalam variabel lingkungan dari akun pengguna di mana proses server dijalankan. Dengan cara ini, file konfigurasi dapat dikomit ke kontrol versi, dan administrator sistem hanya perlu membuat variabel lingkungan yang sesuai ketika sistem server diatur. Secara alami, akses ke akun yang menjalankan layanan ini sangat terbatas.

Apakah ini benar-benar cara terbaik untuk menghindari kata sandi dalam file konfigurasi teks biasa, atau adakah cara yang lebih baik?

Steve HHH
sumber
3
baik, perlu diingat, jika Anda menyimpannya sebagai variabel, itu dalam plaintext baik saat istirahat dan ketika pengguna menanyakannya. itu berarti bahwa jika Anda kehilangan sedikit kendali pada tingkat server, Anda telah menyerahkan kata sandi kepada penyerang. Saya mungkin akan menggunakan crypto, dan mendekripsi info kata sandi sesuai kebutuhan.
Frank Thomas
Pikiran yang bagus, Frank. Jika Anda menggunakan crypto, sistem seperti apa yang akan Anda gunakan? Sesuatu berdasarkan kunci RSA / SSH, alat gantungan kunci, atau yang lainnya? Kami saat ini menggunakan sistem Linux> 2.6 seperti CentOS dan Amazon.
Steve HHH

Jawaban:

11

Jika Anda menggunakan sistem Linux, lihat / proc / * /viron dan putuskan apakah variabel lingkungan adalah tempat yang baik untuk menyimpan informasi sensitif atau tidak. / proc / self adalah proses saat ini:

$ tr '\0' '\n' < /proc/self/environ
USER=me
LOGNAME=me
HOME=/home/me
PATH=/usr/bin:/bin:/usr/sbin:/sbin
MAIL=/var/mail/me
SHELL=/usr/bin/sh
SSH_CLIENT=1.2.3.4 58195 22
SSH_CONNECTION=1.2.3.4 58195 7.8.9.0 22
SSH_TTY=/dev/pts/1
TERM=xterm

Tidak masalah bahwa pengaturan variabel lingkungan mungkin membaca file di suatu tempat.

Yang perlu diingat adalah bahwa menggunakan kata sandi berarti kata sandi tersedia untuk program. Jika kata sandi ini tidak disediakan oleh pengguna yang mengetiknya setiap kali suatu program membutuhkannya, kata sandi itu harus dapat diakses hanya berdasarkan akses program. Anda dapat mengenkripsi kata sandi secara lokal dan membuat program mendekripsi menggunakan kunci, tetapi semua yang dilakukan adalah mengaburkan kata sandi terhadap pengungkapan yang tidak disengaja; seseorang yang memiliki akses yang sama dengan program dapat melakukan hal yang sama dengan yang dapat dilakukan oleh program, termasuk membaca kunci enkripsi.

Cara yang tepat untuk melakukan ini adalah menjalankan aplikasi sebagai akun terbatas, dan menyimpan kata sandi dalam file yang dilindungi dengan izin tingkat sistem file. Semoga Anda dapat "memasukkan" file atau sejenisnya untuk menjaga kata sandi dari sistem kontrol versi (dengan asumsi VCS tidak memiliki kontrol keamanan). Untuk melindungi dari pengungkapan yang tidak disengaja, mengaburkan kata sandi yang Anda inginkan - base64 menyandikannya, gunakan pgp untuk mengenkripsi, apa pun yang masuk akal dalam set pilihan program server Anda. Jika Anda menulis program untuk melakukan ini, hal terbaik yang dapat Anda lakukan adalah meminta pengguna untuk kata sandi hanya saat diperlukan, dan kemudian menghapus kata sandi itu dari memori segera setelah digunakan.

dannysauer
sumber
3
Ya, file dengan mode 0600 yang dimiliki oleh pengguna yang menjalankan program dapat diakses oleh orang yang sama yang dapat mengakses lingkungan program. Tetapi, seperti yang saya sebutkan, lingkungan mungkin dikonfigurasikan dengan membaca file, jadi menyalin data ke lingkungan hanya menambah jumlah tempat data tersedia. Dan lingkungannya, secara default, digandakan ke proses anak. Dan sejumlah program memiliki sarana eksternal untuk mencari variabel lingkungan, karena bug atau keputusan desain yang disengaja (pikirkan phpinfo ()). Jika suatu file akan terlibat, mengapa meningkatkan permukaan serangan?
dannysauer
1
Perintah tr yang Anda berikan tidak bekerja untuk saya - ini berhasil:cat /proc/self/environ | tr '\0' '\n'
robocat
Saya ada di ponsel saya sehingga sulit untuk mengatakan ... Itu seharusnya nol; apakah Anda mengetik huruf "o"?
dannysauer
8

Pada akhirnya, jika Anda memiliki data yang perlu dibaca serta ditulis , Anda akan akhirnya melindungi sesuatu dengan kata sandi (atau jika Anda benar - benar paranoid, dengan kartu pintar perangkat keras fisik fisik dan PIN), tidak peduli berapa banyak lapisan enkripsi yang Anda miliki.

Ini bermuara pada pertanyaan dasar keamanan sistem vs kenyamanan. Anda dapat menambahkan "pertahanan mendalam" dengan memiliki banyak dan banyak lapisan kontrol keamanan yang harus dilanggar oleh aktor jahat untuk sampai ke "barang", tetapi kemudian ketika aktor yang sah ingin membaca atau mengubah beberapa data, mereka harus melalui banyak simpai. Alternatifnya adalah kata sandi plaintext dalam file teks.

Apa yang akan saya lakukan jika saya benar-benar ingin melindungi beberapa informasi dalam sistem misi-kritis:

  1. Gunakan Enkripsi Disk Penuh, sehingga konten seluruh penyimpanan persisten dienkripsi.

  2. Batasi akses fisik ke mesin. Kunci sasis mesin dengan mekanisme penguncian yang aman dan kontrol akses fisik ke tombol. Sewa otot (penjaga bersenjata) untuk menjadi penjaga gerbang untuk akses.

  3. Menerapkan Kontrol Akses Wajib (MAC) berbutir halus dalam sistem operasi perangkat. Anda dapat mulai dengan sesuatu seperti SELinux di GNU / Linux dan mengaturnya untuk Penegakan, dan kemudian menyesuaikan kebijakan dengan kebutuhan yang tepat dari perangkat lunak produksi, memungkinkan akun-akun itu secara tepat (dan hanya) izin yang mereka butuhkan untuk file yang mereka butuhkan.

  4. Jika Anda akan memiliki kata sandi khusus sistem, dan kontrol versi untuk file konfigurasi, Anda benar-benar ingin menghindari kemungkinan kesalahan memiliki kata sandi plaintext yang secara keliru dikomit ke kontrol versi, karena mungkin sulit untuk mengeluarkan kata sandi yang bocor dari Cache VCS. Variabel lingkungan adalah salah satu dari beberapa opsi yang layak untuk itu. Yang lain adalah prompt kata sandi ketika program dijalankan, tetapi kemudian me-reboot mesin dan mengembalikan status operasional adalah upaya manual dan tidak dapat dilakukan secara mandiri, jadi ada kemudahan vs keamanan lagi.

  5. Pastikan Anda memiliki spesialis jaringan untuk menangani izin firewall, untuk meminimalkan paparan Anda terhadap serangan melalui jaringan. Audit (uji penetrasi serta papan tulis menguji kode) perangkat lunak apa pun yang berinteraksi dengan sistem eksternal, terutama Internet publik. "Antarmuka" tidak hanya mencakup koneksi jaringan langsung, tetapi juga membaca atau menulis data "tidak tepercaya" (data yang byte-bytenya berasal dari luar RAM / disk / CPU dari server aman).

Ini bukan daftar lengkap, tetapi terutama poin 4 mungkin relevan bagi Anda, meskipun jika Anda tidak melakukan setidaknya langkah 1 hingga 3, pertimbangan poin 4 dan poin 5 tidak akan banyak membantu Anda, karena Anda sistem tidak aman pada tingkat yang cukup mendasar.

allquixotic
sumber
Saya akan melewatkan # 1. Jika sistem sedang berjalan, sistem file sudah terpasang dan tidak dienkripsi. Jika tidak berjalan, kontrol akses fisik Anda harus memadai. Jika perlu di-boot ulang, Anda perlu seseorang untuk memberikan kunci dekripsi pada setiap boot (yang menjengkelkan), atau Anda perlu memiliki mesin yang menyediakannya - dalam hal ini kredensial biasanya juga tersedia untuk siapa saja yang memiliki akses ke hard drive. . Sebagian besar mesin "server" biasanya tidak menggunakan enkripsi disk karena biaya pertukaran itu. :)
dannysauer
"Ini bermuara pada pertanyaan dasar keamanan sistem vs kenyamanan" - dikutip dari jawaban saya - yang berlaku sama untuk komentar Anda. Anda tidak dapat memaksimalkan keamanan dan kenyamanan secara bersamaan.
allquixotic
1
# 1 penting dalam kasus beberapa potongan ram menyentuh disk (swapping) atau jika menyentuh sektor SSD yang kemudian menjadi "buruk" dan dipindahkan dari OS tetapi masih memegang potongan ram itu. bahkan ketika disk saat ini tidak dikunci, sebagian besar data akhirnya diacak pada piringan.
akira
3

Melewati kata sandi dalam variabel lingkungan sama amannya dengan membuat program membacanya dari file. Hanya proses yang berjalan karena pengguna yang sama dapat membaca lingkungan proses , dan proses ini diperbolehkan untuk membaca file yang sama.

Perhatikan bahwa ini berbeda dari melewatkan kata sandi pada baris perintah. Argumen baris perintah dapat dibaca oleh semua proses yang berjalan pada mesin yang sama (pembatasan langkah-langkah pengerasan), bukan hanya proses yang berjalan sebagai pengguna yang sama.

Jika Anda melewatkan variabel ke lingkungan, waspadalah jika program meluncurkan program lain. Program-program lain akan mewarisi lingkungan orang tua mereka. Jadi jangan lakukan ini jika Anda takut bahwa program lain mungkin secara tidak sengaja membocorkan isi lingkungan mereka.

Kelemahan dalam skenario Anda adalah "membuat variabel lingkungan yang sesuai ketika sistem server diatur". Variabel lingkungan adalah properti dinamis dari suatu proses. Anda tidak dapat membuatnya ketika mengatur sistem, tidak jika dengan mengatur Anda berarti sesuatu yang selamat dari reboot. Apa yang Anda maksud adalah mungkin bahwa administrator mengatur agar variabel ini hadir di lingkungan ketika pengguna tertentu masuk. Ini dilakukan melalui file konfigurasi (biasanya~/.pam_environment atau ~/.profileatau file dibaca dari ~/.profile). Jadi solusi ini tidak memindahkan kata sandi dari file konfigurasi.

Mengatur berbagai hal sehingga kata sandi ada dalam lingkungan waktu masuk pengguna bukanlah ide yang baik. Ini berarti bahwa setiap proses yang berjalan sebagai pengguna akan memiliki rahasia, sehingga rentan terhadap kebocoran di mana saja.

Kata sandi harus dimasukkan ke dalam file yang terpisah dari file konfigurasi yang berada di bawah kontrol versi dan dari mekanisme penyebaran normal. Tidak apa-apa untuk meletakkan kata sandi di lingkungan di beberapa titik jika itu nyaman, tetapi harus dilakukan untuk sekecil mungkin set program.

Gilles 'SANGAT berhenti menjadi jahat'
sumber