• ssh的chroot配置


    摘自:https://blog.csdn.net/yanggd1987/article/details/54310686

    需求


       普通用户通过ssh登陆到跳板机后,再通过ssh跳转到内网其他服务器。跳板机只提供ssh、ls等基本命令,禁止scp、sftp、管道等以防数据传输到本地;另外用户登陆后需要将其锁定在特定的目录下,防止用户浏览服务器数据。
       通常情况下我们使用磁盘限额来限制用户传输数据,但是磁盘限额必须是针对独立的磁盘分区,而不能够是文件目录,因此用户家目录必须是独立挂载的,若是放在根目录下,配置磁盘限额效果不大。
       ssh的chroot功能就可以很好的解决此类问题。根据sshd_config的man中所述,实现chroot功能需要配置”ChrootDirectory”这个参数。
       ChrootDirectory:定义了用户通过认证以后的chroot目录,此目录及其所有子目录的属主必须是root,且这些目录只有root帐号可以进行写操作,其他任何组和帐号都不可写。chroot以后,sshd会将用户的工作目录转到chroot目录中用户自己的主目录。如果ChrootDirectory定义的目录下没有相应的/home/username目录,则会直接转到chroot的/目录下

    配置

    本次实验将test用户锁定在/var/chroot下,test登陆后只能使用ssh、ls等基本命令。

    一、创建用户
    1.创建test用户(不创建其缺省家目录)

    useradd -M test
    passwd test

    2.建立chroot目录中用户主目录

    mkdir -p /var/chroot/home/test
    chown -R test.test /var/chroot/home/test
    chmod 700 /var/chroot/home/test

    二、搭建基本的chroot环境

    注意:一个最基本的chroot环境至少有一个shell(例如sh,bash)和一些必要的系统设备文件(例如/dev/null,/dev/zero),如果要允许用户执行一些命令,那么还要准备相应的命令可执行文件和命令依赖的库文件

    mkdir -p /var/chroot
    cd /var/chroot
    mkdir {bin,dev,lib64,etc,home}
    mknod dev/null c 1 3
    mknod dev/zero c 1 5
    #ssh命令需要,如缺少会报告:PRNG is not seeded
    mknod dev/random c 1 8
    mknod dev/urandom c 1 9
    #ssh命令需要,如缺少会报告:Host key verification failed
    mknod dev/tty c 5 0
    #修改/var/chroot及其子目录的属主,并修改权限
    chown -R root.root /var/chroot
    chmod -R 755 /var/chroot
    #允许用户写这些设备文件,不可写会有些命令报错
    chmod 0666 dev/{null,zero,tty}
    #复制/etc/passwd和/etc/group文件到/var/chroot/etc中,并删除用户自己和root以外的所有帐号。如果没有这两个文件,用登录以后会报“I have no name!”
    cp -p /etc/passwd /var/chroot/etc/
    cp -p /etc/group /var/chroot/etc/


    cat /var/chroot/etc/group
    root:x:0:
    test:x:516:
    cat /var/chroot/etc/passwd
    root:x:0:0:root:/root:/bin/bash
    test:x:516:516::/home/test:/bin/bash

    三、配置ssh

    vim /etc/ssh/sshd_config
    #在最后添加如下行,否则会报错
    Match User test
    ChrootDirectory /var/chroot

    #重启ssh
    service sshd restart

    四、拷贝基础命令
    例如用户登陆后必须有一个可用的shell,因此用到/bin/bash,还有其他命令如ls、mkdir等。
    注意:/bin/ls命令和/usr/bin/ssh命令使用的类库文件目录不一样,因此我们需要在执行脚本前先建好相应的路径(此问题已经通过脚本解决)

    ldd /bin/ls | awk '{ print $3 }' | grep "/lib" | sort | uniq
    /lib64/libacl.so.1
    /lib64/libattr.so.1
    /lib64/libcap.so.2
    /lib64/libc.so.6
    /lib64/libdl.so.2
    /lib64/libpthread.so.0
    /lib64/librt.so.1
    /lib64/libselinux.so.1
    ldd /usr/bin/ssh | awk '{ print $3 }' | grep "/lib" | sort | uniq
    /lib64/libcom_err.so.2
    /lib64/libcrypt.so.1
    /lib64/libc.so.6
    /lib64/libdl.so.2
    /lib64/libfipscheck.so.1
    /lib64/libfreebl3.so
    /lib64/libgssapi_krb5.so.2
    /lib64/libk5crypto.so.3
    /lib64/libkeyutils.so.1
    /lib64/libkrb5.so.3
    /lib64/libkrb5support.so.0
    /lib64/libnsl.so.1
    /lib64/libnspr4.so
    /lib64/libplc4.so
    /lib64/libplds4.so
    /lib64/libpthread.so.0
    /lib64/libresolv.so.2
    /lib64/librt.so.1
    /lib64/libselinux.so.1
    /lib64/libutil.so.1
    /lib64/libz.so.1
    /usr/lib64/libcrypto.so.10
    /usr/lib64/libnss3.so
    /usr/lib64/libnssutil3.so


    在此我们使用脚本:

    #!/bin/bash
    #comment:用于ssh登陆chroot后,给用户添加命令
    # 要允许执行的文件列表
    cmdlist="/bin/bash /bin/ls /bin/cp /bin/mkdir /bin/mv /bin/rm /bin/rmdir /usr/bin/ssh /usr/bin/id"
    # chroot路径
    chroot_path="/var/chroot"
    # 判断依赖的库文件
    lib_1=`ldd $cmdlist | awk '{ print $1 }' | grep "/lib" | sort | uniq`
    lib_2=`ldd $cmdlist | awk '{ print $3 }' | grep "/lib" | sort | uniq`
    # 复制命令文件
    for i in $cmdlist
    do
    if [ ! -d `dirname ${chroot_path}$i` ];then
    mkdir -p `dirname ${chroot_path}$i`
    fi
    cp -a $i ${chroot_path}$i && echo "$i done"
    done
    # 复制依赖的库文件(因为是i386,所以是lib,如果是x86_64,则是lib64,)
    for j in $lib_1
    do
    if [ ! -d `dirname ${chroot_path}$j` ];then
    mkdir -p `dirname ${chroot_path}$j`
    fi
    cp -f $j ${chroot_path}$j && echo "$j done"
    done
    
    for k in $lib_2
    do
    if [ ! -d `dirname ${chroot_path}$k` ];then
    mkdir -p `dirname ${chroot_path}$k`
    fi
    cp -f $k ${chroot_path}$k && echo "$k done"
    done

    至此,我们已经能够用test用户登陆了,并且用户被锁定在/var/chroot/home/test目录下,还可以使用ls mkdir等命令,但是此时ssh命令却无法使用。

    ssh test@10.60.80.100
    bash-4.1$ mkdir test 
    bash-4.1$ ls
    a test
    bash-4.1$ ssh root@10.60.80.101 
    You don't exist, go away!


    报这个错意味着系统无法通过用户数据库(可能的类型有 /etcp/passwd, /etc/group, /etc/shadow,/etc/gshadow)校验用户名是否正确。
    通常的解决方法是复制对应的文件到chroot目录中。
    对于ssh来说,可以复制/lib64/libnss_* ,这些文件复制到chroot目录下的对应目录.
    解决方法:

    cp /lib64/libnss_* lib64/.


    另外通过以上我们可以看到test用户登陆后默认为”bash-4.1$”,这是由于环境配置文件导致,我们可以通过以下更改:

    cp /etc/bashrc /var/chroot/etc/
    cp /home/xxx/.bashrc /var/chroot/home/test/
    cp /home/xxx/.bash_profile /var/chroot/home/test/
    在.bash_profile的PATH最后添加:/bin


    测试
    1.通过scp传输数据

    scp login_union.py test@10.60.80.100:/home/test
    test@10.10.65.100's password: 
    /etc/bashrc: line 65: id: command not found
    /etc/bashrc: line 65: id: command not found
    bash: scp: command not found
    lost connection

    由于我们没有安装id命令,因此显示”/etc/bashrc: line 65: id: command not found”,在脚本中添加/usr/bin/id即可
    由于跳板机没有安装scp命令,因此从远程主机传输数据时提示”bash: scp: command not found”,若要解决此问题只需在脚本中添加”/usr/bin/scp”命令即可

    2.通过sftp传输数据
    若需要允许使用sftp,只需修改以下即可

    vim /etc/ssh/sshd_config
    Subsystem sftp internal-sftp
  • 相关阅读:
    fort循环
    while
    函数和数组
    case
    init进程
    权限安全:堡垒机部署实践
    tcp首部当中seq和ack的增长规律
    VRRP
    MSTP
    字符集专题
  • 原文地址:https://www.cnblogs.com/LiuYanYGZ/p/12463926.html
Copyright © 2020-2023  润新知