我想要限制来自所有,除了一个IP地址的根loginSSHlogin。
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_config的Matchfunction,并匹配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正确。