> Pertanyaan 1: mesin kontrol
Di Userify (pengungkapan penuh: kami benar-benar menawarkan perangkat lunak untuk mengelola kunci ssh), kami selalu berurusan dengan ini, karena kami juga menjalankan gudang kunci SSH terbesar. Kami biasanya merekomendasikan pemasangan lokal daripada menggunakan cloud, karena Anda telah meningkatkan kontrol, mengurangi luas permukaan Anda, Anda dapat benar-benar menguncinya ke jaringan yang hanya diketahui yang tepercaya.
Yang penting untuk diingat adalah bahwa, dalam sistem yang dibangun dengan baik seperti ini, seharusnya tidak ada rahasia penting yang dapat dibocorkan kepada penyerang. Jika seseorang menggerakkan forklift ke pusat data Anda dan berjalan pergi dengan server Anda, mereka tidak akan mendapatkan banyak kecuali untuk beberapa kata sandi hash, mungkin beberapa file sangat dienkripsi, dan beberapa kunci publik tanpa kunci pribadi yang sesuai. Dengan kata lain, tidak sebanyak itu.
Seperti yang Anda tunjukkan, vektor ancaman sebenarnya di sini adalah apa yang terjadi jika penyerang mendapatkan kendali atas mesin itu dan menggunakannya untuk menyebarkan akun pengguna mereka sendiri dan kunci (publik). Ini adalah risiko untuk hampir semua platform cloud (mis: Linode). Anda harus paling kuat berfokus pada mencegah akses ke bidang kontrol, yang berarti meminimalkan permukaan serangan (hanya mengekspos beberapa port, dan mengunci port tersebut sebanyak mungkin) dan lebih disukai menggunakan perangkat lunak yang diperkeras terhadap peningkatan hak istimewa dan berbagai serangan ( Injeksi SQL, XSS, CSRF, dll.) Memungkinkan akses 2FA / MFA ke bidang kontrol dan fokus pada penguncian bidang kontrol sebanyak mungkin.
Jadi apakah lebih baik memiliki mesin kontrol khusus di pusat data atau mesin remote control (seperti laptop saya yang terhubung jarak jauh ke pusat data)?
Ini jelas lebih baik untuk memiliki mesin kontrol khusus dalam datacenter aman, karena Anda dapat mengisolasi dan menguncinya bawah untuk mencegah / mengurangi resiko pencurian atau akses yang tidak sah.
Jika praktik terbaik adalah menggunakan laptop saya (yang bisa dicuri, tentu saja, tetapi saya dapat menyimpan kunci publik saya secara aman disimpan secara online di cloud atau offline di perangkat crypted portabel), bagaimana jika saya perlu menggunakan beberapa antarmuka web dengan Mungkin, seperti Ansible Tower, Semaphore, Rundeck atau Foreman yang perlu diinstal pada mesin terpusat ke pusat data?
Anda tidak perlu menjalankan antarmuka web APA PUN atau bidang kontrol sekunder untuk mengelola kunci Anda (bahkan Userify) sampai Anda menjadi cukup besar untuk mulai masuk ke masalah manajemen karena jumlah pengguna yang lebih besar dan tingkat otorisasi yang berbeda di seluruh server atau perlu tambahan berpegangan tangan untuk pengguna Anda yang mungkin tidak memiliki pengetahuan atau akses ke memungkinkan untuk memperbarui kunci. Userify pada awalnya tidak lebih dari sekelompok skrip shell (hari ini mereka mungkin, mungkin!) Dan tidak ada yang salah dengan itu, sampai Anda mulai membutuhkan kontrol manajemen tambahan dan cara mudah bagi orang untuk mengelola / memutar kunci sendiri. (Tentu saja, silakan lihat Userify jika Anda sampai ke titik itu!)
Bagaimana cara mengamankannya dan menghindarinya menjadi "serangan tunggal"?
Yah, tentu saja periksa semua sumber daya di internet untuk mengunci semuanya, tetapi yang paling penting mulai dengan dasar yang aman:
1. Rancang solusi Anda dengan mempertimbangkan keamanan sejak awal. Pilih teknologi (yaitu, basis data, atau bahasa) yang secara tradisional memiliki lebih sedikit masalah, dan kemudian kode dengan keamanan di depan-pikiran. Sanitasi semua data yang masuk, bahkan dari pengguna tepercaya. Paranoia adalah suatu kebajikan.
2. Akhirnya, semuanya rusak. Minimalkan kerusakan ketika itu terjadi: seperti yang telah Anda tunjukkan, cobalah untuk meminimalkan penanganan bahan rahasia.
3. Tetap sederhana. Jangan lakukan hal-hal eksotis terbaru kecuali Anda yakin itu akan meningkatkan keamanan Anda secara terukur dan terbukti. Sebagai contoh, kami memilih X25519 / NaCl (libsodium) di atas AES untuk lapisan enkripsi kami (kami mengenkripsi semuanya, diam dan bergerak), karena ini awalnya dirancang dan ditulis oleh seseorang yang kami percayai (DJB et al) dan ditinjau oleh dunia peneliti terkenal seperti Schneier dan tim keamanan Google. Gunakan hal-hal yang cenderung ke arah kesederhanaan jika mereka lebih baru, karena kesederhanaan membuatnya lebih sulit untuk menyembunyikan bug yang dalam.
4. Memenuhi standar keamanan. Bahkan jika Anda tidak jatuh ke dalam rezim keamanan seperti PCI atau Aturan Keamanan HIPAA, bacalah standar-standar itu dan cari tahu bagaimana cara memenuhi mereka atau setidaknya kontrol kompensasi yang sangat kuat. Ini akan membantu memastikan bahwa Anda benar-benar memenuhi 'praktik terbaik'.
5. Bawa pengujian penetrasi luar / independen dan jalankan karunia bug untuk memastikan Anda mengikuti praktik terbaik tersebut secara berkelanjutan. Semuanya tampak hebat sampai Anda mendapatkan orang yang cerdas dan bermotivasi tinggi menggedornya ... begitu selesai, Anda akan memiliki kepercayaan diri yang besar pada solusi Anda.
Pertanyaan 2: kunci SSH Apa pilihan terbaik: biarkan Ansible menggunakan pengguna root (dengan kunci publik disimpan di ~/.ssh/authorized_keys
/ biarkan pengguna Ansible untuk menjalankan setiap perintah melalui sudo menentukan kata sandi (yang unik perlu diketahui oleh setiap sysadmin) yang menggunakan Kemungkinan untuk mengontrol server itu)
Cobalah untuk tidak pernah menggunakan kata sandi di server, bahkan untuk sudo. Itu berhubungan dengan rahasia dan pada akhirnya akan merusak keamanan Anda (Anda tidak dapat benar-benar mengubah kata sandi sudo antara mesin dengan sangat mudah, Anda harus menyimpannya di suatu tempat, kata sandi berarti Anda tidak dapat benar-benar melakukan otomatisasi server-ke-server yang persis apa itu semua. Juga, jika Anda meninggalkan SSH di default-nya, kata sandi itu bisa kasar dipaksa, yang membuat kunci agak tidak berarti. Juga, hindari penggunaan pengguna root untuk tujuan apa pun, dan terutama login jarak jauh.
Buat pengguna yang tidak memiliki hak khusus yang didedikasikan untuk Ansible dengan akses sudo / biarkan pengguna yang memungkinkan untuk menjalankan setiap perintah melalui sudo tanpa menentukan kata sandi apa pun
Persis. Pengguna tidakrivasi yang dapat Anda audit kembali ke yang memungkinkan, dengan peran sudo. Idealnya, buat pengguna standar yang didedikasikan untuk komunikasi server-ke-server / yang dimungkinkan dengan akses sudo (tanpa kata sandi).
... NB, jika Anda menggunakan Userify, cara yang saya sarankan lakukan adalah membuat pengguna Userify untuk dimungkinkan (Anda juga dapat memecah ini oleh proyek atau bahkan grup server jika Anda memiliki beberapa mesin kontrol yang mungkin), menghasilkan kunci SSH pada server kontrol, dan berikan kunci publik di halaman profil Userify. (Kotak teks ini pada dasarnya menjadi /home/ansible/.ssh/authorized_keys
). Anda harus memisahkan akun sistem yang mungkin dari akun sistem server-ke-server lain seperti akun cadangan jarak jauh, manajemen rahasia, dll. Kemudian undang orang-orang Anda dan mereka dapat membuat dan mengelola kunci mereka sendiri juga dan semuanya tetap terpisah. Tapi, seperti halnya dengan mengunci server kontrol Ansible, cobalah untuk mengunci server Userify Anda (atau solusi apa pun yang Anda gunakan) dengan cara yang sama.
ada petunjuk lain?
Saya pikir Anda pasti akan melakukan ini dengan cara yang benar dan mengajukan pertanyaan yang tepat. Jika Anda ingin membahas hal semacam ini, kirimkan email kepada saya (titik pertama nama belakang di userify) dan saya akan senang mengobrol tanpa peduli ke arah mana Anda akhirnya mengejar. Semoga berhasil!