Praktik terbaik keamanan yang memungkinkan

37

Saya akan memperkenalkan Ansible ke pusat data saya, dan saya sedang mencari beberapa praktik terbaik keamanan di mana menemukan mesin kontrol dan cara mengelola kunci SSH.

Pertanyaan 1: mesin kontrol

Kami tentu saja membutuhkan mesin kontrol. Mesin kontrol memiliki kunci SSH publik yang tersimpan di dalamnya. Jika penyerang memiliki akses ke mesin kontrol, ia berpotensi memiliki akses ke seluruh pusat data (atau ke server yang dikelola oleh Ansible). 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)?

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? Bagaimana cara mengamankannya dan menghindarinya menjadi "serangan tunggal"?

Pertanyaan 2: kunci SSH

Asumsikan bahwa saya perlu menggunakan Kemungkinan untuk membuat beberapa tugas yang perlu dijalankan oleh root (seperti menginstal paket perangkat lunak atau sesuatu seperti ini). Saya pikir praktik terbaik adalah tidak menggunakan pengguna root pada server yang dikendalikan, tetapi untuk menambahkan pengguna normal untuk Ansible dengan izin sudo. Tetapi, jika Ansible perlu melakukan hampir setiap tugas, ia harus memiliki akses ke setiap perintah melalui sudo. Jadi, apa pilihan terbaik:

  • biarkan Ansible menggunakan pengguna root (dengan kunci publik disimpan di ~/.ssh/authorized_keys
  • buat pengguna yang tidak memiliki hak khusus yang didedikasikan untuk Ansible dengan akses sudo
  • biarkan pengguna yang memungkinkan untuk menjalankan setiap perintah melalui sudo menentukan kata sandi (yang unik perlu diketahui oleh setiap sysadmin yang menggunakan yang dimungkinkan untuk mengontrol server itu)
  • biarkan pengguna yang memungkinkan untuk menjalankan setiap perintah melalui sudo tanpa menentukan kata sandi apa pun
  • ada petunjuk lain?
Tikar
sumber
Anda menginginkan subnet manajemen khusus (atau VLAN). komputer kontrol yang memungkinkan Anda ada di subnet itu. Jika Anda perlu berkomunikasi dengan komputer kontrol, Anda VPN ke subnet itu. Jangan biarkan menjadi root
Neil McGuigan
1
Host kontrol Ansible akan berada di LAN internal dan tidak akan dapat diakses dari luar, tapi saya pikir ini tidak cukup.
Mat

Jawaban:

15

Host bastion (pusat kontrol yang dimungkinkan) milik subnet terpisah. Seharusnya tidak dapat diakses langsung dari luar, tidak boleh langsung diakses dari server yang dikelola!

Laptop Anda adalah perangkat yang paling tidak aman. Satu email bodoh, satu flash flash kerentanan, satu Wifi tamu bodoh dan itu akan dikepung.

Untuk server, jangan izinkan akses root melalui ssh sama sekali. Banyak audit mengejek ini.

Untuk memungkinkan, biarkan setiap admin menggunakan akun pribadi mereka di setiap server target, dan biarkan mereka sudo dengan kata sandi. Dengan cara ini, tidak ada kata sandi yang dibagikan di antara dua orang. Anda dapat memeriksa siapa yang melakukan apa pada setiap server. Terserah Anda jika akun pribadi mengizinkan masuk dengan kata sandi, hanya kunci ssh, atau meminta keduanya.

Untuk mengklarifikasi yang mungkin tidak perlu menggunakan nama login target tunggal . Setiap admin dapat dan harus memiliki nama login target pribadi.

Catatan tambahan: Cobalah untuk tidak pernah membuat akun yang disebut kata (seperti "ansible" atau "admin" atau "cluster" atau "manajemen" atau "operator") jika memiliki kata sandi. Satu-satunya nama baik untuk akun yang memiliki kata sandi adalah nama manusia, seperti "jkowalski". Hanya manusia yang dapat bertanggung jawab atas tindakan yang dilakukan melalui akun dan bertanggung jawab untuk mengamankan kata sandi mereka secara tidak benar, "tidak mungkin" tidak bisa.

kubanczyk
sumber
Terima kasih, Anda meyakinkan saya tentang penggunaan host benteng yang terpusat di subnet terpisah di pusat data. Saya juga sadar bahwa yang terbaik adalah menggunakan satu pengguna pribadi per setiap sysadmin, tetapi sekarang saya memiliki pertanyaan lain (mungkin ini akan lebih baik pada pertanyaan Serverfault yang terpisah): bagaimana memusatkan pengguna dan kunci SSH pada host Linux tanpa menggunakan NIS, NFS berbagi atau sesuatu seperti ini? Harap dicatat bahwa saya sudah memiliki Active Directory untuk server Windows.
Mat
Oke, lebih baik memikirkan pertanyaan saya. Saya punya dua jawaban yang mungkin: gunakan penyimpanan kunci LDAP atau Userify (lihat dua jawaban di bawah). Tapi ... Apa aku benar-benar membutuhkannya? Tidak, jika saya menggunakan pengguna saya sendiri untuk menggunakan pengguna dan kunci baru melalui Ansible sendiri! :-)
Mat
@ Mat, setuju sepenuhnya - seperti yang saya katakan di bawah, Anda benar-benar tidak perlu Userify atau alat serupa sampai tim Anda menjadi lebih besar. (Itu membuatnya jauh lebih baik.) LDAP adalah jenis yang sulit untuk diinstal (riset pam_ldap dan nss_ldap), tetapi kami telah membangun alat untuk berintegrasi dalam hitungan detik dengan Ansible, Chef, Puppet, dll. Juga, gratis untuk <20 server.
Jamieson Becker
16

> 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!

Jamieson Becker
sumber
5

Jawaban 1: mesin kontrol

Sedikit dari keduanya, Anda dapat menggunakan laptop Anda untuk terhubung ke server melalui host benteng. sesuatu seperti:

Host private1
  IdentityFile ~/.ssh/rsa_private_key
  ProxyCommand ssh user@bastion -W %h:%p

Host bastion
  IdentityFile ~/.ssh/bastion_rsa_key

Lebih lanjut tentang Host bastion

Di mana Anda memiliki kunci untuk server benteng, dan kemudian kunci terpisah untuk tuan rumah di belakangnya. (secara pribadi saya akan menggunakan gpg-agent / ssh-agent)

Jawaban 2: Otentikasi

Saya tidak yakin bagaimana praktik terbaik khusus "mungkin" berbeda dari praktik terbaik koneksi ssh lainnya. Tapi tidak, Anda ingin menjalankan yang memungkinkan seperti diri Anda sendiri, bukan akun layanan dan bukan akun root.

Kombinasi dari otentikasi berikut:

Pikiran lain:

  • Selalu Simpan rahasia / informasi pribadi dalam brankas yang dimungkinkan.
  • Ansible tidak memerlukan SUDO / Root untuk dijalankan, kecuali apa yang Anda lakukan memerlukan sudo / root.
  • Mungkin dapat meningkatkan izin dengan berbagai cara

Terakhir, Anda tidak menyebutkan apa pun tentang windows. Jadi saya hanya bisa berasumsi Anda tidak menggunakan ini. Namun dalam hal ini saya akan menggunakan opsi delegasi agar laptop Anda menggunakan bastion host (delegate_to bastion.hostname.fqdn:) dan https kerberos / winrm dengan tiket kerberos.

Jika Anda melewatkannya, praktik terbaik untuk komputasi, jangan pernah melakukan apa pun sebagai root, selalu gunakan akun bernama

Jacob Evans
sumber