限制除一个IP /主机名之外的所有root ssh

我想要限制来自所有,除了一个IP地址的根loginSSHlogin。

我的印象是,我只需要添加到/etc/pam.d/sshd:

account required pam_access.so 

这个到/etc/security/access.conf:

 -:root:ALL EXCEPT IPADDRESS 

但似乎并没有工作。

在/ etc / ssh / sshd_config中

 # Disable Root login PermitRootLogin no # # [ . . . ] # # At the end of the file, add: # # Allow Root Login via Key from Admin Bastion Match Address 10.9.8.7 PermitRootLogin without-password 

为什么要允许root ssh访问呢? 墨菲的法律会让你需要root权限的时候,你会远离你的核准IP地址。

这只是我的意见,但更好的方法是作为一个普通用户login,然后su根。 要访问root用户,需要同时使用用户密码和root密码。 所以你的普通用户帐户必须在pipe理员或轮子组中,具体取决于你正在运行的Linux发行版。

编辑:为了更好的安全性,只允许预共享密钥authentication的SSH连接。 如果你不在拥有必要私钥的机器上,这可能是一把双刃剑。

我认为这是RHEL 5+,这就是有这个问题..相同的步骤将适用于RHEL 4.使这个工作在RHEL 5的技巧是添加帐户所需的pam_access.so

到第二或第三行的/etc/pam.d/sshd。 如果你只是将其附加在底部,则不起作用。

结果/etc/pam.d/sshd看起来像..

#cat /etc/pam.d/sshd

#%PAM-1.0

auth包含system-auth

需要帐户pam_nologin.so

帐户需要pam_access.so

帐户包括system-auth

密码包括system-auth

会话可选pam_keyinit.so强制撤消

会话包括system-auth

会话需要pam_loginuid.so

你试过了吗 :

 -: ALL EXCEPT root:your_ip_address 

你尝试两行:

 +:root:<your_ip> -:root:ALL 

您正在查找sshd_config文件的AllowUsers选项(通常位于/ etc / ssh /中)。 以机智:

AllowUsers [email protected].0.1

这将只允许root从IP 10.200.0.1login – 默认设置是允许所有主机的所有用户被允许…

我可以看到的一个缺点是,如果您使用AllowUsers ,则必须列出您需要访问的所有用户 – 这对于使用足够多的用户列表来pipe理是非常痛苦的(例如,从LDAP或其他目录)。

这应该可以在某种程度上解决方法,因为该选项允许使用通配符模式,每个手册页:

这个关键字后面可以跟一列用空格分隔的用户名模式。 如果指定,则仅允许login符合与其中一种模式相匹配的用户名。 '*'和'?' 可以在模式中用作通配符。 只有用户名是有效的; 数字用户ID不被识别。 默认情况下,所有用户都可以login。 如果模式采用USER @ HOSTforms,则分别检查USER和HOST,限制来自特定主机的特定用户的login。

YMMV仍然可以是相当严格的。 希望这可以帮助。

严格的根访问可能需要进行备份等,但可能是非常危险的事情。 幸运的是,通过使用ssh keys和authorized_keys文件,可以确保直接访问root权限。

首先,允许在sshd_config中进行rootlogin,但只允许执行预定义的一组命令:将PermitRootLogin forced-commands-only写入/ etc / ssh / sshd_config或存储sshdconfiguration的任何地方。 这将禁用根密码authentication,迫使它使用SSH密钥,甚至只允许您定义的命令。

然后login到你的客户端需要有这个直接的根访问,并创build一个新的SSH密钥: ssh-keygen -t rsa 。 如果脚本需要,使密钥无密码。

接下来,用ssh-copy-id -i ~/.ssh/id_rsa.pub root@yourserver (如果仍然启用rootlogin)将这个新创build的ssh密钥复制到你的服务器上,如果没有,只需要复制内容〜/ .ssh /id_rsa.pub到/root/.ssh/authorized_keys文件。

现在假设你的客户端需要通过ssh以root身份运行/root/bin/startup_skynet.sh 。 您现有的authorized_keys文件看起来像这样:

 ssh-rsa FASBFAFfasdföjasfABGVEAGUPEGDJfsadnö2314235dfbösadköjsdfösdklf== 

修改它是

 no-pty,no-X11-forwarding,no-agent-forwarding,no-port-forwarding,command="/root/bin/startup_skynet.sh" ssh-rsa FASBFAFfasdföjasfABGVEAGUPEGDJfsadnö2314235dfbösadköjsdfösdklf== 

并保存。

然后尝试从您的客户端执行类似ssh root@myserver ls – 这应该失败。 然后继续执行ssh root@myserver /root/bin/startup_skynet.sh – 现在应该可以工作了。

这样,直接的rootlogin可以更安全。 由于安全性是一个分层的东西,而不是一个单一的function将提供,你仍然可以做更多。 如果您需要连接的用户数量有限,则最好使用AllowUsers参数来允许从预定义的一组IP地址连接,如AllowUsers [email protected] [email protected] johndoe将允许root从192.168.1.2和192.168.1.3和johndoe无处不在。

我build议您使用sshd_configMatchfunction,并匹配IP(或子网)。

这将允许您也指定允许的function。 例如:您可能会说只有来自“内部”子网集的用户可能使用PasswordAuthentication (并且AllowRoot可能只来自需要它的单个/小范围的IP)。

另请注意,通过公共密钥的身份validation不通过PAM,所以如果您使用公共密钥身份validation,则pam_access将不起作用。

看看/etc/hosts.allow和/etc/hosts.deny

 PermitRootLogin不带密码

在sshd_config中,然后从允许的机器中将公共密钥插入到目标系统上的authorized_keys2中。
如果你不这样做 – 在“允许的系统”上以root身份执行(接受默认设置并且不设置密码):

 #ssh-keygen -t rsa -b 2048 
 #scp /root/.ssh/id_rsa.pub targetsystem:/ tmp

在“目标”系统上做:

 cat /tmp/id_rsa.pub >> /root/.ssh/authorized_keys2
 rm -f /tmp/id_rsa.pub

或者,您可以在ssh密钥上设置密码。 这是一个简单的解决scheme,不允许root用户进行任何基于密码的身份validationlogin,而只使用“允许”系统的公钥来访问它。

头脑就像降落伞,只是因为你失去了你的意思,并不意味着你借我的…

我喜欢围绕安全的讨论,每个人都认为他们的方式是唯一的方法。 下面是你要做的,退一步,看看你的基础设施,考虑接入点,然后build立一个模型,为你提供足够的安全性,所以你不必担心太多。

这就是说,我的意见如下:

根据坦诚login,愚蠢。 没有理由去做,所以不要这样做。 对于具有sudo权限的用户,请确保系统安装正确。 密码validation,禁用它,只使用SSH密钥。

从受信任的主机,作为您的用户帐户login的有限数量的/ 32地址应该不需要超过您的ssh密钥…来自不受信任的主机,使用双因素身份validation。 用户名/密码… +每隔30秒更换一次数字6-8

注意:此configuration可以通过在sshd_config中设置完成:

 PermitRootLogin no PasswordAuthentication no 

查看Google-Authenticator,它的超级简单的设置和configuration,而且做的很好。 它就像RSA或任何其他两个因素的设置,谷歌有Android和iPhone的应用程序,所以是漂亮和容易的configuration。 而当从不受信任的主机连接,密码将被允许,如果两个因素authenticationconfiguration正确。