GNU/Linux >> Belajar Linux >  >> Linux

Bastion server:gunakan penerusan TCP VS dengan menempatkan kunci pribadi di server

Gunakan ProxyCommand atau ProxyJump

Saya akan merekomendasikan untuk menggunakan ProxyCommand (atau bahkan lebih baik ProxyJump karena sintaksnya lebih mudah tetapi membutuhkan openssh 7.3+ menurut saya di sisi klien), dan Anda tidak perlu menggunakan kunci pribadi di Bastion, semuanya tetap lokal.

Contoh dengan ProxyJump

Di komputer klien Anda, Anda menulis file di bawah ~/.ssh/config dengan konten yang mirip dengan di bawah ini:

Host bastion
  HostName bastion.example.com
  User bastion-user
  Port 22
  IdentityFile ~/.ssh/id_bastion

Host srvC
  HostName srvC.local
  User server-user
  IdentityFile ~/.ssh/id_protected_lan
  ProxyJump bastion

Kemudian lakukan ssh srvC akan menghubungkan Anda ke C melalui B (bastion) tanpa Penerusan Agen atau menerapkan kunci pribadi ke bastion.

Pada contoh di atas, "bastion" adalah alias untuk host Bastion Anda dan srvC adalah alias untuk server Anda C. Di HostName Anda perlu memasukkan IP atau nama domain yang benar-benar memenuhi syarat untuk host Anda. Untuk pengguna, Anda perlu memperbarui User untuk nama login yang benar di Bastion dan server C. Terakhir IdentityFile bersifat opsional jika Anda menggunakan agen lokal (mis. KeeAgent atau ssh-agent), tetapi jika tidak berjalan maka agen tersebut juga akan berfungsi dan menanyakan setiap frasa sandi kunci.

Menerapkan kunci publik

Tentu saja Anda perlu menerapkan publik kunci untuk bastion dan srvC. Anda dapat menggunakan (tanda $ hanya untuk mengilustrasikan prompt, jangan mengetiknya):

$ ssh-copy-id -i ~/.ssh/id_bastion.pub \
   -o PreferredAuthentications=password \
   -o PubkeyAuthentication=no \
   bastion
$ ssh-copy-id -i ~/.ssh/id_protected_lan.pub \
   -o PreferredAuthentications=password \
   -o PubkeyAuthentication=no \
   srvC

Catatan:hal di atas hanya akan berfungsi jika autentikasi kata sandi masih diizinkan. Setelah penerapan di atas dan memverifikasi bahwa semuanya berfungsi sebagaimana mestinya, Anda harus melarang autentikasi sandi di 2 server.

Contoh dengan ProxyCommand, bukan ProxyJump

Jika Anda memiliki OpenSSH versi lama yang tidak mendukung ProxyJump (di sisi klien), lalu ganti:

ProxyJump bastion

oleh

ProxyCommand ssh -q -W %h:%p bastion

Sejauh yang saya mengerti, ini serupa.


Saya melihat jawaban tentang ProxyJump. Mari kita bahas tentang ProxyCommand .

Tapi tunggu, tunggu! Saya dapat menulis kepada Anda cara meretas server yang menggunakan penerusan Agen, akan jauh lebih mudah untuk memahami perbedaannya!

Ayo meretas!

Untuk langkah dasar:Anda dapat membaca postingan saya di sini

Langkah-langkah dasarnya adalah sebagai berikut:

  1. Buat pengguna bastion
  2. Nonaktifkan login root
  3. Blokir upaya peretasan
  4. Ubah porta
  5. Konfigurasikan firewall
  6. Konfigurasikan SELinux

Cara menggunakan AgentForwarding

-Buat konfigurasi di ~/.ssh/config

  Host bast
        Hostname BASTION_IP
        ForwardAgent yes
        User bastion

-Tambahkan kunci otentikasi Anda ke ssh-agent

ssh-add ~/.ssh/name_rsa

-Hubungkan ke bastion hos

ssh bast

-Hubungkan server aplikasi dari benteng

 ssh [email protected] -p PORT

Peretasan!

Anda mungkin bertanya kepada saya:

  • Apakah server saya aman? Dan jawabannya cukup sederhana:

    • TIDAK!
  • Mengapa?

    • Karena Anda menggunakan penerusan Agen SSH!
  • Dan di mana masalahnya?

    • Karena penerusan Agen berbahaya dan dianggap berbahaya.
  • Mengapa?

    • Mari kita jelaskan semuanya luar dalam:Ketika Anda menghubungkan bastion host, ssh-agent Anda yang mulia diteruskan. Ini berarti soket akan diatur sehingga seseorang dapat menggunakan data soket ini untuk mengakses server Anda. Bayangkan server bastion Anda dikompromikan, Jika seseorang memiliki izin yang memadai di server Linux Anda, dia hanya akan menggunakan info soket Anda. Alhasil, semua server Anda bisa diakses. Saya tahu jendela kompromi sangat kecil karena tergantung pada berapa lama Anda terhubung ke bastion host. Tetapi apakah Anda benar-benar ingin mengambil risiko ketika Anda memiliki opsi lain seperti ProxyCommand? Oleh karena itu, gunakan saja ProxyCommand!

Bagaimana cara meretas server jika Anda menyusupi bastion host?

Lacak Target

Di direktori /tmp Anda mungkin melihat sesuatu seperti itu:

[[email protected] tmp]# ll
total 12
drwx------  2 bastion bastion 4096 Sep  7 17:35 ssh-mKX88v0Vlo

Mari buka file sementara

[[email protected] tmp]# cd ssh-mKX88v0Vlo/
[[email protected] ssh-mKX88v0Vlo]# ll
total 0
srwxr-xr-x 1 bastion bastion 0 Sep  7 17:35 agent.10507

Mari kita lihat koneksi ke id proses ini.

netstat -nxp | grep  10507

hasil:

unix  [ ]   STREAM     CONNECTED     501384   10507/sshd: bastion

dan siapa yang terhubung?

lsof -i -a -p 10507

hasil:

COMMAND  PID   USER  FD  TYPE DEVICE SIZE/OFF NODE NAME
sshd    10507 bastion  3u  IPv4 501301  0t0  TCP *IP*:ssh->*IP*:8279 (ESTABLISHED)

Kami juga dapat melihat file soket:

cd /proc/10507/fd/
ls

hasil:

lrwx------ 1 root root 64 Sep  7 17:46 0 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 1 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 10 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 14 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 15 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 2 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 3 -> socket:[501994]
lrwx------ 1 root root 64 Sep  7 17:46 4 -> socket:[502069]
lrwx------ 1 root root 64 Sep  7 17:46 5 -> socket:[502072]
l-wx------ 1 root root 64 Sep  7 17:46 6 -> /run/systemd/sessions/1836.ref
lr-x------ 1 root root 64 Sep  7 17:46 7 -> pipe:[502079]
l-wx------ 1 root root 64 Sep  7 17:46 8 -> pipe:[502079]
lrwx------ 1 root root 64 Sep  7 17:46 9 -> socket:[502080]

Dan apa yang terjadi kapan klien akan terhubung ke server jauh? mari kita lihat:

lrwx------ 1 root root 64 Sep  7 17:46 0 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 1 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 10 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:48 11 -> socket:[502267]
lrwx------ 1 root root 64 Sep  7 17:46 14 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 15 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 2 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 3 -> socket:[501994]
lrwx------ 1 root root 64 Sep  7 17:46 4 -> socket:[502069]
lrwx------ 1 root root 64 Sep  7 17:46 5 -> socket:[502072]
l-wx------ 1 root root 64 Sep  7 17:46 6 -> /run/systemd/sessions/1836.ref
lr-x------ 1 root root 64 Sep  7 17:46 7 -> pipe:[502079]
l-wx------ 1 root root 64 Sep  7 17:46 8 -> pipe:[502079]
lrwx------ 1 root root 64 Sep  7 17:46 9 -> socket:[502080]

Kami bahkan dapat melihat apakah file soket digunakan menggunakan netstat:

unix  3 [ ]  STREAM  CONNECTED  502267  10561/sshd: 
                     bastion  /tmp/ssh-oVoMXC6vb8/agent.10561
unix  3  [ ] STREAM     CONNECTED     502072   10561/sshd:  bastion 

Mencuri info Soket dan alamat IP

Sekarang kita perlu mencuri informasi soket saat sesi bastion host terbuka . Oh, kami juga memerlukan IP server tujuan , jadi gunakan saja netstat:

netstat -tn

Langkah terakhir untuk menggunakan file soket yang diteruskan

eval "$(ssh-agent -s)"
SSH_AUTH_SOCK=/tmp/ssh-EAKxOdL4fl/agent.10507

Periksa apakah kunci sudah dimuat .

ssh-add -l

hasilnya harus seperti itu :

2048 SHA256:2Psdl..B5KQ /home/usr/.ssh/name_rsa (RSA)

Server diretas, bagaimana cara memperbaiki masalah keamanan?

Perintah proxy

Host app
    Hostname *.*.*.*
    IdentityFile ~/.ssh/your_rsa
    User *******
    Port ****
    ProxyCommand ssh -W %h:%p bast

Host bast
     Hostname *.*.*.*
     ForwardAgent no
     User ******

Untuk operasi dasar:cara mentransfer file melalui server (dari klien ke server, server ke klien), Anda dapat membaca postingan saya di sini

Kesimpulan

  • Jika Anda menggunakan bastion host, jangan gunakan AgentForwarding tetapi gunakanProxyCommand
  • Selalu gunakan pengguna non-root untuk autentikasi
  • Gunakan firewall dan blokir semua koneksi yang tidak perlu.
  • Gunakan SELinux (Secara umum)
  • Blokir alamat IP yang mencoba masuk beberapa kali dengan kredensial yang salah
  • Jika tidak perlu, jangan berikan izin sudo kepada pengguna
  • Pantau server Anda
  • Perbarui server Anda untuk tambalan keamanan

Informasi lebih lanjut, lihat blog saya. Selain itu, saya memiliki beberapa tangkapan layar, jadi ini mungkin berguna bagi Anda.


Cukup gunakan penerusan agen SSH seperti kebanyakan orang lain.

  • Kuncinya ada di agen ssh di laptop Anda.
  • Anda masuk ke bastion, diautentikasi melalui agen.
  • Dari sana masuk ke host target Anda, dengan permintaan autentikasi diteruskan kembali ke laptop Anda .

Keuntungan:tidak ada kunci yang tersimpan di bastion yang bisa disalahgunakan.

Semoga membantu :)


Linux
  1. Berbagi Kunci Pribadi di Seluruh Mesin?

  2. Gunakan panggilan API untuk menghentikan server cloud

  3. Gunakan petunjuk penjadwal untuk membuat server

  1. Skenario penggunaan Cloud Server lainnya

  2. Cara menggunakan ssh-copy-id di Ubuntu

  3. Perintah apa yang saya gunakan untuk melihat sidik jari kunci ECDSA server saya?

  1. Ubah Kunci Pribadi Openssh Menjadi Kunci Pribadi Ssh2?

  2. Kapan harus menggunakan Server Khusus

  3. Cara SSH ke ec2 instance di subnet pribadi VPC melalui server NAT