我有一个使用ssh进行身份validation的应用程序。 由于各种规定(HIPAA等),用户只能login一段时间,而且只能login一次。
我想为sshd自动断开用户,如果另一个,第二个连接尝试。 这个想法是:用户1连接。 用户2使用用户1的凭证来尝试login。两者都被踢出(我们不确定用户1或用户2是否合法)。
如果这种情况在Y分钟内发生了X次以上,那么该帐户将被冻结,直到pipe理员解冻为止(很可能是由于密码重设)。
现在,用户在他们自己的scponly目录中被沙箱化; 我不确定是否重要。
试图杀死个人sshd连接就像玩whackamole,我更喜欢这是sshd本身,而不是一个根级脚本。
编辑 :这是
2.6.31-22-server #73-Ubuntu SMP
而我的limits.conf文件包含如下行:
user1 hard maxlogins 1 user2 hard maxlogins 1
和我的sshd_config文件包含行:
UsePAM yes
然而,我仍然可以从多个不同的机器以user1身份login。 我在这里做错了什么,这样我就可以至less阻止user1有多个login?
设置maxlogins限制实际上在这里工作。 只要确保使用“ – ”限制types,而不是“硬”。
user1 - maxlogins 1
如果你想踢用户使用scponly进行双重login,这里是快速和肮脏的脚本,这是做到这一点。 把它放入crontab,所以它执行每一分钟。
#!/bin/sh for user in `grep scponly /etc/passwd | gawk -F: '{print $1}'`; do echo "Checking user: $user" instances=`ps -u $user| grep scponly | wc -l` echo "scponly instances $instances" if [ $instances -gt 1 ] ; then echo "Too many connections detected, slaying scponly for user $user" if [ -e /tmp/$user ] ; then attempts=`cat /tmp/$user` echo "Detected $attempts attempts" # increment attempts counter echo $(($attempts+1)) > /tmp/$user if [ $attempts -gt 3 ] ; then echo "Blocking $user" /usr/sbin/usermod -L $user fi else echo "1" > /tmp/$user fi killall -u $user scponly fi done
下载脚本: http : //dl.dropbox.com/u/17194482/kill-scponly.sh
您可以查看/etc/security/limits.conf中的这些限制。 http://linux.die.net/man/5/limits.conf
有一个“maxlogins”限制,可以在每个用户或每个用户组的基础上进行configuration。 这不会断开以前的会话,但会限制并发会话。
由于您使用的是没有远程执行function的特殊shell,因此您无法在其loginshell中进行一些破解。 只要在shell中找出它们是否已经login,如果没有login就很容易了。
我们曾经是空着的,这正是这个。 ( http://idled.sourceforge.net/或http://www.ibiblio.org/pub/Linux/system/admin/idle/!INDEX.html ),现在看起来好像不是很好,因为PAM已经复活了。
PAM为您提供了一种方法来实现您想要的function,请参阅此处的PAM模块列表: http ://www.kernel.org/pub/linux/libs/pam/modules.html
任何一个单一的可能不会做你想要的所有事情,但是一起你可以做任何你想做的,甚至写自己的模块。 像@DerfK说的,你必须configurationSSH来使用PAM。
PAM限制不会捕获scp或sftp连接,因为它们没有被分配一个pty或写入utmp。
如果这是因为评论中提到的会计原因,您可能需要查看GNU会计实用程序 。 这些将使您可以完成所有工作,包括查看哪些用户运行了哪些进程,运行了多长时间以及运行了多lessCPU和RAM。 这确实需要内核支持,但大多数现代发行版都已经编译好了。