Skrip Bash untuk membatasi jumlah login

12

Perusahaan saya memiliki persyaratan bahwa saya harus menjalankan satu aplikasi server, yang dapat diakses oleh semua pengguna melalui terminal dempul. Saya ingin menulis skrip shell yang hanya boleh dibuka 20 terminal dempul. Jika terminal 21 terbuka maka saya ingin segera menutup terminal itu.

Bagaimana saya bisa mencapai ini?

Tolong bantu aku.

vijay12289
sumber
3
Atur koneksi angka maks yang diizinkan akses di ssh ke 20 di server di MaxSessionslapangan
George Udosen
2
Jika perusahaan Anda memiliki kebijakan 20 sesi maksimum dan standarnya adalah 10 (seperti jawaban yang memberikan suara terbanyak), mengapa perusahaan Anda menaikkan jumlah sesi yang diizinkan> 20 in /etc/sshd_config, atau ini bug Ubuntu?
WinEunuuchs2Unix
Jika terminal ke-21 terbuka maka saya ingin segera menutup terminal itu. Jadi, 20 koneksi pertama dapat membawa server tanpa batas?
xenoid

Jawaban:

24

Edit Anda /etc/sshd_configdi sisi server dan ubah jalur:

#MaxSessions 10

untuk

MaxSessions 20

Lihat man sshd_config:

 MaxSessions
         Specifies the maximum number of open shell, login or subsystem
         (e.g. sftp) sessions permitted per network connection.  Multiple
         sessions may be established by clients that support connection
         multiplexing.  Setting MaxSessions to 1 will effectively disable
         session multiplexing, whereas setting it to 0 will prevent all
         shell, login and subsystem sessions while still permitting for-
         warding.  The default is 10.
George Udosen
sumber
ya kerjanya, agak terlambat untuk menambahkannya sebagai jawaban.
rɑːdʒɑ
2
Saya telah bermaksud untuk mengatur SSSH thingy di salah satu laptop lama saya untuk sementara waktu sekarang. Apakah halaman manual mengatakan bahwa secara default hanya 10 pengguna yang dapat masuk ke server? Bahkan di tahun 80-an kita bisa meminta seratus pengguna masuk ke komputer mini IBM S / 36 dengan RAM 2 MB.
WinEunuuchs2Unix
2
Anda membingungkan sesi seperti di terminal terbuka (lihat OP) dengan sesi di dalam koneksi SSH. Pengaturan yang Anda sebutkan adalah tentang berapa banyak "sub-koneksi" yang diizinkan oleh satu koneksi ssh. Jadi menjalankan 30 perintah "ssh" tidak ada masalah bahkan dengan MaxSessions 20. Sesi yang disebutkan ada tentang hal-hal seperti penerusan port (dan bahkan memiliki lebih dari satu shell terbuka) menggunakan koneksi yang sama, bukan tentang jumlah login pada sistem.
allo
@tidak seorang pun informasi ini Anda dapatkan dari OP?
George Udosen
1
@allo benar di sini, MaxSessions merujuk pada sesi multiplexing melalui koneksi TCP tunggal. Kecuali jika semua pengguna OP melakukan hal-hal aneh untuk membagikan satu koneksi TCP ke server, batas ini tidak akan memengaruhi mereka. Saya baru saja memverifikasi ini sendiri dengan menetapkan batas MaxSessions rendah pada server dan membuka lebih dari itu banyak koneksi ke sana.
Joe Lee-Moyet
5

Solusi George berfungsi dengan baik namun Anda meminta skrip bash ...

Jadi mempertimbangkan satu ini untuk situasi lain ketika tidak ada pilihan seperti MaxSessionsdari sshd, maka Anda dapat menggunakan sesuatu seperti ini:

if [ "$(pgrep -cx processName)" -gt 20 ]; then pkill -xn processName; fi; 

Yang pkill -nakan membunuh instance terbaru dari processName.

Solusi yang tepat untuk situasi khusus ini adalah jawaban George.

Ravexina
sumber
Bukankah ini juga mencegah subproses?
RonJohn
Ya itu menyebabkan sub-proses terbunuh juga.
Ravexina
2
Kemudian - karena bash mem-fork banyak subproses, dan mereka ingin membatasi pengguna, bukan proses - ini tampaknya bukan jawaban yang berguna.
RonJohn
1
@RonJohn Itu adalah jawaban yang berguna sesuai dengan kebutuhan pengguna (Sebuah skrip yang segera menutup proses) dan untuk pengguna lain yang berasal dari mesin pencari (jawaban umum untuk judul) sampai Anda mengedit pertanyaan.
Ravexina
Biarkan saya masuk ke sini. Saya juga tahu bahwa tempat ini mengarahkan pengguna ke jalan yang benar berdasarkan pertanyaan yang diajukan. Jika OP mengajukan pertanyaan dan jawaban yang benar (berdasarkan pertanyaan OP) belum tentu praktik terbaik atau pendekatan yang benar, saya pikir ada orang yang berhak menyatakan ini atau memberikan jawaban sesuai dengan pengamatan itu. Saya tidak berpikir kita harus mengambil pilihan untuk memutuskan jawaban apa yang terbaik, biarkan OP yang memutuskan dan saya suka melihat banyak opsi dari anggota situs yang terinformasi dengan baik. Tolong, biarkan selalu ada debat konstruktif, ini membantu saya jika tidak ada orang lain!
George Udosen
4

Aku sudah memutuskan untuk menguraikan dan menguji Ravexina 's ide . Ini berfungsi dan efektif jika Anda ingin membatasi jumlah koneksi ssh yang ada.

Pertama saya menemukan ketika daemon ssh sedang berjalan tanpa koneksi ada satu sshdproses. Untuk setiap koneksi baru dua sshdproses baru dibuat. Jadi, jika Anda ingin batas 20 koneksi, ambang batasnya harus 41 (1 + 2x20), bukan 20.

Lalu saya membuat file yang dapat dieksekusi, bernama , yang terlihat seperti berikut:/usr/local/bin/limit-sshd

#!/bin/sh
if [ "$(pgrep -cx sshd)" -gt 7 ]
then
    echo '\nThe limit was reached!\n'
    pkill -xn sshd
fi
  • Ambang batas di sini adalah 7, masing-masing hanya 3 koneksi dapat dibuat dan sisanya akan dijatuhkan.

Akhirnya saya menambahkan arahan berikut ke /etc/ssh/sshd_config:

ForceCommand /usr/local/bin/limit-sshd; $SHELL
  • Variabel $SHELLakan mengeksekusi shell pengguna default.
  • Efek yang tidak diinginkan adalah bahwa pesan sambutan tidak lagi tersedia.
  • Jangan lupa untuk me-restart daemon ssh: sudo systemctl restart sshd.service

Inilah cara kerjanya ( klik pada gambar untuk melihat demo animasi ):

masukkan deskripsi gambar di sini

Selanjutnya, saya menyadari bahwa kita tidak perlu membunuh apa pun, jika kita memodifikasi skrip dengan cara ini:

#!/bin/sh
if [ "$(pgrep -cx sshd)" -gt 7 ]
then
    echo '\nThe limit was reached!\n'
    exit # This line is not mandatory
else
    eval "$SHELL"
fi

Dan masing-masing /etc/ssh/sshd_configdengan cara ini:

ForceCommand /usr/local/bin/limit-sshd
pa4080
sumber
2

Pertanyaannya tidak jelas. Biarkan saya katakan dulu bagaimana saya memahaminya dan di mana, IMO, itu harus ditanyakan:

Kami memiliki jaringan lokal di mana satu server memasok aplikasi tertentu. Tim kami mengakses aplikasi ini melalui koneksi ssh dari komputer mereka ke server dengan menggunakan Putty. Setiap anggota tim memiliki akun pengguna sendiri yang digunakan untuk membuat koneksi ssh ( atau mungkin: semua anggota tim menggunakan akun pengguna umum).

Anggota tim tidak menggunakan server untuk tujuan lain dan kami ingin membatasi jumlah koneksi ssh mereka hingga 20, tidak peduli berapa banyak koneksi yang dibuat oleh pengguna tertentu ( atau mungkin: 20 koneksi per pengguna).

Jika interpretasi itu benar, mungkin cara yang benar untuk memenuhi persyaratan adalah dengan membuat grup pengguna , lalu menambahkan semua akun pengguna ke grup itu dan membatasi jumlah maxlogin via /etc/security/limits.conf.

  1. Buat grup, misalnya dipanggil the-app-maxlogins, dengan id grup 10 000:

    sudo groupadd -g 10000 the-app-maxlogins
  2. Tambahkan pengguna ke grup itu - sudo adduser <user> <group>:

    for user in "user1" "user2" "user3"; do sudo adduser "$user" the-app-maxlogins; done
  3. Tambahkan baris berikutnya /etc/security/limits.confuntuk membatasi jumlah maksimum seluruh grup :

    %the-app-maxlogins      -       maxlogins       20

    Atau tambahkan baris berikut untuk membatasi jumlah login maksimum per pengguna grup :

    @the-app-maxlogins      -       maxlogins       20
  4. Edit /etc/ssh/sshd_configdan tambahkan baris berikut ke bawah (!) File untuk menonaktifkan sesi multiplexing untuk grup itu (mungkin ini tidak wajib dalam kasus itu):

    Match Group the-app-maxlogins
        MaxSessions 1

Solusi ini akan membatasi jumlah login dari pengguna yang terpengaruh tidak masalah melalui ssh atau tty. Jika Anda ingin menerapkannya untuk pengguna tertentu bukan untuk grup, cukup tambahkan baris sebagai tindak lanjut limits.confatau letakkan di .conffile terpisah di dalam direktori /etc/security/limits.d/:

username      -       maxlogins       20

Penjelasan sederhana tentang arti sebenarnya dari arahan MaxSessionsdisediakan dalam jawaban ini . Sumber utama jawaban saat ini adalah jawaban lain di bawah pertanyaan L&U yang sama.

The jawaban lain dari saya, bisa memberikan solusi dalam beberapa cara, tetapi itu adalah jenis menyenangkan daripada solusi yang benar.

pa4080
sumber