Bagaimana cara mengeraskan server SSH?

128

Tindakan apa yang dapat / harus saya ambil untuk memastikan bahwa keamanan di sekitar server SSH saya benar-benar tidak dapat ditembus?

Ini akan menjadi komunitas wiki sejak awal, jadi mari kita lihat apa yang dilakukan orang untuk mengamankan server mereka.

LassePoulsen
sumber
44
Impermeabilitas mutlak membutuhkan mematikan kotak.
Thorbjørn Ravn Andersen
Bagaimana jika Anda memiliki Wake-on-LAN?
rebus
Masalahnya adalah bagian LAN ... Paket wake-on-LAN tidak dialihkan, sehingga Anda harus memiliki akses ke mesin di dalam LAN untuk mengirim paket WOL ...
LassePoulsen
Untuk otentikasi kunci, Anda dapat membatasi Cipher ke cipher yang benar-benar Anda butuhkan.

Jawaban:

108

Gunakan pasangan kunci publik / pribadi untuk otentikasi alih-alih kata sandi.

  1. Buat kunci SSH yang dilindungi frasa sandi untuk setiap komputer yang perlu mengakses server:

    ssh-keygen

  2. Izin akses kunci publik SSH dari komputer yang diizinkan:

    Salin konten ~/.ssh/id_rsa.pubdari setiap komputer ke setiap jalur ~/.ssh/authorized_keysdi server, atau jalankan ssh-copy-id [server IP address]di setiap komputer yang Anda beri akses (Anda harus memasukkan kata sandi server saat diminta).

  3. Nonaktifkan akses SSH kata sandi:

    Buka /etc/ssh/sshd_config, cari baris yang mengatakan #PasswordAuthentication yes, dan ubah ke PasswordAuthentication no. Mulai ulang daemon server SSH untuk menerapkan perubahan ( sudo service ssh restart).

Sekarang, satu-satunya cara yang mungkin untuk SSH ke server adalah dengan menggunakan kunci yang cocok dengan garis masuk ~/.ssh/authorized_keys. Dengan menggunakan metode ini, saya tidak peduli dengan serangan brute force karena meskipun mereka menebak kata sandi saya, itu akan ditolak. Memaksa pasangan kunci publik / pribadi dengan kasar tidak mungkin dilakukan dengan teknologi saat ini.

Evan Kroske
sumber
5
-1: Umumnya akses diberikan kepada individu bukan komputer, membuat kunci untuk setiap komputer klien potensial yang terhubung ke server tidak masuk akal. Pernyataan terakhir Anda tidak benar, sesuai saran Anda dan karena Anda tidak menyarankan untuk menetapkan frasa sandi untuk kunci pribadi yang memiliki akses / kompromi dengan sistem klien mana pun secara otomatis akan memberikan akses ke server SSH. Otentikasi kunci SSH direkomendasikan tetapi kunci pribadi harus dilindungi dengan benar dan harus digunakan secara individual, tidak dalam cara yang didistribusikan seperti yang dijelaskan.
João Pinto
7
"Secara umum akses diberikan kepada masing-masing bukan komputer, membuat kunci untuk setiap komputer klien potensial yang terhubung ke server tidak masuk akal" Ada banyak pilihan dan saya pikir menggambarkan cara aman mentransfer kunci pribadi untuk setiap klien tampaknya di luar lingkup pertanyaan ini . Saya tidak menyajikan semua opsi, hanya opsi sederhana yang saya pikir orang bisa mengerti. "... harus digunakan secara individual, bukan dengan cara yang didistribusikan seperti yang dijelaskan" Ini tampaknya bertentangan dengan pernyataan Anda sebelumnya dan saya tidak menggambarkan apa pun yang didistribusikan.
Asa Ayers
5
"mustahil" mungkin sedikit berlebihan.
Thorbjørn Ravn Andersen
9
Inilah sebabnya saya mengatakan "tidak mungkin". Tidak ada yang memiliki komputer secepat ini sekecil ini atau sebanyak itu. "Bayangkan sebuah komputer seukuran sebutir pasir yang dapat menguji kunci terhadap beberapa data terenkripsi. Juga bayangkan bahwa ia dapat menguji kunci dalam jumlah waktu yang dibutuhkan cahaya untuk melintasinya. Kemudian pertimbangkan sekelompok komputer ini, begitu banyak sehingga jika Anda menutupi bumi dengan mereka, mereka akan menutupi seluruh planet hingga ketinggian 1 meter. Cluster komputer akan memecahkan kunci 128-bit rata-rata dalam 1.000 tahun. "
Asa Ayers
@ ThorbjørnRavnAndersen "Mustahil" tidak terlalu melebih-lebihkan, asalkan Anda menggunakan kunci yang kuat. Saya tidak dapat menemukan kutipan sekarang, tetapi dengan panjang kunci saat ini, serangan brute force tidak mungkin "sampai komputer terdiri dari sesuatu selain materi dan menempati sesuatu selain ruang".
Maximillian Laumeister
72

Saya akan menyarankan:

  • Menggunakan fail2ban untuk mencegah upaya masuk brute force.

  • Menonaktifkan masuk sebagai root melalui SSH. Ini berarti penyerang harus mengetahui nama pengguna dan kata sandi yang membuat serangan lebih sulit.

    Tambahkan PermitRootLogin noke /etc/ssh/sshd_config.

  • Membatasi pengguna yang dapat SSH ke server. Baik dengan grup atau hanya pengguna tertentu.

    Tambahkan AllowGroups group1 group2atau AllowUsers user1 user2untuk membatasi siapa yang dapat SSH ke server.

Mark Davidson
sumber
2
The AllowUsers dan AllowGroups tidak menerima koma , sebagai pembatas. Pastikan Anda tidak mencoba ini dari jarak jauh. Saya terus terkunci dari NAS saya dengan melakukan ini dengan tidak benar.
kebisingan tanpa suara
4
Selalu validasikansshd konfigurasi Anda sudah benar sebelum Anda memulai kembali sshd, untuk menghindari mengunci diri Anda dari mesin. Lihat blog ini untuk detailnya - jalankan saja sshd -Tsetelah perubahan konfigurasi sebelum memulai kembali yang utama sshd. Juga, minta sesi SSH terbuka pada mesin ketika Anda membuat perubahan konfigurasi, dan jangan tutup ini sampai Anda memvalidasi konfigurasi seperti yang disebutkan dan mungkin telah melakukan tes masuk SSH.
RichVel
24

Jawaban lain memberikan keamanan, tetapi ada satu hal yang dapat Anda lakukan yang akan membuat log Anda lebih tenang, dan memperkecil kemungkinan Anda akan dikunci dari akun Anda:

Pindahkan server dari port 22 ke yang lain. Baik di gateway Anda, atau di server.

Itu tidak meningkatkan keamanan, tetapi artinya semua pemindai internet acak tidak akan mengacaukan file log Anda.

Douglas Leeder
sumber
1
Bagi mereka yang percaya pada keamanan oleh obscurity ( en.wikipedia.org/wiki/Security_through_obscurity ) sangat masuk akal untuk menggunakan port lain. Saya tidak berpikir ..
LassePoulsen
32
Ini bukan tentang Keamanan Melalui Ketidakjelasan (meskipun ketidakjelasan dapat memiliki efek positif marjinal). Ini tentang mengurangi kebisingan latar belakang dari upaya brute force yang tak ada habisnya. Anda tidak dapat dengan berguna mengaudit log kegagalan akses Anda jika penuh dengan serangan otomatis; fail2ban tidak mengurangi volume cukup mengingat jumlah penyerang dan prevalensi didistribusikan (botnet) dan serangan throttled. Dengan ssh pada port yang tidak biasa, Anda tahu serangan yang Anda lihat di log berasal dari penyerang nyata yang tertarik pada kotak Anda. Saya sangat merekomendasikannya.
bobince
Karena Anda dapat meminta layanan internet seperti shodan untuk server ssh yang menghadap ke web, atau menggunakan nmap dan spanduk membuat perubahan port default menjadi sangat tidak berguna. saya akan menyarankan hal ini.
Lambat Loris
Shodan tidak mengambil semua port 65k jadi mengubah ke port tinggi kemungkinan akan menghapusnya dari pemindaian mereka. Juga jika Anda pindah ke port acak tinggi, penyerang kemungkinan akan perlu melakukan scan TCP 65K (sangat bising) untuk menemukan layanan Anda untuk mulai menyerang itu. Keduanya adalah kemenangan dari perspektif keamanan, jadi pindah ke pelabuhan tinggi umumnya merupakan rencana yang baik. Yang lain adalah bahwa dengan pindah ke port yang tinggi Anda dapat memiliki ide yang lebih baik bahwa seseorang yang menyerang Anda menargetkan sistem Anda secara khusus sebagai lawan dari hanya kebisingan latar belakang Internet yang umum
Rоry McCune
23

Aktifkan otentikasi dua faktor dengan HOTP atau TOTP . Ini tersedia mulai pukul 13.10 dan seterusnya.

Ini termasuk menggunakan otentikasi kunci publik melalui otentikasi kata sandi seperti dalam jawaban lain di sini, tetapi juga mengharuskan pengguna membuktikan bahwa dia memegang perangkat faktor-kedua selain kunci pribadinya.

Ringkasan:

  1. sudo apt-get install libpam-google-authenticator

  2. Mintalah setiap pengguna menjalankan google-authenticatorperintah, yang menghasilkan ~/.google-authenticatordan membantu mereka mengonfigurasi dua perangkat faktor mereka (mis. Aplikasi Google Authenticator Android).

  3. Edit /etc/ssh/sshd_configdan atur:

    ChallengeResponseAuthentication yes
    PasswordAuthentication no
    AuthenticationMethods publickey,keyboard-interactive
    
  4. Jalankan sudo service ssh reloaduntuk mengambil perubahan Anda /etc/ssh/sshd_config.

  5. Edit /etc/pam.d/sshddan ganti baris:

    @include common-auth
    

    dengan:

    auth required pam_google_authenticator.so
    

Rincian lebih lanjut tentang berbagai opsi konfigurasi adalah posting blog saya dari tahun lalu: Lebih baik otentikasi dua faktor ssh di Ubuntu .

Robie Basak
sumber
21

Buat sshd block IP klien yang gagal memberikan informasi login yang benar " DenyHØsts " dapat melakukan pekerjaan ini dengan cukup efektif. Saya telah menginstal ini pada semua kotak Linux saya yang dalam beberapa cara dapat dijangkau dari luar yang hebat.

Ini akan memastikan bahwa serangan paksa pada SSHD tidak akan efektif, tetapi ingat (!) Dengan cara ini Anda bisa mengunci diri sendiri jika Anda lupa kata sandi. Ini bisa menjadi masalah pada server jauh yang Anda tidak memiliki akses.

LassePoulsen
sumber
2
Apakah ada beberapa opsi seperti 10 upaya login yang gagal sebelum melarang alamat ip?
sayantankhan
20

Inilah satu hal mudah untuk dilakukan: instal ufw ("firewall tidak rumit") dan gunakan untuk menilai batas koneksi yang masuk.

Dari prompt perintah, ketik:

$ sudo ufw limit OpenSSH 

Jika ufw tidak diinstal, lakukan ini dan coba lagi:

$ sudo aptitude install ufw 

Banyak penyerang akan mencoba menggunakan server SSH Anda untuk memaksa kata sandi. Ini hanya akan memungkinkan 6 koneksi setiap 30 detik dari alamat IP yang sama.

mpontillo
sumber
+1 Batas penggunaan bisa bagus. Namun harus menunjukkan bahwa saya mengalami masalah ketika menggunakan server built in sftp karena membatasi koneksi untuk ini juga.
Mark Davidson
2
@ Mark - poin bagus, tapi bukankah itu terdengar seperti klien SFTP yang ditulis dengan buruk? Mengapa mereka terus terhubung kembali ke port SSH ketika mereka hanya bisa membuka lebih banyak saluran SSH?
mpontillo
12

Jika saya ingin memiliki keamanan tambahan atau perlu mengakses server SSH jauh di dalam beberapa jaringan perusahaan saya menyiapkan layanan tersembunyi dengan menggunakan perangkat lunak anonimisasi Tor .

  1. Instal Tor dan atur server SSH itu sendiri.
  2. Pastikan sshd hanya mendengarkan di localhost.
  3. Terbuka /etc/tor/torrc. Atur HiddenServiceDir /var/lib/tor/sshdan HiddenServicePort 22 127.0.0.1:22.
  4. Lihatlah var/lib/tor/ssh/hostname. Ada nama seperti d6frsudqtx123vxf.onion. Ini adalah alamat dari layanan tersembunyi.
  5. Buka $HOME/.ssh/configdan tambahkan beberapa baris:

    Host myhost
    HostName d6frsudqtx123vxf.onion
    ProxyCommand socat STDIO SOCKS4A:127.0.0.1:%h:%p,socksport=9050
    

Terlebih lagi saya membutuhkan Tor di host lokal saya. Jika sudah diinstal saya bisa masuk ssh myhostdan SSH membuka koneksi melalui Tor. Server SSH di sisi lain hanya membuka portalnya di localhost. Jadi tidak ada yang bisa menghubungkannya melalui "internet normal".

qbi
sumber
10
Keamanan dengan ketidakjelasan canggih, tetapi sangat menarik.
Johannes
8

Ada artikel Administrasi Debian tentang topik ini. Ini mencakup konfigurasi server SSH dasar dan juga aturan firewall. Ini bisa menarik juga untuk mengeraskan server SSH.

Lihat artikel di sana: Menjaga keamanan akses SSH .

Huygens
sumber
3
Agak terlambat, tetapi tolong, ketika menjawab pertanyaan, salin bagian-bagian penting dari sebuah tautan sehingga jika tautan itu meluruh, informasinya masih ada di sini.
umop aplsdn
1
Ide bagus. Meskipun saya melalui suatu periode dengan jauh lebih sedikit waktu untuk berpartisipasi. Jawaban saya adalah "komunitas wiki" jadi silakan menambahkan informasi tautan jika Anda punya waktu.
Huygens
6

Pendekatan saya terhadap pengerasan SSH adalah ... kompleks. Item-item berikut ini berkenaan dengan cara saya melakukannya, dari batas tepi jaringan saya ke server itu sendiri.

  1. Penyaringan lalu lintas tingkat perbatasan melalui IDS / IPS dengan pemindai dan tanda tangan layanan yang dikenal di daftar blokir. Saya mencapai ini dengan Snort melalui firewall perbatasan saya (ini adalah pendekatan saya, alat pfSense). Kadang-kadang, saya tidak bisa melakukan ini, seperti dengan VPS saya.

  2. Firewall / Penyaringan jaringan port SSH (s). Saya secara eksplisit hanya mengizinkan sistem tertentu untuk menjangkau ke server SSH saya. Ini dilakukan melalui firewall pfSense di perbatasan jaringan saya, atau firewall di setiap server yang secara eksplisit dikonfigurasikan. Ada kasus di mana saya tidak bisa melakukan ini, (yang hampir tidak pernah terjadi, kecuali di lingkungan pengujian pribadi atau laboratorium pengujian keamanan di mana firewall tidak akan membantu menguji hal-hal).

  3. Dalam hubungannya dengan pfSense saya, atau firewall perbatasan NAT-ing jaringan internal dan memisahkan dari Internet dan sistem, VPN-Only Akses ke Server . Harus VPN ke jaringan saya untuk sampai ke server, karena tidak ada port yang menghadap Internet seperti itu. Ini jelas tidak bekerja untuk semua VPS saya, tetapi dalam hubungannya dengan # 2, saya dapat memiliki satu VPS menjadi 'gateway' dengan VPN ke server itu, dan kemudian mengizinkan IP itu ke kotak lain. Dengan begitu, saya tahu persis apa yang bisa atau tidak bisa SSH dalam - satu kotak saya yaitu VPN. (Atau, di jaringan rumah saya di belakang pfSense, koneksi VPN saya, dan saya satu-satunya yang memiliki akses VPN).

  4. Di mana # 3 tidak bisa dilakukan, fail2ban, dikonfigurasi untuk memblokir setelah 4 upaya gagal dan memblokir IP selama satu jam atau lebih adalah perlindungan yang layak terhadap orang-orang yang terus-menerus menyerang dengan bruteforcing - cukup blokir mereka di firewall secara otomatis dengan fail2ban, dan meh. Mengkonfigurasi fail2ban adalah rasa sakit ...

  5. Kebingungan port dengan mengubah port SSH. Namun, ini BUKAN ide yang baik untuk dilakukan tanpa langkah-langkah keamanan tambahan juga - mantra "Keamanan melalui Ketidakjelasan" telah ditolak dan diperdebatkan dalam banyak kasus. Saya telah melakukan ini bersama dengan IDS / IPS dan penyaringan jaringan, tetapi masih sangat SANGAT buruk untuk dilakukan sendiri.

  6. WAJIB Otentikasi Dua Faktor, melalui solusi Otentikasi Dua Faktor Duo Security . Setiap server SSH saya memiliki Duo yang dikonfigurasikan, sehingga untuk dapat masuk, 2FA diminta terjadi, dan saya harus mengonfirmasi setiap akses. (Ini adalah fitur paling membantu - karena bahkan jika seseorang memiliki frasa sandi saya atau menerobos masuk, mereka tidak dapat melewati plugin Duo PAM). Ini adalah salah satu perlindungan terbesar pada server SSH saya dari akses tidak sah - setiap pengguna masuk HARUS mengikat kembali ke pengguna yang dikonfigurasikan di Duo, dan karena saya memiliki perangkat terbatas, tidak ada pengguna baru yang dapat terdaftar dalam sistem.

Dua sen saya untuk mengamankan SSH. Atau, setidaknya, pemikiran saya tentang pendekatan.

Thomas W.
sumber
1

Anda mungkin ingin checkout aplikasi FreeOTP dari RedHat daripada menggunakan Google Authenticator. Terkadang saat memperbarui aplikasi, mereka mengunci Anda! ;-)

Jika Anda ingin menggunakan token perangkat keras lain seperti Yubikey atau eToken PASS atau NG atau jika Anda memiliki banyak pengguna atau banyak server, Anda mungkin ingin menggunakan backend otentikasi dua faktor opensource.

Akhir-akhir ini saya menulis howto tentang ini .

cornelinux
sumber
0

Saya menulis tutorial kecil tentang melakukan ini baru-baru ini. Pada dasarnya, Anda harus menggunakan PKI dan tutorial saya juga menunjukkan cara menggunakan Otentikasi Dua Faktor untuk keamanan yang lebih tinggi. Bahkan jika Anda tidak menggunakan hal-hal itu, ada juga beberapa informasi tentang mengamankan server dengan menghapus suite cipher yang lemah dan dasar-dasar lainnya. https://joscor.com/blog/hardening-openssh-server-ubuntu-14-04/

01000101
sumber
0

Untuk sejumlah besar pengguna / sertifikat, pertimbangkan integrasi LDAP. Organisasi besar menggunakan LDAP sebagai repositori untuk kredensial dan sertifikat pengguna yang disimpan pada badge atau fobs, apakah sertifikat tersebut digunakan untuk otentikasi atau menandatangani email. Contohnya termasuk openLDAP, openDJ, Active Directory, Oracle Universal Directory, IBM Directory Server, snareWorks ...

Komputer dan grup juga dapat dikelola dalam LDAP yang memberikan manajemen kredensial sentral. Dengan begitu meja bantuan dapat memiliki toko serba ada untuk menangani populasi besar.

Berikut ini tautan ke integrasi centOS: http://itdavid.blogspot.com/2013/11/howto-configure-openssh-to-fetch-public.html

weller1
sumber
0

Anda juga dapat memblokir berdasarkan negara asal menggunakan basis data geoIP.

Pada dasarnya jika Anda tinggal di AS maka tidak ada alasan bagi seseorang di Rusia untuk terhubung ke SSH Anda sehingga mereka akan secara otomatis diblokir.

Skrip dapat ditemukan di sini: https://www.axllent.org/docs/view/ssh-geoip/

Anda juga dapat menambahkan perintah iptables ke dalamnya (saya lakukan untuk tetesan saya) untuk secara otomatis menjatuhkan semua lalu lintas ke / dari IP tersebut.

Michael A Mike
sumber
1
Kadang-kadang database GeoIP bisa salah - saya ditanya apakah saya di Moskow kemarin ... eh tidak! :)
Sean