我正在尝试设置一个环境,让某个组中的多个用户可以通过 SSH 进入服务器,然后使用密钥交换或密码在该服务器上执行一组预定义命令。到目前为止,我被告知要查看 authorized_keys“命令”部分,但据我所知,这仅对非人类用户有用。
有没有办法将某个特定用户组的一些命令列入黑名单或白名单?
例如,X 组中的用户应该可以执行ls
、/etc/init.d
、 等操作rm
,但不能执行其他操作。
答案1
您需要使用您选择的脚本语言创建一个受限的命令 shell,然后设置 sshd 来强制您指定的组使用此受限 shell。
示例 8-1 及其以下部分O'Reilly 的 SSH,安全外壳第 8 章展示实现前者的方法。
对于后者,请参阅Match
中的指令描述sshd_config(5)
。
例如,您可以将以下内容添加到/etc/ssh/sshd_config
:
Match Group X
ForceCommand /path/to/your/restricted_shell
答案2
我认为正确的做法是结合chroot(受控/受限环境)远程控制
答案3
不确定它是否适合您的环境,我在我的环境中使用它。想法是使用受限的 bash,清理 $PATH,保护 $PATH 并将 $PATH 设置为 $HOME/bin,然后您只需将您允许用户运行的所有二进制文件符号链接到 $HOME/bin。
-------------------------------------------
#!/bin/bash
USERS="user"
PASS=secret
ALLOWED_CMDS="/bin/ping
/usr/bin/killall
/bin/ps
"
# creating restricted bash
ln -s /bin/bash /bin/rbash
for user in ${USERS}; do
home=/home/${user}
echo useradd --comment \"CDM user with restricted shell\" --home-dir ${home} --shell /bin/rbash ${user}
useradd --comment "CDM user with restricted shell" --home-dir ${home} --shell /bin/rbash ${user}
echo "set password for ${user}"
echo ${PASS} | passwd ${user} --stdin
if [ -d ${home} ]; then
# deleting unneeded files
files=".bashrc .bash_history .bash_logout .bash_profile .emacs .mozilla"
for file in ${files}; do
rm -rfv ${home}/${file}
done
# creating bin dir and profile
echo "export PATH=\$HOME/bin"> /home/$user/.profile
echo "export PS1=\"[\u@\h \W]$ \"">> /home/$user/.profile
mkdir ${home}/bin
chmod -R 755 ${home}
chown -R root:root ${home}
chmod 750 ${home}/.profile
chown root:${user} ${home}/.profile
chmod 2070 /home/$user
chown root:$user /home/$user
# allowed specific commands only
echo "creating symlinks for allowed commands.."
for cmd in ${ALLOWED_CMDS}; do
ln -sv ${cmd} ${home}/bin/
done
fi
done
-------------------------------------------
[root@puppet tmp]# sh create_user.sh
[root@puppet tmp]# su -l user
[user@puppet ~]$ ping
Usage: ping [-LRUbdfnqrvVaA] [-c count] [-i interval] [-w deadline]
[user@puppet ~]$ ls
-rbash: ls: command not found
[user@puppet ~]$ cd
-rbash: cd: restricted
[user@puppet ~]$ pwd
/home/user
[user@puppet ~]$ ps
PID TTY TIME CMD
9605 pts/1 00:00:00 rbash
9629 pts/1 00:00:00 ps
[user@puppet ~]$ killall
Usage: killall [-Z CONTEXT] [-u USER] [ -eIgiqrvw ] [ -SIGNAL ] NAME...
[user@puppet ~]$ nc
-rbash: nc: command not found
[user@puppet ~]$ nmap
-rbash: nmap: command not found