/chroot环境搭建 - 定制的小型文件系统

本文介绍如何在 RedHat 5.5 上为特定用户配置 SSH Chroot 环境,包括创建目录结构、复制必要文件、配置 PAM 模块及调试过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:http://4585258.blog.51cto.com/4575258/1285734/

服务器 RedHat5.5  


root用户操作:

1. 部署目录环境

创建一个目录,目录结构与实际的/目录结构类似

创建用户

useradd ppp

passwd ppp


chroot目录设置在/chroot

mkdir -p /chroot/{etc,dev,proc,lib,bin,home,usr}

mkdir -p /chroot/usr/{bin,lib,libexec}

mkdir -p /chroot/home/ppp


拷贝/etc/passwd文件

cp -a /etc/passwd/ chroot/etc/passwd 然后删除里面的无关用户。

拷贝需要的命令例如

cp -a /bin/bash /chroot/bin/

查看bash命令需要哪些.so文件,拷贝到相应的目录中

[root@localhost ~]# ldd /bin/bash

       linux-gate.so.1 =>  (0x003a6000)

       libtermcap.so.2 => /lib/libtermcap.so.2 (0x004b7000)

       libdl.so.2 => /lib/libdl.so.2 (0x004b1000)

       libc.so.6 => /lib/i686/nosegneg/libc.so.6 (0x00110000)

       /lib/ld-linux.so.2 (0x0031f000)


拷贝动态库文件

cp -a /lib/{libtermcap.so.2,libdl.so.2,ld-linux.so.2}  /chroot/lib

cp -a /lib/i686/nosegneg/libc.so.6  /chroot/lib/


拷贝完成后,ls -l,会发现拷贝的都是软链接文件

1.# ll

2.total 0

3.lrwxrwxrwx. 1 root root 10 Feb 6 13:58 ld-linux.so.2 -> ld-2.12.so

4.lrwxrwxrwx. 1 root root 12 Feb 6 13:58 libc.so.6 -> libc-2.12.so

5.lrwxrwxrwx. 1 root root 13 Feb 6 13:58 libdl.so.2 -> libdl-2.12.so

6.lrwxrwxrwx. 1 root root 15 Jan 16 22:36 libtinfo.so.5 -> libtinfo.so.5.7


拷贝原始文件

cp -a /lib/{ld-2.12.so,libc-2.12.so,libdl-2.12.so,libtinfo.so.5.7} /chroot/lib


拷贝用户下的信息

cp -a /home/ppp/* /chroot/home/ppp/


简单测试一下,看看chroot命令是否可以用该目录当作/环境。

chroot /chroot

没有错误信息即可,正常应显示bash的信息。


2. ssh设置

cat /etc/ssh/sshd_config | grep UsePAM

确保

UsePAM yes

默认为yes

3. pam验证增加chroot模块

/etc/pam.d/sshd

在最下面添加一行:

session required pam_chroot.so

一定要确保输入正确,否则可能造成ssh无法登录.


pam_chroot.so 执行后会读取配置文件以决定是否使用chroot环境。

/etc/security/chroot.conf

[root@localhost security]# cat chroot.conf

# /etc/security/chroot.conf

# format:

# username_regex        chroot_dir

#matthew                /home

增加下面一行

ppp                     /chroot


4. 调试ssh服务

测试:

ssh ppp@192.168.13.136

登录失败,打开/var/log/secure日志查看:

Aug 19 07:08:52 localhost sshd[9993]: pam_env(sshd:setcred): Unable to open config     file: /etc/security/pam_env.conf: No such file or directory

  Aug 19 07:08:52 localhost sshd[9978]: error: openpty: No such file or directory

  Aug 19 07:08:52 localhost sshd[9993]: error: session_pty_req: session 0 alloc failed


cp -a /etc/security /chroot/etc/

chroot准备dev环境,准备pts环境以及准备proc环境

mount --bind /dev /chroot/dev

mount -t devpts -o pid=5,mode=620 devpts /chroot/dev/pts

mount -t proc /proc /chroot/proc/


再次登录测试:

ssh ppp@192.168.13.136

Aug 2007:08:52 localhost sshd[21426]: pam_env(sshd:setcred): Unable to open env file:        /etc/environment: No such file or directory

Aug 2007:08:52 localhost sshd[21390]: error: ssh_selinux_setup_pty: security_compute_relabel: No such file or directory


cp -a /etc/environment /chroot/etc/


重新测试:

ssh ppp@192.168.13.136

ppp@192.168.13.136's password:

-bash-3.5$


OK,可以正常登录了。


5. 环境设置

最简单的就是不设置环境,使用bash版本号作为提示符。

或者也可以按正常的用户一样设置提示符,需要做的操作比较多。

cp -a /etc/{profile,profile.d,bashrc}  /chroot/etc/

ssh ppp@192.168.13.136

ppp@192.168.13.136's password:

-bash: id: command not found

-bash: id: command not found

-bash: uname: command not found

-bash: /bin/grep: No such file or directory

-bash: /bin/grep: No such file or directory

-bash: /bin/grep: No such file or directory

-bash: /usr/bin/id: No such file or directory

-bash: [: =: unary operator expected


#whereis id

id: /usr/bin/id /usr/share/man/man1p/id.1p.gz /usr/share/man/man1/id.1.gz

cp -a /usr/bin/id /chroot/usr/bin/

cp -a /bin/grep  /chroot/bin/

cp -a /bin/uname  /chroot/bin/


#  ldd /chroot/usr/bin/id

       linux-vdso.so.1 =>  (0x00007fff4cba1000)

       libselinux.so.1 => /lib/libselinux.so.1 (0x0000003690200000)

       libc.so.6 => /lib/libc.so.6 (0x000000368e600000)

       libdl.so.2 => /lib/libdl.so.2 (0x000000368ea00000)

       /lib/ld-linux.so.2 (0x000000368e200000)

按上面的方法解决即可。


如果SSH登录不能上传下载文件的话,有可能是sftp的问题

[root@localhost ssh]# cat sshd_config | tail -1

Subsystem       sftp    /usr/libexec/openssh/sftp-server


可能是sftp-server没有加载

cp -a /usr/libexec/openssh/sftp-server /chroot/usr/libexec/openssh/sftp-server


然后在/chroot/home/ppp/目录下修改.bashrc文件

再最前面加一行

[ -z "$PS1" ] && return
或者:
[$-!=*i*]&&return

. .bashrc  执行加载


ssh登录即可上传下载文件。


补充:

1)在我的环境中,执行到第4步ssh连接时报错:

pam_unix(sshd:session): session closed for user root

解决办法:

vi /etc/ssh/sshd_config

修改如下内容:

#PermitRootLogin NO

PermitRootLogin yes

2)使用ssh上传文件失败

第一次执行失败是因为方括号两侧未留空格,正确写法:[ $-!=*i* ] && return

[root@localhost zhangs]# . .bashrc 
-bash: [himBH!=*i*]: command not found
[root@localhost zhangs]# vi .bashrc 
[root@localhost zhangs]# . .bashrc 
[root@localhost zhangs]#


centos7中配置

http://www.myhack58.com/Article/sort099/sort0102/2017/86571.htm


<think>好的,我现在需要帮助用户解决在Debian/Ubuntu构建服务的bullseye-xfce-arm64 chroot环境下遇到的“test-dev-null权限被拒绝”的问题。首先,我需要理解这个问题的背景和可能的原因。 用户提到的是在chroot环境中构建服务时出现的权限问题,具体是访问/dev/null时被拒绝。这通常涉及到文件系统权限或设备节点的配置问题。在chroot环境中,/dev/null是一个重要的设备文件,如果权限不正确或者设备节点不存在,可能会导致应用程序无法正常访问,从而引发错误。 接下来,我需要考虑可能的原因。首先,检查chroot环境中是否存在/dev/null设备节点。如果用户手动创建了chroot环境,可能没有正确挂载或创建设备节点。Debian的chroot工具如debootstrap通常会自动处理这些,但在某些定制环境中可能会遗漏。 然后,权限问题。即使设备节点存在,其权限和所有权是否正确?通常,/dev/null的主设备号和次设备号应该是1和3,权限为666,允许所有用户读写。如果权限设置不正确,比如被设置为root所有且其他用户没有访问权限,就会导致权限拒绝。 另外,构建服务可能使用了特定的用户(如普通用户或特定的服务账户)来执行构建任务,这时候需要确保该用户在chroot环境中有足够的权限访问/dev/null。可能需要在挂载时指定正确的选项,比如使用bind挂载并设置uid/gid映射,或者使用sudo或fakeroot来提升权限。 还有可能是SELinux或AppArmor等安全模块的限制,导致访问被拒绝。需要检查这些安全策略是否阻止了进程访问/dev/null。不过,在默认的Debian/Ubuntu环境中,AppArmor可能不会对chroot内的操作进行严格限制,但也不能完全排除。 解决方案方面,首先需要进入chroot环境检查/dev/null是否存在及其属性。如果不存在,需要手动创建。可以使用mknod命令,但要注意主次设备号是否正确。如果权限不正确,使用chmod和chown进行调整。 如果构建过程是在特权环境下运行的,可能需要调整挂载选项,确保设备节点正确挂载。或者在构建脚本中添加创建和设置设备节点的步骤,特别是在chroot初始化阶段。 此外,检查构建服务的配置文件,是否有选项可以自动处理设备节点的创建。例如,某些工具支持--include=dev参数,或者在debootstrap时添加必要的组件。 还需要考虑用户是否在构建环境中正确使用了fakeroot或类似的工具,这些工具可以模拟特权操作,使得普通用户能够执行需要root权限的任务,比如创建设备节点。 最后,如果问题仍然存在,查看详细的错误日志,确定具体的失败点。可能还需要在chroot环境中运行测试命令,如尝试写入/dev/null,以验证权限是否正确。 总结可能的原因和解决方案步骤后,我需要将这些整理成用户友好的建议,逐步引导用户检查并解决问题。同时,要提醒用户注意安全,避免过度放宽权限,尤其是在生产环境中。</think>### Debian/Ubuntu构建服务中chroot环境/dev/null权限问题解决方案 #### 问题分析 在chroot环境中出现`test-dev-null permission denied`错误,通常由以下原因导致: 1. **设备节点缺失**:chroot环境中未正确创建`/dev/null`设备文件 2. **权限配置错误**:设备文件权限未设置为666或所有权错误 3. **挂载隔离限制**:构建服务的安全策略阻止了设备访问[^1] #### 解决方案步骤 1. **检查设备节点存在性** ```bash # 进入chroot环境 sudo chroot /path/to/chroot /bin/bash ls -l /dev/null ``` - 正常应显示:`crw-rw-rw- 1 root root 1, 3 ... /dev/null` - 若缺失则需创建: ```bash mknod -m 666 /dev/null c 1 3 ``` 2. **验证设备权限** ```bash chmod 666 /dev/null chown root:root /dev/null ``` 3. **配置构建服务的chroot初始化** 对于`debootstrap`创建的chroot环境: ```bash debootstrap --variant=buildd --include=udev,libdevmapper1.02.1 bullseye /path/to/chroot ``` 4. **添加挂载绑定(临时方案)** ```bash mount --bind /dev/null /path/to/chroot/dev/null ``` 5. **使用fakeroot构建** 在构建命令前添加: ```bash fakeroot your_build_command ``` #### 优化建议 - 在`/etc/schroot/schroot.conf`中添加设备白名单: ``` [bullseye-xfce-arm64] personality=linux type=directory directory=/srv/chroot/bullseye-xfce-arm64 devices=/dev/null,/dev/zero,/dev/random ``` #### 典型错误排查 ```bash # 查看实时错误日志 journalctl -f -u buildd.service # 测试写入权限 echo "test" > /dev/null # 若返回"Permission denied",需检查SELinux/AppArmor策略 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值