首页 > 代码库 > 使用rssh创建一个安全的文件服务器
使用rssh创建一个安全的文件服务器
使用rssh创建一个安全的文件服务器
目前有这样一个需求,公司需要一台linux服务器作为文件服务器,但是基于安全性考虑,我不想使用ftp或者samba,但又必须允许用户上传文件。怎么办呢?
因为是linux服务器,所以可以让用户使用ssh登录到服务器上,然后使用sftp功能上传下载文件。
这样虽然解决了上边的问题,但又带来一个新的问题。
因为OpenSSH要求登录用户必须有一个可用的shell,用户才可以登录到这台Linux服务器。
那么势必要给每个用户一个shell,有了shell用户就可以访问你这台服务器的文件系统了!
那这如何解决这个问题呢?答案是rssh---- 一个受限制的shell
rssh是一个配合OpenSSH使用的受限shell,这个shell只可以执行下列操作:
* scp
* sftp
* cvs
* rsync
* rdist
除上述操作之外,其他一切操作都是禁止的。
安装rssh
CentOS/Fedora/RHEL Linux
可以直接从Dag源下载rssh安装包
# cd /tmp
# wget http://dag.wieers.com/rpm/packages/rssh/rssh-2.3.2-1.2.el5.rf.i386.rpm
# rpm -ivh rssh-2.3.2-1.2.el5.rf.i386.rpm
Debian/Ubuntu Linux
使用apt-get命令安装:
$ sudo apt-get install rssh
FreeBSD
# cd /usr/ports/shells/rssh
# make install clean
rssh配置文件如下:
* 默认配置文件/etc/rssh.conf (FreeBSD - /usr/local/etc/rssh.conf)
* 默认rssh可执行文件位置/usr/bin/rssh (FreeBSD - /usr/local/bin/rssh)
* 默认端口无( openssh使用22端口- rssh只是一个安全的shell)
配置用户帐号使用rssh作为shell
配置工作非常简单,新建用户使用-s参数直接指定rssh作为用户shell
# useradd -m -d /home/didi -s /usr/bin/rssh new_user
# passwd new_user
如果已存在的用户,可以使用chsh命令或usermod命令来修改用户shell
# usermod -s /usr/bin/rssh old_user
或者
# chsh -s /usr/bin/rssh old_user
默认情况下rssh禁止用户进行一切访问,我们必须明确指出允许用户进行哪些操作。
打开/etc/rssh.conf文件,增加可用配置项,可用选项如下。
* allowscp : 允许执行scp.
* allowsftp : 允许执行sftp.
* allowcvs : 允许执行cvs.
* allowrdist : 允许执行rdist.
* allowrsync : 允许执行rsync.
创建Chroot"监牢"
创建所有必须的目录:
# mkdir -p /users/{dev,etc,lib,usr,bin}
# mkdir -p /users/usr/bin
# mkdir -p /users/libexec/openssh
创建null文件/users/dev/null:
# mknod -m 666 /users/dev/null c 1 3
复制必须的/etc中的文件到/users/etc:
# cd /users/etc
# cp /etc/ld.so.cache .
# cp -avr /etc/ld.so.cache.d/ .
# cp /etc/ld.so.conf .
# cp /etc/nsswitch.conf .
# cp /etc/passwd .
# cp /etc/group .
# cp /etc/hosts .
# cp /etc/resolv.conf .
编辑/usres/group和/users/passwd文件,删除root和其他所有用户。
复制必须的可执行文件到/users/bin和其他相应位置:
# cd /users/usr/bin
# cp /usr/bin/scp .
# cp /usr/bin/rssh .
# cp /usr/bin/sftp .
# cd /users/usr/libexec/openssh/
# cp /usr/libexec/openssh/sftp-server .或者 cp /usr/lib/openssh/sftp-server .
# cd /users/usr/libexec/
# cp /usr/libexec/rssh_chroot_helper 或者 cp /usr/lib/rssh/rssh_chroot_helper
# cd /users/bin/
# cp /bin/sh . 或者 cp /bin/bash .
复制所有必须的共享库文件
例如使用ldd命令查看sftp必须的共享库文件如下:
# ldd /usr/bin/sftp
linux-gate.so.1 => (0x00456000)
libresolv.so.2 => /lib/libresolv.so.2 (0x0050e000)
libcrypto.so.6 => /lib/libcrypto.so.6 (0x0013e000)
libutil.so.1 => /lib/libutil.so.1 (0x008ba000)
libz.so.1 => /usr/lib/libz.so.1 (0x00110000)
libnsl.so.1 => /lib/libnsl.so.1 (0x0080e000)
libcrypt.so.1 => /lib/libcrypt.so.1 (0x00a8c000)
libgssapi_krb5.so.2 => /usr/lib/libgssapi_krb5.so.2 (0x00656000)
libkrb5.so.3 => /usr/lib/libkrb5.so.3 (0x00271000)
libk5crypto.so.3 => /usr/lib/libk5crypto.so.3 (0x00304000)
libcom_err.so.2 => /lib/libcom_err.so.2 (0x00777000)
libdl.so.2 => /lib/libdl.so.2 (0x00123000)
libnss3.so => /usr/lib/libnss3.so (0x00569000)
libc.so.6 => /lib/libc.so.6 (0x00b6c000)
libkrb5support.so.0 => /usr/lib/libkrb5support.so.0 (0x00127000)
libkeyutils.so.1 => /lib/libkeyutils.so.1 (0x00130000)
/lib/ld-linux.so.2 (0x00525000)
libplc4.so => /usr/lib/libplc4.so (0x008c9000)
libplds4.so => /usr/lib/libplds4.so (0x00133000)
libnspr4.so => /usr/lib/libnspr4.so (0x00d04000)
libpthread.so.0 => /lib/libpthread.so.0 (0x0032a000)
libselinux.so.1 => /lib/libselinux.so.1 (0x00341000)
libsepol.so.1 => /lib/libsepol.so.1 (0x00964000)
那么你必须把这些输出中的共享库文件复制到"监牢"中的相应目录中。
修改syslogd配置文件
syslog如果要工作需要向类似/dev/log这样的FIFO文件中写入数据。
我们通过-a参数告诉syslog必须额外监听一个socket。
如果打算让一些守护进程运行在chroot环境中,则这是必须的。
默认最多可以使用19个附加的socket。如果你确实需要更多,那么可以修改syslogd源码syslogd.c中的MAXFUNIX来实现。
编辑/etc/sysconfig/syslog文件
# vi /etc/sysconfig/syslog
找到如下一行
SYSLOGD_OPTIONS="-m 0"
追加/users/dev/log到其后
SYSLOGD_OPTIONS="-m 0 -a /users/dev/log"
保存配置文件,然后重起syslog
# /etc/init.d/syslog restart
修改rssh.conf,配置chroot路径
# vi /etc/rssh.conf
加入下边一行:
chrootpath=/users
然后重起sshd
# /etc/init.d/sshd restart
将用户投入"监牢"
和上边提到修改用户shell类似,使用-d参数将新用户的主目录指定到我们新建立的"监牢"中即可。
# useradd -m -d /users/home/newuser -s /usr/bin/rssh newuser
# passwd newuser
然后我们用newuser帐户尝试登陆一下看看.
sftp newuser@my-server.com
newuser@my-server.com‘s password:
sftp> ls
sftp> pwd
Remote working directory: /home/newuser
sftp> cd /tmp
Couldn‘t canonicalise: No such file or directory
可以看到用户不能访问/tmp目录,因为我们没有在"监牢"中建立这个目录,用户完全被限制在监牢中了。
Per-user配置
上边说的配置是针对所有用户的,如果我们针对不同用户有不同的配置要求,那么可以在配置文件中使用user指令。
user指令的可以覆盖其他一切配置,它的优先级最高。
举例来说,假如在配置文件中,user指令那一行设定了用户foo的可以执行哪些操作,那么无论其他行如何配置,用户foo的配置也不会改变。
user指令使用冒号(:)来分隔指令关键词,按照 username:umask:path 的顺序
* username : 被设定权限的用户名
* umask : 分为两个部分,
第一部分是8进制,指定shell访问权限。
第二部分是5个2进制位,每个位定义一个可执行的操作,1是允许,0是禁止。
* path : 用户的chroot目录名(如果目录名中有空格,必须用双引号括起来).
例如用户foo只可以执行cvs操作:
五个bit位的可执行操作如下
大家可以用下边的几个例子熟悉一下:
user=Jhon:011:00100: # cvs, with no chroot
user=kate:011:01000: # rdist, with no chroot
user=rudy:011:10000: # rsync, with no chroot
user=rudy:011:00001:"/usr/local/my chroot" # scp with chroot
本文参考了以下文档:
How to: Restrict Users to SCP and SFTP and Block SSH Shell Access with rssh
How to: Configure User Account to Use a Restricted Shell ( rssh )
Linux Configure rssh Chroot Jail To Lock Users To Their Home Directories Only
rssh: Per User Configuration Options For Chroot Jail