我正在设置一个最小的chroot,并希望避免使用sudo或su,但仍然以非root身份运行我的进程.这是运行chroot requiers root的一个技巧.我可以编写一个程序,它看起来像这样:
uid = LookupUser(args[username]) // no /etc/passwd in jail
chroot(args[newroot])
cd("/")
setuids(uid)
execve(args[exe:])
Run Code Online (Sandbox Code Playgroud)
这是我最好的选择,还是有一个标准工具可以帮助我?
我在这里自己动手:
对于两个进程A和B,两者都使用库libc.so,libc.so只加载到内存中一次.当A和B都在同一主机和相同的rootfs上运行时,这是正常情况.
对于容器,如果A和B在不同的容器中运行,A和B是否共享相同的内存区域?
例如
imageA
--libc.so
--programA
imageB
--libc.so
--programB
我们使用chroot在不同的rootfs中运行A和B. 两个libc.so是一样的.libc.so会被加载到内存中两次吗?
如何在没有root权限的情况下检测到chroot监狱?假设标准的BSD或Linux系统.我想出的最好的方法是查看"/"的inode值并考虑它是否相当低,但我想要一种更准确的检测方法.
[edit 20080916 142430 EST]
简单地查看文件系统是不够的,因为复制诸如/ boot和/ dev之类的东西以欺骗被监禁的用户并不困难.
[edit 20080916 142950 EST]
对于Linux系统,在/ proc中检查意外值是合理的,但是那些首先不支持/ proc的系统呢?
我正在写一个应该这样做的脚本......
chroot /chroot_dir/ su -
./startup.sh (This should run within the su environment)
Run Code Online (Sandbox Code Playgroud)
我试过这种方法:
chroot /chroot_dir /bin/bash -c " su -; ./startup.sh"
Run Code Online (Sandbox Code Playgroud)
这会尝试执行用户切换和脚本作为字符串命令来打击......但是它做什么,它是在"su - "之后"停止 "并且不执行脚本.但是,一旦我离开"su - "环境,它确实尝试运行startup.sh,但当然,它无法找到它.
基本上我需要嵌套"startup.sh"才能在"su - "环境中运行...
有任何想法吗?
非常感谢
我想将公钥授权添加到我的sftp chroot目录,但我总是得到:
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /home/test/.ssh/id_rsa
debug3: send_pubkey_test
debug2: we sent a publickey packet, wait for reply
debug1: Authentications that can continue: publickey
debug2: we did not send a packet, disable method
debug1: No more authentication methods to try.
Permission denied (publickey).
Couldn't read packet: Connection reset by peer
Run Code Online (Sandbox Code Playgroud)
Chroot有效,因为可以使用密码进行授权.我在没有chroot的主机上有其他帐户,它可以使用此密钥.我尝试了很多次,但它仍然没有用.
在auth.log中的服务器上只有:连接由xxx [preauth]关闭
这是我的目录:
ls -laR /sftp/
/sftp/:
total 12
drwxr-xr-x 3 root root 4096 May 3 16:55 .
drwxr-xr-x 23 root root 4096 …
Run Code Online (Sandbox Code Playgroud) 这是我的问题:我想在docker容器中构建一个chroot环境.问题是debootstrap无法运行,因为它无法在chroot中挂载proc:
W: Failure trying to run: chroot /var/chroot mount -t proc proc /proc
(日志问题原来是:mount: permission denied
)
如果我run --privileged
是容器,它(当然)工作......我真的非常想在Dockerfile中解除chroot(更清洁).有没有办法让它发挥作用?
非常感谢!
虽然还有另一个类似主题的问题,但它并没有涵盖chrooted jails中共享库的内存使用.
假设我们有一些类似的chroots.更具体地说,完全相同的二进制文件和共享库集合实际上是主副本的硬链接以节省磁盘空间(为了防止文件系统更改的可能性,只读文件系统).
在这样的设置中如何影响内存使用?
我正在尝试创建一个chroot来运行一个需要Internet访问的程序来构建一个沙盒化的,不可变的开发人员环境.到目前为止,我的监狱工作得很好:我可以在其中运行bash并从那里运行简单的程序!但DNS解析不起作用:
bash-3.2$ curl google.ca
curl: (6) Could not resolve host: google.ca
Run Code Online (Sandbox Code Playgroud)
我几乎肯定这是因为内部进程无法连接到mDNSResponder
在jail外运行的守护进程.在监狱外面有一个mDNSResponder
供整个系统使用的插座:
host ? ls -lA /var/run/mDNSResponder
srw-rw-rw- 1 root daemon 0 22 Oct 10:41 /var/run/mDNSResponder
Run Code Online (Sandbox Code Playgroud)
但是,在监狱里面却没有.所以,我试图用socat
从监狱中创建一个Unix套接字"代理"到外面:我跑socat
(以下命令)创建我的监狱内的插座,然后在监狱内运行再次卷曲,而且卷曲仍然给出了相同的错误消息.在mDNSResponder
使用SIGUSR1 打开详细日志后,我在syslog中看到了这个:
2015-10-26 5:32:30.835 PM mDNSResponder[95]: 12: connect_callback: Adding FD for uid 0
2015-10-26 5:32:30.835 PM mDNSResponder[95]: 12: DNSServiceCreateConnection START PID[23271](socat)
2015-10-26 5:32:30.836 PM mDNSResponder[95]: 12: read_msg: ERROR failed to get errsd via SCM_RIGHTS
2015-10-26 5:32:30.836 PM mDNSResponder[95]: 12: DNSServiceCreateConnection STOP PID[23271](socat)
2015-10-26 5:32:30.836 …
Run Code Online (Sandbox Code Playgroud) 我需要一些帮助来理解为什么在PHP-FPM服务启动后PHP-FPM chrooted PHP脚本无法解决FQDN的几个瞬间.
当我(重新)启动PHP-FPM服务时,它工作(分辨率成功)几秒钟,然后解决方案失败.
我通过PHP-FPM(在PHP-FPM池配置文件中设置``chroot`)chroot一个PHP应用程序(实际上是一个WordPress),并给了它所需要的PHP:
/etc/hosts
文件mount --bind
的的/ etc/SSL /证书/dev/urandom
(通过mknod
)mount --bind
将/ usr/share/zoneinfo中mount --bind
的/ var/run中/ mysqld的套接字到MySQL.mount --bind
/ var/run/nscd用于套接字到nscd解析器.当WordPress抱怨它无法下载更新时,我注意到了这个问题:
stream_socket_client():php_network_getaddresses:getaddrinfo failed:名称或服务未知stream_socket_client():无法连接到tcp://www.wordpress.org:80(php_network_getaddresses:getaddrinfo failed:名称或服务未知)
示例脚本:
<?php
$domain = 'www.example.com';
echo 'gethostbynamel(): '; var_dump(gethostbynamel($domain));
echo 'checkdnsrr(): '; var_dump(checkdnsrr($domain, 'A'));
echo 'dns_get_record(): '; var_dump(dns_get_record($domain));
?>
Run Code Online (Sandbox Code Playgroud)
当它工作时:
gethostbynamel(): array(1) {
[0]=>
string(13) "93.184.216.34"
}
checkdnsrr(): bool(true)
dns_get_record(): array(1) {
[0]=>
array(5) {
["host"]=>
string(15) "www.example.com"
["class"]=>
string(2) …
Run Code Online (Sandbox Code Playgroud)