Linux系统安全限制:禁用或限制用户SSH登录
我们知道Linux系统安全性设置有很多方式。常见的有通过firewall防火墙、或者iptables规则实现放行、拦截屏蔽某些特征的网络请求。
还有一种办法是机房运维常用的权限管控手段:管控服务器登录权限、管控账号执行操作权限。这种手段主要管控的目标对象是运维人员,即操作者。
下面通过实验验证如何通过 /etc/ssh/sshd_config、/etc/hosts.allow、/etc/hosts.deny、/sbin/nologin、/etc/passwd 实现禁止用户ssh登录。
/sbin/nologin、/etc/passwd 设置用户 拒绝通过ssh登录
Linux系统是基于文件系统的,每个用户都必须明确有一个用于解释执行shell命令解释器位置,即“环境变量”,一般是 “/bin/bash”
我们可以通过设置用户的解释器为 “/sbin/nologin” 来禁止该用户执行登录。
- 创建非登录用户,可以在创建新用户时指定禁止ssh登录:
- useradd -s /sbin/nologin <new username>
- 已存在的用户设置为禁止ssh登录:usermod -s /sbin/nologin <username>
- 直接修改/etc/passwd系统文件,将该用户解释器修改为/sbin/nologin
通过以上方法1、2设置后底层其实还是到/etc/passwd里面的。示例:
| 1 2 3 | root:x:0:0:root:/root:/bin/bash # myname:x:1000:1000::/home/myname:x:/bin/bash myname:x:1000:1000::/home/myname:x:/sbin/nologin |
|---|
实验:
sshd_config 设置用户或属组 允许或拒绝通过ssh登录
/etc/ssh/sshd_config文件是sshd服务的配置文件,里面的配置项专门管控ssh登录。常见的有:指定ssh端口、地址来源、用户默认的证书加密方式、AuthorizedKeysFile、登录日志筛选、登录日志级别、最大登录数、自定义Authentication、密码格式、密码过期期限、密码等级等等所有与ssh相关的设置项。
这里我们单说允许或限制用户名、属组的登录权限设置。
- AllowUsers设置允许登录的用户白名单:echo “AllowUsers myname” >> /etc/ssh/sshd_config
- AllowGroups设置允许登录的属组白名单:echo “AllowGroups myGroup” >> /etc/ssh/sshd_config
- DenyUsers设置禁止登录的用户黑名单:echo “DenyUsers myname” >> /etc/ssh/sshd_config
- DenyGroups设置禁止登录的属组黑名单:echo “DenyGroups myGroup” >> /etc/ssh/sshd_config
注意:
- 设置AllowUsers、AllowGroups时,该用户或属组允许登录,其他均禁止ssh登录!!!
- 同时设置AllowUsers、DenyUsers时,AllowUsers优先级高,其他均禁止ssh登录!!!
即:有AllowUsers、AllowGroups时,系统只看AllowUsers、AllowGroups不管其他设置。
被禁止的用户登录时,默认提示信息:Permission denied, please try again. 权限被拒绝,请重试。
实验对照表:
查看属组与用户的关系:
- 查看Linux系统里有哪些组:cat /etc/group
- 查看某组里有哪些用户:getent group 组名称 或者 cat /etc/group | grep 属组名称
- 查看用户信息:cat /etc/passwd |grep 用户ID
阻止创建新用户
注意:以上方法目前只能针对已经存在的用户/组 设置白名单/黑名单,一般还需要禁止普通用户的创建新用户/新组的权限,防止新建用户私自篡改规则。
- 锁定文件 chattr +i /etc/gshadow /etc/group /etc/shadow /etc/passwd
- 解锁文件 chattr -i /etc/gshadow /etc/group /etc/shadow /etc/passwd
可以通过命令查看权限:
- lsattr /etc/gshadow /etc/group /etc/shadow /etc/passwd
- ls -lt /etc/gshadow /etc/group /etc/shadow /etc/passwd
hosts.allow、hosts.deny 设置IP或IP段或IP范围 允许或拒绝通过ssh登录
通过/etc/hosts.allow 设置允许建立连接的地址来源。这里仅演示ssh服务配置(其他服务sftp、telnet等也可以哦)。
- 允许特定IP echo “sshd:192.168.0.1:allow” >> /etc/hosts.allow
- 允许特定IP段 echo “sshd:192.168.0.1/24:allow” >> /etc/hosts.allow
- 允许特定IP段 echo “sshd:192.168..:allow” >> /etc/hosts.allow
- 允许全部地址 echo “sshd:ALL” >> /etc/hosts.allow
通过/etc/hosts.deny 设置禁止建立连接的地址来源。这里仅演示ssh服务配置(其他服务sftp、telnet等也可以哦)。
- 拒绝特定IP echo “sshd:192.168.0.2:deny” >> /etc/hosts.deny
- 拒绝特定IP段 echo “sshd:192.168.0.2/24:deny” >> /etc/hosts.deny
- 拒绝特定IP段 echo “sshd:192.168..:deny” >> /etc/hosts.deny
- 拒绝全部地址 echo “sshd:ALL” >> /etc/hosts.deny
注意:
- 设置allow时,该地址允许建立连接,其他均禁止!!!
- 同时设置allow、deny时,allow优先级高!!!
被禁止的用户登录时,默认提示信息:
Connecting to 10.99.5.132:22…
Connection established.
To escape to local shell, press ‘Ctrl+Alt+]’.
Connection closing…Socket close.
Connection closed by foreign host.
Disconnected from remote host(10.99.5.132:22) at 10:56:08.
Type `help’ to learn how to use Xshell prompt.
实验对照表:
重启ssh服务
编辑/修改后,必须重启ssh服务后生效!
systemctl restart sshd
或
service restart sshd
实验脚本: sshd_config-myrules.sh:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | #! /bin/bash # author: xiongzaiqiren # date: 2023-03-20 # usage: sh sshd_config-myrules.sh ### 默认情况下,Linux中创建用户帐户时用户具有shell访问权限。在某些情况下不需要用户帐户登录shell。下面示例如何设置已存在的用户禁止shell登录、创建用户时禁止shell登录。 ### 默认情况下,创建用户时,将按照/etc/default/useradd文件中定义的为用户分配shell。Linux中附带了一个/sbin/nologinshell,当用户尝试连接时,它会显示一条消息“This account is current not available”。这是禁止用户登录shell的一种方法。下面是使用方式: ### 您可以直接查看/编辑 /etc/passwd,文件哦 ########## nologin(黑名单) ########## #示例六:创建用户时禁用shell登录 #格式 useradd -s /sbin/nologin {username} #示例 useradd user01 -s /sbin/nologin echo ‘禁用shell登录:’ cat /etc/passwd | grep -i nologin ### 设置服务器安全,允许特定用户/组通过ssh连接服务器。 ### 注意:目前只能针对已经存在的用户/组 设置白名单/黑名单,还需要禁止普通用户的创建新用户/新组的权限,防止其他用户私自建立新用户/组 跳过该规则。 ### 您可以直接查看/编辑 /etc/ssh/sshd_config 文件哦 ########## AllowUsers(用户白名单) ########## #示例一:允许 user3用户 使用ssh登录 # echo “AllowUsers user3” >> /etc/ssh/sshd_config echo ‘允许ssh的用户:’ cat /etc/ssh/sshd_config | grep -i allowusers ########## AllowGroups(组白名单) ########## #示例二:允许 2g-admin组 使用ssh登录 # echo “AllowGroups 2g-admin” >> /etc/ssh/sshd_config echo ‘允许ssh的组:’ cat /etc/ssh/sshd_config | grep -i allowgroups ########## DenyUsers(用户黑名单) ########## #示例三:禁用 user3 使用ssh登录 # echo “DenyUsers user1” >> /etc/ssh/sshd_config echo ‘禁用ssh的用户:’ cat /etc/ssh/sshd_config | grep -i denyusers ########## DenyGroups(组黑名单) ########## #示例四:禁用 2g-admin组 使用ssh登录 # echo “DenyGroups 2g-admin” >> /etc/ssh/sshd_config echo ‘禁用ssh的用户组:’ cat /etc/ssh/sshd_config | grep -i denygroups ### 注意:以上方法目前只能针对已经存在的用户/组 设置白名单/黑名单,还需要禁止普通用户的创建新用户/新组的权限,防止其他用户私自建立新用户/组 跳过该规则。 #锁定文件 chattr +i /etc/gshadow /etc/group /etc/shadow /etc/passwd #解锁文件 chattr -i /etc/gshadow /etc/group /etc/shadow /etc/passwd ### 设置服务器安全,允许特定IP/段通过ssh连接服务器。 ### 您可以直接查看/编辑 /etc/hosts.allow,/etc/hosts.deny,文件哦 ### 优先级:hosts.allow > hosts.deny ########## hosts.allow(IP白名单) ########## #示例五:允许 192.168.0.1 使用ssh登录 #允许特定IP echo “sshd:192.168.0.1:allow” >> /etc/hosts.allow #允许特定IP段 echo “sshd:192.168.0.1/24:allow” >> /etc/hosts.allow #允许全部地址 echo “sshd:ALL” >> /etc/hosts.allow echo ‘允许ssh的IP:’ cat /etc/hosts.allow | grep -i ssh ########## hosts.deny(IP黑名单) ########## #示例六:拒绝 192.168.0.2 使用ssh登录 #拒绝特定IP echo “sshd:192.168.0.2:deny” >> /etc/hosts.deny #拒绝特定IP段 echo “sshd:192.168.0.2/24:deny” >> /etc/hosts.deny #拒绝全部地址 echo “sshd:ALL” >> /etc/hosts.deny echo ‘拒绝ssh的IP:’ cat /etc/hosts.deny | grep -i ssh ########## 编辑/修改后,必须重启ssh服务后生效!########## # systemctl restart sshd #或 service restart sshd |
|---|