1. ホーム
  2. スクリプト・コラム
  3. パール

ssh ログインの最大数を制限する perl スクリプト (ホワイトリスト対応)

2022-02-02 21:40:36

ssh limit perl スクリプトの主な目的は、以下の通りです。
1. 1人のsshユーザの最大ログイン回数をn回に制限する。nはカスタマイズ可能。
2. 2.ホワイトリスト対応、rootなど、テストログインは制限されない。

sshユーザの最大ログイン数が指定数を超えた場合、後からログインした人が先にログインした人を追い出すことで、ログイン回数を制御することができます。

このスクリプトはホストがperlをサポートしている必要がありますが、そうでない場合はyumでインストールできます。

スクリプトのソースコードです。

#! /usr/bin/perl -w
use strict;
#white list
my @ALLOW_USERS = qw{
  test
  root
  lulu1
lulu1 };
#the maximum number of ssh login
my $LOGIN_TIMES = 1;
sub main
{
  my @lines = `ps -eo user,pid,etime,cmd | grep sshd`;
  my $users;
  for my $line (@lines) {
    if(my ($user, $pid, $etime, $cmd) = $line =~ /^([^\s]+)\s+(\d+)\s+([^\s]+)\s+(sshd:. +)$/) {
      next if grep {$user eq $_} @ALLOW_USERS;
      my $proc = {'pid', $pid, 'etime', $etime, 'cmd', $cmd};
      push @{$users->{$user}}, $proc;
    }
  }
  for my $key(keys(%$users)) {
     my @sshs = sort {
      my ($lb, $la) = (length($b->{'etime'}), length($a->{'etime'}));
      if($lb == $la) {
        $b->{'etime'} cmp $a->{'etime'};
      } else {
        $lb <=> $la;
      }
    } @{$users->{$key}};
    $LOGIN_TIMES = 1 if $LOGIN_TIMES < 1;
    for (1 ... $LOGIN_TIMES) { pop @sshs; }
    for my $ssh (@sshs) {
      kill 9, $ssh->{'pid'};
    }
  }
}
while(1) {
  main;
  sleep 3;
}




[使用方法】をご覧ください。]

スクリプトをルートディレクトリに保存し、limit.plと名付け、以下のように実行します。

echo "/root/limit.pl &" >> /etc/rc.d/rc.local (add to boot)
/root/limit.pl & (run script)