如何配置SSH密钥仅用于SCP,而SSH登录仍需密码验证
如何配置SSH密钥仅用于SCP,而SSH登录仍需密码验证
别担心,这个需求其实很好实现,核心就是给你那对免密的SSH密钥加个「命令白名单」——让它只能用来执行SCP相关的命令,直接SSH登录的话就拒绝。具体操作步骤我给你理清楚:
先登录到你的目标服务器(不管是用现在的免密SSH,还是输密码登录都行)。
找到服务器上的
~/.ssh/authorized_keys文件,用你习惯的编辑器打开它,比如nano ~/.ssh/authorized_keys。找到你之前通过
ssh-copy-id传过来的公钥条目(就是以ssh-rsa或者ssh-ed25519开头的那一行),在这一行的最前面加上这段限制代码:command="if [[ \"$SSH_ORIGINAL_COMMAND\" =~ ^scp\ -(t|f)\ .*$ ]]; then $SSH_ORIGINAL_COMMAND; else echo 'Only SCP operations are allowed with this key' >&2; exit 1; fi"注意要和后面的公钥内容连在一起,中间留个空格就行,最终的行看起来大概是这样:
command="if [[ \"$SSH_ORIGINAL_COMMAND\" =~ ^scp\ -(t|f)\ .*$ ]]; then $SSH_ORIGINAL_COMMAND; else echo 'Only SCP operations are allowed with this key' >&2; exit 1; fi" ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ...保存文件并退出编辑器,注意:一定要确保
~/.ssh目录的权限是700,authorized_keys文件的权限是600(如果不是的话,执行chmod 700 ~/.ssh和chmod 600 ~/.ssh/authorized_keys来调整,不然SSH会因为权限过于开放而忽略这个密钥的限制配置)。
现在你可以测试一下效果了:
- 尝试用这个密钥直接SSH登录服务器,应该会收到提示「Only SCP operations are allowed with this key」然后被踢出来,这时候你就只能用密码登录SSH了。
- 再用SCP传文件,比如
scp local_file user@server:/target/path,应该还是能正常免密传输,完全不受影响。
如果你想更严格一点,比如限制SCP只能访问某个特定目录,还可以把判断条件改得更具体。比如只允许往/home/youruser/transfer_files目录传东西,那把command里的正则改成^scp\ -t\ /home/youruser/transfer_files/.*$就行,这样用这个密钥连其他目录的SCP也会被拒绝,安全性更高。
备注:内容来源于stack exchange,提问作者KT_
相关产品推荐
相关产品推荐

