Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3045925
  • 博文数量: 535
  • 博客积分: 15788
  • 博客等级: 上将
  • 技术积分: 6507
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-07 09:11
文章分类

全部博文(535)

文章存档

2016年(1)

2015年(1)

2014年(10)

2013年(26)

2012年(43)

2011年(86)

2010年(76)

2009年(136)

2008年(97)

2007年(59)

分类: LINUX

2012-06-06 11:17:34

实现指定的用户从ssh登录后只能在指定的目录下工作并只能运行指定的命令或脚本。
方案:通过搭配使用pam内的chroot module来进行限制。

1、部署目录环境
创建一个目录,目录结构与实际的/目录结构类似
创建用户

  1. useradd xjc
  2. passwd xjc

将chroot目录设置在/chroot下

  1. mkdir -p /chroot/{etc,dev,proc,lib,bin,lib64,home,usr}
  2. mkdir -p /chroot/usr/bin
  3. mkdir -p /chroot/home/xjc

需要说明一下,后面还会遇到很多拷贝文件的操作,对于RHEL5,没有selinux的问题,但是对于RHEL6,如果使用cp拷贝文件,不加-a参数,拷贝的文件会有selinux权限的问题。可以通过ls -Z来查看拷贝的文件与原始的文件是存在差别的:
原始文件的权限为: 

  1. #ls -Z /etc/passwd
  2. -rw-r--r-- root root user_u:object_r:etc_t /etc/passwd
而如果直接cp的话,权限会有变化,造成selinux的权限问题。
所以,对于RHEL6,应该使用cp -a来拷贝文件。

对于RHEL5

  1. grep xjc /etc/passwd >/chroot/etc/passwd
对于RHEL6,使用上面的方法创建passwd文件也会有权限问题,解决的办法就是cp -a /etc/passwd /chroot/etc/passwd,然后删除里面的无关用户。

  1. cp -a /bin/bash /chroot/bin/
查看bash命令需要哪些.so文件,拷贝到chroot相应的目录中

  1. #ldd /bin/bash
  2. linux-vdso.so.1 => (0x00007fff569ff000)
  3. libtinfo.so.5 => /lib64/libtinfo.so.5 (0x000000369d200000)
  4. libdl.so.2 => /lib64/libdl.so.2 (0x000000368ea00000)
  5. libc.so.6 => /lib64/libc.so.6 (0x000000368e600000)
  6. /lib64/ld-linux-x86-64.so.2 (0x000000368e200000)
拷贝

  1. cp -a /lib64/{libtinfo.so.5,libdl.so.2,libc.so.6,ld-linux-x86-64.so.2} /chroot/lib64/
拷贝完成后,ls -l,会发现拷贝的是软链接文件:

  1. # ll
  2. total 0
  3. lrwxrwxrwx. 1 root root 10 Feb 6 13:58 ld-linux-x86-64.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
拷贝原始文件:

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

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

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

2、ssh设置
/etc/ssh/sshd_config
确保
UsePAM yes
默认即为yes

3、pam验证增加chroot模块
/etc/pam.d/sshd
在最下面添加一行:
session required pam_chroot.so
一定要确保输入正确,否则可能造成ssh无法登陆。

pam_chroot.so执行后会读取配置文件以决定是否使用chroot环境。
 /etc/security/chroot.conf
# /etc/security/chroot.conf
# format:
# username_regex        chroot_dir
#matthew                /home
添加一行
xjc /chroot

4、调试ssh服务
测试:
ssh xjc@127.0.0.1
登陆失败,打开/var/log/secure日志查看:
Jun  6 09:40:42 sjz sshd[18769]: pam_env(sshd:setcred): Unable to open config file: /etc/security/pam_env.conf: No such file or directory
Jun  6 09:40:42 sjz sshd[18694]: error: openpty: No such file or directory
Jun  6 09:40:42 sjz sshd[18769]: error: session_pty_req: session 0 alloc failed


  1. cp -a /etc/security /chroot/etc

为chroot准备dev环境,准备pts环境

  1. mount --bind /dev /chroot/dev
  2. mount -t devpts -o gid=5,mode=620 devpts /chroot/dev/pts

准备proc环境

  1. mount -t proc /proc /chroot/proc/
 
再次登陆测试:
ssh xjc@127.0.0.1
Jun  6 09:50:04 sjz sshd[21426]: pam_env(sshd:setcred): Unable to open env file: /etc/environment: No such file or directory
Jun  6 09:50:04 sjz sshd[21390]: error: ssh_selinux_setup_pty: security_compute_relabel: No such file or directory


  1. cp -a /etc/environment /chroot/etc/
重新测试:
ssh xjc@127.0.0.1
xjc@127.0.0.1's password: 
-bash-4.1$ 

OK,可以正常登陆了。

如果访问系统的某个目录?

  1. mount --bind /usr/local/123 /chroot/usr/local/123

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

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

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

 ssh xjc@127.0.0.1
xjc@127.0.0.1'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 => /lib64/libselinux.so.1 (0x0000003690200000)
        libc.so.6 => /lib64/libc.so.6 (0x000000368e600000)
        libdl.so.2 => /lib64/libdl.so.2 (0x000000368ea00000)
        /lib64/ld-linux-x86-64.so.2 (0x000000368e200000)
按上面的方法解决即可。


参考:
http://lccnetvip.pixnet.net/blog/post/32937893--%E7%8E%A9%E7%8E%A9-ssh-%2B-chroot-%E7%B0%A1%E6%98%93%E7%92%B0%E5%A2%83%E6%9E%B6%E8%A8%AD




阅读(10334) | 评论(0) | 转发(0) |
0

上一篇:grub及mbr简介

下一篇:nginx编译时错误

给主人留下些什么吧!~~