一个计算机技术爱好者与学习者

0%

好好学Linux:限制用户命令

1. 前言

在Linux系统中,为了增强安全性,避免不适当的使用,有时需要限制特定用户或用户组的命令行访问。

常用的限制方法包括 profile限制、authorized_keys限制、rbash限制,本文我们就来学习一下这些方法。

参考文档:

2. profile限制

当一个shell登录时,它将读取 /etc/profile 文件中的全部环境变量,然后再执行 /etc/profile.d/ 目录中的所有 .sh 结尾的脚本。
因此,我们可以定义一个 /etc/profile.d/login.sh 脚本,用来限制用户的PATH,以此限制用户命令。

下面是一个 login.sh 示例,限制用户只能使用 ssh 命令。

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
user=`whoami`

if [ "${user}" != "root" ];then
echo -e "** \e[01;33m current user is: \e[01;31m $LOGNAME\e[00m ** \e[00m"
mkdir -p $HOME/bin
rm -f $HOME/bin/*
ln -s /usr/bin/ssh $HOME/bin/
echo 'PATH=$HOME/bin' > $HOME/.restricted_profile
echo 'export PATH' >> $HOME/.restricted_profile
chown ${user}:${user} $HOME/.restricted_profile
exec bash --restricted --noprofile --rcfile $HOME/.restricted_profile
fi

但是,这种方法只能限制用户登录后的命令,如果用户远程执行命令,就限制不住了。
比如:

1
ssh -t work@192.168.55.100 "bash"

更多关于登录session和非登录session的内容,可以参考《bash_profile和bashrc的区别》

3. authorized_keys限制

想要限制非登录session,一种可选的方案是使用 authorized_keys 。

1、authorized_keys 中配置 public key

1
command="/usr/bin/ssh $SSH_ORIGINAL_COMMAND@tiger.voidking.com -p 2222" ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC9...

2、用户使用ssh

1
ssh -t work@192.168.55.100 "haojin"

详情参考:《shell命令之ssh》

4. rbash限制

4.1. rbash简介

rbash(restricted bash)是 bash 的一个版本,实际上 rbash 是 bash 的一个软连接,能够限制用户的命令。

具体限制包括:

  • 不能执行 cd 命令。只能在当前目录下工作,其它目录都无法进入。
  • 不能修改 PATH、ENV、HOME、SHELL等环境变量的值。
  • 不能执行包含 / 字符的程序。例如,我们无法执行 /usr/bin/uname 或 ./uname 命令或程序。但是,我们依然可以运行 uname 命令。也就是说,当前目录以外的程序或命令是无法被执行的。
  • 不能使用 >>> 等重定向运算符进行重定向输出。
  • 不能在脚本中或其它方式关闭 Restricted Shell 模式。
  • 不能使用 set+r 或 set+o restricted 等方式退出 Restricted Shell 模式。

4.2. rbash限制只能执行ssh

1、创建一个用户

1
2
3
4
5
6
# ls -s /bin/bash /bin/rbash
useradd -s /bin/rbash -m ruser
touch /home/ruser/{.bashrc,.bash_profile}
chown -R root:ruser /home/ruser/{.bashrc,.bash_profile}
chmod 640 /home/ruser/{.bashrc,.bash_profile}
mkdir -p /home/ruser/bin

2、限制用户只能执行ssh

1
2
echo "export PATH=/home/ruser/bin" >> /home/ruser/.bash_profile
ln -s /usr/bin/ssh /home/ruser/bin/ssh

但是,rbash有很多逃逸方法,比如一个简单的bash命令就可以逃逸,无论是session登录还是非session登录。

1
ssh -t work@192.168.55.100 "bash"

5. 限制用户命令实战

5.1. 需求描述

  • jumpserver只能内网使用,但是有少量外网用户也需要使用jumpserver。
  • 为避免增加了风险,jumpserver不能放通到外网。

5.2. 解决方案

外网可以访问的主机A放通一个ssh命令用于登录,主机A可以连通到jumpserver主机。

5.3. Step1:制作并运行ssh镜像

1、准备一个限制登录脚本 ssh.sh

1
2
3
4
#!/bin/bash

echo "`date +%Y%m%d%H%M%S` ssh script was executed by key: $SSH_KEY" >> /opt/ssh.log
ssh -o StrictHostKeyChecking=no -o HostKeyAlgorithms=+ssh-rsa $SSH_ORIGINAL_COMMAND@jump.voidking.com -p 2222
1
chmod a+x ssh.sh

2、定义 Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# Using debian as base
FROM debian:bookworm-slim

# Maintainer
MAINTAINER voidking "voidking@qq.com"

# Update and install openssh
RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list.d/debian.sources
RUN apt-get update && \
apt-get install -y --no-install-recommends openssh-server

RUN cd /etc/ssh && ssh-keygen -A && mkdir -p /run/sshd

# Disable SFTP and password login
RUN sed -i '/sftp/c\Subsystem sftp /bin/false' /etc/ssh/sshd_config && \
sed -i '/PasswordAuthentication/c\PasswordAuthentication no' /etc/ssh/sshd_config && \
echo 'PermitUserEnvironment yes' >> /etc/ssh/sshd_config

COPY ssh.sh /opt/ssh.sh
RUN chmod 777 -R /opt

# Add new user
# RUN useradd -m work && echo "work:work123" | chpasswd
RUN useradd -m work && \
mkdir -p /home/work/.ssh && \
chown work:work /home/work/.ssh && \
touch /home/work/.ssh/authorized_keys && \
chown work:work /home/work/.ssh/authorized_keys && \
chmod 600 /home/work/.ssh/authorized_keys

# Set the entry point
ENTRYPOINT ["/usr/sbin/sshd", "-D"]

3、打包镜像

1
docker build -t voidking/ssh:debian-bookworm-slim .

4、运行镜像

1
2
3
4
5
docker run -d --name ssh \
-p 10022:22 \
-v /etc/timezone:/etc/timezone:ro \
-v /etc/localtime:/etc/localtime:ro
voidking/ssh:debian-bookworm-slim

5.4. Step2:配置public key

配置外部用户的 public key 到ssh容器中 work用户的authorized_keys,以使得外部用户有权限执行 command 中指定的 ssh.sh 脚本。

1
2
3
docker exec -it ssh /bin/bash

echo 'environment="SSH_KEY=haojin",command="/opt/ssh.sh $SSH_ORIGINAL_COMMAND" ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC9...' >> /home/work/.ssh/authorized_keys

5.5. Step3:测试登录

1
ssh -t work@192.168.55.100 -p 10022 "haojin"