如何在Linux中限制SSH远程会话及会话时间超时

本文涉及的产品
运维安全中心(堡垒机),免费版 6个月
运维安全中心(堡垒机),企业双擎版|50资产|一周时长
简介:

在Linux环境中如果你需要限制用户输入几次错误密码后锁定他的账号使其不能登陆,
如同控制密码健壮性,我们需要调用PAM模块来完成任务。
这个模块叫:pam_tally2.so
本模块可以理解为一个尝试登陆的计数器,并可以以此计数为凭证,拒绝达到你设定的计数数值的用户登陆。此计数器可以手动重置。
与cracklib.so一样,我们需要同时为/etc/pam.d/system-auth以及/etc/pam.d/password-auth来插入该模块,以达到同时为各种登录方案都起作用的效果

1、会话设置

(1)这一条登录多少次后就提示并自动结束会话:非常重要,在Linux中,如下:
# cat /etc/ssh/sshd_config  | grep MaxAuth
MaxAuthTries 1 //远程用户通过ssh连接登录2次失败后自动结束会话
The server has disconnected with an error.  Server message reads:
A protocol error occurred. Too many authentication failures for root

(2)root只能从tty1和vc登陆。建议仅允许root从一个tty或vc登陆,如果需要更多设备登陆,使用su命令转换为root。
openssh应该禁止使用协议1,禁止root直接登录
/etc/ssh/sshd_config
Protocol 2
MaxAuthTries 1
PermitRootLogin no  //不允许root用户使用ssh登录
StrictModes yes
PermitEmptyPasswords no //不允许使用空密码登录
PrintLastLog yes

root不登录,其他用户登录时,添加密码,和用户时的具体操作方法:
useradd jackxiang
忘记了密码,得有root去修改它即可:
jackxiang@192.168.225.128:/root# su root
密码:
root@192.168.225.128:~# passwd jackxiang
更改用户 jackxiang 的密码 。
新的 密码:
service sshd restart

禁止某些用户使用ssh远程登录:http://www.myhack58.com/Article/48/66/2011/30887.htm

vim /etc/pam.d/sshd
 在第一行加入 auth       required     pam_listfile.so item=user sense=deny file=/etc/sshdusers onerr=succeed,注意一定要在第一行,因为pam中执行顺序是上面优先

vim /etc/sshdusers

 在文件中加入root    wp ,root 和wp是两个本地用户

service sshd restart

在另一个终端测试

[root@clone2 ~]# ssh clone1.rhel.com
root@clone1.rhel.com's password: 
Permission denied, please try again.
root@clone1.rhel.com's password: 
Permission denied, please try again.
root@clone1.rhel.com's password: 
Permission denied (publickey,gssapi-with-mic,password).

[wp@clone2 ~]$ ssh clone1.rhel.com
wp@clone1.rhel.com's password: 
Permission denied, please try again.
wp@clone1.rhel.com's password: 
Permission denied, please try again.
wp@clone1.rhel.com's password: 
Permission denied (publickey,gssapi-with-mic,password).
两个用户都无法使用ssh了。呵呵,目的达到了




(3)root@192.168.225.128:~#  cat /etc/login.defs | grep PASS | grep -v ^#
PASS_MAX_DAYS   99999
PASS_MIN_DAYS   0
PASS_MIN_LEN    5
PASS_WARN_AGE   7

PASS_MAX_DAYS   90 //口令最大使用日期90天
PASS_MIN_DAYS   0 //若设置为2,则设置密码2天后才可以再次更改密码,即密码至少要保留的天数
PASS_MIN_LEN    8 //口令最小长度8位
PASS_WARN_AGE   7 //口令过期前7天警告

(4)
umask至少为027,最好是077
[root@station60 ~]# grep umask /etc/bashrc 
        umask 077
        umask 077
[root@station60 ~]# . /etc/bashrc
[root@station60 ~]# umask 
0077
[root@station60 ~]# touch 3.txt
[root@station60 ~]# ll 3.txt 
-rw------- 1 root root 0 Apr  8 00:11 3.txt

(5)
检查系统是否最小化安装,启动的运行级别为3

查看/etc/pam.d/su是否包含以下两行
auth            sufficient      pam_rootok.so
# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth           sufficient      pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be in the "wheel" group.
auth            required        pam_wheel.so use_uid //上面的注释已经说的很清楚了,没有注释下面这一行,那么要su到别的用户就必须在wheel组中


(6)关闭telnet服务,redhat默认是关闭telnet服务的
[root@station90 ssh]# netstat -tnlp | grep :23
[root@station90 ssh]# cd /etc/xinetd.d/
[root@station90 xinetd.d]# ls telnet*
ls: telnet*: 没有那个文件或目录
如果有telnet服务,则把该目录下的telnet文件改为disable=yes
[root@station90 xinetd.d]# tail -n 2 /etc/xinetd.d/krb5-telnet | head -n 1 
        disable         = yes
[root@station90 xinetd.d]# service xinetd restart
停止 xinetd:                                              [确定]
启动 xinetd:                                              [确定]

=============================================================
上面是我从Url:http://lhf0616.blog.51cto.com/2920914/538453 总结的,我贴上原文:
[root@station90 桌面]# awk  -F : '($2=="") {print $1}' /etc/shadow //检查空口令帐号
zhang3
[root@station90 桌面]# tail -n 1 /etc/shadow | head -n 1  //-F :是以冒号作为分隔符,($2==""表示第1个和第2个冒号之间是空的,即空口令帐号,{print $1}打印出用户名
zhang3::15071:0:99999:7:::
检查帐号
[root@station90 桌面]# pwck
用户 adm:目录 /var/adm 不存在
用户 news:目录 /etc/news 不存在
用户 uucp:目录 /var/spool/uucp 不存在
用户 gopher:目录 /var/gopher 不存在
用户 pcap:目录 /var/arpwatch 不存在
用户 avahi-autoipd:目录 /var/lib/avahi-autoipd 不存在
用户 oprofile:目录 /home/oprofile 不存在
pwck:无改变


口令复杂度及登录失败策略
应启用登录失败处理功能,可采取结束会话,限制非法登录次数和自动退出措施,口令应有复杂度要求并定期更换
要求强制记住3个密码历史
口令至少包含1个数字,字母和其他特殊字符(如:#,@,!,$等);
5次远程登录失败自动结束会话
[root@station90 桌面]# cat /etc/login.defs | grep PASS | grep -v ^#
PASS_MAX_DAYS   90 //口令最大使用日期90天
PASS_MIN_DAYS   0 //若设置为2,则设置密码2天后才可以再次更改密码,即密码至少要保留的天数
PASS_MIN_LEN    8 //口令最小长度8位
PASS_WARN_AGE   7 //口令过期前7天警告

[root@station90 pam.d]# cat /etc/pam.d/system-auth | tail -n 2 && grep ^#password /etc/pam.d/system-auth
password    required      pam_cracklib.so difok=3 minlen=8 dcredit=-1,lcredit=-1 ocredit=-1 maxrepeat=3
password    required      pam_unix.so use_authtok nullok md5
#password    requisite     pam_cracklib.so try_first_pass retry=3 //注释这一行后,无法修改密码
[root@station90 pam.d]# passwd
Changing password for user root.
passwd: Authentication information cannot be recovered

修改登录失败策略
[root@station90 ssh]# cat /etc/ssh/sshd_config  | grep MaxAuth
MaxAuthTries 1 //远程用户通过ssh连接登录2次失败后自动结束会话
[root@station90 ssh]# ssh 192.168.0.90
root@192.168.0.90's password: 
Permission denied, please try again.
root@192.168.0.90's password: 
Received disconnect from 192.168.0.90: 2: Too many authentication failures for root

关闭telnet服务,redhat默认是关闭telnet服务的
[root@station90 ssh]# netstat -tnlp | grep :23
[root@station90 ssh]# cd /etc/xinetd.d/
[root@station90 xinetd.d]# ls telnet*
ls: telnet*: 没有那个文件或目录
如果有telnet服务,则把该目录下的telnet文件改为disable=yes

[root@station90 xinetd.d]# tail -n 2 /etc/xinetd.d/krb5-telnet | head -n 1 
        disable         = yes
[root@station90 xinetd.d]# service xinetd restart
停止 xinetd:                                              [确定]
启动 xinetd:                                              [确定]
[root@station90 xinetd.d]# chkconfig xinetd on

openssh应该禁止使用协议1,禁止root直接登录
/etc/ssh/sshd_config
Protocol 2
MaxAuthTries 1
PermitRootLogin no  //不允许root用户使用ssh登录
StrictModes yes
PermitEmptyPasswords no //不允许使用空密码登录
PrintLastLog yes

[root@station60 init.d]# pwd
/etc/rc.d/init.d
[root@station60 init.d]# chmod -R 750 ./ 也可以直接chmod -R /etc/init.d/*
[root@station60 init.d]# ll | head -n 2
total 644
-rwxr-x--- 1 root root  1566 Jun  8  2009 acpid

umask至少为027,最好是077
[root@station60 ~]# grep umask /etc/bashrc 
        umask 077
        umask 077
[root@station60 ~]# . /etc/bashrc
[root@station60 ~]# umask 
0077
[root@station60 ~]# touch 3.txt
[root@station60 ~]# ll 3.txt 
-rw------- 1 root root 0 Apr  8 00:11 3.txt

检查系统是否最小化安装,启动的运行级别为3

查看/etc/pam.d/su是否包含以下两行
auth            sufficient      pam_rootok.so
# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth           sufficient      pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be in the "wheel" group.
auth            required        pam_wheel.so use_uid //上面的注释已经说的很清楚了,没有注释下面这一行,那么要su到别的用户就必须在wheel组中
[root@station60 pam.d]# gpasswd  -a oracle wheel
Adding user oracle to group wheel
[root@station60 pam.d]# id oracle
uid=500(oracle) gid=500(oracle) groups=500(oracle),0(root),10(wheel) context=system_u:system_r:unconfined_t
[root@station60 pam.d]# id zhang3
uid=501(zhang3) gid=501(zhang3) groups=501(zhang3) context=system_u:system_r:unconfined_t
[root@station60 pam.d]# su - zhang3
[zhang3@station60 ~]$ su - root //以下密码输入都是正确的
Password: 
su: incorrect password
[zhang3@station60 ~]$ su - oracle
Password: 
su: incorrect password
[zhang3@station60 ~]$ su - oracle
Password: 
su: incorrect password
[zhang3@station60 ~]$ su - oracle
Password: 
su: incorrect password
[zhang3@station60 ~]$ 
[oracle@station60 ~]$  su - oracle
Password: 
[oracle@station60 ~]$ su - root
Password: 
[root@station60 ~]# 

2 操作指南  

2.1.本地登录用户参考配置操作
#cd /etc/profile.d
执行
#vi autologout.sh
加入如下内容:
TMOUT=600
readonly TMOUT
export TMOUT
保存退出,系统将在用户闲置10分钟后自动注销。

2.2.远程登录用户参考配置操作
#vi /etc/ssh/sshd_config
将以下内容设置为:
ClientAliveInterval 600
ClientAliveCountMax 0
以上表示10分钟闲置后,自动注销并结束会话。
检测方法    1、判定条件
查看帐号超时是否自动注销;
2、检测操作
cat  /etc/ssh/sshd_config
检查其中两个参数设置:
ClientAliveInterval 600
ClientAliveCountMax 0

(2)执行:awk -F: '($3 == 0) { print $1 }' /etc/passwd
返回值包括“root”以外的条目,说明有其他超级用户,低于安全要求。
2、检测操作
执行:awk -F: '($3 == 0) { print $1 }' /etc/passwd
返回值包括“root”以外的条目,说明有其他超级用户;

/etc/securetty 文件设置root登陆的tty和vc(虚拟控制台)设备。/etc/securetty 文件被login程序读 (通常 /bin/login)。它的格式是允许的tty和vc列表,注释掉或不出现的设备,不允许root登陆。
















本文转自xiaocao1314051CTO博客,原文链接:http://blog.51cto.com/xiaocao13140/1971149 ,如需转载请自行联系原作者


相关文章
|
3月前
|
安全 Linux 网络安全
Linux端的ssh如何升级?
Linux端的ssh如何升级?
351 59
|
1月前
|
监控 Ubuntu Linux
使用VSCode通过SSH远程登录阿里云Linux服务器异常崩溃
通过 VSCode 的 Remote - SSH 插件远程连接阿里云 Ubuntu 22 服务器时,会因高 CPU 使用率导致连接断开。经排查发现,VSCode 连接根目录 ".." 时会频繁调用"rg"(ripgrep)进行文件搜索,导致 CPU 负载过高。解决方法是将连接目录改为"root"(或其他具体的路径),避免不必要的文件检索,从而恢复正常连接。
|
4月前
|
机器学习/深度学习 存储 Linux
【机器学习 Azure Machine Learning】使用VS Code登录到Linux VM上 (Remote-SSH), 及可直接通过VS Code编辑VM中的文件
【机器学习 Azure Machine Learning】使用VS Code登录到Linux VM上 (Remote-SSH), 及可直接通过VS Code编辑VM中的文件
|
4月前
|
安全 网络协议 Linux
在Linux中,什么是SSH,并且如何使用它?
在Linux中,什么是SSH,并且如何使用它?
|
4月前
|
Linux Shell 数据安全/隐私保护
Linux用户账户管理精髓:创建、删除、密码与会话管理全攻略
本文档介绍了Linux系统中用户账户管理的关键操作,包括创建与删除用户、设置及修改密码、用户切换与会话管理等内容。通过理论说明与具体命令示例,如使用`useradd`、`userdel`、`passwd`和`su`等命令,帮助系统管理员更好地掌握这些基本技能,从而有效提升系统的安全性和管理效率。此外,还介绍了如何利用`screen`等工具进行会话管理,确保即便在网络中断的情况下也能维持会话的持续运行。
131 3
|
4月前
|
监控 安全 Ubuntu
在Linux中,如何进行SSH服务配置?
在Linux中,如何进行SSH服务配置?
|
4月前
|
Linux 网络安全
Linux开启ssh
Linux开启ssh
46 0
|
4月前
|
安全 Linux 网络安全
在Linux中,使用rsync同步数据时,假如采用的是ssh方式,并且目标机器的sshd端端并不是默认的22端口,该如何做?
在Linux中,使用rsync同步数据时,假如采用的是ssh方式,并且目标机器的sshd端端并不是默认的22端口,该如何做?
|
4月前
|
安全 Linux Shell
Linux系统之间实现免密码登录(SSH无密码登录
【8月更文挑战第21天】要在Linux系统间实现SSH免密码登录,需先在源机器生成SSH密钥对,然后将公钥复制到目标机器的`.ssh/authorized_keys`文件中。可通过`ssh-keygen`命令生成密钥,并使用`ssh-copy-id`命令传输公钥。最后测试SSH连接,确保能无密码登录。若目标机器缺少相关目录或文件,需手动创建并设置适当权限。完成这些步骤后,即可实现安全便捷的免密码登录。
198 0
|
4月前
|
安全 Linux 网络安全
在Linux中,如何配置SSH以确保远程连接的安全?
在Linux中,如何配置SSH以确保远程连接的安全?