我如何限制 ssh 用户(只有一个密钥)以仅允许:
- 一组命令,带有任意数量的参数
- 隧道功能(打开端口的能力)
我已经找到了一些基于authorized_keys或sshd配置的示例,但没有一个真正符合我的需要。
编辑:澄清一下,我不需要用户能够通过 ssh 进入机器并访问 shell。用户只是应该能够运行一组给定的命令,例如“ls”或“date”。我不想限制用户的参数。所以我想有一个白名单,而不是黑名单:我需要有一种方法来描述一组用户可以运行的命令,其他所有命令都被拒绝。
我希望用户能够运行的命令示例:
- ssh 远程服务器日期
- ssh 远程服务器‘ls -la’
- ssh -R 1234:localhost:5678 远程服务器
答案1
有很多不同的方法可以实现这一点。我将列出几种可能的解决方案。
我建议使用多个不同的保护层来防止用户运行他们不应该被允许访问的命令。这里的所有指示都假设用户有自己的/home/[username]
目录,他们的 shell 是/bin/bash
,并且您希望他们在登录系统时使用 bash shell。
1)更改目录权限,以便只有用户可以编辑其主目录的内容
chmod 755 /home/[username]
2)删除用户的.bashrc
文件
rm /home/[username]/.bashrc
本网站.bashrc
有更多信息说明为什么在这种情况下 删除可能是个好主意。
3).bash_profile
为您想要禁用的所有命令创建并添加“安全”别名
./bash_profile 文件示例
alias apt-get="printf ''"
alias aptitude="printf ''"
[...]
alias vi="vi -Z" #this is vi's safe mode and shell commands won't be run from within vi
alias alias="printf ''"
请检查完整的 bash 命令列表了解更多信息。您必须确保该alias alias="printf ''"
命令是列表中的最后一个命令,否则您将失去为所有这些命令设置别名的能力。
4)通过将 vi 命令别名为受限模式来禁用 vi 中的 shell 命令
语法是alias vi="vi -Z"
,但请参阅本网站了解更多信息。
5)将用户的所有权更改.bash_profile
为 root
chown root:root /home/[username]/.bash_profile
6)删除用户的写权限.bash_profile
chmod 755 /home/[username/.bash_profile]
7)最后将用户 bash 改为受限 bash 模式这样他们就无法更改目录(如果你的系统上没有受限的 bash 模式,此链接将为您提供帮助和更多信息)
chsh -s /bin/rbash [username]
现在,当用户登录时,他们将无法更改目录,所有您不希望他们使用的命令都将输出相同的信息,就像用户按下ENTER 没有指定命令的键一样,并且您的/bin/bash
功能保持不变。
根据您选择或不选择使用别名的函数,用户可能仍然能够绕过您实施的一些控制。但是,由于我们实施了一些安全缓冲区,因此用户必须真正了解计算机系统才能做任何危险的事情。
与此相关的是,您可能需要考虑的是,如果您将这些别名直接放入每个用户的文件中,.bash_profile
您将很难确定哪些功能应该使用别名,哪些不应该使用别名,如果您需要更改任何内容的别名,则必须单独更改所有别名。此外,由于用户可以使用vim
或vi
查看文件,因此他们可以看到文件的内容.bash_profile
并了解他们有哪些限制,哪些没有限制。
为了解决这个问题,我建议。
1)将所有别名放在用户无法访问的目录中(将内容粘贴到.bash_profile
这里)
/[path_to_file]/startup_functions_for_beginners.sh
2)将别名导入到他们的.bash_profile
改进的 ./bash_profile 文件示例
if [[ -f /[path_to_file]/startup_functions_for_beginners.sh ]]; then
. /[path_to_file]/startup_functions_for_beginners.sh
fi
这应该可以让你顺利前行,但请记住,几乎总有办法可以规避限制。
另外,您可以随意混合此答案中的信息以满足您的需求。这些绝对可以与许多其他限制相结合。
问:我需要用户有权访问fg
和bg
,但我不希望他们能够访问aptitude
或bash
alias apt-get="printf ''" #the user won't be able to run this
alias aptitude="printf ''" #the user won't be able to run this
alias bash="printf ''" #the user won't be able to run this
#alias fg="printf ''" #this will run as a bash built-in
#alias bg="printf ''" #you actually don't need to include these in your script