我们有堡垒服务器。我们应该有一些用户需要使用代理服务器和私钥从本地通过堡垒服务器 SSH 到 C。
我想创建仅应有权从 Bastion 主机访问 ssh 的用户和组(通过 proxyCommand 实现)。他们也不需要读取文件。
我该怎么做?有办法吗?
如果上述方法不可行,则另一种选择是仅对允许的文件具有读取权限,但仅限于对其组具有读取权限的受限文件(由操作系统默认)。
答案1
这是如何允许特定用户仅使用某些指定的命令:
将用户 shell 更改为受限 bash:
chsh -s /bin/rbash <username>
在用户主目录下创建bin目录:
sudo mkdir /home/<username>/bin sudo chmod 755 /home/<username>/bin
将用户的默认 PATH 更改为此 bin 目录:
echo "PATH=$HOME/bin" >> /home/<username>/.bashrc echo "export PATH >> /home/<username>/.bashrc
为用户需要的命令创建符号链接:
sudo ln -s /bin/<command> /home/<username>/bin/
~/.bashrc
通过使其不可变来限制用户更改:chattr +i /home/<username>/.bashrc
这样,您只需创建您想要允许的命令的符号链接。
为了对多个用户执行相同操作,您可以创建一个包含这些命令并以用户的名称作为参数的 bash 脚本。
编辑:在 CentOS 中,rbash 可能无法直接实现,可能需要创建符号链接,在某些其他版本的 GNU/Linux(如 Red Hat)中也是如此:
# cd /bin
# ln -s bash rbash
编辑2:
如果 rbash 限制太多,那么普通 bash 也可以这样做,但这需要更多工作:您需要/bin
通过使用setfacl -m u:user1:r /bin/su
forsu
和其他您不想使用的命令来禁止执行几乎所有命令,因此它们对用户来说是只读的,尤其是不可执行的。
看这个答案 更多细节。
答案2
网络流量
您可以使用iptables
限制网络流量:
# Allow port 22 traffic to a specific IP/hostname for a specific user
iptables -A OUTPUT -p tcp --dport 22 -d allowed_host -m owner --uid-owner username -j ACCEPT
# Block all other outgoing port 22 (SSH) traffic
iptables -A OUTPUT -p tcp --dport 22 -d 0.0.0.0/0 -j REJECT
文件系统访问
要限制文件系统访问,您可以使用文件系统权限
他们也不需要读取文件。
为了能够登录,他们需要能够读取一些文件:
- 用户主目录
- 用户 shell 的可执行文件和所有库
要禁止普通用户的读取访问,您可以从 root 拥有的文件中删除全球可读标志,或者从 root 拥有的目录中删除全球可执行和全球可读标志:
# chmod o-r secret-file
# ls -l secret-file
-rw-r----- 1 root root 0 Mar 27 13:23 secret-file
# chmod o-rx secret-dir/
# ls -ld secret-dir/
drwxr-x--- 2 root root 64 Mar 27 13:24 secret-dir/