写于:2014-07-18	最近一次更新:2015-12-23

Intent:

限制某用户使用ssh登录时能够使用的命令,限制同一用户从不同ssh客户端登录时能够使用的命令,限制某ssh用户不能使用scp和sftp,而不影响其他用户使用scp和sftp等

Oneway:

利用ssh的PublicKey和bash的restricted模式来达到我们想要的结果 以下步骤均是在sshServer机器上操作 (必须将/etc/ssh/sshd_config中的密码认证关闭,修改为PasswordAuthentication no) 1.限制用户使用ssh登录时使用的命令 在$HOME/.ssh/authorized_keys文件中,记录了允许登入的sshClient公钥, 没有将公钥写入这个文件的sshClient则被拒绝登入 不同的sshCLient有不同的公钥,虽然都是使用同一个ssh用户登入 但是,因sshClient所在环境的安全程度不同,可以在authorized_keys文件中限制从 不同sshClient登入时能够执行的命令,增强系统安全.方法就是在每个key前加入这样一句 command="bash --restricted --noprofile --rcfile $HOME/.restricted_profile" 这一句一定要加在key的行首,以空格隔开,就是说这一句一定要与key在同一行 加的这一句意思是,执行bash的严格模式,不加载用户profile配置,执行指定的脚本文件 在$HOME/.restricted_profile文件中写入你想要的配置,比如 export PATH=${HOME}/bin/ 然后将你允许执行的命令软连接到${HOME}/bin/目录下,或者在这个目录下写自己的脚本 这样,就能限制ssh登录后能够使用的命令了 2.限制同一用户从不同ssh客户端登录时能够使用的命令 要想限制特定sshClient登录后的命令使用, 就在特定sshClient对应的公钥前用command指定特定的--rcfile文件 3.限制某ssh用户不能使用scp和sftp,不影响其他用户使用scp和sftp,且不影响登入用户其他命令的使用 只要在对应的公钥前加上command="bash"这样一小句就足够了

Extend:

允许陌生人使用ssh访问我在内网的电脑,以帮助我排除电脑故障,同时记录这个陌生人对我电脑的所有操作 内网故障电脑A,公网机器B,来解决故障的志愿者C 公网机器B上设置:新建用户userB,使用shell为/bin/false, 并在/home/userB/.ssh/authorized_keys文件中加入内网机器A上用户userA的PublicKey 修改/etc/ssh/sshd_config中的配置如下 AllowUsers userB #允许userB使用sshd GatewayPorts yes #开启sshd网关转发,使任何网络来源的人都可以使用sshServer的转发功能 内网机器A上设置:允许A机器的用户userA能够使用sshd, 并在userA家目录下的/home/userA/.ssh/authorized_keys文件中加入志愿者C的PublicKey和ssh远程登录时的严格控制条件 command="bash --restricted --noprofile --rcfile $HOME/.restricted_profile" 这一行命令加在公钥的最前面,以空格隔开,最终像这样 command="bash --restricted --noprofile --rcfile $HOME/.restricted_profile" ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAdfdaAFAD Wgdaadfdfdgfadsfasdfdsgds......fazzFslglXo3 userC@slackware 然后新建/home/userA/.restricted_profile文件,加入如下内容 export PATH=${HOME}/bin 接着,创建/home/userA/bin目录, 在/home/userA/bin目录下创建可执行脚本hi,其内容为screen -xU forhelp 凡是想要userA通过ssh登录时能够执行的命令都可以添加软连接到该目录下, 没有添加的命令则不能执行 最后,执行两行命令 ssh -fNR 56789:localhost:22 userB@serverB screen -xURL forhelp(注意这条命令只能用userA帐号正常创建screen会话,不能userA提权到root后再执行这条命令,否则C机器用userA帐号登录不进来) 志愿者C机器上操作:ssh -p 56789 userA@serverB hi (注意:userA这个帐号在serverB上存不存在并不重要, 因为userA是内网机器A上有ssh登录权的用户名称, 机器B的功能只是数据转发,不需要志愿者登录B机器) 这样,志愿者C就可等陆到内网的A机器对A进行帮助了, 而且A可以对C的操作看得一清二楚,因A使用了-L参数创建screen会话, 所以C的所有操作和屏幕输出都被记录在screenlog.0这个文件中. 当A用户终结screen的forhelp会话后,则C即使已经登录到A了,C也执行不了任何操作. 为了安全起见, 建议将${HOME}/.ssh/authorized_keys, hi脚本以及${HOME}/.restricted_profile这三个文件添加 i 属性, screenlog.0 这个文件添加 a 属性, 并在 /etc/screenrc 文件中添加一行 maxwin 1 ,设置只允许存在一个窗口